ZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvY2xhc3Nlcy9naXRwa2d2LmJiY2xhc3MgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL2NsYXNzZXMvZ2l0cGtndi5iYmNsYXNzCmluZGV4IGFiNTkxYmQuLjE4MDQyMWUgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvY2xhc3Nlcy9naXRwa2d2LmJiY2xhc3MKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9jbGFzc2VzL2dpdHBrZ3YuYmJjbGFzcwpAQCAtNDAsMTAgKzQwLDE2IEBACiBHSVRQS0dWID0gIiR7QGdldF9naXRfcGtndihkLCBGYWxzZSl9IgogR0lUUEtHVlRBRyA9ICIke0BnZXRfZ2l0X3BrZ3YoZCwgVHJ1ZSl9IgogCi1kZWYgZ2l0cGtndl9kcm9wX3RhZ19wcmVmaXgodmVyc2lvbik6CisjIFRoaXMgcmVnZXhwIGlzIHVzZWQgdG8gZHJvcCB1bndhbnRlZCBwYXJ0cyBvZiB0aGUgZm91bmQgdGFncy4gQW55IG1hdGNoaW5nCisjIGdyb3VwcyB3aWxsIGJlIGNvbmNhdGVuYXRlZCB0byB5aWVsZCB0aGUgZmluYWwgdmVyc2lvbi4KK0dJVFBLR1ZfVEFHX1JFR0VYUCA/Pz0gInYoXGQuKikiCisKK2RlZiBnaXRwa2d2X2Ryb3BfdGFnX3ByZWZpeChkLCB2ZXJzaW9uKToKICAgICBpbXBvcnQgcmUKLSAgICBpZiByZS5tYXRjaCgidlxkIiwgdmVyc2lvbik6Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uWzE6XQorCisgICAgbSA9IHJlLm1hdGNoKGQuZ2V0VmFyKCdHSVRQS0dWX1RBR19SRUdFWFAnKSwgdmVyc2lvbikKKyAgICBpZiBtOgorICAgICAgICByZXR1cm4gJycuam9pbihncm91cCBmb3IgZ3JvdXAgaW4gbS5ncm91cHMoKSBpZiBncm91cCkKICAgICBlbHNlOgogICAgICAgICByZXR1cm4gdmVyc2lvbgogCkBAIC0xMDUsNyArMTExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGJiLmZldGNoMi5ydW5mZXRjaGNtZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2l0IC0tZ2l0LWRpcj0lKHJlcG9kaXIpcyBkZXNjcmliZSAlKHJldilzIC0tdGFncyAtLWV4YWN0LW1hdGNoIDI+L2Rldi9udWxsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdmFycywgZCwgcXVpZXQ9VHJ1ZSkuc3RyaXAoKQotICAgICAgICAgICAgICAgICAgICAgICAgdmVyID0gZ2l0cGtndl9kcm9wX3RhZ19wcmVmaXgob3V0cHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgdmVyID0gZ2l0cGtndl9kcm9wX3RhZ19wcmVmaXgoZCwgb3V0cHV0KQogICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgdmVyID0gIjAuMC0lcy1nJXMiICUgKGNvbW1pdHMsIHZhcnNbJ3JldiddWzo3XSkKICAgICAgICAgICAgICAgICBlbHNlOgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9maW8vZmlsZXMvMDAwMS1hcmNoLWFybS1Db25zaWRlci1hcm12N3ZlLWFyY2gtYXMtd2VsbC5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2ZpbGVzLzAwMDEtYXJjaC1hcm0tQ29uc2lkZXItYXJtdjd2ZS1hcmNoLWFzLXdlbGwucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4M2E3NmYuLjAwMDAwMDAKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9maW8vZmlsZXMvMDAwMS1hcmNoLWFybS1Db25zaWRlci1hcm12N3ZlLWFyY2gtYXMtd2VsbC5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUZyb20gMmFmNTg5MDljZDlmMjg2MmQxZGMwNzgzNmUyMDEzNjFhMmNkOGQ1ZCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+Ci1EYXRlOiBTYXQsIDUgT2N0IDIwMTkgMDg6NTM6MjIgLTA3MDAKLVN1YmplY3Q6IFtQQVRDSF0gYXJjaC1hcm06IENvbnNpZGVyIGFybXY3dmUgYXJjaCBhcyB3ZWxsCi0KLVVwc3RyZWFtLVN0YXR1czogU3VibWl0dGVkIFtdCi0KLVNpZ25lZC1vZmYtYnk6IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+Ci0tLS0KLSBhcmNoL2FyY2gtYXJtLmggfCAyICstCi0gMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCspLCAxIGRlbGV0aW9uKC0pCi0KLWRpZmYgLS1naXQgYS9hcmNoL2FyY2gtYXJtLmggYi9hcmNoL2FyY2gtYXJtLmgKLWluZGV4IDc4Y2IyZWJlLi40ZjcyMjk2NyAxMDA2NDQKLS0tLSBhL2FyY2gvYXJjaC1hcm0uaAotKysrIGIvYXJjaC9hcmNoLWFybS5oCi1AQCAtMTEsNyArMTEsNyBAQAotICNkZWZpbmUgbm9wICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZcdHIwLHIwXHRAIG5vcFxuXHQiKQotICNkZWZpbmUgcmVhZF9iYXJyaWVyKCkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiIDogOiA6ICJtZW1vcnkiKQotICNkZWZpbmUgd3JpdGVfYmFycmllcigpCV9fYXNtX18gX192b2xhdGlsZV9fICgiIiA6IDogOiAibWVtb3J5IikKLS0jZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfN0FfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzhBX18pCi0rI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF84QV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN1ZFX18pCi0gI2RlZmluZQlub3AJCV9fYXNtX18gX192b2xhdGlsZV9fICgibm9wIikKLSAjZGVmaW5lIHJlYWRfYmFycmllcigpCV9fc3luY19zeW5jaHJvbml6ZSgpCi0gI2RlZmluZSB3cml0ZV9iYXJyaWVyKCkJX19zeW5jX3N5bmNocm9uaXplKCkKLS0tIAotMi4yMy4wCi0KZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2ZpbGVzLzAwMDEtdXBkYXRlLXRoZS1pbnRlcnByZXRlci1wYXRocy5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2ZpbGVzLzAwMDEtdXBkYXRlLXRoZS1pbnRlcnByZXRlci1wYXRocy5wYXRjaAppbmRleCAzMjdiOWY1Li5jOWMzYTA4IDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2Zpby9maWxlcy8wMDAxLXVwZGF0ZS10aGUtaW50ZXJwcmV0ZXItcGF0aHMucGF0Y2gKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9maW8vZmlsZXMvMDAwMS11cGRhdGUtdGhlLWludGVycHJldGVyLXBhdGhzLnBhdGNoCkBAIC0xNiw4ICsxNiw3IEBACiAgdG9vbHMvaGlzdC9maW9sb2dwYXJzZXJfaGlzdC5weSB8IDIgKy0KICB0b29scy9oaXN0L2hhbGYtYmlucy5weSAgICAgICAgIHwgMiArLQogIHRvb2xzL3Bsb3QvZmlvMmdudXBsb3QgICAgICAgICAgfCAyICstCi0gdC9zdGVhZHlzdGF0ZV90ZXN0cy5weSB8IDIgKy0KLSA3IGZpbGVzIGNoYW5nZWQsIDcgaW5zZXJ0aW9ucygrKSwgNyBkZWxldGlvbnMoLSkKKyA2IGZpbGVzIGNoYW5nZWQsIDYgaW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKIAogZGlmZiAtLWdpdCBhL3Rvb2xzL2Zpb19qc29ucGx1c19jbGF0MmNzdiBiL3Rvb2xzL2Zpb19qc29ucGx1c19jbGF0MmNzdgogaW5kZXggNzhhMDA3ZTUuLjA1MjRiNmU2IDEwMDc1NQpAQCAtNzksMTYgKzc4LDYgQEAKICAjIE5vdGU6IHRoaXMgc2NyaXB0IGlzIHB5dGhvbjIgYW5kIHB5dGhvbjMgY29tcGF0aWJsZS4KICAjCiAgIyAgQ29weXJpZ2h0IChDKSAyMDEzIGVOb3ZhbmNlIFNBUyA8bGljZW5zaW5nQGVub3ZhbmNlLmNvbT4KLWRpZmYgLS1naXQgYS90L3N0ZWFkeXN0YXRlX3Rlc3RzLnB5IGIvdC9zdGVhZHlzdGF0ZV90ZXN0cy5weQotaW5kZXggNTAyNTRkY2MuLjk1ZTdkZmRlIDEwMDc1NQotLS0tIGEvdC9zdGVhZHlzdGF0ZV90ZXN0cy5weQotKysrIGIvdC9zdGVhZHlzdGF0ZV90ZXN0cy5weQotQEAgLTEsNCArMSw0IEBACi0tIyEvdXNyL2Jpbi9weXRob24yLjcKLSsjIS91c3IvYmluL2VudiBweXRob24KLSAjIE5vdGU6IHRoaXMgc2NyaXB0IGlzIHB5dGhvbjIgYW5kIHB5dGhvbiAzIGNvbXBhdGlibGUuCi0gIwotICMgc3RlYWR5c3RhdGVfdGVzdHMucHkKIC0tIAogMi4xNy4xCiAKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2Zpb18zLjE2LmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9maW8vZmlvXzMuMTcuYmIKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9maW8vZmlvXzMuMTYuYmIKcmVuYW1lIHRvIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2Zpb18zLjE3LmJiCmluZGV4IGFkYWI2MTguLmU0MWMyMWQgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2Zpb18zLjE2LmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2Zpb18zLjE3LmJiCkBAIC0yMSwxMCArMjEsOSBAQAogUEFDS0FHRUNPTkZJRyA/Pz0gIiR7UEFDS0FHRUNPTkZJR19OVU1BfSIKIFBBQ0tBR0VDT05GSUdbbnVtYV0gPSAiLC0tZGlzYWJsZS1udW1hLG51bWFjdGwiCiAKLVNSQ1JFViA9ICI5MmY3NTcwOGI1MzA5ODlmZGIxM2I1MGJlNjYwNGY0NGI4MGQwMzhkIgorU1JDUkVWID0gIjA4Y2U5ZGMyMGI4YTRlNTVkYjdhZjZkODY5ZGRmYTQ5YjRhMDJkMDMiCiBTUkNfVVJJID0gImdpdDovL2dpdC5rZXJuZWwuZGsvZmlvLmdpdCBcCiAgICAgICAgICAgZmlsZTovLzAwMDEtdXBkYXRlLXRoZS1pbnRlcnByZXRlci1wYXRocy5wYXRjaCBcCi0gICAgICAgICAgZmlsZTovLzAwMDEtYXJjaC1hcm0tQ29uc2lkZXItYXJtdjd2ZS1hcmNoLWFzLXdlbGwucGF0Y2ggXAogIgogCiBTID0gIiR7V09SS0RJUn0vZ2l0IgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9pb3pvbmUzL2lvem9uZTMvMDAwMS1sZXQtc3lzdGVtLWhlYWRlcnMtcHJvdmlkZS1wcmVhZDY0LnBhdGNoIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9pb3pvbmUzL2lvem9uZTMvMDAwMS1sZXQtc3lzdGVtLWhlYWRlcnMtcHJvdmlkZS1wcmVhZDY0LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWE1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2lvem9uZTMvaW96b25lMy8wMDAxLWxldC1zeXN0ZW0taGVhZGVycy1wcm92aWRlLXByZWFkNjQucGF0Y2gKQEAgLTAsMCArMSwzNCBAQAorRnJvbSA2NDM4OWE2N2I5M2E1M2I5ZmI3ZTllMjBlOTA1YTVlZTQ2MTM2MDZiIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KK0RhdGU6IFdlZCwgMTUgSmFuIDIwMjAgMTc6MTA6NDIgLTA4MDAKK1N1YmplY3Q6IFtQQVRDSF0gbGV0IHN5c3RlbSBoZWFkZXJzIHByb3ZpZGUgcHJlYWQ2NCgpCisKK1RoZSBzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2ggd2l0aCBzeXN0ZW0gaGVhZGVycyBhbnl3YXkKKworRml4ZXMKKworaW96b25lLmM6MTI3MDo5OiBlcnJvcjogcmVkZWNsYXJhdGlvbiBvZiAncHJlYWQ2NCcgbXVzdCBoYXZlIHRoZSAnb3ZlcmxvYWRhYmxlJyBhdHRyaWJ1dGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgcHJlYWQ2NCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvbW50L2IveW9lL2J1aWxkL3RtcC93b3JrL2NvcmUyLTY0LXlvZS1saW51eC9pb3pvbmUzLzQ4OC1yMC9yZWNpcGUtc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3VuaXN0ZC5oOjgzOjE6IG5vdGU6IHByZXZpb3VzIG92ZXJsb2FkIG9mIGZ1bmN0aW9uIGlzIGhlcmUgICAgICAgICAgcHJlYWQ2NCAoaW50IF9fZmQsIHZvaWQgKmNvbnN0IF9fY2xhbmdfcGFzc19vYmplY3Rfc2l6ZTAgX19idWYsICAgICAgICAgICAgICAgICBeCisxIGVycm9yIGdlbmVyYXRlZC4KKworVXBzdHJlYW0tU3RhdHVzOiBQZW5kaW5nCisKK1NpZ25lZC1vZmYtYnk6IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CistLS0KKyBpb3pvbmUuYyB8IDEgLQorIDEgZmlsZSBjaGFuZ2VkLCAxIGRlbGV0aW9uKC0pCisKK2RpZmYgLS1naXQgYS9pb3pvbmUuYyBiL2lvem9uZS5jCitpbmRleCAwOTBkZDVmLi5mZGVhNDAwIDEwMDY0NAorLS0tIGEvaW96b25lLmMKKysrKyBiL2lvem9uZS5jCitAQCAtMTI2Nyw3ICsxMjY3LDYgQEAgaW50IHBpdF9nZXR0aW1lb2ZkYXkoKTsKKyAjaWZkZWYgSEFWRV9BTlNJQ19DCisgI2lmIGRlZmluZWQgKEhBVkVfUFJFQUQpICYmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkKKyBzc2l6ZV90IHB3cml0ZTY0KCk7IAorLXNzaXplX3QgcHJlYWQ2NCgpOyAKKyAjZW5kaWYKKyAjaWYgIWRlZmluZWQobGludXgpCisgY2hhciAqZ2V0ZW52KCk7CistLSAKKzIuMjUuMAorCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2lvem9uZTMvaW96b25lM180ODguYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2lvem9uZTMvaW96b25lM180ODguYmIKaW5kZXggNTg4NWIxNC4uNGQ5ZTA3NyAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9pb3pvbmUzL2lvem9uZTNfNDg4LmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvaW96b25lMy9pb3pvbmUzXzQ4OC5iYgpAQCAtOCw2ICs4LDcgQEAKICIKIFNSQ19VUkkgPSAiaHR0cDovL3d3dy5pb3pvbmUub3JnL3NyYy9jdXJyZW50LyR7QlBOfV8ke1BWfS50YXIgXAogICAgIGZpbGU6Ly9wYXJhbGxlbGlzbS5wYXRjaCBcCisgICAgZmlsZTovLzAwMDEtbGV0LXN5c3RlbS1oZWFkZXJzLXByb3ZpZGUtcHJlYWQ2NC5wYXRjaCBcCiAgICAgZmlsZTovL2NvcHlyaWdodC50eHQgXAogIgogU1JDX1VSSVttZDVzdW1dID0gImQ2MGE2OWU0NGNkYTg0MzZmNGY5NGQ4NjA5NThlZmMyIgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9saWJodWdldGxiZnMvZmlsZXMvMDAwMS10ZXN0cy1hZGQtZXhwbGljaXQtcGVybWlzc2lvbnMtdG8tb3Blbi1jYWxsLnBhdGNoIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9saWJodWdldGxiZnMvZmlsZXMvMDAwMS10ZXN0cy1hZGQtZXhwbGljaXQtcGVybWlzc2lvbnMtdG8tb3Blbi1jYWxsLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTJiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2xpYmh1Z2V0bGJmcy9maWxlcy8wMDAxLXRlc3RzLWFkZC1leHBsaWNpdC1wZXJtaXNzaW9ucy10by1vcGVuLWNhbGwucGF0Y2gKQEAgLTAsMCArMSw0MSBAQAorRnJvbSBkMDdkMmY5NjAxYjQ5YmI3MmNkNGIzNjgzOGYwYzIzOGJkMWIwZmMxIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KK0RhdGU6IFdlZCwgMTUgSmFuIDIwMjAgMTg6NDU6MDkgLTA4MDAKK1N1YmplY3Q6IFtQQVRDSF0gdGVzdHM6IGFkZCBleHBsaWNpdCBwZXJtaXNzaW9ucyB0byBvcGVuKCkgY2FsbAorCitGaXhlcworZ2V0aHVnZXBhZ2VzaXplcy5jOjIyNzozNTogZXJyb3I6IG9wZW4gd2l0aCBPX0NSRUFUIGluIHNlY29uZCBhcmd1bWVudCBuZWVkcyAzIGFyZ3VtZW50cworfCAgICAgICAgIGZkID0gb3BlbihmbmFtZSwgT19XUk9OTFl8T19DUkVBVCk7Cit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorCitVcHN0cmVhbS1TdGF0dXM6IFN1Ym1pdHRlZCBbaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8jIXRvcGljL2xpYmh1Z2V0bGJmcy9hbk50RFhiUUtyb10KK1NpZ25lZC1vZmYtYnk6IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CistLS0KKyB0ZXN0cy9nZXRodWdlcGFnZXNpemVzLmMgfCA0ICsrLS0KKyAxIGZpbGUgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvdGVzdHMvZ2V0aHVnZXBhZ2VzaXplcy5jIGIvdGVzdHMvZ2V0aHVnZXBhZ2VzaXplcy5jCitpbmRleCA5NTUxYjM4Li41Nzc3MjY1IDEwMDY0NAorLS0tIGEvdGVzdHMvZ2V0aHVnZXBhZ2VzaXplcy5jCisrKysgYi90ZXN0cy9nZXRodWdlcGFnZXNpemVzLmMKK0BAIC0yMjMsNyArMjIzLDcgQEAgdm9pZCBzZXR1cF9mYWtlX2RhdGEobG9uZyBzaXplc1tdLCBpbnQgbl9lbGVtKQorIAkJRkFJTCgibWtkdGVtcDogJXMiLCBzdHJlcnJvcihlcnJubykpOworIAorIAlzcHJpbnRmKGZuYW1lLCAiJXMvbWVtaW5mby1ub25lIiwgZmFrZV9tZW1pbmZvKTsKKy0JZmQgPSBvcGVuKGZuYW1lLCBPX1dST05MWXxPX0NSRUFUKTsKKysJZmQgPSBvcGVuKGZuYW1lLCBPX1dST05MWXxPX0NSRUFULCAwNjAwKTsKKyAJaWYgKGZkIDwgMCkKKyAJCUZBSUwoIm9wZW46ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAJaWYgKHdyaXRlKGZkLCBtZW1pbmZvX2Jhc2UsCitAQCAtMjMzLDcgKzIzMyw3IEBAIHZvaWQgc2V0dXBfZmFrZV9kYXRhKGxvbmcgc2l6ZXNbXSwgaW50IG5fZWxlbSkKKyAJCUZBSUwoImNsb3NlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgCisgCXNwcmludGYoZm5hbWUsICIlcy9tZW1pbmZvLWh1Z2VwYWdlcyIsIGZha2VfbWVtaW5mbyk7CistCWZkID0gb3BlbihmbmFtZSwgT19XUk9OTFl8T19DUkVBVCk7CisrCWZkID0gb3BlbihmbmFtZSwgT19XUk9OTFl8T19DUkVBVCwgMDYwMCk7CisgCWlmIChmZCA8IDApCisgCQlGQUlMKCJvcGVuOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgCWlmICh3cml0ZShmZCwgbWVtaW5mb19iYXNlLAorLS0gCisyLjI1LjAKKwpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9saWJodWdldGxiZnMvbGliaHVnZXRsYmZzX2dpdC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvbGliaHVnZXRsYmZzL2xpYmh1Z2V0bGJmc19naXQuYmIKaW5kZXggZjI1ODEyMi4uZTY2ZGIxYSAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9saWJodWdldGxiZnMvbGliaHVnZXRsYmZzX2dpdC5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2xpYmh1Z2V0bGJmcy9saWJodWdldGxiZnNfZ2l0LmJiCkBAIC0yNCw2ICsyNCw3IEBACiAgICAgZmlsZTovLzAwMDQtc2htLmMtTWFyay1nbGliYy1zcGVjaWZpYy1jaGFuZ2VzLXNvLnBhdGNoIFwKICAgICBmaWxlOi8vMDAwNS1JbmNsdWRlLWRpcmVudC5oLWZvci1pbm9fdC5wYXRjaCBcCiAgICAgZmlsZTovLzAwMDYtaW5jbHVkZS1saW1pdHMuaC1mb3ItUEFUSF9NQVgucGF0Y2ggXAorICAgIGZpbGU6Ly8wMDAxLXRlc3RzLWFkZC1leHBsaWNpdC1wZXJtaXNzaW9ucy10by1vcGVuLWNhbGwucGF0Y2ggXAogIgogCiBVUFNUUkVBTV9DSEVDS19HSVRUQUdSRUdFWCA9ICIoP1A8cHZlcj5cZCsoXC5cZCspKykiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtY29ubmVjdGl2aXR5L3phYmJpeC96YWJiaXgvemFiYml4LWFnZW50LnNlcnZpY2UgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtY29ubmVjdGl2aXR5L3phYmJpeC96YWJiaXgvemFiYml4LWFnZW50LnNlcnZpY2UKaW5kZXggYjE4YTk2Zi4uNTZlNTA2NCAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWNvbm5lY3Rpdml0eS96YWJiaXgvemFiYml4L3phYmJpeC1hZ2VudC5zZXJ2aWNlCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1jb25uZWN0aXZpdHkvemFiYml4L3phYmJpeC96YWJiaXgtYWdlbnQuc2VydmljZQpAQCAtMyw5ICszLDggQEAKIEFmdGVyPXN5c2xvZy50YXJnZXQgbmV0d29yay50YXJnZXQKIAogW1NlcnZpY2VdCi1UeXBlPW9uZXNob3QKLUV4ZWNTdGFydD1AU0JJTkRJUkAvemFiYml4X2FnZW50ZAotUmVtYWluQWZ0ZXJFeGl0PXllcworVHlwZT1zaW1wbGUKK0V4ZWNTdGFydD1AU0JJTkRJUkAvemFiYml4X2FnZW50ZCAtZgogVXNlcj16YWJiaXgKIAogW0luc3RhbGxdCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtY29ubmVjdGl2aXR5L3plcm9tcS9jcHB6bXFfZ2l0LmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWNvbm5lY3Rpdml0eS96ZXJvbXEvY3Bwem1xX2dpdC5iYgppbmRleCAzNjk3MTI5Li4wYjY2OTcwIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtY29ubmVjdGl2aXR5L3plcm9tcS9jcHB6bXFfZ2l0LmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1jb25uZWN0aXZpdHkvemVyb21xL2NwcHptcV9naXQuYmIKQEAgLTQsOCArNCw4IEBACiBMSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9MSUNFTlNFO21kNT1kYjE3NGVhZjdiNTVhMzRhN2M4OTU1MTE5N2Y2NmU5NCIKIERFUEVORFMgPSAiemVyb21xIgogCi1TUkNSRVYgPSAiZTY3ZmEwZTE2ZDc5NjQ4NzYyMjg5NTJmNjA2OTNmNWMwM2VhMGNjMSIKLVBWID0gIjQuNS4wIgorU1JDUkVWID0gIjhkNWM5YTg4OTg4ZGNiZWJiNzI5MzljYTA5MzlkNDMyMjMwZmZkZTEiCitQViA9ICI0LjYuMCIKIAogU1JDX1VSSSA9ICJnaXQ6Ly9naXRodWIuY29tL3plcm9tcS9jcHB6bXEuZ2l0IgogCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtY29yZS9wYWNrYWdlZ3JvdXBzL3BhY2thZ2Vncm91cC1tZXRhLW9lLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWNvcmUvcGFja2FnZWdyb3Vwcy9wYWNrYWdlZ3JvdXAtbWV0YS1vZS5iYgppbmRleCAzMWMzZjRlLi41OWYxNzAzIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtY29yZS9wYWNrYWdlZ3JvdXBzL3BhY2thZ2Vncm91cC1tZXRhLW9lLmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1jb3JlL3BhY2thZ2Vncm91cHMvcGFja2FnZWdyb3VwLW1ldGEtb2UuYmIKQEAgLTk0LDYgKzk0LDcgQEAKIFJERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLWJzcF9yZW1vdmVfbWlwc2FyY2ggPSAiZWZpdmFyIGVmaWJvb3RtZ3IiCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1ic3BfcmVtb3ZlX3Bvd2VycGMgPSAiZWZpdmFyIGVmaWJvb3RtZ3IiCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1ic3BfcmVtb3ZlX3Bvd2VycGM2NCA9ICJlZml2YXIgZWZpYm9vdG1nciIKK1JERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLWJzcF9yZW1vdmVfcG93ZXJwYzY0bGUgPSAiZWZpdmFyIGVmaWJvb3RtZ3IiCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1ic3BfcmVtb3ZlX3Jpc2N2NjQgPSAiZWZpdmFyIGVmaWJvb3RtZ3IiCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1ic3BfcmVtb3ZlX3Jpc2N2MzIgPSAiZWZpdmFyIGVmaWJvb3RtZ3IiCiAKQEAgLTEyNSw2ICsxMjYsNyBAQAogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtZGV2dG9vbHNfcmVtb3ZlX21pcHM2NGVsID0gIm5vZGVqcyIKIFJERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLWRldnRvb2xzX3JlbW92ZV9wb3dlcnBjID0gImFuZHJvaWQtdG9vbHMgYnJlYWtwYWQgdWZ0cmFjZSBsc2h3IgogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtZGV2dG9vbHNfcmVtb3ZlX3Bvd2VycGM2NCA9ICJhbmRyb2lkLXRvb2xzIHVmdHJhY2UgbHNodyIKK1JERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLWRldnRvb2xzX3JlbW92ZV9wb3dlcnBjNjRsZSA9ICJhbmRyb2lkLXRvb2xzIHVmdHJhY2UgbHNodyIKIFJERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLWRldnRvb2xzX3JlbW92ZV9yaXNjdjY0ID0gIm5vZGVqcyB1ZnRyYWNlIGxzaHciCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1kZXZ0b29sc19yZW1vdmVfcmlzY3YzMiA9ICJub2RlanMgdWZ0cmFjZSBsc2h3IgogCkBAIC0xNTYsNiArMTU4LDcgQEAKIFJERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLWV4dGVuZGVkX3JlbW92ZV9taXBzYXJjaCA9ICJ1cG0gbXJhYSB0aXB0b3AiCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1leHRlbmRlZF9yZW1vdmVfcG93ZXJwYyA9ICJ1cG0gbXJhYSIKIFJERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLWV4dGVuZGVkX3JlbW92ZV9wb3dlcnBjNjQgPSAidXBtIG1yYWEiCitSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1leHRlbmRlZF9yZW1vdmVfcG93ZXJwYzY0bGUgPSAidXBtIG1yYWEiCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1leHRlbmRlZF9yZW1vdmVfcmlzY3Y2NCA9ICJ1cG0gbXJhYSB0aXB0b3AiCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1leHRlbmRlZF9yZW1vdmVfcmlzY3YzMiA9ICJ1cG0gbXJhYSB0aXB0b3AiCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1leHRlbmRlZF9yZW1vdmVfbGliYy1tdXNsID0gImxjZHByb2MiCkBAIC0yMzYsNyArMjM5LDcgQEAKICAgICBsaWJpbmloIGlub3RpZnktdG9vbHMgam9lIGxjbXMgbGNvdiBsaWJhdGFzbWFydCBsaWJieXRlc2l6ZSBcCiAgICAgbGliY2VyZWFsIGxpYmN5dXNic2VyaWFsIGxpYmVlIGxpYmVpZ2VuIGxpYmVzdHIgbGliZnRkaSBsaWJnaXQyIFwKICAgICBsaWJncGlvZCBsaWJpaW8gbGlianMtanF1ZXJ5IGxpYmpzLXNpenpsZSBsaWJsaW5lYnJlYWsgbGlibWljcm9odHRwZCBcCi0gICAgbGlibXhtbCBsaWJuaWggbGlib2F1dGggbGlib2wgbGlib29wIGxpYnAxMSBsaWJyYXcxMzk0IGxpYnNtaSBsaWJzb2MgbGlic3NoMiBcCisgICAgbGlibXhtbCBsaWJvYXV0aCBsaWJvbCBsaWJvb3AgbGlicDExIGxpYnJhdzEzOTQgbGlic21pIGxpYnNvYyBsaWJzc2gyIFwKICAgICBsaWJzc2ggbGlidGFyIGxpYnRlYW0gbGlidGlueXhtbDIgbGlidGlueXhtbCBsaWJ1c2JnIGxpYnVzYi1jb21wYXQgbGlidXRlbXB0ZXIgXAogICAgIGxpbmtzIGxpby11dGlscyBsb2NrZGV2IGxvZzRjIGxvZzRjcHAgbG9nd2FybiBsaWJkZXZtYXBwZXIgbHZtMiBcCiAgICAgbWFpbGNhcCBtYnVmZmVyIG1nIG1pbmluaSBcCkBAIC0yNjMsNiArMjY2LDcgQEAKIFJERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLXN1cHBvcnRfcmVtb3ZlX21pcHNhcmNoID0gImdwZXJmdG9vbHMiCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1zdXBwb3J0X3JlbW92ZV9yaXNjdjY0ID0gInVpbSIKIFJERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLXN1cHBvcnRfcmVtb3ZlX3Jpc2N2MzIgPSAidWltIgorUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2Utc3VwcG9ydF9yZW1vdmVfcG93ZXJwYyA9ICJzc2lhcGkiCiAKIFJERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLXN1cHBvcnQtZWdsID0iXAogICAgIGZyZWVyZHAgbGlibmljZSBvcGVuY3YgXApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL2J5YWNjL2J5YWNjXzIwMTkxMTAzLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL2J5YWNjL2J5YWNjXzIwMTkxMTI1LmJiCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9ieWFjYy9ieWFjY18yMDE5MTEwMy5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL2J5YWNjL2J5YWNjXzIwMTkxMTI1LmJiCmluZGV4IGVhZTQ2MTguLmE0ZTU3ZjUgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9ieWFjYy9ieWFjY18yMDE5MTEwMy5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtZXh0ZW5kZWQvYnlhY2MvYnlhY2NfMjAxOTExMjUuYmIKQEAgLTcsNiArNyw1IEBACiBMSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9wYWNrYWdlL2RlYmlhbi9jb3B5cmlnaHQ7bWQ1PTNlYjdjNjM1NDM0ZmFmZTIzZWYzMGZjMjYzZTYzYjJmIgogcmVxdWlyZSBieWFjYy5pbmMKIAotU1JDX1VSSVttZDVzdW1dID0gIjg0ZmZlNTkxNjZmNjdiYmUxNDdhNmY1MDJjN2FmMzA5IgotU1JDX1VSSVtzaGEyNTZzdW1dID0gImQyOTFmYjM0ODE2ZjQ1MDc5MDY3MzY2YjdmNzMwMGZmYmY5ZjdlM2YxYWFmNmQ1MDliODQ0NDJkMDY1ZDExYjkiCi0KK1NSQ19VUklbbWQ1c3VtXSA9ICI2NzQ1YTRmYmYwNzIzYzRjOTI4MGZjM2U1NjhiM2QxYiIKK1NSQ19VUklbc2hhMjU2c3VtXSA9ICIwNzFjMmViZTM2YWZhYTg0NDhiODBlODkzNDczYTY4MWU2M2EzYjhhNGVkNjM2YzBkNjc1NzgwYTAyNDExY2RlIgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL2ZsdWVudGJpdC9mbHVlbnRiaXQvMDAwMS1wcGMtRml4LXNpZ25hdHVyZS1mb3ItY29fY3JlYXRlLUFQSS5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9mbHVlbnRiaXQvZmx1ZW50Yml0LzAwMDEtcHBjLUZpeC1zaWduYXR1cmUtZm9yLWNvX2NyZWF0ZS1BUEkucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzNmM2NQotLS0gL2Rldi9udWxsCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9mbHVlbnRiaXQvZmx1ZW50Yml0LzAwMDEtcHBjLUZpeC1zaWduYXR1cmUtZm9yLWNvX2NyZWF0ZS1BUEkucGF0Y2gKQEAgLTAsMCArMSwzOCBAQAorRnJvbSBiZTQwMzIwNzljOTMxNzA0ZjUyZTI5ZjVkYTVjMDFjZGUyNGFjODQyIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KK0RhdGU6IFRodSwgMTYgSmFuIDIwMjAgMTA6NDQ6NTggLTA4MDAKK1N1YmplY3Q6IFtQQVRDSF0gcHBjOiBGaXggc2lnbmF0dXJlIGZvciBjb19jcmVhdGUgQVBJCisKK1Vwc3RyZWFtLVN0YXR1czogU3VibWl0dGVkIFtodHRwczovL2dpdGh1Yi5jb20vZmx1ZW50L2ZsdWVudC1iaXQvcHVsbC8xODg2XQorU2lnbmVkLW9mZi1ieTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KKy0tLQorIGxpYi9mbGJfbGliY28vcHBjLmMgfCA2ICsrKystLQorIDEgZmlsZSBjaGFuZ2VkLCA0IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9saWIvZmxiX2xpYmNvL3BwYy5jIGIvbGliL2ZsYl9saWJjby9wcGMuYworaW5kZXggZTY1MzZkNTYuLjUzMzI1NmIzIDEwMDY0NAorLS0tIGEvbGliL2ZsYl9saWJjby9wcGMuYworKysrIGIvbGliL2ZsYl9saWJjby9wcGMuYworQEAgLTI3OSw3ICsyNzksOSBAQCBzdGF0aWMgdWludDMyX3QqIGNvX2NyZWF0ZV8odW5zaWduZWQgc2l6ZSwgdWludHB0cl90IGVudHJ5KSB7CisgICByZXR1cm4gdDsKKyB9CisgCistY290aHJlYWRfdCBjb19jcmVhdGUodW5zaWduZWQgaW50IHNpemUsIHZvaWQgKCplbnRyeV8pKHZvaWQpKSB7CisrY290aHJlYWRfdCBjb19jcmVhdGUodW5zaWduZWQgaW50IHNpemUsIHZvaWQgKCplbnRyeV8pKHZvaWQpLAorKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqb3V0X3NpemUpIHsKKysKKyAgIHVpbnRwdHJfdCBlbnRyeSA9ICh1aW50cHRyX3QpZW50cnlfOworICAgdWludDMyX3QqIHQgPSAwOworIAorQEAgLTMyNSw3ICszMjcsNyBAQCBjb3RocmVhZF90IGNvX2NyZWF0ZSh1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAoKmVudHJ5Xykodm9pZCkpIHsKKyAgICAgdFsxMF0gPSAodWludDMyX3QpKHNwID4+IHNoaWZ0ID4+IHNoaWZ0KTsKKyAgICAgdFsxMV0gPSAodWludDMyX3Qpc3A7CisgICB9CistCisrICAqb3V0X3NpemUgPSBzaXplOworICAgcmV0dXJuIHQ7CisgfQorIAorLS0gCisyLjI1LjAKKwpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL2ZsdWVudGJpdC9mbHVlbnRiaXRfMS4zLjUuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtZXh0ZW5kZWQvZmx1ZW50Yml0L2ZsdWVudGJpdF8xLjMuNS5iYgppbmRleCBhYWQxNDk5Li5kOGNiOGI1IDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtZXh0ZW5kZWQvZmx1ZW50Yml0L2ZsdWVudGJpdF8xLjMuNS5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtZXh0ZW5kZWQvZmx1ZW50Yml0L2ZsdWVudGJpdF8xLjMuNS5iYgpAQCAtMTUsNiArMTUsNyBAQAogICAgICAgICAgICBmaWxlOi8vamVtYWxsb2MucGF0Y2ggXAogICAgICAgICAgICBmaWxlOi8vY3Jvc3MtYnVpbGQtaW5pdC1zeXN0ZW0tZGV0ZWN0aW9uLnBhdGNoIFwKICAgICAgICAgICAgZmlsZTovL2J1aWx0aW4tbmFuLnBhdGNoIFwKKyAgICAgICAgICAgZmlsZTovLzAwMDEtcHBjLUZpeC1zaWduYXR1cmUtZm9yLWNvX2NyZWF0ZS1BUEkucGF0Y2ggXAogICAgICAgICAgICIKIFNSQ19VUklbbWQ1c3VtXSA9ICI2ZWFlNmRmZDBhODc0ZTVkZDI3MGMzNmU5YzY4Zjc0NyIKIFNSQ19VUklbc2hhMjU2c3VtXSA9ICJlMDM3Yzc2Yzg5MjY5YzhkYzQwMjdhMDhlNDQyZmVmZDI3NTFiMGYxZTBmOWMzOGY5YTRiMTJkNzgxYTljNzg5IgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL21vempzL21vempzXzYwLjUuMi5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9tb3pqcy9tb3pqc182MC41LjIuYmIKaW5kZXggZjUyYmNjYS4uMzg5YmNhYyAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL21vempzL21vempzXzYwLjUuMi5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtZXh0ZW5kZWQvbW96anMvbW96anNfNjAuNS4yLmJiCkBAIC01Nyw2ICs1Nyw3IEBACiAKICMgV2l0aG91dCB0aGlzLCBKU19Jbml0KCkgd2lsbCBmYWlsIGZvciBtaXBzNjQuCiBFWFRSQV9PRUNPTkZfYXBwZW5kX21pcHNhcmNoID0gIiAtLXdpdGgtaW50bC1hcGk9YnVpbGQiCitFWFRSQV9PRUNPTkZfYXBwZW5kX3Bvd2VycGMgPSAiIC0td2l0aC1pbnRsLWFwaT1idWlsZCIKIAogRVhUUkFfT0VDT05GX2FwcGVuZF9taXBzYXJjaCA9ICIgLS1kaXNhYmxlLWlvbiIKIEVYVFJBX09FQ09ORl9hcHBlbmRfcmlzY3Y2NCA9ICIgLS1kaXNhYmxlLWlvbiIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1ncmFwaGljcy9mb250Zm9yZ2UvZm9udGZvcmdlXzIwMTkwODAxLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWdyYXBoaWNzL2ZvbnRmb3JnZS9mb250Zm9yZ2VfMjAxOTA4MDEuYmIKaW5kZXggOTljMTA4ZC4uYjg0ODA2ZiAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWdyYXBoaWNzL2ZvbnRmb3JnZS9mb250Zm9yZ2VfMjAxOTA4MDEuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWdyYXBoaWNzL2ZvbnRmb3JnZS9mb250Zm9yZ2VfMjAxOTA4MDEuYmIKQEAgLTYsMTAgKzYsMTAgQEAKICAgICBmaWxlOi8vTElDRU5TRTttZDU9ZDA0MmYzZDJhOGZkNzIwOGI3MDRhNDk5MTY4ZTNjODkgXAogIgogCi1ERVBFTkRTID0gImdsaWItMi4wIHBhbmdvIGdpZmxpYiB0aWZmIGxpYnhtbDIganBlZyBweXRob24gbGlidG9vbCB1dGhhc2ggZ2V0dGV4dC1uYXRpdmUiCitERVBFTkRTID0gImdsaWItMi4wIHBhbmdvIGdpZmxpYiB0aWZmIGxpYnhtbDIganBlZyBsaWJ0b29sIHV0aGFzaCBnZXR0ZXh0LW5hdGl2ZSIKIERFUEVORFNfYXBwZW5kX2NsYXNzLXRhcmdldCA9ICIgbGlieGkiCiAKLWluaGVyaXQgYXV0b3Rvb2xzIHBrZ2NvbmZpZyBweXRob25uYXRpdmUgZmVhdHVyZXNfY2hlY2sgZ2V0dGV4dCBndGstaWNvbi1jYWNoZSBtaW1lCitpbmhlcml0IGF1dG90b29scyBwa2djb25maWcgcHl0aG9uM25hdGl2ZSBmZWF0dXJlc19jaGVjayBnZXR0ZXh0IGd0ay1pY29uLWNhY2hlIG1pbWUKIAogUkVRVUlSRURfRElTVFJPX0ZFQVRVUkVTX2FwcGVuZF9jbGFzcy10YXJnZXQgPSAiIHgxMSIKIApAQCAtMzEsOCArMzEsNiBAQAogCiBQQUNLQUdFUyA9KyAiJHtQTn0tcHl0aG9uIgogCi1SUFJPVklERVNfJHtQTn0tZGJnICs9ICIke1BOfS1weXRob24tZGJnIgotCiBGSUxFU18ke1BOfSArPSAiIFwKICAgICAke2RhdGFkaXJ9L2FwcGRhdGEgXAogICAgICR7ZGF0YWRpcn0vbWV0YWluZm8gXApAQCAtNDAsNyArMzgsNyBAQAogIgogCiBGSUxFU18ke1BOfS1weXRob24gPSAiJHtQWVRIT05fU0lURVBBQ0tBR0VTX0RJUn0gJHtkYXRhZGlyfS8ke0JQTn0vcHl0aG9uIgotUkRFUEVORFNfJHtQTn0tcHl0aG9uID0gInB5dGhvbiIKK1JERVBFTkRTXyR7UE59LXB5dGhvbiA9ICJweXRob24zIgogCiAjIGZvciBlLmcga2RlJ3Mgb3h5Z2VuLWZvbnRzCiBCQkNMQVNTRVhURU5EID0gIm5hdGl2ZSIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1tdWx0aW1lZGlhL2phY2svamFjay8wMDAxLWV4YW1wbGUtY2xpZW50cy1Vc2UtYy1jb21waWxlci1mb3ItamFja19zaW1kdGVzdHMucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtbXVsdGltZWRpYS9qYWNrL2phY2svMDAwMS1leGFtcGxlLWNsaWVudHMtVXNlLWMtY29tcGlsZXItZm9yLWphY2tfc2ltZHRlc3RzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTIxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtbXVsdGltZWRpYS9qYWNrL2phY2svMDAwMS1leGFtcGxlLWNsaWVudHMtVXNlLWMtY29tcGlsZXItZm9yLWphY2tfc2ltZHRlc3RzLnBhdGNoCkBAIC0wLDAgKzEsMzMgQEAKK0Zyb20gNzZiOGEzODkyNjgyNzVjYzEzZjNiNGU2MTM5NGQ0MGIyNGVjNTZmMSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CitEYXRlOiBXZWQsIDE1IEphbiAyMDIwIDIwOjIxOjU4IC0wODAwCitTdWJqZWN0OiBbUEFUQ0hdIGV4YW1wbGUtY2xpZW50czogVXNlIGMrKyBjb21waWxlciBmb3IgamFja19zaW1kdGVzdHMKKworSXQgdXNlcyBjKysgc291cmNlcyBhbmQgcnVudGltZSB0aGVyZWZvcmUgaXRzIGJlc3QgdG8gdXNlIGMrKyBjb21waWxlcgordG8gYnVpbGQgaXQgc28gaXQgY2FuIGZpbmQgdGhlIGNvcnJlY3QgcnVudGltZSwgY3Jvc3MgY29tcGlsaW5nIHdpdGgKK2NsYW5nIGZhaWxzCisKK3g4Nl82NC15b2UtbGludXgtbGQ6IGV4YW1wbGUtY2xpZW50cy9zaW1kdGVzdHMuY3BwLjI4Lm86IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gc3ltYm9sICdfX2N4YV9jYWxsX3VuZXhwZWN0ZWRAQENYWEFCSV8xLjMnCisKK1Vwc3RyZWFtLVN0YXR1czogU3VibWl0dGVkIFtodHRwczovL2dpdGh1Yi5jb20vamFja2F1ZGlvL2phY2syL3B1bGwvNTM2XQorU2lnbmVkLW9mZi1ieTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KKy0tLQorIGV4YW1wbGUtY2xpZW50cy93c2NyaXB0IHwgMiArKworIDEgZmlsZSBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKykKKworZGlmZiAtLWdpdCBhL2V4YW1wbGUtY2xpZW50cy93c2NyaXB0IGIvZXhhbXBsZS1jbGllbnRzL3dzY3JpcHQKK2luZGV4IGE4ODU3YWE3Li5kZjk0MzVhYSAxMDA2NDQKKy0tLSBhL2V4YW1wbGUtY2xpZW50cy93c2NyaXB0CisrKysgYi9leGFtcGxlLWNsaWVudHMvd3NjcmlwdAorQEAgLTY5LDYgKzY5LDggQEAgZGVmIGJ1aWxkKGJsZCk6CisgCisgICAgICAgICBpZiBibGQuZW52WydJU19NQUNPU1gnXToKKyAgICAgICAgICAgICBwcm9nID0gYmxkKGZlYXR1cmVzPSdjIGNwcm9ncmFtJywgZnJhbWV3b3JrID0gWydGb3VuZGF0aW9uJ10pCisrICAgICAgICBlbGlmIGV4YW1wbGVfcHJvZ3JhbSA9PSAnamFja19zaW1kdGVzdHMnOgorKyAgICAgICAgICAgIHByb2cgPSBibGQoZmVhdHVyZXM9J2N4eCBjeHhwcm9ncmFtJykKKyAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgcHJvZyA9IGJsZChmZWF0dXJlcz0nYyBjcHJvZ3JhbScpCisgICAgICAgICBwcm9nLmluY2x1ZGVzID0gb3NfaW5jZGlyICsgWycuLi9jb21tb24vamFjaycsICcuLi9jb21tb24nXQorLS0gCisyLjI1LjAKKwpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLW11bHRpbWVkaWEvamFjay9qYWNrXzEuMTkuMTQuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtbXVsdGltZWRpYS9qYWNrL2phY2tfMS4xOS4xNC5iYgppbmRleCBjZWJjOTUyLi5lOTU0MzQxIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtbXVsdGltZWRpYS9qYWNrL2phY2tfMS4xOS4xNC5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtbXVsdGltZWRpYS9qYWNrL2phY2tfMS4xOS4xNC5iYgpAQCAtMTQsNyArMTQsOSBAQAogCiBERVBFTkRTID0gImxpYnNhbXBsZXJhdGUwIGxpYnNuZGZpbGUxIHJlYWRsaW5lIgogCi1TUkNfVVJJID0gImdpdDovL2dpdGh1Yi5jb20vamFja2F1ZGlvL2phY2syLmdpdCIKK1NSQ19VUkkgPSAiZ2l0Oi8vZ2l0aHViLmNvbS9qYWNrYXVkaW8vamFjazIuZ2l0IFwKKyAgICAgICAgICAgZmlsZTovLzAwMDEtZXhhbXBsZS1jbGllbnRzLVVzZS1jLWNvbXBpbGVyLWZvci1qYWNrX3NpbWR0ZXN0cy5wYXRjaCBcCisgICAgICAgICAgIgogU1JDUkVWID0gImI1NGEwOWJmN2VmNzYwZDgxZmRiODU0NGFkMTBlNDU1NzUzOTQ2MjQiCiAKIFMgPSAiJHtXT1JLRElSfS9naXQiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtbXVsdGltZWRpYS9tcGxheWVyL21wdl8wLjI2LjAuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtbXVsdGltZWRpYS9tcGxheWVyL21wdl8wLjI2LjAuYmIKaW5kZXggMjliY2ZlNC4uYzMyN2M0NSAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLW11bHRpbWVkaWEvbXBsYXllci9tcHZfMC4yNi4wLmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1tdWx0aW1lZGlhL21wbGF5ZXIvbXB2XzAuMjYuMC5iYgpAQCAtMzAsNiArMzAsNyBAQAogTFVBX21pcHM2NCAgPSAiIgogTFVBX2FhcmNoNjQgID0gIiIKIExVQV9wb3dlcnBjNjQgID0gIiIKK0xVQV9wb3dlcnBjICA9ICIiCiAKICMgTm90ZTogYm90aCBsdWEgYW5kIGxpYmFzcyBhcmUgcmVxdWlyZWQgdG8gZ2V0IG9uLXNjcmVlbi1kaXNwbGF5IChjb250cm9scykKIFBBQ0tBR0VDT05GSUcgPz89ICIgXApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXByaW50aW5nL2N1cHMvY3Vwcy1maWx0ZXJzLmluYyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1wcmludGluZy9jdXBzL2N1cHMtZmlsdGVycy5pbmMKaW5kZXggNDViZGFiMy4uNTg5YmI5MCAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXByaW50aW5nL2N1cHMvY3Vwcy1maWx0ZXJzLmluYworKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtcHJpbnRpbmcvY3Vwcy9jdXBzLWZpbHRlcnMuaW5jCkBAIC00Nyw4ICs0Nyw3IEBACiAgICAgICAgICIKIAogRklMRVNfJHtQTn0tZ3N0ID0gIlwKLQkke2xpYmRpcn0vY3Vwcy9maWx0ZXIvZ3N0b3B4bCBcCi0JJHtsaWJkaXJ9L2N1cHMvZmlsdGVyL2dzdG9yYXN0ZXIgXAorCSR7bGliZXhlY2Rpcn0vY3Vwcy9maWx0ZXIvZ3N0byogXAogCSIKIAogRklMRVNfJHtQTn0tZGF0YSA9ICJcCkBAIC01NiwzNyArNTUsMjQgQEAKIAkiCiAKIEZJTEVTXyR7UE59LWRiZyArPSAiXAotCSR7bGliZGlyfS9jdXBzL2ZpbHRlci8uZGVidWcgXAotCSR7bGliZGlyfS9jdXBzL2JhY2tlbmQvLmRlYnVnIFwKKwkke2xpYmV4ZWNkaXJ9L2N1cHMvYmFja2VuZC8uZGVidWcgXAorCSR7bGliZXhlY2Rpcn0vY3Vwcy9kcml2ZXIvLmRlYnVnIFwKKwkke2xpYmV4ZWNkaXJ9L2N1cHMvZmlsdGVyLy5kZWJ1ZyBcCiAJIgogCiBGSUxFU18ke1BOfSArPSAiXAotICAgICAgICAke2xpYmRpcn0vY3Vwcy9maWx0ZXIgXAotICAgICAgICAke2xpYmRpcn0vY3Vwcy9iYWNrZW5kIFwKLSAgICAgICAgJHtsaWJkaXJ9L2N1cHMvZHJpdmVyIFwKKyAgICAgICAgJHtsaWJleGVjZGlyfS9jdXBzIFwKKyAgICAgICAgJHtkYXRhZGlyfS9wcGQvIFwKICAgICAgICAgJHtkYXRhZGlyfS9jdXBzL2NoYXJzZXRzIFwKICAgICAgICAgJHtkYXRhZGlyfS9jdXBzL2RydiBcCiAgICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9taW1lIFwKICAgICAgICAgJHtkYXRhZGlyfS9jdXBzL3BwZGMgXAotICAgICAgICAke2RhdGFkaXJ9L3BwZC9jdXBzZmlsdGVycyBcCi0gICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9icmFpbGxlIFwKICAgICAgICAgJHtkYXRhZGlyfS9jdXBzL2Jhbm5lcnMgXAotICAgICAgICAke2RhdGFkaXJ9L2N1cHMvYnJhaWxsZS9pbmRleC5zaCBcCi0gICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9icmFpbGxlL2N1cHMtYnJhaWxsZS5zaCBcCi0gICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9icmFpbGxlL2luZGV4djMuc2ggXAotICAgICAgICAke2RhdGFkaXJ9L2N1cHMvYnJhaWxsZS9pbmRleHY0LnNoIFwKLSAgICAgICAgJHtkYXRhZGlyfS9jdXBzL2Jhbm5lcnMvdG9wc2VjcmV0IFwKLSAgICAgICAgJHtkYXRhZGlyfS9jdXBzL2Jhbm5lcnMvc2VjcmV0IFwKLSAgICAgICAgJHtkYXRhZGlyfS9jdXBzL2Jhbm5lcnMvY29uZmlkZW50aWFsIFwKLSAgICAgICAgJHtkYXRhZGlyfS9jdXBzL2Jhbm5lcnMvdW5jbGFzc2lmaWVkIFwKLSAgICAgICAgJHtkYXRhZGlyfS9jdXBzL2Jhbm5lcnMvZm9ybSBcCi0gICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9iYW5uZXJzL2NsYXNzaWZpZWQgXAotICAgICAgICAke2RhdGFkaXJ9L2N1cHMvYmFubmVycy9zdGFuZGFyZCBcCiAiCiAKIGRvX2luc3RhbGxfYXBwZW5kKCkgewotCSMgcmVtb3ZlIGJhbm5lcnMsIGJyYWlsbGUgZGlycwotCXJtIC1yZiAke0R9JHtkYXRhZGlyfS9jdXBzL3tiYW5uZXJzLGJyYWlsbGV9CisJIyByZW1vdmUgYnJhaWxsZSBkaXIKKwlybSAtcmYgJHtEfSR7ZGF0YWRpcn0vY3Vwcy9icmFpbGxlCiAKIAkjIHJlbW92ZSBzeXNyb290IHBhdGggY29udGFtaW5hdGlvbiBmcm9tIHBrZ2NvbmZpZyBmaWxlCiAJc2VkIC1pIC1lICdzOiR7U1RBR0lOR19ESVJfVEFSR0VUfTo6JyAke0R9LyR7bGliZGlyfS9wa2djb25maWcvbGliY3Vwc2ZpbHRlcnMucGMKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1wcmludGluZy9jdXBzL2N1cHMtZmlsdGVyc18xLjI2LjAuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtcHJpbnRpbmcvY3Vwcy9jdXBzLWZpbHRlcnNfMS4yNi4wLmJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTk2MDJhLi4wMDAwMDAwCi0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1wcmludGluZy9jdXBzL2N1cHMtZmlsdGVyc18xLjI2LjAuYmIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWluY2x1ZGUgY3Vwcy1maWx0ZXJzLmluYwotCi1TUkNfVVJJW21kNXN1bV0gPSAiYWZiMjc4Yzc3YmIxOTVjMmEzMmZjNjRlNWM4Mzc4ZmIiCi1TUkNfVVJJW3NoYTI1NnN1bV0gPSAiZmY4Njc5ZmNkMGMzMWMyNWQyMjkyNjJjN2FkMTAwYmExNjFlZjZiMmFhNDU1YTJkZjY3M2RkNzRlZjkzZjQ4OCIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1wcmludGluZy9jdXBzL2N1cHMtZmlsdGVyc18xLjI2LjIuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtcHJpbnRpbmcvY3Vwcy9jdXBzLWZpbHRlcnNfMS4yNi4yLmJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NmVmMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtcHJpbnRpbmcvY3Vwcy9jdXBzLWZpbHRlcnNfMS4yNi4yLmJiCkBAIC0wLDAgKzEsNCBAQAoraW5jbHVkZSBjdXBzLWZpbHRlcnMuaW5jCisKK1NSQ19VUklbbWQ1c3VtXSA9ICI5NzAwOTU1OTZiZjJiOGNmZTkxYWM5MWMwYjUxMjk3YSIKK1NSQ19VUklbc2hhMjU2c3VtXSA9ICIwMDY5YWVmMTM1ODUyMmYxOTAxYTY0NzQ5ZWM3NTNkMjhhMmQ2YTgzMjc1OGJjZTU4ZmZjZDcyMmIyOGMwZTY2IgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXNlY3VyaXR5L2tleXV0aWxzL2tleXV0aWxzXzEuNi5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zZWN1cml0eS9rZXl1dGlscy9rZXl1dGlsc18xLjYuMS5iYgpzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc2VjdXJpdHkva2V5dXRpbHMva2V5dXRpbHNfMS42LmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc2VjdXJpdHkva2V5dXRpbHMva2V5dXRpbHNfMS42LjEuYmIKaW5kZXggNTcyMTQzYS4uMGE4YzJlNCAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXNlY3VyaXR5L2tleXV0aWxzL2tleXV0aWxzXzEuNi5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc2VjdXJpdHkva2V5dXRpbHMva2V5dXRpbHNfMS42LjEuYmIKQEAgLTIxLDggKzIxLDggQEAKICAgICAgICAgICAgZmlsZTovL2ZpeF9saWJyYXJ5X2luc3RhbGxfcGF0aC5wYXRjaCBcCiAgICAgICAgICAgICIKIAotU1JDX1VSSVttZDVzdW1dID0gIjE5MTk4N2IwYWI0NmJiNWI1MGVmZDcwYTZlNmNlODA4IgotU1JDX1VSSVtzaGEyNTZzdW1dID0gImQzYWVmMjBjZWMwMDA1YzBmYTZiNGJlNDAwNzk4ODU1Njc0NzMxODViMWE1N2I2MjliMDMwZTY3OTQyYzcxMTUiCitTUkNfVVJJW21kNXN1bV0gPSAiOTE5YWY3ZjMzNTc2ODE2YjQyM2Q1MzdmOGE4NjkyZTgiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiYzhiMTU3MjJhZTUxZDk1YjlhZDc2Y2M2ZDQ5YTRjMmNjMTliMGM2MGY3MmY2MWZiOWJmNDNlZWE3Y2JkNjRjZSIKIAogRVhUUkFfT0VNQUtFID0gIidDRkxBR1M9JHtDRkxBR1N9IC1XYWxsJyBcCiAgICAgTk9fQVJMSUI9MSBcCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9sY292L2xjb3ZfMS4xNC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xjb3YvbGNvdl8xLjE0LmJiCmluZGV4IGZkMDJmNGEuLjI2ZTc5N2EgMTAwNzU1Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xjb3YvbGNvdl8xLjE0LmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xjb3YvbGNvdl8xLjE0LmJiCkBAIC0xMyw2ICsxMyw3IEBACiAgICAgcGVybCBcCiAgICAgcGVybC1tb2R1bGUtZmlsZWhhbmRsZSBcCiAgICAgcGVybC1tb2R1bGUtZ2V0b3B0LXN0ZCBcCisgICAgcGVybC1tb2R1bGUtZGlnZXN0LW1kNSBcCiAgICAgcGVybC1tb2R1bGUtZGlnZXN0LXNoYSBcCiAgICAgcGVybC1tb2R1bGUtY29uc3RhbnQgXAogICAgIHBlcmwtbW9kdWxlLWN3ZCBcCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJtaWNyb2h0dHBkL2xpYm1pY3JvaHR0cGRfMC45LjY4LmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbGlibWljcm9odHRwZC9saWJtaWNyb2h0dHBkXzAuOS42OS5iYgpzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJtaWNyb2h0dHBkL2xpYm1pY3JvaHR0cGRfMC45LjY4LmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJtaWNyb2h0dHBkL2xpYm1pY3JvaHR0cGRfMC45LjY5LmJiCmluZGV4IGY1NTY5ZGUuLjRkYWVhZjcgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xpYm1pY3JvaHR0cGQvbGlibWljcm9odHRwZF8wLjkuNjguYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbGlibWljcm9odHRwZC9saWJtaWNyb2h0dHBkXzAuOS42OS5iYgpAQCAtOCw4ICs4LDggQEAKIAogU1JDX1VSSSA9ICIke0dOVV9NSVJST1J9L2xpYm1pY3JvaHR0cGQvJHtCUE59LSR7UFZ9LnRhci5neiBcCiAiCi1TUkNfVVJJW21kNXN1bV0gPSAiMWMzY2EzYmY5MmRmYzY4MDUzOGI0MTg2YzU4YTliZDAiCi1TUkNfVVJJW3NoYTI1NnN1bV0gPSAiYzU3MTZlMmEyODk5YWJjOWUxNmM4ZmE3YTFhNThkYTg4ZjgxYWNhOTZhMGI3ZTY4YTVkNGQ4OWUyMTYxMGI2MSIKK1NSQ19VUklbbWQ1c3VtXSA9ICIzY2UwM2RiMWYxMDAwNzUxN2NlY2YwNWUwNDAwNjlhZiIKK1NSQ19VUklbc2hhMjU2c3VtXSA9ICJmYjliNmIxNDhiNzg3NDkzZTYzN2QzMDgzNTg4NzExZTY1Y2JjYjcyNmZhMDJjZWUyY2Q1NDNjNWRlMjdlMzdlIgogCiBpbmhlcml0IGF1dG90b29scyBsaWJfcGFja2FnZSBwa2djb25maWcgZ2V0dGV4dAogCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloLTEuMC4zLzAwMDEtVXBkYXRlLWF1dG90b29sLWZpbGVzLWFsc28tbWFrZS1pdC13b3JrLXdpdGgtbGF0ZXN0LS5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xpYm5paC9saWJuaWgtMS4wLjMvMDAwMS1VcGRhdGUtYXV0b3Rvb2wtZmlsZXMtYWxzby1tYWtlLWl0LXdvcmstd2l0aC1sYXRlc3QtLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzg1N2MyLi4wMDAwMDAwCi0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xpYm5paC9saWJuaWgtMS4wLjMvMDAwMS1VcGRhdGUtYXV0b3Rvb2wtZmlsZXMtYWxzby1tYWtlLWl0LXdvcmstd2l0aC1sYXRlc3QtLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMjQzMTAgKzAsMCBAQAotRnJvbSAwZjFjYzFiYzYxNTgwN2U4MWZkMjcwOWQ0MTc3Y2E0MTE2ODQ0NmMwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQotRnJvbTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KLURhdGU6IFNhdCwgNyBEZWMgMjAxOSAwMDo0NToyMyAtMDgwMAotU3ViamVjdDogW1BBVENIXSBVcGRhdGUgYXV0b3Rvb2wgZmlsZXMsIGFsc28gbWFrZSBpdCB3b3JrIHdpdGggbGF0ZXN0IGdldHRleHQKLQotVXBzdHJlYW0tU3RhdHVzOiBJbmFwcHJvcHJpYXRlIFtEZWFkIHVwc3RyZWFtXQotU2lnbmVkLW9mZi1ieTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KLS0tLQotIEFCT1VULU5MUyAgICAgICAgICAgICAgIHwgIDEwNjkgKy0tCi0gQ2hhbmdlTG9nICAgICAgICAgICAgICAgfCAgICAgNyArCi0gTWFrZWZpbGUuYW0gICAgICAgICAgICAgfCAgICAgMiArLQotIGNvbmZpZ3VyZS5hYyAgICAgICAgICAgIHwgICAgIDYgKy0KLSBpbnRsL0NoYW5nZUxvZyAgICAgICAgICB8ICAgICA0IC0KLSBpbnRsL01ha2VmaWxlLmluICAgICAgICB8ICAgNTg3IC0tCi0gaW50bC9WRVJTSU9OICAgICAgICAgICAgfCAgICAgMSAtCi0gaW50bC9iaW5kdGV4dGRvbS5jICAgICAgfCAgIDM0MCAtCi0gaW50bC9jb25maWcuY2hhcnNldCAgICAgfCAgIDY0MCAtLQotIGludGwvZGNnZXR0ZXh0LmMgICAgICAgIHwgICAgNTYgLQotIGludGwvZGNpZ2V0dGV4dC5jICAgICAgIHwgIDE2ODkgLS0tLS0KLSBpbnRsL2RjbmdldHRleHQuYyAgICAgICB8ICAgIDU3IC0KLSBpbnRsL2RnZXR0ZXh0LmMgICAgICAgICB8ICAgIDU4IC0KLSBpbnRsL2RuZ2V0dGV4dC5jICAgICAgICB8ICAgIDU5IC0KLSBpbnRsL2V2YWwtcGx1cmFsLmggICAgICB8ICAgMTA4IC0KLSBpbnRsL2V4cGxvZGVuYW1lLmMgICAgICB8ICAgMTM1IC0KLSBpbnRsL2V4cG9ydC5oICAgICAgICAgICB8ICAgICA2IC0KLSBpbnRsL2ZpbmRkb21haW4uYyAgICAgICB8ICAgMjEyIC0KLSBpbnRsL2dldHRleHQuYyAgICAgICAgICB8ICAgIDYzIC0KLSBpbnRsL2dldHRleHRQLmggICAgICAgICB8ICAgMjk3IC0KLSBpbnRsL2dtby5oICAgICAgICAgICAgICB8ICAgMTUyIC0KLSBpbnRsL2hhc2gtc3RyaW5nLmMgICAgICB8ICAgIDUxIC0KLSBpbnRsL2hhc2gtc3RyaW5nLmggICAgICB8ICAgIDM2IC0KLSBpbnRsL2ludGwtY29tcGF0LmMgICAgICB8ICAgMTMzIC0KLSBpbnRsL2ludGwtZXhwb3J0cy5jICAgICB8ICAgIDM2IC0KLSBpbnRsL2wxMG5mbGlzdC5jICAgICAgICB8ICAgNDAwIC0tCi0gaW50bC9sYW5ncHJlZnMuYyAgICAgICAgfCAgIDEzMCAtCi0gaW50bC9saWJnbnVpbnRsLmguaW4gICAgfCAgIDQxOSAtLQotIGludGwvbGliaW50bC5yYyAgICAgICAgIHwgICAgMzggLQotIGludGwvbG9hZGluZm8uaCAgICAgICAgIHwgICAxMzIgLQotIGludGwvbG9hZG1zZ2NhdC5jICAgICAgIHwgIDEzMzYgLS0tLQotIGludGwvbG9jYWxjaGFyc2V0LmMgICAgIHwgICA0NjEgLS0KLSBpbnRsL2xvY2FsY2hhcnNldC5oICAgICB8ICAgIDQyIC0KLSBpbnRsL2xvY2FsZS5hbGlhcyAgICAgICB8ICAgIDc3IC0KLSBpbnRsL2xvY2FsZWFsaWFzLmMgICAgICB8ICAgNDM5IC0tCi0gaW50bC9sb2NhbGVuYW1lLmMgICAgICAgfCAgMTUwNyAtLS0tCi0gaW50bC9sb2NrLmMgICAgICAgICAgICAgfCAgIDkyMiAtLS0KLSBpbnRsL2xvY2suaCAgICAgICAgICAgICB8ICAxMTA1IC0tLQotIGludGwvbG9nLmMgICAgICAgICAgICAgIHwgICAxMTYgLQotIGludGwvbmdldHRleHQuYyAgICAgICAgIHwgICAgNjUgLQotIGludGwvb3MyY29tcGF0LmMgICAgICAgIHwgICAgOTggLQotIGludGwvb3MyY29tcGF0LmggICAgICAgIHwgICAgNDYgLQotIGludGwvb3NkZXAuYyAgICAgICAgICAgIHwgICAgMjYgLQotIGludGwvcGx1cmFsLWV4cC5jICAgICAgIHwgICAxNTUgLQotIGludGwvcGx1cmFsLWV4cC5oICAgICAgIHwgICAxMjkgLQotIGludGwvcGx1cmFsLmMgICAgICAgICAgIHwgIDE5ODEgLS0tLS0tCi0gaW50bC9wbHVyYWwueSAgICAgICAgICAgfCAgIDM4NSAtLQotIGludGwvcHJpbnRmLWFyZ3MuYyAgICAgIHwgICAxODggLQotIGludGwvcHJpbnRmLWFyZ3MuaCAgICAgIHwgICAxNTUgLQotIGludGwvcHJpbnRmLXBhcnNlLmMgICAgIHwgICA1OTAgLS0KLSBpbnRsL3ByaW50Zi1wYXJzZS5oICAgICB8ICAgIDc1IC0KLSBpbnRsL3ByaW50Zi5jICAgICAgICAgICB8ICAgNDI3IC0tCi0gaW50bC9yZWYtYWRkLnNpbiAgICAgICAgfCAgICAzMSAtCi0gaW50bC9yZWYtZGVsLnNpbiAgICAgICAgfCAgICAyNiAtCi0gaW50bC9yZWxvY2F0YWJsZS5jICAgICAgfCAgIDQ2OCAtLQotIGludGwvcmVsb2NhdGFibGUuaCAgICAgIHwgICAgNzkgLQotIGludGwvdGV4dGRvbWFpbi5jICAgICAgIHwgICAxMjcgLQotIGludGwvdHNlYXJjaC5jICAgICAgICAgIHwgICA2ODQgLS0KLSBpbnRsL3RzZWFyY2guaCAgICAgICAgICB8ICAgIDgzIC0KLSBpbnRsL3Zhc25wcmludGYuYyAgICAgICB8ICA0Njc3IC0tLS0tLS0tLS0tLS0KLSBpbnRsL3Zhc25wcmludGYuaCAgICAgICB8ICAgIDc4IC0KLSBpbnRsL3Zhc253cHJpbnRmLmggICAgICB8ICAgIDQ2IC0KLSBpbnRsL3ZlcnNpb24uYyAgICAgICAgICB8ICAgIDI2IC0KLSBpbnRsL3dwcmludGYtcGFyc2UuaCAgICB8ICAgIDc1IC0KLSBpbnRsL3hzaXplLmggICAgICAgICAgICB8ICAgMTA5IC0KLSBtNC9pbnRsbWFjb3N4Lm00ICAgICAgICB8ICAgIDU1ICstCi0gcG8vQ2hhbmdlTG9nICAgICAgICAgICAgfCAgICAgOCArCi0gcG8vUnVsZXMtcXVvdCAgICAgICAgICAgfCAgICAxOSArLQotIHBvL2VuQGJvbGRxdW90LmhlYWRlciAgIHwgICAgIDIgKy0KLSBwby9lbkBxdW90LmhlYWRlciAgICAgICB8ICAgICAyICstCi0gcG8vaW5zZXJ0LWhlYWRlci5zaW4gICAgfCAgICAgNSArCi0gcG8vcmVtb3ZlLXBvdGNkYXRlLnNpbiAgfCAgICAgOCArLQotIDc0IGZpbGVzIGNoYW5nZWQsIDEzMzUgaW5zZXJ0aW9ucygrKSwgMzg2NDYgZGVsZXRpb25zKC0pCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvQ2hhbmdlTG9nCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvTWFrZWZpbGUuaW4KLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9WRVJTSU9OCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvYmluZHRleHRkb20uYwotIGRlbGV0ZSBtb2RlIDEwMDc1NSBpbnRsL2NvbmZpZy5jaGFyc2V0Ci0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvZGNnZXR0ZXh0LmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9kY2lnZXR0ZXh0LmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9kY25nZXR0ZXh0LmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9kZ2V0dGV4dC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvZG5nZXR0ZXh0LmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9ldmFsLXBsdXJhbC5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvZXhwbG9kZW5hbWUuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2V4cG9ydC5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvZmluZGRvbWFpbi5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvZ2V0dGV4dC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvZ2V0dGV4dFAuaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2dtby5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvaGFzaC1zdHJpbmcuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2hhc2gtc3RyaW5nLmgKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9pbnRsLWNvbXBhdC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvaW50bC1leHBvcnRzLmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9sMTBuZmxpc3QuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2xhbmdwcmVmcy5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvbGliZ251aW50bC5oLmluCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvbGliaW50bC5yYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2xvYWRpbmZvLmgKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9sb2FkbXNnY2F0LmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9sb2NhbGNoYXJzZXQuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2xvY2FsY2hhcnNldC5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvbG9jYWxlLmFsaWFzCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvbG9jYWxlYWxpYXMuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2xvY2FsZW5hbWUuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2xvY2suYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2xvY2suaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2xvZy5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvbmdldHRleHQuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL29zMmNvbXBhdC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvb3MyY29tcGF0LmgKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9vc2RlcC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvcGx1cmFsLWV4cC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvcGx1cmFsLWV4cC5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvcGx1cmFsLmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9wbHVyYWwueQotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3ByaW50Zi1hcmdzLmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9wcmludGYtYXJncy5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvcHJpbnRmLXBhcnNlLmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9wcmludGYtcGFyc2UuaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3ByaW50Zi5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvcmVmLWFkZC5zaW4KLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9yZWYtZGVsLnNpbgotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3JlbG9jYXRhYmxlLmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9yZWxvY2F0YWJsZS5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvdGV4dGRvbWFpbi5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvdHNlYXJjaC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvdHNlYXJjaC5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvdmFzbnByaW50Zi5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvdmFzbnByaW50Zi5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvdmFzbndwcmludGYuaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3ZlcnNpb24uYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3dwcmludGYtcGFyc2UuaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3hzaXplLmgKLQotLS0tIGEvQUJPVVQtTkxTCi0rKysgYi9BQk9VVC1OTFMKLUBAIC0xLDEwNjggKzEgQEAKLS0xIE5vdGVzIG9uIHRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QKLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS0KLS1GcmVlIHNvZnR3YXJlIGlzIGdvaW5nIGludGVybmF0aW9uYWwhICBUaGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0IGlzCi0tYSB3YXkgdG8gZ2V0IG1haW50YWluZXJzIG9mIGZyZWUgc29mdHdhcmUsIHRyYW5zbGF0b3JzLCBhbmQgdXNlcnMgYWxsCi0tdG9nZXRoZXIsIHNvIHRoYXQgZnJlZSBzb2Z0d2FyZSB3aWxsIGdyYWR1YWxseSBiZWNvbWUgYWJsZSB0byBzcGVhayBtYW55Ci0tbGFuZ3VhZ2VzLiAgQSBmZXcgcGFja2FnZXMgYWxyZWFkeSBwcm92aWRlIHRyYW5zbGF0aW9ucyBmb3IgdGhlaXIKLS1tZXNzYWdlcy4KLS0KLS0gICBJZiB5b3UgZm91bmQgdGhpcyBgQUJPVVQtTkxTJyBmaWxlIGluc2lkZSBhIGRpc3RyaWJ1dGlvbiwgeW91IG1heQotLWFzc3VtZSB0aGF0IHRoZSBkaXN0cmlidXRlZCBwYWNrYWdlIGRvZXMgdXNlIEdOVSBgZ2V0dGV4dCcgaW50ZXJuYWxseSwKLS1pdHNlbGYgYXZhaWxhYmxlIGF0IHlvdXIgbmVhcmVzdCBHTlUgYXJjaGl2ZSBzaXRlLiAgQnV0IHlvdSBkbyBfbm90XwotLW5lZWQgdG8gaW5zdGFsbCBHTlUgYGdldHRleHQnIHByaW9yIHRvIGNvbmZpZ3VyaW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nCi0tdGhpcyBwYWNrYWdlIHdpdGggbWVzc2FnZXMgdHJhbnNsYXRlZC4KLS0KLS0gICBJbnN0YWxsZXJzIHdpbGwgZmluZCBoZXJlIHNvbWUgdXNlZnVsIGhpbnRzLiAgVGhlc2Ugbm90ZXMgYWxzbwotLWV4cGxhaW4gaG93IHVzZXJzIHNob3VsZCBwcm9jZWVkIGZvciBnZXR0aW5nIHRoZSBwcm9ncmFtcyB0byB1c2UgdGhlCi0tYXZhaWxhYmxlIHRyYW5zbGF0aW9ucy4gIFRoZXkgdGVsbCBob3cgcGVvcGxlIHdhbnRpbmcgdG8gY29udHJpYnV0ZSBhbmQKLS13b3JrIG9uIHRyYW5zbGF0aW9ucyBjYW4gY29udGFjdCB0aGUgYXBwcm9wcmlhdGUgdGVhbS4KLS0KLS0gICBXaGVuIHJlcG9ydGluZyBidWdzIGluIHRoZSBgaW50bC8nIGRpcmVjdG9yeSBvciBidWdzIHdoaWNoIG1heSBiZQotLXJlbGF0ZWQgdG8gaW50ZXJuYXRpb25hbGl6YXRpb24sIHlvdSBzaG91bGQgdGVsbCBhYm91dCB0aGUgdmVyc2lvbiBvZgotLWBnZXR0ZXh0JyB3aGljaCBpcyB1c2VkLiAgVGhlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUKLS1gaW50bC9WRVJTSU9OJyBmaWxlLCBpbiBpbnRlcm5hdGlvbmFsaXplZCBwYWNrYWdlcy4KLS0KLS0xLjEgUXVpY2sgY29uZmlndXJhdGlvbiBhZHZpY2UKLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0KLS1JZiB5b3Ugd2FudCB0byBleHBsb2l0IHRoZSBmdWxsIHBvd2VyIG9mIGludGVybmF0aW9uYWxpemF0aW9uLCB5b3UKLS1zaG91bGQgY29uZmlndXJlIGl0IHVzaW5nCi0tCi0tICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dAotLQotLXRvIGZvcmNlIHVzYWdlIG9mIGludGVybmF0aW9uYWxpemluZyByb3V0aW5lcyBwcm92aWRlZCB3aXRoaW4gdGhpcwotLXBhY2thZ2UsIGRlc3BpdGUgdGhlIGV4aXN0ZW5jZSBvZiBpbnRlcm5hdGlvbmFsaXppbmcgY2FwYWJpbGl0aWVzIGluIHRoZQotLW9wZXJhdGluZyBzeXN0ZW0gd2hlcmUgdGhpcyBwYWNrYWdlIGlzIGJlaW5nIGluc3RhbGxlZC4gIFNvIGZhciwgb25seQotLXRoZSBgZ2V0dGV4dCcgaW1wbGVtZW50YXRpb24gaW4gdGhlIEdOVSBDIGxpYnJhcnkgdmVyc2lvbiAyIHByb3ZpZGVzIGFzCi0tbWFueSBmZWF0dXJlcyAoc3VjaCBhcyBsb2NhbGUgYWxpYXMsIG1lc3NhZ2UgaW5oZXJpdGFuY2UsIGF1dG9tYXRpYwotLWNoYXJzZXQgY29udmVyc2lvbiBvciBwbHVyYWwgZm9ybSBoYW5kbGluZykgYXMgdGhlIGltcGxlbWVudGF0aW9uIGhlcmUuCi0tSXQgaXMgYWxzbyBub3QgcG9zc2libGUgdG8gb2ZmZXIgdGhpcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgb24gdG9wCi0tb2YgYSBgY2F0Z2V0cycgaW1wbGVtZW50YXRpb24uICBGdXR1cmUgdmVyc2lvbnMgb2YgR05VIGBnZXR0ZXh0JyB3aWxsCi0tdmVyeSBsaWtlbHkgY29udmV5IGV2ZW4gbW9yZSBmdW5jdGlvbmFsaXR5LiAgU28gaXQgbWlnaHQgYmUgYSBnb29kIGlkZWEKLS10byBjaGFuZ2UgdG8gR05VIGBnZXR0ZXh0JyBhcyBzb29uIGFzIHBvc3NpYmxlLgotLQotLSAgIFNvIHlvdSBuZWVkIF9ub3RfIHByb3ZpZGUgdGhpcyBvcHRpb24gaWYgeW91IGFyZSB1c2luZyBHTlUgbGliYyAyIG9yCi0teW91IGhhdmUgaW5zdGFsbGVkIGEgcmVjZW50IGNvcHkgb2YgdGhlIEdOVSBnZXR0ZXh0IHBhY2thZ2Ugd2l0aCB0aGUKLS1pbmNsdWRlZCBgbGliaW50bCcuCi0tCi0tMS4yIElOU1RBTEwgTWF0dGVycwotLT09PT09PT09PT09PT09PT09PT0KLS0KLS1Tb21lIHBhY2thZ2VzIGFyZSAibG9jYWxpemFibGUiIHdoZW4gcHJvcGVybHkgaW5zdGFsbGVkOyB0aGUgcHJvZ3JhbXMKLS10aGV5IGNvbnRhaW4gY2FuIGJlIG1hZGUgdG8gc3BlYWsgeW91ciBvd24gbmF0aXZlIGxhbmd1YWdlLiAgTW9zdCBzdWNoCi0tcGFja2FnZXMgdXNlIEdOVSBgZ2V0dGV4dCcuICBPdGhlciBwYWNrYWdlcyBoYXZlIHRoZWlyIG93biB3YXlzIHRvCi0taW50ZXJuYXRpb25hbGl6YXRpb24sIHByZWRhdGluZyBHTlUgYGdldHRleHQnLgotLQotLSAgIEJ5IGRlZmF1bHQsIHRoaXMgcGFja2FnZSB3aWxsIGJlIGluc3RhbGxlZCB0byBhbGxvdyB0cmFuc2xhdGlvbiBvZgotLW1lc3NhZ2VzLiAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB3aGV0aGVyIHRoZSBzeXN0ZW0gYWxyZWFkeQotLXByb3ZpZGVzIHRoZSBHTlUgYGdldHRleHQnIGZ1bmN0aW9ucy4gIElmIG5vdCwgdGhlIGluY2x1ZGVkIEdOVQotLWBnZXR0ZXh0JyBsaWJyYXJ5IHdpbGwgYmUgdXNlZC4gIFRoaXMgbGlicmFyeSBpcyB3aG9sbHkgY29udGFpbmVkCi0td2l0aGluIHRoaXMgcGFja2FnZSwgdXN1YWxseSBpbiB0aGUgYGludGwvJyBzdWJkaXJlY3RvcnksIHNvIHByaW9yCi0taW5zdGFsbGF0aW9uIG9mIHRoZSBHTlUgYGdldHRleHQnIHBhY2thZ2UgaXMgX25vdF8gcmVxdWlyZWQuCi0tSW5zdGFsbGVycyBtYXkgdXNlIHNwZWNpYWwgb3B0aW9ucyBhdCBjb25maWd1cmF0aW9uIHRpbWUgZm9yIGNoYW5naW5nCi0tdGhlIGRlZmF1bHQgYmVoYXZpb3VyLiAgVGhlIGNvbW1hbmRzOgotLQotLSAgICAgLi9jb25maWd1cmUgLS13aXRoLWluY2x1ZGVkLWdldHRleHQKLS0gICAgIC4vY29uZmlndXJlIC0tZGlzYWJsZS1ubHMKLS0KLS13aWxsLCByZXNwZWN0aXZlbHksIGJ5cGFzcyBhbnkgcHJlLWV4aXN0aW5nIGBnZXR0ZXh0JyB0byB1c2UgdGhlCi0taW50ZXJuYXRpb25hbGl6aW5nIHJvdXRpbmVzIHByb3ZpZGVkIHdpdGhpbiB0aGlzIHBhY2thZ2UsIG9yIGVsc2UsCi0tX3RvdGFsbHlfIGRpc2FibGUgdHJhbnNsYXRpb24gb2YgbWVzc2FnZXMuCi0tCi0tICAgV2hlbiB5b3UgYWxyZWFkeSBoYXZlIEdOVSBgZ2V0dGV4dCcgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtIGFuZCBydW4KLS1jb25maWd1cmUgd2l0aG91dCBhbiBvcHRpb24gZm9yIHlvdXIgbmV3IHBhY2thZ2UsIGBjb25maWd1cmUnIHdpbGwKLS1wcm9iYWJseSBkZXRlY3QgdGhlIHByZXZpb3VzbHkgYnVpbHQgYW5kIGluc3RhbGxlZCBgbGliaW50bC5hJyBmaWxlIGFuZAotLXdpbGwgZGVjaWRlIHRvIHVzZSB0aGlzLiAgVGhpcyBtaWdodCBub3QgYmUgZGVzaXJhYmxlLiAgWW91IHNob3VsZCB1c2UKLS10aGUgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiB0aGUgR05VIGBnZXR0ZXh0JyBsaWJyYXJ5LiAgSS5lLiBpZiB0aGUgZmlsZQotLWBpbnRsL1ZFUlNJT04nIHNob3dzIHRoYXQgdGhlIGxpYnJhcnkgd2hpY2ggY29tZXMgd2l0aCB0aGlzIHBhY2thZ2UgaXMKLS1tb3JlIHJlY2VudCwgeW91IHNob3VsZCB1c2UKLS0KLS0gICAgIC4vY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0Ci0tCi0tdG8gcHJldmVudCBhdXRvLWRldGVjdGlvbi4KLS0KLS0gICBUaGUgY29uZmlndXJhdGlvbiBwcm9jZXNzIHdpbGwgbm90IHRlc3QgZm9yIHRoZSBgY2F0Z2V0cycgZnVuY3Rpb24KLS1hbmQgdGhlcmVmb3JlIGl0IHdpbGwgbm90IGJlIHVzZWQuICBUaGUgcmVhc29uIGlzIHRoYXQgZXZlbiBhbgotLWVtdWxhdGlvbiBvZiBgZ2V0dGV4dCcgb24gdG9wIG9mIGBjYXRnZXRzJyBjb3VsZCBub3QgcHJvdmlkZSBhbGwgdGhlCi0tZXh0ZW5zaW9ucyBvZiB0aGUgR05VIGBnZXR0ZXh0JyBsaWJyYXJ5LgotLQotLSAgIEludGVybmF0aW9uYWxpemVkIHBhY2thZ2VzIHVzdWFsbHkgaGF2ZSBtYW55IGBwby9MTC5wbycgZmlsZXMsIHdoZXJlCi0tTEwgZ2l2ZXMgYW4gSVNPIDYzOSB0d28tbGV0dGVyIGNvZGUgaWRlbnRpZnlpbmcgdGhlIGxhbmd1YWdlLiAgVW5sZXNzCi0tdHJhbnNsYXRpb25zIGhhdmUgYmVlbiBmb3JiaWRkZW4gYXQgYGNvbmZpZ3VyZScgdGltZSBieSB1c2luZyB0aGUKLS1gLS1kaXNhYmxlLW5scycgc3dpdGNoLCBhbGwgYXZhaWxhYmxlIHRyYW5zbGF0aW9ucyBhcmUgaW5zdGFsbGVkCi0tdG9nZXRoZXIgd2l0aCB0aGUgcGFja2FnZS4gIEhvd2V2ZXIsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgTElOR1VBUycKLS1tYXkgYmUgc2V0LCBwcmlvciB0byBjb25maWd1cmF0aW9uLCB0byBsaW1pdCB0aGUgaW5zdGFsbGVkIHNldC4KLS1gTElOR1VBUycgc2hvdWxkIHRoZW4gY29udGFpbiBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIHR3by1sZXR0ZXIKLS1jb2Rlcywgc3RhdGluZyB3aGljaCBsYW5ndWFnZXMgYXJlIGFsbG93ZWQuCi0tCi0tMS4zIFVzaW5nIFRoaXMgUGFja2FnZQotLT09PT09PT09PT09PT09PT09PT09PT0KLS0KLS1BcyBhIHVzZXIsIGlmIHlvdXIgbGFuZ3VhZ2UgaGFzIGJlZW4gaW5zdGFsbGVkIGZvciB0aGlzIHBhY2thZ2UsIHlvdQotLW9ubHkgaGF2ZSB0byBzZXQgdGhlIGBMQU5HJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgYXBwcm9wcmlhdGUKLS1gTExfQ0MnIGNvbWJpbmF0aW9uLiAgSWYgeW91IGhhcHBlbiB0byBoYXZlIHRoZSBgTENfQUxMJyBvciBzb21lIG90aGVyCi0tYExDX3h4eCcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCwgeW91IHNob3VsZCB1bnNldCB0aGVtIGJlZm9yZQotLXNldHRpbmcgYExBTkcnLCBvdGhlcndpc2UgdGhlIHNldHRpbmcgb2YgYExBTkcnIHdpbGwgbm90IGhhdmUgdGhlCi0tZGVzaXJlZCBlZmZlY3QuICBIZXJlIGBMTCcgaXMgYW4gSVNPIDYzOSB0d28tbGV0dGVyIGxhbmd1YWdlIGNvZGUsIGFuZAotLWBDQycgaXMgYW4gSVNPIDMxNjYgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUuICBGb3IgZXhhbXBsZSwgbGV0J3MKLS1zdXBwb3NlIHRoYXQgeW91IHNwZWFrIEdlcm1hbiBhbmQgbGl2ZSBpbiBHZXJtYW55LiAgQXQgdGhlIHNoZWxsCi0tcHJvbXB0LCBtZXJlbHkgZXhlY3V0ZSBgc2V0ZW52IExBTkcgZGVfREUnIChpbiBgY3NoJyksCi0tYGV4cG9ydCBMQU5HOyBMQU5HPWRlX0RFJyAoaW4gYHNoJykgb3IgYGV4cG9ydCBMQU5HPWRlX0RFJyAoaW4gYGJhc2gnKS4KLS1UaGlzIGNhbiBiZSBkb25lIGZyb20geW91ciBgLmxvZ2luJyBvciBgLnByb2ZpbGUnIGZpbGUsIG9uY2UgYW5kIGZvcgotLWFsbC4KLS0KLS0gICBZb3UgbWlnaHQgdGhpbmsgdGhhdCB0aGUgY291bnRyeSBjb2RlIHNwZWNpZmljYXRpb24gaXMgcmVkdW5kYW50LgotLUJ1dCBpbiBmYWN0LCBzb21lIGxhbmd1YWdlcyBoYXZlIGRpYWxlY3RzIGluIGRpZmZlcmVudCBjb3VudHJpZXMuICBGb3IKLS1leGFtcGxlLCBgZGVfQVQnIGlzIHVzZWQgZm9yIEF1c3RyaWEsIGFuZCBgcHRfQlInIGZvciBCcmF6aWwuICBUaGUKLS1jb3VudHJ5IGNvZGUgc2VydmVzIHRvIGRpc3Rpbmd1aXNoIHRoZSBkaWFsZWN0cy4KLS0KLS0gICBUaGUgbG9jYWxlIG5hbWluZyBjb252ZW50aW9uIG9mIGBMTF9DQycsIHdpdGggYExMJyBkZW5vdGluZyB0aGUKLS1sYW5ndWFnZSBhbmQgYENDJyBkZW5vdGluZyB0aGUgY291bnRyeSwgaXMgdGhlIG9uZSB1c2Ugb24gc3lzdGVtcyBiYXNlZAotLW9uIEdOVSBsaWJjLiAgT24gb3RoZXIgc3lzdGVtcywgc29tZSB2YXJpYXRpb25zIG9mIHRoaXMgc2NoZW1lIGFyZQotLXVzZWQsIHN1Y2ggYXMgYExMJyBvciBgTExfQ0MuRU5DT0RJTkcnLiAgWW91IGNhbiBnZXQgdGhlIGxpc3Qgb2YKLS1sb2NhbGVzIHN1cHBvcnRlZCBieSB5b3VyIHN5c3RlbSBmb3IgeW91ciBsYW5ndWFnZSBieSBydW5uaW5nIHRoZQotLWNvbW1hbmQgYGxvY2FsZSAtYSB8IGdyZXAgJ15MTCcnLgotLQotLSAgIE5vdCBhbGwgcHJvZ3JhbXMgaGF2ZSB0cmFuc2xhdGlvbnMgZm9yIGFsbCBsYW5ndWFnZXMuICBCeSBkZWZhdWx0LCBhbgotLUVuZ2xpc2ggbWVzc2FnZSBpcyBzaG93biBpbiBwbGFjZSBvZiBhIG5vbmV4aXN0ZW50IHRyYW5zbGF0aW9uLiAgSWYgeW91Ci0tdW5kZXJzdGFuZCBvdGhlciBsYW5ndWFnZXMsIHlvdSBjYW4gc2V0IHVwIGEgcHJpb3JpdHkgbGlzdCBvZiBsYW5ndWFnZXMuCi0tVGhpcyBpcyBkb25lIHRocm91Z2ggYSBkaWZmZXJlbnQgZW52aXJvbm1lbnQgdmFyaWFibGUsIGNhbGxlZAotLWBMQU5HVUFHRScuICBHTlUgYGdldHRleHQnIGdpdmVzIHByZWZlcmVuY2UgdG8gYExBTkdVQUdFJyBvdmVyIGBMQU5HJwotLWZvciB0aGUgcHVycG9zZSBvZiBtZXNzYWdlIGhhbmRsaW5nLCBidXQgeW91IHN0aWxsIG5lZWQgdG8gaGF2ZSBgTEFORycKLS1zZXQgdG8gdGhlIHByaW1hcnkgbGFuZ3VhZ2U7IHRoaXMgaXMgcmVxdWlyZWQgYnkgb3RoZXIgcGFydHMgb2YgdGhlCi0tc3lzdGVtIGxpYnJhcmllcy4gIEZvciBleGFtcGxlLCBzb21lIFN3ZWRpc2ggdXNlcnMgd2hvIHdvdWxkIHJhdGhlcgotLXJlYWQgdHJhbnNsYXRpb25zIGluIEdlcm1hbiB0aGFuIEVuZ2xpc2ggZm9yIHdoZW4gU3dlZGlzaCBpcyBub3QKLS1hdmFpbGFibGUsIHNldCBgTEFOR1VBR0UnIHRvIGBzdjpkZScgd2hpbGUgbGVhdmluZyBgTEFORycgdG8gYHN2X1NFJy4KLS0KLS0gICBTcGVjaWFsIGFkdmljZSBmb3IgTm9yd2VnaWFuIHVzZXJzOiBUaGUgbGFuZ3VhZ2UgY29kZSBmb3IgTm9yd2VnaWFuCi0tYm9rbWEqbCBjaGFuZ2VkIGZyb20gYG5vJyB0byBgbmInIHJlY2VudGx5IChpbiAyMDAzKS4gIER1cmluZyB0aGUKLS10cmFuc2l0aW9uIHBlcmlvZCwgd2hpbGUgc29tZSBtZXNzYWdlIGNhdGFsb2dzIGZvciB0aGlzIGxhbmd1YWdlIGFyZQotLWluc3RhbGxlZCB1bmRlciBgbmInIGFuZCBzb21lIG9sZGVyIG9uZXMgdW5kZXIgYG5vJywgaXQncyByZWNvbW1lbmRlZAotLWZvciBOb3J3ZWdpYW4gdXNlcnMgdG8gc2V0IGBMQU5HVUFHRScgdG8gYG5iOm5vJyBzbyB0aGF0IGJvdGggbmV3ZXIgYW5kCi0tb2xkZXIgdHJhbnNsYXRpb25zIGFyZSB1c2VkLgotLQotLSAgIEluIHRoZSBgTEFOR1VBR0UnIGVudmlyb25tZW50IHZhcmlhYmxlLCBidXQgbm90IGluIHRoZSBgTEFORycKLS1lbnZpcm9ubWVudCB2YXJpYWJsZSwgYExMX0NDJyBjb21iaW5hdGlvbnMgY2FuIGJlIGFiYnJldmlhdGVkIGFzIGBMTCcKLS10byBkZW5vdGUgdGhlIGxhbmd1YWdlJ3MgbWFpbiBkaWFsZWN0LiAgRm9yIGV4YW1wbGUsIGBkZScgaXMgZXF1aXZhbGVudAotLXRvIGBkZV9ERScgKEdlcm1hbiBhcyBzcG9rZW4gaW4gR2VybWFueSksIGFuZCBgcHQnIHRvIGBwdF9QVCcKLS0oUG9ydHVndWVzZSBhcyBzcG9rZW4gaW4gUG9ydHVnYWwpIGluIHRoaXMgY29udGV4dC4KLS0KLS0xLjQgVHJhbnNsYXRpbmcgVGVhbXMKLS09PT09PT09PT09PT09PT09PT09PT0KLS0KLS1Gb3IgdGhlIEZyZWUgVHJhbnNsYXRpb24gUHJvamVjdCB0byBiZSBhIHN1Y2Nlc3MsIHdlIG5lZWQgaW50ZXJlc3RlZAotLXBlb3BsZSB3aG8gbGlrZSB0aGVpciBvd24gbGFuZ3VhZ2UgYW5kIHdyaXRlIGl0IHdlbGwsIGFuZCB3aG8gYXJlIGFsc28KLS1hYmxlIHRvIHN5bmVyZ2l6ZSB3aXRoIG90aGVyIHRyYW5zbGF0b3JzIHNwZWFraW5nIHRoZSBzYW1lIGxhbmd1YWdlLgotLUVhY2ggdHJhbnNsYXRpb24gdGVhbSBoYXMgaXRzIG93biBtYWlsaW5nIGxpc3QuICBUaGUgdXAtdG8tZGF0ZSBsaXN0IG9mCi0tdGVhbXMgY2FuIGJlIGZvdW5kIGF0IHRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QncyBob21lcGFnZSwKLS1gaHR0cDovL3RyYW5zbGF0aW9ucHJvamVjdC5vcmcvJywgaW4gdGhlICJUZWFtcyIgYXJlYS4KLS0KLS0gICBJZiB5b3UnZCBsaWtlIHRvIHZvbHVudGVlciB0byBfd29ya18gYXQgdHJhbnNsYXRpbmcgbWVzc2FnZXMsIHlvdQotLXNob3VsZCBiZWNvbWUgYSBtZW1iZXIgb2YgdGhlIHRyYW5zbGF0aW5nIHRlYW0gZm9yIHlvdXIgb3duIGxhbmd1YWdlLgotLVRoZSBzdWJzY3JpYmluZyBhZGRyZXNzIGlzIF9ub3RfIHRoZSBzYW1lIGFzIHRoZSBsaXN0IGl0c2VsZiwgaXQgaGFzCi0tYC1yZXF1ZXN0JyBhcHBlbmRlZC4gIEZvciBleGFtcGxlLCBzcGVha2VycyBvZiBTd2VkaXNoIGNhbiBzZW5kIGEKLS1tZXNzYWdlIHRvIGBzdi1yZXF1ZXN0QGxpLm9yZycsIGhhdmluZyB0aGlzIG1lc3NhZ2UgYm9keToKLS0KLS0gICAgIHN1YnNjcmliZQotLQotLSAgIEtlZXAgaW4gbWluZCB0aGF0IHRlYW0gbWVtYmVycyBhcmUgZXhwZWN0ZWQgdG8gcGFydGljaXBhdGUKLS1fYWN0aXZlbHlfIGluIHRyYW5zbGF0aW9ucywgb3IgYXQgc29sdmluZyB0cmFuc2xhdGlvbmFsIGRpZmZpY3VsdGllcywKLS1yYXRoZXIgdGhhbiBtZXJlbHkgbHVya2luZyBhcm91bmQuICBJZiB5b3VyIHRlYW0gZG9lcyBub3QgZXhpc3QgeWV0IGFuZAotLXlvdSB3YW50IHRvIHN0YXJ0IG9uZSwgb3IgaWYgeW91IGFyZSB1bnN1cmUgYWJvdXQgd2hhdCB0byBkbyBvciBob3cgdG8KLS1nZXQgc3RhcnRlZCwgcGxlYXNlIHdyaXRlIHRvIGBjb29yZGluYXRvckB0cmFuc2xhdGlvbnByb2plY3Qub3JnJyB0bwotLXJlYWNoIHRoZSBjb29yZGluYXRvciBmb3IgYWxsIHRyYW5zbGF0b3IgdGVhbXMuCi0tCi0tICAgVGhlIEVuZ2xpc2ggdGVhbSBpcyBzcGVjaWFsLiAgSXQgd29ya3MgYXQgaW1wcm92aW5nIGFuZCB1bmlmb3JtaXppbmcKLS10aGUgdGVybWlub2xvZ3kgaW4gdXNlLiAgUHJvdmVuIGxpbmd1aXN0aWMgc2tpbGxzIGFyZSBwcmFpc2VkIG1vcmUgdGhhbgotLXByb2dyYW1taW5nIHNraWxscywgaGVyZS4KLS0KLS0xLjUgQXZhaWxhYmxlIFBhY2thZ2VzCi0tPT09PT09PT09PT09PT09PT09PT09PQotLQotLUxhbmd1YWdlcyBhcmUgbm90IGVxdWFsbHkgc3VwcG9ydGVkIGluIGFsbCBwYWNrYWdlcy4gIFRoZSBmb2xsb3dpbmcKLS1tYXRyaXggc2hvd3MgdGhlIGN1cnJlbnQgc3RhdGUgb2YgaW50ZXJuYXRpb25hbGl6YXRpb24sIGFzIG9mIE5vdmVtYmVyCi0tMjAwNy4gIFRoZSBtYXRyaXggc2hvd3MsIGluIHJlZ2FyZCBvZiBlYWNoIHBhY2thZ2UsIGZvciB3aGljaCBsYW5ndWFnZXMKLS1QTyBmaWxlcyBoYXZlIGJlZW4gc3VibWl0dGVkIHRvIHRyYW5zbGF0aW9uIGNvb3JkaW5hdGlvbiwgd2l0aCBhCi0tdHJhbnNsYXRpb24gcGVyY2VudGFnZSBvZiBhdCBsZWFzdCA1MCUuCi0tCi0tICAgICBSZWFkeSBQTyBmaWxlcyAgICAgICBhZiBhbSBhciBheiBiZSBiZyBicyBjYSBjcyBjeSBkYSBkZSBlbCBlbiBlbl9HQiBlbwotLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLSAgICAgQ29tcGVuZGl1bSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgIFtdICAgICAgfAotLSAgICAgYTJwcyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gW10gW10gICAgIFtdICAgICAgfAotLSAgICAgYWVnaXMgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgfAotLSAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgfAotLSAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgYXAtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gW10gICAgICAgIFtdICAgICAgfAotLSAgICAgYmFzaCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgYmZkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgYmlic2hlbGYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgYmludXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgYmlzb24gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgYmlzb24tcnVudGltZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgYmx1ZXotcGluICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgW10gfAotLSAgICAgY2Zsb3cgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotLSAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gICAgICAgICAgfAotLSAgICAgY29uc29sZS10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgY29yZXV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgY3BwbGliICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgY3J5cHRvbml0ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZGlhbG9nICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gW10gW10gICAgICAgICAgW10gfAotLSAgICAgZG9vZGxlICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgIFtdICAgICAgfAotLSAgICAgZmV0Y2htYWlsICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gKCkgW10gICAgIFtdICAgICAgfAotLSAgICAgZmluZHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZmluZHV0aWxzX3N0YWJsZSAgIHwgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotLSAgICAgZmxleCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ2F3ayAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ2V0dGV4dC1leGFtcGxlcyAgIHwgW10gICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gW10gICAgICAgICAgW10gfAotLSAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgW10gfAotLSAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ2lwICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ211bHQgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgfAotLSAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgKCkgKCkgICAgIFtdICAgICAgfAotLSAgICAgZ251ZWR1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ251bGliICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ251bmV0ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ251bmV0LWd0ayAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ251dGxzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWJlYW0gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWNvbmYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWZpbGVtYW5hZ2VyICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLXBhY2thZ2UgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLXN1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLXRvZGF5ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgIFtdICAgICAgfAotLSAgICAgZ3Byb2YgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3JhbWFkb2lyICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3JlcCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgfAotLSAgICAgZ3Nhc2wgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3NzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3N0LXBsdWdpbnMtYmFkICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3N0LXBsdWdpbnMtYmFzZSAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3N0LXBsdWdpbnMtZ29vZCAgIHwgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3N0LXBsdWdpbnMtdWdseSAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3N0cmVhbWVyICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgW10gW10gICAgW10gW10gICAgICAgIFtdICAgICAgfAotLSAgICAgZ3RpY2sgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgfAotLSAgICAgZ3RrYW0gICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3Rrb3JwaGFuICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgZ3Rrc3BlbGwgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgW10gfAotLSAgICAgZ3V0ZW5wcmludCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotLSAgICAgaGVsbG8gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgW10gfAotLSAgICAgaGVycmllICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgaHlsYWZheCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgaWR1dGlscyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgaW5kZW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgW10gICAgICAgICAgICAgW10gfAotLSAgICAgaXNvXzE1OTI0ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgaXNvXzMxNjYgICAgICAgICAgIHwgICAgICAgW10gICAgW10gW10gW10gW10gW10gW10gW10gW10gW10gICAgICAgICAgW10gfAotLSAgICAgaXNvXzMxNjZfMiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgaXNvXzYzOSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgW10gfAotLSAgICAganBpbG90ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgandob2lzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAga2JkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gW10gICAgICAgICAgICAgfAotLSAgICAga2V5dG91Y2ggICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAga2V5dG91Y2gtZWRpdG9yICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAga2V5dG91Y2gta2V5Ym9hLi4uIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgfAotLSAgICAgbGQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGVhZnBhZCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgfAotLSAgICAgbGliYyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgbGliZXhpZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgbGliZXh0cmFjdG9yICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgbGliZ3BnLWVycm9yICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgbGliZ3Bob3RvMiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgbGliZ3Bob3RvMl9wb3J0ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgbGliZ3Nhc2wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGliaWNvbnYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gfAotLSAgICAgbGliaWRuICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgW10gfAotLSAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gKCkgICAgICAgICAgICAgICAgfAotLSAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbHBybmcgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbHlueCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgbTQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gW10gICAgICAgICAgICAgfAotLSAgICAgbWFpbGZyb21kICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbWFpbHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgbWluaWNvbSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgcGFydGVkICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgcGlsb3QtcW9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcG9wdCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgcHNtaXNjICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcHdkdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcW9mICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcmFkaXVzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgW10gW10gW10gICAgICAgICAgW10gfAotLSAgICAgcnBtICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotLSAgICAgc2NyZWVtICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgICAgICAgICAgW10gW10gICAgICAgW10gW10gW10gW10gW10gICAgICAgIFtdICAgICAgfAotLSAgICAgc2VkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgW10gfAotLSAgICAgc2hhcmVkLW1pbWUtaW5mbyAgIHwgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgW10gKCkgW10gICAgIFtdICAgW10gfAotLSAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgW10gW10gW10gICAgICAgICAgICAgfAotLSAgICAgc2hpc2hpICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc2tlbmNpbCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gKCkgICAgICAgICAgICAgICAgfAotLSAgICAgc29sZmVnZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc291bmR0cmFja2VyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgc3AgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgc3lzdGVtLXRvb2xzLWJhLi4uIHwgICAgICAgW10gICAgICAgW10gW10gW10gW10gICAgW10gW10gW10gICAgIFtdICAgICAgfAotLSAgICAgdGFyICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgdGV4aW5mbyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgW10gfAotLSAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICgpICAgICAgfAotLSAgICAgdHV4cGFpbnQgICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgICAgIFtdICAgW10gfAotLSAgICAgdW5pY29kZS1oYW4tdHJhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgdXRpbC1saW51eCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgdXRpbC1saW51eC1uZyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotLSAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgfAotLSAgICAgd2RpZmYgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgIFtdICAgICAgfAotLSAgICAgd2dldCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotLSAgICAgeGNoYXQgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgW10gW10gICAgICAgW10gW10gICAgIFtdICAgICAgfAotLSAgICAgeGtleWJvYXJkLWNvbmZpZyAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgfAotLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWYgYW0gYXIgYXogYmUgYmcgYnMgY2EgY3MgY3kgZGEgZGUgZWwgZW4gZW5fR0IgZW8KLS0gICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAwICAyICAxICA4IDI2ICAyIDQwIDQ4ICAyIDU2IDg4IDE1ICAxICAxNSAgIDE4Ci0tCi0tICAgICAgICAgICAgICAgICAgICAgICAgICBlcyBldCBldSBmYSBmaSBmciAgZ2EgZ2wgZ3UgaGUgaGkgaHIgaHUgaWQgaXMgaXQKLS0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0tICAgICBDb21wZW5kaXVtICAgICAgICAgfCBbXSAgICAgICAgICBbXSBbXSAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotLSAgICAgYTJwcyAgICAgICAgICAgICAgIHwgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIHwKLS0gICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBhbnQtcGhvbmUgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBhc3BlbGwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgYmFzaCAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGJmZCAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBiaWJzaGVsZiAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgYmludXRpbHMgICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGJpc29uICAgICAgICAgICAgICB8IFtdIFtdICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICBbXSB8Ci0tICAgICBiaXNvbi1ydW50aW1lICAgICAgfCAgICBbXSAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgW10gICAgW10gfAotLSAgICAgYmx1ZXotcGluICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gIFtdICAgICAgICAgICAgICAgIFtdIFtdICAgICAgIHwKLS0gICAgIGNmbG93ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBjbGlzcCAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgY29uc29sZS10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGNvcmV1dGlscyAgICAgICAgICB8IFtdIFtdICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICBjcGlvICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgY3BwbGliICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGNyeXB0b25pdCAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBkaWFsb2cgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gIFtdIFtdICAgIFtdICAgICAgIFtdIFtdICAgIFtdIHwKLS0gICAgIGRvb2RsZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0tICAgICBlMmZzcHJvZ3MgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgIHwKLS0gICAgIGZldGNobWFpbCAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBmaW5kdXRpbHMgICAgICAgICAgfCAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotLSAgICAgZmluZHV0aWxzX3N0YWJsZSAgIHwgICAgW10gICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIGZsZXggICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBmc2xpbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ2FzICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdhd2sgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAoKSB8Ci0tICAgICBnY2FsICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ2NjICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdldHRleHQtZXhhbXBsZXMgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0tICAgICBnZXR0ZXh0LXJ1bnRpbWUgICAgfCBbXSAgICAgICAgICBbXSBbXSAgW10gICAgICAgICAgICAgICAgICAgW10gICAgW10gfAotLSAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGdpcCAgICAgICAgICAgICAgICB8IFtdICAgIFtdICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnbGl2ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIGdtdWx0ICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0tICAgICBnbnViaWZmICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgfAotLSAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgKCkgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgIHwKLS0gICAgIGdudWVkdSAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnbnVsaWIgICAgICAgICAgICAgfCBbXSBbXSAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ251bmV0ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdudW5ldC1ndGsgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnbnV0bHMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1iZWFtICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBncGUtY2FsZW5kYXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBncGUtY29udGFjdHMgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgIHwKLS0gICAgIGdwZS1maWxlbWFuYWdlciAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBncGUtZ28gICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotLSAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIGdwZS1vd25lcmluZm8gICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICB8Ci0tICAgICBncGUtcGFja2FnZSAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1zdSAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICBncGUtdGFza21hbmFnZXIgICAgfCBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgW10gICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgIHwKLS0gICAgIGdwZS10b2RheSAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBncGUtdG9kbyAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKLS0gICAgIGdwcm9mICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0tICAgICBncHNkcml2ZSAgICAgICAgICAgfCAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3JhbWFkb2lyICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdyZXAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBncmV0bCAgICAgICAgICAgICAgfCBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgfAotLSAgICAgZ3Nhc2wgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgIHwKLS0gICAgIGdzcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnc3QtcGx1Z2lucy1iYWQgICAgfCBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gfAotLSAgICAgZ3N0LXBsdWdpbnMtYmFzZSAgIHwgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKLS0gICAgIGdzdC1wbHVnaW5zLWdvb2QgICB8IFtdICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0tICAgICBnc3QtcGx1Z2lucy11Z2x5ICAgfCBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gfAotLSAgICAgZ3N0cmVhbWVyICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKLS0gICAgIGd0aWNrICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0tICAgICBndGthbSAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gfAotLSAgICAgZ3Rrb3JwaGFuICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGd0a3NwZWxsICAgICAgICAgICB8IFtdICAgIFtdICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0tICAgICBndXRlbnByaW50ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotLSAgICAgaGVsbG8gICAgICAgICAgICAgIHwgW10gW10gW10gW10gW10gW10gIFtdIFtdICAgIFtdICAgIFtdIFtdIFtdICAgIFtdIHwKLS0gICAgIGhlcnJpZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBoeWxhZmF4ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgaWR1dGlscyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdIHwKLS0gICAgIGluZGVudCAgICAgICAgICAgICB8IFtdIFtdIFtdICAgIFtdIFtdICBbXSBbXSAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0tICAgICBpc29fMTU5MjQgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgaXNvXzMxNjYgICAgICAgICAgIHwgW10gW10gW10gICAgW10gW10gICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdICAgIFtdIHwKLS0gICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBpc29fNDIxNyAgICAgICAgICAgfCBbXSBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gfAotLSAgICAgaXNvXzYzOSAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIGpwaWxvdCAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBqdGFnICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgandob2lzICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdIHwKLS0gICAgIGtiZCAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBrZXl0b3VjaCAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAga2V5dG91Y2gtZWRpdG9yICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGtleXRvdWNoLWtleWJvYS4uLiB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0tICAgICBsYXRyaW5lICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgbGQgICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxlYWZwYWQgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICBbXSAgICAgICBbXSAgICAgICBbXSAgICAgICBbXSB8Ci0tICAgICBsaWJjICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgfAotLSAgICAgbGliZXhpZiAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmV4dHJhY3RvciAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJncGV3aWRnZXQgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgW10gW10gICAgICAgfAotLSAgICAgbGliZ3BnLWVycm9yICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmdwaG90bzIgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0tICAgICBsaWJncGhvdG8yX3BvcnQgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgbGliZ3Nhc2wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmljb252ICAgICAgICAgICB8ICAgIFtdICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJpZG4gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpbHlwb25kICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaW5nb3RlYWNoICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gfAotLSAgICAgbHBybmcgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGx5bnggICAgICAgICAgICAgICB8ICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0tICAgICBtNCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgW10gW10gICAgICAgICAgICAgICAgW10gICAgICAgfAotLSAgICAgbWFpbGZyb21kICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIG1haWx1dGlscyAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBtYWtlICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSBbXSAgW10gW10gICAgW10gICAgW10gICAgW10gICAgICAgfAotLSAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIG1pbmljb20gICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICBuYW5vICAgICAgICAgICAgICAgfCBbXSAgICBbXSAgICAgICBbXSAgW10gW10gICAgICAgICAgICAgW10gICAgICAgW10gfAotLSAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSB8Ci0tICAgICBwaWxvdC1xb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcG9wdCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gIFtdIFtdICAgICAgICAgICAgICAgICAgIFtdICAgIHwKLS0gICAgIHBzbWlzYyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0tICAgICBwd2R1dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcW9mICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIHwKLS0gICAgIHJhZGl1cyAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICByZWNvZGUgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgW10gW10gICAgW10gICAgICAgW10gW10gICAgW10gfAotLSAgICAgcnBtICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIHwKLS0gICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBzY3JvbGxrZWVwZXIgICAgICAgfCBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotLSAgICAgc2VkICAgICAgICAgICAgICAgIHwgW10gW10gICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIHNoYXJlZC1taW1lLWluZm8gICB8IFtdICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0tICAgICBzaGFydXRpbHMgICAgICAgICAgfCBbXSBbXSAgICAgICBbXSBbXSAgW10gW10gICAgICAgICAgICAgW10gICAgICAgW10gfAotLSAgICAgc2hpc2hpICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHNrZW5jaWwgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBzb2xmZWdlICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgc291bmR0cmFja2VyICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBzeXN0ZW0tdG9vbHMtYmEuLi4gfCBbXSAgICBbXSAgICBbXSBbXSAgW10gICAgICAgICAgICAgW10gW10gW10gICAgW10gfAotLSAgICAgdGFyICAgICAgICAgICAgICAgIHwgICAgW10gW10gICAgW10gICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICB0aW4gICAgICAgICAgICAgICAgfCAgICBbXSAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgdHV4cGFpbnQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIHVuaWNvZGUtaGFuLXRyYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICB1bmljb2RlLXRyYW5zbGEuLi4gfCAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgdXRpbC1saW51eCAgICAgICAgIHwgW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdIHwKLS0gICAgIHV0aWwtbGludXgtbmcgICAgICB8IFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0tICAgICB2b3JiaXMtdG9vbHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHdkaWZmICAgICAgICAgICAgICB8IFtdIFtdICAgICAgICAgIFtdICBbXSBbXSAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0tICAgICB3Z2V0ICAgICAgICAgICAgICAgfCAgICBbXSAgICAgICBbXSBbXSAgW10gICAgICAgICAgICAgW10gW10gW10gICAgW10gfAotLSAgICAgeGNoYXQgICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gICAgICAgIFtdICAgIFtdICAgIFtdICAgICAgIFtdIHwKLS0gICAgIHhrZXlib2FyZC1jb25maWcgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICB4cGFkICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIGVzIGV0IGV1IGZhIGZpIGZyICBnYSBnbCBndSBoZSBoaSBociBodSBpZCBpcyBpdAotLSAgICAgICAgICAgICAgICAgICAgICAgICAgODUgMjIgMTQgIDIgNDggMTAxIDYxIDEyICAyICA4ICAyICA2IDUzIDI5ICAxIDUyCi0tCi0tICAgICAgICAgICAgICAgICAgICAgICAgICBqYSBrYSBrbyBrdSBreSBsZyBsdCBsdiBtayBtbiBtcyBtdCBuYiBuZSBubCAgbm4KLS0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0tICAgICBDb21wZW5kaXVtICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgYTJwcyAgICAgICAgICAgICAgIHwgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICB8Ci0tICAgICBhbnQtcGhvbmUgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgW10gICAgIHwKLS0gICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICB8Ci0tICAgICBhc3BlbGwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgYmFzaCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBiaWJzaGVsZiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgfAotLSAgICAgYmludXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGJpc29uICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgIFtdICAgICB8Ci0tICAgICBiaXNvbi1ydW50aW1lICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgfAotLSAgICAgYmx1ZXotcGluICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgIGNmbG93ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgY29uc29sZS10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGNvcmV1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBjcGlvICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgY3BwbGliICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGNyeXB0b25pdCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBkaWFsb2cgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgfAotLSAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgIGRvb2RsZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBlMmZzcHJvZ3MgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGZldGNobWFpbCAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBmaW5kdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZmluZHV0aWxzX3N0YWJsZSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGZsZXggICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBmc2xpbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdhd2sgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnY2FsICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdldHRleHQtZXhhbXBsZXMgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnZXR0ZXh0LXJ1bnRpbWUgICAgfCBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdpcCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnbGl2ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgIGdtdWx0ICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnbnViaWZmICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgKCkgICAgICAgIHwKLS0gICAgIGdudWVkdSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnbnVsaWIgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ251bmV0ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdudW5ldC1ndGsgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnbnV0bHMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdwZS1iZWFtICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtY2FsZW5kYXIgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdwZS1jb25mICAgICAgICAgICB8IFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtY29udGFjdHMgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdwZS1maWxlbWFuYWdlciAgICB8IFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBncGUtZ28gICAgICAgICAgICAgfCBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdwZS1vd25lcmluZm8gICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtcGFja2FnZSAgICAgICAgfCBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdwZS1zdSAgICAgICAgICAgICB8IFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtdGFza21hbmFnZXIgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdwZS10b2RheSAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtdG9kbyAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdwcm9mICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICB8Ci0tICAgICBncHNkcml2ZSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3JhbWFkb2lyICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgIHwKLS0gICAgIGdyZXAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncmV0bCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3Nhc2wgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdzcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnc3QtcGx1Z2lucy1iYWQgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3N0LXBsdWdpbnMtYmFzZSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdzdC1wbHVnaW5zLWdvb2QgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnc3QtcGx1Z2lucy11Z2x5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3N0cmVhbWVyICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGd0aWNrICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBndGthbSAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3Rrb3JwaGFuICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGd0a3NwZWxsICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBndXRlbnByaW50ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgaGVsbG8gICAgICAgICAgICAgIHwgW10gW10gW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgW10gIFtdIHwKLS0gICAgIGhlcnJpZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBoeWxhZmF4ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgaWR1dGlscyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGluZGVudCAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBpc29fMTU5MjQgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgaXNvXzMxNjYgICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgW10gIFtdIHwKLS0gICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBpc29fNDIxNyAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgaXNvXzYzOSAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gIFtdIHwKLS0gICAgIGpwaWxvdCAgICAgICAgICAgICB8ICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICB8Ci0tICAgICBqdGFnICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgandob2lzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGtiZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBrZXl0b3VjaCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAga2V5dG91Y2gtZWRpdG9yICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGtleXRvdWNoLWtleWJvYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsYXRyaW5lICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbGQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxlYWZwYWQgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJjICAgICAgICAgICAgICAgfCBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbGliZXhpZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmV4dHJhY3RvciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJncGV3aWRnZXQgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbGliZ3BnLWVycm9yICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmdwaG90bzIgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJncGhvdG8yX3BvcnQgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGliZ3Nhc2wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGxpYmljb252ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBsaWJpZG4gICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGxpbHlwb25kICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBsaW5nb3RlYWNoICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbHBybmcgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGx5bnggICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBtNCAgICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbWFpbGZyb21kICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIG1haWx1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBtYWtlICAgICAgICAgICAgICAgfCBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIG1pbmljb20gICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBuYW5vICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgfAotLSAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHBhcnRlZCAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBwaWxvdC1xb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcG9wdCAgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHBzbWlzYyAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICB8Ci0tICAgICBwd2R1dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcW9mICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICByZWNvZGUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgcnBtICAgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHNjcmVlbSAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBzY3JvbGxrZWVwZXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSAgW10gfAotLSAgICAgc2VkICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHNoYXJlZC1taW1lLWluZm8gICB8IFtdICAgIFtdICAgICAgICAgIFtdICAgICAgICAgIFtdICAgIFtdICAgIFtdICBbXSB8Ci0tICAgICBzaGFydXRpbHMgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgc2hpc2hpICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHNrZW5jaWwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBzb2xmZWdlICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgKCkgfAotLSAgICAgc291bmR0cmFja2VyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHNwICAgICAgICAgICAgICAgICB8ICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBzeXN0ZW0tdG9vbHMtYmEuLi4gfCBbXSAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgdGFyICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICB8Ci0tICAgICB0aW4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgdHV4cGFpbnQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgW10gIFtdIHwKLS0gICAgIHVuaWNvZGUtaGFuLXRyYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICB1bmljb2RlLXRyYW5zbGEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgdXRpbC1saW51eCAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHV0aWwtbGludXgtbmcgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICB2b3JiaXMtdG9vbHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHdkaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICB8Ci0tICAgICB3Z2V0ICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgeGNoYXQgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHhrZXlib2FyZC1jb25maWcgICB8ICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICB4cGFkICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgfAotLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIGphIGthIGtvIGt1IGt5IGxnIGx0IGx2IG1rIG1uIG1zIG10IG5iIG5lIG5sICBubgotLSAgICAgICAgICAgICAgICAgICAgICAgICAgNTEgIDIgMjUgIDMgIDIgIDAgIDYgIDAgIDIgIDIgMjAgIDAgMTEgIDEgMTAzICA2Ci0tCi0tICAgICAgICAgICAgICAgICAgICAgICAgICBvciBwYSBwbCBwdCBwdF9CUiBybSBybyBydSBydyBzayBzbCBzcSBzciBzdiAgdGEKLS0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0tICAgICBDb21wZW5kaXVtICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSAgICAgICBbXSAgICAgICAgICBbXSAgICAgfAotLSAgICAgYTJwcyAgICAgICAgICAgICAgIHwgICAgICAgKCkgICAgIFtdICAgICAgW10gW10gICAgICAgW10gICAgW10gW10gICAgIHwKLS0gICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICgpICgpICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBhbnQtcGhvbmUgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBhc3BlbGwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSAgICAgICAgICAgICAgICAgfAotLSAgICAgYmFzaCAgICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgIHwKLS0gICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBiaWJzaGVsZiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgYmludXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgIHwKLS0gICAgIGJpc29uICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICBbXSAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBiaXNvbi1ydW50aW1lICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSAgICAgICAgICBbXSAgICAgICBbXSAgICAgfAotLSAgICAgYmx1ZXotcGluICAgICAgICAgIHwgICAgICAgW10gICAgIFtdICAgW10gW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGNmbG93ICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgY29uc29sZS10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGNvcmV1dGlscyAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgIFtdICAgICB8Ci0tICAgICBjcGlvICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgY3BwbGliICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGNyeXB0b25pdCAgICAgICAgICB8ICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBkaWFsb2cgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgICAgICAgW10gICAgIFtdICAgICAgW10gW10gICAgICAgICAgICAgW10gW10gICAgIHwKLS0gICAgIGRvb2RsZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICB8Ci0tICAgICBlMmZzcHJvZ3MgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgICAgIFtdICAgICAgW10gW10gICAgICAgW10gICAgICAgW10gICAgIHwKLS0gICAgIGZldGNobWFpbCAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgICAgICB8Ci0tICAgICBmaW5kdXRpbHMgICAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZmluZHV0aWxzX3N0YWJsZSAgIHwgICAgICAgW10gW10gICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgW10gICAgIHwKLS0gICAgIGZsZXggICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICBbXSAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBmc2xpbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdhd2sgICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICBbXSAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnY2FsICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgIHwKLS0gICAgIGdldHRleHQtZXhhbXBsZXMgICB8ICAgICAgIFtdIFtdICAgICAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBnZXR0ZXh0LXJ1bnRpbWUgICAgfCAgICAgICBbXSBbXSAgICAgICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGdpcCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICB8Ci0tICAgICBnbGl2ICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICBbXSAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgICAgICAgICAgIFtdICAgICAgW10gW10gICAgW10gICAgICAgW10gW10gICAgIHwKLS0gICAgIGdtdWx0ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIFtdICAgICB8Ci0tICAgICBnbnViaWZmICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdudWVkdSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnbnVsaWIgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgfAotLSAgICAgZ251bmV0ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdudW5ldC1ndGsgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnbnV0bHMgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgW10gIFtdICAgICAgW10gW10gICAgICAgW10gICAgW10gW10gICAgIHwKLS0gICAgIGdwZS1iZWFtICAgICAgICAgICB8ICAgICAgICAgIFtdICBbXSAgICAgIFtdIFtdICAgICAgIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBncGUtY2FsZW5kYXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgICAgICAgICAgW10gIFtdICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgIFtdICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtY29udGFjdHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgICAgICAgW10gW10gIFtdICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGdwZS1maWxlbWFuYWdlciAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtZ28gICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgICAgICAgICAgW10gIFtdICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGdwZS1vd25lcmluZm8gICAgICB8ICAgICAgICAgIFtdICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBncGUtcGFja2FnZSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgfAotLSAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgICAgICAgICAgW10gIFtdICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGdwZS1zdSAgICAgICAgICAgICB8ICAgICAgICAgIFtdICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBncGUtdGFza21hbmFnZXIgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgICAgICAgICAgW10gIFtdICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGdwZS10b2RheSAgICAgICAgICB8ICAgICAgICAgIFtdICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBncGUtdG9kbyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgW10gW10gICAgIHwKLS0gICAgIGdwcm9mICAgICAgICAgICAgICB8ICAgICAgICAgICAgICBbXSAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncHNkcml2ZSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3JhbWFkb2lyICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgIGdyZXAgICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgIFtdICAgICB8Ci0tICAgICBncmV0bCAgICAgICAgICAgICAgfCAgICAgICBbXSBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3Nhc2wgICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgIHwKLS0gICAgIGdzcyAgICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnc3QtcGx1Z2lucy1iYWQgICAgfCAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3N0LXBsdWdpbnMtYmFzZSAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdzdC1wbHVnaW5zLWdvb2QgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnc3QtcGx1Z2lucy11Z2x5ICAgfCAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3N0cmVhbWVyICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gICAgIHwKLS0gICAgIGd0aWNrICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBndGthbSAgICAgICAgICAgICAgfCAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3Rrb3JwaGFuICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGd0a3NwZWxsICAgICAgICAgICB8ICAgICAgICAgICAgICBbXSAgIFtdIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBndXRlbnByaW50ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgaGVsbG8gICAgICAgICAgICAgIHwgICAgICAgW10gICAgIFtdICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGhlcnJpZSAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBoeWxhZmF4ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgaWR1dGlscyAgICAgICAgICAgIHwgICAgICAgW10gICAgIFtdICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGluZGVudCAgICAgICAgICAgICB8ICAgICAgIFtdICAgICBbXSAgICAgIFtdIFtdICAgIFtdICAgICAgIFtdIFtdICAgICB8Ci0tICAgICBpc29fMTU5MjQgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgaXNvXzMxNjYgICAgICAgICAgIHwgICAgW10gW10gW10gIFtdICAgICAgW10gW10gW10gW10gW10gW10gW10gW10gIFtdIHwKLS0gICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBpc29fNDIxNyAgICAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSBbXSAgICBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgaXNvXzYzOSAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgW10gW10gW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGpwaWxvdCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBqdGFnICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgfAotLSAgICAgandob2lzICAgICAgICAgICAgIHwgICAgICAgW10gICAgIFtdICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGtiZCAgICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBrZXl0b3VjaCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAga2V5dG91Y2gtZWRpdG9yICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGtleXRvdWNoLWtleWJvYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBsYXRyaW5lICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGxlYWZwYWQgICAgICAgICAgICB8ICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgIFtdICBbXSB8Ci0tICAgICBsaWJjICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICBbXSAgICAgfAotLSAgICAgbGliZXhpZiAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmV4dHJhY3RvciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBsaWJncGV3aWRnZXQgICAgICAgfCAgICAgICBbXSBbXSAgW10gICAgICBbXSAgICAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgbGliZ3BnLWVycm9yICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGxpYmdwaG90bzIgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJncGhvdG8yX3BvcnQgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbGliZ3Nhc2wgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gW10gICAgIHwKLS0gICAgIGxpYmljb252ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBsaWJpZG4gICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAoKSAgICAgfAotLSAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGxpbHlwb25kICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaW5nb3RlYWNoICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbHBybmcgICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGx5bnggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBtNCAgICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbWFpbGZyb21kICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIG1haWx1dGlscyAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBtYWtlICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIG1pbmljb20gICAgICAgICAgICB8ICAgICAgIFtdICAgICBbXSAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBuYW5vICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBwaWxvdC1xb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcG9wdCAgICAgICAgICAgICAgIHwgICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHBzbWlzYyAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBwd2R1dGlscyAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgcW9mICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICByZWNvZGUgICAgICAgICAgICAgfCAgICAgICBbXSBbXSAgW10gICAgICBbXSBbXSAgICAgICBbXSAgICAgICBbXSAgICAgfAotLSAgICAgcnBtICAgICAgICAgICAgICAgIHwgICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBzY3JvbGxrZWVwZXIgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICBbXSAgICBbXSBbXSBbXSAgICAgfAotLSAgICAgc2VkICAgICAgICAgICAgICAgIHwgICAgICAgW10gW10gIFtdICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIHNoYXJlZC1taW1lLWluZm8gICB8ICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdICAgICB8Ci0tICAgICBzaGFydXRpbHMgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICAgfAotLSAgICAgc2hpc2hpICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHNrZW5jaWwgICAgICAgICAgICB8ICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBzb2xmZWdlICAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc291bmR0cmFja2VyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBzeXN0ZW0tdG9vbHMtYmEuLi4gfCAgICBbXSBbXSBbXSAgW10gICAgICBbXSAgICAgICAgICAgICBbXSBbXSBbXSAgW10gfAotLSAgICAgdGFyICAgICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgW10gICAgIHwKLS0gICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICB0aW4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgdHV4cGFpbnQgICAgICAgICAgIHwgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gW10gICAgIHwKLS0gICAgIHVuaWNvZGUtaGFuLXRyYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICB1bmljb2RlLXRyYW5zbGEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgdXRpbC1saW51eCAgICAgICAgIHwgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgW10gICAgICAgW10gICAgIHwKLS0gICAgIHV0aWwtbGludXgtbmcgICAgICB8ICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgIFtdICAgICAgIFtdICAgICB8Ci0tICAgICB2b3JiaXMtdG9vbHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHdkaWZmICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgIFtdICAgICB8Ci0tICAgICB3Z2V0ICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICBbXSAgICAgfAotLSAgICAgeGNoYXQgICAgICAgICAgICAgIHwgICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gW10gW10gW10gICAgIHwKLS0gICAgIHhrZXlib2FyZC1jb25maWcgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgIFtdICAgICB8Ci0tICAgICB4cGFkICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICBbXSAgICAgfAotLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHBhIHBsIHB0IHB0X0JSIHJtIHJvIHJ1IHJ3IHNrIHNsIHNxIHNyIHN2ICB0YQotLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDUgNzcgMzEgIDUzICAgIDQgNTggNzIgIDMgNDUgNDYgIDkgNDUgMTIyICAzCi0tCi0tICAgICAgICAgICAgICAgICAgICAgICAgICB0ZyB0aCB0ayB0ciB1ayB2ZW4gdmkgIHdhIHhoIHpoX0NOIHpoX0hLIHpoX1RXIHp1Ci0tICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS0gICAgIENvbXBlbmRpdW0gICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxOQotLSAgICAgYTJwcyAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE5Ci0tICAgICBhZWdpcyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEKLS0gICAgIGFudC1waG9uZSAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgotLSAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDExCi0tICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAoKSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKLS0gICAgIGFzcGVsbCAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgotLSAgICAgYmFzaCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2Ci0tICAgICBiZmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLS0gICAgIGJpYnNoZWxmICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNwotLSAgICAgYmludXRpbHMgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8ICA5Ci0tICAgICBiaXNvbiAgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMjAKLS0gICAgIGJpc29uLXJ1bnRpbWUgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxOAotLSAgICAgYmx1ZXotcGluICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICBbXSAgICAgW10gICAgICAgICAgW10gICAgICB8IDI4Ci0tICAgICBjZmxvdyAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLS0gICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQotLSAgICAgY29uc29sZS10b29scyAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1Ci0tICAgICBjb3JldXRpbHMgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTgKLS0gICAgIGNwaW8gICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgfCAxMQotLSAgICAgY3BwbGliICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDEyCi0tICAgICBjcnlwdG9uaXQgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLS0gICAgIGRpYWxvZyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgfCAgOQotLSAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDI5Ci0tICAgICBkb29kbGUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLS0gICAgIGUyZnNwcm9ncyAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMAotLSAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2Ci0tICAgICBmZXRjaG1haWwgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKLS0gICAgIGZpbmR1dGlscyAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQotLSAgICAgZmluZHV0aWxzX3N0YWJsZSAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDE4Ci0tICAgICBmbGV4ICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTUKLS0gICAgIGZzbGludCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgotLSAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCi0tICAgICBnYXdrICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTYKLS0gICAgIGdjYWwgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQotLSAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8ICA3Ci0tICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgIHwgMjkKLS0gICAgIGdldHRleHQtcnVudGltZSAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgIFtdICAgIFtdICAgIFtdICAgICAgfCAyOAotLSAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDIwCi0tICAgICBnaXAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTMKLS0gICAgIGdsaXYgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQotLSAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgW10gICAgICB8IDE1Ci0tICAgICBnbXVsdCAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMTYKLS0gICAgIGdudWJpZmYgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgotLSAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgICAgICAgICAgKCkgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1Ci0tICAgICBnbnVlZHUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLS0gICAgIGdudWxpYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMAotLSAgICAgZ251bmV0ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAwCi0tICAgICBnbnVuZXQtZ3RrICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLS0gICAgIGdudXRscyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAotLSAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDE0Ci0tICAgICBncGUtYmVhbSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTQKLS0gICAgIGdwZS1jYWxlbmRhciAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfCAgNwotLSAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICBbXSAgICAgW10gICAgICAgICAgICAgICAgICB8IDIxCi0tICAgICBncGUtY29uZiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTYKLS0gICAgIGdwZS1jb250YWN0cyAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgfCAxMAotLSAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICBbXSAgICAgW10gICAgICAgICAgW10gICAgICB8IDIyCi0tICAgICBncGUtZmlsZW1hbmFnZXIgICAgfCAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLS0gICAgIGdwZS1nbyAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgfCAxOQotLSAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICBbXSAgICAgW10gICAgICAgICAgW10gICAgICB8IDIxCi0tICAgICBncGUtb3duZXJpbmZvICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMjEKLS0gICAgIGdwZS1wYWNrYWdlICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgotLSAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2Ci0tICAgICBncGUtc3UgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gIFtdICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMjEKLS0gICAgIGdwZS10YXNrbWFuYWdlciAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgfCAyMQotLSAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDE4Ci0tICAgICBncGUtdG9kYXkgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gIFtdICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMjEKLS0gICAgIGdwZS10b2RvICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfCAgOAotLSAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDIxCi0tICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTMKLS0gICAgIGdwc2RyaXZlICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQotLSAgICAgZ3JhbWFkb2lyICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3Ci0tICAgICBncmVwICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKLS0gICAgIGdyZXRsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgotLSAgICAgZ3Nhc2wgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8ICA5Ci0tICAgICBnc3MgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLS0gICAgIGdzdC1wbHVnaW5zLWJhZCAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgfCAxMwotLSAgICAgZ3N0LXBsdWdpbnMtYmFzZSAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDExCi0tICAgICBnc3QtcGx1Z2lucy1nb29kICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgIHwgMTYKLS0gICAgIGdzdC1wbHVnaW5zLXVnbHkgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgfCAxMwotLSAgICAgZ3N0cmVhbWVyICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE4Ci0tICAgICBndGljayAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLS0gICAgIGd0a2FtICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgotLSAgICAgZ3Rrb3JwaGFuICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3Ci0tICAgICBndGtzcGVsbCAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gIFtdICAgICBbXSAgICBbXSAgICBbXSAgICAgIHwgMjcKLS0gICAgIGd1dGVucHJpbnQgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAotLSAgICAgaGVsbG8gICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDM4Ci0tICAgICBoZXJyaWUgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDgKLS0gICAgIGh5bGFmYXggICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAotLSAgICAgaWR1dGlscyAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE1Ci0tICAgICBpbmRlbnQgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMjgKLS0gICAgIGlzb18xNTkyNCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgfCAgNAotLSAgICAgaXNvXzMxNjYgICAgICAgICAgIHwgICAgW10gW10gW10gW10gICAgIFtdICBbXSAgICAgW10gICAgW10gICAgW10gICAgICB8IDU0Ci0tICAgICBpc29fMzE2Nl8yICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgIDQKLS0gICAgIGlzb180MjE3ICAgICAgICAgICB8ICAgIFtdICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgfCAyNAotLSAgICAgaXNvXzYzOSAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICBbXSAgICAgW10gICAgW10gICAgICAgICAgICB8IDI2Ci0tICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgIDcKLS0gICAgIGp0YWcgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMwotLSAgICAgandob2lzICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDEzCi0tICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTMKLS0gICAgIGtleXRvdWNoICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOAotLSAgICAga2V5dG91Y2gtZWRpdG9yICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1Ci0tICAgICBrZXl0b3VjaC1rZXlib2EuLi4gfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLS0gICAgIGxhdHJpbmUgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQotLSAgICAgbGQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDEwCi0tICAgICBsZWFmcGFkICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMjQKLS0gICAgIGxpYmMgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxOQotLSAgICAgbGliZXhpZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1Ci0tICAgICBsaWJleHRyYWN0b3IgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLS0gICAgIGxpYmdwZXdpZGdldCAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgfCAyMAotLSAgICAgbGliZ3BnLWVycm9yICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2Ci0tICAgICBsaWJncGhvdG8yICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDkKLS0gICAgIGxpYmdwaG90bzJfcG9ydCAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxMQotLSAgICAgbGliZ3Nhc2wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA4Ci0tICAgICBsaWJpY29udiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTEKLS0gICAgIGxpYmlkbiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgfCAxMQotLSAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0Ci0tICAgICBsaWx5cG9uZCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLS0gICAgIGxpbmdvdGVhY2ggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgotLSAgICAgbHBybmcgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCi0tICAgICBseW54ICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTUKLS0gICAgIG00ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxOAotLSAgICAgbWFpbGZyb21kICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCi0tICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDgKLS0gICAgIG1ha2UgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgfCAyMAotLSAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5Ci0tICAgICBtaW5pY29tICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQKLS0gICAgIG5hbm8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyMAotLSAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEwCi0tICAgICBwYXJ0ZWQgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTEKLS0gICAgIHBpbG90LXFvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMQotLSAgICAgcG9wdCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDE4Ci0tICAgICBwc21pc2MgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTAKLS0gICAgIHB3ZHV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMwotLSAgICAgcW9mICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0Ci0tICAgICByYWRpdXMgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLS0gICAgIHJlY29kZSAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgfCAyNQotLSAgICAgcnBtICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDEzCi0tICAgICBzY3JlZW0gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLS0gICAgIHNjcm9sbGtlZXBlciAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAyNgotLSAgICAgc2VkICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDIzCi0tICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMjkKLS0gICAgIHNoYXJ1dGlscyAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAyMwotLSAgICAgc2hpc2hpICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCi0tICAgICBza2VuY2lsICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLS0gICAgIHNvbGZlZ2UgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMwotLSAgICAgc291bmR0cmFja2VyICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5Ci0tICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLS0gICAgIHN5c3RlbS10b29scy1iYS4uLiB8ICAgIFtdICAgIFtdIFtdICAgICBbXSAgICAgW10gIFtdICAgICAgICAgIFtdICAgICAgfCAzOAotLSAgICAgdGFyICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE3Ci0tICAgICB0ZXhpbmZvICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTUKLS0gICAgIHRpbiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMQotLSAgICAgdHV4cGFpbnQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgW10gICAgICB8IDE5Ci0tICAgICB1bmljb2RlLWhhbi10cmEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKLS0gICAgIHVuaWNvZGUtdHJhbnNsYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgotLSAgICAgdXRpbC1saW51eCAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIwCi0tICAgICB1dGlsLWxpbnV4LW5nICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKLS0gICAgIHZvcmJpcy10b29scyAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAotLSAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxCi0tICAgICB3ZGlmZiAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjMKLS0gICAgIHdnZXQgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAyMAotLSAgICAgeGNoYXQgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDI5Ci0tICAgICB4a2V5Ym9hcmQtY29uZmlnICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQKLS0gICAgIHhwYWQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxNQotLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0tICAgICAgIDc2IHRlYW1zICAgICAgICAgICB0ZyB0aCB0ayB0ciB1ayB2ZW4gdmkgIHdhIHhoIHpoX0NOIHpoX0hLIHpoX1RXIHp1Ci0tICAgICAgMTYzIGRvbWFpbnMgICAgICAgICAgMCAgMyAgMSA3NCA1MSAgMCAgMTQzIDIxICAxICA1NyAgICAgNyAgICA0NSAgICAwICAyMDM2Ci0tCi0tICAgU29tZSBjb3VudGVycyBpbiB0aGUgcHJlY2VkaW5nIG1hdHJpeCBhcmUgaGlnaGVyIHRoYW4gdGhlIG51bWJlciBvZgotLXZpc2libGUgYmxvY2tzIGxldCB1cyBleHBlY3QuICBUaGlzIGlzIGJlY2F1c2UgYSBmZXcgZXh0cmEgUE8gZmlsZXMgYXJlCi0tdXNlZCBmb3IgaW1wbGVtZW50aW5nIHJlZ2lvbmFsIHZhcmlhbnRzIG9mIGxhbmd1YWdlcywgb3IgbGFuZ3VhZ2UKLS1kaWFsZWN0cy4KLS0KLS0gICBGb3IgYSBQTyBmaWxlIGluIHRoZSBtYXRyaXggYWJvdmUgdG8gYmUgZWZmZWN0aXZlLCB0aGUgcGFja2FnZSB0bwotLXdoaWNoIGl0IGFwcGxpZXMgc2hvdWxkIGFsc28gaGF2ZSBiZWVuIGludGVybmF0aW9uYWxpemVkIGFuZAotLWRpc3RyaWJ1dGVkIGFzIHN1Y2ggYnkgaXRzIG1haW50YWluZXIuICBUaGVyZSBtaWdodCBiZSBhbiBvYnNlcnZhYmxlCi0tbGFnIGJldHdlZW4gdGhlIG1lcmUgZXhpc3RlbmNlIGEgUE8gZmlsZSBhbmQgaXRzIHdpZGUgYXZhaWxhYmlsaXR5IGluIGEKLS1kaXN0cmlidXRpb24uCi0tCi0tICAgSWYgTm92ZW1iZXIgMjAwNyBzZWVtcyB0byBiZSBvbGQsIHlvdSBtYXkgZmV0Y2ggYSBtb3JlIHJlY2VudCBjb3B5Ci0tb2YgdGhpcyBgQUJPVVQtTkxTJyBmaWxlIG9uIG1vc3QgR05VIGFyY2hpdmUgc2l0ZXMuICBUaGUgbW9zdAotLXVwLXRvLWRhdGUgbWF0cml4IHdpdGggZnVsbCBwZXJjZW50YWdlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGF0Ci0tYGh0dHA6Ly90cmFuc2xhdGlvbnByb2plY3Qub3JnL2V4dHJhL21hdHJpeC5odG1sJy4KLS0KLS0xLjYgVXNpbmcgYGdldHRleHQnIGluIG5ldyBwYWNrYWdlcwotLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tCi0tSWYgeW91IGFyZSB3cml0aW5nIGEgZnJlZWx5IGF2YWlsYWJsZSBwcm9ncmFtIGFuZCB3YW50IHRvCi0taW50ZXJuYXRpb25hbGl6ZSBpdCB5b3UgYXJlIHdlbGNvbWUgdG8gdXNlIEdOVSBgZ2V0dGV4dCcgaW4geW91cgotLXBhY2thZ2UuICBPZiBjb3Vyc2UgeW91IGhhdmUgdG8gcmVzcGVjdCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS1MaWNlbnNlIHdoaWNoIGNvdmVycyB0aGUgdXNlIG9mIHRoZSBHTlUgYGdldHRleHQnIGxpYnJhcnkuICBUaGlzIG1lYW5zCi0taW4gcGFydGljdWxhciB0aGF0IGV2ZW4gbm9uLWZyZWUgcHJvZ3JhbXMgY2FuIHVzZSBgbGliaW50bCcgYXMgYSBzaGFyZWQKLS1saWJyYXJ5LCB3aGVyZWFzIG9ubHkgZnJlZSBzb2Z0d2FyZSBjYW4gdXNlIGBsaWJpbnRsJyBhcyBhIHN0YXRpYwotLWxpYnJhcnkgb3IgdXNlIG1vZGlmaWVkIHZlcnNpb25zIG9mIGBsaWJpbnRsJy4KLS0KLS0gICBPbmNlIHRoZSBzb3VyY2VzIGFyZSBjaGFuZ2VkIGFwcHJvcHJpYXRlbHkgYW5kIHRoZSBzZXR1cCBjYW4gaGFuZGxlCi0tdGhlIHVzZSBvZiBgZ2V0dGV4dCcgdGhlIG9ubHkgdGhpbmcgbWlzc2luZyBhcmUgdGhlIHRyYW5zbGF0aW9ucy4gIFRoZQotLUZyZWUgVHJhbnNsYXRpb24gUHJvamVjdCBpcyBhbHNvIGF2YWlsYWJsZSBmb3IgcGFja2FnZXMgd2hpY2ggYXJlIG5vdAotLWRldmVsb3BlZCBpbnNpZGUgdGhlIEdOVSBwcm9qZWN0LiAgVGhlcmVmb3JlIHRoZSBpbmZvcm1hdGlvbiBnaXZlbiBhYm92ZQotLWFwcGxpZXMgYWxzbyBmb3IgZXZlcnkgb3RoZXIgRnJlZSBTb2Z0d2FyZSBQcm9qZWN0LiAgQ29udGFjdAotLWBjb29yZGluYXRvckB0cmFuc2xhdGlvbnByb2plY3Qub3JnJyB0byBtYWtlIHRoZSBgLnBvdCcgZmlsZXMgYXZhaWxhYmxlCi0tdG8gdGhlIHRyYW5zbGF0aW9uIHRlYW1zLgotLQotKzxodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dldHRleHQvbWFudWFsL2h0bWxfbm9kZS9Vc2Vycy5odG1sPgotLS0tIGEvQ2hhbmdlTG9nCi0rKysgYi9DaGFuZ2VMb2cKLUBAIC0xLDMgKzEsMTAgQEAKLSsyMDE5LTEyLTA3ICBnZXR0ZXh0aXplICA8YnVnLWdudS1nZXR0ZXh0QGdudS5vcmc+Ci0rCi0rCSogbTQvaW50bG1hY29zeC5tNDogVXBncmFkZSB0byBnZXR0ZXh0LTAuMjAuMS4KLSsJKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IFJlbW92ZSBpbnRsLgotKwkqIGNvbmZpZ3VyZS5hYyAoQUNfQ09ORklHX0ZJTEVTKTogUmVtb3ZlIGludGwvTWFrZWZpbGUuCi0rCShBTV9HTlVfR0VUVEVYVF9WRVJTSU9OKTogQnVtcCB0byAwLjIwLgotKwotIDIwMTMtMDMtMTMgIFN0ZXZlIExhbmdhc2VrICA8c3RldmUubGFuZ2FzZWtAdWJ1bnR1LmNvbT4KLSAKLSAJKiBuaWgvd2F0Y2guYyAobmloX3dhdGNoX3dhbGtfZmlsdGVyKTogTmV3IE5paEZpbGVGaWx0ZXIgZnVuY3Rpb24KLS0tLSBhL01ha2VmaWxlLmFtCi0rKysgYi9NYWtlZmlsZS5hbQotQEAgLTEsNiArMSw2IEBACi0gIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCi0gCi0tU1VCRElSUyA9IG00IGludGwgbmloIG5paC1kYnVzIG5paC1kYnVzLXRvb2wgcG8KLStTVUJESVJTID0gbTQgbmloIG5paC1kYnVzIG5paC1kYnVzLXRvb2wgcG8KLSAKLSBFWFRSQV9ESVNUID0gSEFDS0lORwotIAotLS0tIGEvY29uZmlndXJlLmFjCi0rKysgYi9jb25maWd1cmUuYWMKLUBAIC0xNSw4ICsxNSw4IEBAIEFNX01BSU5UQUlORVJfTU9ERShbZW5hYmxlXSkKLSBMVF9QUkVSRVEoMi4yLjQpCi0gTFRfSU5JVAotIAotLUFNX0dOVV9HRVRURVhUX1ZFUlNJT04oWzAuMTddKQotLUFNX0dOVV9HRVRURVhUKCkKLStBTV9HTlVfR0VUVEVYVF9WRVJTSU9OKFswLjIwXSkKLStBTV9HTlVfR0VUVEVYVChbZXh0ZXJuYWxdKQotIAotICMgQ2hlY2tzIGZvciBwcm9ncmFtcy4KLSBBQ19QUk9HX0NDCi1AQCAtNTgsNyArNTgsNyBAQCBBU19JRihbdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSAieWVzIl0sCi0gCSAgICAgIEFDX1NVQlNUKFtOSUhfREJVU19UT09MXSwgWyJcJHt0b3BfYnVpbGRkaXJ9L25paC1kYnVzLXRvb2wvbmloLWRidXMtdG9vbCJdKV0pXSwKLSAgICAgICBbQUNfU1VCU1QoW05JSF9EQlVTX1RPT0xdLCBbIlwke3RvcF9idWlsZGRpcn0vbmloLWRidXMtdG9vbC9uaWgtZGJ1cy10b29sIl0pXSkKLSAKLS1BQ19DT05GSUdfRklMRVMoWyBNYWtlZmlsZSBtNC9NYWtlZmlsZSBpbnRsL01ha2VmaWxlCi0rQUNfQ09ORklHX0ZJTEVTKFsgTWFrZWZpbGUgbTQvTWFrZWZpbGUKLSAJCSAgbmloL01ha2VmaWxlIG5paC9saWJuaWgucGMKLSAJCSAgbmloLWRidXMvTWFrZWZpbGUgbmloLWRidXMvbGlibmloLWRidXMucGMKLSAJCSAgbmloLWRidXMtdG9vbC9NYWtlZmlsZQotLS0tIGEvaW50bC9DaGFuZ2VMb2cKLSsrKyAvZGV2L251bGwKLUBAIC0xLDQgKzAsMCBAQAotLTIwMDctMTEtMDcgIEdOVSAgPGJ1Zy1nbnUtZ2V0dGV4dEBnbnUub3JnPgotLQotLQkqIFZlcnNpb24gMC4xNyByZWxlYXNlZC4KLS0KLS0tLSBhL2ludGwvTWFrZWZpbGUuaW4KLSsrKyAvZGV2L251bGwKLUBAIC0xLDU4NyArMCwwIEBACi0tIyBNYWtlZmlsZSBmb3IgZGlyZWN0b3J5IHdpdGggbWVzc2FnZSBjYXRhbG9nIGhhbmRsaW5nIGxpYnJhcnkgb2YgR05VIGdldHRleHQKLS0jIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tIwotLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0jIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0jIGFueSBsYXRlciB2ZXJzaW9uLgotLSMKLS0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tIyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0jCi0tIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSMgVVNBLgotLQotLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLS1WRVJTSU9OID0gQFZFUlNJT05ACi0tCi0tU0hFTEwgPSAvYmluL3NoCi0tCi0tc3JjZGlyID0gQHNyY2RpckAKLS10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi0tdG9wX2J1aWxkZGlyID0gLi4KLS0KLS0jIFRoZSBWUEFUSCB2YXJpYWJsZXMgYWxsb3dzIGJ1aWxkcyB3aXRoICRidWlsZGRpciAhPSAkc3JjZGlyLCBhc3N1bWluZyBhCi0tIyAnbWFrZScgcHJvZ3JhbSB0aGF0IHN1cHBvcnRzIFZQQVRIIChzdWNoIGFzIEdOVSBtYWtlKS4gVGhpcyBsaW5lIGlzIHJlbW92ZWQKLS0jIGJ5IGF1dG9jb25mIGF1dG9tYXRpY2FsbHkgd2hlbiAiJChzcmNkaXIpIiA9ICIuIi4KLS0jIEluIHRoaXMgZGlyZWN0b3J5LCB0aGUgVlBBVEggaGFuZGxpbmcgaXMgcGFydGljdWxhcjoKLS0jIDEuIElmIElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYIGlzICdsJyAoaW5kaWNhdGluZyBhIGJ1aWxkIHdpdGggbGlidG9vbCksCi0tIyAgICB0aGUgLmMgLT4gLmxvIHJ1bGVzIGNhcmVmdWxseSB1c2UgJChzcmNkaXIpLCBzbyB0aGF0IFZQQVRIIGNhbiBiZSBvbWl0dGVkLgotLSMgMi4gSWYgUEFDS0FHRSA9IGdldHRleHQtdG9vbHMsIFZQQVRIIF9tdXN0XyBiZSBvbWl0dGVkLCBiZWNhdXNlIG90aGVyd2lzZQotLSMgICAgJ21ha2UnIGRvZXMgdGhlIHdyb25nIHRoaW5nIGlmIEdOVSBnZXR0ZXh0IHdhcyBjb25maWd1cmVkIHdpdGgKLS0jICAgICIuL2NvbmZpZ3VyZSAtLXNyY2Rpcj1gcHdkYCIsIG5hbWVseSBpdCBnZXRzIGNvbmZ1c2VkIGJ5IHRoZSAubG8gYW5kIC5sYQotLSMgICAgZmlsZXMgaXQgZmluZHMgaW4gc3JjZGlyID0gLi4vLi4vZ2V0dGV4dC1ydW50aW1lL2ludGwuCi0tVlBBVEggPSAkKHNyY2RpcikKLS0KLS1wcmVmaXggPSBAcHJlZml4QAotLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotLWxpYmRpciA9IEBsaWJkaXJACi0taW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotLWRhdGFkaXIgPSBAZGF0YWRpckAKLS1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotLWdldHRleHRzcmNkaXIgPSAkKGRhdGFkaXIpL2dldHRleHQvaW50bAotLWFsaWFzcGF0aCA9ICQobG9jYWxlZGlyKQotLXN1YmRpciA9IGludGwKLS0KLS1JTlNUQUxMID0gQElOU1RBTExACi0tSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLS0KLS0jIFdlIHVzZSAkKG1rZGlyX3ApLgotLSMgSW4gYXV0b21ha2UgPD0gMS45LngsICQobWtkaXJfcCkgaXMgZGVmaW5lZCBlaXRoZXIgYXMgIm1rZGlyIC1wIC0tIiBvciBhcwotLSMgIiQobWtpbnN0YWxsZGlycykiIG9yIGFzICIkKGluc3RhbGxfc2gpIC1kIi4gRm9yIHRoZXNlIGF1dG9tYWtlIHZlcnNpb25zLAotLSMgQGluc3RhbGxfc2hAIGRvZXMgbm90IHN0YXJ0IHdpdGggJChTSEVMTCksIHNvIHdlIGFkZCBpdC4KLS0jIEluIGF1dG9tYWtlID49IDEuMTAsIEBta2Rpcl9wQCBpcyBkZXJpdmVkIGZyb20gJHtNS0RJUl9QfSwgd2hpY2ggaXMgZGVmaW5lZAotLSMgZWl0aGVyIGFzICIvcGF0aC90by9ta2RpciAtcCIgb3IgIi4uLi9pbnN0YWxsLXNoIC1jIC1kIi4gRm9yIHRoZXNlIGF1dG9tYWtlCi0tIyB2ZXJzaW9ucywgJChta2luc3RhbGxkaXJzKSBhbmQgJChpbnN0YWxsX3NoKSBhcmUgdW51c2VkLgotLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSBAaW5zdGFsbF9zaEAgLWQKLS1pbnN0YWxsX3NoID0gJChTSEVMTCkgQGluc3RhbGxfc2hACi0tTUtESVJfUCA9IEBNS0RJUl9QQAotLW1rZGlyX3AgPSBAbWtkaXJfcEAKLS0KLS1sID0gQElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYQAotLQotLUFSID0gYXIKLS1DQyA9IEBDQ0AKLS1MSUJUT09MID0gQExJQlRPT0xACi0tUkFOTElCID0gQFJBTkxJQkAKLS1ZQUNDID0gQElOVExCSVNPTkAgLXkgLWQKLS1ZRkxBR1MgPSAtLW5hbWUtcHJlZml4PV9fZ2V0dGV4dAotLVdJTkRSRVMgPSBAV0lORFJFU0AKLS0KLS0jIC1EQlVJTERJTkdfTElCSU5UTDogQ2hhbmdlIGV4cGFuc2lvbiBvZiBMSUJJTlRMX0RMTF9FWFBPUlRFRCBtYWNyby4KLS0jIC1EQlVJTERJTkdfRExMOiBDaGFuZ2UgZXhwYW5zaW9uIG9mIFJFTE9DQVRBQkxFX0RMTF9FWFBPUlRFRCBtYWNyby4KLS1ERUZTID0gLURMT0NBTEVESVI9XCIkKGxvY2FsZWRpcilcIiAtRExPQ0FMRV9BTElBU19QQVRIPVwiJChhbGlhc3BhdGgpXCIgXAotLS1ETElCRElSPVwiJChsaWJkaXIpXCIgLURCVUlMRElOR19MSUJJTlRMIC1EQlVJTERJTkdfRExMIC1ESU5fTElCSU5UTCBcCi0tLURFTkFCTEVfUkVMT0NBVEFCTEU9MSAtRElOX0xJQlJBUlkgLURJTlNUQUxMRElSPVwiJChsaWJkaXIpXCIgLUROT19YTUFMTE9DIFwKLS0tRHNldF9yZWxvY2F0aW9uX3ByZWZpeD1saWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCBcCi0tLURyZWxvY2F0ZT1saWJpbnRsX3JlbG9jYXRlIFwKLS0tRERFUEVORFNfT05fTElCSUNPTlY9MSBAREVGU0AKLS1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLS1DRkxBR1MgPSBAQ0ZMQUdTQCBAQ0ZMQUdfVklTSUJJTElUWUAKLS1MREZMQUdTID0gQExERkxBR1NAICQoTERGTEFHU19AV09FMzJETExAKQotLUxERkxBR1NfeWVzID0gLVdsLC0tZXhwb3J0LWFsbC1zeW1ib2xzCi0tTERGTEFHU19ubyA9Ci0tTElCUyA9IEBMSUJTQAotLQotLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0tCi0tSEVBREVSUyA9IFwKLS0gIGdtby5oIFwKLS0gIGdldHRleHRQLmggXAotLSAgaGFzaC1zdHJpbmcuaCBcCi0tICBsb2FkaW5mby5oIFwKLS0gIHBsdXJhbC1leHAuaCBcCi0tICBldmFsLXBsdXJhbC5oIFwKLS0gIGxvY2FsY2hhcnNldC5oIFwKLS0gIGxvY2suaCBcCi0tICByZWxvY2F0YWJsZS5oIFwKLS0gIHRzZWFyY2guaCB0c2VhcmNoLmMgXAotLSAgeHNpemUuaCBcCi0tICBwcmludGYtYXJncy5oIHByaW50Zi1hcmdzLmMgXAotLSAgcHJpbnRmLXBhcnNlLmggd3ByaW50Zi1wYXJzZS5oIHByaW50Zi1wYXJzZS5jIFwKLS0gIHZhc25wcmludGYuaCB2YXNud3ByaW50Zi5oIHZhc25wcmludGYuYyBcCi0tICBvczJjb21wYXQuaCBcCi0tICBsaWJnbnVpbnRsLmguaW4KLS1TT1VSQ0VTID0gXAotLSAgYmluZHRleHRkb20uYyBcCi0tICBkY2dldHRleHQuYyBcCi0tICBkZ2V0dGV4dC5jIFwKLS0gIGdldHRleHQuYyBcCi0tICBmaW5kZG9tYWluLmMgXAotLSAgaGFzaC1zdHJpbmcuYyBcCi0tICBsb2FkbXNnY2F0LmMgXAotLSAgbG9jYWxlYWxpYXMuYyBcCi0tICB0ZXh0ZG9tYWluLmMgXAotLSAgbDEwbmZsaXN0LmMgXAotLSAgZXhwbG9kZW5hbWUuYyBcCi0tICBkY2lnZXR0ZXh0LmMgXAotLSAgZGNuZ2V0dGV4dC5jIFwKLS0gIGRuZ2V0dGV4dC5jIFwKLS0gIG5nZXR0ZXh0LmMgXAotLSAgcGx1cmFsLnkgXAotLSAgcGx1cmFsLWV4cC5jIFwKLS0gIGxvY2FsY2hhcnNldC5jIFwKLS0gIGxvY2suYyBcCi0tICByZWxvY2F0YWJsZS5jIFwKLS0gIGxhbmdwcmVmcy5jIFwKLS0gIGxvY2FsZW5hbWUuYyBcCi0tICBsb2cuYyBcCi0tICBwcmludGYuYyBcCi0tICB2ZXJzaW9uLmMgXAotLSAgb3NkZXAuYyBcCi0tICBvczJjb21wYXQuYyBcCi0tICBpbnRsLWV4cG9ydHMuYyBcCi0tICBpbnRsLWNvbXBhdC5jCi0tT0JKRUNUUyA9IFwKLS0gIGJpbmR0ZXh0ZG9tLiRsbyBcCi0tICBkY2dldHRleHQuJGxvIFwKLS0gIGRnZXR0ZXh0LiRsbyBcCi0tICBnZXR0ZXh0LiRsbyBcCi0tICBmaW5kZG9tYWluLiRsbyBcCi0tICBoYXNoLXN0cmluZy4kbG8gXAotLSAgbG9hZG1zZ2NhdC4kbG8gXAotLSAgbG9jYWxlYWxpYXMuJGxvIFwKLS0gIHRleHRkb21haW4uJGxvIFwKLS0gIGwxMG5mbGlzdC4kbG8gXAotLSAgZXhwbG9kZW5hbWUuJGxvIFwKLS0gIGRjaWdldHRleHQuJGxvIFwKLS0gIGRjbmdldHRleHQuJGxvIFwKLS0gIGRuZ2V0dGV4dC4kbG8gXAotLSAgbmdldHRleHQuJGxvIFwKLS0gIHBsdXJhbC4kbG8gXAotLSAgcGx1cmFsLWV4cC4kbG8gXAotLSAgbG9jYWxjaGFyc2V0LiRsbyBcCi0tICBsb2NrLiRsbyBcCi0tICByZWxvY2F0YWJsZS4kbG8gXAotLSAgbGFuZ3ByZWZzLiRsbyBcCi0tICBsb2NhbGVuYW1lLiRsbyBcCi0tICBsb2cuJGxvIFwKLS0gIHByaW50Zi4kbG8gXAotLSAgdmVyc2lvbi4kbG8gXAotLSAgb3NkZXAuJGxvIFwKLS0gIGludGwtY29tcGF0LiRsbwotLU9CSkVDVFNfUkVTX3llcyA9IGxpYmludGwucmVzCi0tT0JKRUNUU19SRVNfbm8gPQotLURJU1RGSUxFUy5jb21tb24gPSBNYWtlZmlsZS5pbiBcCi0tY29uZmlnLmNoYXJzZXQgbG9jYWxlLmFsaWFzIHJlZi1hZGQuc2luIHJlZi1kZWwuc2luIGV4cG9ydC5oIGxpYmludGwucmMgXAotLSQoSEVBREVSUykgJChTT1VSQ0VTKQotLURJU1RGSUxFUy5nZW5lcmF0ZWQgPSBwbHVyYWwuYwotLURJU1RGSUxFUy5ub3JtYWwgPSBWRVJTSU9OCi0tRElTVEZJTEVTLmdldHRleHQgPSBDT1BZSU5HLkxJQi0yLjAgQ09QWUlORy5MSUItMi4xIGxpYmludGwuZ2xpYmMgUkVBRE1FLndvZTMyCi0tRElTVEZJTEVTLm9ic29sZXRlID0geG9wZW4tbXNnLnNlZCBsaW51eC1tc2cuc2VkIHBvMnRibC5zZWQuaW4gY2F0LWNvbXBhdC5jIFwKLS1DT1BZSU5HLkxJQi0yIGdldHRleHQuaCBsaWJnZXR0ZXh0LmggcGx1cmFsLWV2YWwuYyBsaWJnbnVpbnRsLmggXAotLWxpYmdudWludGwuaF92bXMgTWFrZWZpbGUudm1zIGxpYmdudWludGwuaC5tc3ZjLXN0YXRpYyBcCi0tbGliZ251aW50bC5oLm1zdmMtc2hhcmVkIE1ha2VmaWxlLm1zdmMKLS0KLS1hbGw6IGFsbC1AVVNFX0lOQ0xVREVEX0xJQklOVExACi0tYWxsLXllczogbGliaW50bC4kbGEgbGliaW50bC5oIGNoYXJzZXQuYWxpYXMgcmVmLWFkZC5zZWQgcmVmLWRlbC5zZWQKLS1hbGwtbm86IGFsbC1uby1AQlVJTERfSU5DTFVERURfTElCSU5UTEAKLS1hbGwtbm8teWVzOiBsaWJnbnVpbnRsLiRsYQotLWFsbC1uby1ubzoKLS0KLS1saWJpbnRsLmEgbGliZ251aW50bC5hOiAkKE9CSkVDVFMpCi0tCXJtIC1mICRACi0tCSQoQVIpIGNydSAkQCAkKE9CSkVDVFMpCi0tCSQoUkFOTElCKSAkQAotLQotLWxpYmludGwubGEgbGliZ251aW50bC5sYTogJChPQkpFQ1RTKSAkKE9CSkVDVFNfUkVTX0BXT0UzMkApCi0tCSQoTElCVE9PTCkgLS1tb2RlPWxpbmsgXAotLQkgICQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgXAotLQkgICQoT0JKRUNUUykgQExUTElCSUNPTlZAIEBJTlRMX01BQ09TWF9MSUJTQCAkKExJQlMpIEBMVExJQlRIUkVBREAgQExUTElCQ0AgXAotLQkgICQoT0JKRUNUU19SRVNfQFdPRTMyQCkgXAotLQkgIC12ZXJzaW9uLWluZm8gJChMVFZfQ1VSUkVOVCk6JChMVFZfUkVWSVNJT04pOiQoTFRWX0FHRSkgXAotLQkgIC1ycGF0aCAkKGxpYmRpcikgXAotLQkgIC1uby11bmRlZmluZWQKLS0KLS0jIExpYnRvb2wncyBsaWJyYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYmludGwuCi0tIyBCZWZvcmUgbWFraW5nIGEgZ2V0dGV4dCByZWxlYXNlLCB0aGUgZ2V0dGV4dCBtYWludGFpbmVyIG11c3QgY2hhbmdlIHRoaXMKLS0jIGFjY29yZGluZyB0byB0aGUgbGlidG9vbCBkb2N1bWVudGF0aW9uLCBzZWN0aW9uICJMaWJyYXJ5IGludGVyZmFjZSB2ZXJzaW9ucyIuCi0tIyBNYWludGFpbmVycyBvZiBvdGhlciBwYWNrYWdlcyB0aGF0IGluY2x1ZGUgdGhlIGludGwgZGlyZWN0b3J5IG11c3QgKm5vdCoKLS0jIGNoYW5nZSB0aGVzZSB2YWx1ZXMuCi0tTFRWX0NVUlJFTlQ9OAotLUxUVl9SRVZJU0lPTj0yCi0tTFRWX0FHRT0wCi0tCi0tLlNVRkZJWEVTOgotLS5TVUZGSVhFUzogLmMgLnkgLm8gLmxvIC5zaW4gLnNlZAotLQotLS5jLm86Ci0tCSQoQ09NUElMRSkgJDwKLS0KLS0ueS5jOgotLQkkKFlBQ0MpICQoWUZMQUdTKSAtLW91dHB1dCAkQCAkPAotLQlybSAtZiAkKi5oCi0tCi0tYmluZHRleHRkb20ubG86ICQoc3JjZGlyKS9iaW5kdGV4dGRvbS5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvYmluZHRleHRkb20uYwotLWRjZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjZ2V0dGV4dC5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZGNnZXR0ZXh0LmMKLS1kZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RnZXR0ZXh0LmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kZ2V0dGV4dC5jCi0tZ2V0dGV4dC5sbzogJChzcmNkaXIpL2dldHRleHQuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2dldHRleHQuYwotLWZpbmRkb21haW4ubG86ICQoc3JjZGlyKS9maW5kZG9tYWluLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9maW5kZG9tYWluLmMKLS1oYXNoLXN0cmluZy5sbzogJChzcmNkaXIpL2hhc2gtc3RyaW5nLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9oYXNoLXN0cmluZy5jCi0tbG9hZG1zZ2NhdC5sbzogJChzcmNkaXIpL2xvYWRtc2djYXQuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvYWRtc2djYXQuYwotLWxvY2FsZWFsaWFzLmxvOiAkKHNyY2RpcikvbG9jYWxlYWxpYXMuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsZWFsaWFzLmMKLS10ZXh0ZG9tYWluLmxvOiAkKHNyY2RpcikvdGV4dGRvbWFpbi5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvdGV4dGRvbWFpbi5jCi0tbDEwbmZsaXN0LmxvOiAkKHNyY2RpcikvbDEwbmZsaXN0LmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sMTBuZmxpc3QuYwotLWV4cGxvZGVuYW1lLmxvOiAkKHNyY2RpcikvZXhwbG9kZW5hbWUuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2V4cGxvZGVuYW1lLmMKLS1kY2lnZXR0ZXh0LmxvOiAkKHNyY2RpcikvZGNpZ2V0dGV4dC5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZGNpZ2V0dGV4dC5jCi0tZGNuZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjbmdldHRleHQuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RjbmdldHRleHQuYwotLWRuZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RuZ2V0dGV4dC5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZG5nZXR0ZXh0LmMKLS1uZ2V0dGV4dC5sbzogJChzcmNkaXIpL25nZXR0ZXh0LmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9uZ2V0dGV4dC5jCi0tcGx1cmFsLmxvOiAkKHNyY2RpcikvcGx1cmFsLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9wbHVyYWwuYwotLXBsdXJhbC1leHAubG86ICQoc3JjZGlyKS9wbHVyYWwtZXhwLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9wbHVyYWwtZXhwLmMKLS1sb2NhbGNoYXJzZXQubG86ICQoc3JjZGlyKS9sb2NhbGNoYXJzZXQuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsY2hhcnNldC5jCi0tbG9jay5sbzogJChzcmNkaXIpL2xvY2suYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2suYwotLXJlbG9jYXRhYmxlLmxvOiAkKHNyY2RpcikvcmVsb2NhdGFibGUuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3JlbG9jYXRhYmxlLmMKLS1sYW5ncHJlZnMubG86ICQoc3JjZGlyKS9sYW5ncHJlZnMuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xhbmdwcmVmcy5jCi0tbG9jYWxlbmFtZS5sbzogJChzcmNkaXIpL2xvY2FsZW5hbWUuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsZW5hbWUuYwotLWxvZy5sbzogJChzcmNkaXIpL2xvZy5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbG9nLmMKLS1wcmludGYubG86ICQoc3JjZGlyKS9wcmludGYuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3ByaW50Zi5jCi0tdmVyc2lvbi5sbzogJChzcmNkaXIpL3ZlcnNpb24uYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3ZlcnNpb24uYwotLW9zZGVwLmxvOiAkKHNyY2Rpcikvb3NkZXAuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL29zZGVwLmMKLS1pbnRsLWNvbXBhdC5sbzogJChzcmNkaXIpL2ludGwtY29tcGF0LmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9pbnRsLWNvbXBhdC5jCi0tCi0tIyBUaGlzIHJ1bGUgaXMgZXhlY3V0ZWQgb25seSBvbiBXb2UzMiBzeXN0ZW1zLgotLSMgVGhlIGZvbGxvd2luZyBzZWQgZXhwcmVzc2lvbnMgY29tZSBmcm9tIHRoZSB3aW5kcmVzLW9wdGlvbnMgc2NyaXB0LiBUaGV5IGFyZQotLSMgaW5saW5lZCBoZXJlLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHdyaXR0ZW4gaW4gYSBNYWtlZmlsZSB3aXRob3V0IHJlcXVpcmluZyBhCi0tIyB0ZW1wb3JhcnkgZmlsZS4gVGhleSBtdXN0IGNvbnRhaW4gbGl0ZXJhbCBuZXdsaW5lcyByYXRoZXIgdGhhbiBzZW1pY29sb25zLAotLSMgc28gdGhhdCB0aGV5IHdvcmsgd2l0aCB0aGUgc2VkLTMuMDIgdGhhdCBpcyBzaGlwcGVkIHdpdGggTVNZUy4gV2UgY2FuIHVzZQotLSMgR05VIGJhc2gncyAkJ1xuJyBzeW50YXggdG8gb2J0YWluIHN1Y2ggYSBuZXdsaW5lLgotLWxpYmludGwucmVzOiAkKHNyY2RpcikvbGliaW50bC5yYwotLQlubD0kJCdcbic7IFwKLS0Jc2VkX2V4dHJhY3RfbWFqb3I9Jy9eWzAtOV0veyckJHtubH0ncy9eXChbMC05XSpcKS4qL1wxL3AnJCR7bmx9cSQke25sfSd9JyQke25sfSdjXCckJHtubH0wJCR7bmx9cTsgXAotLQlzZWRfZXh0cmFjdF9taW5vcj0nL15bMC05XVswLTldKlsuXVswLTldL3snJCR7bmx9J3MvXlswLTldKlsuXVwoWzAtOV0qXCkuKi9cMS9wJyQke25sfXEkJHtubH0nfSckJHtubH0nY1wnJCR7bmx9MCQke25sfXE7IFwKLS0Jc2VkX2V4dHJhY3Rfc3VibWlub3I9Jy9eWzAtOV1bMC05XSpbLl1bMC05XVswLTldKlsuXVswLTldL3snJCR7bmx9J3MvXlswLTldKlsuXVswLTldKlsuXVwoWzAtOV0qXCkuKi9cMS9wJyQke25sfXEkJHtubH0nfSckJHtubH0nY1wnJCR7bmx9MCQke25sfXE7IFwKLS0JJChXSU5EUkVTKSBcCi0tCSAgIi1EUEFDS0FHRV9WRVJTSU9OX1NUUklORz1cXFwiJChWRVJTSU9OKVxcXCIiIFwKLS0JICAiLURQQUNLQUdFX1ZFUlNJT05fTUFKT1I9ImBlY2hvICckKFZFUlNJT04pJyB8IHNlZCAtbiAtZSAiJCRzZWRfZXh0cmFjdF9tYWpvciJgIFwKLS0JICAiLURQQUNLQUdFX1ZFUlNJT05fTUlOT1I9ImBlY2hvICckKFZFUlNJT04pJyB8IHNlZCAtbiAtZSAiJCRzZWRfZXh0cmFjdF9taW5vciJgIFwKLS0JICAiLURQQUNLQUdFX1ZFUlNJT05fU1VCTUlOT1I9ImBlY2hvICckKFZFUlNJT04pJyB8IHNlZCAtbiAtZSAiJCRzZWRfZXh0cmFjdF9zdWJtaW5vciJgIFwKLS0JICAtaSAkKHNyY2RpcikvbGliaW50bC5yYyAtbyBsaWJpbnRsLnJlcyAtLW91dHB1dC1mb3JtYXQ9Y29mZgotLQotLXJlZi1hZGQuc2VkOiAkKHNyY2RpcikvcmVmLWFkZC5zaW4KLS0Jc2VkIC1lICcvXiMvZCcgLWUgJ3MvQCcnUEFDS0FHRScnQC9AUEFDS0FHRUAvZycgJChzcmNkaXIpL3JlZi1hZGQuc2luID4gdC1yZWYtYWRkLnNlZAotLQltdiB0LXJlZi1hZGQuc2VkIHJlZi1hZGQuc2VkCi0tcmVmLWRlbC5zZWQ6ICQoc3JjZGlyKS9yZWYtZGVsLnNpbgotLQlzZWQgLWUgJy9eIy9kJyAtZSAncy9AJydQQUNLQUdFJydAL0BQQUNLQUdFQC9nJyAkKHNyY2RpcikvcmVmLWRlbC5zaW4gPiB0LXJlZi1kZWwuc2VkCi0tCW12IHQtcmVmLWRlbC5zZWQgcmVmLWRlbC5zZWQKLS0KLS1JTkNMVURFUyA9IC1JLiAtSSQoc3JjZGlyKSAtSS4uCi0tCi0tbGliZ251aW50bC5oOiAkKHNyY2RpcikvbGliZ251aW50bC5oLmluCi0tCXNlZCAtZSAnL0lOX0xJQkdMT0NBTEUvZCcgXAotLQkgICAgLWUgJ3MsQCcnSEFWRV9QT1NJWF9QUklOVEYnJ0AsQEhBVkVfUE9TSVhfUFJJTlRGQCxnJyBcCi0tCSAgICAtZSAncyxAJydIQVZFX0FTUFJJTlRGJydALEBIQVZFX0FTUFJJTlRGQCxnJyBcCi0tCSAgICAtZSAncyxAJydIQVZFX1NOUFJJTlRGJydALEBIQVZFX1NOUFJJTlRGQCxnJyBcCi0tCSAgICAtZSAncyxAJydIQVZFX1dQUklOVEYnJ0AsQEhBVkVfV1BSSU5URkAsZycgXAotLQkgIDwgJChzcmNkaXIpL2xpYmdudWludGwuaC5pbiBcCi0tCXwgaWYgdGVzdCAnQFdPRTMyRExMQCcgPSB5ZXM7IHRoZW4gXAotLQkgICAgc2VkIC1lICdzL2V4dGVybiBcKFteKCldKlwpOy9leHRlcm4gX19kZWNsc3BlYyAoZGxsaW1wb3J0KSBcMTsvJzsgXAotLQkgIGVsc2UgXAotLQkgICAgY2F0OyBcCi0tCSAgZmkgXAotLQl8IHNlZCAtZSAncy9leHRlcm4gXChbXiJdXCkvZXh0ZXJuIExJQklOVExfRExMX0VYUE9SVEVEIFwxLycgXAotLQkgICAgICAtZSAiLyNkZWZpbmUgX0xJQklOVExfSC9yICQoc3JjZGlyKS9leHBvcnQuaCIgXAotLQl8IHNlZCAtZSAncyxAJydIQVZFX1ZJU0lCSUxJVFknJ0AsQEhBVkVfVklTSUJJTElUWUAsZycgXAotLQkgID4gbGliZ251aW50bC5oCi0tCi0tbGliaW50bC5oOiAkKHNyY2RpcikvbGliZ251aW50bC5oLmluCi0tCXNlZCAtZSAnL0lOX0xJQkdMT0NBTEUvZCcgXAotLQkgICAgLWUgJ3MsQCcnSEFWRV9QT1NJWF9QUklOVEYnJ0AsQEhBVkVfUE9TSVhfUFJJTlRGQCxnJyBcCi0tCSAgICAtZSAncyxAJydIQVZFX0FTUFJJTlRGJydALEBIQVZFX0FTUFJJTlRGQCxnJyBcCi0tCSAgICAtZSAncyxAJydIQVZFX1NOUFJJTlRGJydALEBIQVZFX1NOUFJJTlRGQCxnJyBcCi0tCSAgICAtZSAncyxAJydIQVZFX1dQUklOVEYnJ0AsQEhBVkVfV1BSSU5URkAsZycgXAotLQkgIDwgJChzcmNkaXIpL2xpYmdudWludGwuaC5pbiA+IGxpYmludGwuaAotLQotLWNoYXJzZXQuYWxpYXM6ICQoc3JjZGlyKS9jb25maWcuY2hhcnNldAotLQkkKFNIRUxMKSAkKHNyY2RpcikvY29uZmlnLmNoYXJzZXQgJ0Bob3N0QCcgPiB0LSRACi0tCW12IHQtJEAgJEAKLS0KLS1jaGVjazogYWxsCi0tCi0tIyBXZSBtdXN0IG5vdCBpbnN0YWxsIHRoZSBsaWJpbnRsLmgvbGliaW50bC5hIGZpbGVzIGlmIHdlIGFyZSBvbiBhCi0tIyBzeXN0ZW0gd2hpY2ggaGFzIHRoZSBHTlUgZ2V0dGV4dCgpIGZ1bmN0aW9uIGluIGl0cyBDIGxpYnJhcnkgb3IgaW4gYQotLSMgc2VwYXJhdGUgbGlicmFyeS4KLS0jIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgb25lIHdoaWNoIGNvbWVzIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZQotLSMgcGFja2FnZSwgeW91IGhhdmUgdG8gdXNlIGBjb25maWd1cmUgLS13aXRoLWluY2x1ZGVkLWdldHRleHQnLgotLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLS1pbnN0YWxsLWV4ZWM6IGFsbAotLQlpZiB7IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtcnVudGltZSIgfHwgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IH0gXAotLQkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCi0tCSAgJChta2Rpcl9wKSAkKERFU1RESVIpJChsaWJkaXIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBcCi0tCSAgJChJTlNUQUxMX0RBVEEpIGxpYmludGwuaCAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKLS0JICAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsIFwKLS0JICAgICQoSU5TVEFMTF9EQVRBKSBsaWJpbnRsLiRsYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwuJGxhOyBcCi0tCSAgaWYgdGVzdCAiQFJFTE9DQVRBQkxFQCIgPSB5ZXM7IHRoZW4gXAotLQkgICAgZGVwZW5kZW5jaWVzPWBzZWQgLW4gLWUgJ3MsXmRlcGVuZGVuY3lfbGlicz1cKC4qXCksXDEscCcgPCAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwubGEgfCBzZWQgLWUgInMsXicsLCIgLWUgInMsJ1wkJCwsImA7IFwKLS0JICAgIGlmIHRlc3QgLW4gIiQkZGVwZW5kZW5jaWVzIjsgdGhlbiBcCi0tCSAgICAgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliaW50bC5sYTsgXAotLQkgICAgZmk7IFwKLS0JICBmaTsgXAotLQllbHNlIFwKLS0JICA6IDsgXAotLQlmaQotLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiBcCi0tCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm8gXAotLQkgICAmJiB0ZXN0IEBHTElCQzJAICE9IG5vOyB0aGVuIFwKLS0JICAkKG1rZGlyX3ApICQoREVTVERJUikkKGxpYmRpcik7IFwKLS0JICAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsIFwKLS0JICAgICQoSU5TVEFMTF9EQVRBKSBsaWJnbnVpbnRsLiRsYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuJGxhOyBcCi0tCSAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9wcmVsb2FkYWJsZV9saWJpbnRsLnNvOyBcCi0tCSAgJChJTlNUQUxMX0RBVEEpICQoREVTVERJUikkKGxpYmRpcikvbGliZ251aW50bC5zbyAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKLS0JICAkKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgXAotLQkgICAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJnbnVpbnRsLiRsYTsgXAotLQllbHNlIFwKLS0JICA6IDsgXAotLQlmaQotLQlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCi0tCSAgdGVzdCBAR0xJQkMyMUAgIT0gbm8gfHwgJChta2Rpcl9wKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCi0tCSAgdGVtcD0kKERFU1RESVIpJChsaWJkaXIpL3QtY2hhcnNldC5hbGlhczsgXAotLQkgIGRlc3Q9JChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyBcCi0tCSAgaWYgdGVzdCAtZiAkKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IHRoZW4gXAotLQkgICAgb3JpZz0kKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IFwKLS0JICAgIHNlZCAtZiByZWYtYWRkLnNlZCAkJG9yaWcgPiAkJHRlbXA7IFwKLS0JICAgICQoSU5TVEFMTF9EQVRBKSAkJHRlbXAgJCRkZXN0OyBcCi0tCSAgICBybSAtZiAkJHRlbXA7IFwKLS0JICBlbHNlIFwKLS0JICAgIGlmIHRlc3QgQEdMSUJDMjFAID0gbm87IHRoZW4gXAotLQkgICAgICBvcmlnPWNoYXJzZXQuYWxpYXM7IFwKLS0JICAgICAgc2VkIC1mIHJlZi1hZGQuc2VkICQkb3JpZyA+ICQkdGVtcDsgXAotLQkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAotLQkgICAgICBybSAtZiAkJHRlbXA7IFwKLS0JICAgIGZpOyBcCi0tCSAgZmk7IFwKLS0JICAkKG1rZGlyX3ApICQoREVTVERJUikkKGxvY2FsZWRpcik7IFwKLS0JICB0ZXN0IC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzIFwKLS0JICAgICYmIG9yaWc9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXMgXAotLQkgICAgfHwgb3JpZz0kKHNyY2RpcikvbG9jYWxlLmFsaWFzOyBcCi0tCSAgdGVtcD0kKERFU1RESVIpJChsb2NhbGVkaXIpL3QtbG9jYWxlLmFsaWFzOyBcCi0tCSAgZGVzdD0kKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhczsgXAotLQkgIHNlZCAtZiByZWYtYWRkLnNlZCAkJG9yaWcgPiAkJHRlbXA7IFwKLS0JICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAotLQkgIHJtIC1mICQkdGVtcDsgXAotLQllbHNlIFwKLS0JICA6IDsgXAotLQlmaQotLWluc3RhbGwtZGF0YTogYWxsCi0tCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKLS0JICAkKG1rZGlyX3ApICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCi0tCSAgJChJTlNUQUxMX0RBVEEpIFZFUlNJT04gJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvVkVSU0lPTjsgXAotLQkgICQoSU5TVEFMTF9EQVRBKSBDaGFuZ2VMb2cuaW5zdCAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS9DaGFuZ2VMb2c7IFwKLS0JICBkaXN0cz0iQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pIjsgXAotLQkgIGZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLS0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRmaWxlIFwKLS0JCQkgICAgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0tCSAgZG9uZTsgXAotLQkgIGNobW9kIGEreCAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS9jb25maWcuY2hhcnNldDsgXAotLQkgIGRpc3RzPSIkKERJU1RGSUxFUy5nZW5lcmF0ZWQpIjsgXAotLQkgIGZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLS0JICAgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGRpcj0uOyBlbHNlIGRpcj0kKHNyY2Rpcik7IGZpOyBcCi0tCSAgICAkKElOU1RBTExfREFUQSkgJCRkaXIvJCRmaWxlIFwKLS0JCQkgICAgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0tCSAgZG9uZTsgXAotLQkgIGRpc3RzPSIkKERJU1RGSUxFUy5vYnNvbGV0ZSkiOyBcCi0tCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotLQkgICAgcm0gLWYgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0tCSAgZG9uZTsgXAotLQllbHNlIFwKLS0JICA6IDsgXAotLQlmaQotLQotLWluc3RhbGwtc3RyaXA6IGluc3RhbGwKLS0KLS1pbnN0YWxsLWR2aSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1pbmZvIGluc3RhbGwtcHMgaW5zdGFsbC1wZGY6Ci0tCi0taW5zdGFsbGRpcnM6Ci0tCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCi0tCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0geWVzOyB0aGVuIFwKLS0JICAkKG1rZGlyX3ApICQoREVTVERJUikkKGxpYmRpcikgJChERVNURElSKSQoaW5jbHVkZWRpcik7IFwKLS0JZWxzZSBcCi0tCSAgOiA7IFwKLS0JZmkKLS0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyIgXAotLQkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IG5vIFwKLS0JICAgJiYgdGVzdCBAR0xJQkMyQCAhPSBubzsgdGhlbiBcCi0tCSAgJChta2Rpcl9wKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCi0tCWVsc2UgXAotLQkgIDogOyBcCi0tCWZpCi0tCWlmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0geWVzOyB0aGVuIFwKLS0JICB0ZXN0IEBHTElCQzIxQCAhPSBubyB8fCAkKG1rZGlyX3ApICQoREVTVERJUikkKGxpYmRpcik7IFwKLS0JICAkKG1rZGlyX3ApICQoREVTVERJUikkKGxvY2FsZWRpcik7IFwKLS0JZWxzZSBcCi0tCSAgOiA7IFwKLS0JZmkKLS0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAotLQkgICQobWtkaXJfcCkgJChERVNURElSKSQoZ2V0dGV4dHNyY2Rpcik7IFwKLS0JZWxzZSBcCi0tCSAgOiA7IFwKLS0JZmkKLS0KLS0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi0taW5zdGFsbGNoZWNrOgotLQotLXVuaW5zdGFsbDoKLS0JaWYgeyB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB9IFwKLS0JICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotLQkgIHJtIC1mICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2xpYmludGwuaDsgXAotLQkgICQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBcCi0tCSAgICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwuJGxhOyBcCi0tCWVsc2UgXAotLQkgIDogOyBcCi0tCWZpCi0tCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiIFwKLS0JICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSBubyBcCi0tCSAgICYmIHRlc3QgQEdMSUJDMkAgIT0gbm87IHRoZW4gXAotLQkgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvcHJlbG9hZGFibGVfbGliaW50bC5zbzsgXAotLQllbHNlIFwKLS0JICA6IDsgXAotLQlmaQotLQlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCi0tCSAgaWYgdGVzdCAtZiAkKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IHRoZW4gXAotLQkgICAgdGVtcD0kKERFU1RESVIpJChsaWJkaXIpL3QtY2hhcnNldC5hbGlhczsgXAotLQkgICAgZGVzdD0kKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IFwKLS0JICAgIHNlZCAtZiByZWYtZGVsLnNlZCAkJGRlc3QgPiAkJHRlbXA7IFwKLS0JICAgIGlmIGdyZXAgJ14jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTogJCQnICQkdGVtcCA+IC9kZXYvbnVsbDsgdGhlbiBcCi0tCSAgICAgIHJtIC1mICQkZGVzdDsgXAotLQkgICAgZWxzZSBcCi0tCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJHRlbXAgJCRkZXN0OyBcCi0tCSAgICBmaTsgXAotLQkgICAgcm0gLWYgJCR0ZW1wOyBcCi0tCSAgZmk7IFwKLS0JICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzOyB0aGVuIFwKLS0JICAgIHRlbXA9JChERVNURElSKSQobG9jYWxlZGlyKS90LWxvY2FsZS5hbGlhczsgXAotLQkgICAgZGVzdD0kKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhczsgXAotLQkgICAgc2VkIC1mIHJlZi1kZWwuc2VkICQkZGVzdCA+ICQkdGVtcDsgXAotLQkgICAgaWYgZ3JlcCAnXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAkJCcgJCR0ZW1wID4gL2Rldi9udWxsOyB0aGVuIFwKLS0JICAgICAgcm0gLWYgJCRkZXN0OyBcCi0tCSAgICBlbHNlIFwKLS0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKLS0JICAgIGZpOyBcCi0tCSAgICBybSAtZiAkJHRlbXA7IFwKLS0JICBmaTsgXAotLQllbHNlIFwKLS0JICA6IDsgXAotLQlmaQotLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCi0tCSAgZm9yIGZpbGUgaW4gVkVSU0lPTiBDaGFuZ2VMb2cgQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCk7IGRvIFwKLS0JICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotLQkgIGRvbmU7IFwKLS0JZWxzZSBcCi0tCSAgOiA7IFwKLS0JZmkKLS0KLS1pbmZvIGR2aSBwcyBwZGYgaHRtbDoKLS0KLS0kKE9CSkVDVFMpOiAuLi9jb25maWcuaCBsaWJnbnVpbnRsLmgKLS1iaW5kdGV4dGRvbS4kbG8gZGNnZXR0ZXh0LiRsbyBkY2lnZXR0ZXh0LiRsbyBkY25nZXR0ZXh0LiRsbyBkZ2V0dGV4dC4kbG8gZG5nZXR0ZXh0LiRsbyBmaW5kZG9tYWluLiRsbyBnZXR0ZXh0LiRsbyBpbnRsLWNvbXBhdC4kbG8gbG9hZG1zZ2NhdC4kbG8gbG9jYWxlYWxpYXMuJGxvIG5nZXR0ZXh0LiRsbyB0ZXh0ZG9tYWluLiRsbzogJChzcmNkaXIpL2dldHRleHRQLmggJChzcmNkaXIpL2dtby5oICQoc3JjZGlyKS9sb2FkaW5mby5oCi0taGFzaC1zdHJpbmcuJGxvIGRjaWdldHRleHQuJGxvIGxvYWRtc2djYXQuJGxvOiAkKHNyY2RpcikvaGFzaC1zdHJpbmcuaAotLWV4cGxvZGVuYW1lLiRsbyBsMTBuZmxpc3QuJGxvOiAkKHNyY2RpcikvbG9hZGluZm8uaAotLWRjaWdldHRleHQuJGxvIGxvYWRtc2djYXQuJGxvIHBsdXJhbC4kbG8gcGx1cmFsLWV4cC4kbG86ICQoc3JjZGlyKS9wbHVyYWwtZXhwLmgKLS1kY2lnZXR0ZXh0LiRsbzogJChzcmNkaXIpL2V2YWwtcGx1cmFsLmgKLS1sb2NhbGNoYXJzZXQuJGxvOiAkKHNyY2RpcikvbG9jYWxjaGFyc2V0LmgKLS1iaW5kdGV4dGRvbS4kbG8gZGNpZ2V0dGV4dC4kbG8gZmluZGRvbWFpbi4kbG8gbG9hZG1zZ2NhdC4kbG8gbG9jYWxlYWxpYXMuJGxvIGxvY2suJGxvIGxvZy4kbG86ICQoc3JjZGlyKS9sb2NrLmgKLS1sb2NhbGVhbGlhcy4kbG8gbG9jYWxjaGFyc2V0LiRsbyByZWxvY2F0YWJsZS4kbG86ICQoc3JjZGlyKS9yZWxvY2F0YWJsZS5oCi0tcHJpbnRmLiRsbzogJChzcmNkaXIpL3ByaW50Zi1hcmdzLmggJChzcmNkaXIpL3ByaW50Zi1hcmdzLmMgJChzcmNkaXIpL3ByaW50Zi1wYXJzZS5oICQoc3JjZGlyKS93cHJpbnRmLXBhcnNlLmggJChzcmNkaXIpL3hzaXplLmggJChzcmNkaXIpL3ByaW50Zi1wYXJzZS5jICQoc3JjZGlyKS92YXNucHJpbnRmLmggJChzcmNkaXIpL3Zhc253cHJpbnRmLmggJChzcmNkaXIpL3Zhc25wcmludGYuYwotLQotLSMgQSBiaXNvbi0yLjEgZ2VuZXJhdGVkIHBsdXJhbC5jIGluY2x1ZGVzIDxsaWJpbnRsLmg+IGlmIEVOQUJMRV9OTFMuCi0tUExVUkFMX0RFUFNfeWVzID0gbGliaW50bC5oCi0tUExVUkFMX0RFUFNfbm8gPQotLXBsdXJhbC4kbG86ICQoUExVUkFMX0RFUFNfQFVTRV9JTkNMVURFRF9MSUJJTlRMQCkKLS0KLS10YWdzOiBUQUdTCi0tCi0tVEFHUzogJChIRUFERVJTKSAkKFNPVVJDRVMpCi0tCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBldGFncyAtbyAkJGhlcmUvVEFHUyAkKEhFQURFUlMpICQoU09VUkNFUykKLS0KLS1jdGFnczogQ1RBR1MKLS0KLS1DVEFHUzogJChIRUFERVJTKSAkKFNPVVJDRVMpCi0tCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBjdGFncyAtbyAkJGhlcmUvQ1RBR1MgJChIRUFERVJTKSAkKFNPVVJDRVMpCi0tCi0taWQ6IElECi0tCi0tSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKQotLQloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgbWtpZCAtZiQkaGVyZS9JRCAkKEhFQURFUlMpICQoU09VUkNFUykKLS0KLS0KLS1tb3N0bHljbGVhbjoKLS0Jcm0gLWYgKi5hICoubGEgKi5vICoub2JqICoubG8gbGliaW50bC5yZXMgY29yZSBjb3JlLioKLS0Jcm0gLWYgbGliZ251aW50bC5oIGxpYmludGwuaCBjaGFyc2V0LmFsaWFzIHJlZi1hZGQuc2VkIHJlZi1kZWwuc2VkCi0tCXJtIC1mIC1yIC5saWJzIF9saWJzCi0tCi0tY2xlYW46IG1vc3RseWNsZWFuCi0tCi0tZGlzdGNsZWFuOiBjbGVhbgotLQlybSAtZiBNYWtlZmlsZSBJRCBUQUdTCi0tCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtcnVudGltZSIgfHwgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAotLQkgIHJtIC1mIENoYW5nZUxvZy5pbnN0ICQoRElTVEZJTEVTLm5vcm1hbCk7IFwKLS0JZWxzZSBcCi0tCSAgOiA7IFwKLS0JZmkKLS0KLS1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLS0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLS0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotLQotLQotLSMgR05VIGdldHRleHQgbmVlZHMgbm90IGNvbnRhaW4gdGhlIGZpbGUgYFZFUlNJT04nIGJ1dCBjb250YWlucyBzb21lCi0tIyBvdGhlciBmaWxlcyB3aGljaCBzaG91bGQgbm90IGJlIGRpc3RyaWJ1dGVkIGluIG90aGVyIHBhY2thZ2VzLgotLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi0tZGlzdCBkaXN0ZGlyOiBNYWtlZmlsZQotLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCi0tCSAgOiA7IFwKLS0JZWxzZSBcCi0tCSAgaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIjsgdGhlbiBcCi0tCSAgICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5nZXR0ZXh0KSI7IFwKLS0JICBlbHNlIFwKLS0JICAgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLm5vcm1hbCkiOyBcCi0tCSAgZmk7IFwKLS0JICAkKE1BS0UpICQoRElTVEZJTEVTLmNvbW1vbikgJChESVNURklMRVMuZ2VuZXJhdGVkKSAkJGFkZGl0aW9uYWw7IFwKLS0JICBmb3IgZmlsZSBpbiBDaGFuZ2VMb2cgJChESVNURklMRVMuY29tbW9uKSAkKERJU1RGSUxFUy5nZW5lcmF0ZWQpICQkYWRkaXRpb25hbDsgZG8gXAotLQkgICAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZGlyPS47IGVsc2UgZGlyPSQoc3JjZGlyKTsgZmk7IFwKLS0JICAgIGNwIC1wICQkZGlyLyQkZmlsZSAkKGRpc3RkaXIpIHx8IHRlc3QgJCRmaWxlID0gTWFrZWZpbGUuaW4gfHwgZXhpdCAxOyBcCi0tCSAgZG9uZTsgXAotLQlmaQotLQotLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLS0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotLSMgVGhpcyB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCwgYnV0IGRvZXNuJ3Qgd29yayBhbnkgbW9yZSB3aXRoIGF1dG9jb25mLTIuNTcsCi0tIyB3aGVuIEFDX0NPTkZJR19GSUxFUyhbaW50bC9NYWtlZmlsZTpzb21lZGlyL01ha2VmaWxlLmluXSkgaXMgdXNlZC4KLS0jCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACi0tCi0tIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLS0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS0uTk9FWFBPUlQ6Ci0tLS0gYS9pbnRsL1ZFUlNJT04KLSsrKyAvZGV2L251bGwKLUBAIC0xICswLDAgQEAKLS1HTlUgZ2V0dGV4dCBsaWJyYXJ5IGZyb20gZ2V0dGV4dC0wLjE3Ci0tLS0gYS9pbnRsL2JpbmR0ZXh0ZG9tLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDM0MCArMCwwIEBACi0tLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGJpbmR0ZXh0ZG9tYWluKDMpIGZ1bmN0aW9uCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMywgMjAwNS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxzdGRkZWYuaD4KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tI2luY2x1ZGUgPHN0cmluZy5oPgotLQotLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8bGliaW50bC5oPgotLSNlbHNlCi0tIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0tI2VuZGlmCi0tCi0tLyogSGFuZGxlIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgotLSMgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmUgX19saWJjX3J3bG9ja19kZWZpbmUKLS0jIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrIF9fbGliY19yd2xvY2tfd3Jsb2NrCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayBfX2xpYmNfcndsb2NrX3VubG9jawotLSNlbHNlCi0tIyBpbmNsdWRlICJsb2NrLmgiCi0tI2VuZGlmCi0tCi0tLyogU29tZSBjb21waWxlcnMsIGxpa2UgU3VuT1M0IGNjLCBkb24ndCBoYXZlIG9mZnNldG9mIGluIDxzdGRkZWYuaD4uICAqLwotLSNpZm5kZWYgb2Zmc2V0b2YKLS0jIGRlZmluZSBvZmZzZXRvZih0eXBlLGlkZW50KSAoKHNpemVfdCkmKCgodHlwZSopMCktPmlkZW50KSkKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tLyogTG9jayB2YXJpYWJsZSB0byBwcm90ZWN0IHRoZSBnbG9iYWwgZGF0YSBpbiB0aGUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbi4gICovCi0tZ2xfcndsb2NrX2RlZmluZSAoZXh0ZXJuLCBfbmxfc3RhdGVfbG9jayBhdHRyaWJ1dGVfaGlkZGVuKQotLQotLQotLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLS0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0tICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0tICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSBCSU5EVEVYVERPTUFJTiBfX2JpbmR0ZXh0ZG9tYWluCi0tIyBkZWZpbmUgQklORF9URVhURE9NQUlOX0NPREVTRVQgX19iaW5kX3RleHRkb21haW5fY29kZXNldAotLSMgaWZuZGVmIHN0cmR1cAotLSMgIGRlZmluZSBzdHJkdXAoc3RyKSBfX3N0cmR1cCAoc3RyKQotLSMgZW5kaWYKLS0jZWxzZQotLSMgZGVmaW5lIEJJTkRURVhURE9NQUlOIGxpYmludGxfYmluZHRleHRkb21haW4KLS0jIGRlZmluZSBCSU5EX1RFWFRET01BSU5fQ09ERVNFVCBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0Ci0tI2VuZGlmCi0tCi0tLyogU3BlY2lmaWVzIHRoZSBkaXJlY3RvcnkgbmFtZSAqRElSTkFNRVAgYW5kIHRoZSBvdXRwdXQgY29kZXNldCAqQ09ERVNFVFAKLS0gICB0byBiZSB1c2VkIGZvciB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cuCi0tICAgSWYgKkRJUk5BTUVQIG9yICpDT0RFU0VUUCBpcyBOVUxMLCB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgaXMgbm90Ci0tICAgbW9kaWZpZWQsIG9ubHkgdGhlIGN1cnJlbnQgdmFsdWUgaXMgcmV0dXJuZWQuCi0tICAgSWYgRElSTkFNRVAgb3IgQ09ERVNFVFAgaXMgTlVMTCwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGlzIG5laXRoZXIKLS0gICBtb2RpZmllZCBub3IgcmV0dXJuZWQuICAqLwotLXN0YXRpYyB2b2lkCi0tc2V0X2JpbmRpbmdfdmFsdWVzIChjb25zdCBjaGFyICpkb21haW5uYW1lLAotLQkJICAgIGNvbnN0IGNoYXIgKipkaXJuYW1lcCwgY29uc3QgY2hhciAqKmNvZGVzZXRwKQotLXsKLS0gIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOwotLSAgaW50IG1vZGlmaWVkOwotLQotLSAgLyogU29tZSBzYW5pdHkgY2hlY2tzLiAgKi8KLS0gIGlmIChkb21haW5uYW1lID09IE5VTEwgfHwgZG9tYWlubmFtZVswXSA9PSAnXDAnKQotLSAgICB7Ci0tICAgICAgaWYgKGRpcm5hbWVwKQotLQkqZGlybmFtZXAgPSBOVUxMOwotLSAgICAgIGlmIChjb2Rlc2V0cCkKLS0JKmNvZGVzZXRwID0gTlVMTDsKLS0gICAgICByZXR1cm47Ci0tICAgIH0KLS0KLS0gIGdsX3J3bG9ja193cmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLS0KLS0gIG1vZGlmaWVkID0gMDsKLS0KLS0gIGZvciAoYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7IGJpbmRpbmcgIT0gTlVMTDsgYmluZGluZyA9IGJpbmRpbmctPm5leHQpCi0tICAgIHsKLS0gICAgICBpbnQgY29tcGFyZSA9IHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+ZG9tYWlubmFtZSk7Ci0tICAgICAgaWYgKGNvbXBhcmUgPT0gMCkKLS0JLyogV2UgZm91bmQgaXQhICAqLwotLQlicmVhazsKLS0gICAgICBpZiAoY29tcGFyZSA8IDApCi0tCXsKLS0JICAvKiBJdCBpcyBub3QgaW4gdGhlIGxpc3QuICAqLwotLQkgIGJpbmRpbmcgPSBOVUxMOwotLQkgIGJyZWFrOwotLQl9Ci0tICAgIH0KLS0KLS0gIGlmIChiaW5kaW5nICE9IE5VTEwpCi0tICAgIHsKLS0gICAgICBpZiAoZGlybmFtZXApCi0tCXsKLS0JICBjb25zdCBjaGFyICpkaXJuYW1lID0gKmRpcm5hbWVwOwotLQotLQkgIGlmIChkaXJuYW1lID09IE5VTEwpCi0tCSAgICAvKiBUaGUgY3VycmVudCBiaW5kaW5nIGhhcyBiZSB0byByZXR1cm5lZC4gICovCi0tCSAgICAqZGlybmFtZXAgPSBiaW5kaW5nLT5kaXJuYW1lOwotLQkgIGVsc2UKLS0JICAgIHsKLS0JICAgICAgLyogVGhlIGRvbWFpbiBpcyBhbHJlYWR5IGJvdW5kLiAgSWYgdGhlIG5ldyB2YWx1ZSBhbmQgdGhlIG9sZAotLQkJIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKLS0JCSBvbGQgYmluZGluZy4gICovCi0tCSAgICAgIGNoYXIgKnJlc3VsdCA9IGJpbmRpbmctPmRpcm5hbWU7Ci0tCSAgICAgIGlmIChzdHJjbXAgKGRpcm5hbWUsIHJlc3VsdCkgIT0gMCkKLS0JCXsKLS0JCSAgaWYgKHN0cmNtcCAoZGlybmFtZSwgX25sX2RlZmF1bHRfZGlybmFtZSkgPT0gMCkKLS0JCSAgICByZXN1bHQgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotLQkJICBlbHNlCi0tCQkgICAgewotLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLS0JCSAgICAgIHJlc3VsdCA9IHN0cmR1cCAoZGlybmFtZSk7Ci0tI2Vsc2UKLS0JCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKLS0JCSAgICAgIHJlc3VsdCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLS0JCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgIT0gTlVMTCwgMSkpCi0tCQkJbWVtY3B5IChyZXN1bHQsIGRpcm5hbWUsIGxlbik7Ci0tI2VuZGlmCi0tCQkgICAgfQotLQotLQkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQotLQkJICAgIHsKLS0JCSAgICAgIGlmIChiaW5kaW5nLT5kaXJuYW1lICE9IF9ubF9kZWZhdWx0X2Rpcm5hbWUpCi0tCQkJZnJlZSAoYmluZGluZy0+ZGlybmFtZSk7Ci0tCi0tCQkgICAgICBiaW5kaW5nLT5kaXJuYW1lID0gcmVzdWx0OwotLQkJICAgICAgbW9kaWZpZWQgPSAxOwotLQkJICAgIH0KLS0JCX0KLS0JICAgICAgKmRpcm5hbWVwID0gcmVzdWx0OwotLQkgICAgfQotLQl9Ci0tCi0tICAgICAgaWYgKGNvZGVzZXRwKQotLQl7Ci0tCSAgY29uc3QgY2hhciAqY29kZXNldCA9ICpjb2Rlc2V0cDsKLS0KLS0JICBpZiAoY29kZXNldCA9PSBOVUxMKQotLQkgICAgLyogVGhlIGN1cnJlbnQgYmluZGluZyBoYXMgYmUgdG8gcmV0dXJuZWQuICAqLwotLQkgICAgKmNvZGVzZXRwID0gYmluZGluZy0+Y29kZXNldDsKLS0JICBlbHNlCi0tCSAgICB7Ci0tCSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKLS0JCSBvbmUgYXJlIGVxdWFsIHdlIHNpbXBseSBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlIHJlcGxhY2UgdGhlCi0tCQkgb2xkIGJpbmRpbmcuICAqLwotLQkgICAgICBjaGFyICpyZXN1bHQgPSBiaW5kaW5nLT5jb2Rlc2V0OwotLQkgICAgICBpZiAocmVzdWx0ID09IE5VTEwgfHwgc3RyY21wIChjb2Rlc2V0LCByZXN1bHQpICE9IDApCi0tCQl7Ci0tI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotLQkJICByZXN1bHQgPSBzdHJkdXAgKGNvZGVzZXQpOwotLSNlbHNlCi0tCQkgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGNvZGVzZXQpICsgMTsKLS0JCSAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotLQkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQotLQkJICAgIG1lbWNweSAocmVzdWx0LCBjb2Rlc2V0LCBsZW4pOwotLSNlbmRpZgotLQotLQkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQotLQkJICAgIHsKLS0JCSAgICAgIGlmIChiaW5kaW5nLT5jb2Rlc2V0ICE9IE5VTEwpCi0tCQkJZnJlZSAoYmluZGluZy0+Y29kZXNldCk7Ci0tCi0tCQkgICAgICBiaW5kaW5nLT5jb2Rlc2V0ID0gcmVzdWx0OwotLQkJICAgICAgbW9kaWZpZWQgPSAxOwotLQkJICAgIH0KLS0JCX0KLS0JICAgICAgKmNvZGVzZXRwID0gcmVzdWx0OwotLQkgICAgfQotLQl9Ci0tICAgIH0KLS0gIGVsc2UgaWYgKChkaXJuYW1lcCA9PSBOVUxMIHx8ICpkaXJuYW1lcCA9PSBOVUxMKQotLQkgICAmJiAoY29kZXNldHAgPT0gTlVMTCB8fCAqY29kZXNldHAgPT0gTlVMTCkpCi0tICAgIHsKLS0gICAgICAvKiBTaW1wbHkgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlcy4gICovCi0tICAgICAgaWYgKGRpcm5hbWVwKQotLQkqZGlybmFtZXAgPSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotLSAgICAgIGlmIChjb2Rlc2V0cCkKLS0JKmNvZGVzZXRwID0gTlVMTDsKLS0gICAgfQotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgLyogV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgYmluZGluZy4gICovCi0tICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOwotLSAgICAgIHN0cnVjdCBiaW5kaW5nICpuZXdfYmluZGluZyA9Ci0tCShzdHJ1Y3QgYmluZGluZyAqKSBtYWxsb2MgKG9mZnNldG9mIChzdHJ1Y3QgYmluZGluZywgZG9tYWlubmFtZSkgKyBsZW4pOwotLQotLSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChuZXdfYmluZGluZyA9PSBOVUxMLCAwKSkKLS0JZ290byBmYWlsZWQ7Ci0tCi0tICAgICAgbWVtY3B5IChuZXdfYmluZGluZy0+ZG9tYWlubmFtZSwgZG9tYWlubmFtZSwgbGVuKTsKLS0KLS0gICAgICBpZiAoZGlybmFtZXApCi0tCXsKLS0JICBjb25zdCBjaGFyICpkaXJuYW1lID0gKmRpcm5hbWVwOwotLQotLQkgIGlmIChkaXJuYW1lID09IE5VTEwpCi0tCSAgICAvKiBUaGUgZGVmYXVsdCB2YWx1ZS4gICovCi0tCSAgICBkaXJuYW1lID0gX25sX2RlZmF1bHRfZGlybmFtZTsKLS0JICBlbHNlCi0tCSAgICB7Ci0tCSAgICAgIGlmIChzdHJjbXAgKGRpcm5hbWUsIF9ubF9kZWZhdWx0X2Rpcm5hbWUpID09IDApCi0tCQlkaXJuYW1lID0gX25sX2RlZmF1bHRfZGlybmFtZTsKLS0JICAgICAgZWxzZQotLQkJewotLQkJICBjaGFyICpyZXN1bHQ7Ci0tI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotLQkJICByZXN1bHQgPSBzdHJkdXAgKGRpcm5hbWUpOwotLQkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ID09IE5VTEwsIDApKQotLQkJICAgIGdvdG8gZmFpbGVkX2Rpcm5hbWU7Ci0tI2Vsc2UKLS0JCSAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOwotLQkJICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0tCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCi0tCQkgICAgZ290byBmYWlsZWRfZGlybmFtZTsKLS0JCSAgbWVtY3B5IChyZXN1bHQsIGRpcm5hbWUsIGxlbik7Ci0tI2VuZGlmCi0tCQkgIGRpcm5hbWUgPSByZXN1bHQ7Ci0tCQl9Ci0tCSAgICB9Ci0tCSAgKmRpcm5hbWVwID0gZGlybmFtZTsKLS0JICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIGRpcm5hbWU7Ci0tCX0KLS0gICAgICBlbHNlCi0tCS8qIFRoZSBkZWZhdWx0IHZhbHVlLiAgKi8KLS0JbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotLQotLSAgICAgIGlmIChjb2Rlc2V0cCkKLS0JewotLQkgIGNvbnN0IGNoYXIgKmNvZGVzZXQgPSAqY29kZXNldHA7Ci0tCi0tCSAgaWYgKGNvZGVzZXQgIT0gTlVMTCkKLS0JICAgIHsKLS0JICAgICAgY2hhciAqcmVzdWx0OwotLQotLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLS0JICAgICAgcmVzdWx0ID0gc3RyZHVwIChjb2Rlc2V0KTsKLS0JICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKLS0JCWdvdG8gZmFpbGVkX2NvZGVzZXQ7Ci0tI2Vsc2UKLS0JICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoY29kZXNldCkgKyAxOwotLQkgICAgICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0tCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCi0tCQlnb3RvIGZhaWxlZF9jb2Rlc2V0OwotLQkgICAgICBtZW1jcHkgKHJlc3VsdCwgY29kZXNldCwgbGVuKTsKLS0jZW5kaWYKLS0JICAgICAgY29kZXNldCA9IHJlc3VsdDsKLS0JICAgIH0KLS0JICAqY29kZXNldHAgPSBjb2Rlc2V0OwotLQkgIG5ld19iaW5kaW5nLT5jb2Rlc2V0ID0gKGNoYXIgKikgY29kZXNldDsKLS0JfQotLSAgICAgIGVsc2UKLS0JbmV3X2JpbmRpbmctPmNvZGVzZXQgPSBOVUxMOwotLQotLSAgICAgIC8qIE5vdyBlbnF1ZXVlIGl0LiAgKi8KLS0gICAgICBpZiAoX25sX2RvbWFpbl9iaW5kaW5ncyA9PSBOVUxMCi0tCSAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZG9tYWluX2JpbmRpbmdzLT5kb21haW5uYW1lKSA8IDApCi0tCXsKLS0JICBuZXdfYmluZGluZy0+bmV4dCA9IF9ubF9kb21haW5fYmluZGluZ3M7Ci0tCSAgX25sX2RvbWFpbl9iaW5kaW5ncyA9IG5ld19iaW5kaW5nOwotLQl9Ci0tICAgICAgZWxzZQotLQl7Ci0tCSAgYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7Ci0tCSAgd2hpbGUgKGJpbmRpbmctPm5leHQgIT0gTlVMTAotLQkJICYmIHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+bmV4dC0+ZG9tYWlubmFtZSkgPiAwKQotLQkgICAgYmluZGluZyA9IGJpbmRpbmctPm5leHQ7Ci0tCi0tCSAgbmV3X2JpbmRpbmctPm5leHQgPSBiaW5kaW5nLT5uZXh0OwotLQkgIGJpbmRpbmctPm5leHQgPSBuZXdfYmluZGluZzsKLS0JfQotLQotLSAgICAgIG1vZGlmaWVkID0gMTsKLS0KLS0gICAgICAvKiBIZXJlIHdlIGRlYWwgd2l0aCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlcy4gICovCi0tICAgICAgaWYgKDApCi0tCXsKLS0JZmFpbGVkX2NvZGVzZXQ6Ci0tCSAgaWYgKG5ld19iaW5kaW5nLT5kaXJuYW1lICE9IF9ubF9kZWZhdWx0X2Rpcm5hbWUpCi0tCSAgICBmcmVlIChuZXdfYmluZGluZy0+ZGlybmFtZSk7Ci0tCWZhaWxlZF9kaXJuYW1lOgotLQkgIGZyZWUgKG5ld19iaW5kaW5nKTsKLS0JZmFpbGVkOgotLQkgIGlmIChkaXJuYW1lcCkKLS0JICAgICpkaXJuYW1lcCA9IE5VTEw7Ci0tCSAgaWYgKGNvZGVzZXRwKQotLQkgICAgKmNvZGVzZXRwID0gTlVMTDsKLS0JfQotLSAgICB9Ci0tCi0tICAvKiBJZiB3ZSBtb2RpZmllZCBhbnkgYmluZGluZywgd2UgZmx1c2ggdGhlIGNhY2hlcy4gICovCi0tICBpZiAobW9kaWZpZWQpCi0tICAgICsrX25sX21zZ19jYXRfY250cjsKLS0KLS0gIGdsX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLS19Ci0tCi0tLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCi0tICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotLWNoYXIgKgotLUJJTkRURVhURE9NQUlOIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICpkaXJuYW1lKQotLXsKLS0gIHNldF9iaW5kaW5nX3ZhbHVlcyAoZG9tYWlubmFtZSwgJmRpcm5hbWUsIE5VTEwpOwotLSAgcmV0dXJuIChjaGFyICopIGRpcm5hbWU7Ci0tfQotLQotLS8qIFNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBpbiB3aGljaCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUKLS0gICBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLiAgKi8KLS1jaGFyICoKLS1CSU5EX1RFWFRET01BSU5fQ09ERVNFVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqY29kZXNldCkKLS17Ci0tICBzZXRfYmluZGluZ192YWx1ZXMgKGRvbWFpbm5hbWUsIE5VTEwsICZjb2Rlc2V0KTsKLS0gIHJldHVybiAoY2hhciAqKSBjb2Rlc2V0OwotLX0KLS0KLS0jaWZkZWYgX0xJQkMKLS0vKiBBbGlhc2VzIGZvciBmdW5jdGlvbiBuYW1lcyBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLS13ZWFrX2FsaWFzIChfX2JpbmR0ZXh0ZG9tYWluLCBiaW5kdGV4dGRvbWFpbik7Ci0td2Vha19hbGlhcyAoX19iaW5kX3RleHRkb21haW5fY29kZXNldCwgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpOwotLSNlbmRpZgotLS0tIGEvaW50bC9jb25maWcuY2hhcnNldAotKysrIC9kZXYvbnVsbAotQEAgLTEsNjQwICswLDAgQEAKLS0jISAvYmluL3NoCi0tIyBPdXRwdXQgYSBzeXN0ZW0gZGVwZW5kZW50IHRhYmxlIG9mIGNoYXJhY3RlciBlbmNvZGluZyBhbGlhc2VzLgotLSMKLS0jICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tIwotLSMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0jICAgYW55IGxhdGVyIHZlcnNpb24uCi0tIwotLSMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0jICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0jICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0jICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tIwotLSMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tIyAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0jICAgVVNBLgotLSMKLS0jIFRoZSB0YWJsZSBjb25zaXN0cyBvZiBsaW5lcyBvZiB0aGUgZm9ybQotLSMgICAgQUxJQVMgIENBTk9OSUNBTAotLSMKLS0jIEFMSUFTIGlzIHRoZSAoc3lzdGVtIGRlcGVuZGVudCkgcmVzdWx0IG9mICJubF9sYW5naW5mbyAoQ09ERVNFVCkiLgotLSMgQUxJQVMgaXMgY29tcGFyZWQgaW4gYSBjYXNlIHNlbnNpdGl2ZSB3YXkuCi0tIwotLSMgQ0FOT05JQ0FMIGlzIHRoZSBHTlUgY2Fub25pY2FsIG5hbWUgZm9yIHRoaXMgY2hhcmFjdGVyIGVuY29kaW5nLgotLSMgSXQgbXVzdCBiZSBhbiBlbmNvZGluZyBzdXBwb3J0ZWQgYnkgbGliaWNvbnYuIFN1cHBvcnQgYnkgR05VIGxpYmMgaXMKLS0jIGFsc28gZGVzaXJhYmxlLiBDQU5PTklDQUwgaXMgY2FzZSBpbnNlbnNpdGl2ZS4gVXN1YWxseSBhbiB1cHBlciBjYXNlCi0tIyBNSU1FIGNoYXJzZXQgbmFtZSBpcyBwcmVmZXJyZWQuCi0tIyBUaGUgY3VycmVudCBsaXN0IG9mIEdOVSBjYW5vbmljYWwgY2hhcnNldCBuYW1lcyBpcyBhcyBmb2xsb3dzLgotLSMKLS0jICAgICAgIG5hbWUgICAgICAgICAgICAgIE1JTUU/ICAgICAgICAgICAgIHVzZWQgYnkgd2hpY2ggc3lzdGVtcwotLSMgICBBU0NJSSwgQU5TSV9YMy40LTE5NjggICAgICAgZ2xpYmMgc29sYXJpcyBmcmVlYnNkIG5ldGJzZCBkYXJ3aW4KLS0jICAgSVNPLTg4NTktMSAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0tIyAgIElTTy04ODU5LTIgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgbmV0YnNkIGRhcndpbgotLSMgICBJU08tODg1OS0zICAgICAgICAgICAgICBZICAgZ2xpYmMgc29sYXJpcwotLSMgICBJU08tODg1OS00ICAgICAgICAgICAgICBZICAgb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0tIyAgIElTTy04ODU5LTUgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgbmV0YnNkIGRhcndpbgotLSMgICBJU08tODg1OS02ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggc29sYXJpcwotLSMgICBJU08tODg1OS03ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBuZXRic2QgZGFyd2luCi0tIyAgIElTTy04ODU5LTggICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBvc2Ygc29sYXJpcwotLSMgICBJU08tODg1OS05ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBkYXJ3aW4KLS0jICAgSVNPLTg4NTktMTMgICAgICAgICAgICAgICAgIGdsaWJjIG5ldGJzZCBkYXJ3aW4KLS0jICAgSVNPLTg4NTktMTQgICAgICAgICAgICAgICAgIGdsaWJjCi0tIyAgIElTTy04ODU5LTE1ICAgICAgICAgICAgICAgICBnbGliYyBhaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KLS0jICAgS09JOC1SICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0tIyAgIEtPSTgtVSAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBmcmVlYnNkIG5ldGJzZCBkYXJ3aW4KLS0jICAgS09JOC1UICAgICAgICAgICAgICAgICAgICAgIGdsaWJjCi0tIyAgIENQNDM3ICAgICAgICAgICAgICAgICAgICAgICBkb3MKLS0jICAgQ1A3NzUgICAgICAgICAgICAgICAgICAgICAgIGRvcwotLSMgICBDUDg1MCAgICAgICAgICAgICAgICAgICAgICAgYWl4IG9zZiBkb3MKLS0jICAgQ1A4NTIgICAgICAgICAgICAgICAgICAgICAgIGRvcwotLSMgICBDUDg1NSAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0tIyAgIENQODU2ICAgICAgICAgICAgICAgICAgICAgICBhaXgKLS0jICAgQ1A4NTcgICAgICAgICAgICAgICAgICAgICAgIGRvcwotLSMgICBDUDg2MSAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0tIyAgIENQODYyICAgICAgICAgICAgICAgICAgICAgICBkb3MKLS0jICAgQ1A4NjQgICAgICAgICAgICAgICAgICAgICAgIGRvcwotLSMgICBDUDg2NSAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0tIyAgIENQODY2ICAgICAgICAgICAgICAgICAgICAgICBmcmVlYnNkIG5ldGJzZCBkYXJ3aW4gZG9zCi0tIyAgIENQODY5ICAgICAgICAgICAgICAgICAgICAgICBkb3MKLS0jICAgQ1A4NzQgICAgICAgICAgICAgICAgICAgICAgIHdvZTMyIGRvcwotLSMgICBDUDkyMiAgICAgICAgICAgICAgICAgICAgICAgYWl4Ci0tIyAgIENQOTMyICAgICAgICAgICAgICAgICAgICAgICBhaXggd29lMzIgZG9zCi0tIyAgIENQOTQzICAgICAgICAgICAgICAgICAgICAgICBhaXgKLS0jICAgQ1A5NDkgICAgICAgICAgICAgICAgICAgICAgIG9zZiB3b2UzMiBkb3MKLS0jICAgQ1A5NTAgICAgICAgICAgICAgICAgICAgICAgIHdvZTMyIGRvcwotLSMgICBDUDEwNDYgICAgICAgICAgICAgICAgICAgICAgYWl4Ci0tIyAgIENQMTEyNCAgICAgICAgICAgICAgICAgICAgICBhaXgKLS0jICAgQ1AxMTI1ICAgICAgICAgICAgICAgICAgICAgIGRvcwotLSMgICBDUDExMjkgICAgICAgICAgICAgICAgICAgICAgYWl4Ci0tIyAgIENQMTI1MCAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotLSMgICBDUDEyNTEgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcyBuZXRic2QgZGFyd2luIHdvZTMyCi0tIyAgIENQMTI1MiAgICAgICAgICAgICAgICAgICAgICBhaXggd29lMzIKLS0jICAgQ1AxMjUzICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCi0tIyAgIENQMTI1NCAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotLSMgICBDUDEyNTUgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgd29lMzIKLS0jICAgQ1AxMjU2ICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCi0tIyAgIENQMTI1NyAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotLSMgICBHQjIzMTIgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBzb2xhcmlzIGZyZWVic2QgbmV0YnNkIGRhcndpbgotLSMgICBFVUMtSlAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIG5ldGJzZCBkYXJ3aW4KLS0jICAgRVVDLUtSICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0tIyAgIEVVQy1UVyAgICAgICAgICAgICAgICAgICAgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIG5ldGJzZAotLSMgICBCSUc1ICAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0tIyAgIEJJRzUtSEtTQ1MgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzCi0tIyAgIEdCSyAgICAgICAgICAgICAgICAgICAgICAgICBnbGliYyBhaXggb3NmIHNvbGFyaXMgd29lMzIgZG9zCi0tIyAgIEdCMTgwMzAgICAgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzIG5ldGJzZAotLSMgICBTSElGVF9KSVMgICAgICAgICAgICAgICBZICAgaHB1eCBvc2Ygc29sYXJpcyBmcmVlYnNkIG5ldGJzZCBkYXJ3aW4KLS0jICAgSk9IQUIgICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHNvbGFyaXMgd29lMzIKLS0jICAgVElTLTYyMCAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBocHV4IG9zZiBzb2xhcmlzCi0tIyAgIFZJU0NJSSAgICAgICAgICAgICAgICAgIFkgICBnbGliYwotLSMgICBUQ1ZONTcxMi0xICAgICAgICAgICAgICAgICAgZ2xpYmMKLS0jICAgR0VPUkdJQU4tUFMgICAgICAgICAgICAgICAgIGdsaWJjCi0tIyAgIEhQLVJPTUFOOCAgICAgICAgICAgICAgICAgICBocHV4Ci0tIyAgIEhQLUFSQUJJQzggICAgICAgICAgICAgICAgICBocHV4Ci0tIyAgIEhQLUdSRUVLOCAgICAgICAgICAgICAgICAgICBocHV4Ci0tIyAgIEhQLUhFQlJFVzggICAgICAgICAgICAgICAgICBocHV4Ci0tIyAgIEhQLVRVUktJU0g4ICAgICAgICAgICAgICAgICBocHV4Ci0tIyAgIEhQLUtBTkE4ICAgICAgICAgICAgICAgICAgICBocHV4Ci0tIyAgIERFQy1LQU5KSSAgICAgICAgICAgICAgICAgICBvc2YKLS0jICAgREVDLUhBTllVICAgICAgICAgICAgICAgICAgIG9zZgotLSMgICBVVEYtOCAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMgbmV0YnNkIGRhcndpbgotLSMKLS0jIE5vdGU6IE5hbWVzIHdoaWNoIGFyZSBub3QgbWFya2VkIGFzIGJlaW5nIGEgTUlNRSBuYW1lIHNob3VsZCBub3QgYmUgdXNlZCBpbgotLSMgSW50ZXJuZXQgcHJvdG9jb2xzIGZvciBpbmZvcm1hdGlvbiBpbnRlcmNoYW5nZSAobWFpbCwgbmV3cywgZXRjLikuCi0tIwotLSMgTm90ZTogQVNDSUkgYW5kIEFOU0lfWDMuNC0xOTY4IGFyZSBzeW5vbnltb3VzIGNhbm9uaWNhbCBuYW1lcy4gQXBwbGljYXRpb25zCi0tIyBtdXN0IHVuZGVyc3RhbmQgYm90aCBuYW1lcyBhbmQgdHJlYXQgdGhlbSBhcyBlcXVpdmFsZW50LgotLSMKLS0jIFRoZSBmaXJzdCBhcmd1bWVudCBwYXNzZWQgdG8gdGhpcyBmaWxlIGlzIHRoZSBjYW5vbmljYWwgaG9zdCBzcGVjaWZpY2F0aW9uLAotLSMgICAgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KLS0jIG9yCi0tIyAgICBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KLS0KLS1ob3N0PSIkMSIKLS1vcz1gZWNobyAiJGhvc3QiIHwgc2VkIC1lICdzL15bXi1dKi1bXi1dKi1cKC4qXCkkL1wxLydgCi0tZWNobyAiIyBUaGlzIGZpbGUgY29udGFpbnMgYSB0YWJsZSBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcgYWxpYXNlcywiCi0tZWNobyAiIyBzdWl0YWJsZSBmb3Igb3BlcmF0aW5nIHN5c3RlbSAnJHtvc30nLiIKLS1lY2hvICIjIEl0IHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIGNvbmZpZy5jaGFyc2V0LiIKLS0jIExpc3Qgb2YgcmVmZXJlbmNlcywgdXBkYXRlZCBkdXJpbmcgaW5zdGFsbGF0aW9uOgotLWVjaG8gIiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAiCi0tY2FzZSAiJG9zIiBpbgotLSAgICBsaW51eC1nbnVsaWJjMSopCi0tCSMgTGludXggbGliYzUgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKLS0JIyBsb2NhbGNoYXJzZXQuYyBmYWxscyBiYWNrIHRvIHVzaW5nIHRoZSBmdWxsIGxvY2FsZSBuYW1lCi0tCSMgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotLQllY2hvICJDIEFTQ0lJIgotLQllY2hvICJQT1NJWCBBU0NJSSIKLS0JZm9yIGwgaW4gYWYgYWZfWkEgY2EgY2FfRVMgZGEgZGFfREsgZGUgZGVfQVQgZGVfQkUgZGVfQ0ggZGVfREUgZGVfTFUgXAotLQkgICAgICAgICBlbiBlbl9BVSBlbl9CVyBlbl9DQSBlbl9ESyBlbl9HQiBlbl9JRSBlbl9OWiBlbl9VUyBlbl9aQSBcCi0tCSAgICAgICAgIGVuX1pXIGVzIGVzX0FSIGVzX0JPIGVzX0NMIGVzX0NPIGVzX0RPIGVzX0VDIGVzX0VTIGVzX0dUIFwKLS0JICAgICAgICAgZXNfSE4gZXNfTVggZXNfUEEgZXNfUEUgZXNfUFkgZXNfU1YgZXNfVVMgZXNfVVkgZXNfVkUgZXQgXAotLQkgICAgICAgICBldF9FRSBldSBldV9FUyBmaSBmaV9GSSBmbyBmb19GTyBmciBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBcCi0tCSAgICAgICAgIGZyX0xVIGdhIGdhX0lFIGdsIGdsX0VTIGlkIGlkX0lEIGluIGluX0lEIGlzIGlzX0lTIGl0IGl0X0NIIFwKLS0JICAgICAgICAgaXRfSVQga2wga2xfR0wgbmwgbmxfQkUgbmxfTkwgbm8gbm9fTk8gcHQgcHRfQlIgcHRfUFQgc3YgXAotLQkgICAgICAgICBzdl9GSSBzdl9TRTsgZG8KLS0JICBlY2hvICIkbCBJU08tODg1OS0xIgotLQkgIGVjaG8gIiRsLmlzby04ODU5LTEgSVNPLTg4NTktMSIKLS0JICBlY2hvICIkbC5pc28tODg1OS0xNSBJU08tODg1OS0xNSIKLS0JICBlY2hvICIkbC5pc28tODg1OS0xNUBldXJvIElTTy04ODU5LTE1IgotLQkgIGVjaG8gIiRsQGV1cm8gSVNPLTg4NTktMTUiCi0tCSAgZWNobyAiJGwuY3AtNDM3IENQNDM3IgotLQkgIGVjaG8gIiRsLmNwLTg1MCBDUDg1MCIKLS0JICBlY2hvICIkbC5jcC0xMjUyIENQMTI1MiIKLS0JICBlY2hvICIkbC5jcC0xMjUyQGV1cm8gQ1AxMjUyIgotLQkgICNlY2hvICIkbC5hdGFyaS1zdCBBVEFSSS1TVCIgIyBub3QgYSBjb21tb25seSB1c2VkIGVuY29kaW5nCi0tCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0tCSAgZWNobyAiJGwudXRmLThAZXVybyBVVEYtOCIKLS0JZG9uZQotLQlmb3IgbCBpbiBjcyBjc19DWiBociBocl9IUiBodSBodV9IVSBwbCBwbF9QTCBybyByb19STyBzayBza19TSyBzbCBcCi0tCSAgICAgICAgIHNsX1NJIHNyIHNyX0NTIHNyX1lVOyBkbwotLQkgIGVjaG8gIiRsIElTTy04ODU5LTIiCi0tCSAgZWNobyAiJGwuaXNvLTg4NTktMiBJU08tODg1OS0yIgotLQkgIGVjaG8gIiRsLmNwLTg1MiBDUDg1MiIKLS0JICBlY2hvICIkbC5jcC0xMjUwIENQMTI1MCIKLS0JICBlY2hvICIkbC51dGYtOCBVVEYtOCIKLS0JZG9uZQotLQlmb3IgbCBpbiBtayBta19NSyBydSBydV9SVTsgZG8KLS0JICBlY2hvICIkbCBJU08tODg1OS01IgotLQkgIGVjaG8gIiRsLmlzby04ODU5LTUgSVNPLTg4NTktNSIKLS0JICBlY2hvICIkbC5rb2k4LXIgS09JOC1SIgotLQkgIGVjaG8gIiRsLmNwLTg2NiBDUDg2NiIKLS0JICBlY2hvICIkbC5jcC0xMjUxIENQMTI1MSIKLS0JICBlY2hvICIkbC51dGYtOCBVVEYtOCIKLS0JZG9uZQotLQlmb3IgbCBpbiBhciBhcl9TQTsgZG8KLS0JICBlY2hvICIkbCBJU08tODg1OS02IgotLQkgIGVjaG8gIiRsLmlzby04ODU5LTYgSVNPLTg4NTktNiIKLS0JICBlY2hvICIkbC5jcC04NjQgQ1A4NjQiCi0tCSAgI2VjaG8gIiRsLmNwLTg2OCBDUDg2OCIgIyBub3QgYSBjb21tb25seSB1c2VkIGVuY29kaW5nCi0tCSAgZWNobyAiJGwuY3AtMTI1NiBDUDEyNTYiCi0tCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0tCWRvbmUKLS0JZm9yIGwgaW4gZWwgZWxfR1IgZ3IgZ3JfR1I7IGRvCi0tCSAgZWNobyAiJGwgSVNPLTg4NTktNyIKLS0JICBlY2hvICIkbC5pc28tODg1OS03IElTTy04ODU5LTciCi0tCSAgZWNobyAiJGwuY3AtODY5IENQODY5IgotLQkgIGVjaG8gIiRsLmNwLTEyNTMgQ1AxMjUzIgotLQkgIGVjaG8gIiRsLmNwLTEyNTNAZXVybyBDUDEyNTMiCi0tCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0tCSAgZWNobyAiJGwudXRmLThAZXVybyBVVEYtOCIKLS0JZG9uZQotLQlmb3IgbCBpbiBoZSBoZV9JTCBpdyBpd19JTDsgZG8KLS0JICBlY2hvICIkbCBJU08tODg1OS04IgotLQkgIGVjaG8gIiRsLmlzby04ODU5LTggSVNPLTg4NTktOCIKLS0JICBlY2hvICIkbC5jcC04NjIgQ1A4NjIiCi0tCSAgZWNobyAiJGwuY3AtMTI1NSBDUDEyNTUiCi0tCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0tCWRvbmUKLS0JZm9yIGwgaW4gdHIgdHJfVFI7IGRvCi0tCSAgZWNobyAiJGwgSVNPLTg4NTktOSIKLS0JICBlY2hvICIkbC5pc28tODg1OS05IElTTy04ODU5LTkiCi0tCSAgZWNobyAiJGwuY3AtODU3IENQODU3IgotLQkgIGVjaG8gIiRsLmNwLTEyNTQgQ1AxMjU0IgotLQkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgotLQlkb25lCi0tCWZvciBsIGluIGx0IGx0X0xUIGx2IGx2X0xWOyBkbwotLQkgICNlY2hvICIkbCBCQUxUSUMiICMgbm90IGEgY29tbW9ubHkgdXNlZCBlbmNvZGluZywgd3JvbmcgZW5jb2RpbmcgbmFtZQotLQkgIGVjaG8gIiRsIElTTy04ODU5LTEzIgotLQlkb25lCi0tCWZvciBsIGluIHJ1X1VBIHVrIHVrX1VBOyBkbwotLQkgIGVjaG8gIiRsIEtPSTgtVSIKLS0JZG9uZQotLQlmb3IgbCBpbiB6aCB6aF9DTjsgZG8KLS0JICAjZWNobyAiJGwgR0JfMjMxMi04MCIgIyBub3QgYSBjb21tb25seSB1c2VkIGVuY29kaW5nLCB3cm9uZyBlbmNvZGluZyBuYW1lCi0tCSAgZWNobyAiJGwgR0IyMzEyIgotLQlkb25lCi0tCWZvciBsIGluIGphIGphX0pQIGphX0pQLkVVQzsgZG8KLS0JICBlY2hvICIkbCBFVUMtSlAiCi0tCWRvbmUKLS0JZm9yIGwgaW4ga28ga29fS1I7IGRvCi0tCSAgZWNobyAiJGwgRVVDLUtSIgotLQlkb25lCi0tCWZvciBsIGluIHRoIHRoX1RIOyBkbwotLQkgIGVjaG8gIiRsIFRJUy02MjAiCi0tCWRvbmUKLS0JZm9yIGwgaW4gZmEgZmFfSVI7IGRvCi0tCSAgI2VjaG8gIiRsIElTSVJJLTMzNDIiICMgYSBicm9rZW4gZW5jb2RpbmcKLS0JICBlY2hvICIkbC51dGYtOCBVVEYtOCIKLS0JZG9uZQotLQk7OwotLSAgICBsaW51eCogfCAqLWdudSopCi0tCSMgV2l0aCBnbGliYy0yLjEgb3IgbmV3ZXIsIHdlIGRvbid0IG5lZWQgYW55IGNhbm9uaWNhbGl6YXRpb24sCi0tCSMgYmVjYXVzZSBnbGliYyBoYXMgaWNvbnYgYW5kIGJvdGggZ2xpYmMgYW5kIGxpYmljb252IHN1cHBvcnQgYWxsCi0tCSMgR05VIGNhbm9uaWNhbCBuYW1lcyBkaXJlY3RseS4gVGhlcmVmb3JlLCB0aGUgTWFrZWZpbGUgZG9lcyBub3QKLS0JIyBuZWVkIHRvIGluc3RhbGwgdGhlIGFsaWFzIGZpbGUgYXQgYWxsLgotLQkjIFRoZSBmb2xsb3dpbmcgYXBwbGllcyBvbmx5IHRvIGdsaWJjLTIuMC54IGFuZCBvbGRlciBsaWJjcy4KLS0JZWNobyAiSVNPXzY0Ni5JUlY6MTk4MyBBU0NJSSIKLS0JOzsKLS0gICAgYWl4KikKLS0JZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCi0tCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgotLQllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKLS0JZWNobyAiSVNPODg1OS02IElTTy04ODU5LTYiCi0tCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgotLQllY2hvICJJU084ODU5LTggSVNPLTg4NTktOCIKLS0JZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCi0tCWVjaG8gIklTTzg4NTktMTUgSVNPLTg4NTktMTUiCi0tCWVjaG8gIklCTS04NTAgQ1A4NTAiCi0tCWVjaG8gIklCTS04NTYgQ1A4NTYiCi0tCWVjaG8gIklCTS05MjEgSVNPLTg4NTktMTMiCi0tCWVjaG8gIklCTS05MjIgQ1A5MjIiCi0tCWVjaG8gIklCTS05MzIgQ1A5MzIiCi0tCWVjaG8gIklCTS05NDMgQ1A5NDMiCi0tCWVjaG8gIklCTS0xMDQ2IENQMTA0NiIKLS0JZWNobyAiSUJNLTExMjQgQ1AxMTI0IgotLQllY2hvICJJQk0tMTEyOSBDUDExMjkiCi0tCWVjaG8gIklCTS0xMjUyIENQMTI1MiIKLS0JZWNobyAiSUJNLWV1Y0NOIEdCMjMxMiIKLS0JZWNobyAiSUJNLWV1Y0pQIEVVQy1KUCIKLS0JZWNobyAiSUJNLWV1Y0tSIEVVQy1LUiIKLS0JZWNobyAiSUJNLWV1Y1RXIEVVQy1UVyIKLS0JZWNobyAiYmlnNSBCSUc1IgotLQllY2hvICJHQksgR0JLIgotLQllY2hvICJUSVMtNjIwIFRJUy02MjAiCi0tCWVjaG8gIlVURi04IFVURi04IgotLQk7OwotLSAgICBocHV4KikKLS0JZWNobyAiaXNvODg1OTEgSVNPLTg4NTktMSIKLS0JZWNobyAiaXNvODg1OTIgSVNPLTg4NTktMiIKLS0JZWNobyAiaXNvODg1OTUgSVNPLTg4NTktNSIKLS0JZWNobyAiaXNvODg1OTYgSVNPLTg4NTktNiIKLS0JZWNobyAiaXNvODg1OTcgSVNPLTg4NTktNyIKLS0JZWNobyAiaXNvODg1OTggSVNPLTg4NTktOCIKLS0JZWNobyAiaXNvODg1OTkgSVNPLTg4NTktOSIKLS0JZWNobyAiaXNvODg1OTE1IElTTy04ODU5LTE1IgotLQllY2hvICJyb21hbjggSFAtUk9NQU44IgotLQllY2hvICJhcmFiaWM4IEhQLUFSQUJJQzgiCi0tCWVjaG8gImdyZWVrOCBIUC1HUkVFSzgiCi0tCWVjaG8gImhlYnJldzggSFAtSEVCUkVXOCIKLS0JZWNobyAidHVya2lzaDggSFAtVFVSS0lTSDgiCi0tCWVjaG8gImthbmE4IEhQLUtBTkE4IgotLQllY2hvICJ0aXM2MjAgVElTLTYyMCIKLS0JZWNobyAiYmlnNSBCSUc1IgotLQllY2hvICJldWNKUCBFVUMtSlAiCi0tCWVjaG8gImV1Y0tSIEVVQy1LUiIKLS0JZWNobyAiZXVjVFcgRVVDLVRXIgotLQllY2hvICJocDE1Q04gR0IyMzEyIgotLQkjZWNobyAiY2NkYyA/IiAjIHdoYXQgaXMgdGhpcz8KLS0JZWNobyAiU0pJUyBTSElGVF9KSVMiCi0tCWVjaG8gInV0ZjggVVRGLTgiCi0tCTs7Ci0tICAgIGlyaXgqKQotLQllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKLS0JZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCi0tCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgotLQllY2hvICJJU084ODU5LTcgSVNPLTg4NTktNyIKLS0JZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCi0tCWVjaG8gImV1Y0NOIEdCMjMxMiIKLS0JZWNobyAiZXVjSlAgRVVDLUpQIgotLQllY2hvICJldWNLUiBFVUMtS1IiCi0tCWVjaG8gImV1Y1RXIEVVQy1UVyIKLS0JOzsKLS0gICAgb3NmKikKLS0JZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCi0tCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgotLQllY2hvICJJU084ODU5LTQgSVNPLTg4NTktNCIKLS0JZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCi0tCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgotLQllY2hvICJJU084ODU5LTggSVNPLTg4NTktOCIKLS0JZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCi0tCWVjaG8gIklTTzg4NTktMTUgSVNPLTg4NTktMTUiCi0tCWVjaG8gImNwODUwIENQODUwIgotLQllY2hvICJiaWc1IEJJRzUiCi0tCWVjaG8gImRlY2hhbnl1IERFQy1IQU5ZVSIKLS0JZWNobyAiZGVjaGFuemkgR0IyMzEyIgotLQllY2hvICJkZWNrYW5qaSBERUMtS0FOSkkiCi0tCWVjaG8gImRlY2tvcmVhbiBFVUMtS1IiCi0tCWVjaG8gImV1Y0pQIEVVQy1KUCIKLS0JZWNobyAiZXVjS1IgRVVDLUtSIgotLQllY2hvICJldWNUVyBFVUMtVFciCi0tCWVjaG8gIkdCSyBHQksiCi0tCWVjaG8gIktTQzU2MDEgQ1A5NDkiCi0tCWVjaG8gInNkZWNrYW5qaSBFVUMtSlAiCi0tCWVjaG8gIlNKSVMgU0hJRlRfSklTIgotLQllY2hvICJUQUNUSVMgVElTLTYyMCIKLS0JZWNobyAiVVRGLTggVVRGLTgiCi0tCTs7Ci0tICAgIHNvbGFyaXMqKQotLQllY2hvICI2NDYgQVNDSUkiCi0tCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgotLQllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKLS0JZWNobyAiSVNPODg1OS0zIElTTy04ODU5LTMiCi0tCWVjaG8gIklTTzg4NTktNCBJU08tODg1OS00IgotLQllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKLS0JZWNobyAiSVNPODg1OS02IElTTy04ODU5LTYiCi0tCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgotLQllY2hvICJJU084ODU5LTggSVNPLTg4NTktOCIKLS0JZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCi0tCWVjaG8gIklTTzg4NTktMTUgSVNPLTg4NTktMTUiCi0tCWVjaG8gImtvaTgtciBLT0k4LVIiCi0tCWVjaG8gImFuc2ktMTI1MSBDUDEyNTEiCi0tCWVjaG8gIkJJRzUgQklHNSIKLS0JZWNobyAiQmlnNS1IS1NDUyBCSUc1LUhLU0NTIgotLQllY2hvICJnYjIzMTIgR0IyMzEyIgotLQllY2hvICJHQksgR0JLIgotLQllY2hvICJHQjE4MDMwIEdCMTgwMzAiCi0tCWVjaG8gImNuczExNjQzIEVVQy1UVyIKLS0JZWNobyAiNTYwMSBFVUMtS1IiCi0tCWVjaG8gImtvX0tSLmpvaGFwOTIgSk9IQUIiCi0tCWVjaG8gImV1Y0pQIEVVQy1KUCIKLS0JZWNobyAiUENLIFNISUZUX0pJUyIKLS0JZWNobyAiVElTNjIwLjI1MzMgVElTLTYyMCIKLS0JI2VjaG8gInN1bl9ldV9ncmVlayA/IiAjIHdoYXQgaXMgdGhpcz8KLS0JZWNobyAiVVRGLTggVVRGLTgiCi0tCTs7Ci0tICAgIGZyZWVic2QqIHwgb3MyKikKLS0JIyBGcmVlQlNEIDQuMiBkb2Vzbid0IGhhdmUgbmxfbGFuZ2luZm8oQ09ERVNFVCk7IHRoZXJlZm9yZQotLQkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKLS0JIyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0tCSMgTGlrZXdpc2UgZm9yIE9TLzIuIE9TLzIgaGFzIFhGcmVlODYganVzdCBsaWtlIEZyZWVCU0QuIEp1c3QKLS0JIyByZXVzZSBGcmVlQlNEJ3MgbG9jYWxlIGRhdGEgZm9yIE9TLzIuCi0tCWVjaG8gIkMgQVNDSUkiCi0tCWVjaG8gIlVTLUFTQ0lJIEFTQ0lJIgotLQlmb3IgbCBpbiBsYV9MTiBsdF9MTjsgZG8KLS0JICBlY2hvICIkbC5BU0NJSSBBU0NJSSIKLS0JZG9uZQotLQlmb3IgbCBpbiBkYV9ESyBkZV9BVCBkZV9DSCBkZV9ERSBlbl9BVSBlbl9DQSBlbl9HQiBlbl9VUyBlc19FUyBcCi0tCSAgICAgICAgIGZpX0ZJIGZyX0JFIGZyX0NBIGZyX0NIIGZyX0ZSIGlzX0lTIGl0X0NIIGl0X0lUIGxhX0xOIFwKLS0JICAgICAgICAgbHRfTE4gbmxfQkUgbmxfTkwgbm9fTk8gcHRfUFQgc3ZfU0U7IGRvCi0tCSAgZWNobyAiJGwuSVNPXzg4NTktMSBJU08tODg1OS0xIgotLQkgIGVjaG8gIiRsLkRJU184ODU5LTE1IElTTy04ODU5LTE1IgotLQlkb25lCi0tCWZvciBsIGluIGNzX0NaIGhyX0hSIGh1X0hVIGxhX0xOIGx0X0xOIHBsX1BMIHNsX1NJOyBkbwotLQkgIGVjaG8gIiRsLklTT184ODU5LTIgSVNPLTg4NTktMiIKLS0JZG9uZQotLQlmb3IgbCBpbiBsYV9MTiBsdF9MVDsgZG8KLS0JICBlY2hvICIkbC5JU09fODg1OS00IElTTy04ODU5LTQiCi0tCWRvbmUKLS0JZm9yIGwgaW4gcnVfUlUgcnVfU1U7IGRvCi0tCSAgZWNobyAiJGwuS09JOC1SIEtPSTgtUiIKLS0JICBlY2hvICIkbC5JU09fODg1OS01IElTTy04ODU5LTUiCi0tCSAgZWNobyAiJGwuQ1A4NjYgQ1A4NjYiCi0tCWRvbmUKLS0JZWNobyAidWtfVUEuS09JOC1VIEtPSTgtVSIKLS0JZWNobyAiemhfVFcuQklHNSBCSUc1IgotLQllY2hvICJ6aF9UVy5CaWc1IEJJRzUiCi0tCWVjaG8gInpoX0NOLkVVQyBHQjIzMTIiCi0tCWVjaG8gImphX0pQLkVVQyBFVUMtSlAiCi0tCWVjaG8gImphX0pQLlNKSVMgU0hJRlRfSklTIgotLQllY2hvICJqYV9KUC5TaGlmdF9KSVMgU0hJRlRfSklTIgotLQllY2hvICJrb19LUi5FVUMgRVVDLUtSIgotLQk7OwotLSAgICBuZXRic2QqKQotLQllY2hvICI2NDYgQVNDSUkiCi0tCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgotLQllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKLS0JZWNobyAiSVNPODg1OS00IElTTy04ODU5LTQiCi0tCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgotLQllY2hvICJJU084ODU5LTcgSVNPLTg4NTktNyIKLS0JZWNobyAiSVNPODg1OS0xMyBJU08tODg1OS0xMyIKLS0JZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKLS0JZWNobyAiZXVjQ04gR0IyMzEyIgotLQllY2hvICJldWNKUCBFVUMtSlAiCi0tCWVjaG8gImV1Y0tSIEVVQy1LUiIKLS0JZWNobyAiZXVjVFcgRVVDLVRXIgotLQllY2hvICJCSUc1IEJJRzUiCi0tCWVjaG8gIlNKSVMgU0hJRlRfSklTIgotLQk7OwotLSAgICBkYXJ3aW5bNTZdKikKLS0JIyBEYXJ3aW4gNi44IGRvZXNuJ3QgaGF2ZSBubF9sYW5naW5mbyhDT0RFU0VUKTsgdGhlcmVmb3JlCi0tCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQotLQkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLS0JZWNobyAiQyBBU0NJSSIKLS0JZm9yIGwgaW4gZW5fQVUgZW5fQ0EgZW5fR0IgZW5fVVMgbGFfTE47IGRvCi0tCSAgZWNobyAiJGwuVVMtQVNDSUkgQVNDSUkiCi0tCWRvbmUKLS0JZm9yIGwgaW4gZGFfREsgZGVfQVQgZGVfQ0ggZGVfREUgZW5fQVUgZW5fQ0EgZW5fR0IgZW5fVVMgZXNfRVMgXAotLQkgICAgICAgICBmaV9GSSBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBpc19JUyBpdF9DSCBpdF9JVCBubF9CRSBcCi0tCSAgICAgICAgIG5sX05MIG5vX05PIHB0X1BUIHN2X1NFOyBkbwotLQkgIGVjaG8gIiRsIElTTy04ODU5LTEiCi0tCSAgZWNobyAiJGwuSVNPODg1OS0xIElTTy04ODU5LTEiCi0tCSAgZWNobyAiJGwuSVNPODg1OS0xNSBJU08tODg1OS0xNSIKLS0JZG9uZQotLQlmb3IgbCBpbiBsYV9MTjsgZG8KLS0JICBlY2hvICIkbC5JU084ODU5LTEgSVNPLTg4NTktMSIKLS0JICBlY2hvICIkbC5JU084ODU5LTE1IElTTy04ODU5LTE1IgotLQlkb25lCi0tCWZvciBsIGluIGNzX0NaIGhyX0hSIGh1X0hVIGxhX0xOIHBsX1BMIHNsX1NJOyBkbwotLQkgIGVjaG8gIiRsLklTTzg4NTktMiBJU08tODg1OS0yIgotLQlkb25lCi0tCWZvciBsIGluIGxhX0xOIGx0X0xUOyBkbwotLQkgIGVjaG8gIiRsLklTTzg4NTktNCBJU08tODg1OS00IgotLQlkb25lCi0tCWZvciBsIGluIHJ1X1JVOyBkbwotLQkgIGVjaG8gIiRsLktPSTgtUiBLT0k4LVIiCi0tCSAgZWNobyAiJGwuSVNPODg1OS01IElTTy04ODU5LTUiCi0tCSAgZWNobyAiJGwuQ1A4NjYgQ1A4NjYiCi0tCWRvbmUKLS0JZm9yIGwgaW4gYmdfQkc7IGRvCi0tCSAgZWNobyAiJGwuQ1AxMjUxIENQMTI1MSIKLS0JZG9uZQotLQllY2hvICJ1a19VQS5LT0k4LVUgS09JOC1VIgotLQllY2hvICJ6aF9UVy5CSUc1IEJJRzUiCi0tCWVjaG8gInpoX1RXLkJpZzUgQklHNSIKLS0JZWNobyAiemhfQ04uRVVDIEdCMjMxMiIKLS0JZWNobyAiamFfSlAuRVVDIEVVQy1KUCIKLS0JZWNobyAiamFfSlAuU0pJUyBTSElGVF9KSVMiCi0tCWVjaG8gImtvX0tSLkVVQyBFVUMtS1IiCi0tCTs7Ci0tICAgIGRhcndpbiopCi0tCSMgRGFyd2luIDcuNSBoYXMgbmxfbGFuZ2luZm8oQ09ERVNFVCksIGJ1dCBpdCBpcyB1c2VsZXNzOgotLQkjIC0gSXQgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gTEFORyBpcyBzZXQgdG8gYSBsb2NhbGUgb2YgdGhlCi0tCSMgICBmb3JtIGxsX0NDLCBhbHRob3VnaCBsbF9DQy9MQ19DVFlQRSBpcyBhIHN5bWxpbmsgdG8gYW4gVVRGLTgKLS0JIyAgIExDX0NUWVBFIGZpbGUuCi0tCSMgLSBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIExBTkcsIExDX0NUWVBFLCBMQ19BTEwgYXJlIG5vdCBzZXQgYnkKLS0JIyAgIHRoZSBzeXN0ZW07IG5sX2xhbmdpbmZvKENPREVTRVQpIHJldHVybnMgIlVTLUFTQ0lJIiBpbiB0aGlzIGNhc2UuCi0tCSMgLSBUaGUgZG9jdW1lbnRhdGlvbiBzYXlzOgotLQkjICAgICAiLi4uIGFsbCBjb2RlIHRoYXQgY2FsbHMgQlNEIHN5c3RlbSByb3V0aW5lcyBzaG91bGQgZW5zdXJlCi0tCSMgICAgICB0aGF0IHRoZSBjb25zdCAqY2hhciBwYXJhbWV0ZXJzIG9mIHRoZXNlIHJvdXRpbmVzIGFyZSBpbiBVVEYtOAotLQkjICAgICAgZW5jb2RpbmcuIEFsbCBCU0Qgc3lzdGVtIGZ1bmN0aW9ucyBleHBlY3QgdGhlaXIgc3RyaW5nCi0tCSMgICAgICBwYXJhbWV0ZXJzIHRvIGJlIGluIFVURi04IGVuY29kaW5nIGFuZCBub3RoaW5nIGVsc2UuIgotLQkjICAgSXQgYWxzbyBzYXlzCi0tCSMgICAgICJBbiBhZGRpdGlvbmFsIGNhdmVhdCBpcyB0aGF0IHN0cmluZyBwYXJhbWV0ZXJzIGZvciBmaWxlcywKLS0JIyAgICAgIHBhdGhzLCBhbmQgb3RoZXIgZmlsZS1zeXN0ZW0gZW50aXRpZXMgbXVzdCBiZSBpbiBjYW5vbmljYWwKLS0JIyAgICAgIFVURi04LiBJbiBhIGNhbm9uaWNhbCBVVEYtOCBVbmljb2RlIHN0cmluZywgYWxsIGRlY29tcG9zYWJsZQotLQkjICAgICAgY2hhcmFjdGVycyBhcmUgZGVjb21wb3NlZCAuLi4iCi0tCSMgICBidXQgdGhpcyBpcyBub3QgdHJ1ZTogWW91IGNhbiBwYXNzIG5vbi1kZWNvbXBvc2VkIFVURi04IHN0cmluZ3MKLS0JIyAgIHRvIGZpbGUgc3lzdGVtIGZ1bmN0aW9ucywgYW5kIGl0IGlzIHRoZSBPUyB3aGljaCB3aWxsIGNvbnZlcnQKLS0JIyAgIHRoZW0gdG8gZGVjb21wb3NlZCBVVEYtOCBiZWZvcmUgYWNjZXNzaW5nIHRoZSBmaWxlIHN5c3RlbS4KLS0JIyAtIFRoZSBBcHBsZSBUZXJtaW5hbCBhcHBsaWNhdGlvbiBkaXNwbGF5cyBVVEYtOCBieSBkZWZhdWx0LgotLQkjIC0gSG93ZXZlciwgb3RoZXIgYXBwbGljYXRpb25zIGFyZSBmcmVlIHRvIHVzZSBkaWZmZXJlbnQgZW5jb2RpbmdzOgotLQkjICAgLSB4dGVybSB1c2VzIElTTy04ODU5LTEgYnkgZGVmYXVsdC4KLS0JIyAgIC0gVGV4dEVkaXQgdXNlcyBNYWNSb21hbiBieSBkZWZhdWx0LgotLQkjIFdlIHByZWZlciBVVEYtOCBvdmVyIGRlY29tcG9zZWQgVVRGLTgtTUFDIGJlY2F1c2Ugb25lIHNob3VsZAotLQkjIG1pbmltaXplIHRoZSB1c2Ugb2YgZGVjb21wb3NlZCBVbmljb2RlLiBVbmZvcnR1bmF0ZWx5LCB0aHJvdWdoIHRoZQotLQkjIERhcndpbiBmaWxlIHN5c3RlbSwgZGVjb21wb3NlZCBVVEYtOCBzdHJpbmdzIGFyZSBsZWFrZWQgaW50byB1c2VyCi0tCSMgc3BhY2UgbmV2ZXJ0aGVsZXNzLgotLQllY2hvICIqIFVURi04IgotLQk7OwotLSAgICBiZW9zKikKLS0JIyBCZU9TIGhhcyBhIHNpbmdsZSBsb2NhbGUsIGFuZCBpdCBoYXMgVVRGLTggZW5jb2RpbmcuCi0tCWVjaG8gIiogVVRGLTgiCi0tCTs7Ci0tICAgIG1zZG9zZGpncHAqKQotLQkjIERKR1BQIDIuMDMgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKLS0JIyBsb2NhbGNoYXJzZXQuYyBmYWxscyBiYWNrIHRvIHVzaW5nIHRoZSBmdWxsIGxvY2FsZSBuYW1lCi0tCSMgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotLQllY2hvICIjIgotLQllY2hvICIjIFRoZSBlbmNvZGluZ3MgZ2l2ZW4gaGVyZSBtYXkgbm90IGFsbCBiZSBjb3JyZWN0LiIKLS0JZWNobyAiIyBJZiB5b3UgZmluZCB0aGF0IHRoZSBlbmNvZGluZyBnaXZlbiBmb3IgeW91ciBsYW5ndWFnZSBhbmQiCi0tCWVjaG8gIiMgY291bnRyeSBpcyBub3QgdGhlIG9uZSB5b3VyIERPUyBtYWNoaW5lIGFjdHVhbGx5IHVzZXMsIGp1c3QiCi0tCWVjaG8gIiMgY29ycmVjdCBpdCBpbiB0aGlzIGZpbGUsIGFuZCBzZW5kIGEgbWFpbCB0byIKLS0JZWNobyAiIyBKdWFuIE1hbnVlbCBHdWVycmVybyA8anVhbi5ndWVycmVyb0BnbXguZGU+IgotLQllY2hvICIjIGFuZCBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4uIgotLQllY2hvICIjIgotLQllY2hvICJDIEFTQ0lJIgotLQkjIElTTy04ODU5LTEgbGFuZ3VhZ2VzCi0tCWVjaG8gImNhIENQODUwIgotLQllY2hvICJjYV9FUyBDUDg1MCIKLS0JZWNobyAiZGEgQ1A4NjUiICAgICMgbm90IENQODUwID8/Ci0tCWVjaG8gImRhX0RLIENQODY1IiAjIG5vdCBDUDg1MCA/PwotLQllY2hvICJkZSBDUDg1MCIKLS0JZWNobyAiZGVfQVQgQ1A4NTAiCi0tCWVjaG8gImRlX0NIIENQODUwIgotLQllY2hvICJkZV9ERSBDUDg1MCIKLS0JZWNobyAiZW4gQ1A4NTAiCi0tCWVjaG8gImVuX0FVIENQODUwIiAjIG5vdCBDUDQzNyA/PwotLQllY2hvICJlbl9DQSBDUDg1MCIKLS0JZWNobyAiZW5fR0IgQ1A4NTAiCi0tCWVjaG8gImVuX05aIENQNDM3IgotLQllY2hvICJlbl9VUyBDUDQzNyIKLS0JZWNobyAiZW5fWkEgQ1A4NTAiICMgbm90IENQNDM3ID8/Ci0tCWVjaG8gImVzIENQODUwIgotLQllY2hvICJlc19BUiBDUDg1MCIKLS0JZWNobyAiZXNfQk8gQ1A4NTAiCi0tCWVjaG8gImVzX0NMIENQODUwIgotLQllY2hvICJlc19DTyBDUDg1MCIKLS0JZWNobyAiZXNfQ1IgQ1A4NTAiCi0tCWVjaG8gImVzX0NVIENQODUwIgotLQllY2hvICJlc19ETyBDUDg1MCIKLS0JZWNobyAiZXNfRUMgQ1A4NTAiCi0tCWVjaG8gImVzX0VTIENQODUwIgotLQllY2hvICJlc19HVCBDUDg1MCIKLS0JZWNobyAiZXNfSE4gQ1A4NTAiCi0tCWVjaG8gImVzX01YIENQODUwIgotLQllY2hvICJlc19OSSBDUDg1MCIKLS0JZWNobyAiZXNfUEEgQ1A4NTAiCi0tCWVjaG8gImVzX1BZIENQODUwIgotLQllY2hvICJlc19QRSBDUDg1MCIKLS0JZWNobyAiZXNfU1YgQ1A4NTAiCi0tCWVjaG8gImVzX1VZIENQODUwIgotLQllY2hvICJlc19WRSBDUDg1MCIKLS0JZWNobyAiZXQgQ1A4NTAiCi0tCWVjaG8gImV0X0VFIENQODUwIgotLQllY2hvICJldSBDUDg1MCIKLS0JZWNobyAiZXVfRVMgQ1A4NTAiCi0tCWVjaG8gImZpIENQODUwIgotLQllY2hvICJmaV9GSSBDUDg1MCIKLS0JZWNobyAiZnIgQ1A4NTAiCi0tCWVjaG8gImZyX0JFIENQODUwIgotLQllY2hvICJmcl9DQSBDUDg1MCIKLS0JZWNobyAiZnJfQ0ggQ1A4NTAiCi0tCWVjaG8gImZyX0ZSIENQODUwIgotLQllY2hvICJnYSBDUDg1MCIKLS0JZWNobyAiZ2FfSUUgQ1A4NTAiCi0tCWVjaG8gImdkIENQODUwIgotLQllY2hvICJnZF9HQiBDUDg1MCIKLS0JZWNobyAiZ2wgQ1A4NTAiCi0tCWVjaG8gImdsX0VTIENQODUwIgotLQllY2hvICJpZCBDUDg1MCIgICAgIyBub3QgQ1A0MzcgPz8KLS0JZWNobyAiaWRfSUQgQ1A4NTAiICMgbm90IENQNDM3ID8/Ci0tCWVjaG8gImlzIENQODYxIiAgICAjIG5vdCBDUDg1MCA/PwotLQllY2hvICJpc19JUyBDUDg2MSIgIyBub3QgQ1A4NTAgPz8KLS0JZWNobyAiaXQgQ1A4NTAiCi0tCWVjaG8gIml0X0NIIENQODUwIgotLQllY2hvICJpdF9JVCBDUDg1MCIKLS0JZWNobyAibHQgQ1A3NzUiCi0tCWVjaG8gImx0X0xUIENQNzc1IgotLQllY2hvICJsdiBDUDc3NSIKLS0JZWNobyAibHZfTFYgQ1A3NzUiCi0tCWVjaG8gIm5iIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PwotLQllY2hvICJuYl9OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KLS0JZWNobyAibmwgQ1A4NTAiCi0tCWVjaG8gIm5sX0JFIENQODUwIgotLQllY2hvICJubF9OTCBDUDg1MCIKLS0JZWNobyAibm4gQ1A4NjUiICAgICMgbm90IENQODUwID8/Ci0tCWVjaG8gIm5uX05PIENQODY1IiAjIG5vdCBDUDg1MCA/PwotLQllY2hvICJubyBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KLS0JZWNobyAibm9fTk8gQ1A4NjUiICMgbm90IENQODUwID8/Ci0tCWVjaG8gInB0IENQODUwIgotLQllY2hvICJwdF9CUiBDUDg1MCIKLS0JZWNobyAicHRfUFQgQ1A4NTAiCi0tCWVjaG8gInN2IENQODUwIgotLQllY2hvICJzdl9TRSBDUDg1MCIKLS0JIyBJU08tODg1OS0yIGxhbmd1YWdlcwotLQllY2hvICJjcyBDUDg1MiIKLS0JZWNobyAiY3NfQ1ogQ1A4NTIiCi0tCWVjaG8gImhyIENQODUyIgotLQllY2hvICJocl9IUiBDUDg1MiIKLS0JZWNobyAiaHUgQ1A4NTIiCi0tCWVjaG8gImh1X0hVIENQODUyIgotLQllY2hvICJwbCBDUDg1MiIKLS0JZWNobyAicGxfUEwgQ1A4NTIiCi0tCWVjaG8gInJvIENQODUyIgotLQllY2hvICJyb19STyBDUDg1MiIKLS0JZWNobyAic2sgQ1A4NTIiCi0tCWVjaG8gInNrX1NLIENQODUyIgotLQllY2hvICJzbCBDUDg1MiIKLS0JZWNobyAic2xfU0kgQ1A4NTIiCi0tCWVjaG8gInNxIENQODUyIgotLQllY2hvICJzcV9BTCBDUDg1MiIKLS0JZWNobyAic3IgQ1A4NTIiICAgICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KLS0JZWNobyAic3JfQ1MgQ1A4NTIiICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KLS0JZWNobyAic3JfWVUgQ1A4NTIiICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KLS0JIyBJU08tODg1OS0zIGxhbmd1YWdlcwotLQllY2hvICJtdCBDUDg1MCIKLS0JZWNobyAibXRfTVQgQ1A4NTAiCi0tCSMgSVNPLTg4NTktNSBsYW5ndWFnZXMKLS0JZWNobyAiYmUgQ1A4NjYiCi0tCWVjaG8gImJlX0JFIENQODY2IgotLQllY2hvICJiZyBDUDg2NiIgICAgIyBub3QgQ1A4NTUgPz8KLS0JZWNobyAiYmdfQkcgQ1A4NjYiICMgbm90IENQODU1ID8/Ci0tCWVjaG8gIm1rIENQODY2IiAgICAjIG5vdCBDUDg1NSA/PwotLQllY2hvICJta19NSyBDUDg2NiIgIyBub3QgQ1A4NTUgPz8KLS0JZWNobyAicnUgQ1A4NjYiCi0tCWVjaG8gInJ1X1JVIENQODY2IgotLQllY2hvICJ1ayBDUDExMjUiCi0tCWVjaG8gInVrX1VBIENQMTEyNSIKLS0JIyBJU08tODg1OS02IGxhbmd1YWdlcwotLQllY2hvICJhciBDUDg2NCIKLS0JZWNobyAiYXJfQUUgQ1A4NjQiCi0tCWVjaG8gImFyX0RaIENQODY0IgotLQllY2hvICJhcl9FRyBDUDg2NCIKLS0JZWNobyAiYXJfSVEgQ1A4NjQiCi0tCWVjaG8gImFyX0lSIENQODY0IgotLQllY2hvICJhcl9KTyBDUDg2NCIKLS0JZWNobyAiYXJfS1cgQ1A4NjQiCi0tCWVjaG8gImFyX01BIENQODY0IgotLQllY2hvICJhcl9PTSBDUDg2NCIKLS0JZWNobyAiYXJfUUEgQ1A4NjQiCi0tCWVjaG8gImFyX1NBIENQODY0IgotLQllY2hvICJhcl9TWSBDUDg2NCIKLS0JIyBJU08tODg1OS03IGxhbmd1YWdlcwotLQllY2hvICJlbCBDUDg2OSIKLS0JZWNobyAiZWxfR1IgQ1A4NjkiCi0tCSMgSVNPLTg4NTktOCBsYW5ndWFnZXMKLS0JZWNobyAiaGUgQ1A4NjIiCi0tCWVjaG8gImhlX0lMIENQODYyIgotLQkjIElTTy04ODU5LTkgbGFuZ3VhZ2VzCi0tCWVjaG8gInRyIENQODU3IgotLQllY2hvICJ0cl9UUiBDUDg1NyIKLS0JIyBKYXBhbmVzZQotLQllY2hvICJqYSBDUDkzMiIKLS0JZWNobyAiamFfSlAgQ1A5MzIiCi0tCSMgQ2hpbmVzZQotLQllY2hvICJ6aF9DTiBHQksiCi0tCWVjaG8gInpoX1RXIENQOTUwIiAjIG5vdCBDUDkzOCA/PwotLQkjIEtvcmVhbgotLQllY2hvICJrciBDUDk0OSIgICAgIyBub3QgQ1A5MzQgPz8KLS0JZWNobyAia3JfS1IgQ1A5NDkiICMgbm90IENQOTM0ID8/Ci0tCSMgVGhhaQotLQllY2hvICJ0aCBDUDg3NCIKLS0JZWNobyAidGhfVEggQ1A4NzQiCi0tCSMgT3RoZXIKLS0JZWNobyAiZW8gQ1A4NTAiCi0tCWVjaG8gImVvX0VPIENQODUwIgotLQk7OwotLWVzYWMKLS0tLSBhL2ludGwvZGNnZXR0ZXh0LmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDU2ICswLDAgQEAKLS0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGNnZXR0ZXh0KDMpIGZ1bmN0aW9uLgotLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgImdldHRleHRQLmgiCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLS0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLS0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotLSNpZmRlZiBfTElCQwotLSMgZGVmaW5lIERDR0VUVEVYVCBfX2RjZ2V0dGV4dAotLSMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0Ci0tI2Vsc2UKLS0jIGRlZmluZSBEQ0dFVFRFWFQgbGliaW50bF9kY2dldHRleHQKLS0jIGRlZmluZSBEQ0lHRVRURVhUIGxpYmludGxfZGNpZ2V0dGV4dAotLSNlbmRpZgotLQotLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotLSAgIGxvY2FsZS4gICovCi0tY2hhciAqCi0tRENHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZCwgaW50IGNhdGVnb3J5KQotLXsKLS0gIHJldHVybiBEQ0lHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgTlVMTCwgMCwgMCwgY2F0ZWdvcnkpOwotLX0KLS0KLS0jaWZkZWYgX0xJQkMKLS0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLS1JTlRERUYoX19kY2dldHRleHQpCi0td2Vha19hbGlhcyAoX19kY2dldHRleHQsIGRjZ2V0dGV4dCk7Ci0tI2VuZGlmCi0tLS0gYS9pbnRsL2RjaWdldHRleHQuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMTY4OSArMCwwIEBACi0tLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGRjaWdldHRleHQgZnVuY3Rpb24uCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIG1lbXBjcHkoKS4KLS0gICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKLS0gICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCi0tI2lmbmRlZiBfR05VX1NPVVJDRQotLSMgZGVmaW5lIF9HTlVfU09VUkNFCTEKLS0jZW5kaWYKLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tLyogTkxfTE9DQUxFX05BTUUgZG9lcyBub3Qgd29yayBpbiBnbGliYy0yLjQuICBJZ25vcmUgaXQuICAqLwotLSN1bmRlZiBIQVZFX05MX0xPQ0FMRV9OQU1FCi0tCi0tI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotLQotLSNpZmRlZiBfX0dOVUNfXwotLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0tIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQotLSNlbHNlCi0tIyBpZmRlZiBfTVNDX1ZFUgotLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotLSMgZWxzZQotLSMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCi0tIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotLSMgIGVsc2UKLS0jICAgaWZkZWYgX0FJWAotLSAjcHJhZ21hIGFsbG9jYQotLSMgICBlbHNlCi0tIyAgICBpZm5kZWYgYWxsb2NhCi0tY2hhciAqYWxsb2NhICgpOwotLSMgICAgZW5kaWYKLS0jICAgZW5kaWYKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8ZXJybm8uaD4KLS0jaWZuZGVmIGVycm5vCi0tZXh0ZXJuIGludCBlcnJubzsKLS0jZW5kaWYKLS0jaWZuZGVmIF9fc2V0X2Vycm5vCi0tIyBkZWZpbmUgX19zZXRfZXJybm8odmFsKSBlcnJubyA9ICh2YWwpCi0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPHN0ZGRlZi5oPgotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0tCi0tI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0tIyBpbmNsdWRlIDx1bmlzdGQuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0tCi0tI2lmZGVmIF9MSUJDCi0tICAvKiBHdWVzcyB3aGV0aGVyIGludGVnZXIgZGl2aXNpb24gYnkgemVybyByYWlzZXMgc2lnbmFsIFNJR0ZQRS4KLS0gICAgIFNldCB0byAxIG9ubHkgaWYgeW91IGtub3cgZm9yIHN1cmUuICBJbiBjYXNlIG9mIGRvdWJ0LCBzZXQgdG8gMC4gICovCi0tIyBpZiBkZWZpbmVkIF9fYWxwaGFfXyB8fCBkZWZpbmVkIF9fYXJtX18gfHwgZGVmaW5lZCBfX2kzODZfXyBcCi0tICAgICB8fCBkZWZpbmVkIF9fbTY4a19fIHx8IGRlZmluZWQgX19zMzkwX18KLS0jICBkZWZpbmUgSU5URElWMF9SQUlTRVNfU0lHRlBFIDEKLS0jIGVsc2UKLS0jICBkZWZpbmUgSU5URElWMF9SQUlTRVNfU0lHRlBFIDAKLS0jIGVuZGlmCi0tI2VuZGlmCi0tI2lmICFJTlRESVYwX1JBSVNFU19TSUdGUEUKLS0jIGluY2x1ZGUgPHNpZ25hbC5oPgotLSNlbmRpZgotLQotLSNpZiBkZWZpbmVkIEhBVkVfU1lTX1BBUkFNX0ggfHwgZGVmaW5lZCBfTElCQwotLSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0tI2VuZGlmCi0tCi0tI2lmICFkZWZpbmVkIF9MSUJDCi0tIyBpZiBIQVZFX05MX0xPQ0FMRV9OQU1FCi0tIyAgaW5jbHVkZSA8bGFuZ2luZm8uaD4KLS0jIGVuZGlmCi0tIyBpbmNsdWRlICJsb2NhbGNoYXJzZXQuaCIKLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLS0jaW5jbHVkZSAicGx1cmFsLWV4cC5oIgotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8bGliaW50bC5oPgotLSNlbHNlCi0tIyBpZmRlZiBJTl9MSUJHTE9DQUxFCi0tIyAgaW5jbHVkZSA8bGliaW50bC5oPgotLSMgZW5kaWYKLS0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLS0jZW5kaWYKLS0jaW5jbHVkZSAiaGFzaC1zdHJpbmcuaCIKLS0KLS0vKiBIYW5kbGUgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZCBfX2xpYmNfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZAotLSMgZGVmaW5lIGdsX3J3bG9ja19yZGxvY2sgX19saWJjX3J3bG9ja19yZGxvY2sKLS0jIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrIF9fbGliY19yd2xvY2tfd3Jsb2NrCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayBfX2xpYmNfcndsb2NrX3VubG9jawotLSNlbHNlCi0tIyBpbmNsdWRlICJsb2NrLmgiCi0tI2VuZGlmCi0tCi0tLyogQWxpZ25tZW50IG9mIHR5cGVzLiAgKi8KLS0jaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCi0tIyBkZWZpbmUgYWxpZ25vZihUWVBFKSBfX2FsaWdub2ZfXyAoVFlQRSkKLS0jZWxzZQotLSMgZGVmaW5lIGFsaWdub2YoVFlQRSkgXAotLSAgICAoKGludCkgJigoc3RydWN0IHsgY2hhciBkdW1teTE7IFRZUEUgZHVtbXkyOyB9ICopIDApLT5kdW1teTIpCi0tI2VuZGlmCi0tCi0tLyogU29tZSBjb21waWxlcnMsIGxpa2UgU3VuT1M0IGNjLCBkb24ndCBoYXZlIG9mZnNldG9mIGluIDxzdGRkZWYuaD4uICAqLwotLSNpZm5kZWYgb2Zmc2V0b2YKLS0jIGRlZmluZSBvZmZzZXRvZih0eXBlLGlkZW50KSAoKHNpemVfdCkmKCgodHlwZSopMCktPmlkZW50KSkKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tI2lmZGVmIF9MSUJDCi0tLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0tICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLS0jIGRlZmluZSBnZXRjd2QgX19nZXRjd2QKLS0jIGlmbmRlZiBzdHBjcHkKLS0jICBkZWZpbmUgc3RwY3B5IF9fc3RwY3B5Ci0tIyBlbmRpZgotLSMgZGVmaW5lIHRmaW5kIF9fdGZpbmQKLS0jZWxzZQotLSMgaWYgIWRlZmluZWQgSEFWRV9HRVRDV0QKLS1jaGFyICpnZXR3ZCAoKTsKLS0jICBkZWZpbmUgZ2V0Y3dkKGJ1ZiwgbWF4KSBnZXR3ZCAoYnVmKQotLSMgZWxzZQotLSMgIGlmIFZNUwotLSMgICBkZWZpbmUgZ2V0Y3dkKGJ1ZiwgbWF4KSAoZ2V0Y3dkKSAoYnVmLCBtYXgsIDApCi0tIyAgZWxzZQotLWNoYXIgKmdldGN3ZCAoKTsKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0jIGlmbmRlZiBIQVZFX1NUUENQWQotLXN0YXRpYyBjaGFyICpzdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYyk7Ci0tIyBlbmRpZgotLSMgaWZuZGVmIEhBVkVfTUVNUENQWQotLXN0YXRpYyB2b2lkICptZW1wY3B5ICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKTsKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tLyogVXNlIGEgcmVwbGFjZW1lbnQgaWYgdGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBgdHNlYXJjaCcgZnVuY3Rpb24KLS0gICBmYW1pbHkuICAqLwotLSNpZiBIQVZFX1RTRUFSQ0ggfHwgZGVmaW5lZCBfTElCQwotLSMgaW5jbHVkZSA8c2VhcmNoLmg+Ci0tI2Vsc2UKLS0jIGRlZmluZSB0c2VhcmNoIGxpYmludGxfdHNlYXJjaAotLSMgZGVmaW5lIHRmaW5kIGxpYmludGxfdGZpbmQKLS0jIGRlZmluZSB0ZGVsZXRlIGxpYmludGxfdGRlbGV0ZQotLSMgZGVmaW5lIHR3YWxrIGxpYmludGxfdHdhbGsKLS0jIGluY2x1ZGUgInRzZWFyY2guaCIKLS0jZW5kaWYKLS0KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSB0c2VhcmNoIF9fdHNlYXJjaAotLSNlbmRpZgotLQotLS8qIEFtb3VudCB0byBpbmNyZWFzZSBidWZmZXIgc2l6ZSBieSBpbiBlYWNoIHRyeS4gICovCi0tI2RlZmluZSBQQVRIX0lOQ1IgMzIKLS0KLS0vKiBUaGUgZm9sbG93aW5nIGlzIGZyb20gcGF0aG1heC5oLiAgKi8KLS0vKiBOb24tUE9TSVggQlNEIHN5c3RlbXMgbWlnaHQgaGF2ZSBnY2MncyBsaW1pdHMuaCwgd2hpY2ggZG9lc24ndCBkZWZpbmUKLS0gICBQQVRIX01BWCBidXQgbWlnaHQgY2F1c2UgcmVkZWZpbml0aW9uIHdhcm5pbmdzIHdoZW4gc3lzL3BhcmFtLmggaXMKLS0gICBsYXRlciBpbmNsdWRlZCAoYXMgb24gTU9SRS9CU0QgNC4zKS4gICovCi0tI2lmIGRlZmluZWQgX1BPU0lYX1ZFUlNJT04gfHwgKGRlZmluZWQgSEFWRV9MSU1JVFNfSCAmJiAhZGVmaW5lZCBfX0dOVUNfXykKLS0jIGluY2x1ZGUgPGxpbWl0cy5oPgotLSNlbmRpZgotLQotLSNpZm5kZWYgX1BPU0lYX1BBVEhfTUFYCi0tIyBkZWZpbmUgX1BPU0lYX1BBVEhfTUFYIDI1NQotLSNlbmRpZgotLQotLSNpZiAhZGVmaW5lZCBQQVRIX01BWCAmJiBkZWZpbmVkIF9QQ19QQVRIX01BWAotLSMgZGVmaW5lIFBBVEhfTUFYIChwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpIDwgMSA/IDEwMjQgOiBwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpKQotLSNlbmRpZgotLQotLS8qIERvbid0IGluY2x1ZGUgc3lzL3BhcmFtLmggaWYgaXQgYWxyZWFkeSBoYXMgYmVlbi4gICovCi0tI2lmIGRlZmluZWQgSEFWRV9TWVNfUEFSQU1fSCAmJiAhZGVmaW5lZCBQQVRIX01BWCAmJiAhZGVmaW5lZCBNQVhQQVRITEVOCi0tIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLS0jZW5kaWYKLS0KLS0jaWYgIWRlZmluZWQgUEFUSF9NQVggJiYgZGVmaW5lZCBNQVhQQVRITEVOCi0tIyBkZWZpbmUgUEFUSF9NQVggTUFYUEFUSExFTgotLSNlbmRpZgotLQotLSNpZm5kZWYgUEFUSF9NQVgKLS0jIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKLS0jZW5kaWYKLS0KLS0vKiBQYXRobmFtZSBzdXBwb3J0LgotLSAgIElTU0xBU0goQykgICAgICAgICAgIHRlc3RzIHdoZXRoZXIgQyBpcyBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgY2hhcmFjdGVyLgotLSAgIElTX0FCU09MVVRFX1BBVEgoUCkgIHRlc3RzIHdoZXRoZXIgUCBpcyBhbiBhYnNvbHV0ZSBwYXRoLiAgSWYgaXQgaXMgbm90LAotLSAgICAgICAgICAgICAgICAgICAgICAgIGl0IG1heSBiZSBjb25jYXRlbmF0ZWQgdG8gYSBkaXJlY3RvcnkgcGF0aG5hbWUuCi0tICAgSVNfUEFUSF9XSVRIX0RJUihQKSAgdGVzdHMgd2hldGhlciBQIGNvbnRhaW5zIGEgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24uCi0tICovCi0tI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19DWUdXSU5fXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KLS0gIC8qIFdpbjMyLCBDeWd3aW4sIE9TLzIsIERPUyAqLwotLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCi0tIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCi0tICAgICgoKChQKVswXSA+PSAnQScgJiYgKFApWzBdIDw9ICdaJykgfHwgKChQKVswXSA+PSAnYScgJiYgKFApWzBdIDw9ICd6JykpIFwKLS0gICAgICYmIChQKVsxXSA9PSAnOicpCi0tIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSAoSVNTTEFTSCAoKFApWzBdKSB8fCBIQVNfREVWSUNFIChQKSkKLS0jIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIFwKLS0gICAgKHN0cmNociAoUCwgJy8nKSAhPSBOVUxMIHx8IHN0cmNociAoUCwgJ1xcJykgIT0gTlVMTCB8fCBIQVNfREVWSUNFIChQKSkKLS0jZWxzZQotLSAgLyogVW5peCAqLwotLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycpCi0tIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSBJU1NMQVNIICgoUClbMF0pCi0tIyBkZWZpbmUgSVNfUEFUSF9XSVRIX0RJUihQKSAoc3RyY2hyIChQLCAnLycpICE9IE5VTEwpCi0tI2VuZGlmCi0tCi0tLyogV2hldGhlciB0byBzdXBwb3J0IGRpZmZlcmVudCBsb2NhbGVzIGluIGRpZmZlcmVudCB0aHJlYWRzLiAgKi8KLS0jaWYgZGVmaW5lZCBfTElCQyB8fCBIQVZFX05MX0xPQ0FMRV9OQU1FIHx8IChIQVZFX1NUUlVDVF9fX0xPQ0FMRV9TVFJVQ1RfX19OQU1FUyAmJiBkZWZpbmVkIFVTRV9JTl9HRVRURVhUX1RFU1RTKSB8fCBkZWZpbmVkIElOX0xJQkdMT0NBTEUKLS0jIGRlZmluZSBIQVZFX1BFUl9USFJFQURfTE9DQUxFCi0tI2VuZGlmCi0tCi0tLyogVGhpcyBpcyB0aGUgdHlwZSB1c2VkIGZvciB0aGUgc2VhcmNoIHRyZWUgd2hlcmUga25vd24gdHJhbnNsYXRpb25zCi0tICAgYXJlIHN0b3JlZC4gICovCi0tc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QKLS17Ci0tICAvKiBEb21haW4gaW4gd2hpY2ggdG8gc2VhcmNoLiAgKi8KLS0gIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0tCi0tICAvKiBUaGUgY2F0ZWdvcnkuICAqLwotLSAgaW50IGNhdGVnb3J5OwotLQotLSNpZmRlZiBIQVZFX1BFUl9USFJFQURfTE9DQUxFCi0tICAvKiBOYW1lIG9mIHRoZSByZWxldmFudCBsb2NhbGUgY2F0ZWdvcnksIG9yICIiIGZvciB0aGUgZ2xvYmFsIGxvY2FsZS4gICovCi0tICBjb25zdCBjaGFyICpsb2NhbGVuYW1lOwotLSNlbmRpZgotLQotLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0tICAvKiBUaGUgY2hhcmFjdGVyIGVuY29kaW5nLiAgKi8KLS0gIGNvbnN0IGNoYXIgKmVuY29kaW5nOwotLSNlbmRpZgotLQotLSAgLyogU3RhdGUgb2YgdGhlIGNhdGFsb2cgY291bnRlciBhdCB0aGUgcG9pbnQgdGhlIHN0cmluZyB3YXMgZm91bmQuICAqLwotLSAgaW50IGNvdW50ZXI7Ci0tCi0tICAvKiBDYXRhbG9nIHdoZXJlIHRoZSBzdHJpbmcgd2FzIGZvdW5kLiAgKi8KLS0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKLS0KLS0gIC8qIEFuZCBmaW5hbGx5IHRoZSB0cmFuc2xhdGlvbi4gICovCi0tICBjb25zdCBjaGFyICp0cmFuc2xhdGlvbjsKLS0gIHNpemVfdCB0cmFuc2xhdGlvbl9sZW5ndGg7Ci0tCi0tICAvKiBQb2ludGVyIHRvIHRoZSBzdHJpbmcgaW4gcXVlc3Rpb24uICAqLwotLSAgY2hhciBtc2dpZFtaRVJPXTsKLS19OwotLQotLWdsX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKHN0YXRpYywgdHJlZV9sb2NrKQotLQotLS8qIFJvb3Qgb2YgdGhlIHNlYXJjaCB0cmVlIHdpdGgga25vd24gdHJhbnNsYXRpb25zLiAgKi8KLS1zdGF0aWMgdm9pZCAqcm9vdDsKLS0KLS0vKiBGdW5jdGlvbiB0byBjb21wYXJlIHR3byBlbnRyaWVzIGluIHRoZSB0YWJsZSBvZiBrbm93biB0cmFuc2xhdGlvbnMuICAqLwotLXN0YXRpYyBpbnQKLS10cmFuc2NtcCAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotLXsKLS0gIGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICpzMTsKLS0gIGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICpzMjsKLS0gIGludCByZXN1bHQ7Ci0tCi0tICBzMSA9IChjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKSBwMTsKLS0gIHMyID0gKGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopIHAyOwotLQotLSAgcmVzdWx0ID0gc3RyY21wIChzMS0+bXNnaWQsIHMyLT5tc2dpZCk7Ci0tICBpZiAocmVzdWx0ID09IDApCi0tICAgIHsKLS0gICAgICByZXN1bHQgPSBzdHJjbXAgKHMxLT5kb21haW5uYW1lLCBzMi0+ZG9tYWlubmFtZSk7Ci0tICAgICAgaWYgKHJlc3VsdCA9PSAwKQotLQl7Ci0tI2lmZGVmIEhBVkVfUEVSX1RIUkVBRF9MT0NBTEUKLS0JICByZXN1bHQgPSBzdHJjbXAgKHMxLT5sb2NhbGVuYW1lLCBzMi0+bG9jYWxlbmFtZSk7Ci0tCSAgaWYgKHJlc3VsdCA9PSAwKQotLSNlbmRpZgotLQkgICAgewotLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0tCSAgICAgIHJlc3VsdCA9IHN0cmNtcCAoczEtPmVuY29kaW5nLCBzMi0+ZW5jb2RpbmcpOwotLQkgICAgICBpZiAocmVzdWx0ID09IDApCi0tI2VuZGlmCi0tCQkvKiBXZSBjb21wYXJlIHRoZSBjYXRlZ29yeSBsYXN0ICh0aG91Z2ggdGhpcyBpcyB0aGUgY2hlYXBlc3QKLS0JCSAgIG9wZXJhdGlvbikgc2luY2UgaXQgaXMgaG9wZWZ1bGx5IGFsd2F5cyB0aGUgc2FtZSAobmFtZWx5Ci0tCQkgICBMQ19NRVNTQUdFUykuICAqLwotLQkJcmVzdWx0ID0gczEtPmNhdGVnb3J5IC0gczItPmNhdGVnb3J5OwotLQkgICAgfQotLQl9Ci0tICAgIH0KLS0KLS0gIHJldHVybiByZXN1bHQ7Ci0tfQotLQotLS8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgZG9tYWluIHVzZWQgZm9yIGdldHRleHQoMykgcHJpb3IgYW55IGNhbGwgdG8KLS0gICB0ZXh0ZG9tYWluKDMpLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgaXMgIm1lc3NhZ2VzIi4gICovCi0tY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdIGF0dHJpYnV0ZV9oaWRkZW4gPSAibWVzc2FnZXMiOwotLQotLSNpZm5kZWYgSU5fTElCR0xPQ0FMRQotLS8qIFZhbHVlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZG9tYWluIGZvciBnZXR0ZXh0KDMpLiAgKi8KLS1jb25zdCBjaGFyICpfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiBhdHRyaWJ1dGVfaGlkZGVuCi0tICAgICA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOwotLSNlbmRpZgotLQotLS8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KLS0jaWYgZGVmaW5lZCBfX0VNWF9fCi0tZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOwotLSNlbHNlCi0tIyBpZmRlZiBfTElCQwotLWV4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXTsKLS1saWJjX2hpZGRlbl9wcm90byAoX25sX2RlZmF1bHRfZGlybmFtZSkKLS0jIGVuZGlmCi0tY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lW10gPSBMT0NBTEVESVI7Ci0tIyBpZmRlZiBfTElCQwotLWxpYmNfaGlkZGVuX2RhdGFfZGVmIChfbmxfZGVmYXVsdF9kaXJuYW1lKQotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0jaWZuZGVmIElOX0xJQkdMT0NBTEUKLS0vKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucyBjcmVhdGVkIGJ5IGJpbmR0ZXh0ZG9tYWluKCkKLS0gICBjYWxscy4gICovCi0tc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7Ci0tI2VuZGlmCi0tCi0tLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLS1zdGF0aWMgY2hhciAqcGx1cmFsX2xvb2t1cCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluLAotLQkJCSAgICB1bnNpZ25lZCBsb25nIGludCBuLAotLQkJCSAgICBjb25zdCBjaGFyICp0cmFuc2xhdGlvbiwgc2l6ZV90IHRyYW5zbGF0aW9uX2xlbikKLS0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotLQotLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0tc3RhdGljIGNvbnN0IGNoYXIgKmd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChpbnQgY2F0ZWdvcnksCi0tCQkJCQkgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lLAotLQkJCQkJIGNvbnN0IGNoYXIgKmxvY2FsZW5hbWUpCi0tICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLS0jZWxzZQotLXN0YXRpYyBjb25zdCBjaGFyICpndWVzc19jYXRlZ29yeV92YWx1ZSAoaW50IGNhdGVnb3J5LAotLQkJCQkJIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkKLS0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotLSNlbmRpZgotLQotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSAiLi4vbG9jYWxlL2xvY2FsZWluZm8uaCIKLS0jIGRlZmluZSBjYXRlZ29yeV90b19uYW1lKGNhdGVnb3J5KSBcCi0tICBfbmxfY2F0ZWdvcnlfbmFtZXMuc3RyICsgX25sX2NhdGVnb3J5X25hbWVfaWR4c1tjYXRlZ29yeV0KLS0jZWxzZQotLXN0YXRpYyBjb25zdCBjaGFyICpjYXRlZ29yeV90b19uYW1lIChpbnQgY2F0ZWdvcnkpIGludGVybmFsX2Z1bmN0aW9uOwotLSNlbmRpZgotLSNpZiAoZGVmaW5lZCBfTElCQyB8fCBIQVZFX0lDT05WKSAmJiAhZGVmaW5lZCBJTl9MSUJHTE9DQUxFCi0tc3RhdGljIGNvbnN0IGNoYXIgKmdldF9vdXRwdXRfY2hhcnNldCAoc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCi0tICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLS0jZW5kaWYKLS0KLS0KLS0vKiBGb3IgdGhvc2UgbG9vc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKLS0gICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLwotLSNpZmRlZiBIQVZFX0FMTE9DQQotLS8qIE5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuICAqLwotLSMgZGVmaW5lIGZyZWVhKHApIC8qIG5vdGhpbmcgKi8KLS0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcmVzcykgLyogbm90aGluZyAqLwotLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpIC8qIG5vdGhpbmcgKi8KLS0jZWxzZQotLXN0cnVjdCBibG9ja19saXN0Ci0tewotLSAgdm9pZCAqYWRkcmVzczsKLS0gIHN0cnVjdCBibG9ja19saXN0ICpuZXh0OwotLX07Ci0tIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHIpCQkJCQkJICAgICAgXAotLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLS0gICAgc3RydWN0IGJsb2NrX2xpc3QgKm5ld3AgPSAoc3RydWN0IGJsb2NrX2xpc3QgKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7ICBcCi0tICAgIC8qIElmIHdlIGNhbm5vdCBnZXQgYSBmcmVlIGJsb2NrIHdlIGNhbm5vdCBhZGQgdGhlIG5ldyBlbGVtZW50IHRvCSAgICAgIFwKLS0gICAgICAgdGhlIGxpc3QuICAqLwkJCQkJCQkgICAgICBcCi0tICAgIGlmIChuZXdwICE9IE5VTEwpIHsJCQkJCQkJICAgICAgXAotLSAgICAgIG5ld3AtPmFkZHJlc3MgPSAoYWRkcik7CQkJCQkJICAgICAgXAotLSAgICAgIG5ld3AtPm5leHQgPSAobGlzdCk7CQkJCQkJICAgICAgXAotLSAgICAgIChsaXN0KSA9IG5ld3A7CQkJCQkJCSAgICAgIFwKLS0gICAgfQkJCQkJCQkJCSAgICAgIFwKLS0gIH0gd2hpbGUgKDApCi0tIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkJCQkJCQkgICAgICBcCi0tICBkbyB7CQkJCQkJCQkJICAgICAgXAotLSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CQkJCQkJICAgICAgXAotLSAgICAgIHN0cnVjdCBibG9ja19saXN0ICpvbGQgPSBsaXN0OwkJCQkJICAgICAgXAotLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwkJCQkJCSAgICAgIFwKLS0gICAgICBmcmVlIChvbGQtPmFkZHJlc3MpOwkJCQkJCSAgICAgIFwKLS0gICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCi0tICAgIH0JCQkJCQkJCQkgICAgICBcCi0tICB9IHdoaWxlICgwKQotLSMgdW5kZWYgYWxsb2NhCi0tIyBkZWZpbmUgYWxsb2NhKHNpemUpIChtYWxsb2MgKHNpemUpKQotLSMgZGVmaW5lIGZyZWVhKHApIGZyZWUgKHApCi0tI2VuZGlmCS8qIGhhdmUgYWxsb2NhICovCi0tCi0tCi0tI2lmZGVmIF9MSUJDCi0tLyogTGlzdCBvZiBibG9ja3MgYWxsb2NhdGVkIGZvciB0cmFuc2xhdGlvbnMuICAqLwotLXR5cGVkZWYgc3RydWN0IHRyYW5zbWVtX2xpc3QKLS17Ci0tICBzdHJ1Y3QgdHJhbnNtZW1fbGlzdCAqbmV4dDsKLS0gIGNoYXIgZGF0YVtaRVJPXTsKLS19IHRyYW5zbWVtX2Jsb2NrX3Q7Ci0tc3RhdGljIHN0cnVjdCB0cmFuc21lbV9saXN0ICp0cmFuc21lbV9saXN0OwotLSNlbHNlCi0tdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRyYW5zbWVtX2Jsb2NrX3Q7Ci0tI2VuZGlmCi0tCi0tCi0tLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLS0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLS0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotLSNpZmRlZiBfTElCQwotLSMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0Ci0tI2Vsc2UKLS0jIGRlZmluZSBEQ0lHRVRURVhUIGxpYmludGxfZGNpZ2V0dGV4dAotLSNlbmRpZgotLQotLS8qIExvY2sgdmFyaWFibGUgdG8gcHJvdGVjdCB0aGUgZ2xvYmFsIGRhdGEgaW4gdGhlIGdldHRleHQgaW1wbGVtZW50YXRpb24uICAqLwotLWdsX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKCwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKLS0KLS0vKiBDaGVja2luZyB3aGV0aGVyIHRoZSBiaW5hcmllcyBydW5zIFNVSUQgbXVzdCBiZSBkb25lIGFuZCBnbGliYyBwcm92aWRlcwotLSAgIGVhc2llciBtZXRob2RzIHRoZXJlZm9yZSB3ZSBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSBFTkFCTEVfU0VDVVJFIF9fbGliY19lbmFibGVfc2VjdXJlCi0tIyBkZWZpbmUgREVURVJNSU5FX1NFQ1VSRQotLSNlbHNlCi0tIyBpZm5kZWYgSEFWRV9HRVRVSUQKLS0jICBkZWZpbmUgZ2V0dWlkKCkgMAotLSMgZW5kaWYKLS0jIGlmbmRlZiBIQVZFX0dFVEdJRAotLSMgIGRlZmluZSBnZXRnaWQoKSAwCi0tIyBlbmRpZgotLSMgaWZuZGVmIEhBVkVfR0VURVVJRAotLSMgIGRlZmluZSBnZXRldWlkKCkgZ2V0dWlkKCkKLS0jIGVuZGlmCi0tIyBpZm5kZWYgSEFWRV9HRVRFR0lECi0tIyAgZGVmaW5lIGdldGVnaWQoKSBnZXRnaWQoKQotLSMgZW5kaWYKLS1zdGF0aWMgaW50IGVuYWJsZV9zZWN1cmU7Ci0tIyBkZWZpbmUgRU5BQkxFX1NFQ1VSRSAoZW5hYmxlX3NlY3VyZSA9PSAxKQotLSMgZGVmaW5lIERFVEVSTUlORV9TRUNVUkUgXAotLSAgaWYgKGVuYWJsZV9zZWN1cmUgPT0gMCkJCQkJCQkgICAgICBcCi0tICAgIHsJCQkJCQkJCQkgICAgICBcCi0tICAgICAgaWYgKGdldHVpZCAoKSAhPSBnZXRldWlkICgpIHx8IGdldGdpZCAoKSAhPSBnZXRlZ2lkICgpKQkJICAgICAgXAotLQllbmFibGVfc2VjdXJlID0gMTsJCQkJCQkgICAgICBcCi0tICAgICAgZWxzZQkJCQkJCQkJICAgICAgXAotLQllbmFibGVfc2VjdXJlID0gLTE7CQkJCQkJICAgICAgXAotLSAgICB9Ci0tI2VuZGlmCi0tCi0tLyogR2V0IHRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZSB0aGUgcGx1cmFsIGV4cHJlc3Npb24uICAqLwotLSNpbmNsdWRlICJldmFsLXBsdXJhbC5oIgotLQotLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotLSAgIENBVEVHT1JZIGxvY2FsZSBhbmQsIGlmIFBMVVJBTCBpcyBub256ZXJvLCBzZWFyY2ggb3ZlciBzdHJpbmcKLS0gICBkZXBlbmRpbmcgb24gdGhlIHBsdXJhbCBmb3JtIGRldGVybWluZWQgYnkgTi4gICovCi0tI2lmZGVmIElOX0xJQkdMT0NBTEUKLS1jaGFyICoKLS1nbF9kY2lnZXR0ZXh0IChjb25zdCBjaGFyICpkb21haW5uYW1lLAotLQkgICAgICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsCi0tCSAgICAgICBpbnQgcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBuLAotLQkgICAgICAgaW50IGNhdGVnb3J5LAotLQkgICAgICAgY29uc3QgY2hhciAqbG9jYWxlbmFtZSwgY29uc3QgY2hhciAqZW5jb2RpbmcpCi0tI2Vsc2UKLS1jaGFyICoKLS1EQ0lHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwKLS0JICAgIGludCBwbHVyYWwsIHVuc2lnbmVkIGxvbmcgaW50IG4sIGludCBjYXRlZ29yeSkKLS0jZW5kaWYKLS17Ci0tI2lmbmRlZiBIQVZFX0FMTE9DQQotLSAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOwotLSNlbmRpZgotLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluOwotLSAgc3RydWN0IGJpbmRpbmcgKmJpbmRpbmc7Ci0tICBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWU7Ci0tICBjb25zdCBjaGFyICpjYXRlZ29yeXZhbHVlOwotLSAgY29uc3QgY2hhciAqZGlybmFtZTsKLS0gIGNoYXIgKnhkb21haW5uYW1lOwotLSAgY2hhciAqc2luZ2xlX2xvY2FsZTsKLS0gIGNoYXIgKnJldHZhbDsKLS0gIHNpemVfdCByZXRsZW47Ci0tICBpbnQgc2F2ZWRfZXJybm87Ci0tICBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqc2VhcmNoOwotLSAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKipmb3VuZHAgPSBOVUxMOwotLSAgc2l6ZV90IG1zZ2lkX2xlbjsKLS0jaWYgZGVmaW5lZCBIQVZFX1BFUl9USFJFQURfTE9DQUxFICYmICFkZWZpbmVkIElOX0xJQkdMT0NBTEUKLS0gIGNvbnN0IGNoYXIgKmxvY2FsZW5hbWU7Ci0tI2VuZGlmCi0tICBzaXplX3QgZG9tYWlubmFtZV9sZW47Ci0tCi0tICAvKiBJZiBubyByZWFsIE1TR0lEIGlzIGdpdmVuIHJldHVybiBOVUxMLiAgKi8KLS0gIGlmIChtc2dpZDEgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tCi0tI2lmZGVmIF9MSUJDCi0tICBpZiAoY2F0ZWdvcnkgPCAwIHx8IGNhdGVnb3J5ID49IF9fTENfTEFTVCB8fCBjYXRlZ29yeSA9PSBMQ19BTEwpCi0tICAgIC8qIEJvZ3VzLiAgKi8KLS0gICAgcmV0dXJuIChwbHVyYWwgPT0gMAotLQkgICAgPyAoY2hhciAqKSBtc2dpZDEKLS0JICAgIC8qIFVzZSB0aGUgR2VybWFuaWMgcGx1cmFsIHJ1bGUuICAqLwotLQkgICAgOiBuID09IDEgPyAoY2hhciAqKSBtc2dpZDEgOiAoY2hhciAqKSBtc2dpZDIpOwotLSNlbmRpZgotLQotLSAgLyogUHJlc2VydmUgdGhlIGBlcnJubycgdmFsdWUuICAqLwotLSAgc2F2ZWRfZXJybm8gPSBlcnJubzsKLS0KLS0gIGdsX3J3bG9ja19yZGxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLS0KLS0gIC8qIElmIERPTUFJTk5BTUUgaXMgTlVMTCwgd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRlZmF1bHQgZG9tYWluLiAgSWYKLS0gICAgIENBVEVHT1JZIGlzIG5vdCBMQ19NRVNTQUdFUyB0aGlzIG1pZ2h0IG5vdCBtYWtlIG11Y2ggc2Vuc2UgYnV0IHRoZQotLSAgICAgZGVmaW5pdGlvbiBsZWZ0IHRoaXMgdW5kZWZpbmVkLiAgKi8KLS0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0tICAgIGRvbWFpbm5hbWUgPSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLS0KLS0gIC8qIE9TLzIgc3BlY2lmaWM6IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBsaWJpbnRsIHZlcnNpb25zICAqLwotLSNpZmRlZiBMQ19NRVNTQUdFU19DT01QQVQKLS0gIGlmIChjYXRlZ29yeSA9PSBMQ19NRVNTQUdFU19DT01QQVQpCi0tICAgIGNhdGVnb3J5ID0gTENfTUVTU0FHRVM7Ci0tI2VuZGlmCi0tCi0tICBtc2dpZF9sZW4gPSBzdHJsZW4gKG1zZ2lkMSkgKyAxOwotLQotLSAgLyogVHJ5IHRvIGZpbmQgdGhlIHRyYW5zbGF0aW9uIGFtb25nIHRob3NlIHdoaWNoIHdlIGZvdW5kIGF0Ci0tICAgICBzb21lIHRpbWUuICAqLwotLSAgc2VhcmNoID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopCi0tCSAgIGFsbG9jYSAob2Zmc2V0b2YgKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90LCBtc2dpZCkgKyBtc2dpZF9sZW4pOwotLSAgbWVtY3B5IChzZWFyY2gtPm1zZ2lkLCBtc2dpZDEsIG1zZ2lkX2xlbik7Ci0tICBzZWFyY2gtPmRvbWFpbm5hbWUgPSBkb21haW5uYW1lOwotLSAgc2VhcmNoLT5jYXRlZ29yeSA9IGNhdGVnb3J5OwotLSNpZmRlZiBIQVZFX1BFUl9USFJFQURfTE9DQUxFCi0tIyBpZm5kZWYgSU5fTElCR0xPQ0FMRQotLSMgIGlmZGVmIF9MSUJDCi0tICBsb2NhbGVuYW1lID0gX19jdXJyZW50X2xvY2FsZV9uYW1lIChjYXRlZ29yeSk7Ci0tIyAgZWxzZQotLSMgICBpZiBIQVZFX05MX0xPQ0FMRV9OQU1FCi0tICAvKiBOTF9MT0NBTEVfTkFNRSBpcyBwdWJsaWMgZ2xpYmMgQVBJIGludHJvZHVjZWQgaW4gZ2xpYmMtMi40LiAgKi8KLS0gIGxvY2FsZW5hbWUgPSBubF9sYW5naW5mbyAoTkxfTE9DQUxFX05BTUUgKGNhdGVnb3J5KSk7Ci0tIyAgIGVsc2UKLS0jICAgIGlmIEhBVkVfU1RSVUNUX19fTE9DQUxFX1NUUlVDVF9fX05BTUVTICYmIGRlZmluZWQgVVNFX0lOX0dFVFRFWFRfVEVTVFMKLS0gIC8qIFRoZSBfX25hbWVzIGZpZWxkIGlzIG5vdCBwdWJsaWMgZ2xpYmMgQVBJIGFuZCBtdXN0IHRoZXJlZm9yZSBub3QgYmUgdXNlZAotLSAgICAgaW4gY29kZSB0aGF0IGlzIGluc3RhbGxlZCBpbiBwdWJsaWMgbG9jYXRpb25zLiAgKi8KLS0gIHsKLS0gICAgbG9jYWxlX3QgdGhyZWFkX2xvY2FsZSA9IHVzZWxvY2FsZSAoTlVMTCk7Ci0tICAgIGlmICh0aHJlYWRfbG9jYWxlICE9IExDX0dMT0JBTF9MT0NBTEUpCi0tICAgICAgbG9jYWxlbmFtZSA9IHRocmVhZF9sb2NhbGUtPl9fbmFtZXNbY2F0ZWdvcnldOwotLSAgICBlbHNlCi0tICAgICAgbG9jYWxlbmFtZSA9ICIiOwotLSAgfQotLSMgICAgZW5kaWYKLS0jICAgZW5kaWYKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0gIHNlYXJjaC0+bG9jYWxlbmFtZSA9IGxvY2FsZW5hbWU7Ci0tIyBpZmRlZiBJTl9MSUJHTE9DQUxFCi0tICBzZWFyY2gtPmVuY29kaW5nID0gZW5jb2Rpbmc7Ci0tIyBlbmRpZgotLQotLSAgLyogU2luY2UgdGZpbmQvdHNlYXJjaCBtYW5hZ2UgYSBiYWxhbmNlZCB0cmVlLCBjb25jdXJyZW50IHRmaW5kIGFuZAotLSAgICAgdHNlYXJjaCBjYWxscyBjYW4gYmUgZmF0YWwuICAqLwotLSAgZ2xfcndsb2NrX3JkbG9jayAodHJlZV9sb2NrKTsKLS0KLS0gIGZvdW5kcCA9IChzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKikgdGZpbmQgKHNlYXJjaCwgJnJvb3QsIHRyYW5zY21wKTsKLS0KLS0gIGdsX3J3bG9ja191bmxvY2sgKHRyZWVfbG9jayk7Ci0tCi0tICBmcmVlYSAoc2VhcmNoKTsKLS0gIGlmIChmb3VuZHAgIT0gTlVMTCAmJiAoKmZvdW5kcCktPmNvdW50ZXIgPT0gX25sX21zZ19jYXRfY250cikKLS0gICAgewotLSAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KLS0gICAgICBpZiAocGx1cmFsKQotLQlyZXR2YWwgPSBwbHVyYWxfbG9va3VwICgoKmZvdW5kcCktPmRvbWFpbiwgbiwgKCpmb3VuZHApLT50cmFuc2xhdGlvbiwKLS0JCQkJKCpmb3VuZHApLT50cmFuc2xhdGlvbl9sZW5ndGgpOwotLSAgICAgIGVsc2UKLS0JcmV0dmFsID0gKGNoYXIgKikgKCpmb3VuZHApLT50cmFuc2xhdGlvbjsKLS0KLS0gICAgICBnbF9yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0tICAgICAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLS0gICAgICByZXR1cm4gcmV0dmFsOwotLSAgICB9Ci0tI2VuZGlmCi0tCi0tICAvKiBTZWUgd2hldGhlciB0aGlzIGlzIGEgU1VJRCBiaW5hcnkgb3Igbm90LiAgKi8KLS0gIERFVEVSTUlORV9TRUNVUkU7Ci0tCi0tICAvKiBGaXJzdCBmaW5kIG1hdGNoaW5nIGJpbmRpbmcuICAqLwotLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0tICAvKiBXZSBjYW4gdXNlIGEgdHJpdmlhbCBiaW5kaW5nLCBzaW5jZSBfbmxfZmluZF9tc2cgd2lsbCBpZ25vcmUgaXQgYW55d2F5LAotLSAgICAgYW5kIF9ubF9sb2FkX2RvbWFpbiBhbmQgX25sX2ZpbmRfZG9tYWluIGp1c3QgcGFzcyBpdCB0aHJvdWdoLiAgKi8KLS0gIGJpbmRpbmcgPSBOVUxMOwotLSAgZGlybmFtZSA9IGJpbmR0ZXh0ZG9tYWluIChkb21haW5uYW1lLCBOVUxMKTsKLS0jZWxzZQotLSAgZm9yIChiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsgYmluZGluZyAhPSBOVUxMOyBiaW5kaW5nID0gYmluZGluZy0+bmV4dCkKLS0gICAgewotLSAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKLS0gICAgICBpZiAoY29tcGFyZSA9PSAwKQotLQkvKiBXZSBmb3VuZCBpdCEgICovCi0tCWJyZWFrOwotLSAgICAgIGlmIChjb21wYXJlIDwgMCkKLS0JewotLQkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0tCSAgYmluZGluZyA9IE5VTEw7Ci0tCSAgYnJlYWs7Ci0tCX0KLS0gICAgfQotLQotLSAgaWYgKGJpbmRpbmcgPT0gTlVMTCkKLS0gICAgZGlybmFtZSA9IF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICBkaXJuYW1lID0gYmluZGluZy0+ZGlybmFtZTsKLS0jZW5kaWYKLS0gICAgICBpZiAoIUlTX0FCU09MVVRFX1BBVEggKGRpcm5hbWUpKQotLQl7Ci0tCSAgLyogV2UgaGF2ZSBhIHJlbGF0aXZlIHBhdGguICBNYWtlIGl0IGFic29sdXRlIG5vdy4gICovCi0tCSAgc2l6ZV90IGRpcm5hbWVfbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7Ci0tCSAgc2l6ZV90IHBhdGhfbWF4OwotLQkgIGNoYXIgKnJlc29sdmVkX2Rpcm5hbWU7Ci0tCSAgY2hhciAqcmV0OwotLQotLQkgIHBhdGhfbWF4ID0gKHVuc2lnbmVkIGludCkgUEFUSF9NQVg7Ci0tCSAgcGF0aF9tYXggKz0gMjsJCS8qIFRoZSBnZXRjd2QgZG9jcyBzYXkgdG8gZG8gdGhpcy4gICovCi0tCi0tCSAgZm9yICg7OykKLS0JICAgIHsKLS0JICAgICAgcmVzb2x2ZWRfZGlybmFtZSA9IChjaGFyICopIGFsbG9jYSAocGF0aF9tYXggKyBkaXJuYW1lX2xlbik7Ci0tCSAgICAgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgdG1wX2Rpcm5hbWUpOwotLQotLQkgICAgICBfX3NldF9lcnJubyAoMCk7Ci0tCSAgICAgIHJldCA9IGdldGN3ZCAocmVzb2x2ZWRfZGlybmFtZSwgcGF0aF9tYXgpOwotLQkgICAgICBpZiAocmV0ICE9IE5VTEwgfHwgZXJybm8gIT0gRVJBTkdFKQotLQkJYnJlYWs7Ci0tCi0tCSAgICAgIHBhdGhfbWF4ICs9IHBhdGhfbWF4IC8gMjsKLS0JICAgICAgcGF0aF9tYXggKz0gUEFUSF9JTkNSOwotLQkgICAgfQotLQotLQkgIGlmIChyZXQgPT0gTlVMTCkKLS0JICAgIC8qIFdlIGNhbm5vdCBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICBEb24ndCBzaWduYWwgYW4KLS0JICAgICAgIGVycm9yIGJ1dCBzaW1wbHkgcmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZy4gICovCi0tCSAgICBnb3RvIHJldHVybl91bnRyYW5zbGF0ZWQ7Ci0tCi0tCSAgc3RwY3B5IChzdHBjcHkgKHN0cmNociAocmVzb2x2ZWRfZGlybmFtZSwgJ1wwJyksICIvIiksIGRpcm5hbWUpOwotLQkgIGRpcm5hbWUgPSByZXNvbHZlZF9kaXJuYW1lOwotLQl9Ci0tI2lmbmRlZiBJTl9MSUJHTE9DQUxFCi0tICAgIH0KLS0jZW5kaWYKLS0KLS0gIC8qIE5vdyBkZXRlcm1pbmUgdGhlIHN5bWJvbGljIG5hbWUgb2YgQ0FURUdPUlkgYW5kIGl0cyB2YWx1ZS4gICovCi0tICBjYXRlZ29yeW5hbWUgPSBjYXRlZ29yeV90b19uYW1lIChjYXRlZ29yeSk7Ci0tI2lmZGVmIElOX0xJQkdMT0NBTEUKLS0gIGNhdGVnb3J5dmFsdWUgPSBndWVzc19jYXRlZ29yeV92YWx1ZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSwgbG9jYWxlbmFtZSk7Ci0tI2Vsc2UKLS0gIGNhdGVnb3J5dmFsdWUgPSBndWVzc19jYXRlZ29yeV92YWx1ZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSk7Ci0tI2VuZGlmCi0tCi0tICBkb21haW5uYW1lX2xlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSk7Ci0tICB4ZG9tYWlubmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChjYXRlZ29yeW5hbWUpCi0tCQkJCSArIGRvbWFpbm5hbWVfbGVuICsgNSk7Ci0tICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHhkb21haW5uYW1lKTsKLS0KLS0gIHN0cGNweSAoKGNoYXIgKikgbWVtcGNweSAoc3RwY3B5IChzdHBjcHkgKHhkb21haW5uYW1lLCBjYXRlZ29yeW5hbWUpLCAiLyIpLAotLQkJCSAgICBkb21haW5uYW1lLCBkb21haW5uYW1lX2xlbiksCi0tCSAgIi5tbyIpOwotLQotLSAgLyogQ3JlYXRpbmcgd29ya2luZyBhcmVhLiAgKi8KLS0gIHNpbmdsZV9sb2NhbGUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnl2YWx1ZSkgKyAxKTsKLS0gIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgc2luZ2xlX2xvY2FsZSk7Ci0tCi0tCi0tICAvKiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBzdHJpbmcuICBUaGlzIGlzIGEgbG9vcCBiZWNhdXNlIHdlIHBlcmhhcHMKLS0gICAgIGdvdCBhbiBvcmRlcmVkIGxpc3Qgb2YgbGFuZ3VhZ2VzIHRvIGNvbnNpZGVyIGZvciB0aGUgdHJhbnNsYXRpb24uICAqLwotLSAgd2hpbGUgKDEpCi0tICAgIHsKLS0gICAgICAvKiBNYWtlIENBVEVHT1JZVkFMVUUgcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4gICovCi0tICAgICAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdID09ICc6JykKLS0JKytjYXRlZ29yeXZhbHVlOwotLSAgICAgIGlmIChjYXRlZ29yeXZhbHVlWzBdID09ICdcMCcpCi0tCXsKLS0JICAvKiBUaGUgd2hvbGUgY29udGVudHMgb2YgQ0FURUdPUllWQUxVRSBoYXMgYmVlbiBzZWFyY2hlZCBidXQKLS0JICAgICBubyB2YWxpZCBlbnRyeSBoYXMgYmVlbiBmb3VuZC4gIFdlIHNvbHZlIHRoaXMgc2l0dWF0aW9uCi0tCSAgICAgYnkgaW1wbGljaXRseSBhcHBlbmRpbmcgYSAiQyIgZW50cnksIGkuZS4gbm8gdHJhbnNsYXRpb24KLS0JICAgICB3aWxsIHRha2UgcGxhY2UuICAqLwotLQkgIHNpbmdsZV9sb2NhbGVbMF0gPSAnQyc7Ci0tCSAgc2luZ2xlX2xvY2FsZVsxXSA9ICdcMCc7Ci0tCX0KLS0gICAgICBlbHNlCi0tCXsKLS0JICBjaGFyICpjcCA9IHNpbmdsZV9sb2NhbGU7Ci0tCSAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdICE9ICc6JykKLS0JICAgICpjcCsrID0gKmNhdGVnb3J5dmFsdWUrKzsKLS0JICAqY3AgPSAnXDAnOwotLQotLQkgIC8qIFdoZW4gdGhpcyBpcyBhIFNVSUQgYmluYXJ5IHdlIG11c3Qgbm90IGFsbG93IGFjY2Vzc2luZyBmaWxlcwotLQkgICAgIG91dHNpZGUgdGhlIGRlZGljYXRlZCBkaXJlY3Rvcmllcy4gICovCi0tCSAgaWYgKEVOQUJMRV9TRUNVUkUgJiYgSVNfUEFUSF9XSVRIX0RJUiAoc2luZ2xlX2xvY2FsZSkpCi0tCSAgICAvKiBJbmdvcmUgdGhpcyBlbnRyeS4gICovCi0tCSAgICBjb250aW51ZTsKLS0JfQotLQotLSAgICAgIC8qIElmIHRoZSBjdXJyZW50IGxvY2FsZSB2YWx1ZSBpcyBDIChvciBQT1NJWCkgd2UgZG9uJ3QgbG9hZCBhCi0tCSBkb21haW4uICBSZXR1cm4gdGhlIE1TR0lELiAgKi8KLS0gICAgICBpZiAoc3RyY21wIChzaW5nbGVfbG9jYWxlLCAiQyIpID09IDAKLS0JICB8fCBzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJQT1NJWCIpID09IDApCi0tCWJyZWFrOwotLQotLSAgICAgIC8qIEZpbmQgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBtYXRjaGluZyB0aGUKLS0JIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZLiAgKi8KLS0gICAgICBkb21haW4gPSBfbmxfZmluZF9kb21haW4gKGRpcm5hbWUsIHNpbmdsZV9sb2NhbGUsIHhkb21haW5uYW1lLCBiaW5kaW5nKTsKLS0KLS0gICAgICBpZiAoZG9tYWluICE9IE5VTEwpCi0tCXsKLS0jaWYgZGVmaW5lZCBJTl9MSUJHTE9DQUxFCi0tCSAgcmV0dmFsID0gX25sX2ZpbmRfbXNnIChkb21haW4sIGJpbmRpbmcsIGVuY29kaW5nLCBtc2dpZDEsICZyZXRsZW4pOwotLSNlbHNlCi0tCSAgcmV0dmFsID0gX25sX2ZpbmRfbXNnIChkb21haW4sIGJpbmRpbmcsIG1zZ2lkMSwgMSwgJnJldGxlbik7Ci0tI2VuZGlmCi0tCi0tCSAgaWYgKHJldHZhbCA9PSBOVUxMKQotLQkgICAgewotLQkgICAgICBpbnQgY250OwotLQotLQkgICAgICBmb3IgKGNudCA9IDA7IGRvbWFpbi0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCi0tCQl7Ci0tI2lmIGRlZmluZWQgSU5fTElCR0xPQ0FMRQotLQkJICByZXR2YWwgPSBfbmxfZmluZF9tc2cgKGRvbWFpbi0+c3VjY2Vzc29yW2NudF0sIGJpbmRpbmcsCi0tCQkJCQkgZW5jb2RpbmcsIG1zZ2lkMSwgJnJldGxlbik7Ci0tI2Vsc2UKLS0JCSAgcmV0dmFsID0gX25sX2ZpbmRfbXNnIChkb21haW4tPnN1Y2Nlc3NvcltjbnRdLCBiaW5kaW5nLAotLQkJCQkJIG1zZ2lkMSwgMSwgJnJldGxlbik7Ci0tI2VuZGlmCi0tCi0tCQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKLS0JCSAgICB7Ci0tCQkgICAgICBkb21haW4gPSBkb21haW4tPnN1Y2Nlc3NvcltjbnRdOwotLQkJICAgICAgYnJlYWs7Ci0tCQkgICAgfQotLQkJfQotLQkgICAgfQotLQotLQkgIC8qIFJldHVybmluZyAtMSBtZWFucyB0aGF0IHNvbWUgcmVzb3VyY2UgcHJvYmxlbSBleGlzdHMKLS0JICAgICAobGlrZWx5IG1lbW9yeSkgYW5kIHRoYXQgdGhlIHN0cmluZ3MgY291bGQgbm90IGJlCi0tCSAgICAgY29udmVydGVkLiAgUmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmdzLiAgKi8KLS0JICBpZiAoX19idWlsdGluX2V4cGVjdCAocmV0dmFsID09IChjaGFyICopIC0xLCAwKSkKLS0JICAgIGJyZWFrOwotLQotLQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKLS0JICAgIHsKLS0JICAgICAgLyogRm91bmQgdGhlIHRyYW5zbGF0aW9uIG9mIE1TR0lEMSBpbiBkb21haW4gRE9NQUlOOgotLQkJIHN0YXJ0aW5nIGF0IFJFVFZBTCwgUkVUTEVOIGJ5dGVzLiAgKi8KLS0JICAgICAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotLQkgICAgICBpZiAoZm91bmRwID09IE5VTEwpCi0tCQl7Ci0tCQkgIC8qIENyZWF0ZSBhIG5ldyBlbnRyeSBhbmQgYWRkIGl0IHRvIHRoZSBzZWFyY2ggdHJlZS4gICovCi0tCQkgIHNpemVfdCBzaXplOwotLQkJICBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqbmV3cDsKLS0KLS0JCSAgc2l6ZSA9IG9mZnNldG9mIChzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCwgbXNnaWQpCi0tCQkJICsgbXNnaWRfbGVuICsgZG9tYWlubmFtZV9sZW4gKyAxOwotLSNpZmRlZiBIQVZFX1BFUl9USFJFQURfTE9DQUxFCi0tCQkgIHNpemUgKz0gc3RybGVuIChsb2NhbGVuYW1lKSArIDE7Ci0tI2VuZGlmCi0tCQkgIG5ld3AgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikgbWFsbG9jIChzaXplKTsKLS0JCSAgaWYgKG5ld3AgIT0gTlVMTCkKLS0JCSAgICB7Ci0tCQkgICAgICBjaGFyICpuZXdfZG9tYWlubmFtZTsKLS0jaWZkZWYgSEFWRV9QRVJfVEhSRUFEX0xPQ0FMRQotLQkJICAgICAgY2hhciAqbmV3X2xvY2FsZW5hbWU7Ci0tI2VuZGlmCi0tCi0tCQkgICAgICBuZXdfZG9tYWlubmFtZSA9Ci0tCQkJKGNoYXIgKikgbWVtcGNweSAobmV3cC0+bXNnaWQsIG1zZ2lkMSwgbXNnaWRfbGVuKTsKLS0JCSAgICAgIG1lbWNweSAobmV3X2RvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGRvbWFpbm5hbWVfbGVuICsgMSk7Ci0tI2lmZGVmIEhBVkVfUEVSX1RIUkVBRF9MT0NBTEUKLS0JCSAgICAgIG5ld19sb2NhbGVuYW1lID0gbmV3X2RvbWFpbm5hbWUgKyBkb21haW5uYW1lX2xlbiArIDE7Ci0tCQkgICAgICBzdHJjcHkgKG5ld19sb2NhbGVuYW1lLCBsb2NhbGVuYW1lKTsKLS0jZW5kaWYKLS0JCSAgICAgIG5ld3AtPmRvbWFpbm5hbWUgPSBuZXdfZG9tYWlubmFtZTsKLS0JCSAgICAgIG5ld3AtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0tI2lmZGVmIEhBVkVfUEVSX1RIUkVBRF9MT0NBTEUKLS0JCSAgICAgIG5ld3AtPmxvY2FsZW5hbWUgPSBuZXdfbG9jYWxlbmFtZTsKLS0jZW5kaWYKLS0jaWZkZWYgSU5fTElCR0xPQ0FMRQotLQkJICAgICAgbmV3cC0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKLS0jZW5kaWYKLS0JCSAgICAgIG5ld3AtPmNvdW50ZXIgPSBfbmxfbXNnX2NhdF9jbnRyOwotLQkJICAgICAgbmV3cC0+ZG9tYWluID0gZG9tYWluOwotLQkJICAgICAgbmV3cC0+dHJhbnNsYXRpb24gPSByZXR2YWw7Ci0tCQkgICAgICBuZXdwLT50cmFuc2xhdGlvbl9sZW5ndGggPSByZXRsZW47Ci0tCi0tCQkgICAgICBnbF9yd2xvY2tfd3Jsb2NrICh0cmVlX2xvY2spOwotLQotLQkJICAgICAgLyogSW5zZXJ0IHRoZSBlbnRyeSBpbiB0aGUgc2VhcmNoIHRyZWUuICAqLwotLQkJICAgICAgZm91bmRwID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICoqKQotLQkJCXRzZWFyY2ggKG5ld3AsICZyb290LCB0cmFuc2NtcCk7Ci0tCi0tCQkgICAgICBnbF9yd2xvY2tfdW5sb2NrICh0cmVlX2xvY2spOwotLQotLQkJICAgICAgaWYgKGZvdW5kcCA9PSBOVUxMCi0tCQkJICB8fCBfX2J1aWx0aW5fZXhwZWN0ICgqZm91bmRwICE9IG5ld3AsIDApKQotLQkJCS8qIFRoZSBpbnNlcnQgZmFpbGVkLiAgKi8KLS0JCQlmcmVlIChuZXdwKTsKLS0JCSAgICB9Ci0tCQl9Ci0tCSAgICAgIGVsc2UKLS0JCXsKLS0JCSAgLyogV2UgY2FuIHVwZGF0ZSB0aGUgZXhpc3RpbmcgZW50cnkuICAqLwotLQkJICAoKmZvdW5kcCktPmNvdW50ZXIgPSBfbmxfbXNnX2NhdF9jbnRyOwotLQkJICAoKmZvdW5kcCktPmRvbWFpbiA9IGRvbWFpbjsKLS0JCSAgKCpmb3VuZHApLT50cmFuc2xhdGlvbiA9IHJldHZhbDsKLS0JCSAgKCpmb3VuZHApLT50cmFuc2xhdGlvbl9sZW5ndGggPSByZXRsZW47Ci0tCQl9Ci0tCi0tCSAgICAgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Ci0tCi0tCSAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KLS0JICAgICAgaWYgKHBsdXJhbCkKLS0JCXJldHZhbCA9IHBsdXJhbF9sb29rdXAgKGRvbWFpbiwgbiwgcmV0dmFsLCByZXRsZW4pOwotLQotLQkgICAgICBnbF9yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0tCSAgICAgIHJldHVybiByZXR2YWw7Ci0tCSAgICB9Ci0tCX0KLS0gICAgfQotLQotLSByZXR1cm5fdW50cmFuc2xhdGVkOgotLSAgLyogUmV0dXJuIHRoZSB1bnRyYW5zbGF0ZWQgTVNHSUQuICAqLwotLSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotLSAgZ2xfcndsb2NrX3VubG9jayAoX25sX3N0YXRlX2xvY2spOwotLSNpZm5kZWYgX0xJQkMKLS0gIGlmICghRU5BQkxFX1NFQ1VSRSkKLS0gICAgewotLSAgICAgIGV4dGVybiB2b2lkIF9ubF9sb2dfdW50cmFuc2xhdGVkIChjb25zdCBjaGFyICpsb2dmaWxlbmFtZSwKLS0JCQkJCWNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCi0tCQkJCQljb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwKLS0JCQkJCWludCBwbHVyYWwpOwotLSAgICAgIGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lID0gZ2V0ZW52ICgiR0VUVEVYVF9MT0dfVU5UUkFOU0xBVEVEIik7Ci0tCi0tICAgICAgaWYgKGxvZ2ZpbGVuYW1lICE9IE5VTEwgJiYgbG9nZmlsZW5hbWVbMF0gIT0gJ1wwJykKLS0JX25sX2xvZ191bnRyYW5zbGF0ZWQgKGxvZ2ZpbGVuYW1lLCBkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgcGx1cmFsKTsKLS0gICAgfQotLSNlbmRpZgotLSAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLS0gIHJldHVybiAocGx1cmFsID09IDAKLS0JICA/IChjaGFyICopIG1zZ2lkMQotLQkgIC8qIFVzZSB0aGUgR2VybWFuaWMgcGx1cmFsIHJ1bGUuICAqLwotLQkgIDogbiA9PSAxID8gKGNoYXIgKikgbXNnaWQxIDogKGNoYXIgKikgbXNnaWQyKTsKLS19Ci0tCi0tCi0tLyogTG9vayB1cCB0aGUgdHJhbnNsYXRpb24gb2YgbXNnaWQgd2l0aGluIERPTUFJTl9GSUxFIGFuZCBET01BSU5CSU5ESU5HLgotLSAgIFJldHVybiBpdCBpZiBmb3VuZC4gIFJldHVybiBOVUxMIGlmIG5vdCBmb3VuZCBvciBpbiBjYXNlIG9mIGEgY29udmVyc2lvbgotLSAgIGZhaWx1cmUgKHByb2JsZW0gaW4gdGhlIHBhcnRpY3VsYXIgbWVzc2FnZSBjYXRhbG9nKS4gIFJldHVybiAoY2hhciAqKSAtMQotLSAgIGluIGNhc2Ugb2YgYSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGR1cmluZyBjb252ZXJzaW9uIChvbmx5IGlmCi0tICAgRU5DT0RJTkcgIT0gTlVMTCByZXNwLiBDT05WRVJUID09IHRydWUpLiAgKi8KLS1jaGFyICoKLS1pbnRlcm5hbF9mdW5jdGlvbgotLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0tX25sX2ZpbmRfbXNnIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKLS0JICAgICAgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcsIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotLQkgICAgICBjb25zdCBjaGFyICptc2dpZCwKLS0JICAgICAgc2l6ZV90ICpsZW5ndGhwKQotLSNlbHNlCi0tX25sX2ZpbmRfbXNnIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKLS0JICAgICAgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcsCi0tCSAgICAgIGNvbnN0IGNoYXIgKm1zZ2lkLCBpbnQgY29udmVydCwKLS0JICAgICAgc2l6ZV90ICpsZW5ndGhwKQotLSNlbmRpZgotLXsKLS0gIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47Ci0tICBubHNfdWludDMyIG5zdHJpbmdzOwotLSAgc2l6ZV90IGFjdDsKLS0gIGNoYXIgKnJlc3VsdDsKLS0gIHNpemVfdCByZXN1bHRsZW47Ci0tCi0tICBpZiAoZG9tYWluX2ZpbGUtPmRlY2lkZWQgPD0gMCkKLS0gICAgX25sX2xvYWRfZG9tYWluIChkb21haW5fZmlsZSwgZG9tYWluYmluZGluZyk7Ci0tCi0tICBpZiAoZG9tYWluX2ZpbGUtPmRhdGEgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tCi0tICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluX2ZpbGUtPmRhdGE7Ci0tCi0tICBuc3RyaW5ncyA9IGRvbWFpbi0+bnN0cmluZ3M7Ci0tCi0tICAvKiBMb2NhdGUgdGhlIE1TR0lEIGFuZCBpdHMgdHJhbnNsYXRpb24uICAqLwotLSAgaWYgKGRvbWFpbi0+aGFzaF90YWIgIT0gTlVMTCkKLS0gICAgewotLSAgICAgIC8qIFVzZSB0aGUgaGFzaGluZyB0YWJsZS4gICovCi0tICAgICAgbmxzX3VpbnQzMiBsZW4gPSBzdHJsZW4gKG1zZ2lkKTsKLS0gICAgICBubHNfdWludDMyIGhhc2hfdmFsID0gX19oYXNoX3N0cmluZyAobXNnaWQpOwotLSAgICAgIG5sc191aW50MzIgaWR4ID0gaGFzaF92YWwgJSBkb21haW4tPmhhc2hfc2l6ZTsKLS0gICAgICBubHNfdWludDMyIGluY3IgPSAxICsgKGhhc2hfdmFsICUgKGRvbWFpbi0+aGFzaF9zaXplIC0gMikpOwotLQotLSAgICAgIHdoaWxlICgxKQotLQl7Ci0tCSAgbmxzX3VpbnQzMiBuc3RyID0KLS0JICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiLCBkb21haW4tPmhhc2hfdGFiW2lkeF0pOwotLQotLQkgIGlmIChuc3RyID09IDApCi0tCSAgICAvKiBIYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LiAgKi8KLS0JICAgIHJldHVybiBOVUxMOwotLQotLQkgIG5zdHItLTsKLS0KLS0JICAvKiBDb21wYXJlIG1zZ2lkIHdpdGggdGhlIG9yaWdpbmFsIHN0cmluZyBhdCBpbmRleCBuc3RyLgotLQkgICAgIFdlIGNvbXBhcmUgdGhlIGxlbmd0aHMgd2l0aCA+PSwgbm90ID09LCBiZWNhdXNlIHBsdXJhbCBlbnRyaWVzCi0tCSAgICAgYXJlIHJlcHJlc2VudGVkIGJ5IHN0cmluZ3Mgd2l0aCBhbiBlbWJlZGRlZCBOVUwuICAqLwotLQkgIGlmIChuc3RyIDwgbnN0cmluZ3MKLS0JICAgICAgPyBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5vcmlnX3RhYltuc3RyXS5sZW5ndGgpID49IGxlbgotLQkJJiYgKHN0cmNtcCAobXNnaWQsCi0tCQkJICAgIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotLQkJCQkJICAgICAgZG9tYWluLT5vcmlnX3RhYltuc3RyXS5vZmZzZXQpKQotLQkJICAgID09IDApCi0tCSAgICAgIDogZG9tYWluLT5vcmlnX3N5c2RlcF90YWJbbnN0ciAtIG5zdHJpbmdzXS5sZW5ndGggPiBsZW4KLS0JCSYmIChzdHJjbXAgKG1zZ2lkLAotLQkJCSAgICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYltuc3RyIC0gbnN0cmluZ3NdLnBvaW50ZXIpCi0tCQkgICAgPT0gMCkpCi0tCSAgICB7Ci0tCSAgICAgIGFjdCA9IG5zdHI7Ci0tCSAgICAgIGdvdG8gZm91bmQ7Ci0tCSAgICB9Ci0tCi0tCSAgaWYgKGlkeCA+PSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3IpCi0tCSAgICBpZHggLT0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyOwotLQkgIGVsc2UKLS0JICAgIGlkeCArPSBpbmNyOwotLQl9Ci0tICAgICAgLyogTk9UUkVBQ0hFRCAqLwotLSAgICB9Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICAvKiBUcnkgdGhlIGRlZmF1bHQgbWV0aG9kOiAgYmluYXJ5IHNlYXJjaCBpbiB0aGUgc29ydGVkIGFycmF5IG9mCi0tCSBtZXNzYWdlcy4gICovCi0tICAgICAgc2l6ZV90IHRvcCwgYm90dG9tOwotLQotLSAgICAgIGJvdHRvbSA9IDA7Ci0tICAgICAgdG9wID0gbnN0cmluZ3M7Ci0tICAgICAgd2hpbGUgKGJvdHRvbSA8IHRvcCkKLS0JewotLQkgIGludCBjbXBfdmFsOwotLQotLQkgIGFjdCA9IChib3R0b20gKyB0b3ApIC8gMjsKLS0JICBjbXBfdmFsID0gc3RyY21wIChtc2dpZCwgKGRvbWFpbi0+ZGF0YQotLQkJCQkgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLS0JCQkJCSBkb21haW4tPm9yaWdfdGFiW2FjdF0ub2Zmc2V0KSkpOwotLQkgIGlmIChjbXBfdmFsIDwgMCkKLS0JICAgIHRvcCA9IGFjdDsKLS0JICBlbHNlIGlmIChjbXBfdmFsID4gMCkKLS0JICAgIGJvdHRvbSA9IGFjdCArIDE7Ci0tCSAgZWxzZQotLQkgICAgZ290byBmb3VuZDsKLS0JfQotLSAgICAgIC8qIE5vIHRyYW5zbGF0aW9uIHdhcyBmb3VuZC4gICovCi0tICAgICAgcmV0dXJuIE5VTEw7Ci0tICAgIH0KLS0KLS0gZm91bmQ6Ci0tICAvKiBUaGUgdHJhbnNsYXRpb24gd2FzIGZvdW5kIGF0IGluZGV4IEFDVC4gIElmIHdlIGhhdmUgdG8gY29udmVydCB0aGUKLS0gICAgIHN0cmluZyB0byB1c2UgYSBkaWZmZXJlbnQgY2hhcmFjdGVyIHNldCwgdGhpcyBpcyB0aGUgdGltZS4gICovCi0tICBpZiAoYWN0IDwgbnN0cmluZ3MpCi0tICAgIHsKLS0gICAgICByZXN1bHQgPSAoY2hhciAqKQotLQkoZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+dHJhbnNfdGFiW2FjdF0ub2Zmc2V0KSk7Ci0tICAgICAgcmVzdWx0bGVuID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+dHJhbnNfdGFiW2FjdF0ubGVuZ3RoKSArIDE7Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgewotLSAgICAgIHJlc3VsdCA9IChjaGFyICopIGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYlthY3QgLSBuc3RyaW5nc10ucG9pbnRlcjsKLS0gICAgICByZXN1bHRsZW4gPSBkb21haW4tPnRyYW5zX3N5c2RlcF90YWJbYWN0IC0gbnN0cmluZ3NdLmxlbmd0aDsKLS0gICAgfQotLQotLSNpZiBkZWZpbmVkIF9MSUJDIHx8IEhBVkVfSUNPTlYKLS0jIGlmZGVmIElOX0xJQkdMT0NBTEUKLS0gIGlmIChlbmNvZGluZyAhPSBOVUxMKQotLSMgZWxzZQotLSAgaWYgKGNvbnZlcnQpCi0tIyBlbmRpZgotLSAgICB7Ci0tICAgICAgLyogV2UgYXJlIHN1cHBvc2VkIHRvIGRvIGEgY29udmVyc2lvbi4gICovCi0tIyBpZm5kZWYgSU5fTElCR0xPQ0FMRQotLSAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nID0gZ2V0X291dHB1dF9jaGFyc2V0IChkb21haW5iaW5kaW5nKTsKLS0jIGVuZGlmCi0tICAgICAgc2l6ZV90IG5jb252ZXJzaW9uczsKLS0gICAgICBzdHJ1Y3QgY29udmVydGVkX2RvbWFpbiAqY29udmQ7Ci0tICAgICAgc2l6ZV90IGk7Ci0tCi0tICAgICAgLyogUHJvdGVjdCBhZ2FpbnN0IHJlYWxsb2NhdGlvbiBvZiB0aGUgdGFibGUuICAqLwotLSAgICAgIGdsX3J3bG9ja19yZGxvY2sgKGRvbWFpbi0+Y29udmVyc2lvbnNfbG9jayk7Ci0tCi0tICAgICAgLyogU2VhcmNoIHdoZXRoZXIgYSB0YWJsZSB3aXRoIGNvbnZlcnRlZCB0cmFuc2xhdGlvbnMgZm9yIHRoaXMKLS0JIGVuY29kaW5nIGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLiAgKi8KLS0gICAgICBuY29udmVyc2lvbnMgPSBkb21haW4tPm5jb252ZXJzaW9uczsKLS0gICAgICBjb252ZCA9IE5VTEw7Ci0tCi0tICAgICAgZm9yIChpID0gbmNvbnZlcnNpb25zOyBpID4gMDsgKQotLQl7Ci0tCSAgaS0tOwotLQkgIGlmIChzdHJjbXAgKGRvbWFpbi0+Y29udmVyc2lvbnNbaV0uZW5jb2RpbmcsIGVuY29kaW5nKSA9PSAwKQotLQkgICAgewotLQkgICAgICBjb252ZCA9ICZkb21haW4tPmNvbnZlcnNpb25zW2ldOwotLQkgICAgICBicmVhazsKLS0JICAgIH0KLS0JfQotLQotLSAgICAgIGdsX3J3bG9ja191bmxvY2sgKGRvbWFpbi0+Y29udmVyc2lvbnNfbG9jayk7Ci0tCi0tICAgICAgaWYgKGNvbnZkID09IE5VTEwpCi0tCXsKLS0JICAvKiBXZSBoYXZlIHRvIGFsbG9jYXRlIGEgbmV3IGNvbnZlcnNpb25zIHRhYmxlLiAgKi8KLS0JICBnbF9yd2xvY2tfd3Jsb2NrIChkb21haW4tPmNvbnZlcnNpb25zX2xvY2spOwotLQotLQkgIC8qIE1heWJlIGluIHRoZSBtZWFudGltZSBzb21lYm9keSBhZGRlZCB0aGUgdHJhbnNsYXRpb24uCi0tCSAgICAgUmVjaGVjay4gICovCi0tCSAgZm9yIChpID0gbmNvbnZlcnNpb25zOyBpID4gMDsgKQotLQkgICAgewotLQkgICAgICBpLS07Ci0tCSAgICAgIGlmIChzdHJjbXAgKGRvbWFpbi0+Y29udmVyc2lvbnNbaV0uZW5jb2RpbmcsIGVuY29kaW5nKSA9PSAwKQotLQkJewotLQkJICBjb252ZCA9ICZkb21haW4tPmNvbnZlcnNpb25zW2ldOwotLQkJICBnb3RvIGZvdW5kX2NvbnZkOwotLQkJfQotLQkgICAgfQotLQotLQkgIHsKLS0JICAgIC8qIEFsbG9jYXRlIGEgdGFibGUgZm9yIHRoZSBjb252ZXJ0ZWQgdHJhbnNsYXRpb25zIGZvciB0aGlzCi0tCSAgICAgICBlbmNvZGluZy4gICovCi0tCSAgICBzdHJ1Y3QgY29udmVydGVkX2RvbWFpbiAqbmV3X2NvbnZlcnNpb25zID0KLS0JICAgICAgKHN0cnVjdCBjb252ZXJ0ZWRfZG9tYWluICopCi0tCSAgICAgIChkb21haW4tPmNvbnZlcnNpb25zICE9IE5VTEwKLS0JICAgICAgID8gcmVhbGxvYyAoZG9tYWluLT5jb252ZXJzaW9ucywKLS0JCQkgIChuY29udmVyc2lvbnMgKyAxKSAqIHNpemVvZiAoc3RydWN0IGNvbnZlcnRlZF9kb21haW4pKQotLQkgICAgICAgOiBtYWxsb2MgKChuY29udmVyc2lvbnMgKyAxKSAqIHNpemVvZiAoc3RydWN0IGNvbnZlcnRlZF9kb21haW4pKSk7Ci0tCi0tCSAgICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3X2NvbnZlcnNpb25zID09IE5VTEwsIDApKQotLQkgICAgICB7Ci0tCQkvKiBOb3RoaW5nIHdlIGNhbiBkbywgbm8gbW9yZSBtZW1vcnkuICBXZSBjYW5ub3QgdXNlIHRoZQotLQkJICAgdHJhbnNsYXRpb24gYmVjYXVzZSBpdCBtaWdodCBiZSBlbmNvZGVkIGluY29ycmVjdGx5LiAgKi8KLS0JICAgICAgdW5sb2NrX2ZhaWw6Ci0tCQlnbF9yd2xvY2tfdW5sb2NrIChkb21haW4tPmNvbnZlcnNpb25zX2xvY2spOwotLQkJcmV0dXJuIChjaGFyICopIC0xOwotLQkgICAgICB9Ci0tCi0tCSAgICBkb21haW4tPmNvbnZlcnNpb25zID0gbmV3X2NvbnZlcnNpb25zOwotLQotLQkgICAgLyogQ29weSB0aGUgJ2VuY29kaW5nJyBzdHJpbmcgdG8gcGVybWFuZW50IHN0b3JhZ2UuICAqLwotLQkgICAgZW5jb2RpbmcgPSBzdHJkdXAgKGVuY29kaW5nKTsKLS0JICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChlbmNvZGluZyA9PSBOVUxMLCAwKSkKLS0JICAgICAgLyogTm90aGluZyB3ZSBjYW4gZG8sIG5vIG1vcmUgbWVtb3J5LiAgV2UgY2Fubm90IHVzZSB0aGUKLS0JCSB0cmFuc2xhdGlvbiBiZWNhdXNlIGl0IG1pZ2h0IGJlIGVuY29kZWQgaW5jb3JyZWN0bHkuICAqLwotLQkgICAgICBnb3RvIHVubG9ja19mYWlsOwotLQotLQkgICAgY29udmQgPSAmbmV3X2NvbnZlcnNpb25zW25jb252ZXJzaW9uc107Ci0tCSAgICBjb252ZC0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKLS0KLS0JICAgIC8qIEZpbmQgb3V0IGFib3V0IHRoZSBjaGFyYWN0ZXIgc2V0IHRoZSBmaWxlIGlzIGVuY29kZWQgd2l0aC4KLS0JICAgICAgIFRoaXMgY2FuIGJlIGZvdW5kIChpbiB0ZXh0dWFsIGZvcm0pIGluIHRoZSBlbnRyeSAiIi4gIElmIHRoaXMKLS0JICAgICAgIGVudHJ5IGRvZXMgbm90IGV4aXN0IG9yIGlmIHRoaXMgZG9lcyBub3QgY29udGFpbiB0aGUgJ2NoYXJzZXQ9JwotLQkgICAgICAgaW5mb3JtYXRpb24sIHdlIHdpbGwgYXNzdW1lIHRoZSBjaGFyc2V0IG1hdGNoZXMgdGhlIG9uZSB0aGUKLS0JICAgICAgIGN1cnJlbnQgbG9jYWxlIGFuZCB3ZSBkb24ndCBoYXZlIHRvIHBlcmZvcm0gYW55IGNvbnZlcnNpb24uICAqLwotLSMgaWZkZWYgX0xJQkMKLS0JICAgIGNvbnZkLT5jb252ID0gKF9fZ2NvbnZfdCkgLTE7Ci0tIyBlbHNlCi0tIyAgaWYgSEFWRV9JQ09OVgotLQkgICAgY29udmQtPmNvbnYgPSAoaWNvbnZfdCkgLTE7Ci0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tCSAgICB7Ci0tCSAgICAgIGNoYXIgKm51bGxlbnRyeTsKLS0JICAgICAgc2l6ZV90IG51bGxlbnRyeWxlbjsKLS0KLS0JICAgICAgLyogR2V0IHRoZSBoZWFkZXIgZW50cnkuICBUaGlzIGlzIGEgcmVjdXJzaW9uLCBidXQgaXQgZG9lc24ndAotLQkJIHJlYWxsb2NhdGUgZG9tYWluLT5jb252ZXJzaW9ucyBiZWNhdXNlIHdlIHBhc3MKLS0JCSBlbmNvZGluZyA9IE5VTEwgb3IgY29udmVydCA9IDAsIHJlc3BlY3RpdmVseS4gICovCi0tCSAgICAgIG51bGxlbnRyeSA9Ci0tIyBpZmRlZiBJTl9MSUJHTE9DQUxFCi0tCQlfbmxfZmluZF9tc2cgKGRvbWFpbl9maWxlLCBkb21haW5iaW5kaW5nLCBOVUxMLCAiIiwKLS0JCQkgICAgICAmbnVsbGVudHJ5bGVuKTsKLS0jIGVsc2UKLS0JCV9ubF9maW5kX21zZyAoZG9tYWluX2ZpbGUsIGRvbWFpbmJpbmRpbmcsICIiLCAwLCAmbnVsbGVudHJ5bGVuKTsKLS0jIGVuZGlmCi0tCi0tCSAgICAgIGlmIChudWxsZW50cnkgIT0gTlVMTCkKLS0JCXsKLS0JCSAgY29uc3QgY2hhciAqY2hhcnNldHN0cjsKLS0KLS0JCSAgY2hhcnNldHN0ciA9IHN0cnN0ciAobnVsbGVudHJ5LCAiY2hhcnNldD0iKTsKLS0JCSAgaWYgKGNoYXJzZXRzdHIgIT0gTlVMTCkKLS0JCSAgICB7Ci0tCQkgICAgICBzaXplX3QgbGVuOwotLQkJICAgICAgY2hhciAqY2hhcnNldDsKLS0JCSAgICAgIGNvbnN0IGNoYXIgKm91dGNoYXJzZXQ7Ci0tCi0tCQkgICAgICBjaGFyc2V0c3RyICs9IHN0cmxlbiAoImNoYXJzZXQ9Iik7Ci0tCQkgICAgICBsZW4gPSBzdHJjc3BuIChjaGFyc2V0c3RyLCAiIFx0XG4iKTsKLS0KLS0JCSAgICAgIGNoYXJzZXQgPSAoY2hhciAqKSBhbGxvY2EgKGxlbiArIDEpOwotLSMgaWYgZGVmaW5lZCBfTElCQyB8fCBIQVZFX01FTVBDUFkKLS0JCSAgICAgICooKGNoYXIgKikgbWVtcGNweSAoY2hhcnNldCwgY2hhcnNldHN0ciwgbGVuKSkgPSAnXDAnOwotLSMgZWxzZQotLQkJICAgICAgbWVtY3B5IChjaGFyc2V0LCBjaGFyc2V0c3RyLCBsZW4pOwotLQkJICAgICAgY2hhcnNldFtsZW5dID0gJ1wwJzsKLS0jIGVuZGlmCi0tCi0tCQkgICAgICBvdXRjaGFyc2V0ID0gZW5jb2Rpbmc7Ci0tCi0tIyBpZmRlZiBfTElCQwotLQkJICAgICAgLyogV2UgYWx3YXlzIHdhbnQgdG8gdXNlIHRyYW5zbGl0ZXJhdGlvbi4gICovCi0tCQkgICAgICBvdXRjaGFyc2V0ID0gbm9ybV9hZGRfc2xhc2hlcyAob3V0Y2hhcnNldCwgIlRSQU5TTElUIik7Ci0tCQkgICAgICBjaGFyc2V0ID0gbm9ybV9hZGRfc2xhc2hlcyAoY2hhcnNldCwgIiIpOwotLQkJICAgICAgaW50IHIgPSBfX2djb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQsICZjb252ZC0+Y29udiwKLS0JCQkJCSAgICBHQ09OVl9BVk9JRF9OT0NPTlYpOwotLQkJICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHIgIT0gX19HQ09OVl9PSywgMCkpCi0tCQkJewotLQkJCSAgLyogSWYgdGhlIG91dHB1dCBlbmNvZGluZyBpcyB0aGUgc2FtZSB0aGVyZSBpcwotLQkJCSAgICAgbm90aGluZyB0byBkby4gIE90aGVyd2lzZSBkbyBub3QgdXNlIHRoZQotLQkJCSAgICAgdHJhbnNsYXRpb24gYXQgYWxsLiAgKi8KLS0JCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyICE9IF9fR0NPTlZfTlVMQ09OViwgMSkpCi0tCQkJICAgIHsKLS0JCQkgICAgICBnbF9yd2xvY2tfdW5sb2NrIChkb21haW4tPmNvbnZlcnNpb25zX2xvY2spOwotLQkJCSAgICAgIGZyZWUgKChjaGFyICopIGVuY29kaW5nKTsKLS0JCQkgICAgICByZXR1cm4gTlVMTDsKLS0JCQkgICAgfQotLQotLQkJCSAgY29udmQtPmNvbnYgPSAoX19nY29udl90KSAtMTsKLS0JCQl9Ci0tIyBlbHNlCi0tIyAgaWYgSEFWRV9JQ09OVgotLQkJICAgICAgLyogV2hlbiB1c2luZyBHTlUgbGliYyA+PSAyLjIgb3IgR05VIGxpYmljb252ID49IDEuNSwKLS0JCQkgd2Ugd2FudCB0byB1c2UgdHJhbnNsaXRlcmF0aW9uLiAgKi8KLS0jICAgaWYgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAyKSB8fCBfX0dMSUJDX18gPiAyIFwKLS0gICAgICAgfHwgX0xJQklDT05WX1ZFUlNJT04gPj0gMHgwMTA1Ci0tCQkgICAgICBpZiAoc3RyY2hyIChvdXRjaGFyc2V0LCAnLycpID09IE5VTEwpCi0tCQkJewotLQkJCSAgY2hhciAqdG1wOwotLQotLQkJCSAgbGVuID0gc3RybGVuIChvdXRjaGFyc2V0KTsKLS0JCQkgIHRtcCA9IChjaGFyICopIGFsbG9jYSAobGVuICsgMTAgKyAxKTsKLS0JCQkgIG1lbWNweSAodG1wLCBvdXRjaGFyc2V0LCBsZW4pOwotLQkJCSAgbWVtY3B5ICh0bXAgKyBsZW4sICIvL1RSQU5TTElUIiwgMTAgKyAxKTsKLS0JCQkgIG91dGNoYXJzZXQgPSB0bXA7Ci0tCi0tCQkJICBjb252ZC0+Y29udiA9IGljb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQpOwotLQotLQkJCSAgZnJlZWEgKG91dGNoYXJzZXQpOwotLQkJCX0KLS0JCSAgICAgIGVsc2UKLS0jICAgZW5kaWYKLS0JCQljb252ZC0+Y29udiA9IGljb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQpOwotLSMgIGVuZGlmCi0tIyBlbmRpZgotLQotLQkJICAgICAgZnJlZWEgKGNoYXJzZXQpOwotLQkJICAgIH0KLS0JCX0KLS0JICAgIH0KLS0JICAgIGNvbnZkLT5jb252X3RhYiA9IE5VTEw7Ci0tCSAgICAvKiBIZXJlIGRvbWFpbi0+Y29udmVyc2lvbnMgaXMgc3RpbGwgPT0gbmV3X2NvbnZlcnNpb25zLiAgKi8KLS0JICAgIGRvbWFpbi0+bmNvbnZlcnNpb25zKys7Ci0tCSAgfQotLQotLQlmb3VuZF9jb252ZDoKLS0JICBnbF9yd2xvY2tfdW5sb2NrIChkb21haW4tPmNvbnZlcnNpb25zX2xvY2spOwotLQl9Ci0tCi0tICAgICAgaWYgKAotLSMgaWZkZWYgX0xJQkMKLS0JICBjb252ZC0+Y29udiAhPSAoX19nY29udl90KSAtMQotLSMgZWxzZQotLSMgIGlmIEhBVkVfSUNPTlYKLS0JICBjb252ZC0+Y29udiAhPSAoaWNvbnZfdCkgLTEKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0JICApCi0tCXsKLS0JICAvKiBXZSBhcmUgc3VwcG9zZWQgdG8gZG8gYSBjb252ZXJzaW9uLiAgRmlyc3QgYWxsb2NhdGUgYW4KLS0JICAgICBhcHByb3ByaWF0ZSB0YWJsZSB3aXRoIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyB0aGUgdGFibGUKLS0JICAgICBvZiB0cmFuc2xhdGlvbnMgaW4gdGhlIGZpbGUsIHdoZXJlIHdlIGNhbiBwdXQgdGhlIHBvaW50ZXJzCi0tCSAgICAgdG8gdGhlIGNvbnZlcnRlZCBzdHJpbmdzIGluLgotLQkgICAgIFRoZXJlIGlzIGEgc2xpZ2h0IGNvbXBsaWNhdGlvbiB3aXRoIHBsdXJhbCBlbnRyaWVzLiAgVGhleQotLQkgICAgIGFyZSByZXByZXNlbnRlZCBieSBjb25zZWN1dGl2ZSBOVUwgdGVybWluYXRlZCBzdHJpbmdzLiAgV2UKLS0JICAgICBoYW5kbGUgdGhpcyBjYXNlIGJ5IGNvbnZlcnRpbmcgUkVTVUxUTEVOIGJ5dGVzLCBpbmNsdWRpbmcKLS0JICAgICBOVUxzLiAgKi8KLS0KLS0JICBpZiAoY29udmQtPmNvbnZfdGFiID09IE5VTEwKLS0JICAgICAgJiYgKChjb252ZC0+Y29udl90YWIgPQotLQkJICAgIChjaGFyICoqKSBjYWxsb2MgKG5zdHJpbmdzICsgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzLAotLQkJCQkgICAgICBzaXplb2YgKGNoYXIgKikpKQotLQkJICA9PSBOVUxMKSkKLS0JICAgIC8qIE1hcmsgdGhhdCB3ZSBkaWRuJ3Qgc3VjY2VlZCBhbGxvY2F0aW5nIGEgdGFibGUuICAqLwotLQkgICAgY29udmQtPmNvbnZfdGFiID0gKGNoYXIgKiopIC0xOwotLQotLQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChjb252ZC0+Y29udl90YWIgPT0gKGNoYXIgKiopIC0xLCAwKSkKLS0JICAgIC8qIE5vdGhpbmcgd2UgY2FuIGRvLCBubyBtb3JlIG1lbW9yeS4gIFdlIGNhbm5vdCB1c2UgdGhlCi0tCSAgICAgICB0cmFuc2xhdGlvbiBiZWNhdXNlIGl0IG1pZ2h0IGJlIGVuY29kZWQgaW5jb3JyZWN0bHkuICAqLwotLQkgICAgcmV0dXJuIChjaGFyICopIC0xOwotLQotLQkgIGlmIChjb252ZC0+Y29udl90YWJbYWN0XSA9PSBOVUxMKQotLQkgICAgewotLQkgICAgICAvKiBXZSBoYXZlbid0IHVzZWQgdGhpcyBzdHJpbmcgc28gZmFyLCBzbyBpdCBpcyBub3QKLS0JCSB0cmFuc2xhdGVkIHlldC4gIERvIHRoaXMgbm93LiAgKi8KLS0JICAgICAgLyogV2UgdXNlIGEgYml0IG1vcmUgZWZmaWNpZW50IG1lbW9yeSBoYW5kbGluZy4KLS0JCSBXZSBhbGxvY2F0ZSBhbHdheXMgbGFyZ2VyIGJsb2NrcyB3aGljaCBnZXQgdXNlZCBvdmVyCi0tCQkgdGltZS4gIFRoaXMgaXMgZmFzdGVyIHRoYW4gbWFueSBzbWFsbCBhbGxvY2F0aW9ucy4gICAqLwotLQkgICAgICBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKHN0YXRpYywgbG9jaykKLS0jIGRlZmluZSBJTklUSUFMX0JMT0NLX1NJWkUJNDA4MAotLQkgICAgICBzdGF0aWMgdW5zaWduZWQgY2hhciAqZnJlZW1lbTsKLS0JICAgICAgc3RhdGljIHNpemVfdCBmcmVlbWVtX3NpemU7Ci0tCi0tCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmOwotLQkgICAgICB1bnNpZ25lZCBjaGFyICpvdXRidWY7Ci0tCSAgICAgIGludCBtYWxsb2NfY291bnQ7Ci0tIyBpZm5kZWYgX0xJQkMKLS0JICAgICAgdHJhbnNtZW1fYmxvY2tfdCAqdHJhbnNtZW1fbGlzdCA9IE5VTEw7Ci0tIyBlbmRpZgotLQotLQkgICAgICBfX2xpYmNfbG9ja19sb2NrIChsb2NrKTsKLS0KLS0JICAgICAgaW5idWYgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSByZXN1bHQ7Ci0tCSAgICAgIG91dGJ1ZiA9IGZyZWVtZW0gKyBzaXplb2YgKHNpemVfdCk7Ci0tCi0tCSAgICAgIG1hbGxvY19jb3VudCA9IDA7Ci0tCSAgICAgIHdoaWxlICgxKQotLQkJewotLQkJICB0cmFuc21lbV9ibG9ja190ICpuZXdtZW07Ci0tIyBpZmRlZiBfTElCQwotLQkJICBzaXplX3Qgbm9uX3JldmVyc2libGU7Ci0tCQkgIGludCByZXM7Ci0tCi0tCQkgIGlmIChmcmVlbWVtX3NpemUgPCBzaXplb2YgKHNpemVfdCkpCi0tCQkgICAgZ290byByZXNpemVfZnJlZW1lbTsKLS0KLS0JCSAgcmVzID0gX19nY29udiAoY29udmQtPmNvbnYsCi0tCQkJCSAmaW5idWYsIGluYnVmICsgcmVzdWx0bGVuLAotLQkJCQkgJm91dGJ1ZiwKLS0JCQkJIG91dGJ1ZiArIGZyZWVtZW1fc2l6ZSAtIHNpemVvZiAoc2l6ZV90KSwKLS0JCQkJICZub25fcmV2ZXJzaWJsZSk7Ci0tCi0tCQkgIGlmIChyZXMgPT0gX19HQ09OVl9PSyB8fCByZXMgPT0gX19HQ09OVl9FTVBUWV9JTlBVVCkKLS0JCSAgICBicmVhazsKLS0KLS0JCSAgaWYgKHJlcyAhPSBfX0dDT05WX0ZVTExfT1VUUFVUKQotLQkJICAgIHsKLS0JCSAgICAgIC8qIFdlIHNob3VsZCBub3QgdXNlIHRoZSB0cmFuc2xhdGlvbiBhdCBhbGwsIGl0Ci0tCQkJIGlzIGluY29ycmVjdGx5IGVuY29kZWQuICAqLwotLQkJICAgICAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKLS0JCSAgICAgIHJldHVybiBOVUxMOwotLQkJICAgIH0KLS0KLS0JCSAgaW5idWYgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSByZXN1bHQ7Ci0tIyBlbHNlCi0tIyAgaWYgSEFWRV9JQ09OVgotLQkJICBjb25zdCBjaGFyICppbnB0ciA9IChjb25zdCBjaGFyICopIGluYnVmOwotLQkJICBzaXplX3QgaW5sZWZ0ID0gcmVzdWx0bGVuOwotLQkJICBjaGFyICpvdXRwdHIgPSAoY2hhciAqKSBvdXRidWY7Ci0tCQkgIHNpemVfdCBvdXRsZWZ0OwotLQotLQkJICBpZiAoZnJlZW1lbV9zaXplIDwgc2l6ZW9mIChzaXplX3QpKQotLQkJICAgIGdvdG8gcmVzaXplX2ZyZWVtZW07Ci0tCi0tCQkgIG91dGxlZnQgPSBmcmVlbWVtX3NpemUgLSBzaXplb2YgKHNpemVfdCk7Ci0tCQkgIGlmIChpY29udiAoY29udmQtPmNvbnYsCi0tCQkJICAgICAoSUNPTlZfQ09OU1QgY2hhciAqKikgJmlucHRyLCAmaW5sZWZ0LAotLQkJCSAgICAgJm91dHB0ciwgJm91dGxlZnQpCi0tCQkgICAgICAhPSAoc2l6ZV90KSAoLTEpKQotLQkJICAgIHsKLS0JCSAgICAgIG91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIG91dHB0cjsKLS0JCSAgICAgIGJyZWFrOwotLQkJICAgIH0KLS0JCSAgaWYgKGVycm5vICE9IEUyQklHKQotLQkJICAgIHsKLS0JCSAgICAgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7Ci0tCQkgICAgICByZXR1cm4gTlVMTDsKLS0JCSAgICB9Ci0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tCi0tCQlyZXNpemVfZnJlZW1lbToKLS0JCSAgLyogV2UgbXVzdCBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgb3IgcmVzaXplIHRoZSBvbGQgb25lLiAgKi8KLS0JCSAgaWYgKG1hbGxvY19jb3VudCA+IDApCi0tCQkgICAgewotLQkJICAgICAgKyttYWxsb2NfY291bnQ7Ci0tCQkgICAgICBmcmVlbWVtX3NpemUgPSBtYWxsb2NfY291bnQgKiBJTklUSUFMX0JMT0NLX1NJWkU7Ci0tCQkgICAgICBuZXdtZW0gPSAodHJhbnNtZW1fYmxvY2tfdCAqKSByZWFsbG9jICh0cmFuc21lbV9saXN0LAotLQkJCQkJCQkgICAgIGZyZWVtZW1fc2l6ZSk7Ci0tIyBpZmRlZiBfTElCQwotLQkJICAgICAgaWYgKG5ld21lbSAhPSBOVUxMKQotLQkJCXRyYW5zbWVtX2xpc3QgPSB0cmFuc21lbV9saXN0LT5uZXh0OwotLQkJICAgICAgZWxzZQotLQkJCXsKLS0JCQkgIHN0cnVjdCB0cmFuc21lbV9saXN0ICpvbGQgPSB0cmFuc21lbV9saXN0OwotLQotLQkJCSAgdHJhbnNtZW1fbGlzdCA9IHRyYW5zbWVtX2xpc3QtPm5leHQ7Ci0tCQkJICBmcmVlIChvbGQpOwotLQkJCX0KLS0jIGVuZGlmCi0tCQkgICAgfQotLQkJICBlbHNlCi0tCQkgICAgewotLQkJICAgICAgbWFsbG9jX2NvdW50ID0gMTsKLS0JCSAgICAgIGZyZWVtZW1fc2l6ZSA9IElOSVRJQUxfQkxPQ0tfU0laRTsKLS0JCSAgICAgIG5ld21lbSA9ICh0cmFuc21lbV9ibG9ja190ICopIG1hbGxvYyAoZnJlZW1lbV9zaXplKTsKLS0JCSAgICB9Ci0tCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChuZXdtZW0gPT0gTlVMTCwgMCkpCi0tCQkgICAgewotLQkJICAgICAgZnJlZW1lbSA9IE5VTEw7Ci0tCQkgICAgICBmcmVlbWVtX3NpemUgPSAwOwotLQkJICAgICAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKLS0JCSAgICAgIHJldHVybiAoY2hhciAqKSAtMTsKLS0JCSAgICB9Ci0tCi0tIyBpZmRlZiBfTElCQwotLQkJICAvKiBBZGQgdGhlIGJsb2NrIHRvIHRoZSBsaXN0IG9mIGJsb2NrcyB3ZSBoYXZlIHRvIGZyZWUKLS0JCSAgICAgYXQgc29tZSBwb2ludC4gICovCi0tCQkgIG5ld21lbS0+bmV4dCA9IHRyYW5zbWVtX2xpc3Q7Ci0tCQkgIHRyYW5zbWVtX2xpc3QgPSBuZXdtZW07Ci0tCi0tCQkgIGZyZWVtZW0gPSAodW5zaWduZWQgY2hhciAqKSBuZXdtZW0tPmRhdGE7Ci0tCQkgIGZyZWVtZW1fc2l6ZSAtPSBvZmZzZXRvZiAoc3RydWN0IHRyYW5zbWVtX2xpc3QsIGRhdGEpOwotLSMgZWxzZQotLQkJICB0cmFuc21lbV9saXN0ID0gbmV3bWVtOwotLQkJICBmcmVlbWVtID0gbmV3bWVtOwotLSMgZW5kaWYKLS0KLS0JCSAgb3V0YnVmID0gZnJlZW1lbSArIHNpemVvZiAoc2l6ZV90KTsKLS0JCX0KLS0KLS0JICAgICAgLyogV2UgaGF2ZSBub3cgaW4gb3VyIGJ1ZmZlciBhIGNvbnZlcnRlZCBzdHJpbmcuICBQdXQgdGhpcwotLQkJIGludG8gdGhlIHRhYmxlIG9mIGNvbnZlcnNpb25zLiAgKi8KLS0JICAgICAgKihzaXplX3QgKikgZnJlZW1lbSA9IG91dGJ1ZiAtIGZyZWVtZW0gLSBzaXplb2YgKHNpemVfdCk7Ci0tCSAgICAgIGNvbnZkLT5jb252X3RhYlthY3RdID0gKGNoYXIgKikgZnJlZW1lbTsKLS0JICAgICAgLyogU2hyaW5rIGZyZWVtZW0sIGJ1dCBrZWVwIGl0IGFsaWduZWQuICAqLwotLQkgICAgICBmcmVlbWVtX3NpemUgLT0gb3V0YnVmIC0gZnJlZW1lbTsKLS0JICAgICAgZnJlZW1lbSA9IG91dGJ1ZjsKLS0JICAgICAgZnJlZW1lbSArPSBmcmVlbWVtX3NpemUgJiAoYWxpZ25vZiAoc2l6ZV90KSAtIDEpOwotLQkgICAgICBmcmVlbWVtX3NpemUgPSBmcmVlbWVtX3NpemUgJiB+IChhbGlnbm9mIChzaXplX3QpIC0gMSk7Ci0tCi0tCSAgICAgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7Ci0tCSAgICB9Ci0tCi0tCSAgLyogTm93IGNvbnZkLT5jb252X3RhYlthY3RdIGNvbnRhaW5zIHRoZSB0cmFuc2xhdGlvbiBvZiBhbGwKLS0JICAgICB0aGUgcGx1cmFsIHZhcmlhbnRzLiAgKi8KLS0JICByZXN1bHQgPSBjb252ZC0+Y29udl90YWJbYWN0XSArIHNpemVvZiAoc2l6ZV90KTsKLS0JICByZXN1bHRsZW4gPSAqKHNpemVfdCAqKSBjb252ZC0+Y29udl90YWJbYWN0XTsKLS0JfQotLSAgICB9Ci0tCi0tICAvKiBUaGUgcmVzdWx0IHN0cmluZyBpcyBjb252ZXJ0ZWQuICAqLwotLQotLSNlbmRpZiAvKiBfTElCQyB8fCBIQVZFX0lDT05WICovCi0tCi0tICAqbGVuZ3RocCA9IHJlc3VsdGxlbjsKLS0gIHJldHVybiByZXN1bHQ7Ci0tfQotLQotLQotLS8qIExvb2sgdXAgYSBwbHVyYWwgdmFyaWFudC4gICovCi0tc3RhdGljIGNoYXIgKgotLWludGVybmFsX2Z1bmN0aW9uCi0tcGx1cmFsX2xvb2t1cCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluLCB1bnNpZ25lZCBsb25nIGludCBuLAotLQkgICAgICAgY29uc3QgY2hhciAqdHJhbnNsYXRpb24sIHNpemVfdCB0cmFuc2xhdGlvbl9sZW4pCi0tewotLSAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbmRhdGEgPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluLT5kYXRhOwotLSAgdW5zaWduZWQgbG9uZyBpbnQgaW5kZXg7Ci0tICBjb25zdCBjaGFyICpwOwotLQotLSAgaW5kZXggPSBwbHVyYWxfZXZhbCAoZG9tYWluZGF0YS0+cGx1cmFsLCBuKTsKLS0gIGlmIChpbmRleCA+PSBkb21haW5kYXRhLT5ucGx1cmFscykKLS0gICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgSXQgbWVhbnMgdGhlIHBsdXJhbCBleHByZXNzaW9uIGFuZCB0aGUKLS0gICAgICAgZ2l2ZW4gbWF4aW11bSB2YWx1ZSBkbyBub3QgbWF0Y2guICAqLwotLSAgICBpbmRleCA9IDA7Ci0tCi0tICAvKiBTa2lwIElOREVYIHN0cmluZ3MgYXQgVFJBTlNMQVRJT04uICAqLwotLSAgcCA9IHRyYW5zbGF0aW9uOwotLSAgd2hpbGUgKGluZGV4LS0gPiAwKQotLSAgICB7Ci0tI2lmZGVmIF9MSUJDCi0tICAgICAgcCA9IF9fcmF3bWVtY2hyIChwLCAnXDAnKTsKLS0jZWxzZQotLSAgICAgIHAgPSBzdHJjaHIgKHAsICdcMCcpOwotLSNlbmRpZgotLSAgICAgIC8qIEFuZCBza2lwIG92ZXIgdGhlIE5VTCBieXRlLiAgKi8KLS0gICAgICBwKys7Ci0tCi0tICAgICAgaWYgKHAgPj0gdHJhbnNsYXRpb24gKyB0cmFuc2xhdGlvbl9sZW4pCi0tCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEl0IG1lYW5zIHRoZSBwbHVyYWwgZXhwcmVzc2lvbgotLQkgICBldmFsdWF0ZWQgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHZhcmlhbnRzCi0tCSAgIGF2YWlsYWJsZSBmb3IgTVNHSUQxLiAgKi8KLS0JcmV0dXJuIChjaGFyICopIHRyYW5zbGF0aW9uOwotLSAgICB9Ci0tICByZXR1cm4gKGNoYXIgKikgcDsKLS19Ci0tCi0tI2lmbmRlZiBfTElCQwotLS8qIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbG9jYWxlIENBVEVHT1JZLiAgKi8KLS1zdGF0aWMgY29uc3QgY2hhciAqCi0taW50ZXJuYWxfZnVuY3Rpb24KLS1jYXRlZ29yeV90b19uYW1lIChpbnQgY2F0ZWdvcnkpCi0tewotLSAgY29uc3QgY2hhciAqcmV0dmFsOwotLQotLSAgc3dpdGNoIChjYXRlZ29yeSkKLS0gIHsKLS0jaWZkZWYgTENfQ09MTEFURQotLSAgY2FzZSBMQ19DT0xMQVRFOgotLSAgICByZXR2YWwgPSAiTENfQ09MTEFURSI7Ci0tICAgIGJyZWFrOwotLSNlbmRpZgotLSNpZmRlZiBMQ19DVFlQRQotLSAgY2FzZSBMQ19DVFlQRToKLS0gICAgcmV0dmFsID0gIkxDX0NUWVBFIjsKLS0gICAgYnJlYWs7Ci0tI2VuZGlmCi0tI2lmZGVmIExDX01PTkVUQVJZCi0tICBjYXNlIExDX01PTkVUQVJZOgotLSAgICByZXR2YWwgPSAiTENfTU9ORVRBUlkiOwotLSAgICBicmVhazsKLS0jZW5kaWYKLS0jaWZkZWYgTENfTlVNRVJJQwotLSAgY2FzZSBMQ19OVU1FUklDOgotLSAgICByZXR2YWwgPSAiTENfTlVNRVJJQyI7Ci0tICAgIGJyZWFrOwotLSNlbmRpZgotLSNpZmRlZiBMQ19USU1FCi0tICBjYXNlIExDX1RJTUU6Ci0tICAgIHJldHZhbCA9ICJMQ19USU1FIjsKLS0gICAgYnJlYWs7Ci0tI2VuZGlmCi0tI2lmZGVmIExDX01FU1NBR0VTCi0tICBjYXNlIExDX01FU1NBR0VTOgotLSAgICByZXR2YWwgPSAiTENfTUVTU0FHRVMiOwotLSAgICBicmVhazsKLS0jZW5kaWYKLS0jaWZkZWYgTENfUkVTUE9OU0UKLS0gIGNhc2UgTENfUkVTUE9OU0U6Ci0tICAgIHJldHZhbCA9ICJMQ19SRVNQT05TRSI7Ci0tICAgIGJyZWFrOwotLSNlbmRpZgotLSNpZmRlZiBMQ19BTEwKLS0gIGNhc2UgTENfQUxMOgotLSAgICAvKiBUaGlzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlIGJ1dCBpcyBwZXJoYXBzIGJldHRlciB0aGFuIGFueSBvdGhlcgotLSAgICAgICB2YWx1ZS4gICovCi0tICAgIHJldHZhbCA9ICJMQ19BTEwiOwotLSAgICBicmVhazsKLS0jZW5kaWYKLS0gIGRlZmF1bHQ6Ci0tICAgIC8qIElmIHlvdSBoYXZlIGEgYmV0dGVyIGlkZWEgZm9yIGEgZGVmYXVsdCB2YWx1ZSBsZXQgbWUga25vdy4gICovCi0tICAgIHJldHZhbCA9ICJMQ19YWFgiOwotLSAgfQotLQotLSAgcmV0dXJuIHJldHZhbDsKLS19Ci0tI2VuZGlmCi0tCi0tLyogR3Vlc3MgdmFsdWUgb2YgY3VycmVudCBsb2NhbGUgZnJvbSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0tICAgb3Igc3lzdGVtLWRlcGVuZGVudCBkZWZhdWx0cy4gICovCi0tc3RhdGljIGNvbnN0IGNoYXIgKgotLWludGVybmFsX2Z1bmN0aW9uCi0tI2lmZGVmIElOX0xJQkdMT0NBTEUKLS1ndWVzc19jYXRlZ29yeV92YWx1ZSAoaW50IGNhdGVnb3J5LCBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUsCi0tCQkgICAgICBjb25zdCBjaGFyICpsb2NhbGUpCi0tCi0tI2Vsc2UKLS1ndWVzc19jYXRlZ29yeV92YWx1ZSAoaW50IGNhdGVnb3J5LCBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCi0tI2VuZGlmCi0tewotLSAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7Ci0tI2lmbmRlZiBJTl9MSUJHTE9DQUxFCi0tICBjb25zdCBjaGFyICpsb2NhbGU7Ci0tIyBpZm5kZWYgX0xJQkMKLS0gIGNvbnN0IGNoYXIgKmxhbmd1YWdlX2RlZmF1bHQ7Ci0tICBpbnQgbG9jYWxlX2RlZmF1bHRlZDsKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tICAvKiBXZSB1c2UgdGhlIHNldHRpbmdzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0tICAgICAxLiBUaGUgdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICdMQU5HVUFHRScuICBUaGlzIGlzIGEgR05VCi0tICAgICAgICBleHRlbnNpb24uICBJdHMgdmFsdWUgY2FuIGJlIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgbG9jYWxlIG5hbWVzLgotLSAgICAgMi4gVGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnTENfQUxMJywgJ0xDX3h4eCcsIG9yICdMQU5HJy4KLS0gICAgICAgIE1vcmUgcHJlY2lzZWx5LCB0aGUgZmlyc3QgYW1vbmcgdGhlc2UgdGhhdCBpcyBzZXQgdG8gYSBub24tZW1wdHkgdmFsdWUuCi0tICAgICAgICBUaGlzIGlzIGhvdyBQT1NJWCBzcGVjaWZpZXMgaXQuICBUaGUgdmFsdWUgaXMgYSBzaW5nbGUgbG9jYWxlIG5hbWUuCi0tICAgICAzLiBBIHN5c3RlbS1kZXBlbmRlbnQgcHJlZmVyZW5jZSBsaXN0IG9mIGxhbmd1YWdlcy4gIEl0cyB2YWx1ZSBjYW4gYmUgYQotLSAgICAgICAgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgbG9jYWxlIG5hbWVzLgotLSAgICAgNC4gQSBzeXN0ZW0tZGVwZW5kZW50IGRlZmF1bHQgbG9jYWxlIG5hbWUuCi0tICAgICBUaGlzIHdheToKLS0gICAgICAgLSBTeXN0ZW0tZGVwZW5kZW50IHNldHRpbmdzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGVudmlyb25tZW50IHZhcmlhYmxlcy4KLS0gICAgICAgLSBJZiB0aGUgc3lzdGVtIHByb3ZpZGVzIGJvdGggYSBsaXN0IG9mIGxhbmd1YWdlcyBhbmQgYSBkZWZhdWx0IGxvY2FsZSwKLS0gICAgICAgICB0aGUgZm9ybWVyIGlzIHVzZWQuICAqLwotLQotLSNpZm5kZWYgSU5fTElCR0xPQ0FMRQotLSAgLyogRmV0Y2ggdGhlIGxvY2FsZSBuYW1lLCB0aHJvdWdoIHRoZSBQT1NJWCBtZXRob2Qgb2YgbG9va2luZyB0byBgTENfQUxMJywKLS0gICAgIGBMQ194eHgnLCBhbmQgYExBTkcnLiAgT24gc29tZSBzeXN0ZW1zIHRoaXMgY2FuIGJlIGRvbmUgYnkgdGhlCi0tICAgICBgc2V0bG9jYWxlJyBmdW5jdGlvbiBpdHNlbGYuICAqLwotLSMgaWZkZWYgX0xJQkMKLS0gIGxvY2FsZSA9IF9fY3VycmVudF9sb2NhbGVfbmFtZSAoY2F0ZWdvcnkpOwotLSMgZWxzZQotLSMgIGlmIEhBVkVfU1RSVUNUX19fTE9DQUxFX1NUUlVDVF9fX05BTUVTICYmIGRlZmluZWQgVVNFX0lOX0dFVFRFWFRfVEVTVFMKLS0gIC8qIFRoZSBfX25hbWVzIGZpZWxkIGlzIG5vdCBwdWJsaWMgZ2xpYmMgQVBJIGFuZCBtdXN0IHRoZXJlZm9yZSBub3QgYmUgdXNlZAotLSAgICAgaW4gY29kZSB0aGF0IGlzIGluc3RhbGxlZCBpbiBwdWJsaWMgbG9jYXRpb25zLiAgKi8KLS0gIGxvY2FsZV90IHRocmVhZF9sb2NhbGUgPSB1c2Vsb2NhbGUgKE5VTEwpOwotLSAgaWYgKHRocmVhZF9sb2NhbGUgIT0gTENfR0xPQkFMX0xPQ0FMRSkKLS0gICAgewotLSAgICAgIGxvY2FsZSA9IHRocmVhZF9sb2NhbGUtPl9fbmFtZXNbY2F0ZWdvcnldOwotLSAgICAgIGxvY2FsZV9kZWZhdWx0ZWQgPSAwOwotLSAgICB9Ci0tICBlbHNlCi0tIyAgZW5kaWYKLS0gICAgewotLSAgICAgIGxvY2FsZSA9IF9ubF9sb2NhbGVfbmFtZV9wb3NpeCAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSk7Ci0tICAgICAgbG9jYWxlX2RlZmF1bHRlZCA9IDA7Ci0tICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMKQotLQl7Ci0tCSAgbG9jYWxlID0gX25sX2xvY2FsZV9uYW1lX2RlZmF1bHQgKCk7Ci0tCSAgbG9jYWxlX2RlZmF1bHRlZCA9IDE7Ci0tCX0KLS0gICAgfQotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0gIC8qIElnbm9yZSBMQU5HVUFHRSBhbmQgaXRzIHN5c3RlbS1kZXBlbmRlbnQgYW5hbG9nb24gaWYgdGhlIGxvY2FsZSBpcyBzZXQKLS0gICAgIHRvICJDIiBiZWNhdXNlCi0tICAgICAxLiAiQyIgbG9jYWxlIHVzdWFsbHkgdXNlcyB0aGUgQVNDSUkgZW5jb2RpbmcsIGFuZCBtb3N0IGludGVybmF0aW9uYWwKLS0JbWVzc2FnZXMgdXNlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLiBUaGVzZSBjaGFyYWN0ZXJzIGdldCBkaXNwbGF5ZWQKLS0JYXMgcXVlc3Rpb24gbWFya3MgKGlmIHVzaW5nIGdsaWJjJ3MgaWNvbnYoKSkgb3IgYXMgaW52YWxpZCA4LWJpdAotLQljaGFyYWN0ZXJzIChiZWNhdXNlIG90aGVyIGljb252KClzIHJlZnVzZSB0byBjb252ZXJ0IG1vc3Qgbm9uLUFTQ0lJCi0tCWNoYXJhY3RlcnMgdG8gQVNDSUkpLiBJbiBhbnkgY2FzZSwgdGhlIG91dHB1dCBpcyB1Z2x5LgotLSAgICAgMi4gVGhlIHByZWNpc2Ugb3V0cHV0IG9mIHNvbWUgcHJvZ3JhbXMgaW4gdGhlICJDIiBsb2NhbGUgaXMgc3BlY2lmaWVkCi0tCWJ5IFBPU0lYIGFuZCBzaG91bGQgbm90IGRlcGVuZCBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbGlrZQotLQkiTEFOR1VBR0UiIG9yIHN5c3RlbS1kZXBlbmRlbnQgaW5mb3JtYXRpb24uICBXZSBhbGxvdyBzdWNoIHByb2dyYW1zCi0tICAgICAgICB0byB1c2UgZ2V0dGV4dCgpLiAgKi8KLS0gIGlmIChzdHJjbXAgKGxvY2FsZSwgIkMiKSA9PSAwKQotLSAgICByZXR1cm4gbG9jYWxlOwotLQotLSAgLyogVGhlIGhpZ2hlc3QgcHJpb3JpdHkgdmFsdWUgaXMgdGhlIHZhbHVlIG9mIHRoZSAnTEFOR1VBR0UnIGVudmlyb25tZW50Ci0tICAgICB2YXJpYWJsZS4gICovCi0tICBsYW5ndWFnZSA9IGdldGVudiAoIkxBTkdVQUdFIik7Ci0tICBpZiAobGFuZ3VhZ2UgIT0gTlVMTCAmJiBsYW5ndWFnZVswXSAhPSAnXDAnKQotLSAgICByZXR1cm4gbGFuZ3VhZ2U7Ci0tI2lmICFkZWZpbmVkIElOX0xJQkdMT0NBTEUgJiYgIWRlZmluZWQgX0xJQkMKLS0gIC8qIFRoZSBuZXh0IHByaW9yaXR5IHZhbHVlIGlzIHRoZSBsb2NhbGUgbmFtZSwgaWYgbm90IGRlZmF1bHRlZC4gICovCi0tICBpZiAobG9jYWxlX2RlZmF1bHRlZCkKLS0gICAgewotLSAgICAgIC8qIFRoZSBuZXh0IHByaW9yaXR5IHZhbHVlIGlzIHRoZSBkZWZhdWx0IGxhbmd1YWdlIHByZWZlcmVuY2VzIGxpc3QuICovCi0tICAgICAgbGFuZ3VhZ2VfZGVmYXVsdCA9IF9ubF9sYW5ndWFnZV9wcmVmZXJlbmNlc19kZWZhdWx0ICgpOwotLSAgICAgIGlmIChsYW5ndWFnZV9kZWZhdWx0ICE9IE5VTEwpCi0tICAgICAgICByZXR1cm4gbGFuZ3VhZ2VfZGVmYXVsdDsKLS0gICAgfQotLSAgLyogVGhlIGxlYXN0IHByaW9yaXR5IHZhbHVlIGlzIHRoZSBsb2NhbGUgbmFtZSwgaWYgZGVmYXVsdGVkLiAgKi8KLS0jZW5kaWYKLS0gIHJldHVybiBsb2NhbGU7Ci0tfQotLQotLSNpZiAoZGVmaW5lZCBfTElCQyB8fCBIQVZFX0lDT05WKSAmJiAhZGVmaW5lZCBJTl9MSUJHTE9DQUxFCi0tLyogUmV0dXJucyB0aGUgb3V0cHV0IGNoYXJzZXQuICAqLwotLXN0YXRpYyBjb25zdCBjaGFyICoKLS1pbnRlcm5hbF9mdW5jdGlvbgotLWdldF9vdXRwdXRfY2hhcnNldCAoc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCi0tewotLSAgLyogVGhlIG91dHB1dCBjaGFyc2V0IHNob3VsZCBub3JtYWxseSBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb2NhbGUuICBCdXQKLS0gICAgIHNvbWV0aW1lcyB0aGUgbG9jYWxlIGlzIG5vdCB1c2VkIG9yIG5vdCBjb3JyZWN0bHkgc2V0IHVwLCBzbyB3ZSBwcm92aWRlCi0tICAgICBhIHBvc3NpYmlsaXR5IGZvciB0aGUgdXNlciB0byBvdmVycmlkZSB0aGlzOiB0aGUgT1VUUFVUX0NIQVJTRVQKLS0gICAgIGVudmlyb25tZW50IHZhcmlhYmxlLiAgTW9yZW92ZXIsIHRoZSB2YWx1ZSBzcGVjaWZpZWQgdGhyb3VnaAotLSAgICAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgb3ZlcnJpZGVzIGJvdGguICAqLwotLSAgaWYgKGRvbWFpbmJpbmRpbmcgIT0gTlVMTCAmJiBkb21haW5iaW5kaW5nLT5jb2Rlc2V0ICE9IE5VTEwpCi0tICAgIHJldHVybiBkb21haW5iaW5kaW5nLT5jb2Rlc2V0OwotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgLyogRm9yIHNwZWVkIHJlYXNvbnMsIHdlIGxvb2sgYXQgdGhlIHZhbHVlIG9mIE9VVFBVVF9DSEFSU0VUIG9ubHkKLS0JIG9uY2UuICBUaGlzIGlzIGEgdXNlciB2YXJpYWJsZSB0aGF0IGlzIG5vdCBzdXBwb3NlZCB0byBjaGFuZ2UKLS0JIGR1cmluZyBhIHByb2dyYW0gcnVuLiAgKi8KLS0gICAgICBzdGF0aWMgY2hhciAqb3V0cHV0X2NoYXJzZXRfY2FjaGU7Ci0tICAgICAgc3RhdGljIGludCBvdXRwdXRfY2hhcnNldF9jYWNoZWQ7Ci0tCi0tICAgICAgaWYgKCFvdXRwdXRfY2hhcnNldF9jYWNoZWQpCi0tCXsKLS0JICBjb25zdCBjaGFyICp2YWx1ZSA9IGdldGVudiAoIk9VVFBVVF9DSEFSU0VUIik7Ci0tCi0tCSAgaWYgKHZhbHVlICE9IE5VTEwgJiYgdmFsdWVbMF0gIT0gJ1wwJykKLS0JICAgIHsKLS0JICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAodmFsdWUpICsgMTsKLS0JICAgICAgY2hhciAqdmFsdWVfY29weSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLS0KLS0JICAgICAgaWYgKHZhbHVlX2NvcHkgIT0gTlVMTCkKLS0JCW1lbWNweSAodmFsdWVfY29weSwgdmFsdWUsIGxlbik7Ci0tCSAgICAgIG91dHB1dF9jaGFyc2V0X2NhY2hlID0gdmFsdWVfY29weTsKLS0JICAgIH0KLS0JICBvdXRwdXRfY2hhcnNldF9jYWNoZWQgPSAxOwotLQl9Ci0tCi0tICAgICAgaWYgKG91dHB1dF9jaGFyc2V0X2NhY2hlICE9IE5VTEwpCi0tCXJldHVybiBvdXRwdXRfY2hhcnNldF9jYWNoZTsKLS0gICAgICBlbHNlCi0tCXsKLS0jIGlmZGVmIF9MSUJDCi0tCSAgcmV0dXJuIF9OTF9DVVJSRU5UIChMQ19DVFlQRSwgQ09ERVNFVCk7Ci0tIyBlbHNlCi0tIyAgaWYgSEFWRV9JQ09OVgotLQkgIHJldHVybiBsb2NhbGVfY2hhcnNldCAoKTsKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0JfQotLSAgICB9Ci0tfQotLSNlbmRpZgotLQotLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotLQotLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCi0tICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKLS0gICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQotLSAgIHRvIGJlIGRlZmluZWQuICAqLwotLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi0tc3RhdGljIGNoYXIgKgotLXN0cGNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQotLXsKLS0gIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKLS0gICAgLyogRG8gbm90aGluZy4gKi8gOwotLSAgcmV0dXJuIGRlc3QgLSAxOwotLX0KLS0jZW5kaWYKLS0KLS0jaWYgIV9MSUJDICYmICFIQVZFX01FTVBDUFkKLS1zdGF0aWMgdm9pZCAqCi0tbWVtcGNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKLS17Ci0tICByZXR1cm4gKHZvaWQgKikgKChjaGFyICopIG1lbWNweSAoZGVzdCwgc3JjLCBuKSArIG4pOwotLX0KLS0jZW5kaWYKLS0KLS0jaWYgIV9MSUJDICYmICFIQVZFX1RTRUFSQ0gKLS0jIGluY2x1ZGUgInRzZWFyY2guYyIKLS0jZW5kaWYKLS0KLS0KLS0jaWZkZWYgX0xJQkMKLS0vKiBJZiB3ZSB3YW50IHRvIGZyZWUgYWxsIHJlc291cmNlcyB3ZSBoYXZlIHRvIGRvIHNvbWUgd29yayBhdAotLSAgIHByb2dyYW0ncyBlbmQuICAqLwotLWxpYmNfZnJlZXJlc19mbiAoZnJlZV9tZW0pCi0tewotLSAgdm9pZCAqb2xkOwotLQotLSAgd2hpbGUgKF9ubF9kb21haW5fYmluZGluZ3MgIT0gTlVMTCkKLS0gICAgewotLSAgICAgIHN0cnVjdCBiaW5kaW5nICpvbGRwID0gX25sX2RvbWFpbl9iaW5kaW5nczsKLS0gICAgICBfbmxfZG9tYWluX2JpbmRpbmdzID0gX25sX2RvbWFpbl9iaW5kaW5ncy0+bmV4dDsKLS0gICAgICBpZiAob2xkcC0+ZGlybmFtZSAhPSBfbmxfZGVmYXVsdF9kaXJuYW1lKQotLQkvKiBZZXMsIHRoaXMgaXMgYSBwb2ludGVyIGNvbXBhcmlzb24uICAqLwotLQlmcmVlIChvbGRwLT5kaXJuYW1lKTsKLS0gICAgICBmcmVlIChvbGRwLT5jb2Rlc2V0KTsKLS0gICAgICBmcmVlIChvbGRwKTsKLS0gICAgfQotLQotLSAgaWYgKF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluICE9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKQotLSAgICAvKiBZZXMsIGFnYWluIGEgcG9pbnRlciBjb21wYXJpc29uLiAgKi8KLS0gICAgZnJlZSAoKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4pOwotLQotLSAgLyogUmVtb3ZlIHRoZSBzZWFyY2ggdHJlZSB3aXRoIHRoZSBrbm93biB0cmFuc2xhdGlvbnMuICAqLwotLSAgX190ZGVzdHJveSAocm9vdCwgZnJlZSk7Ci0tICByb290ID0gTlVMTDsKLS0KLS0gIHdoaWxlICh0cmFuc21lbV9saXN0ICE9IE5VTEwpCi0tICAgIHsKLS0gICAgICBvbGQgPSB0cmFuc21lbV9saXN0OwotLSAgICAgIHRyYW5zbWVtX2xpc3QgPSB0cmFuc21lbV9saXN0LT5uZXh0OwotLSAgICAgIGZyZWUgKG9sZCk7Ci0tICAgIH0KLS19Ci0tI2VuZGlmCi0tLS0gYS9pbnRsL2RjbmdldHRleHQuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsNTcgKzAsMCBAQAotLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkY25nZXR0ZXh0KDMpIGZ1bmN0aW9uLgotLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgImdldHRleHRQLmgiCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLS0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLS0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotLSNpZmRlZiBfTElCQwotLSMgZGVmaW5lIERDTkdFVFRFWFQgX19kY25nZXR0ZXh0Ci0tIyBkZWZpbmUgRENJR0VUVEVYVCBfX2RjaWdldHRleHQKLS0jZWxzZQotLSMgZGVmaW5lIERDTkdFVFRFWFQgbGliaW50bF9kY25nZXR0ZXh0Ci0tIyBkZWZpbmUgRENJR0VUVEVYVCBsaWJpbnRsX2RjaWdldHRleHQKLS0jZW5kaWYKLS0KLS0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKLS0gICBsb2NhbGUuICAqLwotLWNoYXIgKgotLURDTkdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCi0tCSAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKLS0JICAgIGludCBjYXRlZ29yeSkKLS17Ci0tICByZXR1cm4gRENJR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIDEsIG4sIGNhdGVnb3J5KTsKLS19Ci0tCi0tI2lmZGVmIF9MSUJDCi0tLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi0td2Vha19hbGlhcyAoX19kY25nZXR0ZXh0LCBkY25nZXR0ZXh0KTsKLS0jZW5kaWYKLS0tLSBhL2ludGwvZGdldHRleHQuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsNTggKzAsMCBAQAotLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkZ2V0dGV4dCgzKSBmdW5jdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotLQotLSNpbmNsdWRlIDxsb2NhbGUuaD4KLS0KLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGxpYmludGwuaD4KLS0jZWxzZQotLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotLSNlbmRpZgotLQotLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS0KLS0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0tICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBkZWZpbmUgREdFVFRFWFQgX19kZ2V0dGV4dAotLSMgZGVmaW5lIERDR0VUVEVYVCBJTlRVU0UoX19kY2dldHRleHQpCi0tI2Vsc2UKLS0jIGRlZmluZSBER0VUVEVYVCBsaWJpbnRsX2RnZXR0ZXh0Ci0tIyBkZWZpbmUgRENHRVRURVhUIGxpYmludGxfZGNnZXR0ZXh0Ci0tI2VuZGlmCi0tCi0tLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgb2YgdGhlIGN1cnJlbnQKLS0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwotLWNoYXIgKgotLURHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZCkKLS17Ci0tICByZXR1cm4gRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpOwotLX0KLS0KLS0jaWZkZWYgX0xJQkMKLS0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLS13ZWFrX2FsaWFzIChfX2RnZXR0ZXh0LCBkZ2V0dGV4dCk7Ci0tI2VuZGlmCi0tLS0gYS9pbnRsL2RuZ2V0dGV4dC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw1OSArMCwwIEBACi0tLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRuZ2V0dGV4dCgzKSBmdW5jdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotLQotLSNpbmNsdWRlIDxsb2NhbGUuaD4KLS0KLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGxpYmludGwuaD4KLS0jZWxzZQotLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotLSNlbmRpZgotLQotLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS0KLS0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0tICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBkZWZpbmUgRE5HRVRURVhUIF9fZG5nZXR0ZXh0Ci0tIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKLS0jZWxzZQotLSMgZGVmaW5lIEROR0VUVEVYVCBsaWJpbnRsX2RuZ2V0dGV4dAotLSMgZGVmaW5lIERDTkdFVFRFWFQgbGliaW50bF9kY25nZXR0ZXh0Ci0tI2VuZGlmCi0tCi0tLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgb2YgdGhlIGN1cnJlbnQKLS0gICBMQ19NRVNTQUdFUyBsb2NhbGUgYW5kIHNraXAgbWVzc2FnZSBhY2NvcmRpbmcgdG8gdGhlIHBsdXJhbCBmb3JtLiAgKi8KLS1jaGFyICoKLS1ETkdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCi0tCSAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQotLXsKLS0gIHJldHVybiBEQ05HRVRURVhUIChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbiwgTENfTUVTU0FHRVMpOwotLX0KLS0KLS0jaWZkZWYgX0xJQkMKLS0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLS13ZWFrX2FsaWFzIChfX2RuZ2V0dGV4dCwgZG5nZXR0ZXh0KTsKLS0jZW5kaWYKLS0tLSBhL2ludGwvZXZhbC1wbHVyYWwuaAotKysrIC9kZXYvbnVsbAotQEAgLTEsMTA4ICswLDAgQEAKLS0vKiBQbHVyYWwgZXhwcmVzc2lvbiBldmFsdWF0aW9uLgotLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzLCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBTVEFUSUMKLS0jZGVmaW5lIFNUQVRJQyBzdGF0aWMKLS0jZW5kaWYKLS0KLS0vKiBFdmFsdWF0ZSB0aGUgcGx1cmFsIGV4cHJlc3Npb24gYW5kIHJldHVybiBhbiBpbmRleCB2YWx1ZS4gICovCi0tU1RBVElDCi0tdW5zaWduZWQgbG9uZyBpbnQKLS1pbnRlcm5hbF9mdW5jdGlvbgotLXBsdXJhbF9ldmFsIChjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcGV4cCwgdW5zaWduZWQgbG9uZyBpbnQgbikKLS17Ci0tICBzd2l0Y2ggKHBleHAtPm5hcmdzKQotLSAgICB7Ci0tICAgIGNhc2UgMDoKLS0gICAgICBzd2l0Y2ggKHBleHAtPm9wZXJhdGlvbikKLS0JewotLQljYXNlIHZhcjoKLS0JICByZXR1cm4gbjsKLS0JY2FzZSBudW06Ci0tCSAgcmV0dXJuIHBleHAtPnZhbC5udW07Ci0tCWRlZmF1bHQ6Ci0tCSAgYnJlYWs7Ci0tCX0KLS0gICAgICAvKiBOT1RSRUFDSEVEICovCi0tICAgICAgYnJlYWs7Ci0tICAgIGNhc2UgMToKLS0gICAgICB7Ci0tCS8qIHBleHAtPm9wZXJhdGlvbiBtdXN0IGJlIGxub3QuICAqLwotLQl1bnNpZ25lZCBsb25nIGludCBhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMF0sIG4pOwotLQlyZXR1cm4gISBhcmc7Ci0tICAgICAgfQotLSAgICBjYXNlIDI6Ci0tICAgICAgewotLQl1bnNpZ25lZCBsb25nIGludCBsZWZ0YXJnID0gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzBdLCBuKTsKLS0JaWYgKHBleHAtPm9wZXJhdGlvbiA9PSBsb3IpCi0tCSAgcmV0dXJuIGxlZnRhcmcgfHwgcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzFdLCBuKTsKLS0JZWxzZSBpZiAocGV4cC0+b3BlcmF0aW9uID09IGxhbmQpCi0tCSAgcmV0dXJuIGxlZnRhcmcgJiYgcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzFdLCBuKTsKLS0JZWxzZQotLQkgIHsKLS0JICAgIHVuc2lnbmVkIGxvbmcgaW50IHJpZ2h0YXJnID0gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzFdLCBuKTsKLS0KLS0JICAgIHN3aXRjaCAocGV4cC0+b3BlcmF0aW9uKQotLQkgICAgICB7Ci0tCSAgICAgIGNhc2UgbXVsdDoKLS0JCXJldHVybiBsZWZ0YXJnICogcmlnaHRhcmc7Ci0tCSAgICAgIGNhc2UgZGl2aWRlOgotLSNpZiAhSU5URElWMF9SQUlTRVNfU0lHRlBFCi0tCQlpZiAocmlnaHRhcmcgPT0gMCkKLS0JCSAgcmFpc2UgKFNJR0ZQRSk7Ci0tI2VuZGlmCi0tCQlyZXR1cm4gbGVmdGFyZyAvIHJpZ2h0YXJnOwotLQkgICAgICBjYXNlIG1vZHVsZToKLS0jaWYgIUlOVERJVjBfUkFJU0VTX1NJR0ZQRQotLQkJaWYgKHJpZ2h0YXJnID09IDApCi0tCQkgIHJhaXNlIChTSUdGUEUpOwotLSNlbmRpZgotLQkJcmV0dXJuIGxlZnRhcmcgJSByaWdodGFyZzsKLS0JICAgICAgY2FzZSBwbHVzOgotLQkJcmV0dXJuIGxlZnRhcmcgKyByaWdodGFyZzsKLS0JICAgICAgY2FzZSBtaW51czoKLS0JCXJldHVybiBsZWZ0YXJnIC0gcmlnaHRhcmc7Ci0tCSAgICAgIGNhc2UgbGVzc190aGFuOgotLQkJcmV0dXJuIGxlZnRhcmcgPCByaWdodGFyZzsKLS0JICAgICAgY2FzZSBncmVhdGVyX3RoYW46Ci0tCQlyZXR1cm4gbGVmdGFyZyA+IHJpZ2h0YXJnOwotLQkgICAgICBjYXNlIGxlc3Nfb3JfZXF1YWw6Ci0tCQlyZXR1cm4gbGVmdGFyZyA8PSByaWdodGFyZzsKLS0JICAgICAgY2FzZSBncmVhdGVyX29yX2VxdWFsOgotLQkJcmV0dXJuIGxlZnRhcmcgPj0gcmlnaHRhcmc7Ci0tCSAgICAgIGNhc2UgZXF1YWw6Ci0tCQlyZXR1cm4gbGVmdGFyZyA9PSByaWdodGFyZzsKLS0JICAgICAgY2FzZSBub3RfZXF1YWw6Ci0tCQlyZXR1cm4gbGVmdGFyZyAhPSByaWdodGFyZzsKLS0JICAgICAgZGVmYXVsdDoKLS0JCWJyZWFrOwotLQkgICAgICB9Ci0tCSAgfQotLQkvKiBOT1RSRUFDSEVEICovCi0tCWJyZWFrOwotLSAgICAgIH0KLS0gICAgY2FzZSAzOgotLSAgICAgIHsKLS0JLyogcGV4cC0+b3BlcmF0aW9uIG11c3QgYmUgcW1vcC4gICovCi0tCXVuc2lnbmVkIGxvbmcgaW50IGJvb2xhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMF0sIG4pOwotLQlyZXR1cm4gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzW2Jvb2xhcmcgPyAxIDogMl0sIG4pOwotLSAgICAgIH0KLS0gICAgfQotLSAgLyogTk9UUkVBQ0hFRCAqLwotLSAgcmV0dXJuIDA7Ci0tfQotLS0tIGEvaW50bC9leHBsb2RlbmFtZS5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxMzUgKzAsMCBAQAotLS8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDEsIDIwMDMsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0tI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotLQotLSNpbmNsdWRlICJsb2FkaW5mby5oIgotLQotLS8qIE9uIHNvbWUgc3RyYW5nZSBzeXN0ZW1zIHN0aWxsIG5vIGRlZmluaXRpb24gb2YgTlVMTCBpcyBmb3VuZC4gIFNpZ2ghICAqLwotLSNpZm5kZWYgTlVMTAotLSMgaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotLSMgZWxzZQotLSMgIGRlZmluZSBOVUxMIDAKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLQotLS8qIFNwbGl0IGEgbG9jYWxlIG5hbWUgTkFNRSBpbnRvIGEgbGVhZGluZyBsYW5ndWFnZSBwYXJ0IGFuZCBhbGwgdGhlCi0tICAgcmVzdC4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgbGFuZ3VhZ2UsCi0tICAgaS5lLiB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVzdC4gICovCi0tc3RhdGljIGNoYXIgKl9ubF9maW5kX2xhbmd1YWdlIChjb25zdCBjaGFyICpuYW1lKTsKLS0KLS1zdGF0aWMgY2hhciAqCi0tX25sX2ZpbmRfbGFuZ3VhZ2UgKGNvbnN0IGNoYXIgKm5hbWUpCi0tewotLSAgd2hpbGUgKG5hbWVbMF0gIT0gJ1wwJyAmJiBuYW1lWzBdICE9ICdfJyAmJiBuYW1lWzBdICE9ICdAJyAmJiBuYW1lWzBdICE9ICcuJykKLS0gICAgKytuYW1lOwotLQotLSAgcmV0dXJuIChjaGFyICopIG5hbWU7Ci0tfQotLQotLQotLWludAotLV9ubF9leHBsb2RlX25hbWUgKGNoYXIgKm5hbWUsCi0tCQkgIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwgY29uc3QgY2hhciAqKm1vZGlmaWVyLAotLQkJICBjb25zdCBjaGFyICoqdGVycml0b3J5LCBjb25zdCBjaGFyICoqY29kZXNldCwKLS0JCSAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldCkKLS17Ci0tICBjaGFyICpjcDsKLS0gIGludCBtYXNrOwotLQotLSAgKm1vZGlmaWVyID0gTlVMTDsKLS0gICp0ZXJyaXRvcnkgPSBOVUxMOwotLSAgKmNvZGVzZXQgPSBOVUxMOwotLSAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IE5VTEw7Ci0tCi0tICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKLS0gICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJywgJy4nLCBhbmQgYEAnLiAgKi8KLS0gIG1hc2sgPSAwOwotLSAgKmxhbmd1YWdlID0gY3AgPSBuYW1lOwotLSAgY3AgPSBfbmxfZmluZF9sYW5ndWFnZSAoKmxhbmd1YWdlKTsKLS0KLS0gIGlmICgqbGFuZ3VhZ2UgPT0gY3ApCi0tICAgIC8qIFRoaXMgZG9lcyBub3QgbWFrZSBzZW5zZTogbGFuZ3VhZ2UgaGFzIHRvIGJlIHNwZWNpZmllZC4gIFVzZQotLSAgICAgICB0aGlzIGVudHJ5IGFzIGl0IGlzIHdpdGhvdXQgZXhwbG9kaW5nLiAgUGVyaGFwcyBpdCBpcyBhbiBhbGlhcy4gICovCi0tICAgIGNwID0gc3RyY2hyICgqbGFuZ3VhZ2UsICdcMCcpOwotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgaWYgKGNwWzBdID09ICdfJykKLS0JewotLQkgIC8qIE5leHQgaXMgdGhlIHRlcnJpdG9yeS4gICovCi0tCSAgY3BbMF0gPSAnXDAnOwotLQkgICp0ZXJyaXRvcnkgPSArK2NwOwotLQotLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcuJyAmJiBjcFswXSAhPSAnQCcpCi0tCSAgICArK2NwOwotLQotLQkgIG1hc2sgfD0gWFBHX1RFUlJJVE9SWTsKLS0JfQotLQotLSAgICAgIGlmIChjcFswXSA9PSAnLicpCi0tCXsKLS0JICAvKiBOZXh0IGlzIHRoZSBjb2Rlc2V0LiAgKi8KLS0JICBjcFswXSA9ICdcMCc7Ci0tCSAgKmNvZGVzZXQgPSArK2NwOwotLQotLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdAJykKLS0JICAgICsrY3A7Ci0tCi0tCSAgbWFzayB8PSBYUEdfQ09ERVNFVDsKLS0KLS0JICBpZiAoKmNvZGVzZXQgIT0gY3AgJiYgKCpjb2Rlc2V0KVswXSAhPSAnXDAnKQotLQkgICAgewotLQkgICAgICAqbm9ybWFsaXplZF9jb2Rlc2V0ID0gX25sX25vcm1hbGl6ZV9jb2Rlc2V0ICgqY29kZXNldCwKLS0JCQkJCQkJICAgY3AgLSAqY29kZXNldCk7Ci0tCSAgICAgIGlmICgqbm9ybWFsaXplZF9jb2Rlc2V0ID09IE5VTEwpCi0tCQlyZXR1cm4gLTE7Ci0tCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoKmNvZGVzZXQsICpub3JtYWxpemVkX2NvZGVzZXQpID09IDApCi0tCQlmcmVlICgoY2hhciAqKSAqbm9ybWFsaXplZF9jb2Rlc2V0KTsKLS0JICAgICAgZWxzZQotLQkJbWFzayB8PSBYUEdfTk9STV9DT0RFU0VUOwotLQkgICAgfQotLQl9Ci0tICAgIH0KLS0KLS0gIGlmIChjcFswXSA9PSAnQCcpCi0tICAgIHsKLS0gICAgICAvKiBOZXh0IGlzIHRoZSBtb2RpZmllci4gICovCi0tICAgICAgY3BbMF0gPSAnXDAnOwotLSAgICAgICptb2RpZmllciA9ICsrY3A7Ci0tCi0tICAgICAgaWYgKGNwWzBdICE9ICdcMCcpCi0tCW1hc2sgfD0gWFBHX01PRElGSUVSOwotLSAgICB9Ci0tCi0tICBpZiAoKnRlcnJpdG9yeSAhPSBOVUxMICYmICgqdGVycml0b3J5KVswXSA9PSAnXDAnKQotLSAgICBtYXNrICY9IH5YUEdfVEVSUklUT1JZOwotLQotLSAgaWYgKCpjb2Rlc2V0ICE9IE5VTEwgJiYgKCpjb2Rlc2V0KVswXSA9PSAnXDAnKQotLSAgICBtYXNrICY9IH5YUEdfQ09ERVNFVDsKLS0KLS0gIHJldHVybiBtYXNrOwotLX0KLS0tLSBhL2ludGwvZXhwb3J0LmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDYgKzAsMCBAQAotLQotLSNpZiBASEFWRV9WSVNJQklMSVRZQCAmJiBCVUlMRElOR19MSUJJTlRMCi0tI2RlZmluZSBMSUJJTlRMX0RMTF9FWFBPUlRFRCBfX2F0dHJpYnV0ZV9fKChfX3Zpc2liaWxpdHlfXygiZGVmYXVsdCIpKSkKLS0jZWxzZQotLSNkZWZpbmUgTElCSU5UTF9ETExfRVhQT1JURUQKLS0jZW5kaWYKLS0tLSBhL2ludGwvZmluZGRvbWFpbi5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSwyMTIgKzAsMCBAQAotLS8qIEhhbmRsZSBsaXN0IG9mIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMSwgMjAwMy0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251Lm9yZz4sIDE5OTUuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPHN0ZGlvLmg+Ci0tI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0tCi0tI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0tIyBpbmNsdWRlIDx1bmlzdGQuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGxpYmludGwuaD4KLS0jZWxzZQotLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotLSNlbmRpZgotLQotLS8qIEhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIF9fbGliY19yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3JkbG9jayBfX2xpYmNfcndsb2NrX3JkbG9jawotLSMgZGVmaW5lIGdsX3J3bG9ja193cmxvY2sgX19saWJjX3J3bG9ja193cmxvY2sKLS0jIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrIF9fbGliY19yd2xvY2tfdW5sb2NrCi0tI2Vsc2UKLS0jIGluY2x1ZGUgImxvY2suaCIKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tLyogTGlzdCBvZiBhbHJlYWR5IGxvYWRlZCBkb21haW5zLiAgKi8KLS1zdGF0aWMgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2xvYWRlZF9kb21haW5zOwotLQotLQotLS8qIFJldHVybiBhIGRhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBkZXNjcmliZWQgYnkKLS0gICB0aGUgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkgcGFyYW1ldGVycyB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnRseQotLSAgIGVzdGFibGlzaGVkIGJpbmRpbmdzLiAgKi8KLS1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLS1pbnRlcm5hbF9mdW5jdGlvbgotLV9ubF9maW5kX2RvbWFpbiAoY29uc3QgY2hhciAqZGlybmFtZSwgY2hhciAqbG9jYWxlLAotLQkJIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nKQotLXsKLS0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKLS0gIGNvbnN0IGNoYXIgKmxhbmd1YWdlOwotLSAgY29uc3QgY2hhciAqbW9kaWZpZXI7Ci0tICBjb25zdCBjaGFyICp0ZXJyaXRvcnk7Ci0tICBjb25zdCBjaGFyICpjb2Rlc2V0OwotLSAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0OwotLSAgY29uc3QgY2hhciAqYWxpYXNfdmFsdWU7Ci0tICBpbnQgbWFzazsKLS0KLS0gIC8qIExPQ0FMRSBjYW4gY29uc2lzdCBvZiB1cCB0byBmb3VyIHJlY29nbml6ZWQgcGFydHMgZm9yIHRoZSBYUEcgc3ludGF4OgotLQotLQkJbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bLmNvZGVzZXRdW0Btb2RpZmllcl0KLS0KLS0gICAgIEJlc2lkZSB0aGUgZmlyc3QgcGFydCBhbGwgb2YgdGhlbSBhcmUgYWxsb3dlZCB0byBiZSBtaXNzaW5nLiAgSWYKLS0gICAgIHRoZSBmdWxsIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLCB0aGUgbGVzcyBzcGVjaWZpYyBvbmUgYXJlCi0tICAgICBsb29rZWQgZm9yLiAgVGhlIHZhcmlvdXMgcGFydHMgd2lsbCBiZSBzdHJpcHBlZCBvZmYgYWNjb3JkaW5nIHRvCi0tICAgICB0aGUgZm9sbG93aW5nIG9yZGVyOgotLQkJKDEpIGNvZGVzZXQKLS0JCSgyKSBub3JtYWxpemVkIGNvZGVzZXQKLS0JCSgzKSB0ZXJyaXRvcnkKLS0JCSg0KSBtb2RpZmllcgotLSAgICovCi0tCi0tICAvKiBXZSBuZWVkIHRvIHByb3RlY3QgbW9kaWZ5aW5nIHRoZSBfTkxfTE9BREVEX0RPTUFJTlMgZGF0YS4gICovCi0tICBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIGxvY2spOwotLSAgZ2xfcndsb2NrX3JkbG9jayAobG9jayk7Ci0tCi0tICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgdGVzdGVkIGZvciB0aGlzIGxvY2FsZSBlbnRyeSB0aGVyZSBoYXMgdG8KLS0gICAgIGJlIG9uZSBkYXRhIHNldCBpbiB0aGUgbGlzdCBvZiBsb2FkZWQgZG9tYWlucy4gICovCi0tICByZXR2YWwgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKCZfbmxfbG9hZGVkX2RvbWFpbnMsIGRpcm5hbWUsCi0tCQkJICAgICAgIHN0cmxlbiAoZGlybmFtZSkgKyAxLCAwLCBsb2NhbGUsIE5VTEwsIE5VTEwsCi0tCQkJICAgICAgIE5VTEwsIE5VTEwsIGRvbWFpbm5hbWUsIDApOwotLQotLSAgZ2xfcndsb2NrX3VubG9jayAobG9jayk7Ci0tCi0tICBpZiAocmV0dmFsICE9IE5VTEwpCi0tICAgIHsKLS0gICAgICAvKiBXZSBrbm93IHNvbWV0aGluZyBhYm91dCB0aGlzIGxvY2FsZS4gICovCi0tICAgICAgaW50IGNudDsKLS0KLS0gICAgICBpZiAocmV0dmFsLT5kZWNpZGVkIDw9IDApCi0tCV9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLCBkb21haW5iaW5kaW5nKTsKLS0KLS0gICAgICBpZiAocmV0dmFsLT5kYXRhICE9IE5VTEwpCi0tCXJldHVybiByZXR2YWw7Ci0tCi0tICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQotLQl7Ci0tCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPD0gMCkKLS0JICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSwgZG9tYWluYmluZGluZyk7Ci0tCi0tCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKLS0JICAgIGJyZWFrOwotLQl9Ci0tCi0tICAgICAgcmV0dXJuIHJldHZhbDsKLS0gICAgICAvKiBOT1RSRUFDSEVEICovCi0tICAgIH0KLS0KLS0gIC8qIFNlZSB3aGV0aGVyIHRoZSBsb2NhbGUgdmFsdWUgaXMgYW4gYWxpYXMuICBJZiB5ZXMgaXRzIHZhbHVlCi0tICAgICAqb3ZlcndyaXRlcyogdGhlIGFsaWFzIG5hbWUuICBObyB0ZXN0IGZvciB0aGUgb3JpZ2luYWwgdmFsdWUgaXMKLS0gICAgIGRvbmUuICAqLwotLSAgYWxpYXNfdmFsdWUgPSBfbmxfZXhwYW5kX2FsaWFzIChsb2NhbGUpOwotLSAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCi0tICAgIHsKLS0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0tICAgICAgbG9jYWxlID0gc3RyZHVwIChhbGlhc192YWx1ZSk7Ci0tICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMKQotLQlyZXR1cm4gTlVMTDsKLS0jZWxzZQotLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFsaWFzX3ZhbHVlKSArIDE7Ci0tICAgICAgbG9jYWxlID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotLSAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCkKLS0JcmV0dXJuIE5VTEw7Ci0tCi0tICAgICAgbWVtY3B5IChsb2NhbGUsIGFsaWFzX3ZhbHVlLCBsZW4pOwotLSNlbmRpZgotLSAgICB9Ci0tCi0tICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKLS0gICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJywgJy4nLCBhbmQgYEAnLiAgKi8KLS0gIG1hc2sgPSBfbmxfZXhwbG9kZV9uYW1lIChsb2NhbGUsICZsYW5ndWFnZSwgJm1vZGlmaWVyLCAmdGVycml0b3J5LAotLQkJCSAgICZjb2Rlc2V0LCAmbm9ybWFsaXplZF9jb2Rlc2V0KTsKLS0gIGlmIChtYXNrID09IC0xKQotLSAgICAvKiBUaGlzIG1lYW5zIHdlIGFyZSBvdXQgb2YgY29yZS4gICovCi0tICAgIHJldHVybiBOVUxMOwotLQotLSAgLyogV2UgbmVlZCB0byBwcm90ZWN0IG1vZGlmeWluZyB0aGUgX05MX0xPQURFRF9ET01BSU5TIGRhdGEuICAqLwotLSAgZ2xfcndsb2NrX3dybG9jayAobG9jayk7Ci0tCi0tICAvKiBDcmVhdGUgYWxsIHBvc3NpYmxlIGxvY2FsZSBlbnRyaWVzIHdoaWNoIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4KLS0gICAgIGdlbmVyYWxpemF0aW9uLiAgKi8KLS0gIHJldHZhbCA9IF9ubF9tYWtlX2wxMG5mbGlzdCAoJl9ubF9sb2FkZWRfZG9tYWlucywgZGlybmFtZSwKLS0JCQkgICAgICAgc3RybGVuIChkaXJuYW1lKSArIDEsIG1hc2ssIGxhbmd1YWdlLCB0ZXJyaXRvcnksCi0tCQkJICAgICAgIGNvZGVzZXQsIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsCi0tCQkJICAgICAgIGRvbWFpbm5hbWUsIDEpOwotLQotLSAgZ2xfcndsb2NrX3VubG9jayAobG9jayk7Ci0tCi0tICBpZiAocmV0dmFsID09IE5VTEwpCi0tICAgIC8qIFRoaXMgbWVhbnMgd2UgYXJlIG91dCBvZiBjb3JlLiAgKi8KLS0gICAgZ290byBvdXQ7Ci0tCi0tICBpZiAocmV0dmFsLT5kZWNpZGVkIDw9IDApCi0tICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLCBkb21haW5iaW5kaW5nKTsKLS0gIGlmIChyZXR2YWwtPmRhdGEgPT0gTlVMTCkKLS0gICAgewotLSAgICAgIGludCBjbnQ7Ci0tICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQotLQl7Ci0tCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPD0gMCkKLS0JICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSwgZG9tYWluYmluZGluZyk7Ci0tCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKLS0JICAgIGJyZWFrOwotLQl9Ci0tICAgIH0KLS0KLS0gIC8qIFRoZSByb29tIGZvciBhbiBhbGlhcyB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAgRnJlZSBpdCBub3cuICAqLwotLSAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCi0tICAgIGZyZWUgKGxvY2FsZSk7Ci0tCi0tb3V0OgotLSAgLyogVGhlIHNwYWNlIGZvciBub3JtYWxpemVkX2NvZGVzZXQgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAgRnJlZSBpdC4gICovCi0tICBpZiAobWFzayAmIFhQR19OT1JNX0NPREVTRVQpCi0tICAgIGZyZWUgKCh2b2lkICopIG5vcm1hbGl6ZWRfY29kZXNldCk7Ci0tCi0tICByZXR1cm4gcmV0dmFsOwotLX0KLS0KLS0KLS0jaWZkZWYgX0xJQkMKLS0vKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGljb252L2djb252X2RiLmMncyBmcmVlX21lbSwgYXMgbG9jYWxlcyBtdXN0Ci0tICAgYmUgZnJlZWQgYmVmb3JlIGZyZWVpbmcgZ2NvbnYgc3RlcHMgYXJyYXlzLiAgKi8KLS12b2lkIF9fbGliY19mcmVlcmVzX2ZuX3NlY3Rpb24KLS1fbmxfZmluZGRvbWFpbl9zdWJmcmVlcmVzICgpCi0tewotLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcnVucCA9IF9ubF9sb2FkZWRfZG9tYWluczsKLS0KLS0gIHdoaWxlIChydW5wICE9IE5VTEwpCi0tICAgIHsKLS0gICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpoZXJlID0gcnVucDsKLS0gICAgICBpZiAocnVucC0+ZGF0YSAhPSBOVUxMKQotLQlfbmxfdW5sb2FkX2RvbWFpbiAoKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIHJ1bnAtPmRhdGEpOwotLSAgICAgIHJ1bnAgPSBydW5wLT5uZXh0OwotLSAgICAgIGZyZWUgKChjaGFyICopIGhlcmUtPmZpbGVuYW1lKTsKLS0gICAgICBmcmVlIChoZXJlKTsKLS0gICAgfQotLX0KLS0jZW5kaWYKLS0tLSBhL2ludGwvZ2V0dGV4dC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw2MyArMCwwIEBACi0tLyogSW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dCgzKSBmdW5jdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSBfX25lZWRfTlVMTAotLSMgaW5jbHVkZSA8c3RkZGVmLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCi0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgImdldHRleHRQLmgiCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLS0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLS0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotLSNpZmRlZiBfTElCQwotLSMgZGVmaW5lIEdFVFRFWFQgX19nZXR0ZXh0Ci0tIyBkZWZpbmUgRENHRVRURVhUIElOVFVTRShfX2RjZ2V0dGV4dCkKLS0jZWxzZQotLSMgZGVmaW5lIEdFVFRFWFQgbGliaW50bF9nZXR0ZXh0Ci0tIyBkZWZpbmUgRENHRVRURVhUIGxpYmludGxfZGNnZXR0ZXh0Ci0tI2VuZGlmCi0tCi0tLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLS0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAotLSAgIHRleHQpLiAgKi8KLS1jaGFyICoKLS1HRVRURVhUIChjb25zdCBjaGFyICptc2dpZCkKLS17Ci0tICByZXR1cm4gRENHRVRURVhUIChOVUxMLCBtc2dpZCwgTENfTUVTU0FHRVMpOwotLX0KLS0KLS0jaWZkZWYgX0xJQkMKLS0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLS13ZWFrX2FsaWFzIChfX2dldHRleHQsIGdldHRleHQpOwotLSNlbmRpZgotLS0tIGEvaW50bC9nZXR0ZXh0UC5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSwyOTcgKzAsMCBAQAotLS8qIEhlYWRlciBkZXNjcmliaW5nIGludGVybmFscyBvZiBsaWJpbnRsIGxpYnJhcnkuCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBfR0VUVEVYVFBfSAotLSNkZWZpbmUgX0dFVFRFWFRQX0gKLS0KLS0jaW5jbHVkZSA8c3RkZGVmLmg+CQkvKiBHZXQgc2l6ZV90LiAgKi8KLS0KLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgIi4uL2ljb252L2djb252X2ludC5oIgotLSNlbHNlCi0tIyBpZiBIQVZFX0lDT05WCi0tIyAgaW5jbHVkZSA8aWNvbnYuaD4KLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tLyogSGFuZGxlIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgotLSMgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmUgX19saWJjX3J3bG9ja19kZWZpbmUKLS0jZWxzZQotLSMgaW5jbHVkZSAibG9jay5oIgotLSNlbmRpZgotLQotLSNpZmRlZiBfTElCQwotLWV4dGVybiBjaGFyICpfX2dldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQpOwotLWV4dGVybiBjaGFyICpfX2RnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpOwotLWV4dGVybiBjaGFyICpfX2RjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAotLQkJCSAgaW50IF9fY2F0ZWdvcnkpOwotLWV4dGVybiBjaGFyICpfX25nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0tCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fbik7Ci0tZXh0ZXJuIGNoYXIgKl9fZG5nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0tCQkJICBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0tCQkJICB1bnNpZ25lZCBsb25nIGludCBuKTsKLS1leHRlcm4gY2hhciAqX19kY25nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0tCQkJICAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotLQkJCSAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwgaW50IF9fY2F0ZWdvcnkpOwotLWV4dGVybiBjaGFyICpfX2RjaWdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLS0JCQkgICBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0tCQkJICAgaW50IF9fcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBfX24sCi0tCQkJICAgaW50IF9fY2F0ZWdvcnkpOwotLWV4dGVybiBjaGFyICpfX3RleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSk7Ci0tZXh0ZXJuIGNoYXIgKl9fYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLS0JCQkgICAgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKTsKLS1leHRlcm4gY2hhciAqX19iaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCQkJY29uc3QgY2hhciAqX19jb2Rlc2V0KTsKLS1leHRlcm4gdm9pZCBfbmxfZmluZGRvbWFpbl9zdWJmcmVlcmVzICh2b2lkKSBhdHRyaWJ1dGVfaGlkZGVuOwotLWV4dGVybiB2b2lkIF9ubF91bmxvYWRfZG9tYWluIChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqX19kb21haW4pCi0tICAgICBpbnRlcm5hbF9mdW5jdGlvbiBhdHRyaWJ1dGVfaGlkZGVuOwotLSNlbHNlCi0tLyogRGVjbGFyZSB0aGUgZXhwb3J0ZWQgbGliaW50bF8qIGZ1bmN0aW9ucywgaW4gYSB3YXkgdGhhdCBhbGxvd3MgdXMgdG8KLS0gICBjYWxsIHRoZW0gdW5kZXIgdGhlaXIgcmVhbCBuYW1lLiAgKi8KLS0jIHVuZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotLSMgdW5kZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0tIyBkZWZpbmUgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0tIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0tIyBpZmRlZiBJTl9MSUJHTE9DQUxFCi0tZXh0ZXJuIGNoYXIgKmdsX2RjaWdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLS0JCQkgICAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotLQkJCSAgICBpbnQgX19wbHVyYWwsIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwKLS0JCQkgICAgaW50IF9fY2F0ZWdvcnksCi0tCQkJICAgIGNvbnN0IGNoYXIgKl9fbG9jYWxlbmFtZSwgY29uc3QgY2hhciAqX19lbmNvZGluZyk7Ci0tIyBlbHNlCi0tZXh0ZXJuIGNoYXIgKmxpYmludGxfZGNpZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotLQkJCQkgaW50IF9fcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBfX24sCi0tCQkJCSBpbnQgX19jYXRlZ29yeSk7Ci0tIyBlbmRpZgotLSNlbmRpZgotLQotLSNpbmNsdWRlICJsb2FkaW5mby5oIgotLQotLSNpbmNsdWRlICJnbW8uaCIJCS8qIEdldCBubHNfdWludDMyLiAgKi8KLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgotLSMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCi0tI2VuZGlmCi0tCi0tI2lmbmRlZiBhdHRyaWJ1dGVfaGlkZGVuCi0tIyBkZWZpbmUgYXR0cmlidXRlX2hpZGRlbgotLSNlbmRpZgotLQotLS8qIFRlbGwgdGhlIGNvbXBpbGVyIHdoZW4gYSBjb25kaXRpb25hbCBvciBpbnRlZ2VyIGV4cHJlc3Npb24gaXMKLS0gICBhbG1vc3QgYWx3YXlzIHRydWUgb3IgYWxtb3N0IGFsd2F5cyBmYWxzZS4gICovCi0tI2lmbmRlZiBIQVZFX0JVSUxUSU5fRVhQRUNUCi0tIyBkZWZpbmUgX19idWlsdGluX2V4cGVjdChleHByLCB2YWwpIChleHByKQotLSNlbmRpZgotLQotLSNpZm5kZWYgVwotLSMgZGVmaW5lIFcoZmxhZywgZGF0YSkgKChmbGFnKSA/IFNXQVAgKGRhdGEpIDogKGRhdGEpKQotLSNlbmRpZgotLQotLQotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLS0jIGRlZmluZSBTV0FQKGkpIGJzd2FwXzMyIChpKQotLSNlbHNlCi0tc3RhdGljIGlubGluZSBubHNfdWludDMyCi0tIyBpZmRlZiBfX2NwbHVzcGx1cwotLVNXQVAgKG5sc191aW50MzIgaSkKLS0jIGVsc2UKLS1TV0FQIChpKQotLSAgICAgbmxzX3VpbnQzMiBpOwotLSMgZW5kaWYKLS17Ci0tICByZXR1cm4gKGkgPDwgMjQpIHwgKChpICYgMHhmZjAwKSA8PCA4KSB8ICgoaSA+PiA4KSAmIDB4ZmYwMCkgfCAoaSA+PiAyNCk7Ci0tfQotLSNlbmRpZgotLQotLQotLS8qIEluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZy4gICovCi0tc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYwotLXsKLS0gIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCi0tICBzaXplX3QgbGVuZ3RoOwotLSAgLyogUG9pbnRlciB0byBhZGRyZXNzZWQgc3RyaW5nLiAgKi8KLS0gIGNvbnN0IGNoYXIgKnBvaW50ZXI7Ci0tfTsKLS0KLS0vKiBDYWNoZSBvZiB0cmFuc2xhdGVkIHN0cmluZ3MgYWZ0ZXIgY2hhcnNldCBjb252ZXJzaW9uLgotLSAgIE5vdGU6IFRoZSBzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIHRhcmdldCBlbmNvZGluZyBvbmx5IG9uIGFuIGFzLW5lZWRlZAotLSAgIGJhc2lzLiAgKi8KLS1zdHJ1Y3QgY29udmVydGVkX2RvbWFpbgotLXsKLS0gIC8qIFRoZSB0YXJnZXQgZW5jb2RpbmcgbmFtZS4gICovCi0tICBjb25zdCBjaGFyICplbmNvZGluZzsKLS0gIC8qIFRoZSBkZXNjcmlwdG9yIGZvciBjb252ZXJzaW9uIGZyb20gdGhlIG1lc3NhZ2UgY2F0YWxvZydzIGVuY29kaW5nIHRvCi0tICAgICB0aGlzIHRhcmdldCBlbmNvZGluZy4gICovCi0tI2lmZGVmIF9MSUJDCi0tICBfX2djb252X3QgY29udjsKLS0jZWxzZQotLSMgaWYgSEFWRV9JQ09OVgotLSAgaWNvbnZfdCBjb252OwotLSMgZW5kaWYKLS0jZW5kaWYKLS0gIC8qIFRoZSB0YWJsZSBvZiB0cmFuc2xhdGVkIHN0cmluZ3MgYWZ0ZXIgY2hhcnNldCBjb252ZXJzaW9uLiAgKi8KLS0gIGNoYXIgKipjb252X3RhYjsKLS19OwotLQotLS8qIFRoZSByZXByZXNlbnRhdGlvbiBvZiBhbiBvcGVuZWQgbWVzc2FnZSBjYXRhbG9nLiAgKi8KLS1zdHJ1Y3QgbG9hZGVkX2RvbWFpbgotLXsKLS0gIC8qIFBvaW50ZXIgdG8gbWVtb3J5IGNvbnRhaW5pbmcgdGhlIC5tbyBmaWxlLiAgKi8KLS0gIGNvbnN0IGNoYXIgKmRhdGE7Ci0tICAvKiAxIGlmIHRoZSBtZW1vcnkgaXMgbW1hcCgpZWQsIDAgaWYgdGhlIG1lbW9yeSBpcyBtYWxsb2MoKWVkLiAgKi8KLS0gIGludCB1c2VfbW1hcDsKLS0gIC8qIFNpemUgb2YgbW1hcCgpZWQgbWVtb3J5LiAgKi8KLS0gIHNpemVfdCBtbWFwX3NpemU7Ci0tICAvKiAxIGlmIHRoZSAubW8gZmlsZSB1c2VzIGEgZGlmZmVyZW50IGVuZGlhbm5lc3MgdGhhbiB0aGlzIG1hY2hpbmUuICAqLwotLSAgaW50IG11c3Rfc3dhcDsKLS0gIC8qIFBvaW50ZXIgdG8gYWRkaXRpb25hbCBtYWxsb2MoKWVkIG1lbW9yeS4gICovCi0tICB2b2lkICptYWxsb2NlZDsKLS0KLS0gIC8qIE51bWJlciBvZiBzdGF0aWMgc3RyaW5ncyBwYWlycy4gICovCi0tICBubHNfdWludDMyIG5zdHJpbmdzOwotLSAgLyogUG9pbnRlciB0byBkZXNjcmlwdG9ycyBvZiBvcmlnaW5hbCBzdHJpbmdzIGluIHRoZSBmaWxlLiAgKi8KLS0gIGNvbnN0IHN0cnVjdCBzdHJpbmdfZGVzYyAqb3JpZ190YWI7Ci0tICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIHRyYW5zbGF0ZWQgc3RyaW5ncyBpbiB0aGUgZmlsZS4gICovCi0tICBjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKnRyYW5zX3RhYjsKLS0KLS0gIC8qIE51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgcGFpcnMuICAqLwotLSAgbmxzX3VpbnQzMiBuX3N5c2RlcF9zdHJpbmdzOwotLSAgLyogUG9pbnRlciB0byBkZXNjcmlwdG9ycyBvZiBvcmlnaW5hbCBzeXNkZXAgc3RyaW5ncy4gICovCi0tICBjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICpvcmlnX3N5c2RlcF90YWI7Ci0tICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIHRyYW5zbGF0ZWQgc3lzZGVwIHN0cmluZ3MuICAqLwotLSAgY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqdHJhbnNfc3lzZGVwX3RhYjsKLS0KLS0gIC8qIFNpemUgb2YgaGFzaCB0YWJsZS4gICovCi0tICBubHNfdWludDMyIGhhc2hfc2l6ZTsKLS0gIC8qIFBvaW50ZXIgdG8gaGFzaCB0YWJsZS4gICovCi0tICBjb25zdCBubHNfdWludDMyICpoYXNoX3RhYjsKLS0gIC8qIDEgaWYgdGhlIGhhc2ggdGFibGUgdXNlcyBhIGRpZmZlcmVudCBlbmRpYW5uZXNzIHRoYW4gdGhpcyBtYWNoaW5lLiAgKi8KLS0gIGludCBtdXN0X3N3YXBfaGFzaF90YWI7Ci0tCi0tICAvKiBDYWNoZSBvZiBjaGFyc2V0IGNvbnZlcnNpb25zIG9mIHRoZSB0cmFuc2xhdGVkIHN0cmluZ3MuICAqLwotLSAgc3RydWN0IGNvbnZlcnRlZF9kb21haW4gKmNvbnZlcnNpb25zOwotLSAgc2l6ZV90IG5jb252ZXJzaW9uczsKLS0gIGdsX3J3bG9ja19kZWZpbmUgKCwgY29udmVyc2lvbnNfbG9jaykKLS0KLS0gIGNvbnN0IHN0cnVjdCBleHByZXNzaW9uICpwbHVyYWw7Ci0tICB1bnNpZ25lZCBsb25nIGludCBucGx1cmFsczsKLS19OwotLQotLS8qIFdlIHdhbnQgdG8gYWxsb2NhdGUgYSBzdHJpbmcgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0LiAgQnV0IElTTyBDCi0tICAgZG9lc24ndCBhbGxvdyB6ZXJvIHNpemVkIGFycmF5cy4gICovCi0tI2lmZGVmIF9fR05VQ19fCi0tIyBkZWZpbmUgWkVSTyAwCi0tI2Vsc2UKLS0jIGRlZmluZSBaRVJPIDEKLS0jZW5kaWYKLS0KLS0vKiBBIHNldCBvZiBzZXR0aW5ncyBib3VuZCB0byBhIG1lc3NhZ2UgZG9tYWluLiAgVXNlZCB0byBzdG9yZSBzZXR0aW5ncwotLSAgIGZyb20gYmluZHRleHRkb21haW4oKSBhbmQgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoKS4gICovCi0tc3RydWN0IGJpbmRpbmcKLS17Ci0tICBzdHJ1Y3QgYmluZGluZyAqbmV4dDsKLS0gIGNoYXIgKmRpcm5hbWU7Ci0tICBjaGFyICpjb2Rlc2V0OwotLSAgY2hhciBkb21haW5uYW1lW1pFUk9dOwotLX07Ci0tCi0tLyogQSBjb3VudGVyIHdoaWNoIGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBzb21lIHByZXZpb3VzIHRyYW5zbGF0aW9ucwotLSAgIGJlY29tZSBpbnZhbGlkLgotLSAgIFRoaXMgdmFyaWFibGUgaXMgcGFydCBvZiB0aGUgZXh0ZXJuYWwgQUJJIG9mIHRoZSBHTlUgbGliaW50bC4gICovCi0tI2lmZGVmIElOX0xJQkdMT0NBTEUKLS0jIGluY2x1ZGUgPGdsb2NhbGUvY29uZmlnLmg+Ci0tZXh0ZXJuIExJQkdMT0NBTEVfRExMX0VYUE9SVEVEIGludCBfbmxfbXNnX2NhdF9jbnRyOwotLSNlbHNlCi0tZXh0ZXJuIExJQklOVExfRExMX0VYUE9SVEVEIGludCBfbmxfbXNnX2NhdF9jbnRyOwotLSNlbmRpZgotLQotLSNpZm5kZWYgX0xJQkMKLS1leHRlcm4gY29uc3QgY2hhciAqX25sX2xhbmd1YWdlX3ByZWZlcmVuY2VzX2RlZmF1bHQgKHZvaWQpOwotLSMgZGVmaW5lIGdsX2xvY2FsZV9uYW1lX2Nhbm9uaWNhbGl6ZSBfbmxfbG9jYWxlX25hbWVfY2Fub25pY2FsaXplCi0tZXh0ZXJuIHZvaWQgX25sX2xvY2FsZV9uYW1lX2Nhbm9uaWNhbGl6ZSAoY2hhciAqbmFtZSk7Ci0tIyBkZWZpbmUgZ2xfbG9jYWxlX25hbWVfcG9zaXggX25sX2xvY2FsZV9uYW1lX3Bvc2l4Ci0tZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9sb2NhbGVfbmFtZV9wb3NpeCAoaW50IGNhdGVnb3J5LAotLQkJCQkJICBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpOwotLSMgZGVmaW5lIGdsX2xvY2FsZV9uYW1lX2RlZmF1bHQgX25sX2xvY2FsZV9uYW1lX2RlZmF1bHQKLS1leHRlcm4gY29uc3QgY2hhciAqX25sX2xvY2FsZV9uYW1lX2RlZmF1bHQgKHZvaWQpOwotLSMgZGVmaW5lIGdsX2xvY2FsZV9uYW1lIF9ubF9sb2NhbGVfbmFtZQotLWV4dGVybiBjb25zdCBjaGFyICpfbmxfbG9jYWxlX25hbWUgKGludCBjYXRlZ29yeSwgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKTsKLS0jZW5kaWYKLS0KLS1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfbmxfZmluZF9kb21haW4gKGNvbnN0IGNoYXIgKl9fZGlybmFtZSwgY2hhciAqX19sb2NhbGUsCi0tCQkJCQkgY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCQkJIHN0cnVjdCBiaW5kaW5nICpfX2RvbWFpbmJpbmRpbmcpCi0tICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLS12b2lkIF9ubF9sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX19kb21haW4sCi0tCQkgICAgICBzdHJ1Y3QgYmluZGluZyAqX19kb21haW5iaW5kaW5nKQotLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0tCi0tI2lmZGVmIElOX0xJQkdMT0NBTEUKLS1jaGFyICpfbmxfZmluZF9tc2cgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAotLQkJICAgIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nLCBjb25zdCBjaGFyICplbmNvZGluZywKLS0JCSAgICBjb25zdCBjaGFyICptc2dpZCwKLS0JCSAgICBzaXplX3QgKmxlbmd0aHApCi0tICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLS0jZWxzZQotLWNoYXIgKl9ubF9maW5kX21zZyAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGUsCi0tCQkgICAgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcsIGNvbnN0IGNoYXIgKm1zZ2lkLAotLQkJICAgIGludCBjb252ZXJ0LCBzaXplX3QgKmxlbmd0aHApCi0tICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLS0jZW5kaWYKLS0KLS0vKiBUaGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIHRoZSBzdGFuZGFsb25lIGxpYmludGwuYSBtdXN0IGhhdmUgZGlmZmVyZW50Ci0tICAgbmFtZXMgdGhhbiB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIEdOVSBsaWJjLCBvdGhlcndpc2UgcHJvZ3JhbXMKLS0gICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KLS0jaWYgIWRlZmluZWQgX0xJQkMKLS0jIGRlZmluZSBfbmxfZGVmYXVsdF9kaXJuYW1lIGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lCi0tIyBkZWZpbmUgX25sX2RvbWFpbl9iaW5kaW5ncyBsaWJpbnRsX25sX2RvbWFpbl9iaW5kaW5ncwotLSNlbmRpZgotLQotLS8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KLS1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lW107Ci0tI2lmZGVmIF9MSUJDCi0tbGliY19oaWRkZW5fcHJvdG8gKF9ubF9kZWZhdWx0X2Rpcm5hbWUpCi0tI2VuZGlmCi0tCi0tLyogTGlzdCB3aXRoIGJpbmRpbmdzIG9mIHNwZWNpZmljIGRvbWFpbnMuICAqLwotLWV4dGVybiBzdHJ1Y3QgYmluZGluZyAqX25sX2RvbWFpbl9iaW5kaW5nczsKLS0KLS0vKiBUaGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIHRoZSBzdGFuZGFsb25lIGxpYmludGwuYSBtdXN0IGhhdmUgZGlmZmVyZW50Ci0tICAgbmFtZXMgdGhhbiB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIEdOVSBsaWJjLCBvdGhlcndpc2UgcHJvZ3JhbXMKLS0gICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KLS0jaWYgIWRlZmluZWQgX0xJQkMKLS0jIGRlZmluZSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4KLS0jIGRlZmluZSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4KLS0jZW5kaWYKLS0KLS0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IHRleHQgZG9tYWluLiAgKi8KLS1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdIGF0dHJpYnV0ZV9oaWRkZW47Ci0tCi0tLyogRGVmYXVsdCB0ZXh0IGRvbWFpbiBpbiB3aGljaCBlbnRyaWVzIGZvciBnZXR0ZXh0KDMpIGFyZSB0byBiZSBmb3VuZC4gICovCi0tZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGF0dHJpYnV0ZV9oaWRkZW47Ci0tCi0tLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0tCi0tI2VuZGlmIC8qIGdldHRleHRQLmggICovCi0tLS0gYS9pbnRsL2dtby5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxNTIgKzAsMCBAQAotLS8qIERlc2NyaXB0aW9uIG9mIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0OiBnZW5lcmFsIGZpbGUgbGF5b3V0LgotLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMjAwMC0yMDAyLCAyMDA0LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBfR0VUVEVYVF9ICi0tI2RlZmluZSBfR0VUVEVYVF9IIDEKLS0KLS0jaW5jbHVkZSA8bGltaXRzLmg+Ci0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLQotLS8qIFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0LiAgKi8KLS0jZGVmaW5lIF9NQUdJQyAweDk1MDQxMmRlCi0tI2RlZmluZSBfTUFHSUNfU1dBUFBFRCAweGRlMTIwNDk1Ci0tCi0tLyogUmV2aXNpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgdXNlZCAubW8gKGJpbmFyeSkgZmlsZSBmb3JtYXQuICAqLwotLSNkZWZpbmUgTU9fUkVWSVNJT05fTlVNQkVSIDAKLS0jZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUl9XSVRIX1NZU0RFUF9JIDEKLS0KLS0vKiBUaGUgZm9sbG93aW5nIGNvbnRvcnRpb25zIGFyZSBhbiBhdHRlbXB0IHRvIHVzZSB0aGUgQyBwcmVwcm9jZXNzb3IKLS0gICB0byBkZXRlcm1pbmUgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIDMyIGJpdHMgd2lkZS4gIEFuCi0tICAgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggaXMgdG8gdXNlIGF1dG9jb25mJ3MgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvLCBidXQKLS0gICBhcyBvZiB2ZXJzaW9uIGF1dG9jb25mLTIuMTMsIHRoZSBBQ19DSEVDS19TSVpFT0YgbWFjcm8gZG9lc24ndCB3b3JrCi0tICAgd2hlbiBjcm9zcy1jb21waWxpbmcuICAqLwotLQotLSNpZiBfX1NURENfXwotLSMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgNDI5NDk2NzI5NVUKLS0jZWxzZQotLSMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgMHhGRkZGRkZGRgotLSNlbmRpZgotLQotLS8qIElmIFVJTlRfTUFYIGlzbid0IGRlZmluZWQsIGFzc3VtZSBpdCdzIGEgMzItYml0IHR5cGUuCi0tICAgVGhpcyBzaG91bGQgYmUgdmFsaWQgZm9yIGFsbCBzeXN0ZW1zIEdOVSBjYXJlcyBhYm91dCBiZWNhdXNlCi0tICAgdGhhdCBkb2Vzbid0IGluY2x1ZGUgMTYtYml0IHN5c3RlbXMsIGFuZCBvbmx5IG1vZGVybiBzeXN0ZW1zCi0tICAgKHRoYXQgY2VydGFpbmx5IGhhdmUgPGxpbWl0cy5oPikgaGF2ZSA2NCstYml0IGludGVncmFsIHR5cGVzLiAgKi8KLS0KLS0jaWZuZGVmIFVJTlRfTUFYCi0tIyBkZWZpbmUgVUlOVF9NQVggVUlOVF9NQVhfMzJfQklUUwotLSNlbmRpZgotLQotLSNpZiBVSU5UX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi0tdHlwZWRlZiB1bnNpZ25lZCBubHNfdWludDMyOwotLSNlbHNlCi0tIyBpZiBVU0hSVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwotLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgbmxzX3VpbnQzMjsKLS0jIGVsc2UKLS0jICBpZiBVTE9OR19NQVggPT0gVUlOVF9NQVhfMzJfQklUUwotLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBubHNfdWludDMyOwotLSMgIGVsc2UKLS0gIC8qIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBpbnRlbmRlZCB0byB0aHJvdyBhbiBlcnJvci4gIFVzaW5nICNlcnJvciBpcwotLSAgICAgbm90IHBvcnRhYmxlIGVub3VnaC4gICovCi0tICAiQ2Fubm90IGRldGVybWluZSB1bnNpZ25lZCAzMi1iaXQgZGF0YSB0eXBlLiIKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0KLS0vKiBIZWFkZXIgZm9yIGJpbmFyeSAubW8gZmlsZSBmb3JtYXQuICAqLwotLXN0cnVjdCBtb19maWxlX2hlYWRlcgotLXsKLS0gIC8qIFRoZSBtYWdpYyBudW1iZXIuICAqLwotLSAgbmxzX3VpbnQzMiBtYWdpYzsKLS0gIC8qIFRoZSByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGZpbGUgZm9ybWF0LiAgKi8KLS0gIG5sc191aW50MzIgcmV2aXNpb247Ci0tCi0tICAvKiBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IHVzZWQgaW4gLm1vIGZpbGVzIHdpdGggbWFqb3IgcmV2aXNpb24gMCBvciAxLiAgKi8KLS0KLS0gIC8qIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBwYWlycy4gICovCi0tICBubHNfdWludDMyIG5zdHJpbmdzOwotLSAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiBvcmlnaW5hbCBzdHJpbmdzLiAgKi8KLS0gIG5sc191aW50MzIgb3JpZ190YWJfb2Zmc2V0OwotLSAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiB0cmFuc2xhdGVkIHN0cmluZ3MuICAqLwotLSAgbmxzX3VpbnQzMiB0cmFuc190YWJfb2Zmc2V0OwotLSAgLyogU2l6ZSBvZiBoYXNoIHRhYmxlLiAgKi8KLS0gIG5sc191aW50MzIgaGFzaF90YWJfc2l6ZTsKLS0gIC8qIE9mZnNldCBvZiBmaXJzdCBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLS0gIG5sc191aW50MzIgaGFzaF90YWJfb2Zmc2V0OwotLQotLSAgLyogVGhlIGZvbGxvd2luZyBhcmUgb25seSB1c2VkIGluIC5tbyBmaWxlcyB3aXRoIG1pbm9yIHJldmlzaW9uID49IDEuICAqLwotLQotLSAgLyogVGhlIG51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLiAgKi8KLS0gIG5sc191aW50MzIgbl9zeXNkZXBfc2VnbWVudHM7Ci0tICAvKiBPZmZzZXQgb2YgdGFibGUgZGVzY3JpYmluZyBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLiAgKi8KLS0gIG5sc191aW50MzIgc3lzZGVwX3NlZ21lbnRzX29mZnNldDsKLS0gIC8qIFRoZSBudW1iZXIgb2Ygc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzIHBhaXJzLiAgKi8KLS0gIG5sc191aW50MzIgbl9zeXNkZXBfc3RyaW5nczsKLS0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3lzZGVwIHN0cmluZ3MuICAqLwotLSAgbmxzX3VpbnQzMiBvcmlnX3N5c2RlcF90YWJfb2Zmc2V0OwotLSAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiB0cmFuc2xhdGVkIHN5c2RlcCBzdHJpbmdzLiAgKi8KLS0gIG5sc191aW50MzIgdHJhbnNfc3lzZGVwX3RhYl9vZmZzZXQ7Ci0tfTsKLS0KLS0vKiBEZXNjcmlwdG9yIGZvciBzdGF0aWMgc3RyaW5nIGNvbnRhaW5lZCBpbiB0aGUgYmluYXJ5IC5tbyBmaWxlLiAgKi8KLS1zdHJ1Y3Qgc3RyaW5nX2Rlc2MKLS17Ci0tICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZywgbm90IGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgKi8KLS0gIG5sc191aW50MzIgbGVuZ3RoOwotLSAgLyogT2Zmc2V0IG9mIHN0cmluZyBpbiBmaWxlLiAgKi8KLS0gIG5sc191aW50MzIgb2Zmc2V0OwotLX07Ci0tCi0tLyogVGhlIGZvbGxvd2luZyBhcmUgb25seSB1c2VkIGluIC5tbyBmaWxlcyB3aXRoIG1pbm9yIHJldmlzaW9uID49IDEuICAqLwotLQotLS8qIERlc2NyaXB0b3IgZm9yIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nIHNlZ21lbnQuICAqLwotLXN0cnVjdCBzeXNkZXBfc2VnbWVudAotLXsKLS0gIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCi0tICBubHNfdWludDMyIGxlbmd0aDsKLS0gIC8qIE9mZnNldCBvZiBzdHJpbmcgaW4gZmlsZS4gICovCi0tICBubHNfdWludDMyIG9mZnNldDsKLS19OwotLQotLS8qIFBhaXIgb2YgYSBzdGF0aWMgYW5kIGEgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50LCBpbiBzdHJ1Y3Qgc3lzZGVwX3N0cmluZy4gICovCi0tc3RydWN0IHNlZ21lbnRfcGFpcgotLXsKLS0gIC8qIFNpemUgb2Ygc3RhdGljIHNlZ21lbnQuICAqLwotLSAgbmxzX3VpbnQzMiBzZWdzaXplOwotLSAgLyogUmVmZXJlbmNlIHRvIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nIHNlZ21lbnQsIG9yIH4wIGF0IHRoZSBlbmQuICAqLwotLSAgbmxzX3VpbnQzMiBzeXNkZXByZWY7Ci0tfTsKLS0KLS0vKiBEZXNjcmlwdG9yIGZvciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZy4gICovCi0tc3RydWN0IHN5c2RlcF9zdHJpbmcKLS17Ci0tICAvKiBPZmZzZXQgb2Ygc3RhdGljIHN0cmluZyBzZWdtZW50cyBpbiBmaWxlLiAgKi8KLS0gIG5sc191aW50MzIgb2Zmc2V0OwotLSAgLyogQWx0ZXJuYXRpbmcgc2VxdWVuY2Ugb2Ygc3RhdGljIGFuZCBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLgotLSAgICAgVGhlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXRpYyBzZWdtZW50LCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCi0tICBzdHJ1Y3Qgc2VnbWVudF9wYWlyIHNlZ21lbnRzWzFdOwotLX07Ci0tCi0tLyogTWFya2VyIGZvciB0aGUgZW5kIG9mIHRoZSBzZWdtZW50c1tdIGFycmF5LiAgVGhpcyBoYXMgdGhlIHZhbHVlIDB4RkZGRkZGRkYsCi0tICAgcmVnYXJkbGVzcyB3aGV0aGVyICdpbnQnIGlzIDE2IGJpdCwgMzIgYml0LCBvciA2NCBiaXQuICAqLwotLSNkZWZpbmUgU0VHTUVOVFNfRU5EICgobmxzX3VpbnQzMikgfjApCi0tCi0tLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0tCi0tI2VuZGlmCS8qIGdldHRleHQuaCAgKi8KLS0tLSBhL2ludGwvaGFzaC1zdHJpbmcuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsNTEgKzAsMCBAQAotLS8qIEltcGxlbWVudHMgYSBzdHJpbmcgaGFzaGluZyBmdW5jdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDE5OTgsIDIwMDAsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCi0tCi0tICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0tICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotLSAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0tICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLwotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0vKiBTcGVjaWZpY2F0aW9uLiAgKi8KLS0jaW5jbHVkZSAiaGFzaC1zdHJpbmcuaCIKLS0KLS0KLS0vKiBEZWZpbmVzIHRoZSBzbyBjYWxsZWQgYGhhc2hwancnIGZ1bmN0aW9uIGJ5IFAuSi4gV2VpbmJlcmdlcgotLSAgIFtzZWUgQWhvL1NldGhpL1VsbG1hbiwgQ09NUElMRVJTOiBQcmluY2lwbGVzLCBUZWNobmlxdWVzIGFuZCBUb29scywKLS0gICAxOTg2LCAxOTg3IEJlbGwgVGVsZXBob25lIExhYm9yYXRvcmllcywgSW5jLl0gICovCi0tdW5zaWduZWQgbG9uZyBpbnQKLS1fX2hhc2hfc3RyaW5nIChjb25zdCBjaGFyICpzdHJfcGFyYW0pCi0tewotLSAgdW5zaWduZWQgbG9uZyBpbnQgaHZhbCwgZzsKLS0gIGNvbnN0IGNoYXIgKnN0ciA9IHN0cl9wYXJhbTsKLS0KLS0gIC8qIENvbXB1dGUgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBnaXZlbiBzdHJpbmcuICAqLwotLSAgaHZhbCA9IDA7Ci0tICB3aGlsZSAoKnN0ciAhPSAnXDAnKQotLSAgICB7Ci0tICAgICAgaHZhbCA8PD0gNDsKLS0gICAgICBodmFsICs9ICh1bnNpZ25lZCBjaGFyKSAqc3RyKys7Ci0tICAgICAgZyA9IGh2YWwgJiAoKHVuc2lnbmVkIGxvbmcgaW50KSAweGYgPDwgKEhBU0hXT1JEQklUUyAtIDQpKTsKLS0gICAgICBpZiAoZyAhPSAwKQotLQl7Ci0tCSAgaHZhbCBePSBnID4+IChIQVNIV09SREJJVFMgLSA4KTsKLS0JICBodmFsIF49IGc7Ci0tCX0KLS0gICAgfQotLSAgcmV0dXJuIGh2YWw7Ci0tfQotLS0tIGEvaW50bC9oYXNoLXN0cmluZy5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSwzNiArMCwwIEBACi0tLyogRGVzY3JpcHRpb24gb2YgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQ6IHN0cmluZyBoYXNoaW5nIGZ1bmN0aW9uLgotLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5Ny0xOTk4LCAyMDAwLTIwMDMsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tLyogV2UgYXNzdW1lIHRvIGhhdmUgYHVuc2lnbmVkIGxvbmcgaW50JyB2YWx1ZSB3aXRoIGF0IGxlYXN0IDMyIGJpdHMuICAqLwotLSNkZWZpbmUgSEFTSFdPUkRCSVRTIDMyCi0tCi0tCi0tI2lmbmRlZiBfTElCQwotLSMgaWZkZWYgSU5fTElCSU5UTAotLSMgIGRlZmluZSBfX2hhc2hfc3RyaW5nIGxpYmludGxfaGFzaF9zdHJpbmcKLS0jIGVsc2UKLS0jICBkZWZpbmUgX19oYXNoX3N0cmluZyBoYXNoX3N0cmluZwotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0vKiBEZWZpbmVzIHRoZSBzbyBjYWxsZWQgYGhhc2hwancnIGZ1bmN0aW9uIGJ5IFAuSi4gV2VpbmJlcmdlcgotLSAgIFtzZWUgQWhvL1NldGhpL1VsbG1hbiwgQ09NUElMRVJTOiBQcmluY2lwbGVzLCBUZWNobmlxdWVzIGFuZCBUb29scywKLS0gICAxOTg2LCAxOTg3IEJlbGwgVGVsZXBob25lIExhYm9yYXRvcmllcywgSW5jLl0gICovCi0tZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IF9faGFzaF9zdHJpbmcgKGNvbnN0IGNoYXIgKnN0cl9wYXJhbSk7Ci0tLS0gYS9pbnRsL2ludGwtY29tcGF0LmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDEzMyArMCwwIEBACi0tLyogaW50bC1jb21wYXQuYyAtIFN0dWIgZnVuY3Rpb25zIHRvIGNhbGwgZ2V0dGV4dCBmdW5jdGlvbnMgZnJvbSBHTlUgZ2V0dGV4dAotLSAgIExpYnJhcnkuCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LCAyMDAwLTIwMDMsIDIwMDUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotLQotLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS0KLS0vKiBUaGlzIGZpbGUgcmVkaXJlY3RzIHRoZSBnZXR0ZXh0IGZ1bmN0aW9ucyAod2l0aG91dCBwcmVmaXgpIHRvIHRob3NlCi0tICAgZGVmaW5lZCBpbiB0aGUgaW5jbHVkZWQgR05VIGxpYmludGwgbGlicmFyeSAod2l0aCAibGliaW50bF8iIHByZWZpeCkuCi0tICAgSXQgaXMgY29tcGlsZWQgaW50byBsaWJpbnRsIGluIG9yZGVyIHRvIG1ha2UgdGhlIEFNX0dOVV9HRVRURVhUIHRlc3QKLS0gICBvZiBnZXR0ZXh0IDw9IDAuMTEuMiB3b3JrIHdpdGggdGhlIGxpYmludGwgbGlicmFyeSA+PSAwLjExLjMgd2hpY2gKLS0gICBoYXMgdGhlIHJlZGlyZWN0aW9ucyBwcmltYXJpbHkgaW4gdGhlIDxsaWJpbnRsLmg+IGluY2x1ZGUgZmlsZS4KLS0gICBJdCBpcyBhbHNvIGNvbXBpbGVkIGludG8gbGliZ251aW50bCBzbyB0aGF0IGxpYmdudWludGwuc28gY2FuIGJlIHVzZWQKLS0gICBhcyBMRF9QUkVMT0FEYWJsZSBsaWJyYXJ5IG9uIGdsaWJjIHN5c3RlbXMsIHRvIHByb3ZpZGUgdGhlIGV4dHJhCi0tICAgZmVhdHVyZXMgdGhhdCB0aGUgZnVuY3Rpb25zIGluIHRoZSBsaWJjIGRvbid0IGhhdmUgKG5hbWVseSwgbG9nZ2luZykuICAqLwotLQotLQotLSN1bmRlZiBnZXR0ZXh0Ci0tI3VuZGVmIGRnZXR0ZXh0Ci0tI3VuZGVmIGRjZ2V0dGV4dAotLSN1bmRlZiBuZ2V0dGV4dAotLSN1bmRlZiBkbmdldHRleHQKLS0jdW5kZWYgZGNuZ2V0dGV4dAotLSN1bmRlZiB0ZXh0ZG9tYWluCi0tI3VuZGVmIGJpbmR0ZXh0ZG9tYWluCi0tI3VuZGVmIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0Ci0tCi0tCi0tLyogV2hlbiBidWlsZGluZyBhIERMTCwgd2UgbXVzdCBleHBvcnQgc29tZSBmdW5jdGlvbnMuICBOb3RlIHRoYXQgYmVjYXVzZQotLSAgIHRoZSBmdW5jdGlvbnMgYXJlIG9ubHkgZGVmaW5lZCBmb3IgYmluYXJ5IGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdlCi0tICAgZG9uJ3QgbmVlZCB0byB1c2UgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGluIGFueSBjYXNlLiAgKi8KLS0jaWYgSEFWRV9WSVNJQklMSVRZICYmIEJVSUxESU5HX0RMTAotLSMgZGVmaW5lIERMTF9FWFBPUlRFRCBfX2F0dHJpYnV0ZV9fKChfX3Zpc2liaWxpdHlfXygiZGVmYXVsdCIpKSkKLS0jZWxpZiBkZWZpbmVkIF9NU0NfVkVSICYmIEJVSUxESU5HX0RMTAotLSMgZGVmaW5lIERMTF9FWFBPUlRFRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLS0jZWxzZQotLSMgZGVmaW5lIERMTF9FWFBPUlRFRAotLSNlbmRpZgotLQotLQotLURMTF9FWFBPUlRFRAotLWNoYXIgKgotLWdldHRleHQgKGNvbnN0IGNoYXIgKm1zZ2lkKQotLXsKLS0gIHJldHVybiBsaWJpbnRsX2dldHRleHQgKG1zZ2lkKTsKLS19Ci0tCi0tCi0tRExMX0VYUE9SVEVECi0tY2hhciAqCi0tZGdldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkKQotLXsKLS0gIHJldHVybiBsaWJpbnRsX2RnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCk7Ci0tfQotLQotLQotLURMTF9FWFBPUlRFRAotLWNoYXIgKgotLWRjZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQsIGludCBjYXRlZ29yeSkKLS17Ci0tICByZXR1cm4gbGliaW50bF9kY2dldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSk7Ci0tfQotLQotLQotLURMTF9FWFBPUlRFRAotLWNoYXIgKgotLW5nZXR0ZXh0IChjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKLS17Ci0tICByZXR1cm4gbGliaW50bF9uZ2V0dGV4dCAobXNnaWQxLCBtc2dpZDIsIG4pOwotLX0KLS0KLS0KLS1ETExfRVhQT1JURUQKLS1jaGFyICoKLS1kbmdldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCi0tCSAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQotLXsKLS0gIHJldHVybiBsaWJpbnRsX2RuZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIG4pOwotLX0KLS0KLS0KLS1ETExfRVhQT1JURUQKLS1jaGFyICoKLS1kY25nZXR0ZXh0IChjb25zdCBjaGFyICpkb21haW5uYW1lLAotLQkgICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4sCi0tCSAgICBpbnQgY2F0ZWdvcnkpCi0tewotLSAgcmV0dXJuIGxpYmludGxfZGNuZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIG4sIGNhdGVnb3J5KTsKLS19Ci0tCi0tCi0tRExMX0VYUE9SVEVECi0tY2hhciAqCi0tdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqZG9tYWlubmFtZSkKLS17Ci0tICByZXR1cm4gbGliaW50bF90ZXh0ZG9tYWluIChkb21haW5uYW1lKTsKLS19Ci0tCi0tCi0tRExMX0VYUE9SVEVECi0tY2hhciAqCi0tYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmRpcm5hbWUpCi0tewotLSAgcmV0dXJuIGxpYmludGxfYmluZHRleHRkb21haW4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpOwotLX0KLS0KLS0KLS1ETExfRVhQT1JURUQKLS1jaGFyICoKLS1iaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqY29kZXNldCkKLS17Ci0tICByZXR1cm4gbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCAoZG9tYWlubmFtZSwgY29kZXNldCk7Ci0tfQotLS0tIGEvaW50bC9pbnRsLWV4cG9ydHMuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMzYgKzAsMCBAQAotLS8qIExpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scyBvZiBsaWJpbnRsIG9uIEN5Z3dpbi4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4sIDIwMDYuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0gLyogSU1QKHgpIGlzIGEgc3ltYm9sIHRoYXQgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgeC4gICovCi0tI2RlZmluZSBJTVAoeCkgX2ltcF9fIyN4Ci0tCi0tIC8qIEVuc3VyZSB0aGF0IHRoZSB2YXJpYWJsZSB4IGlzIGV4cG9ydGVkIGZyb20gdGhlIGxpYnJhcnksIGFuZCB0aGF0IGEKLS0gICAgcHNldWRvLXZhcmlhYmxlIElNUCh4KSBpcyBhdmFpbGFibGUuICAqLwotLSNkZWZpbmUgVkFSSUFCTEUoeCkgXAotLSAvKiBFeHBvcnQgeCB3aXRob3V0IHJlZGVmaW5pbmcgeC4gIFRoaXMgY29kZSB3YXMgZm91bmQgYnkgY29tcGlsaW5nIGEJXAotLSAgICBzbmlwcGV0OgkJCQkJCQkJXAotLSAgICAgIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgaW50IHg7IGludCB4ID0gNDI7ICAqLwkJXAotLSBhc20gKCIuc2VjdGlvbiAuZHJlY3R2ZVxuIik7CQkJCQkJXAotLSBhc20gKCIuYXNjaWkgXCIgLWV4cG9ydDoiICN4ICIsZGF0YVwiXG4iKTsJCQkJXAotLSBhc20gKCIuZGF0YVxuIik7CQkJCQkJCVwKLS0gLyogQWxsb2NhdGUgYSBwc2V1ZG8tdmFyaWFibGUgSU1QKHgpLiAgKi8JCQkJXAotLSBleHRlcm4gaW50IHg7CQkJCQkJCQlcCi0tIHZvaWQgKiBJTVAoeCkgPSAmeDsKLS0KLS1WQVJJQUJMRShsaWJpbnRsX3ZlcnNpb24pCi0tLS0gYS9pbnRsL2wxMG5mbGlzdC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw0MDAgKzAsMCBAQAotLS8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3Igc3RwY3B5KCkuCi0tICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCi0tICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLwotLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLS0jIGRlZmluZSBfR05VX1NPVVJDRQkxCi0tI2VuZGlmCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0KLS0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfQVJHWl9ICi0tIyBpbmNsdWRlIDxhcmd6Lmg+Ci0tI2VuZGlmCi0tI2luY2x1ZGUgPGN0eXBlLmg+Ci0tI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0KLS0jaW5jbHVkZSAibG9hZGluZm8uaCIKLS0KLS0vKiBPbiBzb21lIHN0cmFuZ2Ugc3lzdGVtcyBzdGlsbCBubyBkZWZpbml0aW9uIG9mIE5VTEwgaXMgZm91bmQuICBTaWdoISAgKi8KLS0jaWZuZGVmIE5VTEwKLS0jIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLS0jICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLS0jIGVsc2UKLS0jICBkZWZpbmUgTlVMTCAwCi0tIyBlbmRpZgotLSNlbmRpZgotLQotLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS0KLS0jaWZkZWYgX0xJQkMKLS0vKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLS0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0tICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotLSMgaWZuZGVmIHN0cGNweQotLSMgIGRlZmluZSBzdHBjcHkoZGVzdCwgc3JjKSBfX3N0cGNweShkZXN0LCBzcmMpCi0tIyBlbmRpZgotLSNlbHNlCi0tIyBpZm5kZWYgSEFWRV9TVFBDUFkKLS1zdGF0aWMgY2hhciAqc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpOwotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0vKiBQYXRobmFtZSBzdXBwb3J0LgotLSAgIElTU0xBU0goQykgICAgICAgICAgIHRlc3RzIHdoZXRoZXIgQyBpcyBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgY2hhcmFjdGVyLgotLSAgIElTX0FCU09MVVRFX1BBVEgoUCkgIHRlc3RzIHdoZXRoZXIgUCBpcyBhbiBhYnNvbHV0ZSBwYXRoLiAgSWYgaXQgaXMgbm90LAotLSAgICAgICAgICAgICAgICAgICAgICAgIGl0IG1heSBiZSBjb25jYXRlbmF0ZWQgdG8gYSBkaXJlY3RvcnkgcGF0aG5hbWUuCi0tICovCi0tI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19DWUdXSU5fXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KLS0gIC8qIFdpbjMyLCBDeWd3aW4sIE9TLzIsIERPUyAqLwotLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCi0tIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCi0tICAgICgoKChQKVswXSA+PSAnQScgJiYgKFApWzBdIDw9ICdaJykgfHwgKChQKVswXSA+PSAnYScgJiYgKFApWzBdIDw9ICd6JykpIFwKLS0gICAgICYmIChQKVsxXSA9PSAnOicpCi0tIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSAoSVNTTEFTSCAoKFApWzBdKSB8fCBIQVNfREVWSUNFIChQKSkKLS0jZWxzZQotLSAgLyogVW5peCAqLwotLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycpCi0tIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSBJU1NMQVNIICgoUClbMF0pCi0tI2VuZGlmCi0tCi0tLyogRGVmaW5lIGZ1bmN0aW9uIHdoaWNoIGFyZSB1c3VhbGx5IG5vdCBhdmFpbGFibGUuICAqLwotLQotLSNpZmRlZiBfTElCQwotLSMgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIElOVFVTRShfX2FyZ3pfY291bnQpIChhcmd6LCBsZW4pCi0tI2VsaWYgZGVmaW5lZCBIQVZFX0FSR1pfQ09VTlQKLS0jIHVuZGVmIF9fYXJnel9jb3VudAotLSMgZGVmaW5lIF9fYXJnel9jb3VudCBhcmd6X2NvdW50Ci0tI2Vsc2UKLS0vKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiBBUkdaLiAgKi8KLS1zdGF0aWMgc2l6ZV90Ci0tYXJnel9jb3VudF9fIChjb25zdCBjaGFyICphcmd6LCBzaXplX3QgbGVuKQotLXsKLS0gIHNpemVfdCBjb3VudCA9IDA7Ci0tICB3aGlsZSAobGVuID4gMCkKLS0gICAgewotLSAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7Ci0tICAgICAgYXJneiArPSBwYXJ0X2xlbiArIDE7Ci0tICAgICAgbGVuIC09IHBhcnRfbGVuICsgMTsKLS0gICAgICBjb3VudCsrOwotLSAgICB9Ci0tICByZXR1cm4gY291bnQ7Ci0tfQotLSMgdW5kZWYgX19hcmd6X2NvdW50Ci0tIyBkZWZpbmUgX19hcmd6X2NvdW50KGFyZ3osIGxlbikgYXJnel9jb3VudF9fIChhcmd6LCBsZW4pCi0tI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9BUkdaX0NPVU5UICovCi0tCi0tI2lmZGVmIF9MSUJDCi0tIyBkZWZpbmUgX19hcmd6X3N0cmluZ2lmeShhcmd6LCBsZW4sIHNlcCkgXAotLSAgSU5UVVNFKF9fYXJnel9zdHJpbmdpZnkpIChhcmd6LCBsZW4sIHNlcCkKLS0jZWxpZiBkZWZpbmVkIEhBVkVfQVJHWl9TVFJJTkdJRlkKLS0jIHVuZGVmIF9fYXJnel9zdHJpbmdpZnkKLS0jIGRlZmluZSBfX2FyZ3pfc3RyaW5naWZ5IGFyZ3pfc3RyaW5naWZ5Ci0tI2Vsc2UKLS0vKiBNYWtlICdcMCcgc2VwYXJhdGVkIGFyZyB2ZWN0b3IgQVJHWiBwcmludGFibGUgYnkgY29udmVydGluZyBhbGwgdGhlICdcMCdzCi0tICAgZXhjZXB0IHRoZSBsYXN0IGludG8gdGhlIGNoYXJhY3RlciBTRVAuICAqLwotLXN0YXRpYyB2b2lkCi0tYXJnel9zdHJpbmdpZnlfXyAoY2hhciAqYXJneiwgc2l6ZV90IGxlbiwgaW50IHNlcCkKLS17Ci0tICB3aGlsZSAobGVuID4gMCkKLS0gICAgewotLSAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7Ci0tICAgICAgYXJneiArPSBwYXJ0X2xlbjsKLS0gICAgICBsZW4gLT0gcGFydF9sZW4gKyAxOwotLSAgICAgIGlmIChsZW4gPiAwKQotLQkqYXJneisrID0gc2VwOwotLSAgICB9Ci0tfQotLSMgdW5kZWYgX19hcmd6X3N0cmluZ2lmeQotLSMgZGVmaW5lIF9fYXJnel9zdHJpbmdpZnkoYXJneiwgbGVuLCBzZXApIGFyZ3pfc3RyaW5naWZ5X18gKGFyZ3osIGxlbiwgc2VwKQotLSNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfQVJHWl9TVFJJTkdJRlkgKi8KLS0KLS0jaWZkZWYgX0xJQkMKLS0jZWxpZiBkZWZpbmVkIEhBVkVfQVJHWl9ORVhUCi0tIyB1bmRlZiBfX2FyZ3pfbmV4dAotLSMgZGVmaW5lIF9fYXJnel9uZXh0IGFyZ3pfbmV4dAotLSNlbHNlCi0tc3RhdGljIGNoYXIgKgotLWFyZ3pfbmV4dF9fIChjaGFyICphcmd6LCBzaXplX3QgYXJnel9sZW4sIGNvbnN0IGNoYXIgKmVudHJ5KQotLXsKLS0gIGlmIChlbnRyeSkKLS0gICAgewotLSAgICAgIGlmIChlbnRyeSA8IGFyZ3ogKyBhcmd6X2xlbikKLS0gICAgICAgIGVudHJ5ID0gc3RyY2hyIChlbnRyeSwgJ1wwJykgKyAxOwotLQotLSAgICAgIHJldHVybiBlbnRyeSA+PSBhcmd6ICsgYXJnel9sZW4gPyBOVUxMIDogKGNoYXIgKikgZW50cnk7Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgaWYgKGFyZ3pfbGVuID4gMCkKLS0gICAgICByZXR1cm4gYXJnejsKLS0gICAgZWxzZQotLSAgICAgIHJldHVybiAwOwotLX0KLS0jIHVuZGVmIF9fYXJnel9uZXh0Ci0tIyBkZWZpbmUgX19hcmd6X25leHQoYXJneiwgbGVuLCBlbnRyeSkgYXJnel9uZXh0X18gKGFyZ3osIGxlbiwgZW50cnkpCi0tI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9BUkdaX05FWFQgKi8KLS0KLS0KLS0vKiBSZXR1cm4gbnVtYmVyIG9mIGJpdHMgc2V0IGluIFguICAqLwotLXN0YXRpYyBpbmxpbmUgaW50Ci0tcG9wIChpbnQgeCkKLS17Ci0tICAvKiBXZSBhc3N1bWUgdGhhdCBubyBtb3JlIHRoYW4gMTYgYml0cyBhcmUgdXNlZC4gICovCi0tICB4ID0gKCh4ICYgfjB4NTU1NSkgPj4gMSkgKyAoeCAmIDB4NTU1NSk7Ci0tICB4ID0gKCh4ICYgfjB4MzMzMykgPj4gMikgKyAoeCAmIDB4MzMzMyk7Ci0tICB4ID0gKCh4ID4+IDQpICsgeCkgJiAweDBmMGY7Ci0tICB4ID0gKCh4ID4+IDgpICsgeCkgJiAweGZmOwotLQotLSAgcmV0dXJuIHg7Ci0tfQotLQotLQwKLS1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLS1fbmxfbWFrZV9sMTBuZmxpc3QgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0LAotLQkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwKLS0JCSAgICBpbnQgbWFzaywgY29uc3QgY2hhciAqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKnRlcnJpdG9yeSwKLS0JCSAgICBjb25zdCBjaGFyICpjb2Rlc2V0LCBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQsCi0tCQkgICAgY29uc3QgY2hhciAqbW9kaWZpZXIsCi0tCQkgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBkb19hbGxvY2F0ZSkKLS17Ci0tICBjaGFyICphYnNfZmlsZW5hbWU7Ci0tICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbGFzdHA7Ci0tICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpyZXR2YWw7Ci0tICBjaGFyICpjcDsKLS0gIHNpemVfdCBkaXJsaXN0X2NvdW50OwotLSAgc2l6ZV90IGVudHJpZXM7Ci0tICBpbnQgY250OwotLQotLSAgLyogSWYgTEFOR1VBR0UgY29udGFpbnMgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24sIHdlIGlnbm9yZQotLSAgICAgRElSTElTVC4gICovCi0tICBpZiAoSVNfQUJTT0xVVEVfUEFUSCAobGFuZ3VhZ2UpKQotLSAgICBkaXJsaXN0X2xlbiA9IDA7Ci0tCi0tICAvKiBBbGxvY2F0ZSByb29tIGZvciB0aGUgZnVsbCBmaWxlIG5hbWUuICAqLwotLSAgYWJzX2ZpbGVuYW1lID0gKGNoYXIgKikgbWFsbG9jIChkaXJsaXN0X2xlbgotLQkJCQkgICsgc3RybGVuIChsYW5ndWFnZSkKLS0JCQkJICArICgobWFzayAmIFhQR19URVJSSVRPUlkpICE9IDAKLS0JCQkJICAgICA/IHN0cmxlbiAodGVycml0b3J5KSArIDEgOiAwKQotLQkJCQkgICsgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDAKLS0JCQkJICAgICA/IHN0cmxlbiAoY29kZXNldCkgKyAxIDogMCkKLS0JCQkJICArICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDAKLS0JCQkJICAgICA/IHN0cmxlbiAobm9ybWFsaXplZF9jb2Rlc2V0KSArIDEgOiAwKQotLQkJCQkgICsgKChtYXNrICYgWFBHX01PRElGSUVSKSAhPSAwCi0tCQkJCSAgICAgPyBzdHJsZW4gKG1vZGlmaWVyKSArIDEgOiAwKQotLQkJCQkgICsgMSArIHN0cmxlbiAoZmlsZW5hbWUpICsgMSk7Ci0tCi0tICBpZiAoYWJzX2ZpbGVuYW1lID09IE5VTEwpCi0tICAgIHJldHVybiBOVUxMOwotLQotLSAgLyogQ29uc3RydWN0IGZpbGUgbmFtZS4gICovCi0tICBjcCA9IGFic19maWxlbmFtZTsKLS0gIGlmIChkaXJsaXN0X2xlbiA+IDApCi0tICAgIHsKLS0gICAgICBtZW1jcHkgKGNwLCBkaXJsaXN0LCBkaXJsaXN0X2xlbik7Ci0tICAgICAgX19hcmd6X3N0cmluZ2lmeSAoY3AsIGRpcmxpc3RfbGVuLCBQQVRIX1NFUEFSQVRPUik7Ci0tICAgICAgY3AgKz0gZGlybGlzdF9sZW47Ci0tICAgICAgY3BbLTFdID0gJy8nOwotLSAgICB9Ci0tCi0tICBjcCA9IHN0cGNweSAoY3AsIGxhbmd1YWdlKTsKLS0KLS0gIGlmICgobWFzayAmIFhQR19URVJSSVRPUlkpICE9IDApCi0tICAgIHsKLS0gICAgICAqY3ArKyA9ICdfJzsKLS0gICAgICBjcCA9IHN0cGNweSAoY3AsIHRlcnJpdG9yeSk7Ci0tICAgIH0KLS0gIGlmICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwKQotLSAgICB7Ci0tICAgICAgKmNwKysgPSAnLic7Ci0tICAgICAgY3AgPSBzdHBjcHkgKGNwLCBjb2Rlc2V0KTsKLS0gICAgfQotLSAgaWYgKChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkKLS0gICAgewotLSAgICAgICpjcCsrID0gJy4nOwotLSAgICAgIGNwID0gc3RwY3B5IChjcCwgbm9ybWFsaXplZF9jb2Rlc2V0KTsKLS0gICAgfQotLSAgaWYgKChtYXNrICYgWFBHX01PRElGSUVSKSAhPSAwKQotLSAgICB7Ci0tICAgICAgKmNwKysgPSAnQCc7Ci0tICAgICAgY3AgPSBzdHBjcHkgKGNwLCBtb2RpZmllcik7Ci0tICAgIH0KLS0KLS0gICpjcCsrID0gJy8nOwotLSAgc3RwY3B5IChjcCwgZmlsZW5hbWUpOwotLQotLSAgLyogTG9vayBpbiBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMgd2hldGhlciBpdCBpcyBhbHJlYWR5Ci0tICAgICBhdmFpbGFibGUuICAqLwotLSAgbGFzdHAgPSBsMTBuZmlsZV9saXN0OwotLSAgZm9yIChyZXR2YWwgPSAqbDEwbmZpbGVfbGlzdDsgcmV0dmFsICE9IE5VTEw7IHJldHZhbCA9IHJldHZhbC0+bmV4dCkKLS0gICAgaWYgKHJldHZhbC0+ZmlsZW5hbWUgIT0gTlVMTCkKLS0gICAgICB7Ci0tCWludCBjb21wYXJlID0gc3RyY21wIChyZXR2YWwtPmZpbGVuYW1lLCBhYnNfZmlsZW5hbWUpOwotLQlpZiAoY29tcGFyZSA9PSAwKQotLQkgIC8qIFdlIGZvdW5kIGl0ISAgKi8KLS0JICBicmVhazsKLS0JaWYgKGNvbXBhcmUgPCAwKQotLQkgIHsKLS0JICAgIC8qIEl0J3Mgbm90IGluIHRoZSBsaXN0LiAgKi8KLS0JICAgIHJldHZhbCA9IE5VTEw7Ci0tCSAgICBicmVhazsKLS0JICB9Ci0tCi0tCWxhc3RwID0gJnJldHZhbC0+bmV4dDsKLS0gICAgICB9Ci0tCi0tICBpZiAocmV0dmFsICE9IE5VTEwgfHwgZG9fYWxsb2NhdGUgPT0gMCkKLS0gICAgewotLSAgICAgIGZyZWUgKGFic19maWxlbmFtZSk7Ci0tICAgICAgcmV0dXJuIHJldHZhbDsKLS0gICAgfQotLQotLSAgZGlybGlzdF9jb3VudCA9IChkaXJsaXN0X2xlbiA+IDAgPyBfX2FyZ3pfY291bnQgKGRpcmxpc3QsIGRpcmxpc3RfbGVuKSA6IDEpOwotLQotLSAgLyogQWxsb2NhdGUgYSBuZXcgbG9hZGVkX2wxMG5maWxlLiAgKi8KLS0gIHJldHZhbCA9Ci0tICAgIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopCi0tICAgIG1hbGxvYyAoc2l6ZW9mICgqcmV0dmFsKQotLQkgICAgKyAoKChkaXJsaXN0X2NvdW50IDw8IHBvcCAobWFzaykpICsgKGRpcmxpc3RfY291bnQgPiAxID8gMSA6IDApKQotLQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKikpKTsKLS0gIGlmIChyZXR2YWwgPT0gTlVMTCkKLS0gICAgewotLSAgICAgIGZyZWUgKGFic19maWxlbmFtZSk7Ci0tICAgICAgcmV0dXJuIE5VTEw7Ci0tICAgIH0KLS0KLS0gIHJldHZhbC0+ZmlsZW5hbWUgPSBhYnNfZmlsZW5hbWU7Ci0tCi0tICAvKiBXZSBzZXQgcmV0dmFsLT5kYXRhIHRvIE5VTEwgaGVyZTsgaXQgaXMgZmlsbGVkIGluIGxhdGVyLgotLSAgICAgU2V0dGluZyByZXR2YWwtPmRlY2lkZWQgdG8gMSBoZXJlIG1lYW5zIHRoYXQgcmV0dmFsIGRvZXMgbm90Ci0tICAgICBjb3JyZXNwb25kIHRvIGEgcmVhbCBmaWxlIChkaXJsaXN0X2NvdW50ID4gMSkgb3IgaXMgbm90IHdvcnRoCi0tICAgICBsb29raW5nIHVwIChpZiBhbiB1bm5vcm1hbGl6ZWQgY29kZXNldCB3YXMgc3BlY2lmaWVkKS4gICovCi0tICByZXR2YWwtPmRlY2lkZWQgPSAoZGlybGlzdF9jb3VudCA+IDEKLS0JCSAgICAgfHwgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDAKLS0JCQkgJiYgKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwKSk7Ci0tICByZXR2YWwtPmRhdGEgPSBOVUxMOwotLQotLSAgcmV0dmFsLT5uZXh0ID0gKmxhc3RwOwotLSAgKmxhc3RwID0gcmV0dmFsOwotLQotLSAgZW50cmllcyA9IDA7Ci0tICAvKiBSZWN1cnNlIHRvIGZpbGwgdGhlIGluaGVyaXRhbmNlIGxpc3Qgb2YgUkVUVkFMLgotLSAgICAgSWYgdGhlIERJUkxJU1QgaXMgYSByZWFsIGxpc3QgKGkuZS4gRElSTElTVF9DT1VOVCA+IDEpLCB0aGUgUkVUVkFMCi0tICAgICBlbnRyeSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcmVhbCBmaWxlOyByZXR2YWwtPmZpbGVuYW1lIGNvbnRhaW5zCi0tICAgICBjb2xvbnMuICBJbiB0aGlzIGNhc2Ugd2UgbG9vcCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIERJUkxJU1QgYW5kCi0tICAgICBhY3Jvc3MgYWxsIGJpdCBwYXR0ZXJucyBkb21pbmF0ZWQgYnkgTUFTSy4KLS0gICAgIElmIHRoZSBESVJMSVNUIGlzIGEgc2luZ2xlIGRpcmVjdG9yeSBvciBlbnRpcmVseSByZWR1bmRhbnQgKGkuZS4KLS0gICAgIERJUkxJU1RfQ09VTlQgPT0gMSksIHdlIGxvb3AgYWNyb3NzIGFsbCBiaXQgcGF0dGVybnMgZG9taW5hdGVkIGJ5Ci0tICAgICBNQVNLLCBleGNsdWRpbmcgTUFTSyBpdHNlbGYuCi0tICAgICBJbiBlaXRoZXIgY2FzZSwgd2UgbG9vcCBkb3duIGZyb20gTUFTSyB0byAwLiAgVGhpcyBoYXMgdGhlIGVmZmVjdAotLSAgICAgdGhhdCB0aGUgZXh0cmEgYml0cyBpbiB0aGUgbG9jYWxlIG5hbWUgYXJlIGRyb3BwZWQgaW4gdGhpcyBvcmRlcjoKLS0gICAgIGZpcnN0IHRoZSBtb2RpZmllciwgdGhlbiB0aGUgdGVycml0b3J5LCB0aGVuIHRoZSBjb2Rlc2V0LCB0aGVuIHRoZQotLSAgICAgbm9ybWFsaXplZF9jb2Rlc2V0LiAgKi8KLS0gIGZvciAoY250ID0gZGlybGlzdF9jb3VudCA+IDEgPyBtYXNrIDogbWFzayAtIDE7IGNudCA+PSAwOyAtLWNudCkKLS0gICAgaWYgKChjbnQgJiB+bWFzaykgPT0gMAotLQkmJiAhKChjbnQgJiBYUEdfQ09ERVNFVCkgIT0gMCAmJiAoY250ICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkpCi0tICAgICAgewotLQlpZiAoZGlybGlzdF9jb3VudCA+IDEpCi0tCSAgewotLQkgICAgLyogSXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBvZiB0aGUgRElSTElTVC4gICovCi0tCSAgICBjaGFyICpkaXIgPSBOVUxMOwotLQotLQkgICAgd2hpbGUgKChkaXIgPSBfX2FyZ3pfbmV4dCAoKGNoYXIgKikgZGlybGlzdCwgZGlybGlzdF9sZW4sIGRpcikpCi0tCQkgICAhPSBOVUxMKQotLQkgICAgICByZXR2YWwtPnN1Y2Nlc3NvcltlbnRyaWVzKytdCi0tCQk9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlyLCBzdHJsZW4gKGRpcikgKyAxLAotLQkJCQkgICAgICBjbnQsIGxhbmd1YWdlLCB0ZXJyaXRvcnksIGNvZGVzZXQsCi0tCQkJCSAgICAgIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIGZpbGVuYW1lLAotLQkJCQkgICAgICAxKTsKLS0JICB9Ci0tCWVsc2UKLS0JICByZXR2YWwtPnN1Y2Nlc3NvcltlbnRyaWVzKytdCi0tCSAgICA9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlybGlzdCwgZGlybGlzdF9sZW4sCi0tCQkJCSAgY250LCBsYW5ndWFnZSwgdGVycml0b3J5LCBjb2Rlc2V0LAotLQkJCQkgIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIGZpbGVuYW1lLCAxKTsKLS0gICAgICB9Ci0tICByZXR2YWwtPnN1Y2Nlc3NvcltlbnRyaWVzXSA9IE5VTEw7Ci0tCi0tICByZXR1cm4gcmV0dmFsOwotLX0KLS0MCi0tLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAotLSAgIG5hbWVzLiAgTm9ybWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gdXNlIGFueSBvZiB0aGUgY29tbW9uCi0tICAgbmFtZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgaGFzIHRvIGJlCi0tICAgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCi0tY29uc3QgY2hhciAqCi0tX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb25zdCBjaGFyICpjb2Rlc2V0LCBzaXplX3QgbmFtZV9sZW4pCi0tewotLSAgaW50IGxlbiA9IDA7Ci0tICBpbnQgb25seV9kaWdpdCA9IDE7Ci0tICBjaGFyICpyZXR2YWw7Ci0tICBjaGFyICp3cDsKLS0gIHNpemVfdCBjbnQ7Ci0tCi0tICBmb3IgKGNudCA9IDA7IGNudCA8IG5hbWVfbGVuOyArK2NudCkKLS0gICAgaWYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQotLSAgICAgIHsKLS0JKytsZW47Ci0tCi0tCWlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKLS0JICBvbmx5X2RpZ2l0ID0gMDsKLS0gICAgICB9Ci0tCi0tICByZXR2YWwgPSAoY2hhciAqKSBtYWxsb2MgKChvbmx5X2RpZ2l0ID8gMyA6IDApICsgbGVuICsgMSk7Ci0tCi0tICBpZiAocmV0dmFsICE9IE5VTEwpCi0tICAgIHsKLS0gICAgICBpZiAob25seV9kaWdpdCkKLS0Jd3AgPSBzdHBjcHkgKHJldHZhbCwgImlzbyIpOwotLSAgICAgIGVsc2UKLS0Jd3AgPSByZXR2YWw7Ci0tCi0tICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCi0tCWlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKLS0JICAqd3ArKyA9IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pOwotLQllbHNlIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKLS0JICAqd3ArKyA9IGNvZGVzZXRbY250XTsKLS0KLS0gICAgICAqd3AgPSAnXDAnOwotLSAgICB9Ci0tCi0tICByZXR1cm4gKGNvbnN0IGNoYXIgKikgcmV0dmFsOwotLX0KLS0KLS0KLS0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLS0KLS0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotLSAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCi0tICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLS0gICB0byBiZSBkZWZpbmVkLiAgKi8KLS0jaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQotLXN0YXRpYyBjaGFyICoKLS1zdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKLS17Ci0tICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0tICAgIC8qIERvIG5vdGhpbmcuICovIDsKLS0gIHJldHVybiBkZXN0IC0gMTsKLS19Ci0tI2VuZGlmCi0tLS0gYS9pbnRsL2xhbmdwcmVmcy5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxMzAgKzAsMCBAQAotLS8qIERldGVybWluZSB0aGUgdXNlcidzIGxhbmd1YWdlIHByZWZlcmVuY2VzLgotLSAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tLyogV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4uICAqLwotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tCi0tI2lmIEhBVkVfQ0ZQUkVGRVJFTkNFU0NPUFlBUFBWQUxVRQotLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0tIyBpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9DRlByZWZlcmVuY2VzLmg+Ci0tIyBpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9DRlByb3BlcnR5TGlzdC5oPgotLSMgaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZBcnJheS5oPgotLSMgaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZTdHJpbmcuaD4KLS1leHRlcm4gdm9pZCBfbmxfbG9jYWxlX25hbWVfY2Fub25pY2FsaXplIChjaGFyICpuYW1lKTsKLS0jZW5kaWYKLS0KLS0vKiBEZXRlcm1pbmUgdGhlIHVzZXIncyBsYW5ndWFnZSBwcmVmZXJlbmNlcywgYXMgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZgotLSAgIGxvY2FsZSBuYW1lcyBpbiBYUEcgc3ludGF4Ci0tICAgICBsYW5ndWFnZVtfdGVycml0b3J5XVsuY29kZXNldF1bQG1vZGlmaWVyXQotLSAgIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgZnJlZWQ7IGl0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLgotLSAgIFRoZSBMQU5HVUFHRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGNvbnNpZGVyZWQ7IGl0IGlzCi0tICAgYWxyZWFkeSB0YWtlbiBpbnRvIGFjY291bnQgYnkgdGhlIGNhbGxlci4gICovCi0tCi0tY29uc3QgY2hhciAqCi0tX25sX2xhbmd1YWdlX3ByZWZlcmVuY2VzX2RlZmF1bHQgKHZvaWQpCi0tewotLSNpZiBIQVZFX0NGUFJFRkVSRU5DRVNDT1BZQVBQVkFMVUUgLyogTWFjT1MgWCAxMC4yIG9yIG5ld2VyICovCi0tICB7Ci0tICAgIC8qIENhY2hlIHRoZSBwcmVmZXJlbmNlcyBsaXN0LCBzaW5jZSBDb3JlRm91bmRhdGlvbiBjYWxscyBhcmUgZXhwZW5zaXZlLiAgKi8KLS0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNhY2hlZF9sYW5ndWFnZXM7Ci0tICAgIHN0YXRpYyBpbnQgY2FjaGVfaW5pdGlhbGl6ZWQ7Ci0tCi0tICAgIGlmICghY2FjaGVfaW5pdGlhbGl6ZWQpCi0tICAgICAgewotLQlDRlR5cGVSZWYgcHJlZmVyZW5jZXMgPQotLQkgIENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUgKENGU1RSICgiQXBwbGVMYW5ndWFnZXMiKSwKLS0JCQkJICAgICBrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRBcHBsaWNhdGlvbik7Ci0tCWlmIChwcmVmZXJlbmNlcyAhPSBOVUxMCi0tCSAgICAmJiBDRkdldFR5cGVJRCAocHJlZmVyZW5jZXMpID09IENGQXJyYXlHZXRUeXBlSUQgKCkpCi0tCSAgewotLQkgICAgQ0ZBcnJheVJlZiBwcmVmQXJyYXkgPSAoQ0ZBcnJheVJlZilwcmVmZXJlbmNlczsKLS0JICAgIGludCBuID0gQ0ZBcnJheUdldENvdW50IChwcmVmQXJyYXkpOwotLQkgICAgY2hhciBidWZbMjU2XTsKLS0JICAgIHNpemVfdCBzaXplID0gMDsKLS0JICAgIGludCBpOwotLQotLQkgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLS0JICAgICAgewotLQkJQ0ZUeXBlUmVmIGVsZW1lbnQgPSBDRkFycmF5R2V0VmFsdWVBdEluZGV4IChwcmVmQXJyYXksIGkpOwotLQkJaWYgKGVsZW1lbnQgIT0gTlVMTAotLQkJICAgICYmIENGR2V0VHlwZUlEIChlbGVtZW50KSA9PSBDRlN0cmluZ0dldFR5cGVJRCAoKQotLQkJICAgICYmIENGU3RyaW5nR2V0Q1N0cmluZyAoKENGU3RyaW5nUmVmKWVsZW1lbnQsCi0tCQkJCQkgICBidWYsIHNpemVvZiAoYnVmKSwKLS0JCQkJCSAgIGtDRlN0cmluZ0VuY29kaW5nQVNDSUkpKQotLQkJICB7Ci0tCQkgICAgX25sX2xvY2FsZV9uYW1lX2Nhbm9uaWNhbGl6ZSAoYnVmKTsKLS0JCSAgICBzaXplICs9IHN0cmxlbiAoYnVmKSArIDE7Ci0tCQkgICAgLyogTW9zdCBHTlUgcHJvZ3JhbXMgdXNlIG1zZ2lkcyBpbiBFbmdsaXNoIGFuZCBkb24ndCBzaGlwCi0tCQkgICAgICAgYW4gZW4ubW8gbWVzc2FnZSBjYXRhbG9nLiAgVGhlcmVmb3JlIHdoZW4gd2Ugc2VlICJlbiIKLS0JCSAgICAgICBpbiB0aGUgcHJlZmVyZW5jZXMgbGlzdCwgYXJyYW5nZSBmb3IgZ2V0dGV4dCgpIHRvCi0tCQkgICAgICAgcmV0dXJuIHRoZSBtc2dpZCwgYW5kIGlnbm9yZSBhbGwgZnVydGhlciBlbGVtZW50cyBvZgotLQkJICAgICAgIHRoZSBwcmVmZXJlbmNlcyBsaXN0LiAgKi8KLS0JCSAgICBpZiAoc3RyY21wIChidWYsICJlbiIpID09IDApCi0tCQkgICAgICBicmVhazsKLS0JCSAgfQotLQkJZWxzZQotLQkJICBicmVhazsKLS0JICAgICAgfQotLQkgICAgaWYgKHNpemUgPiAwKQotLQkgICAgICB7Ci0tCQljaGFyICpsYW5ndWFnZXMgPSAoY2hhciAqKSBtYWxsb2MgKHNpemUpOwotLQotLQkJaWYgKGxhbmd1YWdlcyAhPSBOVUxMKQotLQkJICB7Ci0tCQkgICAgY2hhciAqcCA9IGxhbmd1YWdlczsKLS0KLS0JCSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotLQkJICAgICAgewotLQkJCUNGVHlwZVJlZiBlbGVtZW50ID0KLS0JCQkgIENGQXJyYXlHZXRWYWx1ZUF0SW5kZXggKHByZWZBcnJheSwgaSk7Ci0tCQkJaWYgKGVsZW1lbnQgIT0gTlVMTAotLQkJICAgICAgICAgICAgJiYgQ0ZHZXRUeXBlSUQgKGVsZW1lbnQpID09IENGU3RyaW5nR2V0VHlwZUlEICgpCi0tCQkJICAgICYmIENGU3RyaW5nR2V0Q1N0cmluZyAoKENGU3RyaW5nUmVmKWVsZW1lbnQsCi0tCQkJCQkJICAgYnVmLCBzaXplb2YgKGJ1ZiksCi0tCQkJCQkJICAga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSkpCi0tCQkJICB7Ci0tCQkJICAgIF9ubF9sb2NhbGVfbmFtZV9jYW5vbmljYWxpemUgKGJ1Zik7Ci0tCQkJICAgIHN0cmNweSAocCwgYnVmKTsKLS0JCQkgICAgcCArPSBzdHJsZW4gKGJ1Zik7Ci0tCQkJICAgICpwKysgPSAnOic7Ci0tCQkJICAgIGlmIChzdHJjbXAgKGJ1ZiwgImVuIikgPT0gMCkKLS0JCQkgICAgICBicmVhazsKLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICBicmVhazsKLS0JCSAgICAgIH0KLS0JCSAgICAqLS1wID0gJ1wwJzsKLS0KLS0JCSAgICBjYWNoZWRfbGFuZ3VhZ2VzID0gbGFuZ3VhZ2VzOwotLQkJICB9Ci0tCSAgICAgIH0KLS0JICB9Ci0tCWNhY2hlX2luaXRpYWxpemVkID0gMTsKLS0gICAgICB9Ci0tICAgIGlmIChjYWNoZWRfbGFuZ3VhZ2VzICE9IE5VTEwpCi0tICAgICAgcmV0dXJuIGNhY2hlZF9sYW5ndWFnZXM7Ci0tICB9Ci0tI2VuZGlmCi0tCi0tICByZXR1cm4gTlVMTDsKLS19Ci0tLS0gYS9pbnRsL2xpYmdudWludGwuaC5pbgotKysrIC9kZXYvbnVsbAotQEAgLTEsNDE5ICswLDAgQEAKLS0vKiBNZXNzYWdlIGNhdGFsb2dzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBfTElCSU5UTF9ICi0tI2RlZmluZSBfTElCSU5UTF9ICTEKLS0KLS0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0tCi0tLyogVGhlIExDX01FU1NBR0VTIGxvY2FsZSBjYXRlZ29yeSBpcyB0aGUgY2F0ZWdvcnkgdXNlZCBieSB0aGUgZnVuY3Rpb25zCi0tICAgZ2V0dGV4dCgpIGFuZCBkZ2V0dGV4dCgpLiAgSXQgaXMgc3BlY2lmaWVkIGluIFBPU0lYLCBidXQgbm90IGluIEFOU0kgQy4KLS0gICBPbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgZGVmaW5lIGl0LCB1c2UgYW4gYXJiaXRyYXJ5IHZhbHVlIGluc3RlYWQuCi0tICAgT24gU29sYXJpcywgPGxvY2FsZS5oPiBkZWZpbmVzIF9fTE9DQUxFX0ggKG9yIF9MT0NBTEVfSCBpbiBTb2xhcmlzIDIuNSkKLS0gICB0aGVuIGluY2x1ZGVzIDxsaWJpbnRsLmg+IChpLmUuIHRoaXMgZmlsZSEpIGFuZCB0aGVuIG9ubHkgZGVmaW5lcwotLSAgIExDX01FU1NBR0VTLiAgVG8gYXZvaWQgYSByZWRlZmluaXRpb24gd2FybmluZywgZG9uJ3QgZGVmaW5lIExDX01FU1NBR0VTCi0tICAgaW4gdGhpcyBjYXNlLiAgKi8KLS0jaWYgIWRlZmluZWQgTENfTUVTU0FHRVMgJiYgIShkZWZpbmVkIF9fTE9DQUxFX0ggfHwgKGRlZmluZWQgX0xPQ0FMRV9IICYmIGRlZmluZWQgX19zdW4pKQotLSMgZGVmaW5lIExDX01FU1NBR0VTIDE3MjkKLS0jZW5kaWYKLS0KLS0vKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKLS0gICBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0LiAgKi8KLS0jZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKLS0KLS0vKiBQcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXBwb3J0ZWQgZmlsZSBmb3JtYXRzLiAgUmV0dXJucyB0aGUKLS0gICBtYXhpbXVtIG1pbm9yIHJldmlzaW9uIG51bWJlciBzdXBwb3J0ZWQgZm9yIGEgZ2l2ZW4gbWFqb3IgcmV2aXNpb24uICAqLwotLSNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpIFwKLS0gICgobWFqb3IpID09IDAgfHwgKG1ham9yKSA9PSAxID8gMSA6IC0xKQotLQotLS8qIFJlc29sdmUgYSBwbGF0Zm9ybSBzcGVjaWZpYyBjb25mbGljdCBvbiBESkdQUC4gIEdOVSBnZXR0ZXh0IHRha2VzCi0tICAgcHJlY2VkZW5jZSBvdmVyIF9jb25pb19nZXR0ZXh0LiAgKi8KLS0jaWZkZWYgX19ESkdQUF9fCi0tIyB1bmRlZiBnZXR0ZXh0Ci0tI2VuZGlmCi0tCi0tI2lmZGVmIF9fY3BsdXNwbHVzCi0tZXh0ZXJuICJDIiB7Ci0tI2VuZGlmCi0tCi0tCi0tLyogVmVyc2lvbiBudW1iZXI6IChtYWpvcjw8MTYpICsgKG1pbm9yPDw4KSArIHN1Ym1pbm9yICovCi0tI2RlZmluZSBMSUJJTlRMX1ZFUlNJT04gMHgwMDExMDAKLS1leHRlcm4gaW50IGxpYmludGxfdmVyc2lvbjsKLS0KLS0KLS0vKiBXZSByZWRpcmVjdCB0aGUgZnVuY3Rpb25zIHRvIHRob3NlIHByZWZpeGVkIHdpdGggImxpYmludGxfIi4gIFRoaXMgaXMKLS0gICBuZWNlc3NhcnksIGJlY2F1c2Ugc29tZSBzeXN0ZW1zIGRlZmluZSBnZXR0ZXh0L3RleHRkb21haW4vLi4uIGluIHRoZSBDCi0tICAgbGlicmFyeSAobmFtZWx5LCBTb2xhcmlzIDIuNCBhbmQgbmV3ZXIsIGFuZCBHTlUgbGliYyAyLjAgYW5kIG5ld2VyKS4KLS0gICBJZiB3ZSB1c2VkIHRoZSB1bnByZWZpeGVkIG5hbWVzLCB0aGVyZSB3b3VsZCBiZSBjYXNlcyB3aGVyZSB0aGUKLS0gICBkZWZpbml0aW9uIGluIHRoZSBDIGxpYnJhcnkgd291bGQgb3ZlcnJpZGUgdGhlIG9uZSBpbiB0aGUgbGliaW50bC5zbwotLSAgIHNoYXJlZCBsaWJyYXJ5LiAgUmVjYWxsIHRoYXQgb24gRUxGIHN5c3RlbXMsIHRoZSBzeW1ib2xzIGFyZSBsb29rZWQKLS0gICB1cCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotLSAgICAgMS4gaW4gdGhlIGV4ZWN1dGFibGUsCi0tICAgICAyLiBpbiB0aGUgc2hhcmVkIGxpYnJhcmllcyBzcGVjaWZpZWQgb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lLCBpbiBvcmRlciwKLS0gICAgIDMuIGluIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgc3BlY2lmaWVkIG9uIHRoZSBsaW5rCi0tICAgICAgICBjb21tYW5kIGxpbmUsCi0tICAgICA0LiBpbiB0aGUgZGxvcGVuKCllZCBzaGFyZWQgbGlicmFyaWVzLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlCi0tICAgICAgICBkbG9wZW4oKWVkLgotLSAgIFRoZSBkZWZpbml0aW9uIGluIHRoZSBDIGxpYnJhcnkgd291bGQgb3ZlcnJpZGUgdGhlIG9uZSBpbiBsaWJpbnRsLnNvIGlmCi0tICAgZWl0aGVyCi0tICAgICAqIC1sYyBpcyBnaXZlbiBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUgYW5kIC1saW50bCBpc24ndCwgb3IKLS0gICAgICogLWxjIGlzIGdpdmVuIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZSBiZWZvcmUgLWxpbnRsLCBvcgotLSAgICAgKiBsaWJpbnRsLnNvIGlzIGEgZGVwZW5kZW5jeSBvZiBhIGRsb3BlbigpZWQgc2hhcmVkIGxpYnJhcnkgYnV0IG5vdAotLSAgICAgICBsaW5rZWQgdG8gdGhlIGV4ZWN1dGFibGUgYXQgbGluayB0aW1lLgotLSAgIFNpbmNlIFNvbGFyaXMgZ2V0dGV4dCgpIGJlaGF2ZXMgZGlmZmVyZW50bHkgdGhhbiBHTlUgZ2V0dGV4dCgpLCB0aGlzCi0tICAgd291bGQgYmUgdW5hY2NlcHRhYmxlLgotLQotLSAgIFRoZSByZWRpcmVjdGlvbiBoYXBwZW5zIGJ5IGRlZmF1bHQgdGhyb3VnaCBtYWNyb3MgaW4gQywgc28gdGhhdCAmZ2V0dGV4dAotLSAgIGlzIGluZGVwZW5kZW50IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBidXQgdGhyb3VnaCBpbmxpbmUgZnVuY3Rpb25zIGluCi0tICAgQysrLCBpbiBvcmRlciBub3QgdG8gaW50ZXJmZXJlIHdpdGggdGhlIG5hbWUgbWFuZ2xpbmcgb2YgY2xhc3MgZmllbGRzIG9yCi0tICAgY2xhc3MgbWV0aG9kcyBjYWxsZWQgJ2dldHRleHQnLiAgKi8KLS0KLS0vKiBUaGUgdXNlciBjYW4gZGVmaW5lIF9JTlRMX1JFRElSRUNUX0lOTElORSBvciBfSU5UTF9SRURJUkVDVF9NQUNST1MuCi0tICAgSWYgaGUgZG9lc24ndCwgd2UgY2hvb3NlIHRoZSBtZXRob2QuICBBIHRoaXJkIHBvc3NpYmxlIG1ldGhvZCBpcwotLSAgIF9JTlRMX1JFRElSRUNUX0FTTSwgc3VwcG9ydGVkIG9ubHkgYnkgR0NDLiAgKi8KLS0jaWYgIShkZWZpbmVkIF9JTlRMX1JFRElSRUNUX0lOTElORSB8fCBkZWZpbmVkIF9JTlRMX1JFRElSRUNUX01BQ1JPUykKLS0jIGlmIF9fR05VQ19fID49IDIgJiYgIShfX0FQUExFX0NDX18gPiAxKSAmJiAhZGVmaW5lZCBfX01JTkdXMzJfXyAmJiAhKF9fR05VQ19fID09IDIgJiYgZGVmaW5lZCBfQUlYKSAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzKQotLSMgIGRlZmluZSBfSU5UTF9SRURJUkVDVF9BU00KLS0jIGVsc2UKLS0jICBpZmRlZiBfX2NwbHVzcGx1cwotLSMgICBkZWZpbmUgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi0tIyAgZWxzZQotLSMgICBkZWZpbmUgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tI2VuZGlmCi0tLyogQXV4aWxpYXJ5IG1hY3Jvcy4gICovCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX0FTTQotLSMgZGVmaW5lIF9JTlRMX0FTTShjbmFtZSkgX19hc21fXyAoX0lOVExfQVNNTkFNRSAoX19VU0VSX0xBQkVMX1BSRUZJWF9fLCAjY25hbWUpKQotLSMgZGVmaW5lIF9JTlRMX0FTTU5BTUUocHJlZml4LGNuYW1lc3RyaW5nKSBfSU5UTF9TVFJJTkdJRlkgKHByZWZpeCkgY25hbWVzdHJpbmcKLS0jIGRlZmluZSBfSU5UTF9TVFJJTkdJRlkocHJlZml4KSAjcHJlZml4Ci0tI2Vsc2UKLS0jIGRlZmluZSBfSU5UTF9BU00oY25hbWUpCi0tI2VuZGlmCi0tCi0tLyogX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHKG4pIGRlY2xhcmVzIHRoYXQgdGhlIGdpdmVuIGZ1bmN0aW9uIG1heSByZXR1cm4KLS0gICBpdHMgbi10aCBhcmd1bWVudCBsaXRlcmFsbHkuICBUaGlzIGVuYWJsZXMgR0NDIHRvIHdhcm4gZm9yIGV4YW1wbGUgYWJvdXQKLS0gICBwcmludGYgKGdldHRleHQgKCJmb28gJXkiKSkuICAqLwotLSNpZiBfX0dOVUNfXyA+PSAzICYmICEoX19BUFBMRV9DQ19fID4gMSAmJiBkZWZpbmVkIF9fY3BsdXNwbHVzKQotLSMgZGVmaW5lIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyhuKSBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfYXJnX18gKG4pKSkKLS0jZWxzZQotLSMgZGVmaW5lIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyhuKQotLSNlbmRpZgotLQotLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0tICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLS0gICB0ZXh0KS4gICovCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotLWV4dGVybiBjaGFyICpsaWJpbnRsX2dldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQpCi0tICAgICAgIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMSk7Ci0tc3RhdGljIGlubGluZSBjaGFyICpnZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKQotLXsKLS0gIHJldHVybiBsaWJpbnRsX2dldHRleHQgKF9fbXNnaWQpOwotLX0KLS0jZWxzZQotLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKLS0jIGRlZmluZSBnZXR0ZXh0IGxpYmludGxfZ2V0dGV4dAotLSNlbmRpZgotLWV4dGVybiBjaGFyICpnZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKQotLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZ2V0dGV4dCkKLS0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgxKTsKLS0jZW5kaWYKLS0KLS0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLS0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwotLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLS1leHRlcm4gY2hhciAqbGliaW50bF9kZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKQotLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpOwotLXN0YXRpYyBpbmxpbmUgY2hhciAqZGdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkKLS17Ci0tICByZXR1cm4gbGliaW50bF9kZ2V0dGV4dCAoX19kb21haW5uYW1lLCBfX21zZ2lkKTsKLS19Ci0tI2Vsc2UKLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0tIyBkZWZpbmUgZGdldHRleHQgbGliaW50bF9kZ2V0dGV4dAotLSNlbmRpZgotLWV4dGVybiBjaGFyICpkZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKQotLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZGdldHRleHQpCi0tICAgICAgIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMik7Ci0tI2VuZGlmCi0tCi0tLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0tICAgbG9jYWxlLiAgKi8KLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi0tZXh0ZXJuIGNoYXIgKmxpYmludGxfZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCi0tCQkJCWludCBfX2NhdGVnb3J5KQotLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpOwotLXN0YXRpYyBpbmxpbmUgY2hhciAqZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCi0tCQkJICAgICAgIGludCBfX2NhdGVnb3J5KQotLXsKLS0gIHJldHVybiBsaWJpbnRsX2RjZ2V0dGV4dCAoX19kb21haW5uYW1lLCBfX21zZ2lkLCBfX2NhdGVnb3J5KTsKLS19Ci0tI2Vsc2UKLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0tIyBkZWZpbmUgZGNnZXR0ZXh0IGxpYmludGxfZGNnZXR0ZXh0Ci0tI2VuZGlmCi0tZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAotLQkJCWludCBfX2NhdGVnb3J5KQotLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZGNnZXR0ZXh0KQotLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpOwotLSNlbmRpZgotLQotLQotLS8qIFNpbWlsYXIgdG8gYGdldHRleHQnIGJ1dCBzZWxlY3QgdGhlIHBsdXJhbCBmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0tICAgbnVtYmVyIE4uICAqLwotLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLS1leHRlcm4gY2hhciAqbGliaW50bF9uZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGludCBfX24pCi0tICAgICAgIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMSkgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgyKTsKLS1zdGF0aWMgaW5saW5lIGNoYXIgKm5nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0tCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbnQgX19uKQotLXsKLS0gIHJldHVybiBsaWJpbnRsX25nZXR0ZXh0IChfX21zZ2lkMSwgX19tc2dpZDIsIF9fbik7Ci0tfQotLSNlbHNlCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotLSMgZGVmaW5lIG5nZXR0ZXh0IGxpYmludGxfbmdldHRleHQKLS0jZW5kaWYKLS1leHRlcm4gY2hhciAqbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLS0JCSAgICAgICB1bnNpZ25lZCBsb25nIGludCBfX24pCi0tICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9uZ2V0dGV4dCkKLS0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgxKSBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpOwotLSNlbmRpZgotLQotLS8qIFNpbWlsYXIgdG8gYGRnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQotLSAgIG51bWJlciBOLiAgKi8KLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi0tZXh0ZXJuIGNoYXIgKmxpYmludGxfZG5nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQxLAotLQkJCQljb25zdCBjaGFyICpfX21zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgX19uKQotLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMyk7Ci0tc3RhdGljIGlubGluZSBjaGFyICpkbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZDEsCi0tCQkJICAgICAgIGNvbnN0IGNoYXIgKl9fbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBfX24pCi0tewotLSAgcmV0dXJuIGxpYmludGxfZG5nZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uKTsKLS19Ci0tI2Vsc2UKLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0tIyBkZWZpbmUgZG5nZXR0ZXh0IGxpYmludGxfZG5nZXR0ZXh0Ci0tI2VuZGlmCi0tZXh0ZXJuIGNoYXIgKmRuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCWNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLS0JCQl1bnNpZ25lZCBsb25nIGludCBfX24pCi0tICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kbmdldHRleHQpCi0tICAgICAgIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMikgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgzKTsKLS0jZW5kaWYKLS0KLS0vKiBTaW1pbGFyIHRvIGBkY2dldHRleHQnIGJ1dCBzZWxlY3QgdGhlIHBsdXJhbCBmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0tICAgbnVtYmVyIE4uICAqLwotLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLS1leHRlcm4gY2hhciAqbGliaW50bF9kY25nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0tCQkJCSBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0tCQkJCSB1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KQotLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMyk7Ci0tc3RhdGljIGlubGluZSBjaGFyICpkY25nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0tCQkJCWNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLS0JCQkJdW5zaWduZWQgbG9uZyBpbnQgX19uLCBpbnQgX19jYXRlZ29yeSkKLS17Ci0tICByZXR1cm4gbGliaW50bF9kY25nZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uLCBfX2NhdGVnb3J5KTsKLS19Ci0tI2Vsc2UKLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0tIyBkZWZpbmUgZGNuZ2V0dGV4dCBsaWJpbnRsX2RjbmdldHRleHQKLS0jZW5kaWYKLS1leHRlcm4gY2hhciAqZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCSBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0tCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwgaW50IF9fY2F0ZWdvcnkpCi0tICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kY25nZXR0ZXh0KQotLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMyk7Ci0tI2VuZGlmCi0tCi0tCi0tI2lmbmRlZiBJTl9MSUJHTE9DQUxFCi0tCi0tLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0tICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLS0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi0tZXh0ZXJuIGNoYXIgKmxpYmludGxfdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKTsKLS1zdGF0aWMgaW5saW5lIGNoYXIgKnRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkKLS17Ci0tICByZXR1cm4gbGliaW50bF90ZXh0ZG9tYWluIChfX2RvbWFpbm5hbWUpOwotLX0KLS0jZWxzZQotLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKLS0jIGRlZmluZSB0ZXh0ZG9tYWluIGxpYmludGxfdGV4dGRvbWFpbgotLSNlbmRpZgotLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpCi0tICAgICAgIF9JTlRMX0FTTSAobGliaW50bF90ZXh0ZG9tYWluKTsKLS0jZW5kaWYKLS0KLS0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLS0gICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotLWV4dGVybiBjaGFyICpsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0tCQkJCSAgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKTsKLS1zdGF0aWMgaW5saW5lIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0tCQkJCSAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpCi0tewotLSAgcmV0dXJuIGxpYmludGxfYmluZHRleHRkb21haW4gKF9fZG9tYWlubmFtZSwgX19kaXJuYW1lKTsKLS19Ci0tI2Vsc2UKLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0tIyBkZWZpbmUgYmluZHRleHRkb21haW4gbGliaW50bF9iaW5kdGV4dGRvbWFpbgotLSNlbmRpZgotLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX2Rpcm5hbWUpCi0tICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9iaW5kdGV4dGRvbWFpbik7Ci0tI2VuZGlmCi0tCi0tLyogU3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGluIHdoaWNoIHRoZSBtZXNzYWdlcyBmcm9tIHRoZQotLSAgIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgcmV0dXJuZWQuICAqLwotLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLS1leHRlcm4gY2hhciAqbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCQkJICAgICAgY29uc3QgY2hhciAqX19jb2Rlc2V0KTsKLS1zdGF0aWMgaW5saW5lIGNoYXIgKmJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0tCQkJCQkgICAgIGNvbnN0IGNoYXIgKl9fY29kZXNldCkKLS17Ci0tICByZXR1cm4gbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCAoX19kb21haW5uYW1lLCBfX2NvZGVzZXQpOwotLX0KLS0jZWxzZQotLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKLS0jIGRlZmluZSBiaW5kX3RleHRkb21haW5fY29kZXNldCBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0Ci0tI2VuZGlmCi0tZXh0ZXJuIGNoYXIgKmJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0tCQkJCSAgICAgIGNvbnN0IGNoYXIgKl9fY29kZXNldCkKLS0gICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KTsKLS0jZW5kaWYKLS0KLS0jZW5kaWYgLyogSU5fTElCR0xPQ0FMRSAqLwotLQotLQotLS8qIFN1cHBvcnQgZm9yIGZvcm1hdCBzdHJpbmdzIHdpdGggcG9zaXRpb25zIGluICpwcmludGYoKSwgZm9sbG93aW5nIHRoZQotLSAgIFBPU0lYL1hTSSBzcGVjaWZpY2F0aW9uLgotLSAgIE5vdGU6IFRoZXNlIHJlcGxhY2VtZW50cyBmb3IgdGhlICpwcmludGYoKSBmdW5jdGlvbnMgYXJlIHZpc2libGUgb25seQotLSAgIGluIHNvdXJjZSBmaWxlcyB0aGF0ICNpbmNsdWRlIDxsaWJpbnRsLmg+IG9yICNpbmNsdWRlICJnZXR0ZXh0LmgiLgotLSAgIFBhY2thZ2VzIHRoYXQgdXNlICpwcmludGYoKSBpbiBzb3VyY2UgZmlsZXMgdGhhdCBkb24ndCByZWZlciB0byBfKCkKLS0gICBvciBnZXR0ZXh0KCkgYnV0IGZvciB3aGljaCB0aGUgZm9ybWF0IHN0cmluZyBjb3VsZCBiZSB0aGUgcmV0dXJuIHZhbHVlCi0tICAgb2YgXygpIG9yIGdldHRleHQoKSBuZWVkIHRvIGFkZCB0aGlzICNpbmNsdWRlLiAgT2ggd2VsbC4gICovCi0tCi0tI2lmICFASEFWRV9QT1NJWF9QUklOVEZACi0tCi0tI2luY2x1ZGUgPHN0ZGlvLmg+Ci0tI2luY2x1ZGUgPHN0ZGRlZi5oPgotLQotLS8qIEdldCB2YV9saXN0LiAgKi8KLS0jaWYgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSCi0tIyBpbmNsdWRlIDxzdGRhcmcuaD4KLS0jZWxzZQotLSMgaW5jbHVkZSA8dmFyYXJncy5oPgotLSNlbmRpZgotLQotLSN1bmRlZiBmcHJpbnRmCi0tI2RlZmluZSBmcHJpbnRmIGxpYmludGxfZnByaW50ZgotLWV4dGVybiBpbnQgZnByaW50ZiAoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLik7Ci0tI3VuZGVmIHZmcHJpbnRmCi0tI2RlZmluZSB2ZnByaW50ZiBsaWJpbnRsX3ZmcHJpbnRmCi0tZXh0ZXJuIGludCB2ZnByaW50ZiAoRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwotLQotLSN1bmRlZiBwcmludGYKLS0jaWYgZGVmaW5lZCBfX05ldEJTRF9fIHx8IGRlZmluZWQgX19CRU9TX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fIHx8IGRlZmluZWQgX19NSU5HVzMyX18KLS0vKiBEb24ndCBicmVhayBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLE0sTikpKS4KLS0gICBUaGlzIHJlZGVmaW5pdGlvbiBpcyBvbmx5IHBvc3NpYmxlIGJlY2F1c2UgdGhlIGxpYmMgaW4gTmV0QlNELCBDeWd3aW4sCi0tICAgbWluZ3cgZG9lcyBub3QgaGF2ZSBhIGZ1bmN0aW9uIF9fcHJpbnRmX18uICAqLwotLSMgZGVmaW5lIGxpYmludGxfcHJpbnRmIF9fcHJpbnRmX18KLS0jZW5kaWYKLS0jZGVmaW5lIHByaW50ZiBsaWJpbnRsX3ByaW50ZgotLWV4dGVybiBpbnQgcHJpbnRmIChjb25zdCBjaGFyICosIC4uLik7Ci0tI3VuZGVmIHZwcmludGYKLS0jZGVmaW5lIHZwcmludGYgbGliaW50bF92cHJpbnRmCi0tZXh0ZXJuIGludCB2cHJpbnRmIChjb25zdCBjaGFyICosIHZhX2xpc3QpOwotLQotLSN1bmRlZiBzcHJpbnRmCi0tI2RlZmluZSBzcHJpbnRmIGxpYmludGxfc3ByaW50ZgotLWV4dGVybiBpbnQgc3ByaW50ZiAoY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7Ci0tI3VuZGVmIHZzcHJpbnRmCi0tI2RlZmluZSB2c3ByaW50ZiBsaWJpbnRsX3ZzcHJpbnRmCi0tZXh0ZXJuIGludCB2c3ByaW50ZiAoY2hhciAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwotLQotLSNpZiBASEFWRV9TTlBSSU5URkAKLS0KLS0jdW5kZWYgc25wcmludGYKLS0jZGVmaW5lIHNucHJpbnRmIGxpYmludGxfc25wcmludGYKLS1leHRlcm4gaW50IHNucHJpbnRmIChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOwotLSN1bmRlZiB2c25wcmludGYKLS0jZGVmaW5lIHZzbnByaW50ZiBsaWJpbnRsX3ZzbnByaW50ZgotLWV4dGVybiBpbnQgdnNucHJpbnRmIChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLS0KLS0jZW5kaWYKLS0KLS0jaWYgQEhBVkVfQVNQUklOVEZACi0tCi0tI3VuZGVmIGFzcHJpbnRmCi0tI2RlZmluZSBhc3ByaW50ZiBsaWJpbnRsX2FzcHJpbnRmCi0tZXh0ZXJuIGludCBhc3ByaW50ZiAoY2hhciAqKiwgY29uc3QgY2hhciAqLCAuLi4pOwotLSN1bmRlZiB2YXNwcmludGYKLS0jZGVmaW5lIHZhc3ByaW50ZiBsaWJpbnRsX3Zhc3ByaW50ZgotLWV4dGVybiBpbnQgdmFzcHJpbnRmIChjaGFyICoqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwotLQotLSNlbmRpZgotLQotLSNpZiBASEFWRV9XUFJJTlRGQAotLQotLSN1bmRlZiBmd3ByaW50ZgotLSNkZWZpbmUgZndwcmludGYgbGliaW50bF9md3ByaW50ZgotLWV4dGVybiBpbnQgZndwcmludGYgKEZJTEUgKiwgY29uc3Qgd2NoYXJfdCAqLCAuLi4pOwotLSN1bmRlZiB2ZndwcmludGYKLS0jZGVmaW5lIHZmd3ByaW50ZiBsaWJpbnRsX3Zmd3ByaW50ZgotLWV4dGVybiBpbnQgdmZ3cHJpbnRmIChGSUxFICosIGNvbnN0IHdjaGFyX3QgKiwgdmFfbGlzdCk7Ci0tCi0tI3VuZGVmIHdwcmludGYKLS0jZGVmaW5lIHdwcmludGYgbGliaW50bF93cHJpbnRmCi0tZXh0ZXJuIGludCB3cHJpbnRmIChjb25zdCB3Y2hhcl90ICosIC4uLik7Ci0tI3VuZGVmIHZ3cHJpbnRmCi0tI2RlZmluZSB2d3ByaW50ZiBsaWJpbnRsX3Z3cHJpbnRmCi0tZXh0ZXJuIGludCB2d3ByaW50ZiAoY29uc3Qgd2NoYXJfdCAqLCB2YV9saXN0KTsKLS0KLS0jdW5kZWYgc3dwcmludGYKLS0jZGVmaW5lIHN3cHJpbnRmIGxpYmludGxfc3dwcmludGYKLS1leHRlcm4gaW50IHN3cHJpbnRmICh3Y2hhcl90ICosIHNpemVfdCwgY29uc3Qgd2NoYXJfdCAqLCAuLi4pOwotLSN1bmRlZiB2c3dwcmludGYKLS0jZGVmaW5lIHZzd3ByaW50ZiBsaWJpbnRsX3Zzd3ByaW50ZgotLWV4dGVybiBpbnQgdnN3cHJpbnRmICh3Y2hhcl90ICosIHNpemVfdCwgY29uc3Qgd2NoYXJfdCAqLCB2YV9saXN0KTsKLS0KLS0jZW5kaWYKLS0KLS0jZW5kaWYKLS0KLS0KLS0vKiBTdXBwb3J0IGZvciByZWxvY2F0YWJsZSBwYWNrYWdlcy4gICovCi0tCi0tLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCi0tICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKLS0gICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAotLSAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKLS0gICBpbnN0ZWFkIG9mICIvIikuICAqLwotLSNkZWZpbmUgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXgKLS1leHRlcm4gdm9pZAotLSAgICAgICBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19wcmVmaXgsCi0tCQkJCSAgICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4KTsKLS0KLS0KLS0jaWZkZWYgX19jcGx1c3BsdXMKLS19Ci0tI2VuZGlmCi0tCi0tI2VuZGlmIC8qIGxpYmludGwuaCAqLwotLS0tIGEvaW50bC9saWJpbnRsLnJjCi0rKysgL2Rldi9udWxsCi1AQCAtMSwzOCArMCwwIEBACi0tLyogUmVzb3VyY2VzIGZvciBpbnRsLmRsbCAqLwotLQotLSNpbmNsdWRlIDx3aW52ZXIuaD4KLS0KLS1WU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KLS0gRklMRVZFUlNJT04gUEFDS0FHRV9WRVJTSU9OX01BSk9SLFBBQ0tBR0VfVkVSU0lPTl9NSU5PUixQQUNLQUdFX1ZFUlNJT05fU1VCTUlOT1IsMAotLSBQUk9EVUNUVkVSU0lPTiBQQUNLQUdFX1ZFUlNJT05fTUFKT1IsUEFDS0FHRV9WRVJTSU9OX01JTk9SLFBBQ0tBR0VfVkVSU0lPTl9TVUJNSU5PUiwwCi0tIEZJTEVGTEFHU01BU0sgMHgzZkwgLyogVlNfRkZJX0ZJTEVGTEFHU01BU0sgKi8KLS0jaWZkZWYgX0RFQlVHCi0tIEZJTEVGTEFHUyAweDFMICAvKiBWU19GRl9ERUJVRyAqLwotLSNlbHNlCi0tIEZJTEVGTEFHUyAweDBMCi0tI2VuZGlmCi0tIEZJTEVPUyAweDEwMDA0TCAgLyogVk9TX0RPU19XSU5ET1dTMzIgKi8KLS0gRklMRVRZUEUgMHgyTCAgLyogVkZUX0RMTCAqLwotLSBGSUxFU1VCVFlQRSAweDBMICAvKiBWRlQyX1VOS05PV04gKi8KLS1CRUdJTgotLSAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0tICAgIEJFR0lOCi0tICAgICAgICBCTE9DSyAiMDQwOTAwMDAiICAvKiBMYW5nID0gVVMgRW5nbGlzaCwgQ2hhcnNldCA9IEFTQ0lJICovCi0tICAgICAgICBCRUdJTgotLSAgICAgICAgICAgIFZBTFVFICJDb21tZW50cyIsICJUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0FcMCIKLS0gICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uXDAiCi0tICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJMR1BMZWQgbGliaW50bCBmb3IgV2luZG93cyBOVC8yMDAwL1hQL1Zpc3RhIGFuZCBXaW5kb3dzIDk1Lzk4L01FXDAiCi0tICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgUEFDS0FHRV9WRVJTSU9OX1NUUklORyAiXDAiCi0tICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJpbnRsLmRsbFwwIgotLSAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICJDb3B5cmlnaHQgKEMpIDE5OTUtMjAwN1wwIgotLSAgICAgICAgICAgIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAiXDAiCi0tICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAiaW50bC5kbGxcMCIKLS0gICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAibGliaW50bDogYWNjZXNzaW5nIE5MUyBtZXNzYWdlIGNhdGFsb2dzXDAiCi0tICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgUEFDS0FHRV9WRVJTSU9OX1NUUklORyAiXDAiCi0tICAgICAgICBFTkQKLS0gICAgRU5ECi0tICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKLS0gICAgQkVHSU4KLS0gICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4MDQwOSwgMCAgLyogVVMgRW5nbGlzaCwgQVNDSUkgKi8KLS0gICAgRU5ECi0tRU5ECi0tLS0gYS9pbnRsL2xvYWRpbmZvLmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDEzMiArMCwwIEBACi0tLyogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTksIDIwMDAtMjAwMywgMjAwNS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgotLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBfTE9BRElORk9fSAotLSNkZWZpbmUgX0xPQURJTkZPX0gJMQotLQotLS8qIERlY2xhcmF0aW9ucyBvZiBsb2NhbGUgZGVwZW5kZW50IGNhdGFsb2cgbG9va3VwIGZ1bmN0aW9ucy4KLS0gICBJbXBsZW1lbnRlZCBpbgotLQotLSAgICAgbG9jYWxlYWxpYXMuYyAgICBQb3NzaWJseSByZXBsYWNlIGEgbG9jYWxlIG5hbWUgYnkgYW5vdGhlci4KLS0gICAgIGV4cGxvZGVuYW1lLmMgICAgU3BsaXQgYSBsb2NhbGUgbmFtZSBpbnRvIGl0cyB2YXJpb3VzIGZpZWxkcy4KLS0gICAgIGwxMG5mbGlzdC5jICAgICAgR2VuZXJhdGUgYSBsaXN0IG9mIGZpbGVuYW1lcyBvZiBwb3NzaWJsZSBtZXNzYWdlIGNhdGFsb2dzLgotLSAgICAgZmluZGRvbWFpbi5jICAgICBGaW5kIGFuZCBvcGVuIHRoZSByZWxldmFudCBtZXNzYWdlIGNhdGFsb2dzLgotLQotLSAgIFRoZSBtYWluIGZ1bmN0aW9uIF9ubF9maW5kX2RvbWFpbigpIGluIGZpbmRkb21haW4uYyBpcyBkZWNsYXJlZAotLSAgIGluIGdldHRleHRQLmguCi0tICovCi0tCi0tI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgotLSMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCi0tI2VuZGlmCi0tCi0tI2lmbmRlZiBMSUJJTlRMX0RMTF9FWFBPUlRFRAotLSMgZGVmaW5lIExJQklOVExfRExMX0VYUE9SVEVECi0tI2VuZGlmCi0tCi0tLyogVGVsbCB0aGUgY29tcGlsZXIgd2hlbiBhIGNvbmRpdGlvbmFsIG9yIGludGVnZXIgZXhwcmVzc2lvbiBpcwotLSAgIGFsbW9zdCBhbHdheXMgdHJ1ZSBvciBhbG1vc3QgYWx3YXlzIGZhbHNlLiAgKi8KLS0jaWZuZGVmIEhBVkVfQlVJTFRJTl9FWFBFQ1QKLS0jIGRlZmluZSBfX2J1aWx0aW5fZXhwZWN0KGV4cHIsIHZhbCkgKGV4cHIpCi0tI2VuZGlmCi0tCi0tLyogU2VwYXJhdG9yIGluIFBBVEggbGlrZSBsaXN0cyBvZiBwYXRobmFtZXMuICAqLwotLSNpZiAoKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKSAmJiAhZGVmaW5lZCBfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KLS0gIC8qIFdpbjMyLCBPUy8yLCBET1MgKi8KLS0jIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOycKLS0jZWxzZQotLSAgLyogVW5peCAqLwotLSMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JwotLSNlbmRpZgotLQotLS8qIEVuY29kaW5nIG9mIGxvY2FsZSBuYW1lIHBhcnRzLiAgKi8KLS0jZGVmaW5lIFhQR19OT1JNX0NPREVTRVQJMQotLSNkZWZpbmUgWFBHX0NPREVTRVQJCTIKLS0jZGVmaW5lIFhQR19URVJSSVRPUlkJCTQKLS0jZGVmaW5lIFhQR19NT0RJRklFUgkJOAotLQotLQotLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUKLS17Ci0tICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLS0gIGludCBkZWNpZGVkOwotLQotLSAgY29uc3Qgdm9pZCAqZGF0YTsKLS0KLS0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKm5leHQ7Ci0tICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpzdWNjZXNzb3JbMV07Ci0tfTsKLS0KLS0KLS0vKiBOb3JtYWxpemUgY29kZXNldCBuYW1lLiAgVGhlcmUgaXMgbm8gc3RhbmRhcmQgZm9yIHRoZSBjb2Rlc2V0Ci0tICAgbmFtZXMuICBOb3JtYWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byB1c2UgYW55IG9mIHRoZSBjb21tb24KLS0gICBuYW1lcy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBoYXMgdG8gYmUKLS0gICBmcmVlZCBieSB0aGUgY2FsbGVyLiAgKi8KLS1leHRlcm4gY29uc3QgY2hhciAqX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb25zdCBjaGFyICpjb2Rlc2V0LAotLQkJCQkJICBzaXplX3QgbmFtZV9sZW4pOwotLQotLS8qIExvb2t1cCBhIGxvY2FsZSBkZXBlbmRlbnQgZmlsZS4KLS0gICAqTDEwTkZJTEVfTElTVCBkZW5vdGVzIGEgcG9vbCBvZiBsb29rdXAgcmVzdWx0cyBvZiBsb2NhbGUgZGVwZW5kZW50Ci0tICAgZmlsZXMgb2YgdGhlIHNhbWUga2luZCwgc29ydGVkIGluIGRlY3JlYXNpbmcgb3JkZXIgb2YgLT5maWxlbmFtZS4KLS0gICBESVJMSVNUIGFuZCBESVJMSVNUX0xFTiBhcmUgYW4gYXJneiBsaXN0IG9mIGRpcmVjdG9yaWVzIGluIHdoaWNoIHRvCi0tICAgbG9vaywgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgZGlyZWN0b3J5IChpLmUuIERJUkxJU1RfTEVOID4gMCkuCi0tICAgTUFTSywgTEFOR1VBR0UsIFRFUlJJVE9SWSwgQ09ERVNFVCwgTk9STUFMSVpFRF9DT0RFU0VULCBNT0RJRklFUgotLSAgIGFyZSB0aGUgcGllY2VzIG9mIHRoZSBsb2NhbGUgbmFtZSwgYXMgcHJvZHVjZWQgYnkgX25sX2V4cGxvZGVfbmFtZSgpLgotLSAgIEZJTEVOQU1FIGlzIHRoZSBmaWxlbmFtZSBzdWZmaXguCi0tICAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbG9va3VwIHJlc3VsdCwgZWl0aGVyIGZvdW5kIGluICpMMTBORklMRV9MSVNULAotLSAgIG9yIC0gaWYgRE9fQUxMT0NBVEUgaXMgbm9uemVybyAtIGZyZXNobHkgYWxsb2NhdGVkLCBvciBwb3NzaWJseSBOVUxMLgotLSAgIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm9uLU5VTEwsIGl0IGlzIGFkZGVkIHRvICpMMTBORklMRV9MSVNULCBhbmQKLS0gICBpdHMgLT5uZXh0IGZpZWxkIGRlbm90ZXMgdGhlIGNoYWluaW5nIGluc2lkZSAqTDEwTkZJTEVfTElTVCwgYW5kCi0tICAgZnVydGhlcm1vcmUgaXRzIC0+c3VjY2Vzc29yW10gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIG90aGVyIGxvb2t1cAotLSAgIHJlc3VsdHMgZnJvbSB3aGljaCB0aGlzIGxvb2t1cCByZXN1bHQgaW5oZXJpdHMuICAqLwotLWV4dGVybiBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLS1fbmxfbWFrZV9sMTBuZmxpc3QgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0LAotLQkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwgaW50IG1hc2ssCi0tCQkgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKnRlcnJpdG9yeSwKLS0JCSAgICBjb25zdCBjaGFyICpjb2Rlc2V0LCBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQsCi0tCQkgICAgY29uc3QgY2hhciAqbW9kaWZpZXIsCi0tCQkgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBkb19hbGxvY2F0ZSk7Ci0tCi0tLyogTG9va3VwIHRoZSByZWFsIGxvY2FsZSBuYW1lIGZvciBhIGxvY2FsZSBhbGlhcyBOQU1FLCBvciBOVUxMIGlmCi0tICAgTkFNRSBpcyBub3QgYSBsb2NhbGUgYWxpYXMgKGJ1dCBwb3NzaWJseSBhIHJlYWwgbG9jYWxlIG5hbWUpLgotLSAgIFRoZSByZXR1cm4gdmFsdWUgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgYW5kIG11c3Qgbm90IGJlIGZyZWVkLiAgKi8KLS0vKiBQYXJ0IG9mIHRoZSBsaWJpbnRsIEFCSSBvbmx5IGZvciB0aGUgc2FrZSBvZiB0aGUgZ2V0dGV4dC5tNCBtYWNyby4gICovCi0tZXh0ZXJuIExJQklOVExfRExMX0VYUE9SVEVEIGNvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgKGNvbnN0IGNoYXIgKm5hbWUpOwotLQotLS8qIFNwbGl0IGEgbG9jYWxlIG5hbWUgTkFNRSBpbnRvIGl0cyBwaWVjZXM6IGxhbmd1YWdlLCBtb2RpZmllciwKLS0gICB0ZXJyaXRvcnksIGNvZGVzZXQuCi0tICAgTkFNRSBnZXRzIGRlc3RydWN0aXZlbHkgbW9kaWZpZWQ6IE5VTCBieXRlcyBhcmUgaW5zZXJ0ZWQgaGVyZSBhbmQKLS0gICB0aGVyZS4gICpMQU5HVUFHRSBnZXRzIGFzc2lnbmVkIE5BTUUuICBFYWNoIG9mICpNT0RJRklFUiwgKlRFUlJJVE9SWSwKLS0gICAqQ09ERVNFVCBnZXRzIGFzc2lnbmVkIGVpdGhlciBhIHBvaW50ZXIgaW50byB0aGUgb2xkIE5BTUUgc3RyaW5nLCBvcgotLSAgIE5VTEwuICAqTk9STUFMSVpFRF9DT0RFU0VUIGdldHMgYXNzaWduZWQgdGhlIGV4cGFuZGVkICpDT0RFU0VULCBpZiBpdAotLSAgIGlzIGRpZmZlcmVudCBmcm9tICpDT0RFU0VUOyB0aGlzIG9uZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIGhhcwotLSAgIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0tICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGJpdG1hc2ssIHdoZXJlIGVhY2ggYml0IGNvcnJlc3BvbmRzIHRvIG9uZQotLSAgIGZpbGxlZC1pbiB2YWx1ZToKLS0gICAgIFhQR19NT0RJRklFUiAgICAgICAgICAgICAgICBmb3IgKk1PRElGSUVSLAotLSAgICAgWFBHX1RFUlJJVE9SWSAgICAgICAgICAgICAgIGZvciAqVEVSUklUT1JZLAotLSAgICAgWFBHX0NPREVTRVQgICAgICAgICAgICAgICAgIGZvciAqQ09ERVNFVCwKLS0gICAgIFhQR19OT1JNX0NPREVTRVQgICAgICAgICAgICBmb3IgKk5PUk1BTElaRURfQ09ERVNFVC4KLS0gKi8KLS1leHRlcm4gaW50IF9ubF9leHBsb2RlX25hbWUgKGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwKLS0JCQkgICAgIGNvbnN0IGNoYXIgKiptb2RpZmllciwgY29uc3QgY2hhciAqKnRlcnJpdG9yeSwKLS0JCQkgICAgIGNvbnN0IGNoYXIgKipjb2Rlc2V0LAotLQkJCSAgICAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldCk7Ci0tCi0tI2VuZGlmCS8qIGxvYWRpbmZvLmggKi8KLS0tLSBhL2ludGwvbG9hZG1zZ2NhdC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxMzM2ICswLDAgQEAKLS0vKiBMb2FkIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzLgotLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBUZWxsIGdsaWJjJ3MgPHN0cmluZy5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBtZW1wY3B5KCkuCi0tICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCi0tICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLwotLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLS0jIGRlZmluZSBfR05VX1NPVVJDRSAgICAxCi0tI2VuZGlmCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxjdHlwZS5oPgotLSNpbmNsdWRlIDxlcnJuby5oPgotLSNpbmNsdWRlIDxmY250bC5oPgotLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLS0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLS0KLS0jaWZkZWYgX19HTlVDX18KLS0jIHVuZGVmICBhbGxvY2EKLS0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotLSMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKLS0jZWxzZQotLSMgaWZkZWYgX01TQ19WRVIKLS0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLS0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLS0jIGVsc2UKLS0jICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLS0jICBlbHNlCi0tIyAgIGlmZGVmIF9BSVgKLS0gI3ByYWdtYSBhbGxvY2EKLS0jICAgZWxzZQotLSMgICAgaWZuZGVmIGFsbG9jYQotLWNoYXIgKmFsbG9jYSAoKTsKLS0jICAgIGVuZGlmCi0tIyAgIGVuZGlmCi0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0KLS0jaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKLS0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotLSNlbmRpZgotLQotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8bGFuZ2luZm8uaD4KLS0jIGluY2x1ZGUgPGxvY2FsZS5oPgotLSNlbmRpZgotLQotLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0tICAgIHx8IChkZWZpbmVkIF9MSUJDICYmIGRlZmluZWQgX1BPU0lYX01BUFBFRF9GSUxFUykKLS0jIGluY2x1ZGUgPHN5cy9tbWFuLmg+Ci0tIyB1bmRlZiBIQVZFX01NQVAKLS0jIGRlZmluZSBIQVZFX01NQVAJMQotLSNlbHNlCi0tIyB1bmRlZiBIQVZFX01NQVAKLS0jZW5kaWYKLS0KLS0jaWYgZGVmaW5lZCBIQVZFX1NURElOVF9IX1dJVEhfVUlOVE1BWCB8fCBkZWZpbmVkIF9MSUJDCi0tIyBpbmNsdWRlIDxzdGRpbnQuaD4KLS0jZW5kaWYKLS0jaWYgZGVmaW5lZCBIQVZFX0lOVFRZUEVTX0ggfHwgZGVmaW5lZCBfTElCQwotLSMgaW5jbHVkZSA8aW50dHlwZXMuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSAiZ21vLmgiCi0tI2luY2x1ZGUgImdldHRleHRQLmgiCi0tI2luY2x1ZGUgImhhc2gtc3RyaW5nLmgiCi0tI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKLS0KLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgIi4uL2xvY2FsZS9sb2NhbGVpbmZvLmgiCi0tIyBpbmNsdWRlIDxub3QtY2FuY2VsLmg+Ci0tI2VuZGlmCi0tCi0tLyogSGFuZGxlIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgotLSNlbHNlCi0tIyBpbmNsdWRlICJsb2NrLmgiCi0tI2VuZGlmCi0tCi0tLyogUHJvdmlkZSBmYWxsYmFjayB2YWx1ZXMgZm9yIG1hY3JvcyB0aGF0IG91Z2h0IHRvIGJlIGRlZmluZWQgaW4gPGludHR5cGVzLmg+LgotLSAgIE5vdGUgdGhhdCBvdXIgZmFsbGJhY2sgdmFsdWVzIG5lZWQgbm90IGJlIGxpdGVyYWwgc3RyaW5ncywgYmVjYXVzZSB3ZSBkb24ndAotLSAgIHVzZSB0aGVtIHdpdGggcHJlcHJvY2Vzc29yIHN0cmluZyBjb25jYXRlbmF0aW9uLiAgKi8KLS0jaWYgIWRlZmluZWQgUFJJZDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWQ4Ci0tIyBkZWZpbmUgUFJJZDggImQiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWk4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklpOAotLSMgZGVmaW5lIFBSSWk4ICJpIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvOCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJbzgKLS0jIGRlZmluZSBQUklvOCAibyIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdTggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXU4Ci0tIyBkZWZpbmUgUFJJdTggInUiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXg4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl4OAotLSMgZGVmaW5lIFBSSXg4ICJ4IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYOCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJWDgKLS0jIGRlZmluZSBQUklYOCAiWCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklkMTYKLS0jIGRlZmluZSBQUklkMTYgImQiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWkxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJaTE2Ci0tIyBkZWZpbmUgUFJJaTE2ICJpIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSW8xNgotLSMgZGVmaW5lIFBSSW8xNiAibyIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdTE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl1MTYKLS0jIGRlZmluZSBQUkl1MTYgInUiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXgxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJeDE2Ci0tIyBkZWZpbmUgUFJJeDE2ICJ4IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSVgxNgotLSMgZGVmaW5lIFBSSVgxNiAiWCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklkMzIKLS0jIGRlZmluZSBQUklkMzIgImQiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWkzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJaTMyCi0tIyBkZWZpbmUgUFJJaTMyICJpIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSW8zMgotLSMgZGVmaW5lIFBSSW8zMiAibyIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdTMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl1MzIKLS0jIGRlZmluZSBQUkl1MzIgInUiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXgzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJeDMyCi0tIyBkZWZpbmUgUFJJeDMyICJ4IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSVgzMgotLSMgZGVmaW5lIFBSSVgzMiAiWCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklkNjQKLS0jIGRlZmluZSBQUklkNjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsZCIgOiAibGxkIikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJaTY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklpNjQKLS0jIGRlZmluZSBQUklpNjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsaSIgOiAibGxpIikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJbzY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklvNjQKLS0jIGRlZmluZSBQUklvNjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsbyIgOiAibGxvIikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdTY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl1NjQKLS0jIGRlZmluZSBQUkl1NjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsdSIgOiAibGx1IikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJeDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl4NjQKLS0jIGRlZmluZSBQUkl4NjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJseCIgOiAibGx4IikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklYNjQKLS0jIGRlZmluZSBQUklYNjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsWCIgOiAibGxYIikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJZExFQVNUOAotLSMgZGVmaW5lIFBSSWRMRUFTVDggImQiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWlMRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWlMRUFTVDgKLS0jIGRlZmluZSBQUklpTEVBU1Q4ICJpIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklvTEVBU1Q4Ci0tIyBkZWZpbmUgUFJJb0xFQVNUOCAibyIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdUxFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJdUxFQVNUOAotLSMgZGVmaW5lIFBSSXVMRUFTVDggInUiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXhMRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXhMRUFTVDgKLS0jIGRlZmluZSBQUkl4TEVBU1Q4ICJ4IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklYTEVBU1Q4Ci0tIyBkZWZpbmUgUFJJWExFQVNUOCAiWCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWRMRUFTVDE2Ci0tIyBkZWZpbmUgUFJJZExFQVNUMTYgImQiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWlMRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklpTEVBU1QxNgotLSMgZGVmaW5lIFBSSWlMRUFTVDE2ICJpIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJb0xFQVNUMTYKLS0jIGRlZmluZSBQUklvTEVBU1QxNiAibyIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdUxFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXVMRUFTVDE2Ci0tIyBkZWZpbmUgUFJJdUxFQVNUMTYgInUiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXhMRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl4TEVBU1QxNgotLSMgZGVmaW5lIFBSSXhMRUFTVDE2ICJ4IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJWExFQVNUMTYKLS0jIGRlZmluZSBQUklYTEVBU1QxNiAiWCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWRMRUFTVDMyCi0tIyBkZWZpbmUgUFJJZExFQVNUMzIgImQiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWlMRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklpTEVBU1QzMgotLSMgZGVmaW5lIFBSSWlMRUFTVDMyICJpIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJb0xFQVNUMzIKLS0jIGRlZmluZSBQUklvTEVBU1QzMiAibyIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdUxFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXVMRUFTVDMyCi0tIyBkZWZpbmUgUFJJdUxFQVNUMzIgInUiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXhMRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl4TEVBU1QzMgotLSMgZGVmaW5lIFBSSXhMRUFTVDMyICJ4IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJWExFQVNUMzIKLS0jIGRlZmluZSBQUklYTEVBU1QzMiAiWCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWRMRUFTVDY0Ci0tIyBkZWZpbmUgUFJJZExFQVNUNjQgUFJJZDY0Ci0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWlMRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklpTEVBU1Q2NAotLSMgZGVmaW5lIFBSSWlMRUFTVDY0IFBSSWk2NAotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJb0xFQVNUNjQKLS0jIGRlZmluZSBQUklvTEVBU1Q2NCBQUklvNjQKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdUxFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXVMRUFTVDY0Ci0tIyBkZWZpbmUgUFJJdUxFQVNUNjQgUFJJdTY0Ci0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXhMRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl4TEVBU1Q2NAotLSMgZGVmaW5lIFBSSXhMRUFTVDY0IFBSSXg2NAotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJWExFQVNUNjQKLS0jIGRlZmluZSBQUklYTEVBU1Q2NCBQUklYNjQKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklkRkFTVDgKLS0jIGRlZmluZSBQUklkRkFTVDggImQiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWlGQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJaUZBU1Q4Ci0tIyBkZWZpbmUgUFJJaUZBU1Q4ICJpIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSW9GQVNUOAotLSMgZGVmaW5lIFBSSW9GQVNUOCAibyIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdUZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl1RkFTVDgKLS0jIGRlZmluZSBQUkl1RkFTVDggInUiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXhGQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJeEZBU1Q4Ci0tIyBkZWZpbmUgUFJJeEZBU1Q4ICJ4IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSVhGQVNUOAotLSMgZGVmaW5lIFBSSVhGQVNUOCAiWCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJZEZBU1QxNgotLSMgZGVmaW5lIFBSSWRGQVNUMTYgImQiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWlGQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWlGQVNUMTYKLS0jIGRlZmluZSBQUklpRkFTVDE2ICJpIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklvRkFTVDE2Ci0tIyBkZWZpbmUgUFJJb0ZBU1QxNiAibyIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdUZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJdUZBU1QxNgotLSMgZGVmaW5lIFBSSXVGQVNUMTYgInUiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXhGQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXhGQVNUMTYKLS0jIGRlZmluZSBQUkl4RkFTVDE2ICJ4IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklYRkFTVDE2Ci0tIyBkZWZpbmUgUFJJWEZBU1QxNiAiWCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJZEZBU1QzMgotLSMgZGVmaW5lIFBSSWRGQVNUMzIgImQiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWlGQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWlGQVNUMzIKLS0jIGRlZmluZSBQUklpRkFTVDMyICJpIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklvRkFTVDMyCi0tIyBkZWZpbmUgUFJJb0ZBU1QzMiAibyIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdUZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJdUZBU1QzMgotLSMgZGVmaW5lIFBSSXVGQVNUMzIgInUiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXhGQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXhGQVNUMzIKLS0jIGRlZmluZSBQUkl4RkFTVDMyICJ4IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklYRkFTVDMyCi0tIyBkZWZpbmUgUFJJWEZBU1QzMiAiWCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJZEZBU1Q2NAotLSMgZGVmaW5lIFBSSWRGQVNUNjQgUFJJZDY0Ci0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWlGQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWlGQVNUNjQKLS0jIGRlZmluZSBQUklpRkFTVDY0IFBSSWk2NAotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklvRkFTVDY0Ci0tIyBkZWZpbmUgUFJJb0ZBU1Q2NCBQUklvNjQKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdUZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJdUZBU1Q2NAotLSMgZGVmaW5lIFBSSXVGQVNUNjQgUFJJdTY0Ci0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXhGQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXhGQVNUNjQKLS0jIGRlZmluZSBQUkl4RkFTVDY0IFBSSXg2NAotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklYRkFTVDY0Ci0tIyBkZWZpbmUgUFJJWEZBU1Q2NCBQUklYNjQKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZE1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJZE1BWAotLSMgZGVmaW5lIFBSSWRNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxkIiA6ICJsbGQiKQotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklpTUFYCi0tIyBkZWZpbmUgUFJJaU1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibGkiIDogImxsaSIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSW9NQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSW9NQVgKLS0jIGRlZmluZSBQUklvTUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsbyIgOiAibGxvIikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdU1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJdU1BWAotLSMgZGVmaW5lIFBSSXVNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImx1IiA6ICJsbHUiKQotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4TUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl4TUFYCi0tIyBkZWZpbmUgUFJJeE1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibHgiIDogImxseCIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSVhNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSVhNQVgKLS0jIGRlZmluZSBQUklYTUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsWCIgOiAibGxYIikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJZFBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJZFBUUgotLSMgZGVmaW5lIFBSSWRQVFIgXAotLSAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImxkIiA6IFwKLS0gICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gImQiIDogXAotLSAgICJsbGQiKQotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklpUFRSCi0tIyBkZWZpbmUgUFJJaVBUUiBcCi0tICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibGkiIDogXAotLSAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAiaSIgOiBcCi0tICAgImxsaSIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSW9QVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSW9QVFIKLS0jIGRlZmluZSBQUklvUFRSIFwKLS0gIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsbyIgOiBcCi0tICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJvIiA6IFwKLS0gICAibGxvIikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJdVBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJdVBUUgotLSMgZGVmaW5lIFBSSXVQVFIgXAotLSAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImx1IiA6IFwKLS0gICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gInUiIDogXAotLSAgICJsbHUiKQotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4UFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl4UFRSCi0tIyBkZWZpbmUgUFJJeFBUUiBcCi0tICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibHgiIDogXAotLSAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAieCIgOiBcCi0tICAgImxseCIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSVhQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSVhQVFIKLS0jIGRlZmluZSBQUklYUFRSIFwKLS0gIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsWCIgOiBcCi0tICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJYIiA6IFwKLS0gICAibGxYIikKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tI2lmZGVmIF9MSUJDCi0tLyogUmVuYW1lIHRoZSBub24gSVNPIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLS0gICBiZWNhdXNlIHNvbWUgSVNPIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLS0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0tIyBkZWZpbmUgb3BlbihuYW1lLCBmbGFncykJb3Blbl9ub3RfY2FuY2VsXzIgKG5hbWUsIGZsYWdzKQotLSMgZGVmaW5lIGNsb3NlKGZkKQkJY2xvc2Vfbm90X2NhbmNlbF9ub19zdGF0dXMgKGZkKQotLSMgZGVmaW5lIHJlYWQoZmQsIGJ1ZiwgbikJcmVhZF9ub3RfY2FuY2VsIChmZCwgYnVmLCBuKQotLSMgZGVmaW5lIG1tYXAoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCkgXAotLSAgX19tbWFwIChhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0KQotLSMgZGVmaW5lIG11bm1hcChhZGRyLCBsZW4pCV9fbXVubWFwIChhZGRyLCBsZW4pCi0tI2VuZGlmCi0tCi0tLyogRm9yIHRob3NlIGxvc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKLS0gICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLwotLSNpZmRlZiBIQVZFX0FMTE9DQQotLSMgZGVmaW5lIGZyZWVhKHApIC8qIG5vdGhpbmcgKi8KLS0jZWxzZQotLSMgZGVmaW5lIGFsbG9jYShuKSBtYWxsb2MgKG4pCi0tIyBkZWZpbmUgZnJlZWEocCkgZnJlZSAocCkKLS0jZW5kaWYKLS0KLS0vKiBGb3Igc3lzdGVtcyB0aGF0IGRpc3Rpbmd1aXNoIGJldHdlZW4gdGV4dCBhbmQgYmluYXJ5IEkvTy4KLS0gICBPX0JJTkFSWSBpcyB1c3VhbGx5IGRlY2xhcmVkIGluIDxmY250bC5oPi4gKi8KLS0jaWYgIWRlZmluZWQgT19CSU5BUlkgJiYgZGVmaW5lZCBfT19CSU5BUlkKLS0gIC8qIEZvciBNU0MtY29tcGF0aWJsZSBjb21waWxlcnMuICAqLwotLSMgZGVmaW5lIE9fQklOQVJZIF9PX0JJTkFSWQotLSMgZGVmaW5lIE9fVEVYVCBfT19URVhUCi0tI2VuZGlmCi0tI2lmZGVmIF9fQkVPU19fCi0tICAvKiBCZU9TIDUgaGFzIE9fQklOQVJZIGFuZCBPX1RFWFQsIGJ1dCB0aGV5IGhhdmUgbm8gZWZmZWN0LiAgKi8KLS0jIHVuZGVmIE9fQklOQVJZCi0tIyB1bmRlZiBPX1RFWFQKLS0jZW5kaWYKLS0vKiBPbiByZWFzb25hYmxlIHN5c3RlbXMsIGJpbmFyeSBJL08gaXMgdGhlIGRlZmF1bHQuICAqLwotLSNpZm5kZWYgT19CSU5BUlkKLS0jIGRlZmluZSBPX0JJTkFSWSAwCi0tI2VuZGlmCi0tCi0tCi0tLyogV2UgbmVlZCBhIHNpZ24sIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZAotLSAgIHdpdGggYWxsIHRyYW5zbGF0aW9ucy4gIFRoaXMgaXMgaW1wb3J0YW50IGlmIHRoZSB0cmFuc2xhdGlvbnMgYXJlCi0tICAgY2FjaGVkIGJ5IG9uZSBvZiBHQ0MncyBmZWF0dXJlcy4gICovCi0taW50IF9ubF9tc2dfY2F0X2NudHI7Ci0tCi0tCi0tLyogRXhwYW5kIGEgc3lzdGVtIGRlcGVuZGVudCBzdHJpbmcgc2VnbWVudC4gIFJldHVybiBOVUxMIGlmIHVuc3VwcG9ydGVkLiAgKi8KLS1zdGF0aWMgY29uc3QgY2hhciAqCi0tZ2V0X3N5c2RlcF9zZWdtZW50X3ZhbHVlIChjb25zdCBjaGFyICpuYW1lKQotLXsKLS0gIC8qIFRlc3QgZm9yIGFuIElTTyBDIDk5IHNlY3Rpb24gNy44LjEgZm9ybWF0IHN0cmluZyBkaXJlY3RpdmUuCi0tICAgICBTeW50YXg6Ci0tICAgICBQIFIgSSB7IGQgfCBpIHwgbyB8IHUgfCB4IHwgWCB9Ci0tICAgICB7IHsgfCBMRUFTVCB8IEZBU1QgfSB7IDggfCAxNiB8IDMyIHwgNjQgfSB8IE1BWCB8IFBUUiB9ICAqLwotLSAgLyogV2UgZG9uJ3QgdXNlIGEgdGFibGUgb2YgMTQgdGltZXMgNiAnY29uc3QgY2hhciAqJyBzdHJpbmdzIGhlcmUsIGJlY2F1c2UKLS0gICAgIGRhdGEgcmVsb2NhdGlvbnMgY29zdCBzdGFydHVwIHRpbWUuICAqLwotLSAgaWYgKG5hbWVbMF0gPT0gJ1AnICYmIG5hbWVbMV0gPT0gJ1InICYmIG5hbWVbMl0gPT0gJ0knKQotLSAgICB7Ci0tICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnIHx8IG5hbWVbM10gPT0gJ2knIHx8IG5hbWVbM10gPT0gJ28nIHx8IG5hbWVbM10gPT0gJ3UnCi0tCSAgfHwgbmFtZVszXSA9PSAneCcgfHwgbmFtZVszXSA9PSAnWCcpCi0tCXsKLS0JICBpZiAobmFtZVs0XSA9PSAnOCcgJiYgbmFtZVs1XSA9PSAnXDAnKQotLQkgICAgewotLQkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQlyZXR1cm4gUFJJZDg7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKLS0JCXJldHVybiBQUklpODsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJcmV0dXJuIFBSSW84OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAndScpCi0tCQlyZXR1cm4gUFJJdTg7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKLS0JCXJldHVybiBQUkl4ODsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJcmV0dXJuIFBSSVg4OwotLQkgICAgICBhYm9ydCAoKTsKLS0JICAgIH0KLS0JICBpZiAobmFtZVs0XSA9PSAnMScgJiYgbmFtZVs1XSA9PSAnNicgJiYgbmFtZVs2XSA9PSAnXDAnKQotLQkgICAgewotLQkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQlyZXR1cm4gUFJJZDE2OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQlyZXR1cm4gUFJJaTE2OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCi0tCQlyZXR1cm4gUFJJbzE2OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAndScpCi0tCQlyZXR1cm4gUFJJdTE2OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQlyZXR1cm4gUFJJeDE2OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCi0tCQlyZXR1cm4gUFJJWDE2OwotLQkgICAgICBhYm9ydCAoKTsKLS0JICAgIH0KLS0JICBpZiAobmFtZVs0XSA9PSAnMycgJiYgbmFtZVs1XSA9PSAnMicgJiYgbmFtZVs2XSA9PSAnXDAnKQotLQkgICAgewotLQkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQlyZXR1cm4gUFJJZDMyOwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQlyZXR1cm4gUFJJaTMyOwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCi0tCQlyZXR1cm4gUFJJbzMyOwotLQkgICAgICBpZiAobmFtZVszXSA9PSAndScpCi0tCQlyZXR1cm4gUFJJdTMyOwotLQkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQlyZXR1cm4gUFJJeDMyOwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCi0tCQlyZXR1cm4gUFJJWDMyOwotLQkgICAgICBhYm9ydCAoKTsKLS0JICAgIH0KLS0JICBpZiAobmFtZVs0XSA9PSAnNicgJiYgbmFtZVs1XSA9PSAnNCcgJiYgbmFtZVs2XSA9PSAnXDAnKQotLQkgICAgewotLQkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQlyZXR1cm4gUFJJZDY0OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQlyZXR1cm4gUFJJaTY0OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCi0tCQlyZXR1cm4gUFJJbzY0OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAndScpCi0tCQlyZXR1cm4gUFJJdTY0OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQlyZXR1cm4gUFJJeDY0OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCi0tCQlyZXR1cm4gUFJJWDY0OwotLQkgICAgICBhYm9ydCAoKTsKLS0JICAgIH0KLS0JICBpZiAobmFtZVs0XSA9PSAnTCcgJiYgbmFtZVs1XSA9PSAnRScgJiYgbmFtZVs2XSA9PSAnQScKLS0JICAgICAgJiYgbmFtZVs3XSA9PSAnUycgJiYgbmFtZVs4XSA9PSAnVCcpCi0tCSAgICB7Ci0tCSAgICAgIGlmIChuYW1lWzldID09ICc4JyAmJiBuYW1lWzEwXSA9PSAnXDAnKQotLQkJewotLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQkgICAgcmV0dXJuIFBSSWRMRUFTVDg7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdpJykKLS0JCSAgICByZXR1cm4gUFJJaUxFQVNUODsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJICAgIHJldHVybiBQUklvTEVBU1Q4OwotLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0tCQkgICAgcmV0dXJuIFBSSXVMRUFTVDg7Ci0tCQkgIGlmIChuYW1lWzNdID09ICd4JykKLS0JCSAgICByZXR1cm4gUFJJeExFQVNUODsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJICAgIHJldHVybiBQUklYTEVBU1Q4OwotLQkJICBhYm9ydCAoKTsKLS0JCX0KLS0JICAgICAgaWYgKG5hbWVbOV0gPT0gJzEnICYmIG5hbWVbMTBdID09ICc2JyAmJiBuYW1lWzExXSA9PSAnXDAnKQotLQkJewotLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQkgICAgcmV0dXJuIFBSSWRMRUFTVDE2OwotLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQkgICAgcmV0dXJuIFBSSWlMRUFTVDE2OwotLQkJICBpZiAobmFtZVszXSA9PSAnbycpCi0tCQkgICAgcmV0dXJuIFBSSW9MRUFTVDE2OwotLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0tCQkgICAgcmV0dXJuIFBSSXVMRUFTVDE2OwotLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQkgICAgcmV0dXJuIFBSSXhMRUFTVDE2OwotLQkJICBpZiAobmFtZVszXSA9PSAnWCcpCi0tCQkgICAgcmV0dXJuIFBSSVhMRUFTVDE2OwotLQkJICBhYm9ydCAoKTsKLS0JCX0KLS0JICAgICAgaWYgKG5hbWVbOV0gPT0gJzMnICYmIG5hbWVbMTBdID09ICcyJyAmJiBuYW1lWzExXSA9PSAnXDAnKQotLQkJewotLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQkgICAgcmV0dXJuIFBSSWRMRUFTVDMyOwotLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQkgICAgcmV0dXJuIFBSSWlMRUFTVDMyOwotLQkJICBpZiAobmFtZVszXSA9PSAnbycpCi0tCQkgICAgcmV0dXJuIFBSSW9MRUFTVDMyOwotLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0tCQkgICAgcmV0dXJuIFBSSXVMRUFTVDMyOwotLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQkgICAgcmV0dXJuIFBSSXhMRUFTVDMyOwotLQkJICBpZiAobmFtZVszXSA9PSAnWCcpCi0tCQkgICAgcmV0dXJuIFBSSVhMRUFTVDMyOwotLQkJICBhYm9ydCAoKTsKLS0JCX0KLS0JICAgICAgaWYgKG5hbWVbOV0gPT0gJzYnICYmIG5hbWVbMTBdID09ICc0JyAmJiBuYW1lWzExXSA9PSAnXDAnKQotLQkJewotLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQkgICAgcmV0dXJuIFBSSWRMRUFTVDY0OwotLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQkgICAgcmV0dXJuIFBSSWlMRUFTVDY0OwotLQkJICBpZiAobmFtZVszXSA9PSAnbycpCi0tCQkgICAgcmV0dXJuIFBSSW9MRUFTVDY0OwotLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0tCQkgICAgcmV0dXJuIFBSSXVMRUFTVDY0OwotLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQkgICAgcmV0dXJuIFBSSXhMRUFTVDY0OwotLQkJICBpZiAobmFtZVszXSA9PSAnWCcpCi0tCQkgICAgcmV0dXJuIFBSSVhMRUFTVDY0OwotLQkJICBhYm9ydCAoKTsKLS0JCX0KLS0JICAgIH0KLS0JICBpZiAobmFtZVs0XSA9PSAnRicgJiYgbmFtZVs1XSA9PSAnQScgJiYgbmFtZVs2XSA9PSAnUycKLS0JICAgICAgJiYgbmFtZVs3XSA9PSAnVCcpCi0tCSAgICB7Ci0tCSAgICAgIGlmIChuYW1lWzhdID09ICc4JyAmJiBuYW1lWzldID09ICdcMCcpCi0tCQl7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdkJykKLS0JCSAgICByZXR1cm4gUFJJZEZBU1Q4OwotLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQkgICAgcmV0dXJuIFBSSWlGQVNUODsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJICAgIHJldHVybiBQUklvRkFTVDg7Ci0tCQkgIGlmIChuYW1lWzNdID09ICd1JykKLS0JCSAgICByZXR1cm4gUFJJdUZBU1Q4OwotLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQkgICAgcmV0dXJuIFBSSXhGQVNUODsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJICAgIHJldHVybiBQUklYRkFTVDg7Ci0tCQkgIGFib3J0ICgpOwotLQkJfQotLQkgICAgICBpZiAobmFtZVs4XSA9PSAnMScgJiYgbmFtZVs5XSA9PSAnNicgJiYgbmFtZVsxMF0gPT0gJ1wwJykKLS0JCXsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQotLQkJICAgIHJldHVybiBQUklkRkFTVDE2OwotLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQkgICAgcmV0dXJuIFBSSWlGQVNUMTY7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdvJykKLS0JCSAgICByZXR1cm4gUFJJb0ZBU1QxNjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQotLQkJICAgIHJldHVybiBQUkl1RkFTVDE2OwotLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQkgICAgcmV0dXJuIFBSSXhGQVNUMTY7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdYJykKLS0JCSAgICByZXR1cm4gUFJJWEZBU1QxNjsKLS0JCSAgYWJvcnQgKCk7Ci0tCQl9Ci0tCSAgICAgIGlmIChuYW1lWzhdID09ICczJyAmJiBuYW1lWzldID09ICcyJyAmJiBuYW1lWzEwXSA9PSAnXDAnKQotLQkJewotLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQkgICAgcmV0dXJuIFBSSWRGQVNUMzI7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdpJykKLS0JCSAgICByZXR1cm4gUFJJaUZBU1QzMjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJICAgIHJldHVybiBQUklvRkFTVDMyOwotLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0tCQkgICAgcmV0dXJuIFBSSXVGQVNUMzI7Ci0tCQkgIGlmIChuYW1lWzNdID09ICd4JykKLS0JCSAgICByZXR1cm4gUFJJeEZBU1QzMjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJICAgIHJldHVybiBQUklYRkFTVDMyOwotLQkJICBhYm9ydCAoKTsKLS0JCX0KLS0JICAgICAgaWYgKG5hbWVbOF0gPT0gJzYnICYmIG5hbWVbOV0gPT0gJzQnICYmIG5hbWVbMTBdID09ICdcMCcpCi0tCQl7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdkJykKLS0JCSAgICByZXR1cm4gUFJJZEZBU1Q2NDsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2knKQotLQkJICAgIHJldHVybiBQUklpRkFTVDY0OwotLQkJICBpZiAobmFtZVszXSA9PSAnbycpCi0tCQkgICAgcmV0dXJuIFBSSW9GQVNUNjQ7Ci0tCQkgIGlmIChuYW1lWzNdID09ICd1JykKLS0JCSAgICByZXR1cm4gUFJJdUZBU1Q2NDsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQotLQkJICAgIHJldHVybiBQUkl4RkFTVDY0OwotLQkJICBpZiAobmFtZVszXSA9PSAnWCcpCi0tCQkgICAgcmV0dXJuIFBSSVhGQVNUNjQ7Ci0tCQkgIGFib3J0ICgpOwotLQkJfQotLQkgICAgfQotLQkgIGlmIChuYW1lWzRdID09ICdNJyAmJiBuYW1lWzVdID09ICdBJyAmJiBuYW1lWzZdID09ICdYJwotLQkgICAgICAmJiBuYW1lWzddID09ICdcMCcpCi0tCSAgICB7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKLS0JCXJldHVybiBQUklkTUFYOwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQlyZXR1cm4gUFJJaU1BWDsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJcmV0dXJuIFBSSW9NQVg7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKLS0JCXJldHVybiBQUkl1TUFYOwotLQkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQlyZXR1cm4gUFJJeE1BWDsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJcmV0dXJuIFBSSVhNQVg7Ci0tCSAgICAgIGFib3J0ICgpOwotLQkgICAgfQotLQkgIGlmIChuYW1lWzRdID09ICdQJyAmJiBuYW1lWzVdID09ICdUJyAmJiBuYW1lWzZdID09ICdSJwotLQkgICAgICAmJiBuYW1lWzddID09ICdcMCcpCi0tCSAgICB7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKLS0JCXJldHVybiBQUklkUFRSOwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQlyZXR1cm4gUFJJaVBUUjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJcmV0dXJuIFBSSW9QVFI7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKLS0JCXJldHVybiBQUkl1UFRSOwotLQkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQlyZXR1cm4gUFJJeFBUUjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJcmV0dXJuIFBSSVhQVFI7Ci0tCSAgICAgIGFib3J0ICgpOwotLQkgICAgfQotLQl9Ci0tICAgIH0KLS0gIC8qIFRlc3QgZm9yIGEgZ2xpYmMgc3BlY2lmaWMgcHJpbnRmKCkgZm9ybWF0IGRpcmVjdGl2ZSBmbGFnLiAgKi8KLS0gIGlmIChuYW1lWzBdID09ICdJJyAmJiBuYW1lWzFdID09ICdcMCcpCi0tICAgIHsKLS0jaWYgZGVmaW5lZCBfTElCQyB8fCBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMikKLS0gICAgICAvKiBUaGUgJ0knIGZsYWcsIGluIG51bWVyaWMgZm9ybWF0IGRpcmVjdGl2ZXMsIHJlcGxhY2VzIEFTQ0lJIGRpZ2l0cwotLQkgd2l0aCB0aGUgJ291dGRpZ2l0cycgZGVmaW5lZCBpbiB0aGUgTENfQ1RZUEUgbG9jYWxlIGZhY2V0LiAgVGhpcyBpcwotLQkgdXNlZCBmb3IgRmFyc2kgKFBlcnNpYW4pIGFuZCBtYXliZSBBcmFiaWMuICAqLwotLSAgICAgIHJldHVybiAiSSI7Ci0tI2Vsc2UKLS0gICAgICByZXR1cm4gIiI7Ci0tI2VuZGlmCi0tICAgIH0KLS0gIC8qIE90aGVyIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBhcmUgbm90IHZhbGlkLiAgKi8KLS0gIHJldHVybiBOVUxMOwotLX0KLS0KLS0vKiBMb2FkIHRoZSBtZXNzYWdlIGNhdGFsb2dzIHNwZWNpZmllZCBieSBGSUxFTkFNRS4gIElmIGl0IGlzIG5vIHZhbGlkCi0tICAgbWVzc2FnZSBjYXRhbG9nIGRvIG5vdGhpbmcuICAqLwotLXZvaWQKLS1pbnRlcm5hbF9mdW5jdGlvbgotLV9ubF9sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGUsCi0tCQkgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCi0tewotLSAgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkX3JlY3Vyc2l2ZSAoc3RhdGljLCBsb2NrKQotLSAgaW50IGZkID0gLTE7Ci0tICBzaXplX3Qgc2l6ZTsKLS0jaWZkZWYgX0xJQkMKLS0gIHN0cnVjdCBzdGF0NjQgc3Q7Ci0tI2Vsc2UKLS0gIHN0cnVjdCBzdGF0IHN0OwotLSNlbmRpZgotLSAgc3RydWN0IG1vX2ZpbGVfaGVhZGVyICpkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMTsKLS0gIGludCB1c2VfbW1hcCA9IDA7Ci0tICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOwotLSAgaW50IHJldmlzaW9uOwotLSAgY29uc3QgY2hhciAqbnVsbGVudHJ5OwotLSAgc2l6ZV90IG51bGxlbnRyeWxlbjsKLS0KLS0gIF9fbGliY19sb2NrX2xvY2tfcmVjdXJzaXZlIChsb2NrKTsKLS0gIGlmIChkb21haW5fZmlsZS0+ZGVjaWRlZCAhPSAwKQotLSAgICB7Ci0tICAgICAgLyogVGhlcmUgYXJlIHR3byBwb3NzaWJpbGl0aWVzOgotLQotLQkgKyB0aGlzIGlzIHRoZSBzYW1lIHRocmVhZCBjYWxsaW5nIGFnYWluIGR1cmluZyB0aGlzIGluaXRpYWxpemF0aW9uCi0tCSAgIHZpYSBfbmxfZmluZF9tc2cuICBXZSBoYXZlIGluaXRpYWxpemVkIGV2ZXJ5dGhpbmcgdGhpcyBjYWxsIG5lZWRzLgotLQotLQkgKyB0aGlzIGlzIGFub3RoZXIgdGhyZWFkIHdoaWNoIHRyaWVkIHRvIGluaXRpYWxpemUgdGhpcyBvYmplY3QuCi0tCSAgIE5vdCBuZWNlc3NhcnkgYW55bW9yZSBzaW5jZSBpZiB0aGUgbG9jayBpcyBhdmFpbGFibGUgdGhpcwotLQkgICBpcyBmaW5pc2hlZC4KLS0gICAgICAqLwotLSAgICAgIGdvdG8gZG9uZTsKLS0gICAgfQotLQotLSAgZG9tYWluX2ZpbGUtPmRlY2lkZWQgPSAtMTsKLS0gIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKLS0KLS0gIC8qIE5vdGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VsZXNzIHRvIHN0b3JlIGRvbWFpbmJpbmRpbmcgaW4gZG9tYWluX2ZpbGUKLS0gICAgIGJlY2F1c2UgZG9tYWluYmluZGluZyBtaWdodCBiZSA9PSBOVUxMIG5vdyBidXQgIT0gTlVMTCBsYXRlciAoYWZ0ZXIKLS0gICAgIGEgY2FsbCB0byBiaW5kX3RleHRkb21haW5fY29kZXNldCkuICAqLwotLQotLSAgLyogSWYgdGhlIHJlY29yZCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBsb2NhbGUgdGhlIEZJTEVOQU1FCi0tICAgICBtaWdodCBiZSBOVUxMLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbgotLSAgICAgc3BlY2lmaWNhdGlvbiB0aGUgbG9jYWxlIGZpbGUgbmFtZSBpcyBkaWZmZXJlbnQgZm9yIFhQRyBhbmQgQ0VOCi0tICAgICBzeW50YXguICAqLwotLSAgaWYgKGRvbWFpbl9maWxlLT5maWxlbmFtZSA9PSBOVUxMKQotLSAgICBnb3RvIG91dDsKLS0KLS0gIC8qIFRyeSB0byBvcGVuIHRoZSBhZGRyZXNzZWQgZmlsZS4gICovCi0tICBmZCA9IG9wZW4gKGRvbWFpbl9maWxlLT5maWxlbmFtZSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7Ci0tICBpZiAoZmQgPT0gLTEpCi0tICAgIGdvdG8gb3V0OwotLQotLSAgLyogV2UgbXVzdCBrbm93IGFib3V0IHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgKi8KLS0gIGlmICgKLS0jaWZkZWYgX0xJQkMKLS0gICAgICBfX2J1aWx0aW5fZXhwZWN0IChmc3RhdDY0IChmZCwgJnN0KSAhPSAwLCAwKQotLSNlbHNlCi0tICAgICAgX19idWlsdGluX2V4cGVjdCAoZnN0YXQgKGZkLCAmc3QpICE9IDAsIDApCi0tI2VuZGlmCi0tICAgICAgfHwgX19idWlsdGluX2V4cGVjdCAoKHNpemUgPSAoc2l6ZV90KSBzdC5zdF9zaXplKSAhPSBzdC5zdF9zaXplLCAwKQotLSAgICAgIHx8IF9fYnVpbHRpbl9leHBlY3QgKHNpemUgPCBzaXplb2YgKHN0cnVjdCBtb19maWxlX2hlYWRlciksIDApKQotLSAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCi0tICAgIGdvdG8gb3V0OwotLQotLSNpZmRlZiBIQVZFX01NQVAKLS0gIC8qIE5vdyB3ZSBhcmUgcmVhZHkgdG8gbG9hZCB0aGUgZmlsZS4gIElmIG1tYXAoKSBpcyBhdmFpbGFibGUgd2UgdHJ5Ci0tICAgICB0aGlzIGZpcnN0LiAgSWYgbm90IGF2YWlsYWJsZSBvciBpdCBmYWlsZWQgd2UgdHJ5IHRvIGxvYWQgaXQuICAqLwotLSAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbW1hcCAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFELAotLQkJCQkJIE1BUF9QUklWQVRFLCBmZCwgMCk7Ci0tCi0tICBpZiAoX19idWlsdGluX2V4cGVjdCAoZGF0YSAhPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xLCAxKSkKLS0gICAgewotLSAgICAgIC8qIG1tYXAoKSBjYWxsIHdhcyBzdWNjZXNzZnVsLiAgKi8KLS0gICAgICBjbG9zZSAoZmQpOwotLSAgICAgIGZkID0gLTE7Ci0tICAgICAgdXNlX21tYXAgPSAxOwotLSAgICB9Ci0tI2VuZGlmCi0tCi0tICAvKiBJZiB0aGUgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSAoaS5lLiBtbWFwJ2VkKSB3ZSB0cnkgdG8gbG9hZAotLSAgICAgaXQgbWFudWFsbHkuICAqLwotLSAgaWYgKGRhdGEgPT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKLS0gICAgewotLSAgICAgIHNpemVfdCB0b19yZWFkOwotLSAgICAgIGNoYXIgKnJlYWRfcHRyOwotLQotLSAgICAgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1hbGxvYyAoc2l6ZSk7Ci0tICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKLS0JZ290byBvdXQ7Ci0tCi0tICAgICAgdG9fcmVhZCA9IHNpemU7Ci0tICAgICAgcmVhZF9wdHIgPSAoY2hhciAqKSBkYXRhOwotLSAgICAgIGRvCi0tCXsKLS0JICBsb25nIGludCBuYiA9IChsb25nIGludCkgcmVhZCAoZmQsIHJlYWRfcHRyLCB0b19yZWFkKTsKLS0JICBpZiAobmIgPD0gMCkKLS0JICAgIHsKLS0jaWZkZWYgRUlOVFIKLS0JICAgICAgaWYgKG5iID09IC0xICYmIGVycm5vID09IEVJTlRSKQotLQkJY29udGludWU7Ci0tI2VuZGlmCi0tCSAgICAgIGdvdG8gb3V0OwotLQkgICAgfQotLQkgIHJlYWRfcHRyICs9IG5iOwotLQkgIHRvX3JlYWQgLT0gbmI7Ci0tCX0KLS0gICAgICB3aGlsZSAodG9fcmVhZCA+IDApOwotLQotLSAgICAgIGNsb3NlIChmZCk7Ci0tICAgICAgZmQgPSAtMTsKLS0gICAgfQotLQotLSAgLyogVXNpbmcgdGhlIG1hZ2ljIG51bWJlciB3ZSBjYW4gdGVzdCB3aGV0aGVyIGl0IHJlYWxseSBpcyBhIG1lc3NhZ2UKLS0gICAgIGNhdGFsb2cgZmlsZS4gICovCi0tICBpZiAoX19idWlsdGluX2V4cGVjdCAoZGF0YS0+bWFnaWMgIT0gX01BR0lDICYmIGRhdGEtPm1hZ2ljICE9IF9NQUdJQ19TV0FQUEVELAotLQkJCTApKQotLSAgICB7Ci0tICAgICAgLyogVGhlIG1hZ2ljIG51bWJlciBpcyB3cm9uZzogbm90IGEgbWVzc2FnZSBjYXRhbG9nIGZpbGUuICAqLwotLSNpZmRlZiBIQVZFX01NQVAKLS0gICAgICBpZiAodXNlX21tYXApCi0tCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHNpemUpOwotLSAgICAgIGVsc2UKLS0jZW5kaWYKLS0JZnJlZSAoZGF0YSk7Ci0tICAgICAgZ290byBvdXQ7Ci0tICAgIH0KLS0KLS0gIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvYWRlZF9kb21haW4pKTsKLS0gIGlmIChkb21haW4gPT0gTlVMTCkKLS0gICAgZ290byBvdXQ7Ci0tICBkb21haW5fZmlsZS0+ZGF0YSA9IGRvbWFpbjsKLS0KLS0gIGRvbWFpbi0+ZGF0YSA9IChjaGFyICopIGRhdGE7Ci0tICBkb21haW4tPnVzZV9tbWFwID0gdXNlX21tYXA7Ci0tICBkb21haW4tPm1tYXBfc2l6ZSA9IHNpemU7Ci0tICBkb21haW4tPm11c3Rfc3dhcCA9IGRhdGEtPm1hZ2ljICE9IF9NQUdJQzsKLS0gIGRvbWFpbi0+bWFsbG9jZWQgPSBOVUxMOwotLQotLSAgLyogRmlsbCBpbiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF2YWlsYWJsZSB0YWJsZXMuICAqLwotLSAgcmV2aXNpb24gPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+cmV2aXNpb24pOwotLSAgLyogV2Ugc3VwcG9ydCBvbmx5IHRoZSBtYWpvciByZXZpc2lvbnMgMCBhbmQgMS4gICovCi0tICBzd2l0Y2ggKHJldmlzaW9uID4+IDE2KQotLSAgICB7Ci0tICAgIGNhc2UgMDoKLS0gICAgY2FzZSAxOgotLSAgICAgIGRvbWFpbi0+bnN0cmluZ3MgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bnN0cmluZ3MpOwotLSAgICAgIGRvbWFpbi0+b3JpZ190YWIgPSAoY29uc3Qgc3RydWN0IHN0cmluZ19kZXNjICopCi0tCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm9yaWdfdGFiX29mZnNldCkpOwotLSAgICAgIGRvbWFpbi0+dHJhbnNfdGFiID0gKGNvbnN0IHN0cnVjdCBzdHJpbmdfZGVzYyAqKQotLQkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT50cmFuc190YWJfb2Zmc2V0KSk7Ci0tICAgICAgZG9tYWluLT5oYXNoX3NpemUgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfc2l6ZSk7Ci0tICAgICAgZG9tYWluLT5oYXNoX3RhYiA9Ci0tCShkb21haW4tPmhhc2hfc2l6ZSA+IDIKLS0JID8gKGNvbnN0IG5sc191aW50MzIgKikKLS0JICAgKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfb2Zmc2V0KSkKLS0JIDogTlVMTCk7Ci0tICAgICAgZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIgPSBkb21haW4tPm11c3Rfc3dhcDsKLS0KLS0gICAgICAvKiBOb3cgZGlzcGF0Y2ggb24gdGhlIG1pbm9yIHJldmlzaW9uLiAgKi8KLS0gICAgICBzd2l0Y2ggKHJldmlzaW9uICYgMHhmZmZmKQotLQl7Ci0tCWNhc2UgMDoKLS0JICBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MgPSAwOwotLQkgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gTlVMTDsKLS0JICBkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBOVUxMOwotLQkgIGJyZWFrOwotLQljYXNlIDE6Ci0tCWRlZmF1bHQ6Ci0tCSAgewotLQkgICAgbmxzX3VpbnQzMiBuX3N5c2RlcF9zdHJpbmdzOwotLQotLQkgICAgaWYgKGRvbWFpbi0+aGFzaF90YWIgPT0gTlVMTCkKLS0JICAgICAgLyogVGhpcyBpcyBpbnZhbGlkLiAgVGhlc2UgbWlub3IgcmV2aXNpb25zIG5lZWQgYSBoYXNoIHRhYmxlLiAgKi8KLS0JICAgICAgZ290byBpbnZhbGlkOwotLQotLQkgICAgbl9zeXNkZXBfc3RyaW5ncyA9Ci0tCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5uX3N5c2RlcF9zdHJpbmdzKTsKLS0JICAgIGlmIChuX3N5c2RlcF9zdHJpbmdzID4gMCkKLS0JICAgICAgewotLQkJbmxzX3VpbnQzMiBuX3N5c2RlcF9zZWdtZW50czsKLS0JCWNvbnN0IHN0cnVjdCBzeXNkZXBfc2VnbWVudCAqc3lzZGVwX3NlZ21lbnRzOwotLQkJY29uc3QgY2hhciAqKnN5c2RlcF9zZWdtZW50X3ZhbHVlczsKLS0JCWNvbnN0IG5sc191aW50MzIgKm9yaWdfc3lzZGVwX3RhYjsKLS0JCWNvbnN0IG5sc191aW50MzIgKnRyYW5zX3N5c2RlcF90YWI7Ci0tCQlubHNfdWludDMyIG5faW5tZW1fc3lzZGVwX3N0cmluZ3M7Ci0tCQlzaXplX3QgbWVtbmVlZDsKLS0JCWNoYXIgKm1lbTsKLS0JCXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKmlubWVtX29yaWdfc3lzZGVwX3RhYjsKLS0JCXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKmlubWVtX3RyYW5zX3N5c2RlcF90YWI7Ci0tCQlubHNfdWludDMyICppbm1lbV9oYXNoX3RhYjsKLS0JCXVuc2lnbmVkIGludCBpLCBqOwotLQotLQkJLyogR2V0IHRoZSB2YWx1ZXMgb2YgdGhlIHN5c3RlbSBkZXBlbmRlbnQgc2VnbWVudHMuICAqLwotLQkJbl9zeXNkZXBfc2VnbWVudHMgPQotLQkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bl9zeXNkZXBfc2VnbWVudHMpOwotLQkJc3lzZGVwX3NlZ21lbnRzID0gKGNvbnN0IHN0cnVjdCBzeXNkZXBfc2VnbWVudCAqKQotLQkJICAoKGNoYXIgKikgZGF0YQotLQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+c3lzZGVwX3NlZ21lbnRzX29mZnNldCkpOwotLQkJc3lzZGVwX3NlZ21lbnRfdmFsdWVzID0KLS0JCSAgKGNvbnN0IGNoYXIgKiopCi0tCQkgIGFsbG9jYSAobl9zeXNkZXBfc2VnbWVudHMgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOwotLQkJZm9yIChpID0gMDsgaSA8IG5fc3lzZGVwX3NlZ21lbnRzOyBpKyspCi0tCQkgIHsKLS0JCSAgICBjb25zdCBjaGFyICpuYW1lID0KLS0JCSAgICAgIChjaGFyICopIGRhdGEKLS0JCSAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHN5c2RlcF9zZWdtZW50c1tpXS5vZmZzZXQpOwotLQkJICAgIG5sc191aW50MzIgbmFtZWxlbiA9Ci0tCQkgICAgICBXIChkb21haW4tPm11c3Rfc3dhcCwgc3lzZGVwX3NlZ21lbnRzW2ldLmxlbmd0aCk7Ci0tCi0tCQkgICAgaWYgKCEobmFtZWxlbiA+IDAgJiYgbmFtZVtuYW1lbGVuIC0gMV0gPT0gJ1wwJykpCi0tCQkgICAgICB7Ci0tCQkJZnJlZWEgKHN5c2RlcF9zZWdtZW50X3ZhbHVlcyk7Ci0tCQkJZ290byBpbnZhbGlkOwotLQkJICAgICAgfQotLQotLQkJICAgIHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tpXSA9IGdldF9zeXNkZXBfc2VnbWVudF92YWx1ZSAobmFtZSk7Ci0tCQkgIH0KLS0KLS0JCW9yaWdfc3lzZGVwX3RhYiA9IChjb25zdCBubHNfdWludDMyICopCi0tCQkgICgoY2hhciAqKSBkYXRhCi0tCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5vcmlnX3N5c2RlcF90YWJfb2Zmc2V0KSk7Ci0tCQl0cmFuc19zeXNkZXBfdGFiID0gKGNvbnN0IG5sc191aW50MzIgKikKLS0JCSAgKChjaGFyICopIGRhdGEKLS0JCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnRyYW5zX3N5c2RlcF90YWJfb2Zmc2V0KSk7Ci0tCi0tCQkvKiBDb21wdXRlIHRoZSBhbW91bnQgb2YgYWRkaXRpb25hbCBtZW1vcnkgbmVlZGVkIGZvciB0aGUKLS0JCSAgIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBhbmQgdGhlIGF1Z21lbnRlZCBoYXNoIHRhYmxlLgotLQkJICAgQXQgdGhlIHNhbWUgdGltZSwgYWxzbyBkcm9wIHN0cmluZyBwYWlycyB3aGljaCByZWZlciB0bwotLQkJICAgYW4gdW5kZWZpbmVkIHN5c3RlbSBkZXBlbmRlbnQgc2VnbWVudC4gICovCi0tCQluX2lubWVtX3N5c2RlcF9zdHJpbmdzID0gMDsKLS0JCW1lbW5lZWQgPSBkb21haW4tPmhhc2hfc2l6ZSAqIHNpemVvZiAobmxzX3VpbnQzMik7Ci0tCQlmb3IgKGkgPSAwOyBpIDwgbl9zeXNkZXBfc3RyaW5nczsgaSsrKQotLQkJICB7Ci0tCQkgICAgaW50IHZhbGlkID0gMTsKLS0JCSAgICBzaXplX3QgbmVlZHNbMl07Ci0tCi0tCQkgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLS0JCSAgICAgIHsKLS0JCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqc3lzZGVwX3N0cmluZyA9Ci0tCQkJICAoY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKikKLS0JCQkgICgoY2hhciAqKSBkYXRhCi0tCQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLS0JCQkJaiA9PSAwCi0tCQkJCT8gb3JpZ19zeXNkZXBfdGFiW2ldCi0tCQkJCTogdHJhbnNfc3lzZGVwX3RhYltpXSkpOwotLQkJCXNpemVfdCBuZWVkID0gMDsKLS0JCQljb25zdCBzdHJ1Y3Qgc2VnbWVudF9wYWlyICpwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7Ci0tCi0tCQkJaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpICE9IFNFR01FTlRTX0VORCkKLS0JCQkgIGZvciAocCA9IHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOzsgcCsrKQotLQkJCSAgICB7Ci0tCQkJICAgICAgbmxzX3VpbnQzMiBzeXNkZXByZWY7Ci0tCi0tCQkJICAgICAgbmVlZCArPSBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c2Vnc2l6ZSk7Ci0tCi0tCQkJICAgICAgc3lzZGVwcmVmID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZik7Ci0tCQkJICAgICAgaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCi0tCQkJCWJyZWFrOwotLQotLQkJCSAgICAgIGlmIChzeXNkZXByZWYgPj0gbl9zeXNkZXBfc2VnbWVudHMpCi0tCQkJCXsKLS0JCQkJICAvKiBJbnZhbGlkLiAgKi8KLS0JCQkJICBmcmVlYSAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzKTsKLS0JCQkJICBnb3RvIGludmFsaWQ7Ci0tCQkJCX0KLS0KLS0JCQkgICAgICBpZiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0gPT0gTlVMTCkKLS0JCQkJewotLQkJCQkgIC8qIFRoaXMgcGFydGljdWxhciBzdHJpbmcgcGFpciBpcyBpbnZhbGlkLiAgKi8KLS0JCQkJICB2YWxpZCA9IDA7Ci0tCQkJCSAgYnJlYWs7Ci0tCQkJCX0KLS0KLS0JCQkgICAgICBuZWVkICs9IHN0cmxlbiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0pOwotLQkJCSAgICB9Ci0tCi0tCQkJbmVlZHNbal0gPSBuZWVkOwotLQkJCWlmICghdmFsaWQpCi0tCQkJICBicmVhazsKLS0JCSAgICAgIH0KLS0KLS0JCSAgICBpZiAodmFsaWQpCi0tCQkgICAgICB7Ci0tCQkJbl9pbm1lbV9zeXNkZXBfc3RyaW5ncysrOwotLQkJCW1lbW5lZWQgKz0gbmVlZHNbMF0gKyBuZWVkc1sxXTsKLS0JCSAgICAgIH0KLS0JCSAgfQotLQkJbWVtbmVlZCArPSAyICogbl9pbm1lbV9zeXNkZXBfc3RyaW5ncwotLQkJCSAgICogc2l6ZW9mIChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjKTsKLS0KLS0JCWlmIChuX2lubWVtX3N5c2RlcF9zdHJpbmdzID4gMCkKLS0JCSAgewotLQkJICAgIHVuc2lnbmVkIGludCBrOwotLQotLQkJICAgIC8qIEFsbG9jYXRlIGFkZGl0aW9uYWwgbWVtb3J5LiAgKi8KLS0JCSAgICBtZW0gPSAoY2hhciAqKSBtYWxsb2MgKG1lbW5lZWQpOwotLQkJICAgIGlmIChtZW0gPT0gTlVMTCkKLS0JCSAgICAgIGdvdG8gaW52YWxpZDsKLS0KLS0JCSAgICBkb21haW4tPm1hbGxvY2VkID0gbWVtOwotLQkJICAgIGlubWVtX29yaWdfc3lzZGVwX3RhYiA9IChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICopIG1lbTsKLS0JCSAgICBtZW0gKz0gbl9pbm1lbV9zeXNkZXBfc3RyaW5ncwotLQkJCSAgICogc2l6ZW9mIChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjKTsKLS0JCSAgICBpbm1lbV90cmFuc19zeXNkZXBfdGFiID0gKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKikgbWVtOwotLQkJICAgIG1lbSArPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzCi0tCQkJICAgKiBzaXplb2YgKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MpOwotLQkJICAgIGlubWVtX2hhc2hfdGFiID0gKG5sc191aW50MzIgKikgbWVtOwotLQkJICAgIG1lbSArPSBkb21haW4tPmhhc2hfc2l6ZSAqIHNpemVvZiAobmxzX3VpbnQzMik7Ci0tCi0tCQkgICAgLyogQ29tcHV0ZSB0aGUgc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzLiAgKi8KLS0JCSAgICBrID0gMDsKLS0JCSAgICBmb3IgKGkgPSAwOyBpIDwgbl9zeXNkZXBfc3RyaW5nczsgaSsrKQotLQkJICAgICAgewotLQkJCWludCB2YWxpZCA9IDE7Ci0tCi0tCQkJZm9yIChqID0gMDsgaiA8IDI7IGorKykKLS0JCQkgIHsKLS0JCQkgICAgY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQotLQkJCSAgICAgIChjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqKQotLQkJCSAgICAgICgoY2hhciAqKSBkYXRhCi0tCQkJICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0tCQkJCSAgICBqID09IDAKLS0JCQkJICAgID8gb3JpZ19zeXNkZXBfdGFiW2ldCi0tCQkJCSAgICA6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKLS0JCQkgICAgY29uc3Qgc3RydWN0IHNlZ21lbnRfcGFpciAqcCA9Ci0tCQkJICAgICAgc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7Ci0tCi0tCQkJICAgIGlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKQotLQkJCQkhPSBTRUdNRU5UU19FTkQpCi0tCQkJICAgICAgZm9yIChwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7OyBwKyspCi0tCQkJCXsKLS0JCQkJICBubHNfdWludDMyIHN5c2RlcHJlZjsKLS0KLS0JCQkJICBzeXNkZXByZWYgPQotLQkJCQkgICAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZik7Ci0tCQkJCSAgaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCi0tCQkJCSAgICBicmVhazsKLS0KLS0JCQkJICBpZiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0gPT0gTlVMTCkKLS0JCQkJICAgIHsKLS0JCQkJICAgICAgLyogVGhpcyBwYXJ0aWN1bGFyIHN0cmluZyBwYWlyIGlzCi0tCQkJCQkgaW52YWxpZC4gICovCi0tCQkJCSAgICAgIHZhbGlkID0gMDsKLS0JCQkJICAgICAgYnJlYWs7Ci0tCQkJCSAgICB9Ci0tCQkJCX0KLS0KLS0JCQkgICAgaWYgKCF2YWxpZCkKLS0JCQkgICAgICBicmVhazsKLS0JCQkgIH0KLS0KLS0JCQlpZiAodmFsaWQpCi0tCQkJICB7Ci0tCQkJICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0tCQkJICAgICAgewotLQkJCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqc3lzZGVwX3N0cmluZyA9Ci0tCQkJCSAgKGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICopCi0tCQkJCSAgKChjaGFyICopIGRhdGEKLS0JCQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLS0JCQkJCWogPT0gMAotLQkJCQkJPyBvcmlnX3N5c2RlcF90YWJbaV0KLS0JCQkJCTogdHJhbnNfc3lzZGVwX3RhYltpXSkpOwotLQkJCQljb25zdCBjaGFyICpzdGF0aWNfc2VnbWVudHMgPQotLQkJCQkgIChjaGFyICopIGRhdGEKLS0JCQkJICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBzeXNkZXBfc3RyaW5nLT5vZmZzZXQpOwotLQkJCQljb25zdCBzdHJ1Y3Qgc2VnbWVudF9wYWlyICpwID0KLS0JCQkJICBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czsKLS0KLS0JCQkJLyogQ29uY2F0ZW5hdGUgdGhlIHNlZ21lbnRzLCBhbmQgZmlsbAotLQkJCQkgICBpbm1lbV9vcmlnX3N5c2RlcF90YWJba10gKGZvciBqID09IDApIGFuZAotLQkJCQkgICBpbm1lbV90cmFuc19zeXNkZXBfdGFiW2tdIChmb3IgaiA9PSAxKS4gICovCi0tCi0tCQkJCXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKmlubWVtX3RhYl9lbnRyeSA9Ci0tCQkJCSAgKGogPT0gMAotLQkJCQkgICA/IGlubWVtX29yaWdfc3lzZGVwX3RhYgotLQkJCQkgICA6IGlubWVtX3RyYW5zX3N5c2RlcF90YWIpCi0tCQkJCSAgKyBrOwotLQotLQkJCQlpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZikKLS0JCQkJICAgID09IFNFR01FTlRTX0VORCkKLS0JCQkJICB7Ci0tCQkJCSAgICAvKiBPbmx5IG9uZSBzdGF0aWMgc2VnbWVudC4gICovCi0tCQkJCSAgICBpbm1lbV90YWJfZW50cnktPmxlbmd0aCA9Ci0tCQkJCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zZWdzaXplKTsKLS0JCQkJICAgIGlubWVtX3RhYl9lbnRyeS0+cG9pbnRlciA9IHN0YXRpY19zZWdtZW50czsKLS0JCQkJICB9Ci0tCQkJCWVsc2UKLS0JCQkJICB7Ci0tCQkJCSAgICBpbm1lbV90YWJfZW50cnktPnBvaW50ZXIgPSBtZW07Ci0tCi0tCQkJCSAgICBmb3IgKHAgPSBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czs7IHArKykKLS0JCQkJICAgICAgewotLQkJCQkJbmxzX3VpbnQzMiBzZWdzaXplID0KLS0JCQkJCSAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnNlZ3NpemUpOwotLQkJCQkJbmxzX3VpbnQzMiBzeXNkZXByZWYgPQotLQkJCQkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKTsKLS0JCQkJCXNpemVfdCBuOwotLQotLQkJCQkJaWYgKHNlZ3NpemUgPiAwKQotLQkJCQkJICB7Ci0tCQkJCQkgICAgbWVtY3B5IChtZW0sIHN0YXRpY19zZWdtZW50cywgc2Vnc2l6ZSk7Ci0tCQkJCQkgICAgbWVtICs9IHNlZ3NpemU7Ci0tCQkJCQkgICAgc3RhdGljX3NlZ21lbnRzICs9IHNlZ3NpemU7Ci0tCQkJCQkgIH0KLS0KLS0JCQkJCWlmIChzeXNkZXByZWYgPT0gU0VHTUVOVFNfRU5EKQotLQkJCQkJICBicmVhazsKLS0KLS0JCQkJCW4gPSBzdHJsZW4gKHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tzeXNkZXByZWZdKTsKLS0JCQkJCW1lbWNweSAobWVtLCBzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSwgbik7Ci0tCQkJCQltZW0gKz0gbjsKLS0JCQkJICAgICAgfQotLQotLQkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5sZW5ndGggPQotLQkJCQkgICAgICBtZW0gLSBpbm1lbV90YWJfZW50cnktPnBvaW50ZXI7Ci0tCQkJCSAgfQotLQkJCSAgICAgIH0KLS0KLS0JCQkgICAgaysrOwotLQkJCSAgfQotLQkJICAgICAgfQotLQkJICAgIGlmIChrICE9IG5faW5tZW1fc3lzZGVwX3N0cmluZ3MpCi0tCQkgICAgICBhYm9ydCAoKTsKLS0KLS0JCSAgICAvKiBDb21wdXRlIHRoZSBhdWdtZW50ZWQgaGFzaCB0YWJsZS4gICovCi0tCQkgICAgZm9yIChpID0gMDsgaSA8IGRvbWFpbi0+aGFzaF9zaXplOyBpKyspCi0tCQkgICAgICBpbm1lbV9oYXNoX3RhYltpXSA9Ci0tCQkJVyAoZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIsIGRvbWFpbi0+aGFzaF90YWJbaV0pOwotLQkJICAgIGZvciAoaSA9IDA7IGkgPCBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOyBpKyspCi0tCQkgICAgICB7Ci0tCQkJY29uc3QgY2hhciAqbXNnaWQgPSBpbm1lbV9vcmlnX3N5c2RlcF90YWJbaV0ucG9pbnRlcjsKLS0JCQlubHNfdWludDMyIGhhc2hfdmFsID0gX19oYXNoX3N0cmluZyAobXNnaWQpOwotLQkJCW5sc191aW50MzIgaWR4ID0gaGFzaF92YWwgJSBkb21haW4tPmhhc2hfc2l6ZTsKLS0JCQlubHNfdWludDMyIGluY3IgPQotLQkJCSAgMSArIChoYXNoX3ZhbCAlIChkb21haW4tPmhhc2hfc2l6ZSAtIDIpKTsKLS0KLS0JCQlmb3IgKDs7KQotLQkJCSAgewotLQkJCSAgICBpZiAoaW5tZW1faGFzaF90YWJbaWR4XSA9PSAwKQotLQkJCSAgICAgIHsKLS0JCQkJLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gIFVzZSBpdC4gICovCi0tCQkJCWlubWVtX2hhc2hfdGFiW2lkeF0gPSAxICsgZG9tYWluLT5uc3RyaW5ncyArIGk7Ci0tCQkJCWJyZWFrOwotLQkJCSAgICAgIH0KLS0KLS0JCQkgICAgaWYgKGlkeCA+PSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3IpCi0tCQkJICAgICAgaWR4IC09IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcjsKLS0JCQkgICAgZWxzZQotLQkJCSAgICAgIGlkeCArPSBpbmNyOwotLQkJCSAgfQotLQkJICAgICAgfQotLQotLQkJICAgIGRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncyA9IG5faW5tZW1fc3lzZGVwX3N0cmluZ3M7Ci0tCQkgICAgZG9tYWluLT5vcmlnX3N5c2RlcF90YWIgPSBpbm1lbV9vcmlnX3N5c2RlcF90YWI7Ci0tCQkgICAgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gaW5tZW1fdHJhbnNfc3lzZGVwX3RhYjsKLS0KLS0JCSAgICBkb21haW4tPmhhc2hfdGFiID0gaW5tZW1faGFzaF90YWI7Ci0tCQkgICAgZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIgPSAwOwotLQkJICB9Ci0tCQllbHNlCi0tCQkgIHsKLS0JCSAgICBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MgPSAwOwotLQkJICAgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gTlVMTDsKLS0JCSAgICBkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBOVUxMOwotLQkJICB9Ci0tCi0tCQlmcmVlYSAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzKTsKLS0JICAgICAgfQotLQkgICAgZWxzZQotLQkgICAgICB7Ci0tCQlkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MgPSAwOwotLQkJZG9tYWluLT5vcmlnX3N5c2RlcF90YWIgPSBOVUxMOwotLQkJZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gTlVMTDsKLS0JICAgICAgfQotLQkgIH0KLS0JICBicmVhazsKLS0JfQotLSAgICAgIGJyZWFrOwotLSAgICBkZWZhdWx0OgotLSAgICAgIC8qIFRoaXMgaXMgYW4gaW52YWxpZCByZXZpc2lvbi4gICovCi0tICAgIGludmFsaWQ6Ci0tICAgICAgLyogVGhpcyBpcyBhbiBpbnZhbGlkIC5tbyBmaWxlLiAgKi8KLS0gICAgICBpZiAoZG9tYWluLT5tYWxsb2NlZCkKLS0JZnJlZSAoZG9tYWluLT5tYWxsb2NlZCk7Ci0tI2lmZGVmIEhBVkVfTU1BUAotLSAgICAgIGlmICh1c2VfbW1hcCkKLS0JbXVubWFwICgoY2FkZHJfdCkgZGF0YSwgc2l6ZSk7Ci0tICAgICAgZWxzZQotLSNlbmRpZgotLQlmcmVlIChkYXRhKTsKLS0gICAgICBmcmVlIChkb21haW4pOwotLSAgICAgIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKLS0gICAgICBnb3RvIG91dDsKLS0gICAgfQotLQotLSAgLyogTm8gY2FjaGVzIG9mIGNvbnZlcnRlZCB0cmFuc2xhdGlvbnMgc28gZmFyLiAgKi8KLS0gIGRvbWFpbi0+Y29udmVyc2lvbnMgPSBOVUxMOwotLSAgZG9tYWluLT5uY29udmVyc2lvbnMgPSAwOwotLSAgZ2xfcndsb2NrX2luaXQgKGRvbWFpbi0+Y29udmVyc2lvbnNfbG9jayk7Ci0tCi0tICAvKiBHZXQgdGhlIGhlYWRlciBlbnRyeSBhbmQgbG9vayBmb3IgYSBwbHVyYWwgc3BlY2lmaWNhdGlvbi4gICovCi0tI2lmZGVmIElOX0xJQkdMT0NBTEUKLS0gIG51bGxlbnRyeSA9Ci0tICAgIF9ubF9maW5kX21zZyAoZG9tYWluX2ZpbGUsIGRvbWFpbmJpbmRpbmcsIE5VTEwsICIiLCAmbnVsbGVudHJ5bGVuKTsKLS0jZWxzZQotLSAgbnVsbGVudHJ5ID0gX25sX2ZpbmRfbXNnIChkb21haW5fZmlsZSwgZG9tYWluYmluZGluZywgIiIsIDAsICZudWxsZW50cnlsZW4pOwotLSNlbmRpZgotLSAgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiAobnVsbGVudHJ5LCAmZG9tYWluLT5wbHVyYWwsICZkb21haW4tPm5wbHVyYWxzKTsKLS0KLS0gb3V0OgotLSAgaWYgKGZkICE9IC0xKQotLSAgICBjbG9zZSAoZmQpOwotLQotLSAgZG9tYWluX2ZpbGUtPmRlY2lkZWQgPSAxOwotLQotLSBkb25lOgotLSAgX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZSAobG9jayk7Ci0tfQotLQotLQotLSNpZmRlZiBfTElCQwotLXZvaWQKLS1pbnRlcm5hbF9mdW5jdGlvbiBfX2xpYmNfZnJlZXJlc19mbl9zZWN0aW9uCi0tX25sX3VubG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW4pCi0tewotLSAgc2l6ZV90IGk7Ci0tCi0tICBpZiAoZG9tYWluLT5wbHVyYWwgIT0gJl9fZ2V0dGV4dF9nZXJtYW5pY19wbHVyYWwpCi0tICAgIF9fZ2V0dGV4dF9mcmVlX2V4cCAoKHN0cnVjdCBleHByZXNzaW9uICopIGRvbWFpbi0+cGx1cmFsKTsKLS0KLS0gIGZvciAoaSA9IDA7IGkgPCBkb21haW4tPm5jb252ZXJzaW9uczsgaSsrKQotLSAgICB7Ci0tICAgICAgc3RydWN0IGNvbnZlcnRlZF9kb21haW4gKmNvbnZkID0gJmRvbWFpbi0+Y29udmVyc2lvbnNbaV07Ci0tCi0tICAgICAgZnJlZSAoY29udmQtPmVuY29kaW5nKTsKLS0gICAgICBpZiAoY29udmQtPmNvbnZfdGFiICE9IE5VTEwgJiYgY29udmQtPmNvbnZfdGFiICE9IChjaGFyICoqKSAtMSkKLS0JZnJlZSAoY29udmQtPmNvbnZfdGFiKTsKLS0gICAgICBpZiAoY29udmQtPmNvbnYgIT0gKF9fZ2NvbnZfdCkgLTEpCi0tCV9fZ2NvbnZfY2xvc2UgKGNvbnZkLT5jb252KTsKLS0gICAgfQotLSAgaWYgKGRvbWFpbi0+Y29udmVyc2lvbnMgIT0gTlVMTCkKLS0gICAgZnJlZSAoZG9tYWluLT5jb252ZXJzaW9ucyk7Ci0tICBfX2xpYmNfcndsb2NrX2ZpbmkgKGRvbWFpbi0+Y29udmVyc2lvbnNfbG9jayk7Ci0tCi0tICBpZiAoZG9tYWluLT5tYWxsb2NlZCkKLS0gICAgZnJlZSAoZG9tYWluLT5tYWxsb2NlZCk7Ci0tCi0tIyBpZmRlZiBfUE9TSVhfTUFQUEVEX0ZJTEVTCi0tICBpZiAoZG9tYWluLT51c2VfbW1hcCkKLS0gICAgbXVubWFwICgoY2FkZHJfdCkgZG9tYWluLT5kYXRhLCBkb21haW4tPm1tYXBfc2l6ZSk7Ci0tICBlbHNlCi0tIyBlbmRpZgkvKiBfUE9TSVhfTUFQUEVEX0ZJTEVTICovCi0tICAgIGZyZWUgKCh2b2lkICopIGRvbWFpbi0+ZGF0YSk7Ci0tCi0tICBmcmVlIChkb21haW4pOwotLX0KLS0jZW5kaWYKLS0tLSBhL2ludGwvbG9jYWxjaGFyc2V0LmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDQ2MSArMCwwIEBACi0tLyogRGV0ZXJtaW5lIGEgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZy4KLS0KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiAgKi8KLS0KLS0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0tCi0tLyogU3BlY2lmaWNhdGlvbi4gICovCi0tI2luY2x1ZGUgImxvY2FsY2hhcnNldC5oIgotLQotLSNpbmNsdWRlIDxzdGRkZWYuaD4KLS0jaW5jbHVkZSA8c3RkaW8uaD4KLS0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLQotLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXwotLSMgZGVmaW5lIFdJTjMyX05BVElWRQotLSNlbmRpZgotLQotLSNpZiBkZWZpbmVkIF9fRU1YX18KLS0vKiBBc3N1bWUgRU1YIHByb2dyYW0gcnVucyBvbiBPUy8yLCBldmVuIGlmIGNvbXBpbGVkIHVuZGVyIERPUy4gICovCi0tIyBkZWZpbmUgT1MyCi0tI2VuZGlmCi0tCi0tI2lmICFkZWZpbmVkIFdJTjMyX05BVElWRQotLSMgaWYgSEFWRV9MQU5HSU5GT19DT0RFU0VUCi0tIyAgaW5jbHVkZSA8bGFuZ2luZm8uaD4KLS0jIGVsc2UKLS0jICBpZiAwIC8qIHNlZSBjb21tZW50IGJlbG93ICovCi0tIyAgIGluY2x1ZGUgPGxvY2FsZS5oPgotLSMgIGVuZGlmCi0tIyBlbmRpZgotLSMgaWZkZWYgX19DWUdXSU5fXwotLSMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0tIyAgaW5jbHVkZSA8d2luZG93cy5oPgotLSMgZW5kaWYKLS0jZWxpZiBkZWZpbmVkIFdJTjMyX05BVElWRQotLSMgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLS0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLS0jZW5kaWYKLS0jaWYgZGVmaW5lZCBPUzIKLS0jIGRlZmluZSBJTkNMX0RPUwotLSMgaW5jbHVkZSA8b3MyLmg+Ci0tI2VuZGlmCi0tCi0tI2lmIEVOQUJMRV9SRUxPQ0FUQUJMRQotLSMgaW5jbHVkZSAicmVsb2NhdGFibGUuaCIKLS0jZWxzZQotLSMgZGVmaW5lIHJlbG9jYXRlKHBhdGhuYW1lKSAocGF0aG5hbWUpCi0tI2VuZGlmCi0tCi0tLyogR2V0IExJQkRJUi4gICovCi0tI2lmbmRlZiBMSUJESVIKLS0jIGluY2x1ZGUgImNvbmZpZ21ha2UuaCIKLS0jZW5kaWYKLS0KLS0jaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXwotLSAgLyogV2luMzIsIEN5Z3dpbiwgT1MvMiwgRE9TICovCi0tIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJyB8fCAoQykgPT0gJ1xcJykKLS0jZW5kaWYKLS0KLS0jaWZuZGVmIERJUkVDVE9SWV9TRVBBUkFUT1IKLS0jIGRlZmluZSBESVJFQ1RPUllfU0VQQVJBVE9SICcvJwotLSNlbmRpZgotLQotLSNpZm5kZWYgSVNTTEFTSAotLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSBESVJFQ1RPUllfU0VQQVJBVE9SKQotLSNlbmRpZgotLQotLSNpZiBIQVZFX0RFQ0xfR0VUQ19VTkxPQ0tFRAotLSMgdW5kZWYgZ2V0YwotLSMgZGVmaW5lIGdldGMgZ2V0Y191bmxvY2tlZAotLSNlbmRpZgotLQotLS8qIFRoZSBmb2xsb3dpbmcgc3RhdGljIHZhcmlhYmxlIGlzIGRlY2xhcmVkICd2b2xhdGlsZScgdG8gYXZvaWQgYQotLSAgIHBvc3NpYmxlIG11bHRpdGhyZWFkIHByb2JsZW0gaW4gdGhlIGZ1bmN0aW9uIGdldF9jaGFyc2V0X2FsaWFzZXMuIElmIHdlCi0tICAgYXJlIHJ1bm5pbmcgaW4gYSB0aHJlYWRlZCBlbnZpcm9ubWVudCwgYW5kIGlmIHR3byB0aHJlYWRzIGluaXRpYWxpemUKLS0gICAnY2hhcnNldF9hbGlhc2VzJyBzaW11bHRhbmVvdXNseSwgYm90aCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgdmFsdWUsCi0tICAgYW5kIGV2ZXJ5dGhpbmcgd2lsbCBiZSBvayBpZiB0aGUgdHdvIGFzc2lnbm1lbnRzIHRvICdjaGFyc2V0X2FsaWFzZXMnCi0tICAgYXJlIGF0b21pYy4gQnV0IEkgZG9uJ3Qga25vdyB3aGF0IHdpbGwgaGFwcGVuIGlmIHRoZSB0d28gYXNzaWdubWVudHMgbWl4LiAgKi8KLS0jaWYgX19TVERDX18gIT0gMQotLSMgZGVmaW5lIHZvbGF0aWxlIC8qIGVtcHR5ICovCi0tI2VuZGlmCi0tLyogUG9pbnRlciB0byB0aGUgY29udGVudHMgb2YgdGhlIGNoYXJzZXQuYWxpYXMgZmlsZSwgaWYgaXQgaGFzIGFscmVhZHkgYmVlbgotLSAgIHJlYWQsIGVsc2UgTlVMTC4gIEl0cyBmb3JtYXQgaXM6Ci0tICAgQUxJQVNfMSAnXDAnIENBTk9OSUNBTF8xICdcMCcgLi4uIEFMSUFTX24gJ1wwJyBDQU5PTklDQUxfbiAnXDAnICdcMCcgICovCi0tc3RhdGljIGNvbnN0IGNoYXIgKiB2b2xhdGlsZSBjaGFyc2V0X2FsaWFzZXM7Ci0tCi0tLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY29udGVudHMgb2YgdGhlIGNoYXJzZXQuYWxpYXMgZmlsZS4gICovCi0tc3RhdGljIGNvbnN0IGNoYXIgKgotLWdldF9jaGFyc2V0X2FsaWFzZXMgKHZvaWQpCi0tewotLSAgY29uc3QgY2hhciAqY3A7Ci0tCi0tICBjcCA9IGNoYXJzZXRfYWxpYXNlczsKLS0gIGlmIChjcCA9PSBOVUxMKQotLSAgICB7Ci0tI2lmICEoZGVmaW5lZCBWTVMgfHwgZGVmaW5lZCBXSU4zMl9OQVRJVkUgfHwgZGVmaW5lZCBfX0NZR1dJTl9fKQotLSAgICAgIEZJTEUgKmZwOwotLSAgICAgIGNvbnN0IGNoYXIgKmRpcjsKLS0gICAgICBjb25zdCBjaGFyICpiYXNlID0gImNoYXJzZXQuYWxpYXMiOwotLSAgICAgIGNoYXIgKmZpbGVfbmFtZTsKLS0KLS0gICAgICAvKiBNYWtlIGl0IHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSBjaGFyc2V0LmFsaWFzIGxvY2F0aW9uLiAgVGhpcyBpcwotLQkgbmVjZXNzYXJ5IGZvciBydW5uaW5nIHRoZSB0ZXN0c3VpdGUgYmVmb3JlICJtYWtlIGluc3RhbGwiLiAgKi8KLS0gICAgICBkaXIgPSBnZXRlbnYgKCJDSEFSU0VUQUxJQVNESVIiKTsKLS0gICAgICBpZiAoZGlyID09IE5VTEwgfHwgZGlyWzBdID09ICdcMCcpCi0tCWRpciA9IHJlbG9jYXRlIChMSUJESVIpOwotLQotLSAgICAgIC8qIENvbmNhdGVuYXRlIGRpciBhbmQgYmFzZSBpbnRvIGZyZXNobHkgYWxsb2NhdGVkIGZpbGVfbmFtZS4gICovCi0tICAgICAgewotLQlzaXplX3QgZGlyX2xlbiA9IHN0cmxlbiAoZGlyKTsKLS0Jc2l6ZV90IGJhc2VfbGVuID0gc3RybGVuIChiYXNlKTsKLS0JaW50IGFkZF9zbGFzaCA9IChkaXJfbGVuID4gMCAmJiAhSVNTTEFTSCAoZGlyW2Rpcl9sZW4gLSAxXSkpOwotLQlmaWxlX25hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGRpcl9sZW4gKyBhZGRfc2xhc2ggKyBiYXNlX2xlbiArIDEpOwotLQlpZiAoZmlsZV9uYW1lICE9IE5VTEwpCi0tCSAgewotLQkgICAgbWVtY3B5IChmaWxlX25hbWUsIGRpciwgZGlyX2xlbik7Ci0tCSAgICBpZiAoYWRkX3NsYXNoKQotLQkgICAgICBmaWxlX25hbWVbZGlyX2xlbl0gPSBESVJFQ1RPUllfU0VQQVJBVE9SOwotLQkgICAgbWVtY3B5IChmaWxlX25hbWUgKyBkaXJfbGVuICsgYWRkX3NsYXNoLCBiYXNlLCBiYXNlX2xlbiArIDEpOwotLQkgIH0KLS0gICAgICB9Ci0tCi0tICAgICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMIHx8IChmcCA9IGZvcGVuIChmaWxlX25hbWUsICJyIikpID09IE5VTEwpCi0tCS8qIE91dCBvZiBtZW1vcnkgb3IgZmlsZSBub3QgZm91bmQsIHRyZWF0IGl0IGFzIGVtcHR5LiAgKi8KLS0JY3AgPSAiIjsKLS0gICAgICBlbHNlCi0tCXsKLS0JICAvKiBQYXJzZSB0aGUgZmlsZSdzIGNvbnRlbnRzLiAgKi8KLS0JICBjaGFyICpyZXNfcHRyID0gTlVMTDsKLS0JICBzaXplX3QgcmVzX3NpemUgPSAwOwotLQotLQkgIGZvciAoOzspCi0tCSAgICB7Ci0tCSAgICAgIGludCBjOwotLQkgICAgICBjaGFyIGJ1ZjFbNTArMV07Ci0tCSAgICAgIGNoYXIgYnVmMls1MCsxXTsKLS0JICAgICAgc2l6ZV90IGwxLCBsMjsKLS0JICAgICAgY2hhciAqb2xkX3Jlc19wdHI7Ci0tCi0tCSAgICAgIGMgPSBnZXRjIChmcCk7Ci0tCSAgICAgIGlmIChjID09IEVPRikKLS0JCWJyZWFrOwotLQkgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykKLS0JCWNvbnRpbnVlOwotLQkgICAgICBpZiAoYyA9PSAnIycpCi0tCQl7Ci0tCQkgIC8qIFNraXAgY29tbWVudCwgdG8gZW5kIG9mIGxpbmUuICAqLwotLQkJICBkbwotLQkJICAgIGMgPSBnZXRjIChmcCk7Ci0tCQkgIHdoaWxlICghKGMgPT0gRU9GIHx8IGMgPT0gJ1xuJykpOwotLQkJICBpZiAoYyA9PSBFT0YpCi0tCQkgICAgYnJlYWs7Ci0tCQkgIGNvbnRpbnVlOwotLQkJfQotLQkgICAgICB1bmdldGMgKGMsIGZwKTsKLS0JICAgICAgaWYgKGZzY2FuZiAoZnAsICIlNTBzICU1MHMiLCBidWYxLCBidWYyKSA8IDIpCi0tCQlicmVhazsKLS0JICAgICAgbDEgPSBzdHJsZW4gKGJ1ZjEpOwotLQkgICAgICBsMiA9IHN0cmxlbiAoYnVmMik7Ci0tCSAgICAgIG9sZF9yZXNfcHRyID0gcmVzX3B0cjsKLS0JICAgICAgaWYgKHJlc19zaXplID09IDApCi0tCQl7Ci0tCQkgIHJlc19zaXplID0gbDEgKyAxICsgbDIgKyAxOwotLQkJICByZXNfcHRyID0gKGNoYXIgKikgbWFsbG9jIChyZXNfc2l6ZSArIDEpOwotLQkJfQotLQkgICAgICBlbHNlCi0tCQl7Ci0tCQkgIHJlc19zaXplICs9IGwxICsgMSArIGwyICsgMTsKLS0JCSAgcmVzX3B0ciA9IChjaGFyICopIHJlYWxsb2MgKHJlc19wdHIsIHJlc19zaXplICsgMSk7Ci0tCQl9Ci0tCSAgICAgIGlmIChyZXNfcHRyID09IE5VTEwpCi0tCQl7Ci0tCQkgIC8qIE91dCBvZiBtZW1vcnkuICovCi0tCQkgIHJlc19zaXplID0gMDsKLS0JCSAgaWYgKG9sZF9yZXNfcHRyICE9IE5VTEwpCi0tCQkgICAgZnJlZSAob2xkX3Jlc19wdHIpOwotLQkJICBicmVhazsKLS0JCX0KLS0JICAgICAgc3RyY3B5IChyZXNfcHRyICsgcmVzX3NpemUgLSAobDIgKyAxKSAtIChsMSArIDEpLCBidWYxKTsKLS0JICAgICAgc3RyY3B5IChyZXNfcHRyICsgcmVzX3NpemUgLSAobDIgKyAxKSwgYnVmMik7Ci0tCSAgICB9Ci0tCSAgZmNsb3NlIChmcCk7Ci0tCSAgaWYgKHJlc19zaXplID09IDApCi0tCSAgICBjcCA9ICIiOwotLQkgIGVsc2UKLS0JICAgIHsKLS0JICAgICAgKihyZXNfcHRyICsgcmVzX3NpemUpID0gJ1wwJzsKLS0JICAgICAgY3AgPSByZXNfcHRyOwotLQkgICAgfQotLQl9Ci0tCi0tICAgICAgaWYgKGZpbGVfbmFtZSAhPSBOVUxMKQotLQlmcmVlIChmaWxlX25hbWUpOwotLQotLSNlbHNlCi0tCi0tIyBpZiBkZWZpbmVkIFZNUwotLSAgICAgIC8qIFRvIGF2b2lkIHRoZSB0cm91YmxlcyBvZiBhbiBleHRyYSBmaWxlIGNoYXJzZXQuYWxpYXNfdm1zIGluIHRoZQotLQkgc291cmNlcyBvZiBtYW55IEdOVSBwYWNrYWdlcywgc2ltcGx5IGlubGluZSB0aGUgYWxpYXNlcyBoZXJlLiAgKi8KLS0gICAgICAvKiBUaGUgbGlzdCBvZiBlbmNvZGluZ3MgaXMgdGFrZW4gZnJvbSB0aGUgT3BlblZNUyA3LjMtMSBkb2N1bWVudGF0aW9uCi0tCSAiQ29tcGFxIEMgUnVuLVRpbWUgTGlicmFyeSBSZWZlcmVuY2UgTWFudWFsIGZvciBPcGVuVk1TIHN5c3RlbXMiCi0tCSBzZWN0aW9uIDEwLjcgIkhhbmRsaW5nIERpZmZlcmVudCBDaGFyYWN0ZXIgU2V0cyIuICAqLwotLSAgICAgIGNwID0gIklTTzg4NTktMSIgIlwwIiAiSVNPLTg4NTktMSIgIlwwIgotLQkgICAiSVNPODg1OS0yIiAiXDAiICJJU08tODg1OS0yIiAiXDAiCi0tCSAgICJJU084ODU5LTUiICJcMCIgIklTTy04ODU5LTUiICJcMCIKLS0JICAgIklTTzg4NTktNyIgIlwwIiAiSVNPLTg4NTktNyIgIlwwIgotLQkgICAiSVNPODg1OS04IiAiXDAiICJJU08tODg1OS04IiAiXDAiCi0tCSAgICJJU084ODU5LTkiICJcMCIgIklTTy04ODU5LTkiICJcMCIKLS0JICAgLyogSmFwYW5lc2UgKi8KLS0JICAgImV1Y0pQIiAiXDAiICJFVUMtSlAiICJcMCIKLS0JICAgIlNKSVMiICJcMCIgIlNISUZUX0pJUyIgIlwwIgotLQkgICAiREVDS0FOSkkiICJcMCIgIkRFQy1LQU5KSSIgIlwwIgotLQkgICAiU0RFQ0tBTkpJIiAiXDAiICJFVUMtSlAiICJcMCIKLS0JICAgLyogQ2hpbmVzZSAqLwotLQkgICAiZXVjVFciICJcMCIgIkVVQy1UVyIgIlwwIgotLQkgICAiREVDSEFOWVUiICJcMCIgIkRFQy1IQU5ZVSIgIlwwIgotLQkgICAiREVDSEFOWkkiICJcMCIgIkdCMjMxMiIgIlwwIgotLQkgICAvKiBLb3JlYW4gKi8KLS0JICAgIkRFQ0tPUkVBTiIgIlwwIiAiRVVDLUtSIiAiXDAiOwotLSMgZW5kaWYKLS0KLS0jIGlmIGRlZmluZWQgV0lOMzJfTkFUSVZFIHx8IGRlZmluZWQgX19DWUdXSU5fXwotLSAgICAgIC8qIFRvIGF2b2lkIHRoZSB0cm91YmxlcyBvZiBpbnN0YWxsaW5nIGEgc2VwYXJhdGUgZmlsZSBpbiB0aGUgc2FtZQotLQkgZGlyZWN0b3J5IGFzIHRoZSBETEwgYW5kIG9mIHJldHJpZXZpbmcgdGhlIERMTCdzIGRpcmVjdG9yeSBhdAotLQkgcnVudGltZSwgc2ltcGx5IGlubGluZSB0aGUgYWxpYXNlcyBoZXJlLiAgKi8KLS0KLS0gICAgICBjcCA9ICJDUDkzNiIgIlwwIiAiR0JLIiAiXDAiCi0tCSAgICJDUDEzNjEiICJcMCIgIkpPSEFCIiAiXDAiCi0tCSAgICJDUDIwMTI3IiAiXDAiICJBU0NJSSIgIlwwIgotLQkgICAiQ1AyMDg2NiIgIlwwIiAiS09JOC1SIiAiXDAiCi0tCSAgICJDUDIwOTM2IiAiXDAiICJHQjIzMTIiICJcMCIKLS0JICAgIkNQMjE4NjYiICJcMCIgIktPSTgtUlUiICJcMCIKLS0JICAgIkNQMjg1OTEiICJcMCIgIklTTy04ODU5LTEiICJcMCIKLS0JICAgIkNQMjg1OTIiICJcMCIgIklTTy04ODU5LTIiICJcMCIKLS0JICAgIkNQMjg1OTMiICJcMCIgIklTTy04ODU5LTMiICJcMCIKLS0JICAgIkNQMjg1OTQiICJcMCIgIklTTy04ODU5LTQiICJcMCIKLS0JICAgIkNQMjg1OTUiICJcMCIgIklTTy04ODU5LTUiICJcMCIKLS0JICAgIkNQMjg1OTYiICJcMCIgIklTTy04ODU5LTYiICJcMCIKLS0JICAgIkNQMjg1OTciICJcMCIgIklTTy04ODU5LTciICJcMCIKLS0JICAgIkNQMjg1OTgiICJcMCIgIklTTy04ODU5LTgiICJcMCIKLS0JICAgIkNQMjg1OTkiICJcMCIgIklTTy04ODU5LTkiICJcMCIKLS0JICAgIkNQMjg2MDUiICJcMCIgIklTTy04ODU5LTE1IiAiXDAiCi0tCSAgICJDUDM4NTk4IiAiXDAiICJJU08tODg1OS04IiAiXDAiCi0tCSAgICJDUDUxOTMyIiAiXDAiICJFVUMtSlAiICJcMCIKLS0JICAgIkNQNTE5MzYiICJcMCIgIkdCMjMxMiIgIlwwIgotLQkgICAiQ1A1MTk0OSIgIlwwIiAiRVVDLUtSIiAiXDAiCi0tCSAgICJDUDUxOTUwIiAiXDAiICJFVUMtVFciICJcMCIKLS0JICAgIkNQNTQ5MzYiICJcMCIgIkdCMTgwMzAiICJcMCIKLS0JICAgIkNQNjUwMDEiICJcMCIgIlVURi04IiAiXDAiOwotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0gICAgICBjaGFyc2V0X2FsaWFzZXMgPSBjcDsKLS0gICAgfQotLQotLSAgcmV0dXJuIGNwOwotLX0KLS0KLS0vKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgY2Fub25pY2FsaXplIGl0Ci0tICAgaW50byBvbmUgb2YgdGhlIGNhbm9uaWNhbCBuYW1lcyBsaXN0ZWQgaW4gY29uZmlnLmNoYXJzZXQuCi0tICAgVGhlIHJlc3VsdCBtdXN0IG5vdCBiZSBmcmVlZDsgaXQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuCi0tICAgSWYgdGhlIGNhbm9uaWNhbCBuYW1lIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCB0aGUgcmVzdWx0IGlzIGEgbm9uLWNhbm9uaWNhbAotLSAgIG5hbWUuICAqLwotLQotLSNpZmRlZiBTVEFUSUMKLS1TVEFUSUMKLS0jZW5kaWYKLS1jb25zdCBjaGFyICoKLS1sb2NhbGVfY2hhcnNldCAodm9pZCkKLS17Ci0tICBjb25zdCBjaGFyICpjb2Rlc2V0OwotLSAgY29uc3QgY2hhciAqYWxpYXNlczsKLS0KLS0jaWYgIShkZWZpbmVkIFdJTjMyX05BVElWRSB8fCBkZWZpbmVkIE9TMikKLS0KLS0jIGlmIEhBVkVfTEFOR0lORk9fQ09ERVNFVAotLQotLSAgLyogTW9zdCBzeXN0ZW1zIHN1cHBvcnQgbmxfbGFuZ2luZm8gKENPREVTRVQpIG5vd2FkYXlzLiAgKi8KLS0gIGNvZGVzZXQgPSBubF9sYW5naW5mbyAoQ09ERVNFVCk7Ci0tCi0tIyAgaWZkZWYgX19DWUdXSU5fXwotLSAgLyogQ3lnd2luIDIwMDYgZG9lcyBub3QgaGF2ZSBsb2NhbGVzLiAgbmxfbGFuZ2luZm8gKENPREVTRVQpIGFsd2F5cwotLSAgICAgcmV0dXJucyAiVVMtQVNDSUkiLiAgQXMgbG9uZyBhcyB0aGlzIGlzIG5vdCBmaXhlZCwgcmV0dXJuIHRoZSBzdWZmaXgKLS0gICAgIG9mIHRoZSBsb2NhbGUgbmFtZSBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGlmIHByZXNlbnQpIG9yCi0tICAgICB0aGUgY29kZXBhZ2UgYXMgYSBudW1iZXIuICAqLwotLSAgaWYgKGNvZGVzZXQgIT0gTlVMTCAmJiBzdHJjbXAgKGNvZGVzZXQsICJVUy1BU0NJSSIpID09IDApCi0tICAgIHsKLS0gICAgICBjb25zdCBjaGFyICpsb2NhbGU7Ci0tICAgICAgc3RhdGljIGNoYXIgYnVmWzIgKyAxMCArIDFdOwotLQotLSAgICAgIGxvY2FsZSA9IGdldGVudiAoIkxDX0FMTCIpOwotLSAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKLS0JewotLQkgIGxvY2FsZSA9IGdldGVudiAoIkxDX0NUWVBFIik7Ci0tCSAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotLQkgICAgbG9jYWxlID0gZ2V0ZW52ICgiTEFORyIpOwotLQl9Ci0tICAgICAgaWYgKGxvY2FsZSAhPSBOVUxMICYmIGxvY2FsZVswXSAhPSAnXDAnKQotLQl7Ci0tCSAgLyogSWYgdGhlIGxvY2FsZSBuYW1lIGNvbnRhaW5zIGFuIGVuY29kaW5nIGFmdGVyIHRoZSBkb3QsIHJldHVybgotLQkgICAgIGl0LiAgKi8KLS0JICBjb25zdCBjaGFyICpkb3QgPSBzdHJjaHIgKGxvY2FsZSwgJy4nKTsKLS0KLS0JICBpZiAoZG90ICE9IE5VTEwpCi0tCSAgICB7Ci0tCSAgICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyOwotLQotLQkgICAgICBkb3QrKzsKLS0JICAgICAgLyogTG9vayBmb3IgdGhlIHBvc3NpYmxlIEAuLi4gdHJhaWxlciBhbmQgcmVtb3ZlIGl0LCBpZiBhbnkuICAqLwotLQkgICAgICBtb2RpZmllciA9IHN0cmNociAoZG90LCAnQCcpOwotLQkgICAgICBpZiAobW9kaWZpZXIgPT0gTlVMTCkKLS0JCXJldHVybiBkb3Q7Ci0tCSAgICAgIGlmIChtb2RpZmllciAtIGRvdCA8IHNpemVvZiAoYnVmKSkKLS0JCXsKLS0JCSAgbWVtY3B5IChidWYsIGRvdCwgbW9kaWZpZXIgLSBkb3QpOwotLQkJICBidWYgW21vZGlmaWVyIC0gZG90XSA9ICdcMCc7Ci0tCQkgIHJldHVybiBidWY7Ci0tCQl9Ci0tCSAgICB9Ci0tCX0KLS0KLS0gICAgICAvKiBXb2UzMiBoYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxvY2FsZSdzIGNvZGVwYWdlIGFzIGEgbnVtYmVyLiAgKi8KLS0gICAgICBzcHJpbnRmIChidWYsICJDUCV1IiwgR2V0QUNQICgpKTsKLS0gICAgICBjb2Rlc2V0ID0gYnVmOwotLSAgICB9Ci0tIyAgZW5kaWYKLS0KLS0jIGVsc2UKLS0KLS0gIC8qIE9uIG9sZCBzeXN0ZW1zIHdoaWNoIGxhY2sgaXQsIHVzZSBzZXRsb2NhbGUgb3IgZ2V0ZW52LiAgKi8KLS0gIGNvbnN0IGNoYXIgKmxvY2FsZSA9IE5VTEw7Ci0tCi0tICAvKiBCdXQgbW9zdCBvbGQgc3lzdGVtcyBkb24ndCBoYXZlIGEgY29tcGxldGUgc2V0IG9mIGxvY2FsZXMuICBTb21lCi0tICAgICAobGlrZSBTdW5PUyA0IG9yIERKR1BQKSBoYXZlIG9ubHkgdGhlIEMgbG9jYWxlLiAgVGhlcmVmb3JlIHdlIGRvbid0Ci0tICAgICB1c2Ugc2V0bG9jYWxlIGhlcmU7IGl0IHdvdWxkIHJldHVybiAiQyIgd2hlbiBpdCBkb2Vzbid0IHN1cHBvcnQgdGhlCi0tICAgICBsb2NhbGUgbmFtZSB0aGUgdXNlciBoYXMgc2V0LiAgKi8KLS0jICBpZiAwCi0tICBsb2NhbGUgPSBzZXRsb2NhbGUgKExDX0NUWVBFLCBOVUxMKTsKLS0jICBlbmRpZgotLSAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotLSAgICB7Ci0tICAgICAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQUxMIik7Ci0tICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotLQl7Ci0tCSAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQ1RZUEUiKTsKLS0JICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCi0tCSAgICBsb2NhbGUgPSBnZXRlbnYgKCJMQU5HIik7Ci0tCX0KLS0gICAgfQotLQotLSAgLyogT24gc29tZSBvbGQgc3lzdGVtcywgb25lIHVzZWQgdG8gc2V0IGxvY2FsZSA9ICJpc284ODU5XzEiLiBPbiBvdGhlcnMsCi0tICAgICB5b3Ugc2V0IGl0IHRvICJsYW5ndWFnZV9DT1VOVFJZLmNoYXJzZXQiLiBJbiBhbnkgY2FzZSwgd2UgcmVzb2x2ZSBpdAotLSAgICAgdGhyb3VnaCB0aGUgY2hhcnNldC5hbGlhcyBmaWxlLiAgKi8KLS0gIGNvZGVzZXQgPSBsb2NhbGU7Ci0tCi0tIyBlbmRpZgotLQotLSNlbGlmIGRlZmluZWQgV0lOMzJfTkFUSVZFCi0tCi0tICBzdGF0aWMgY2hhciBidWZbMiArIDEwICsgMV07Ci0tCi0tICAvKiBXb2UzMiBoYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxvY2FsZSdzIGNvZGVwYWdlIGFzIGEgbnVtYmVyLiAgKi8KLS0gIHNwcmludGYgKGJ1ZiwgIkNQJXUiLCBHZXRBQ1AgKCkpOwotLSAgY29kZXNldCA9IGJ1ZjsKLS0KLS0jZWxpZiBkZWZpbmVkIE9TMgotLQotLSAgY29uc3QgY2hhciAqbG9jYWxlOwotLSAgc3RhdGljIGNoYXIgYnVmWzIgKyAxMCArIDFdOwotLSAgVUxPTkcgY3BbM107Ci0tICBVTE9ORyBjcGxlbjsKLS0KLS0gIC8qIEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgdGhlIGNvZGVzZXQsIGFzIHNldCBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSwKLS0gICAgIHdpdGggc3RhbmRhcmQgbGFuZ3VhZ2UgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgKi8KLS0gIGxvY2FsZSA9IGdldGVudiAoIkxDX0FMTCIpOwotLSAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotLSAgICB7Ci0tICAgICAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQ1RZUEUiKTsKLS0gICAgICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCi0tCWxvY2FsZSA9IGdldGVudiAoIkxBTkciKTsKLS0gICAgfQotLSAgaWYgKGxvY2FsZSAhPSBOVUxMICYmIGxvY2FsZVswXSAhPSAnXDAnKQotLSAgICB7Ci0tICAgICAgLyogSWYgdGhlIGxvY2FsZSBuYW1lIGNvbnRhaW5zIGFuIGVuY29kaW5nIGFmdGVyIHRoZSBkb3QsIHJldHVybiBpdC4gICovCi0tICAgICAgY29uc3QgY2hhciAqZG90ID0gc3RyY2hyIChsb2NhbGUsICcuJyk7Ci0tCi0tICAgICAgaWYgKGRvdCAhPSBOVUxMKQotLQl7Ci0tCSAgY29uc3QgY2hhciAqbW9kaWZpZXI7Ci0tCi0tCSAgZG90Kys7Ci0tCSAgLyogTG9vayBmb3IgdGhlIHBvc3NpYmxlIEAuLi4gdHJhaWxlciBhbmQgcmVtb3ZlIGl0LCBpZiBhbnkuICAqLwotLQkgIG1vZGlmaWVyID0gc3RyY2hyIChkb3QsICdAJyk7Ci0tCSAgaWYgKG1vZGlmaWVyID09IE5VTEwpCi0tCSAgICByZXR1cm4gZG90OwotLQkgIGlmIChtb2RpZmllciAtIGRvdCA8IHNpemVvZiAoYnVmKSkKLS0JICAgIHsKLS0JICAgICAgbWVtY3B5IChidWYsIGRvdCwgbW9kaWZpZXIgLSBkb3QpOwotLQkgICAgICBidWYgW21vZGlmaWVyIC0gZG90XSA9ICdcMCc7Ci0tCSAgICAgIHJldHVybiBidWY7Ci0tCSAgICB9Ci0tCX0KLS0KLS0gICAgICAvKiBSZXNvbHZlIHRocm91Z2ggdGhlIGNoYXJzZXQuYWxpYXMgZmlsZS4gICovCi0tICAgICAgY29kZXNldCA9IGxvY2FsZTsKLS0gICAgfQotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgLyogT1MvMiBoYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxvY2FsZSdzIGNvZGVwYWdlIGFzIGEgbnVtYmVyLiAgKi8KLS0gICAgICBpZiAoRG9zUXVlcnlDcCAoc2l6ZW9mIChjcCksIGNwLCAmY3BsZW4pKQotLQljb2Rlc2V0ID0gIiI7Ci0tICAgICAgZWxzZQotLQl7Ci0tCSAgc3ByaW50ZiAoYnVmLCAiQ1AldSIsIGNwWzBdKTsKLS0JICBjb2Rlc2V0ID0gYnVmOwotLQl9Ci0tICAgIH0KLS0KLS0jZW5kaWYKLS0KLS0gIGlmIChjb2Rlc2V0ID09IE5VTEwpCi0tICAgIC8qIFRoZSBjYW5vbmljYWwgbmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4gICovCi0tICAgIGNvZGVzZXQgPSAiIjsKLS0KLS0gIC8qIFJlc29sdmUgYWxpYXMuICovCi0tICBmb3IgKGFsaWFzZXMgPSBnZXRfY2hhcnNldF9hbGlhc2VzICgpOwotLSAgICAgICAqYWxpYXNlcyAhPSAnXDAnOwotLSAgICAgICBhbGlhc2VzICs9IHN0cmxlbiAoYWxpYXNlcykgKyAxLCBhbGlhc2VzICs9IHN0cmxlbiAoYWxpYXNlcykgKyAxKQotLSAgICBpZiAoc3RyY21wIChjb2Rlc2V0LCBhbGlhc2VzKSA9PSAwCi0tCXx8IChhbGlhc2VzWzBdID09ICcqJyAmJiBhbGlhc2VzWzFdID09ICdcMCcpKQotLSAgICAgIHsKLS0JY29kZXNldCA9IGFsaWFzZXMgKyBzdHJsZW4gKGFsaWFzZXMpICsgMTsKLS0JYnJlYWs7Ci0tICAgICAgfQotLQotLSAgLyogRG9uJ3QgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4gIEdOVSBsaWJjIGFuZCBHTlUgbGliaWNvbnYgaW50ZXJwcmV0Ci0tICAgICB0aGUgZW1wdHkgc3RyaW5nIGFzIGRlbm90aW5nICJ0aGUgbG9jYWxlJ3MgY2hhcmFjdGVyIGVuY29kaW5nIiwKLS0gICAgIHRodXMgR05VIGxpYmljb252IHdvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBhIHNlY29uZCB0aW1lLiAgKi8KLS0gIGlmIChjb2Rlc2V0WzBdID09ICdcMCcpCi0tICAgIGNvZGVzZXQgPSAiQVNDSUkiOwotLQotLSAgcmV0dXJuIGNvZGVzZXQ7Ci0tfQotLS0tIGEvaW50bC9sb2NhbGNoYXJzZXQuaAotKysrIC9kZXYvbnVsbAotQEAgLTEsNDIgKzAsMCBAQAotLS8qIERldGVybWluZSBhIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcuCi0tICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDSEFSU0VUIExpYnJhcnkuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZuZGVmIF9MT0NBTENIQVJTRVRfSAotLSNkZWZpbmUgX0xPQ0FMQ0hBUlNFVF9ICi0tCi0tCi0tI2lmZGVmIF9fY3BsdXNwbHVzCi0tZXh0ZXJuICJDIiB7Ci0tI2VuZGlmCi0tCi0tCi0tLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZywgYW5kIGNhbm9uaWNhbGl6ZSBpdAotLSAgIGludG8gb25lIG9mIHRoZSBjYW5vbmljYWwgbmFtZXMgbGlzdGVkIGluIGNvbmZpZy5jaGFyc2V0LgotLSAgIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgZnJlZWQ7IGl0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLgotLSAgIElmIHRoZSBjYW5vbmljYWwgbmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIHJlc3VsdCBpcyBhIG5vbi1jYW5vbmljYWwKLS0gICBuYW1lLiAgKi8KLS1leHRlcm4gY29uc3QgY2hhciAqIGxvY2FsZV9jaGFyc2V0ICh2b2lkKTsKLS0KLS0KLS0jaWZkZWYgX19jcGx1c3BsdXMKLS19Ci0tI2VuZGlmCi0tCi0tCi0tI2VuZGlmIC8qIF9MT0NBTENIQVJTRVRfSCAqLwotLS0tIGEvaW50bC9sb2NhbGUuYWxpYXMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDc3ICswLDAgQEAKLS0jIExvY2FsZSBuYW1lIGFsaWFzIGRhdGEgYmFzZS4KLS0jIENvcHlyaWdodCAoQykgMTk5Ni0yMDAxLDIwMDMsMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0jCi0tIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSMgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSMgYW55IGxhdGVyIHZlcnNpb24uCi0tIwotLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0jIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLSMKLS0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tIyBVU0EuCi0tCi0tIyBUaGUgZm9ybWF0IG9mIHRoaXMgZmlsZSBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBvZgotLSMgdGhlIFggV2luZG93IFN5c3RlbSwgd2hpY2ggbm9ybWFsbHkgY2FuIGJlIGZvdW5kIGluCi0tIwkvdXNyL2xpYi9YMTEvbG9jYWxlL2xvY2FsZS5hbGlhcwotLSMgQSBzaW5nbGUgbGluZSBjb250YWlucyB0d28gZmllbGRzOiBhbiBhbGlhcyBhbmQgYSBzdWJzdGl0dXRpb24gdmFsdWUuCi0tIyBBbGwgZW50cmllcyBhcmUgY2FzZSBpbmRlcGVuZGVudC4KLS0KLS0jIE5vdGU6IFRoaXMgZmlsZSBpcyBvYnNvbGV0ZSBhbmQgaXMga2VwdCBhcm91bmQgZm9yIHRoZSB0aW1lIGJlaW5nIGZvcgotLSMgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIE5vYm9keSBzaG91bGQgcmVseSBvbiB0aGUgbmFtZXMgZGVmaW5lZCBoZXJlLgotLSMgTG9jYWxlcyBzaG91bGQgYWx3YXlzIGJlIHNwZWNpZmllZCBieSB0aGVpciBmdWxsIG5hbWUuCi0tCi0tIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6IAotLQotLWJva21hbAkJbmJfTk8uSVNPLTg4NTktMQotLWJva23lbAkJbmJfTk8uSVNPLTg4NTktMQotLWNhdGFsYW4JCWNhX0VTLklTTy04ODU5LTEKLS1jcm9hdGlhbglocl9IUi5JU08tODg1OS0yCi0tY3plY2gJCWNzX0NaLklTTy04ODU5LTIKLS1kYW5pc2ggICAgICAgICAgZGFfREsuSVNPLTg4NTktMQotLWRhbnNrCQlkYV9ESy5JU08tODg1OS0xCi0tZGV1dHNjaAkJZGVfREUuSVNPLTg4NTktMQotLWR1dGNoCQlubF9OTC5JU08tODg1OS0xCi0tZWVzdGkJCWV0X0VFLklTTy04ODU5LTEKLS1lc3RvbmlhbglldF9FRS5JU08tODg1OS0xCi0tZmlubmlzaCAgICAgICAgIGZpX0ZJLklTTy04ODU5LTEKLS1mcmFu52Fpcwlmcl9GUi5JU08tODg1OS0xCi0tZnJlbmNoCQlmcl9GUi5JU08tODg1OS0xCi0tZ2FsZWdvCQlnbF9FUy5JU08tODg1OS0xCi0tZ2FsaWNpYW4JZ2xfRVMuSVNPLTg4NTktMQotLWdlcm1hbgkJZGVfREUuSVNPLTg4NTktMQotLWdyZWVrICAgICAgICAgICBlbF9HUi5JU08tODg1OS03Ci0taGVicmV3ICAgICAgICAgIGhlX0lMLklTTy04ODU5LTgKLS1ocnZhdHNraQlocl9IUi5JU08tODg1OS0yCi0taHVuZ2FyaWFuICAgICAgIGh1X0hVLklTTy04ODU5LTIKLS1pY2VsYW5kaWMgICAgICAgaXNfSVMuSVNPLTg4NTktMQotLWl0YWxpYW4gICAgICAgICBpdF9JVC5JU08tODg1OS0xCi0tamFwYW5lc2UJamFfSlAuZXVjSlAKLS1qYXBhbmVzZS5ldWMJamFfSlAuZXVjSlAKLS1qYV9KUAkJamFfSlAuZXVjSlAKLS1qYV9KUC51amlzCWphX0pQLmV1Y0pQCi0tamFwYW5lc2Uuc2ppcwlqYV9KUC5TSklTCi0ta29yZWFuCQlrb19LUi5ldWNLUgotLWtvcmVhbi5ldWMgCWtvX0tSLmV1Y0tSCi0ta29fS1IJCWtvX0tSLmV1Y0tSCi0tbGl0aHVhbmlhbiAgICAgIGx0X0xULklTTy04ODU5LTEzCi0tbm9fTk8JCW5iX05PLklTTy04ODU5LTEKLS1ub19OTy5JU08tODg1OS0xIG5iX05PLklTTy04ODU5LTEKLS1ub3J3ZWdpYW4gICAgICAgbmJfTk8uSVNPLTg4NTktMQotLW55bm9yc2sJCW5uX05PLklTTy04ODU5LTEKLS1wb2xpc2ggICAgICAgICAgcGxfUEwuSVNPLTg4NTktMgotLXBvcnR1Z3Vlc2UgICAgICBwdF9QVC5JU08tODg1OS0xCi0tcm9tYW5pYW4gICAgICAgIHJvX1JPLklTTy04ODU5LTIKLS1ydXNzaWFuICAgICAgICAgcnVfUlUuSVNPLTg4NTktNQotLXNsb3ZhayAgICAgICAgICBza19TSy5JU08tODg1OS0yCi0tc2xvdmVuZSAgICAgICAgIHNsX1NJLklTTy04ODU5LTIKLS1zbG92ZW5pYW4gICAgICAgc2xfU0kuSVNPLTg4NTktMgotLXNwYW5pc2ggICAgICAgICBlc19FUy5JU08tODg1OS0xCi0tc3dlZGlzaCAgICAgICAgIHN2X1NFLklTTy04ODU5LTEKLS10aGFpCQl0aF9USC5USVMtNjIwCi0tdHVya2lzaCAgICAgICAgIHRyX1RSLklTTy04ODU5LTkKLS0tLSBhL2ludGwvbG9jYWxlYWxpYXMuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsNDM5ICswLDAgQEAKLS0vKiBIYW5kbGUgYWxpYXNlcyBmb3IgbG9jYWxlIG5hbWVzLgotLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDEsIDIwMDMsIDIwMDUtMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIG1lbXBjcHkoKS4KLS0gICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKLS0gICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCi0tI2lmbmRlZiBfR05VX1NPVVJDRQotLSMgZGVmaW5lIF9HTlVfU09VUkNFICAgIDEKLS0jZW5kaWYKLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPGN0eXBlLmg+Ci0tI2luY2x1ZGUgPHN0ZGlvLmg+Ci0tI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX19fRlNFVExPQ0tJTkcKLS0jIGluY2x1ZGUgPHN0ZGlvX2V4dC5oPgotLSNlbmRpZgotLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLS0KLS0jaWZkZWYgX19HTlVDX18KLS0jIHVuZGVmIGFsbG9jYQotLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0tIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQotLSNlbHNlCi0tIyBpZmRlZiBfTVNDX1ZFUgotLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotLSMgZWxzZQotLSMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCi0tIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotLSMgIGVsc2UKLS0jICAgaWZkZWYgX0FJWAotLSAjcHJhZ21hIGFsbG9jYQotLSMgICBlbHNlCi0tIyAgICBpZm5kZWYgYWxsb2NhCi0tY2hhciAqYWxsb2NhICgpOwotLSMgICAgZW5kaWYKLS0jICAgZW5kaWYKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tI2luY2x1ZGUgPHN0cmluZy5oPgotLQotLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotLQotLSNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKLS0jIGluY2x1ZGUgInJlbG9jYXRhYmxlLmgiCi0tI2Vsc2UKLS0jIGRlZmluZSByZWxvY2F0ZShwYXRobmFtZSkgKHBhdGhuYW1lKQotLSNlbmRpZgotLQotLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS0KLS0jaWZkZWYgX0xJQkMKLS0vKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLS0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0tICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotLSMgZGVmaW5lIHN0cmNhc2VjbXAgX19zdHJjYXNlY21wCi0tCi0tIyBpZm5kZWYgbWVtcGNweQotLSMgIGRlZmluZSBtZW1wY3B5IF9fbWVtcGNweQotLSMgZW5kaWYKLS0jIGRlZmluZSBIQVZFX01FTVBDUFkJMQotLSMgZGVmaW5lIEhBVkVfX19GU0VUTE9DS0lORwkxCi0tI2VuZGlmCi0tCi0tLyogSGFuZGxlIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgotLSNlbHNlCi0tIyBpbmNsdWRlICJsb2NrLmgiCi0tI2VuZGlmCi0tCi0tI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgotLSMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCi0tI2VuZGlmCi0tCi0tLyogU29tZSBvcHRpbWl6YXRpb25zIGZvciBnbGliYy4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBkZWZpbmUgRkVPRihmcCkJCWZlb2ZfdW5sb2NrZWQgKGZwKQotLSMgZGVmaW5lIEZHRVRTKGJ1ZiwgbiwgZnApCWZnZXRzX3VubG9ja2VkIChidWYsIG4sIGZwKQotLSNlbHNlCi0tIyBkZWZpbmUgRkVPRihmcCkJCWZlb2YgKGZwKQotLSMgZGVmaW5lIEZHRVRTKGJ1ZiwgbiwgZnApCWZnZXRzIChidWYsIG4sIGZwKQotLSNlbmRpZgotLQotLS8qIEZvciB0aG9zZSBsb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCi0tICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KLS0jaWZkZWYgSEFWRV9BTExPQ0EKLS0jIGRlZmluZSBmcmVlYShwKSAvKiBub3RoaW5nICovCi0tI2Vsc2UKLS0jIGRlZmluZSBhbGxvY2EobikgbWFsbG9jIChuKQotLSMgZGVmaW5lIGZyZWVhKHApIGZyZWUgKHApCi0tI2VuZGlmCi0tCi0tI2lmIGRlZmluZWQgX0xJQkNfUkVFTlRSQU5UIHx8IEhBVkVfREVDTF9GR0VUU19VTkxPQ0tFRAotLSMgdW5kZWYgZmdldHMKLS0jIGRlZmluZSBmZ2V0cyhidWYsIGxlbiwgcykgZmdldHNfdW5sb2NrZWQgKGJ1ZiwgbGVuLCBzKQotLSNlbmRpZgotLSNpZiBkZWZpbmVkIF9MSUJDX1JFRU5UUkFOVCB8fCBIQVZFX0RFQ0xfRkVPRl9VTkxPQ0tFRAotLSMgdW5kZWYgZmVvZgotLSMgZGVmaW5lIGZlb2YocykgZmVvZl91bmxvY2tlZCAocykKLS0jZW5kaWYKLS0KLS0KLS1fX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKHN0YXRpYywgbG9jaykKLS0KLS0KLS1zdHJ1Y3QgYWxpYXNfbWFwCi0tewotLSAgY29uc3QgY2hhciAqYWxpYXM7Ci0tICBjb25zdCBjaGFyICp2YWx1ZTsKLS19OwotLQotLQotLSNpZm5kZWYgX0xJQkMKLS0jIGRlZmluZSBsaWJjX2ZyZWVyZXNfcHRyKGRlY2wpIGRlY2wKLS0jZW5kaWYKLS0KLS1saWJjX2ZyZWVyZXNfcHRyIChzdGF0aWMgY2hhciAqc3RyaW5nX3NwYWNlKTsKLS1zdGF0aWMgc2l6ZV90IHN0cmluZ19zcGFjZV9hY3Q7Ci0tc3RhdGljIHNpemVfdCBzdHJpbmdfc3BhY2VfbWF4OwotLWxpYmNfZnJlZXJlc19wdHIgKHN0YXRpYyBzdHJ1Y3QgYWxpYXNfbWFwICptYXApOwotLXN0YXRpYyBzaXplX3Qgbm1hcDsKLS1zdGF0aWMgc2l6ZV90IG1heG1hcDsKLS0KLS0KLS0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotLXN0YXRpYyBzaXplX3QgcmVhZF9hbGlhc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikKLS0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotLXN0YXRpYyBpbnQgZXh0ZW5kX2FsaWFzX3RhYmxlICh2b2lkKTsKLS1zdGF0aWMgaW50IGFsaWFzX2NvbXBhcmUgKGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDEsCi0tCQkJICBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyKTsKLS0KLS0KLS1jb25zdCBjaGFyICoKLS1fbmxfZXhwYW5kX2FsaWFzIChjb25zdCBjaGFyICpuYW1lKQotLXsKLS0gIHN0YXRpYyBjb25zdCBjaGFyICpsb2NhbGVfYWxpYXNfcGF0aDsKLS0gIHN0cnVjdCBhbGlhc19tYXAgKnJldHZhbDsKLS0gIGNvbnN0IGNoYXIgKnJlc3VsdCA9IE5VTEw7Ci0tICBzaXplX3QgYWRkZWQ7Ci0tCi0tICBfX2xpYmNfbG9ja19sb2NrIChsb2NrKTsKLS0KLS0gIGlmIChsb2NhbGVfYWxpYXNfcGF0aCA9PSBOVUxMKQotLSAgICBsb2NhbGVfYWxpYXNfcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOwotLQotLSAgZG8KLS0gICAgewotLSAgICAgIHN0cnVjdCBhbGlhc19tYXAgaXRlbTsKLS0KLS0gICAgICBpdGVtLmFsaWFzID0gbmFtZTsKLS0KLS0gICAgICBpZiAobm1hcCA+IDApCi0tCXJldHZhbCA9IChzdHJ1Y3QgYWxpYXNfbWFwICopIGJzZWFyY2ggKCZpdGVtLCBtYXAsIG5tYXAsCi0tCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKLS0JCQkJCSAgICAgICAoaW50ICgqKSAoY29uc3Qgdm9pZCAqLAotLQkJCQkJCQkgY29uc3Qgdm9pZCAqKQotLQkJCQkJCSkgYWxpYXNfY29tcGFyZSk7Ci0tICAgICAgZWxzZQotLQlyZXR2YWwgPSBOVUxMOwotLQotLSAgICAgIC8qIFdlIHJlYWxseSBmb3VuZCBhbiBhbGlhcy4gIFJldHVybiB0aGUgdmFsdWUuICAqLwotLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLS0JewotLQkgIHJlc3VsdCA9IHJldHZhbC0+dmFsdWU7Ci0tCSAgYnJlYWs7Ci0tCX0KLS0KLS0gICAgICAvKiBQZXJoYXBzIHdlIGNhbiBmaW5kIGFub3RoZXIgYWxpYXMgZmlsZS4gICovCi0tICAgICAgYWRkZWQgPSAwOwotLSAgICAgIHdoaWxlIChhZGRlZCA9PSAwICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcpCi0tCXsKLS0JICBjb25zdCBjaGFyICpzdGFydDsKLS0KLS0JICB3aGlsZSAobG9jYWxlX2FsaWFzX3BhdGhbMF0gPT0gUEFUSF9TRVBBUkFUT1IpCi0tCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOwotLQkgIHN0YXJ0ID0gbG9jYWxlX2FsaWFzX3BhdGg7Ci0tCi0tCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcKLS0JCSAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSBQQVRIX1NFUEFSQVRPUikKLS0JICAgICsrbG9jYWxlX2FsaWFzX3BhdGg7Ci0tCi0tCSAgaWYgKHN0YXJ0IDwgbG9jYWxlX2FsaWFzX3BhdGgpCi0tCSAgICBhZGRlZCA9IHJlYWRfYWxpYXNfZmlsZSAoc3RhcnQsIGxvY2FsZV9hbGlhc19wYXRoIC0gc3RhcnQpOwotLQl9Ci0tICAgIH0KLS0gIHdoaWxlIChhZGRlZCAhPSAwKTsKLS0KLS0gIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7Ci0tCi0tICByZXR1cm4gcmVzdWx0OwotLX0KLS0KLS0KLS1zdGF0aWMgc2l6ZV90Ci0taW50ZXJuYWxfZnVuY3Rpb24KLS1yZWFkX2FsaWFzX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZm5hbWVfbGVuKQotLXsKLS0gIEZJTEUgKmZwOwotLSAgY2hhciAqZnVsbF9mbmFtZTsKLS0gIHNpemVfdCBhZGRlZDsKLS0gIHN0YXRpYyBjb25zdCBjaGFyIGFsaWFzZmlsZVtdID0gIi9sb2NhbGUuYWxpYXMiOwotLQotLSAgZnVsbF9mbmFtZSA9IChjaGFyICopIGFsbG9jYSAoZm5hbWVfbGVuICsgc2l6ZW9mIGFsaWFzZmlsZSk7Ci0tI2lmZGVmIEhBVkVfTUVNUENQWQotLSAgbWVtcGNweSAobWVtcGNweSAoZnVsbF9mbmFtZSwgZm5hbWUsIGZuYW1lX2xlbiksCi0tCSAgIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7Ci0tI2Vsc2UKLS0gIG1lbWNweSAoZnVsbF9mbmFtZSwgZm5hbWUsIGZuYW1lX2xlbik7Ci0tICBtZW1jcHkgKCZmdWxsX2ZuYW1lW2ZuYW1lX2xlbl0sIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7Ci0tI2VuZGlmCi0tCi0tI2lmZGVmIF9MSUJDCi0tICAvKiBOb3RlIHRoZSBmaWxlIGlzIG9wZW5lZCB3aXRoIGNhbmNlbGxhdGlvbiBpbiB0aGUgSS9PIGZ1bmN0aW9ucwotLSAgICAgZGlzYWJsZWQuICAqLwotLSAgZnAgPSBmb3BlbiAocmVsb2NhdGUgKGZ1bGxfZm5hbWUpLCAicmMiKTsKLS0jZWxzZQotLSAgZnAgPSBmb3BlbiAocmVsb2NhdGUgKGZ1bGxfZm5hbWUpLCAiciIpOwotLSNlbmRpZgotLSAgZnJlZWEgKGZ1bGxfZm5hbWUpOwotLSAgaWYgKGZwID09IE5VTEwpCi0tICAgIHJldHVybiAwOwotLQotLSNpZmRlZiBIQVZFX19fRlNFVExPQ0tJTkcKLS0gIC8qIE5vIHRocmVhZHMgcHJlc2VudC4gICovCi0tICBfX2ZzZXRsb2NraW5nIChmcCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotLSNlbmRpZgotLQotLSAgYWRkZWQgPSAwOwotLSAgd2hpbGUgKCFGRU9GIChmcCkpCi0tICAgIHsKLS0gICAgICAvKiBJdCBpcyBhIHJlYXNvbmFibGUgYXBwcm9hY2ggdG8gdXNlIGEgZml4IGJ1ZmZlciBoZXJlIGJlY2F1c2UKLS0JIGEpIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0IHR3byBmaWVsZHMKLS0JIGIpIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHVzYWJsZSBhcyBmaWxlIG5hbWVzIGFuZCBzbyBtdXN0IG5vdAotLQkgICAgYmUgdGhhdCBsb25nCi0tCSBXZSBhdm9pZCBhIG11bHRpLWtpbG9ieXRlIGJ1ZmZlciBoZXJlIHNpbmNlIHRoaXMgd291bGQgdXNlIHVwCi0tCSBzdGFjayBzcGFjZSB3aGljaCB3ZSBtaWdodCBub3QgaGF2ZSBpZiB0aGUgcHJvZ3JhbSByYW4gb3V0IG9mCi0tCSBtZW1vcnkuICAqLwotLSAgICAgIGNoYXIgYnVmWzQwMF07Ci0tICAgICAgY2hhciAqYWxpYXM7Ci0tICAgICAgY2hhciAqdmFsdWU7Ci0tICAgICAgY2hhciAqY3A7Ci0tICAgICAgaW50IGNvbXBsZXRlX2xpbmU7Ci0tCi0tICAgICAgaWYgKEZHRVRTIChidWYsIHNpemVvZiBidWYsIGZwKSA9PSBOVUxMKQotLQkvKiBFT0YgcmVhY2hlZC4gICovCi0tCWJyZWFrOwotLQotLSAgICAgIC8qIERldGVybWluZSB3aGV0aGVyIHRoZSBsaW5lIGlzIGNvbXBsZXRlLiAgKi8KLS0gICAgICBjb21wbGV0ZV9saW5lID0gc3RyY2hyIChidWYsICdcbicpICE9IE5VTEw7Ci0tCi0tICAgICAgY3AgPSBidWY7Ci0tICAgICAgLyogSWdub3JlIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLwotLSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3BbMF0pKQotLQkrK2NwOwotLQotLSAgICAgIC8qIEEgbGVhZGluZyAnIycgc2lnbmFscyBhIGNvbW1lbnQgbGluZS4gICovCi0tICAgICAgaWYgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJyMnKQotLQl7Ci0tCSAgYWxpYXMgPSBjcCsrOwotLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3BbMF0pKQotLQkgICAgKytjcDsKLS0JICAvKiBUZXJtaW5hdGUgYWxpYXMgbmFtZS4gICovCi0tCSAgaWYgKGNwWzBdICE9ICdcMCcpCi0tCSAgICAqY3ArKyA9ICdcMCc7Ci0tCi0tCSAgLyogTm93IGxvb2sgZm9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZhbHVlLiAgKi8KLS0JICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKLS0JICAgICsrY3A7Ci0tCi0tCSAgaWYgKGNwWzBdICE9ICdcMCcpCi0tCSAgICB7Ci0tCSAgICAgIHZhbHVlID0gY3ArKzsKLS0JICAgICAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgIWlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCi0tCQkrK2NwOwotLQkgICAgICAvKiBUZXJtaW5hdGUgdmFsdWUuICAqLwotLQkgICAgICBpZiAoY3BbMF0gPT0gJ1xuJykKLS0JCXsKLS0JCSAgLyogVGhpcyBoYXMgdG8gYmUgZG9uZSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgdGVzdAotLQkJICAgICBmb3IgdGhlIGVuZCBvZiBsaW5lIHBvc3NpYmxlLiAgV2UgYXJlIGxvb2tpbmcgZm9yCi0tCQkgICAgIHRoZSB0ZXJtaW5hdGluZyAnXG4nIHdoaWNoIGRvIG5vdCBvdmVyd3JpdGUgaGVyZS4gICovCi0tCQkgICpjcCsrID0gJ1wwJzsKLS0JCSAgKmNwID0gJ1xuJzsKLS0JCX0KLS0JICAgICAgZWxzZSBpZiAoY3BbMF0gIT0gJ1wwJykKLS0JCSpjcCsrID0gJ1wwJzsKLS0KLS0jaWZkZWYgSU5fTElCR0xPQ0FMRQotLQkgICAgICAvKiBnbGliYydzIGxvY2FsZS5hbGlhcyBjb250YWlucyBlbnRyaWVzIGZvciBqYV9KUCBhbmQga29fS1IKLS0JCSB0aGF0IG1ha2UgaXQgaW1wb3NzaWJsZSB0byB1c2UgYSBKYXBhbmVzZSBvciBLb3JlYW4gVVRGLTgKLS0JCSBsb2NhbGUgdW5kZXIgdGhlIG5hbWUgImphX0pQIiBvciAia29fS1IiLiAgSWdub3JlIHRoZXNlCi0tCQkgZW50cmllcy4gICovCi0tCSAgICAgIGlmIChzdHJjaHIgKGFsaWFzLCAnXycpID09IE5VTEwpCi0tI2VuZGlmCi0tCQl7Ci0tCQkgIHNpemVfdCBhbGlhc19sZW47Ci0tCQkgIHNpemVfdCB2YWx1ZV9sZW47Ci0tCi0tCQkgIGlmIChubWFwID49IG1heG1hcCkKLS0JCSAgICBpZiAoX19idWlsdGluX2V4cGVjdCAoZXh0ZW5kX2FsaWFzX3RhYmxlICgpLCAwKSkKLS0JCSAgICAgIGdvdG8gb3V0OwotLQotLQkJICBhbGlhc19sZW4gPSBzdHJsZW4gKGFsaWFzKSArIDE7Ci0tCQkgIHZhbHVlX2xlbiA9IHN0cmxlbiAodmFsdWUpICsgMTsKLS0KLS0JCSAgaWYgKHN0cmluZ19zcGFjZV9hY3QgKyBhbGlhc19sZW4gKyB2YWx1ZV9sZW4gPiBzdHJpbmdfc3BhY2VfbWF4KQotLQkJICAgIHsKLS0JCSAgICAgIC8qIEluY3JlYXNlIHNpemUgb2YgbWVtb3J5IHBvb2wuICAqLwotLQkJICAgICAgc2l6ZV90IG5ld19zaXplID0gKHN0cmluZ19zcGFjZV9tYXgKLS0JCQkJCSArIChhbGlhc19sZW4gKyB2YWx1ZV9sZW4gPiAxMDI0Ci0tCQkJCQkgICAgPyBhbGlhc19sZW4gKyB2YWx1ZV9sZW4gOiAxMDI0KSk7Ci0tCQkgICAgICBjaGFyICpuZXdfcG9vbCA9IChjaGFyICopIHJlYWxsb2MgKHN0cmluZ19zcGFjZSwgbmV3X3NpemUpOwotLQkJICAgICAgaWYgKG5ld19wb29sID09IE5VTEwpCi0tCQkJZ290byBvdXQ7Ci0tCi0tCQkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAoc3RyaW5nX3NwYWNlICE9IG5ld19wb29sLCAwKSkKLS0JCQl7Ci0tCQkJICBzaXplX3QgaTsKLS0KLS0JCQkgIGZvciAoaSA9IDA7IGkgPCBubWFwOyBpKyspCi0tCQkJICAgIHsKLS0JCQkgICAgICBtYXBbaV0uYWxpYXMgKz0gbmV3X3Bvb2wgLSBzdHJpbmdfc3BhY2U7Ci0tCQkJICAgICAgbWFwW2ldLnZhbHVlICs9IG5ld19wb29sIC0gc3RyaW5nX3NwYWNlOwotLQkJCSAgICB9Ci0tCQkJfQotLQotLQkJICAgICAgc3RyaW5nX3NwYWNlID0gbmV3X3Bvb2w7Ci0tCQkgICAgICBzdHJpbmdfc3BhY2VfbWF4ID0gbmV3X3NpemU7Ci0tCQkgICAgfQotLQotLQkJICBtYXBbbm1hcF0uYWxpYXMgPQotLQkJICAgIChjb25zdCBjaGFyICopIG1lbWNweSAoJnN0cmluZ19zcGFjZVtzdHJpbmdfc3BhY2VfYWN0XSwKLS0JCQkJCSAgIGFsaWFzLCBhbGlhc19sZW4pOwotLQkJICBzdHJpbmdfc3BhY2VfYWN0ICs9IGFsaWFzX2xlbjsKLS0KLS0JCSAgbWFwW25tYXBdLnZhbHVlID0KLS0JCSAgICAoY29uc3QgY2hhciAqKSBtZW1jcHkgKCZzdHJpbmdfc3BhY2Vbc3RyaW5nX3NwYWNlX2FjdF0sCi0tCQkJCQkgICB2YWx1ZSwgdmFsdWVfbGVuKTsKLS0JCSAgc3RyaW5nX3NwYWNlX2FjdCArPSB2YWx1ZV9sZW47Ci0tCi0tCQkgICsrbm1hcDsKLS0JCSAgKythZGRlZDsKLS0JCX0KLS0JICAgIH0KLS0JfQotLQotLSAgICAgIC8qIFBvc3NpYmx5IG5vdCB0aGUgd2hvbGUgbGluZSBmaXRzIGludG8gdGhlIGJ1ZmZlci4gIElnbm9yZQotLQkgdGhlIHJlc3Qgb2YgdGhlIGxpbmUuICAqLwotLSAgICAgIGlmICghIGNvbXBsZXRlX2xpbmUpCi0tCWRvCi0tCSAgaWYgKEZHRVRTIChidWYsIHNpemVvZiBidWYsIGZwKSA9PSBOVUxMKQotLQkgICAgLyogTWFrZSBzdXJlIHRoZSBpbm5lciBsb29wIHdpbGwgYmUgbGVmdC4gIFRoZSBvdXRlciBsb29wCi0tCSAgICAgICB3aWxsIGV4aXQgYXQgdGhlIGBmZW9mJyB0ZXN0LiAgKi8KLS0JICAgIGJyZWFrOwotLQl3aGlsZSAoc3RyY2hyIChidWYsICdcbicpID09IE5VTEwpOwotLSAgICB9Ci0tCi0tIG91dDoKLS0gIC8qIFNob3VsZCB3ZSB0ZXN0IGZvciBmZXJyb3IoKT8gIEkgdGhpbmsgd2UgaGF2ZSB0byBzaWxlbnRseSBpZ25vcmUKLS0gICAgIGVycm9ycy4gIC0tZHJlcHBlciAgKi8KLS0gIGZjbG9zZSAoZnApOwotLQotLSAgaWYgKGFkZGVkID4gMCkKLS0gICAgcXNvcnQgKG1hcCwgbm1hcCwgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKLS0JICAgKGludCAoKikgKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkgYWxpYXNfY29tcGFyZSk7Ci0tCi0tICByZXR1cm4gYWRkZWQ7Ci0tfQotLQotLQotLXN0YXRpYyBpbnQKLS1leHRlbmRfYWxpYXNfdGFibGUgKCkKLS17Ci0tICBzaXplX3QgbmV3X3NpemU7Ci0tICBzdHJ1Y3QgYWxpYXNfbWFwICpuZXdfbWFwOwotLQotLSAgbmV3X3NpemUgPSBtYXhtYXAgPT0gMCA/IDEwMCA6IDIgKiBtYXhtYXA7Ci0tICBuZXdfbWFwID0gKHN0cnVjdCBhbGlhc19tYXAgKikgcmVhbGxvYyAobWFwLCAobmV3X3NpemUKLS0JCQkJCQkqIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCkpKTsKLS0gIGlmIChuZXdfbWFwID09IE5VTEwpCi0tICAgIC8qIFNpbXBseSBkb24ndCBleHRlbmQ6IHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY29yZS4gICovCi0tICAgIHJldHVybiAtMTsKLS0KLS0gIG1hcCA9IG5ld19tYXA7Ci0tICBtYXhtYXAgPSBuZXdfc2l6ZTsKLS0gIHJldHVybiAwOwotLX0KLS0KLS0KLS1zdGF0aWMgaW50Ci0tYWxpYXNfY29tcGFyZSAoY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMSwgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMikKLS17Ci0tI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkNBU0VDTVAKLS0gIHJldHVybiBzdHJjYXNlY21wIChtYXAxLT5hbGlhcywgbWFwMi0+YWxpYXMpOwotLSNlbHNlCi0tICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1hcDEtPmFsaWFzOwotLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcDIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBtYXAyLT5hbGlhczsKLS0gIHVuc2lnbmVkIGNoYXIgYzEsIGMyOwotLQotLSAgaWYgKHAxID09IHAyKQotLSAgICByZXR1cm4gMDsKLS0KLS0gIGRvCi0tICAgIHsKLS0gICAgICAvKiBJIGtub3cgdGhpcyBzZWVtcyB0byBiZSBvZGQgYnV0IHRoZSB0b2xvd2VyKCkgZnVuY3Rpb24gaW4KLS0JIHNvbWUgc3lzdGVtcyBsaWJjIGNhbm5vdCBoYW5kbGUgbm9uYWxwaGEgY2hhcmFjdGVycy4gICovCi0tICAgICAgYzEgPSBpc3VwcGVyICgqcDEpID8gdG9sb3dlciAoKnAxKSA6ICpwMTsKLS0gICAgICBjMiA9IGlzdXBwZXIgKCpwMikgPyB0b2xvd2VyICgqcDIpIDogKnAyOwotLSAgICAgIGlmIChjMSA9PSAnXDAnKQotLQlicmVhazsKLS0gICAgICArK3AxOwotLSAgICAgICsrcDI7Ci0tICAgIH0KLS0gIHdoaWxlIChjMSA9PSBjMik7Ci0tCi0tICByZXR1cm4gYzEgLSBjMjsKLS0jZW5kaWYKLS19Ci0tLS0gYS9pbnRsL2xvY2FsZW5hbWUuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMTUwNyArMCwwIEBACi0tLyogRGV0ZXJtaW5lIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsb2NhbGUuCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251Lm9yZz4sIDE5OTUuICAqLwotLS8qIFdpbjMyIGNvZGUgd3JpdHRlbiBieSBUb3IgTGlsbHF2aXN0IDx0bWxAaWtpLmZpPi4gICovCi0tLyogTWFjT1MgWCBjb2RlIHdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiAgKi8KLS0KLS0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0tCi0tLyogU3BlY2lmaWNhdGlvbi4gICovCi0tI2lmZGVmIElOX0xJQklOVEwKLS0jIGluY2x1ZGUgImdldHRleHRQLmgiCi0tI2Vsc2UKLS0jIGluY2x1ZGUgImxvY2FsZW5hbWUuaCIKLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tI2luY2x1ZGUgPGxvY2FsZS5oPgotLQotLSNpZiBIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQgfHwgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFCi0tIyBpbmNsdWRlIDxzdHJpbmcuaD4KLS0jIGluY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGU3RyaW5nLmg+Ci0tIyBpZiBIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQKLS0jICBpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9DRkxvY2FsZS5oPgotLSMgZWxpZiBIQVZFX0NGUFJFRkVSRU5DRVNDT1BZQVBQVkFMVUUKLS0jICBpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9DRlByZWZlcmVuY2VzLmg+Ci0tIyBlbmRpZgotLSNlbmRpZgotLQotLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXwotLSMgZGVmaW5lIFdJTjMyX05BVElWRQotLSNlbmRpZgotLQotLSNpZmRlZiBXSU4zMl9OQVRJVkUKLS0jIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0tIyBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0tLyogTGlzdCBvZiBsYW5ndWFnZSBjb2Rlcywgc29ydGVkIGJ5IHZhbHVlOgotLSAgIDB4MDEgTEFOR19BUkFCSUMKLS0gICAweDAyIExBTkdfQlVMR0FSSUFOCi0tICAgMHgwMyBMQU5HX0NBVEFMQU4KLS0gICAweDA0IExBTkdfQ0hJTkVTRQotLSAgIDB4MDUgTEFOR19DWkVDSAotLSAgIDB4MDYgTEFOR19EQU5JU0gKLS0gICAweDA3IExBTkdfR0VSTUFOCi0tICAgMHgwOCBMQU5HX0dSRUVLCi0tICAgMHgwOSBMQU5HX0VOR0xJU0gKLS0gICAweDBhIExBTkdfU1BBTklTSAotLSAgIDB4MGIgTEFOR19GSU5OSVNICi0tICAgMHgwYyBMQU5HX0ZSRU5DSAotLSAgIDB4MGQgTEFOR19IRUJSRVcKLS0gICAweDBlIExBTkdfSFVOR0FSSUFOCi0tICAgMHgwZiBMQU5HX0lDRUxBTkRJQwotLSAgIDB4MTAgTEFOR19JVEFMSUFOCi0tICAgMHgxMSBMQU5HX0pBUEFORVNFCi0tICAgMHgxMiBMQU5HX0tPUkVBTgotLSAgIDB4MTMgTEFOR19EVVRDSAotLSAgIDB4MTQgTEFOR19OT1JXRUdJQU4KLS0gICAweDE1IExBTkdfUE9MSVNICi0tICAgMHgxNiBMQU5HX1BPUlRVR1VFU0UKLS0gICAweDE3IExBTkdfUkhBRVRPX1JPTUFOQ0UKLS0gICAweDE4IExBTkdfUk9NQU5JQU4KLS0gICAweDE5IExBTkdfUlVTU0lBTgotLSAgIDB4MWEgTEFOR19DUk9BVElBTiA9PSBMQU5HX1NFUkJJQU4KLS0gICAweDFiIExBTkdfU0xPVkFLCi0tICAgMHgxYyBMQU5HX0FMQkFOSUFOCi0tICAgMHgxZCBMQU5HX1NXRURJU0gKLS0gICAweDFlIExBTkdfVEhBSQotLSAgIDB4MWYgTEFOR19UVVJLSVNICi0tICAgMHgyMCBMQU5HX1VSRFUKLS0gICAweDIxIExBTkdfSU5ET05FU0lBTgotLSAgIDB4MjIgTEFOR19VS1JBSU5JQU4KLS0gICAweDIzIExBTkdfQkVMQVJVU0lBTgotLSAgIDB4MjQgTEFOR19TTE9WRU5JQU4KLS0gICAweDI1IExBTkdfRVNUT05JQU4KLS0gICAweDI2IExBTkdfTEFUVklBTgotLSAgIDB4MjcgTEFOR19MSVRIVUFOSUFOCi0tICAgMHgyOCBMQU5HX1RBSklLCi0tICAgMHgyOSBMQU5HX0ZBUlNJCi0tICAgMHgyYSBMQU5HX1ZJRVROQU1FU0UKLS0gICAweDJiIExBTkdfQVJNRU5JQU4KLS0gICAweDJjIExBTkdfQVpFUkkKLS0gICAweDJkIExBTkdfQkFTUVVFCi0tICAgMHgyZSBMQU5HX1NPUkJJQU4KLS0gICAweDJmIExBTkdfTUFDRURPTklBTgotLSAgIDB4MzAgTEFOR19TVVRVCi0tICAgMHgzMSBMQU5HX1RTT05HQQotLSAgIDB4MzIgTEFOR19UU1dBTkEKLS0gICAweDMzIExBTkdfVkVOREEKLS0gICAweDM0IExBTkdfWEhPU0EKLS0gICAweDM1IExBTkdfWlVMVQotLSAgIDB4MzYgTEFOR19BRlJJS0FBTlMKLS0gICAweDM3IExBTkdfR0VPUkdJQU4KLS0gICAweDM4IExBTkdfRkFFUk9FU0UKLS0gICAweDM5IExBTkdfSElOREkKLS0gICAweDNhIExBTkdfTUFMVEVTRQotLSAgIDB4M2IgTEFOR19TQUFNSQotLSAgIDB4M2MgTEFOR19HQUVMSUMKLS0gICAweDNkIExBTkdfWUlERElTSAotLSAgIDB4M2UgTEFOR19NQUxBWQotLSAgIDB4M2YgTEFOR19LQVpBSwotLSAgIDB4NDAgTEFOR19LWVJHWVoKLS0gICAweDQxIExBTkdfU1dBSElMSQotLSAgIDB4NDIgTEFOR19UVVJLTUVOCi0tICAgMHg0MyBMQU5HX1VaQkVLCi0tICAgMHg0NCBMQU5HX1RBVEFSCi0tICAgMHg0NSBMQU5HX0JFTkdBTEkKLS0gICAweDQ2IExBTkdfUFVOSkFCSQotLSAgIDB4NDcgTEFOR19HVUpBUkFUSQotLSAgIDB4NDggTEFOR19PUklZQQotLSAgIDB4NDkgTEFOR19UQU1JTAotLSAgIDB4NGEgTEFOR19URUxVR1UKLS0gICAweDRiIExBTkdfS0FOTkFEQQotLSAgIDB4NGMgTEFOR19NQUxBWUFMQU0KLS0gICAweDRkIExBTkdfQVNTQU1FU0UKLS0gICAweDRlIExBTkdfTUFSQVRISQotLSAgIDB4NGYgTEFOR19TQU5TS1JJVAotLSAgIDB4NTAgTEFOR19NT05HT0xJQU4KLS0gICAweDUxIExBTkdfVElCRVRBTgotLSAgIDB4NTIgTEFOR19XRUxTSAotLSAgIDB4NTMgTEFOR19DQU1CT0RJQU4KLS0gICAweDU0IExBTkdfTEFPCi0tICAgMHg1NSBMQU5HX0JVUk1FU0UKLS0gICAweDU2IExBTkdfR0FMSUNJQU4KLS0gICAweDU3IExBTkdfS09OS0FOSQotLSAgIDB4NTggTEFOR19NQU5JUFVSSQotLSAgIDB4NTkgTEFOR19TSU5ESEkKLS0gICAweDVhIExBTkdfU1lSSUFDCi0tICAgMHg1YiBMQU5HX1NJTkhBTEVTRQotLSAgIDB4NWMgTEFOR19DSEVST0tFRQotLSAgIDB4NWQgTEFOR19JTlVLVElUVVQKLS0gICAweDVlIExBTkdfQU1IQVJJQwotLSAgIDB4NWYgTEFOR19UQU1BWklHSFQKLS0gICAweDYwIExBTkdfS0FTSE1JUkkKLS0gICAweDYxIExBTkdfTkVQQUxJCi0tICAgMHg2MiBMQU5HX0ZSSVNJQU4KLS0gICAweDYzIExBTkdfUEFTSFRPCi0tICAgMHg2NCBMQU5HX1RBR0FMT0cKLS0gICAweDY1IExBTkdfRElWRUhJCi0tICAgMHg2NiBMQU5HX0VETwotLSAgIDB4NjcgTEFOR19GVUxGVUxERQotLSAgIDB4NjggTEFOR19IQVVTQQotLSAgIDB4NjkgTEFOR19JQklCSU8KLS0gICAweDZhIExBTkdfWU9SVUJBCi0tICAgMHg3MCBMQU5HX0lHQk8KLS0gICAweDcxIExBTkdfS0FOVVJJCi0tICAgMHg3MiBMQU5HX09ST01PCi0tICAgMHg3MyBMQU5HX1RJR1JJTllBCi0tICAgMHg3NCBMQU5HX0dVQVJBTkkKLS0gICAweDc1IExBTkdfSEFXQUlJQU4KLS0gICAweDc2IExBTkdfTEFUSU4KLS0gICAweDc3IExBTkdfU09NQUxJCi0tICAgMHg3OCBMQU5HX1lJCi0tICAgMHg3OSBMQU5HX1BBUElBTUVOVFUKLS0qLwotLS8qIE1pbmd3IGhlYWRlcnMgZG9uJ3QgaGF2ZSBsYXRlc3QgbGFuZ3VhZ2UgYW5kIHN1Ymxhbmd1YWdlIGNvZGVzLiAgKi8KLS0jIGlmbmRlZiBMQU5HX0FGUklLQUFOUwotLSMgZGVmaW5lIExBTkdfQUZSSUtBQU5TIDB4MzYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19BTEJBTklBTgotLSMgZGVmaW5lIExBTkdfQUxCQU5JQU4gMHgxYwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0FNSEFSSUMKLS0jIGRlZmluZSBMQU5HX0FNSEFSSUMgMHg1ZQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0FSQUJJQwotLSMgZGVmaW5lIExBTkdfQVJBQklDIDB4MDEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19BUk1FTklBTgotLSMgZGVmaW5lIExBTkdfQVJNRU5JQU4gMHgyYgotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0FTU0FNRVNFCi0tIyBkZWZpbmUgTEFOR19BU1NBTUVTRSAweDRkCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfQVpFUkkKLS0jIGRlZmluZSBMQU5HX0FaRVJJIDB4MmMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19CQVNRVUUKLS0jIGRlZmluZSBMQU5HX0JBU1FVRSAweDJkCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfQkVMQVJVU0lBTgotLSMgZGVmaW5lIExBTkdfQkVMQVJVU0lBTiAweDIzCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfQkVOR0FMSQotLSMgZGVmaW5lIExBTkdfQkVOR0FMSSAweDQ1Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfQlVSTUVTRQotLSMgZGVmaW5lIExBTkdfQlVSTUVTRSAweDU1Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfQ0FNQk9ESUFOCi0tIyBkZWZpbmUgTEFOR19DQU1CT0RJQU4gMHg1MwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0NBVEFMQU4KLS0jIGRlZmluZSBMQU5HX0NBVEFMQU4gMHgwMwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0NIRVJPS0VFCi0tIyBkZWZpbmUgTEFOR19DSEVST0tFRSAweDVjCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfRElWRUhJCi0tIyBkZWZpbmUgTEFOR19ESVZFSEkgMHg2NQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0VETwotLSMgZGVmaW5lIExBTkdfRURPIDB4NjYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19FU1RPTklBTgotLSMgZGVmaW5lIExBTkdfRVNUT05JQU4gMHgyNQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0ZBRVJPRVNFCi0tIyBkZWZpbmUgTEFOR19GQUVST0VTRSAweDM4Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfRkFSU0kKLS0jIGRlZmluZSBMQU5HX0ZBUlNJIDB4MjkKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19GUklTSUFOCi0tIyBkZWZpbmUgTEFOR19GUklTSUFOIDB4NjIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19GVUxGVUxERQotLSMgZGVmaW5lIExBTkdfRlVMRlVMREUgMHg2NwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0dBRUxJQwotLSMgZGVmaW5lIExBTkdfR0FFTElDIDB4M2MKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19HQUxJQ0lBTgotLSMgZGVmaW5lIExBTkdfR0FMSUNJQU4gMHg1NgotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0dFT1JHSUFOCi0tIyBkZWZpbmUgTEFOR19HRU9SR0lBTiAweDM3Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfR1VBUkFOSQotLSMgZGVmaW5lIExBTkdfR1VBUkFOSSAweDc0Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfR1VKQVJBVEkKLS0jIGRlZmluZSBMQU5HX0dVSkFSQVRJIDB4NDcKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19IQVVTQQotLSMgZGVmaW5lIExBTkdfSEFVU0EgMHg2OAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0hBV0FJSUFOCi0tIyBkZWZpbmUgTEFOR19IQVdBSUlBTiAweDc1Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfSEVCUkVXCi0tIyBkZWZpbmUgTEFOR19IRUJSRVcgMHgwZAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0hJTkRJCi0tIyBkZWZpbmUgTEFOR19ISU5ESSAweDM5Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfSUJJQklPCi0tIyBkZWZpbmUgTEFOR19JQklCSU8gMHg2OQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0lHQk8KLS0jIGRlZmluZSBMQU5HX0lHQk8gMHg3MAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0lORE9ORVNJQU4KLS0jIGRlZmluZSBMQU5HX0lORE9ORVNJQU4gMHgyMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0lOVUtUSVRVVAotLSMgZGVmaW5lIExBTkdfSU5VS1RJVFVUIDB4NWQKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19LQU5OQURBCi0tIyBkZWZpbmUgTEFOR19LQU5OQURBIDB4NGIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19LQU5VUkkKLS0jIGRlZmluZSBMQU5HX0tBTlVSSSAweDcxCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfS0FTSE1JUkkKLS0jIGRlZmluZSBMQU5HX0tBU0hNSVJJIDB4NjAKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19LQVpBSwotLSMgZGVmaW5lIExBTkdfS0FaQUsgMHgzZgotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0tPTktBTkkKLS0jIGRlZmluZSBMQU5HX0tPTktBTkkgMHg1NwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0tZUkdZWgotLSMgZGVmaW5lIExBTkdfS1lSR1laIDB4NDAKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19MQU8KLS0jIGRlZmluZSBMQU5HX0xBTyAweDU0Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfTEFUSU4KLS0jIGRlZmluZSBMQU5HX0xBVElOIDB4NzYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19MQVRWSUFOCi0tIyBkZWZpbmUgTEFOR19MQVRWSUFOIDB4MjYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19MSVRIVUFOSUFOCi0tIyBkZWZpbmUgTEFOR19MSVRIVUFOSUFOIDB4MjcKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19NQUNFRE9OSUFOCi0tIyBkZWZpbmUgTEFOR19NQUNFRE9OSUFOIDB4MmYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19NQUxBWQotLSMgZGVmaW5lIExBTkdfTUFMQVkgMHgzZQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX01BTEFZQUxBTQotLSMgZGVmaW5lIExBTkdfTUFMQVlBTEFNIDB4NGMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19NQUxURVNFCi0tIyBkZWZpbmUgTEFOR19NQUxURVNFIDB4M2EKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19NQU5JUFVSSQotLSMgZGVmaW5lIExBTkdfTUFOSVBVUkkgMHg1OAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX01BUkFUSEkKLS0jIGRlZmluZSBMQU5HX01BUkFUSEkgMHg0ZQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX01PTkdPTElBTgotLSMgZGVmaW5lIExBTkdfTU9OR09MSUFOIDB4NTAKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19ORVBBTEkKLS0jIGRlZmluZSBMQU5HX05FUEFMSSAweDYxCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfT1JJWUEKLS0jIGRlZmluZSBMQU5HX09SSVlBIDB4NDgKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19PUk9NTwotLSMgZGVmaW5lIExBTkdfT1JPTU8gMHg3MgotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1BBUElBTUVOVFUKLS0jIGRlZmluZSBMQU5HX1BBUElBTUVOVFUgMHg3OQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1BBU0hUTwotLSMgZGVmaW5lIExBTkdfUEFTSFRPIDB4NjMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19QVU5KQUJJCi0tIyBkZWZpbmUgTEFOR19QVU5KQUJJIDB4NDYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19SSEFFVE9fUk9NQU5DRQotLSMgZGVmaW5lIExBTkdfUkhBRVRPX1JPTUFOQ0UgMHgxNwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1NBQU1JCi0tIyBkZWZpbmUgTEFOR19TQUFNSSAweDNiCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfU0FOU0tSSVQKLS0jIGRlZmluZSBMQU5HX1NBTlNLUklUIDB4NGYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19TRVJCSUFOCi0tIyBkZWZpbmUgTEFOR19TRVJCSUFOIDB4MWEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19TSU5ESEkKLS0jIGRlZmluZSBMQU5HX1NJTkRISSAweDU5Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfU0lOSEFMRVNFCi0tIyBkZWZpbmUgTEFOR19TSU5IQUxFU0UgMHg1YgotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1NMT1ZBSwotLSMgZGVmaW5lIExBTkdfU0xPVkFLIDB4MWIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19TT01BTEkKLS0jIGRlZmluZSBMQU5HX1NPTUFMSSAweDc3Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfU09SQklBTgotLSMgZGVmaW5lIExBTkdfU09SQklBTiAweDJlCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfU1VUVQotLSMgZGVmaW5lIExBTkdfU1VUVSAweDMwCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfU1dBSElMSQotLSMgZGVmaW5lIExBTkdfU1dBSElMSSAweDQxCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfU1lSSUFDCi0tIyBkZWZpbmUgTEFOR19TWVJJQUMgMHg1YQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1RBR0FMT0cKLS0jIGRlZmluZSBMQU5HX1RBR0FMT0cgMHg2NAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1RBSklLCi0tIyBkZWZpbmUgTEFOR19UQUpJSyAweDI4Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfVEFNQVpJR0hUCi0tIyBkZWZpbmUgTEFOR19UQU1BWklHSFQgMHg1ZgotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1RBTUlMCi0tIyBkZWZpbmUgTEFOR19UQU1JTCAweDQ5Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfVEFUQVIKLS0jIGRlZmluZSBMQU5HX1RBVEFSIDB4NDQKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19URUxVR1UKLS0jIGRlZmluZSBMQU5HX1RFTFVHVSAweDRhCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfVEhBSQotLSMgZGVmaW5lIExBTkdfVEhBSSAweDFlCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfVElCRVRBTgotLSMgZGVmaW5lIExBTkdfVElCRVRBTiAweDUxCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfVElHUklOWUEKLS0jIGRlZmluZSBMQU5HX1RJR1JJTllBIDB4NzMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19UU09OR0EKLS0jIGRlZmluZSBMQU5HX1RTT05HQSAweDMxCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfVFNXQU5BCi0tIyBkZWZpbmUgTEFOR19UU1dBTkEgMHgzMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1RVUktNRU4KLS0jIGRlZmluZSBMQU5HX1RVUktNRU4gMHg0MgotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1VLUkFJTklBTgotLSMgZGVmaW5lIExBTkdfVUtSQUlOSUFOIDB4MjIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19VUkRVCi0tIyBkZWZpbmUgTEFOR19VUkRVIDB4MjAKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19VWkJFSwotLSMgZGVmaW5lIExBTkdfVVpCRUsgMHg0MwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1ZFTkRBCi0tIyBkZWZpbmUgTEFOR19WRU5EQSAweDMzCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfVklFVE5BTUVTRQotLSMgZGVmaW5lIExBTkdfVklFVE5BTUVTRSAweDJhCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfV0VMU0gKLS0jIGRlZmluZSBMQU5HX1dFTFNIIDB4NTIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19YSE9TQQotLSMgZGVmaW5lIExBTkdfWEhPU0EgMHgzNAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1lJCi0tIyBkZWZpbmUgTEFOR19ZSSAweDc4Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfWUlERElTSAotLSMgZGVmaW5lIExBTkdfWUlERElTSCAweDNkCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfWU9SVUJBCi0tIyBkZWZpbmUgTEFOR19ZT1JVQkEgMHg2YQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1pVTFUKLS0jIGRlZmluZSBMQU5HX1pVTFUgMHgzNQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19TQVVESV9BUkFCSUEKLS0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19TQVVESV9BUkFCSUEgMHgwMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19JUkFRCi0tIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfSVJBUSAweDAyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0VHWVBUCi0tIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfRUdZUFQgMHgwMwotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19MSUJZQQotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0xJQllBIDB4MDQKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfQUxHRVJJQQotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0FMR0VSSUEgMHgwNQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19NT1JPQ0NPCi0tIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfTU9ST0NDTyAweDA2Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1RVTklTSUEKLS0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19UVU5JU0lBIDB4MDcKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfT01BTgotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX09NQU4gMHgwOAotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19ZRU1FTgotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1lFTUVOIDB4MDkKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfU1lSSUEKLS0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19TWVJJQSAweDBhCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0pPUkRBTgotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0pPUkRBTiAweDBiCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0xFQkFOT04KLS0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19MRUJBTk9OIDB4MGMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfS1VXQUlUCi0tIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfS1VXQUlUIDB4MGQKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfVUFFCi0tIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfVUFFIDB4MGUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfQkFIUkFJTgotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0JBSFJBSU4gMHgwZgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19RQVRBUgotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1FBVEFSIDB4MTAKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BWkVSSV9MQVRJTgotLSMgZGVmaW5lIFNVQkxBTkdfQVpFUklfTEFUSU4gMHgwMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0FaRVJJX0NZUklMTElDCi0tIyBkZWZpbmUgU1VCTEFOR19BWkVSSV9DWVJJTExJQyAweDAyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQkVOR0FMSV9JTkRJQQotLSMgZGVmaW5lIFNVQkxBTkdfQkVOR0FMSV9JTkRJQSAweDAxCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNICi0tIyBkZWZpbmUgU1VCTEFOR19CRU5HQUxJX0JBTkdMQURFU0ggMHgwMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0NISU5FU0VfTUFDQVUKLS0jIGRlZmluZSBTVUJMQU5HX0NISU5FU0VfTUFDQVUgMHgwNQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfU09VVEhfQUZSSUNBCi0tIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1NPVVRIX0FGUklDQSAweDA3Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBCi0tIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0EgMHgwOAotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfQ0FSSUJCRUFOCi0tIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0NBUklCQkVBTiAweDA5Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9CRUxJWkUKLS0jIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfQkVMSVpFIDB4MGEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFECi0tIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFEIDB4MGIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1pJTUJBQldFCi0tIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1pJTUJBQldFIDB4MGMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1BISUxJUFBJTkVTCi0tIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1BISUxJUFBJTkVTIDB4MGQKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0lORE9ORVNJQQotLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9JTkRPTkVTSUEgMHgwZQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSE9OR0tPTkcKLS0jIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfSE9OR0tPTkcgMHgwZgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSU5ESUEKLS0jIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfSU5ESUEgMHgxMAotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfTUFMQVlTSUEKLS0jIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfTUFMQVlTSUEgMHgxMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfU0lOR0FQT1JFCi0tIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1NJTkdBUE9SRSAweDEyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0xVWEVNQk9VUkcKLS0jIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHIDB4MDUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTU9OQUNPCi0tIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTU9OQUNPIDB4MDYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfV0VTVElORElFUwotLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1dFU1RJTkRJRVMgMHgwNwotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9SRVVOSU9OCi0tIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfUkVVTklPTiAweDA4Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NPTkdPCi0tIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfQ09OR08gMHgwOQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9TRU5FR0FMCi0tIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfU0VORUdBTCAweDBhCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OCi0tIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfQ0FNRVJPT04gMHgwYgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRQotLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NPVEVESVZPSVJFIDB4MGMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTUFMSQotLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01BTEkgMHgwZAotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NT1JPQ0NPCi0tIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTU9ST0NDTyAweDBlCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0hBSVRJCi0tIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfSEFJVEkgMHgwZgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0dFUk1BTl9MVVhFTUJPVVJHCi0tIyBkZWZpbmUgU1VCTEFOR19HRVJNQU5fTFVYRU1CT1VSRyAweDA0Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfR0VSTUFOX0xJRUNIVEVOU1RFSU4KLS0jIGRlZmluZSBTVUJMQU5HX0dFUk1BTl9MSUVDSFRFTlNURUlOIDB4MDUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19LQVNITUlSSV9JTkRJQQotLSMgZGVmaW5lIFNVQkxBTkdfS0FTSE1JUklfSU5ESUEgMHgwMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX01BTEFZX01BTEFZU0lBCi0tIyBkZWZpbmUgU1VCTEFOR19NQUxBWV9NQUxBWVNJQSAweDAxCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU0KLS0jIGRlZmluZSBTVUJMQU5HX01BTEFZX0JSVU5FSV9EQVJVU1NBTEFNIDB4MDIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19ORVBBTElfSU5ESUEKLS0jIGRlZmluZSBTVUJMQU5HX05FUEFMSV9JTkRJQSAweDAyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfUFVOSkFCSV9JTkRJQQotLSMgZGVmaW5lIFNVQkxBTkdfUFVOSkFCSV9JTkRJQSAweDAxCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfUFVOSkFCSV9QQUtJU1RBTgotLSMgZGVmaW5lIFNVQkxBTkdfUFVOSkFCSV9QQUtJU1RBTiAweDAyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfUk9NQU5JQU5fUk9NQU5JQQotLSMgZGVmaW5lIFNVQkxBTkdfUk9NQU5JQU5fUk9NQU5JQSAweDAxCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfUk9NQU5JQU5fTU9MRE9WQQotLSMgZGVmaW5lIFNVQkxBTkdfUk9NQU5JQU5fTU9MRE9WQSAweDAyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU0VSQklBTl9MQVRJTgotLSMgZGVmaW5lIFNVQkxBTkdfU0VSQklBTl9MQVRJTiAweDAyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQwotLSMgZGVmaW5lIFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQyAweDAzCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU0lOREhJX1BBS0lTVEFOCi0tIyBkZWZpbmUgU1VCTEFOR19TSU5ESElfUEFLSVNUQU4gMHgwMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NJTkRISV9BRkdIQU5JU1RBTgotLSMgZGVmaW5lIFNVQkxBTkdfU0lOREhJX0FGR0hBTklTVEFOIDB4MDIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQQotLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9HVUFURU1BTEEgMHgwNAotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQ09TVEFfUklDQQotLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9DT1NUQV9SSUNBIDB4MDUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1BBTkFNQQotLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QQU5BTUEgMHgwNgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDCi0tIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTl9SRVBVQkxJQyAweDA3Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEEKLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfVkVORVpVRUxBIDB4MDgKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBCi0tIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBIDB4MDkKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1BFUlUKLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfUEVSVSAweDBhCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkEKLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQVJHRU5USU5BIDB4MGIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IKLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfRUNVQURPUiAweDBjCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9DSElMRQotLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9DSElMRSAweDBkCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZCi0tIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVkgMHgwZQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVkKLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVkgMHgwZgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQQotLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9CT0xJVklBIDB4MTAKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0VMX1NBTFZBRE9SCi0tIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0VMX1NBTFZBRE9SIDB4MTEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTCi0tIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTIDB4MTIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQQotLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9OSUNBUkFHVUEgMHgxMwotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ08KLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ08gMHgxNAotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NXRURJU0hfRklOTEFORAotLSMgZGVmaW5lIFNVQkxBTkdfU1dFRElTSF9GSU5MQU5EIDB4MDIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19UQU1BWklHSFRfQVJBQklDCi0tIyBkZWZpbmUgU1VCTEFOR19UQU1BWklHSFRfQVJBQklDIDB4MDEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19UQU1BWklHSFRfQUxHRVJJQV9MQVRJTgotLSMgZGVmaW5lIFNVQkxBTkdfVEFNQVpJR0hUX0FMR0VSSUFfTEFUSU4gMHgwMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1RJR1JJTllBX0VUSElPUElBCi0tIyBkZWZpbmUgU1VCTEFOR19USUdSSU5ZQV9FVEhJT1BJQSAweDAxCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfVElHUklOWUFfRVJJVFJFQQotLSMgZGVmaW5lIFNVQkxBTkdfVElHUklOWUFfRVJJVFJFQSAweDAyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfVVJEVV9QQUtJU1RBTgotLSMgZGVmaW5lIFNVQkxBTkdfVVJEVV9QQUtJU1RBTiAweDAxCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfVVJEVV9JTkRJQQotLSMgZGVmaW5lIFNVQkxBTkdfVVJEVV9JTkRJQSAweDAyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfVVpCRUtfTEFUSU4KLS0jIGRlZmluZSBTVUJMQU5HX1VaQkVLX0xBVElOIDB4MDEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19VWkJFS19DWVJJTExJQwotLSMgZGVmaW5lIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUMgMHgwMgotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0jIGlmIEhBVkVfQ0ZMT0NBTEVDT1BZQ1VSUkVOVCB8fCBIQVZFX0NGUFJFRkVSRU5DRVNDT1BZQVBQVkFMVUUKLS0vKiBNYWNPUyBYIDEwLjIgb3IgbmV3ZXIgKi8KLS0KLS0vKiBDYW5vbmljYWxpemUgYSBNYWNPUyBYIGxvY2FsZSBuYW1lIHRvIGEgVW5peCBsb2NhbGUgbmFtZS4KLS0gICBOQU1FIGlzIGEgc3VmZmljaWVudGx5IGxhcmdlIGJ1ZmZlci4KLS0gICBPbiBpbnB1dCwgaXQgY29udGFpbnMgdGhlIE1hY09TIFggbG9jYWxlIG5hbWUuCi0tICAgT24gb3V0cHV0LCBpdCBjb250YWlucyB0aGUgVW5peCBsb2NhbGUgbmFtZS4gICovCi0tIyAgaWYgIWRlZmluZWQgSU5fTElCSU5UTAotLXN0YXRpYwotLSMgIGVuZGlmCi0tdm9pZAotLWdsX2xvY2FsZV9uYW1lX2Nhbm9uaWNhbGl6ZSAoY2hhciAqbmFtZSkKLS17Ci0tICAvKiBUaGlzIGNvbnZlcnNpb24gaXMgYmFzZWQgb24gYSBwb3N0aW5nIGJ5Ci0tICAgICBEZWJvcmFoIEdvbGRTbWl0aCA8Z29sZHNtaXRAYXBwbGUuY29tPiBvbiAyMDA1LTAzLTA4LAotLSAgICAgaHR0cDovL2xpc3RzLmFwcGxlLmNvbS9hcmNoaXZlcy9jYXJib24tZGV2LzIwMDUvTWFyL21zZzAwMjkzLmh0bWwgKi8KLS0KLS0gIC8qIENvbnZlcnQgbGVnYWN5IChOZVhUc3RlcCBpbmhlcml0ZWQpIEVuZ2xpc2ggbmFtZXMgdG8gVW5peCAoSVNPIDYzOSBhbmQKLS0gICAgIElTTyAzMTY2KSBuYW1lcy4gIFByaW9yIHRvIE1hY09TIFggMTAuMywgdGhlcmUgaXMgbm8gQVBJIGZvciBkb2luZyB0aGlzLgotLSAgICAgVGhlcmVmb3JlIHdlIGRvIGl0IG91cnNlbHZlcywgdXNpbmcgYSB0YWJsZSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGUKLS0gICAgIE1hY09TIFggMTAuMy44IGZ1bmN0aW9uCi0tICAgICBDRkxvY2FsZUNyZWF0ZUNhbm9uaWNhbExvY2FsZUlkZW50aWZpZXJGcm9tU3RyaW5nKCkuICAqLwotLSAgdHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBjaGFyIGxlZ2FjeVsyMSsxXTsgY29uc3QgY2hhciB1bml4eVs1KzFdOyB9Ci0tCSAgbGVnYWN5X2VudHJ5OwotLSAgc3RhdGljIGNvbnN0IGxlZ2FjeV9lbnRyeSBsZWdhY3lfdGFibGVbXSA9IHsKLS0gICAgeyAiQWZyaWthYW5zIiwgICAgICAgICAgICAgImFmIiB9LAotLSAgICB7ICJBbGJhbmlhbiIsICAgICAgICAgICAgICAic3EiIH0sCi0tICAgIHsgIkFtaGFyaWMiLCAgICAgICAgICAgICAgICJhbSIgfSwKLS0gICAgeyAiQXJhYmljIiwgICAgICAgICAgICAgICAgImFyIiB9LAotLSAgICB7ICJBcm1lbmlhbiIsICAgICAgICAgICAgICAiaHkiIH0sCi0tICAgIHsgIkFzc2FtZXNlIiwgICAgICAgICAgICAgICJhcyIgfSwKLS0gICAgeyAiQXltYXJhIiwgICAgICAgICAgICAgICAgImF5IiB9LAotLSAgICB7ICJBemVyYmFpamFuaSIsICAgICAgICAgICAiYXoiIH0sCi0tICAgIHsgIkJhc3F1ZSIsICAgICAgICAgICAgICAgICJldSIgfSwKLS0gICAgeyAiQmVsYXJ1c2lhbiIsICAgICAgICAgICAgImJlIiB9LAotLSAgICB7ICJCZWxvcnVzc2lhbiIsICAgICAgICAgICAiYmUiIH0sCi0tICAgIHsgIkJlbmdhbGkiLCAgICAgICAgICAgICAgICJibiIgfSwKLS0gICAgeyAiQnJhemlsaWFuIFBvcnR1Z2VzZSIsICAgInB0X0JSIiB9LAotLSAgICB7ICJCcmF6aWxpYW4gUG9ydHVndWVzZSIsICAicHRfQlIiIH0sCi0tICAgIHsgIkJyZXRvbiIsICAgICAgICAgICAgICAgICJiciIgfSwKLS0gICAgeyAiQnVsZ2FyaWFuIiwgICAgICAgICAgICAgImJnIiB9LAotLSAgICB7ICJCdXJtZXNlIiwgICAgICAgICAgICAgICAibXkiIH0sCi0tICAgIHsgIkJ5ZWxvcnVzc2lhbiIsICAgICAgICAgICJiZSIgfSwKLS0gICAgeyAiQ2F0YWxhbiIsICAgICAgICAgICAgICAgImNhIiB9LAotLSAgICB7ICJDaGV3YSIsICAgICAgICAgICAgICAgICAibnkiIH0sCi0tICAgIHsgIkNoaWNoZXdhIiwgICAgICAgICAgICAgICJueSIgfSwKLS0gICAgeyAiQ2hpbmVzZSIsICAgICAgICAgICAgICAgInpoIiB9LAotLSAgICB7ICJDaGluZXNlLCBTaW1wbGlmaWVkIiwgICAiemhfQ04iIH0sCi0tICAgIHsgIkNoaW5lc2UsIFRyYWRpdGlvbmFsIiwgICJ6aF9UVyIgfSwKLS0gICAgeyAiQ2hpbmVzZSwgVHJhZHRpb25hbCIsICAgInpoX1RXIiB9LAotLSAgICB7ICJDcm9hdGlhbiIsICAgICAgICAgICAgICAiaHIiIH0sCi0tICAgIHsgIkN6ZWNoIiwgICAgICAgICAgICAgICAgICJjcyIgfSwKLS0gICAgeyAiRGFuaXNoIiwgICAgICAgICAgICAgICAgImRhIiB9LAotLSAgICB7ICJEdXRjaCIsICAgICAgICAgICAgICAgICAibmwiIH0sCi0tICAgIHsgIkR6b25na2hhIiwgICAgICAgICAgICAgICJkeiIgfSwKLS0gICAgeyAiRW5nbGlzaCIsICAgICAgICAgICAgICAgImVuIiB9LAotLSAgICB7ICJFc3BlcmFudG8iLCAgICAgICAgICAgICAiZW8iIH0sCi0tICAgIHsgIkVzdG9uaWFuIiwgICAgICAgICAgICAgICJldCIgfSwKLS0gICAgeyAiRmFyb2VzZSIsICAgICAgICAgICAgICAgImZvIiB9LAotLSAgICB7ICJGYXJzaSIsICAgICAgICAgICAgICAgICAiZmEiIH0sCi0tICAgIHsgIkZpbm5pc2giLCAgICAgICAgICAgICAgICJmaSIgfSwKLS0gICAgeyAiRmxlbWlzaCIsICAgICAgICAgICAgICAgIm5sX0JFIiB9LAotLSAgICB7ICJGcmVuY2giLCAgICAgICAgICAgICAgICAiZnIiIH0sCi0tICAgIHsgIkdhbGljaWFuIiwgICAgICAgICAgICAgICJnbCIgfSwKLS0gICAgeyAiR2FsbGVnYW4iLCAgICAgICAgICAgICAgImdsIiB9LAotLSAgICB7ICJHZW9yZ2lhbiIsICAgICAgICAgICAgICAia2EiIH0sCi0tICAgIHsgIkdlcm1hbiIsICAgICAgICAgICAgICAgICJkZSIgfSwKLS0gICAgeyAiR3JlZWsiLCAgICAgICAgICAgICAgICAgImVsIiB9LAotLSAgICB7ICJHcmVlbmxhbmRpYyIsICAgICAgICAgICAia2wiIH0sCi0tICAgIHsgIkd1YXJhbmkiLCAgICAgICAgICAgICAgICJnbiIgfSwKLS0gICAgeyAiR3VqYXJhdGkiLCAgICAgICAgICAgICAgImd1IiB9LAotLSAgICB7ICJIYXdhaWlhbiIsICAgICAgICAgICAgICAiaGF3IiB9LCAvKiBZZXMsICJoYXciLCBub3QgImNwZSIuICAqLwotLSAgICB7ICJIZWJyZXciLCAgICAgICAgICAgICAgICAiaGUiIH0sCi0tICAgIHsgIkhpbmRpIiwgICAgICAgICAgICAgICAgICJoaSIgfSwKLS0gICAgeyAiSHVuZ2FyaWFuIiwgICAgICAgICAgICAgImh1IiB9LAotLSAgICB7ICJJY2VsYW5kaWMiLCAgICAgICAgICAgICAiaXMiIH0sCi0tICAgIHsgIkluZG9uZXNpYW4iLCAgICAgICAgICAgICJpZCIgfSwKLS0gICAgeyAiSW51a3RpdHV0IiwgICAgICAgICAgICAgIml1IiB9LAotLSAgICB7ICJJcmlzaCIsICAgICAgICAgICAgICAgICAiZ2EiIH0sCi0tICAgIHsgIkl0YWxpYW4iLCAgICAgICAgICAgICAgICJpdCIgfSwKLS0gICAgeyAiSmFwYW5lc2UiLCAgICAgICAgICAgICAgImphIiB9LAotLSAgICB7ICJKYXZhbmVzZSIsICAgICAgICAgICAgICAianYiIH0sCi0tICAgIHsgIkthbGFhbGxpc3V0IiwgICAgICAgICAgICJrbCIgfSwKLS0gICAgeyAiS2FubmFkYSIsICAgICAgICAgICAgICAgImtuIiB9LAotLSAgICB7ICJLYXNobWlyaSIsICAgICAgICAgICAgICAia3MiIH0sCi0tICAgIHsgIkthemFraCIsICAgICAgICAgICAgICAgICJrayIgfSwKLS0gICAgeyAiS2htZXIiLCAgICAgICAgICAgICAgICAgImttIiB9LAotLSAgICB7ICJLaW55YXJ3YW5kYSIsICAgICAgICAgICAicnciIH0sCi0tICAgIHsgIktpcmdoaXoiLCAgICAgICAgICAgICAgICJreSIgfSwKLS0gICAgeyAiS29yZWFuIiwgICAgICAgICAgICAgICAgImtvIiB9LAotLSAgICB7ICJLdXJkaXNoIiwgICAgICAgICAgICAgICAia3UiIH0sCi0tICAgIHsgIkxhdGluIiwgICAgICAgICAgICAgICAgICJsYSIgfSwKLS0gICAgeyAiTGF0dmlhbiIsICAgICAgICAgICAgICAgImx2IiB9LAotLSAgICB7ICJMaXRodWFuaWFuIiwgICAgICAgICAgICAibHQiIH0sCi0tICAgIHsgIk1hY2Vkb25pYW4iLCAgICAgICAgICAgICJtayIgfSwKLS0gICAgeyAiTWFsYWdhc3kiLCAgICAgICAgICAgICAgIm1nIiB9LAotLSAgICB7ICJNYWxheSIsICAgICAgICAgICAgICAgICAibXMiIH0sCi0tICAgIHsgIk1hbGF5YWxhbSIsICAgICAgICAgICAgICJtbCIgfSwKLS0gICAgeyAiTWFsdGVzZSIsICAgICAgICAgICAgICAgIm10IiB9LAotLSAgICB7ICJNYW54IiwgICAgICAgICAgICAgICAgICAiZ3YiIH0sCi0tICAgIHsgIk1hcmF0aGkiLCAgICAgICAgICAgICAgICJtciIgfSwKLS0gICAgeyAiTW9sZGF2aWFuIiwgICAgICAgICAgICAgIm1vIiB9LAotLSAgICB7ICJNb25nb2xpYW4iLCAgICAgICAgICAgICAibW4iIH0sCi0tICAgIHsgIk5lcGFsaSIsICAgICAgICAgICAgICAgICJuZSIgfSwKLS0gICAgeyAiTm9yd2VnaWFuIiwgICAgICAgICAgICAgIm5iIiB9LCAvKiBZZXMsICJuYiIsIG5vdCB0aGUgb2Jzb2xldGUgIm5vIi4gICovCi0tICAgIHsgIk55YW5qYSIsICAgICAgICAgICAgICAgICJueSIgfSwKLS0gICAgeyAiTnlub3JzayIsICAgICAgICAgICAgICAgIm5uIiB9LAotLSAgICB7ICJPcml5YSIsICAgICAgICAgICAgICAgICAib3IiIH0sCi0tICAgIHsgIk9yb21vIiwgICAgICAgICAgICAgICAgICJvbSIgfSwKLS0gICAgeyAiUGFuamFiaSIsICAgICAgICAgICAgICAgInBhIiB9LAotLSAgICB7ICJQYXNodG8iLCAgICAgICAgICAgICAgICAicHMiIH0sCi0tICAgIHsgIlBlcnNpYW4iLCAgICAgICAgICAgICAgICJmYSIgfSwKLS0gICAgeyAiUG9saXNoIiwgICAgICAgICAgICAgICAgInBsIiB9LAotLSAgICB7ICJQb3J0dWd1ZXNlIiwgICAgICAgICAgICAicHQiIH0sCi0tICAgIHsgIlBvcnR1Z3Vlc2UsIEJyYXppbGlhbiIsICJwdF9CUiIgfSwKLS0gICAgeyAiUHVuamFiaSIsICAgICAgICAgICAgICAgInBhIiB9LAotLSAgICB7ICJQdXNodG8iLCAgICAgICAgICAgICAgICAicHMiIH0sCi0tICAgIHsgIlF1ZWNodWEiLCAgICAgICAgICAgICAgICJxdSIgfSwKLS0gICAgeyAiUm9tYW5pYW4iLCAgICAgICAgICAgICAgInJvIiB9LAotLSAgICB7ICJSdWFuZGEiLCAgICAgICAgICAgICAgICAicnciIH0sCi0tICAgIHsgIlJ1bmRpIiwgICAgICAgICAgICAgICAgICJybiIgfSwKLS0gICAgeyAiUnVzc2lhbiIsICAgICAgICAgICAgICAgInJ1IiB9LAotLSAgICB7ICJTYW1pIiwgICAgICAgICAgICAgICAgICAic2VfTk8iIH0sIC8qIE5vdCBqdXN0ICJzZSIuICAqLwotLSAgICB7ICJTYW5za3JpdCIsICAgICAgICAgICAgICAic2EiIH0sCi0tICAgIHsgIlNjb3R0aXNoIiwgICAgICAgICAgICAgICJnZCIgfSwKLS0gICAgeyAiU2VyYmlhbiIsICAgICAgICAgICAgICAgInNyIiB9LAotLSAgICB7ICJTaW1wbGlmaWVkIENoaW5lc2UiLCAgICAiemhfQ04iIH0sCi0tICAgIHsgIlNpbmRoaSIsICAgICAgICAgICAgICAgICJzZCIgfSwKLS0gICAgeyAiU2luaGFsZXNlIiwgICAgICAgICAgICAgInNpIiB9LAotLSAgICB7ICJTbG92YWsiLCAgICAgICAgICAgICAgICAic2siIH0sCi0tICAgIHsgIlNsb3ZlbmlhbiIsICAgICAgICAgICAgICJzbCIgfSwKLS0gICAgeyAiU29tYWxpIiwgICAgICAgICAgICAgICAgInNvIiB9LAotLSAgICB7ICJTcGFuaXNoIiwgICAgICAgICAgICAgICAiZXMiIH0sCi0tICAgIHsgIlN1bmRhbmVzZSIsICAgICAgICAgICAgICJzdSIgfSwKLS0gICAgeyAiU3dhaGlsaSIsICAgICAgICAgICAgICAgInN3IiB9LAotLSAgICB7ICJTd2VkaXNoIiwgICAgICAgICAgICAgICAic3YiIH0sCi0tICAgIHsgIlRhZ2Fsb2ciLCAgICAgICAgICAgICAgICJ0bCIgfSwKLS0gICAgeyAiVGFqaWsiLCAgICAgICAgICAgICAgICAgInRnIiB9LAotLSAgICB7ICJUYWppa2kiLCAgICAgICAgICAgICAgICAidGciIH0sCi0tICAgIHsgIlRhbWlsIiwgICAgICAgICAgICAgICAgICJ0YSIgfSwKLS0gICAgeyAiVGF0YXIiLCAgICAgICAgICAgICAgICAgInR0IiB9LAotLSAgICB7ICJUZWx1Z3UiLCAgICAgICAgICAgICAgICAidGUiIH0sCi0tICAgIHsgIlRoYWkiLCAgICAgICAgICAgICAgICAgICJ0aCIgfSwKLS0gICAgeyAiVGliZXRhbiIsICAgICAgICAgICAgICAgImJvIiB9LAotLSAgICB7ICJUaWdyaW55YSIsICAgICAgICAgICAgICAidGkiIH0sCi0tICAgIHsgIlRvbmdhbiIsICAgICAgICAgICAgICAgICJ0byIgfSwKLS0gICAgeyAiVHJhZGl0aW9uYWwgQ2hpbmVzZSIsICAgInpoX1RXIiB9LAotLSAgICB7ICJUdXJraXNoIiwgICAgICAgICAgICAgICAidHIiIH0sCi0tICAgIHsgIlR1cmttZW4iLCAgICAgICAgICAgICAgICJ0ayIgfSwKLS0gICAgeyAiVWlnaHVyIiwgICAgICAgICAgICAgICAgInVnIiB9LAotLSAgICB7ICJVa3JhaW5pYW4iLCAgICAgICAgICAgICAidWsiIH0sCi0tICAgIHsgIlVyZHUiLCAgICAgICAgICAgICAgICAgICJ1ciIgfSwKLS0gICAgeyAiVXpiZWsiLCAgICAgICAgICAgICAgICAgInV6IiB9LAotLSAgICB7ICJWaWV0bmFtZXNlIiwgICAgICAgICAgICAidmkiIH0sCi0tICAgIHsgIldlbHNoIiwgICAgICAgICAgICAgICAgICJjeSIgfSwKLS0gICAgeyAiWWlkZGlzaCIsICAgICAgICAgICAgICAgInlpIiB9Ci0tICB9OwotLQotLSAgLyogQ29udmVydCBuZXctc3R5bGUgbG9jYWxlIG5hbWVzIHdpdGggbGFuZ3VhZ2UgdGFncyAoSVNPIDYzOSBhbmQgSVNPIDE1OTI0KQotLSAgICAgdG8gVW5peCAoSVNPIDYzOSBhbmQgSVNPIDMxNjYpIG5hbWVzLiAgKi8KLS0gIHR5cGVkZWYgc3RydWN0IHsgY29uc3QgY2hhciBsYW5ndGFnWzcrMV07IGNvbnN0IGNoYXIgdW5peHlbMTIrMV07IH0KLS0JICBsYW5ndGFnX2VudHJ5OwotLSAgc3RhdGljIGNvbnN0IGxhbmd0YWdfZW50cnkgbGFuZ3RhZ190YWJsZVtdID0gewotLSAgICAvKiBNYWNPUyBYIGhhcyAiYXotQXJhYiIsICJhei1DeXJsIiwgImF6LUxhdG4iLgotLSAgICAgICBUaGUgZGVmYXVsdCBzY3JpcHQgZm9yIGF6IG9uIFVuaXggaXMgTGF0aW4uICAqLwotLSAgICB7ICJhei1MYXRuIiwgImF6IiB9LAotLSAgICAvKiBNYWNPUyBYIGhhcyAiZ2EtZG90cyIuICBEb2VzIG5vdCB5ZXQgZXhpc3Qgb24gVW5peC4gICovCi0tICAgIHsgImdhLWRvdHMiLCAiZ2EiIH0sCi0tICAgIC8qIE1hY09TIFggaGFzICJray1DeXJsIi4gIERvZXMgbm90IHlldCBleGlzdCBvbiBVbml4LiAgKi8KLS0gICAgLyogTWFjT1MgWCBoYXMgIm1uLUN5cmwiLCAibW4tTW9uZyIuCi0tICAgICAgIFRoZSBkZWZhdWx0IHNjcmlwdCBmb3IgbW4gb24gVW5peCBpcyBDeXJpbGxpYy4gICovCi0tICAgIHsgIm1uLUN5cmwiLCAibW4iIH0sCi0tICAgIC8qIE1hY09TIFggaGFzICJtcy1BcmFiIiwgIm1zLUxhdG4iLgotLSAgICAgICBUaGUgZGVmYXVsdCBzY3JpcHQgZm9yIG1zIG9uIFVuaXggaXMgTGF0aW4uICAqLwotLSAgICB7ICJtcy1MYXRuIiwgIm1zIiB9LAotLSAgICAvKiBNYWNPUyBYIGhhcyAidGctQ3lybCIuCi0tICAgICAgIFRoZSBkZWZhdWx0IHNjcmlwdCBmb3IgdGcgb24gVW5peCBpcyBDeXJpbGxpYy4gICovCi0tICAgIHsgInRnLUN5cmwiLCAidGciIH0sCi0tICAgIC8qIE1hY09TIFggaGFzICJ0ay1DeXJsIi4gIERvZXMgbm90IHlldCBleGlzdCBvbiBVbml4LiAgKi8KLS0gICAgLyogTWFjT1MgWCBoYXMgInR0LUN5cmwiLgotLSAgICAgICBUaGUgZGVmYXVsdCBzY3JpcHQgZm9yIHR0IG9uIFVuaXggaXMgQ3lyaWxsaWMuICAqLwotLSAgICB7ICJ0dC1DeXJsIiwgInR0IiB9LAotLSAgICAvKiBNYWNPUyBYIGhhcyAiemgtSGFucyIsICJ6aC1IYW50Ii4KLS0gICAgICAgQ291bnRyeSBjb2RlcyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVzZSBvbiBVbml4LiAgKi8KLS0gICAgeyAiemgtSGFucyIsICJ6aF9DTiIgfSwKLS0gICAgeyAiemgtSGFudCIsICJ6aF9UVyIgfQotLSAgfTsKLS0KLS0gIC8qIENvbnZlcnQgc2NyaXB0IG5hbWVzIChJU08gMTU5MjQpIHRvIFVuaXggY29udmVudGlvbnMuCi0tICAgICBTZWUgaHR0cDovL3d3dy51bmljb2RlLm9yZy9pc28xNTkyNC9pc28xNTkyNC1jb2Rlcy5odG1sICAqLwotLSAgdHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBjaGFyIHNjcmlwdFs0KzFdOyBjb25zdCBjaGFyIHVuaXh5WzkrMV07IH0KLS0JICBzY3JpcHRfZW50cnk7Ci0tICBzdGF0aWMgY29uc3Qgc2NyaXB0X2VudHJ5IHNjcmlwdF90YWJsZVtdID0gewotLSAgICB7ICJBcmFiIiwgImFyYWJpYyIgfSwKLS0gICAgeyAiQ3lybCIsICJjeXJpbGxpYyIgfSwKLS0gICAgeyAiTW9uZyIsICJtb25nb2xpYW4iIH0KLS0gIH07Ci0tCi0tICAvKiBTdGVwIDE6IENvbnZlcnQgdXNpbmcgbGVnYWN5X3RhYmxlLiAgKi8KLS0gIGlmIChuYW1lWzBdID49ICdBJyAmJiBuYW1lWzBdIDw9ICdaJykKLS0gICAgewotLSAgICAgIHVuc2lnbmVkIGludCBpMSwgaTI7Ci0tICAgICAgaTEgPSAwOwotLSAgICAgIGkyID0gc2l6ZW9mIChsZWdhY3lfdGFibGUpIC8gc2l6ZW9mIChsZWdhY3lfZW50cnkpOwotLSAgICAgIHdoaWxlIChpMiAtIGkxID4gMSkKLS0JewotLQkgIC8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IGlmIG5hbWUgb2NjdXJzIGluIGxlZ2FjeV90YWJsZSwKLS0JICAgICBpdHMgaW5kZXggbXVzdCBiZSA+PSBpMSBhbmQgPCBpMi4gICovCi0tCSAgdW5zaWduZWQgaW50IGkgPSAoaTEgKyBpMikgPj4gMTsKLS0JICBjb25zdCBsZWdhY3lfZW50cnkgKnAgPSAmbGVnYWN5X3RhYmxlW2ldOwotLQkgIGlmIChzdHJjbXAgKG5hbWUsIHAtPmxlZ2FjeSkgPCAwKQotLQkgICAgaTIgPSBpOwotLQkgIGVsc2UKLS0JICAgIGkxID0gaTsKLS0JfQotLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIGxlZ2FjeV90YWJsZVtpMV0ubGVnYWN5KSA9PSAwKQotLQl7Ci0tCSAgc3RyY3B5IChuYW1lLCBsZWdhY3lfdGFibGVbaTFdLnVuaXh5KTsKLS0JICByZXR1cm47Ci0tCX0KLS0gICAgfQotLQotLSAgLyogU3RlcCAyOiBDb252ZXJ0IHVzaW5nIGxhbmd0YWdfdGFibGUgYW5kIHNjcmlwdF90YWJsZS4gICovCi0tICBpZiAoc3RybGVuIChuYW1lKSA9PSA3ICYmIG5hbWVbMl0gPT0gJy0nKQotLSAgICB7Ci0tICAgICAgdW5zaWduZWQgaW50IGkxLCBpMjsKLS0gICAgICBpMSA9IDA7Ci0tICAgICAgaTIgPSBzaXplb2YgKGxhbmd0YWdfdGFibGUpIC8gc2l6ZW9mIChsYW5ndGFnX2VudHJ5KTsKLS0gICAgICB3aGlsZSAoaTIgLSBpMSA+IDEpCi0tCXsKLS0JICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBpZiBuYW1lIG9jY3VycyBpbiBsYW5ndGFnX3RhYmxlLAotLQkgICAgIGl0cyBpbmRleCBtdXN0IGJlID49IGkxIGFuZCA8IGkyLiAgKi8KLS0JICB1bnNpZ25lZCBpbnQgaSA9IChpMSArIGkyKSA+PiAxOwotLQkgIGNvbnN0IGxhbmd0YWdfZW50cnkgKnAgPSAmbGFuZ3RhZ190YWJsZVtpXTsKLS0JICBpZiAoc3RyY21wIChuYW1lLCBwLT5sYW5ndGFnKSA8IDApCi0tCSAgICBpMiA9IGk7Ci0tCSAgZWxzZQotLQkgICAgaTEgPSBpOwotLQl9Ci0tICAgICAgaWYgKHN0cmNtcCAobmFtZSwgbGFuZ3RhZ190YWJsZVtpMV0ubGFuZ3RhZykgPT0gMCkKLS0JewotLQkgIHN0cmNweSAobmFtZSwgbGFuZ3RhZ190YWJsZVtpMV0udW5peHkpOwotLQkgIHJldHVybjsKLS0JfQotLQotLSAgICAgIGkxID0gMDsKLS0gICAgICBpMiA9IHNpemVvZiAoc2NyaXB0X3RhYmxlKSAvIHNpemVvZiAoc2NyaXB0X2VudHJ5KTsKLS0gICAgICB3aGlsZSAoaTIgLSBpMSA+IDEpCi0tCXsKLS0JICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBpZiAobmFtZSArIDMpIG9jY3VycyBpbiBzY3JpcHRfdGFibGUsCi0tCSAgICAgaXRzIGluZGV4IG11c3QgYmUgPj0gaTEgYW5kIDwgaTIuICAqLwotLQkgIHVuc2lnbmVkIGludCBpID0gKGkxICsgaTIpID4+IDE7Ci0tCSAgY29uc3Qgc2NyaXB0X2VudHJ5ICpwID0gJnNjcmlwdF90YWJsZVtpXTsKLS0JICBpZiAoc3RyY21wIChuYW1lICsgMywgcC0+c2NyaXB0KSA8IDApCi0tCSAgICBpMiA9IGk7Ci0tCSAgZWxzZQotLQkgICAgaTEgPSBpOwotLQl9Ci0tICAgICAgaWYgKHN0cmNtcCAobmFtZSArIDMsIHNjcmlwdF90YWJsZVtpMV0uc2NyaXB0KSA9PSAwKQotLQl7Ci0tCSAgbmFtZVsyXSA9ICdAJzsKLS0JICBzdHJjcHkgKG5hbWUgKyAzLCBzY3JpcHRfdGFibGVbaTFdLnVuaXh5KTsKLS0JICByZXR1cm47Ci0tCX0KLS0gICAgfQotLQotLSAgLyogU3RlcCAzOiBDb252ZXJ0IG5ldy1zdHlsZSBkYXNoIHRvIFVuaXggdW5kZXJzY29yZS4gKi8KLS0gIHsKLS0gICAgY2hhciAqcDsKLS0gICAgZm9yIChwID0gbmFtZTsgKnAgIT0gJ1wwJzsgcCsrKQotLSAgICAgIGlmICgqcCA9PSAnLScpCi0tCSpwID0gJ18nOwotLSAgfQotLX0KLS0KLS0jZW5kaWYKLS0KLS0vKiBYUEczIGRlZmluZXMgdGhlIHJlc3VsdCBvZiAnc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCknIGFzOgotLSAgICJEaXJlY3RzICdzZXRsb2NhbGUoKScgdG8gcXVlcnkgJ2NhdGVnb3J5JyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50Ci0tICAgIHNldHRpbmcgb2YgJ2xvY2FsJy4iCi0tICAgSG93ZXZlciBpdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBleGFjdCBmb3JtYXQuICBOZWl0aGVyIGRvIFNVU1YyIGFuZAotLSAgIElTTyBDIDk5LiAgU28gd2UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgb25seSBvbiBzZWxlY3RlZCBzeXN0ZW1zIChlLmcuCi0tICAgdGhvc2UgdXNpbmcgR05VIEMgTGlicmFyeSkuICAqLwotLSNpZiBkZWZpbmVkIF9MSUJDIHx8IChkZWZpbmVkIF9fR0xJQkNfXyAmJiBfX0dMSUJDX18gPj0gMikKLS0jIGRlZmluZSBIQVZFX0xPQ0FMRV9OVUxMCi0tI2VuZGlmCi0tCi0tLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGxvY2FsZSdzIG5hbWUsIGFuZCBjYW5vbmljYWxpemUgaXQgaW50byBYUEcgc3ludGF4Ci0tICAgICBsYW5ndWFnZVtfdGVycml0b3J5XVsuY29kZXNldF1bQG1vZGlmaWVyXQotLSAgIFRoZSBjb2Rlc2V0IHBhcnQgaW4gdGhlIHJlc3VsdCBpcyBub3QgcmVsaWFibGU7IHRoZSBsb2NhbGVfY2hhcnNldCgpCi0tICAgc2hvdWxkIGJlIHVzZWQgZm9yIGNvZGVzZXQgaW5mb3JtYXRpb24gaW5zdGVhZC4KLS0gICBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkOyBpdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4gICovCi0tCi0tY29uc3QgY2hhciAqCi0tZ2xfbG9jYWxlX25hbWVfcG9zaXggKGludCBjYXRlZ29yeSwgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKQotLXsKLS0gIC8qIFVzZSB0aGUgUE9TSVggbWV0aG9kcyBvZiBsb29raW5nIHRvICdMQ19BTEwnLCAnTENfeHh4JywgYW5kICdMQU5HJy4KLS0gICAgIE9uIHNvbWUgc3lzdGVtcyB0aGlzIGNhbiBiZSBkb25lIGJ5IHRoZSAnc2V0bG9jYWxlJyBmdW5jdGlvbiBpdHNlbGYuICAqLwotLSNpZiBkZWZpbmVkIEhBVkVfU0VUTE9DQUxFICYmIGRlZmluZWQgSEFWRV9MQ19NRVNTQUdFUyAmJiBkZWZpbmVkIEhBVkVfTE9DQUxFX05VTEwKLS0gIHJldHVybiBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKTsKLS0jZWxzZQotLSAgY29uc3QgY2hhciAqcmV0dmFsOwotLQotLSAgLyogU2V0dGluZyBvZiBMQ19BTEwgb3ZlcnJpZGVzIGFsbCBvdGhlci4gICovCi0tICByZXR2YWwgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLS0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKLS0gICAgcmV0dXJuIHJldHZhbDsKLS0gIC8qIE5leHQgY29tZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgY2F0ZWdvcnkuICAqLwotLSAgcmV0dmFsID0gZ2V0ZW52IChjYXRlZ29yeW5hbWUpOwotLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotLSAgICByZXR1cm4gcmV0dmFsOwotLSAgLyogTGFzdCBwb3NzaWJpbGl0eSBpcyB0aGUgTEFORyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICovCi0tICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HIik7Ci0tICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0tICAgIHJldHVybiByZXR2YWw7Ci0tCi0tICByZXR1cm4gTlVMTDsKLS0jZW5kaWYKLS19Ci0tCi0tY29uc3QgY2hhciAqCi0tZ2xfbG9jYWxlX25hbWVfZGVmYXVsdCAodm9pZCkKLS17Ci0tICAvKiBQT1NJWDoyMDAxIHNheXM6Ci0tICAgICAiQWxsIGltcGxlbWVudGF0aW9ucyBzaGFsbCBkZWZpbmUgYSBsb2NhbGUgYXMgdGhlIGRlZmF1bHQgbG9jYWxlLCB0byBiZQotLSAgICAgIGludm9rZWQgd2hlbiBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldCwgb3Igc2V0IHRvIHRoZSBlbXB0eQotLSAgICAgIHN0cmluZy4gIFRoaXMgZGVmYXVsdCBsb2NhbGUgY2FuIGJlIHRoZSBQT1NJWCBsb2NhbGUgb3IgYW55IG90aGVyCi0tICAgICAgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBsb2NhbGUuICBTb21lIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZQotLSAgICAgIGZhY2lsaXRpZXMgZm9yIGxvY2FsIGluc3RhbGxhdGlvbiBhZG1pbmlzdHJhdG9ycyB0byBzZXQgdGhlIGRlZmF1bHQKLS0gICAgICBsb2NhbGUsIGN1c3RvbWl6aW5nIGl0IGZvciBlYWNoIGxvY2F0aW9uLiAgUE9TSVg6MjAwMSBkb2VzIG5vdCByZXF1aXJlCi0tICAgICAgc3VjaCBhIGZhY2lsaXR5LiAgKi8KLS0KLS0jaWYgIShIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQgfHwgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFIHx8IGRlZmluZWQoV0lOMzJfTkFUSVZFKSkKLS0KLS0gIC8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBhIHdheSBvZiBzZXR0aW5nIHRoZSBsb2NhbGUsIG90aGVyIHRoYW4gdGhlCi0tICAgICBQT1NJWCBzcGVjaWZpZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgV2UgdXNlIEMgYXMgZGVmYXVsdCBsb2NhbGUuICAqLwotLSAgcmV0dXJuICJDIjsKLS0KLS0jZWxzZQotLQotLSAgLyogUmV0dXJuIGFuIFhQRyBzdHlsZSBsb2NhbGUgbmFtZSBsYW5ndWFnZVtfdGVycml0b3J5XVtAbW9kaWZpZXJdLgotLSAgICAgRG9uJ3QgZXZlbiBib3RoZXIgZGV0ZXJtaW5pbmcgdGhlIGNvZGVzZXQ7IGl0J3Mgbm90IHVzZWZ1bCBpbiB0aGlzCi0tICAgICBjb250ZXh0LCBiZWNhdXNlIG1lc3NhZ2UgY2F0YWxvZ3MgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHNpbmdsZQotLSAgICAgY29kZXNldC4gICovCi0tCi0tIyBpZiBIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQgfHwgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFCi0tICAvKiBNYWNPUyBYIDEwLjIgb3IgbmV3ZXIgKi8KLS0gIHsKLS0gICAgLyogQ2FjaGUgdGhlIGxvY2FsZSBuYW1lLCBzaW5jZSBDb3JlRm91bmRhdGlvbiBjYWxscyBhcmUgZXhwZW5zaXZlLiAgKi8KLS0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNhY2hlZF9sb2NhbGVuYW1lOwotLQotLSAgICBpZiAoY2FjaGVkX2xvY2FsZW5hbWUgPT0gTlVMTCkKLS0gICAgICB7Ci0tCWNoYXIgbmFtZWJ1ZlsyNTZdOwotLSMgIGlmIEhBVkVfQ0ZMT0NBTEVDT1BZQ1VSUkVOVCAvKiBNYWNPUyBYIDEwLjMgb3IgbmV3ZXIgKi8KLS0JQ0ZMb2NhbGVSZWYgbG9jYWxlID0gQ0ZMb2NhbGVDb3B5Q3VycmVudCAoKTsKLS0JQ0ZTdHJpbmdSZWYgbmFtZSA9IENGTG9jYWxlR2V0SWRlbnRpZmllciAobG9jYWxlKTsKLS0KLS0JaWYgKENGU3RyaW5nR2V0Q1N0cmluZyAobmFtZSwgbmFtZWJ1Ziwgc2l6ZW9mKG5hbWVidWYpLAotLQkJCQlrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKSkKLS0JICB7Ci0tCSAgICBnbF9sb2NhbGVfbmFtZV9jYW5vbmljYWxpemUgKG5hbWVidWYpOwotLQkgICAgY2FjaGVkX2xvY2FsZW5hbWUgPSBzdHJkdXAgKG5hbWVidWYpOwotLQkgIH0KLS0JQ0ZSZWxlYXNlIChsb2NhbGUpOwotLSMgIGVsaWYgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFIC8qIE1hY09TIFggMTAuMiBvciBuZXdlciAqLwotLQlDRlR5cGVSZWYgdmFsdWUgPQotLQkgIENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUgKENGU1RSICgiQXBwbGVMb2NhbGUiKSwKLS0JCQkJICAgICBrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRBcHBsaWNhdGlvbik7Ci0tCWlmICh2YWx1ZSAhPSBOVUxMCi0tCSAgICAmJiBDRkdldFR5cGVJRCAodmFsdWUpID09IENGU3RyaW5nR2V0VHlwZUlEICgpCi0tCSAgICAmJiBDRlN0cmluZ0dldENTdHJpbmcgKChDRlN0cmluZ1JlZil2YWx1ZSwgbmFtZWJ1Ziwgc2l6ZW9mKG5hbWVidWYpLAotLQkJCQkgICBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKSkKLS0JICB7Ci0tCSAgICBnbF9sb2NhbGVfbmFtZV9jYW5vbmljYWxpemUgKG5hbWVidWYpOwotLQkgICAgY2FjaGVkX2xvY2FsZW5hbWUgPSBzdHJkdXAgKG5hbWVidWYpOwotLQkgIH0KLS0jICBlbmRpZgotLQlpZiAoY2FjaGVkX2xvY2FsZW5hbWUgPT0gTlVMTCkKLS0JICBjYWNoZWRfbG9jYWxlbmFtZSA9ICJDIjsKLS0gICAgICB9Ci0tICAgIHJldHVybiBjYWNoZWRfbG9jYWxlbmFtZTsKLS0gIH0KLS0KLS0jIGVuZGlmCi0tCi0tIyBpZiBkZWZpbmVkKFdJTjMyX05BVElWRSkgLyogV0lOMzIsIG5vdCBDeWd3aW4gKi8KLS0gIHsKLS0gICAgTENJRCBsY2lkOwotLSAgICBMQU5HSUQgbGFuZ2lkOwotLSAgICBpbnQgcHJpbWFyeSwgc3ViOwotLQotLSAgICAvKiBVc2UgbmF0aXZlIFdpbjMyIEFQSSBsb2NhbGUgSUQuICAqLwotLSAgICBsY2lkID0gR2V0VGhyZWFkTG9jYWxlICgpOwotLQotLSAgICAvKiBTdHJpcCBvZmYgdGhlIHNvcnRpbmcgcnVsZXMsIGtlZXAgb25seSB0aGUgbGFuZ3VhZ2UgcGFydC4gICovCi0tICAgIGxhbmdpZCA9IExBTkdJREZST01MQ0lEIChsY2lkKTsKLS0KLS0gICAgLyogU3BsaXQgaW50byBsYW5ndWFnZSBhbmQgdGVycml0b3J5IHBhcnQuICAqLwotLSAgICBwcmltYXJ5ID0gUFJJTUFSWUxBTkdJRCAobGFuZ2lkKTsKLS0gICAgc3ViID0gU1VCTEFOR0lEIChsYW5naWQpOwotLQotLSAgICAvKiBEaXNwYXRjaCBvbiBsYW5ndWFnZS4KLS0gICAgICAgU2VlIGFsc28gaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL29ubGluZWRhdC9sYW5ndWFnZXMuaHRtbCAuCi0tICAgICAgIEZvciBkZXRhaWxzIGFib3V0IGxhbmd1YWdlcywgc2VlIGh0dHA6Ly93d3cuZXRobm9sb2d1ZS5jb20vIC4gICovCi0tICAgIHN3aXRjaCAocHJpbWFyeSkKLS0gICAgICB7Ci0tICAgICAgY2FzZSBMQU5HX0FGUklLQUFOUzogcmV0dXJuICJhZl9aQSI7Ci0tICAgICAgY2FzZSBMQU5HX0FMQkFOSUFOOiByZXR1cm4gInNxX0FMIjsKLS0gICAgICBjYXNlIExBTkdfQU1IQVJJQzogcmV0dXJuICJhbV9FVCI7Ci0tICAgICAgY2FzZSBMQU5HX0FSQUJJQzoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfU0FVRElfQVJBQklBOiByZXR1cm4gImFyX1NBIjsKLS0JICBjYXNlIFNVQkxBTkdfQVJBQklDX0lSQVE6IHJldHVybiAiYXJfSVEiOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfRUdZUFQ6IHJldHVybiAiYXJfRUciOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfTElCWUE6IHJldHVybiAiYXJfTFkiOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfQUxHRVJJQTogcmV0dXJuICJhcl9EWiI7Ci0tCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19NT1JPQ0NPOiByZXR1cm4gImFyX01BIjsKLS0JICBjYXNlIFNVQkxBTkdfQVJBQklDX1RVTklTSUE6IHJldHVybiAiYXJfVE4iOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfT01BTjogcmV0dXJuICJhcl9PTSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19ZRU1FTjogcmV0dXJuICJhcl9ZRSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19TWVJJQTogcmV0dXJuICJhcl9TWSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19KT1JEQU46IHJldHVybiAiYXJfSk8iOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfTEVCQU5PTjogcmV0dXJuICJhcl9MQiI7Ci0tCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19LVVdBSVQ6IHJldHVybiAiYXJfS1ciOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfVUFFOiByZXR1cm4gImFyX0FFIjsKLS0JICBjYXNlIFNVQkxBTkdfQVJBQklDX0JBSFJBSU46IHJldHVybiAiYXJfQkgiOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfUUFUQVI6IHJldHVybiAiYXJfUUEiOwotLQkgIH0KLS0JcmV0dXJuICJhciI7Ci0tICAgICAgY2FzZSBMQU5HX0FSTUVOSUFOOiByZXR1cm4gImh5X0FNIjsKLS0gICAgICBjYXNlIExBTkdfQVNTQU1FU0U6IHJldHVybiAiYXNfSU4iOwotLSAgICAgIGNhc2UgTEFOR19BWkVSSToKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIC8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIEF6ZXJiYWlqYW5pIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLwotLQkgIGNhc2UgU1VCTEFOR19BWkVSSV9MQVRJTjogcmV0dXJuICJhel9BWkBsYXRpbiI7Ci0tCSAgY2FzZSBTVUJMQU5HX0FaRVJJX0NZUklMTElDOiByZXR1cm4gImF6X0FaQGN5cmlsbGljIjsKLS0JICB9Ci0tCXJldHVybiAiYXoiOwotLSAgICAgIGNhc2UgTEFOR19CQVNRVUU6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJldV9FUyI7Ci0tCSAgfQotLQlyZXR1cm4gImV1IjsgLyogQW1iaWd1b3VzOiBjb3VsZCBiZSAiZXVfRVMiIG9yICJldV9GUiIuICAqLwotLSAgICAgIGNhc2UgTEFOR19CRUxBUlVTSUFOOiByZXR1cm4gImJlX0JZIjsKLS0gICAgICBjYXNlIExBTkdfQkVOR0FMSToKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19CRU5HQUxJX0lORElBOiByZXR1cm4gImJuX0lOIjsKLS0JICBjYXNlIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNIOiByZXR1cm4gImJuX0JEIjsKLS0JICB9Ci0tCXJldHVybiAiYm4iOwotLSAgICAgIGNhc2UgTEFOR19CVUxHQVJJQU46IHJldHVybiAiYmdfQkciOwotLSAgICAgIGNhc2UgTEFOR19CVVJNRVNFOiByZXR1cm4gIm15X01NIjsKLS0gICAgICBjYXNlIExBTkdfQ0FNQk9ESUFOOiByZXR1cm4gImttX0tIIjsKLS0gICAgICBjYXNlIExBTkdfQ0FUQUxBTjogcmV0dXJuICJjYV9FUyI7Ci0tICAgICAgY2FzZSBMQU5HX0NIRVJPS0VFOiByZXR1cm4gImNocl9VUyI7Ci0tICAgICAgY2FzZSBMQU5HX0NISU5FU0U6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfQ0hJTkVTRV9UUkFESVRJT05BTDogcmV0dXJuICJ6aF9UVyI7Ci0tCSAgY2FzZSBTVUJMQU5HX0NISU5FU0VfU0lNUExJRklFRDogcmV0dXJuICJ6aF9DTiI7Ci0tCSAgY2FzZSBTVUJMQU5HX0NISU5FU0VfSE9OR0tPTkc6IHJldHVybiAiemhfSEsiOwotLQkgIGNhc2UgU1VCTEFOR19DSElORVNFX1NJTkdBUE9SRTogcmV0dXJuICJ6aF9TRyI7Ci0tCSAgY2FzZSBTVUJMQU5HX0NISU5FU0VfTUFDQVU6IHJldHVybiAiemhfTU8iOwotLQkgIH0KLS0JcmV0dXJuICJ6aCI7Ci0tICAgICAgY2FzZSBMQU5HX0NST0FUSUFOOiAgICAgICAvKiBMQU5HX0NST0FUSUFOID09IExBTkdfU0VSQklBTgotLQkJCQkgKiBXaGF0IHVzZWQgdG8gYmUgY2FsbGVkIFNlcmJvLUNyb2F0aWFuCi0tCQkJCSAqIHNob3VsZCByZWFsbHkgbm93IGJlIHR3byBzZXBhcmF0ZQotLQkJCQkgKiBsYW5ndWFnZXMgYmVjYXVzZSBvZiBwb2xpdGljYWwgcmVhc29ucy4KLS0JCQkJICogKFNheXMgdG1sLCB3aG8ga25vd3Mgbm90aGluZyBhYm91dCBTZXJiaWFuCi0tCQkJCSAqIG9yIENyb2F0aWFuLikKLS0JCQkJICogKEkgY2FuIGZlZWwgdGhvc2UgZmxhbWVzIGNvbWluZyBhbHJlYWR5LikKLS0JCQkJICovCi0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJocl9IUiI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NFUkJJQU5fTEFUSU46IHJldHVybiAic3JfQ1MiOwotLQkgIGNhc2UgU1VCTEFOR19TRVJCSUFOX0NZUklMTElDOiByZXR1cm4gInNyX0NTQGN5cmlsbGljIjsKLS0JICB9Ci0tCXJldHVybiAiaHIiOwotLSAgICAgIGNhc2UgTEFOR19DWkVDSDogcmV0dXJuICJjc19DWiI7Ci0tICAgICAgY2FzZSBMQU5HX0RBTklTSDogcmV0dXJuICJkYV9ESyI7Ci0tICAgICAgY2FzZSBMQU5HX0RJVkVISTogcmV0dXJuICJkdl9NViI7Ci0tICAgICAgY2FzZSBMQU5HX0RVVENIOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX0RVVENIOiByZXR1cm4gIm5sX05MIjsKLS0JICBjYXNlIFNVQkxBTkdfRFVUQ0hfQkVMR0lBTjogLyogRkxFTUlTSCwgVkxBQU1TICovIHJldHVybiAibmxfQkUiOwotLQkgIH0KLS0JcmV0dXJuICJubCI7Ci0tICAgICAgY2FzZSBMQU5HX0VETzogcmV0dXJuICJiaW5fTkciOwotLSAgICAgIGNhc2UgTEFOR19FTkdMSVNIOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgLyogU1VCTEFOR19FTkdMSVNIX1VTID09IFNVQkxBTkdfREVGQVVMVC4gSGVoLiBJIHRob3VnaHQKLS0JICAgKiBFbmdsaXNoIHdhcyB0aGUgbGFuZ3VhZ2Ugc3Bva2VuIGluIEVuZ2xhbmQuCi0tCSAgICogT2ggd2VsbC4KLS0JICAgKi8KLS0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9VUzogcmV0dXJuICJlbl9VUyI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfVUs6IHJldHVybiAiZW5fR0IiOwotLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX0FVUzogcmV0dXJuICJlbl9BVSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfQ0FOOiByZXR1cm4gImVuX0NBIjsKLS0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9OWjogcmV0dXJuICJlbl9OWiI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfRUlSRTogcmV0dXJuICJlbl9JRSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfU09VVEhfQUZSSUNBOiByZXR1cm4gImVuX1pBIjsKLS0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBOiByZXR1cm4gImVuX0pNIjsKLS0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9DQVJJQkJFQU46IHJldHVybiAiZW5fR0QiOyAvKiBHcmVuYWRhPyAqLwotLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX0JFTElaRTogcmV0dXJuICJlbl9CWiI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfVFJJTklEQUQ6IHJldHVybiAiZW5fVFQiOwotLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX1pJTUJBQldFOiByZXR1cm4gImVuX1pXIjsKLS0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9QSElMSVBQSU5FUzogcmV0dXJuICJlbl9QSCI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBOiByZXR1cm4gImVuX0lEIjsKLS0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9IT05HS09ORzogcmV0dXJuICJlbl9ISyI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfSU5ESUE6IHJldHVybiAiZW5fSU4iOwotLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX01BTEFZU0lBOiByZXR1cm4gImVuX01ZIjsKLS0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9TSU5HQVBPUkU6IHJldHVybiAiZW5fU0ciOwotLQkgIH0KLS0JcmV0dXJuICJlbiI7Ci0tICAgICAgY2FzZSBMQU5HX0VTVE9OSUFOOiByZXR1cm4gImV0X0VFIjsKLS0gICAgICBjYXNlIExBTkdfRkFFUk9FU0U6IHJldHVybiAiZm9fRk8iOwotLSAgICAgIGNhc2UgTEFOR19GQVJTSTogcmV0dXJuICJmYV9JUiI7Ci0tICAgICAgY2FzZSBMQU5HX0ZJTk5JU0g6IHJldHVybiAiZmlfRkkiOwotLSAgICAgIGNhc2UgTEFOR19GUkVOQ0g6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfRlJFTkNIOiByZXR1cm4gImZyX0ZSIjsKLS0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX0JFTEdJQU46IC8qIFdBTExPT04gKi8gcmV0dXJuICJmcl9CRSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9DQU5BRElBTjogcmV0dXJuICJmcl9DQSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9TV0lTUzogcmV0dXJuICJmcl9DSCI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHOiByZXR1cm4gImZyX0xVIjsKLS0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX01PTkFDTzogcmV0dXJuICJmcl9NQyI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTOiByZXR1cm4gImZyIjsgLyogQ2FyaWJiZWFuPyAqLwotLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfUkVVTklPTjogcmV0dXJuICJmcl9SRSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9DT05HTzogcmV0dXJuICJmcl9DRyI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9TRU5FR0FMOiByZXR1cm4gImZyX1NOIjsKLS0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OOiByZXR1cm4gImZyX0NNIjsKLS0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX0NPVEVESVZPSVJFOiByZXR1cm4gImZyX0NJIjsKLS0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX01BTEk6IHJldHVybiAiZnJfTUwiOwotLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfTU9ST0NDTzogcmV0dXJuICJmcl9NQSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9IQUlUSTogcmV0dXJuICJmcl9IVCI7Ci0tCSAgfQotLQlyZXR1cm4gImZyIjsKLS0gICAgICBjYXNlIExBTkdfRlJJU0lBTjogcmV0dXJuICJmeV9OTCI7Ci0tICAgICAgY2FzZSBMQU5HX0ZVTEZVTERFOgotLQkvKiBTcG9rZW4gaW4gTmlnZXJpYSwgR3VpbmVhLCBTZW5lZ2FsLCBNYWxpLCBOaWdlciwgQ2FtZXJvb24sIEJlbmluLiAgKi8KLS0JcmV0dXJuICJmZl9ORyI7Ci0tICAgICAgY2FzZSBMQU5HX0dBRUxJQzoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgMHgwMTogLyogU0NPVFRJU0ggKi8gcmV0dXJuICJnZF9HQiI7Ci0tCSAgY2FzZSAweDAyOiAvKiBJUklTSCAqLyByZXR1cm4gImdhX0lFIjsKLS0JICB9Ci0tCXJldHVybiAiQyI7Ci0tICAgICAgY2FzZSBMQU5HX0dBTElDSUFOOiByZXR1cm4gImdsX0VTIjsKLS0gICAgICBjYXNlIExBTkdfR0VPUkdJQU46IHJldHVybiAia2FfR0UiOwotLSAgICAgIGNhc2UgTEFOR19HRVJNQU46Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfR0VSTUFOOiByZXR1cm4gImRlX0RFIjsKLS0JICBjYXNlIFNVQkxBTkdfR0VSTUFOX1NXSVNTOiByZXR1cm4gImRlX0NIIjsKLS0JICBjYXNlIFNVQkxBTkdfR0VSTUFOX0FVU1RSSUFOOiByZXR1cm4gImRlX0FUIjsKLS0JICBjYXNlIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkc6IHJldHVybiAiZGVfTFUiOwotLQkgIGNhc2UgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTjogcmV0dXJuICJkZV9MSSI7Ci0tCSAgfQotLQlyZXR1cm4gImRlIjsKLS0gICAgICBjYXNlIExBTkdfR1JFRUs6IHJldHVybiAiZWxfR1IiOwotLSAgICAgIGNhc2UgTEFOR19HVUFSQU5JOiByZXR1cm4gImduX1BZIjsKLS0gICAgICBjYXNlIExBTkdfR1VKQVJBVEk6IHJldHVybiAiZ3VfSU4iOwotLSAgICAgIGNhc2UgTEFOR19IQVVTQTogcmV0dXJuICJoYV9ORyI7Ci0tICAgICAgY2FzZSBMQU5HX0hBV0FJSUFOOgotLQkvKiBGSVhNRTogRG8gdGhleSBtZWFuIEhhd2FpaWFuICgiaGF3X1VTIiwgMTAwMCBzcGVha2VycykKLS0JICAgb3IgSGF3YWlpIENyZW9sZSBFbmdsaXNoICgiY3BlX1VTIiwgNjAwMDAwIHNwZWFrZXJzKT8gICovCi0tCXJldHVybiAiY3BlX1VTIjsKLS0gICAgICBjYXNlIExBTkdfSEVCUkVXOiByZXR1cm4gImhlX0lMIjsKLS0gICAgICBjYXNlIExBTkdfSElOREk6IHJldHVybiAiaGlfSU4iOwotLSAgICAgIGNhc2UgTEFOR19IVU5HQVJJQU46IHJldHVybiAiaHVfSFUiOwotLSAgICAgIGNhc2UgTEFOR19JQklCSU86IHJldHVybiAibmljX05HIjsKLS0gICAgICBjYXNlIExBTkdfSUNFTEFORElDOiByZXR1cm4gImlzX0lTIjsKLS0gICAgICBjYXNlIExBTkdfSUdCTzogcmV0dXJuICJpZ19ORyI7Ci0tICAgICAgY2FzZSBMQU5HX0lORE9ORVNJQU46IHJldHVybiAiaWRfSUQiOwotLSAgICAgIGNhc2UgTEFOR19JTlVLVElUVVQ6IHJldHVybiAiaXVfQ0EiOwotLSAgICAgIGNhc2UgTEFOR19JVEFMSUFOOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX0lUQUxJQU46IHJldHVybiAiaXRfSVQiOwotLQkgIGNhc2UgU1VCTEFOR19JVEFMSUFOX1NXSVNTOiByZXR1cm4gIml0X0NIIjsKLS0JICB9Ci0tCXJldHVybiAiaXQiOwotLSAgICAgIGNhc2UgTEFOR19KQVBBTkVTRTogcmV0dXJuICJqYV9KUCI7Ci0tICAgICAgY2FzZSBMQU5HX0tBTk5BREE6IHJldHVybiAia25fSU4iOwotLSAgICAgIGNhc2UgTEFOR19LQU5VUkk6IHJldHVybiAia3JfTkciOwotLSAgICAgIGNhc2UgTEFOR19LQVNITUlSSToKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gImtzX1BLIjsKLS0JICBjYXNlIFNVQkxBTkdfS0FTSE1JUklfSU5ESUE6IHJldHVybiAia3NfSU4iOwotLQkgIH0KLS0JcmV0dXJuICJrcyI7Ci0tICAgICAgY2FzZSBMQU5HX0tBWkFLOiByZXR1cm4gImtrX0taIjsKLS0gICAgICBjYXNlIExBTkdfS09OS0FOSToKLS0JLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gc3VjaCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KLS0JcmV0dXJuICJrb2tfSU4iOwotLSAgICAgIGNhc2UgTEFOR19LT1JFQU46IHJldHVybiAia29fS1IiOwotLSAgICAgIGNhc2UgTEFOR19LWVJHWVo6IHJldHVybiAia3lfS0ciOwotLSAgICAgIGNhc2UgTEFOR19MQU86IHJldHVybiAibG9fTEEiOwotLSAgICAgIGNhc2UgTEFOR19MQVRJTjogcmV0dXJuICJsYV9WQSI7Ci0tICAgICAgY2FzZSBMQU5HX0xBVFZJQU46IHJldHVybiAibHZfTFYiOwotLSAgICAgIGNhc2UgTEFOR19MSVRIVUFOSUFOOiByZXR1cm4gImx0X0xUIjsKLS0gICAgICBjYXNlIExBTkdfTUFDRURPTklBTjogcmV0dXJuICJta19NSyI7Ci0tICAgICAgY2FzZSBMQU5HX01BTEFZOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX01BTEFZX01BTEFZU0lBOiByZXR1cm4gIm1zX01ZIjsKLS0JICBjYXNlIFNVQkxBTkdfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU06IHJldHVybiAibXNfQk4iOwotLQkgIH0KLS0JcmV0dXJuICJtcyI7Ci0tICAgICAgY2FzZSBMQU5HX01BTEFZQUxBTTogcmV0dXJuICJtbF9JTiI7Ci0tICAgICAgY2FzZSBMQU5HX01BTFRFU0U6IHJldHVybiAibXRfTVQiOwotLSAgICAgIGNhc2UgTEFOR19NQU5JUFVSSToKLS0JLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gc3VjaCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KLS0JcmV0dXJuICJtbmlfSU4iOwotLSAgICAgIGNhc2UgTEFOR19NQVJBVEhJOiByZXR1cm4gIm1yX0lOIjsKLS0gICAgICBjYXNlIExBTkdfTU9OR09MSUFOOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAibW5fTU4iOwotLQkgIH0KLS0JcmV0dXJuICJtbiI7IC8qIEFtYmlndW91czogY291bGQgYmUgIm1uX0NOIiBvciAibW5fTU4iLiAgKi8KLS0gICAgICBjYXNlIExBTkdfTkVQQUxJOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAibmVfTlAiOwotLQkgIGNhc2UgU1VCTEFOR19ORVBBTElfSU5ESUE6IHJldHVybiAibmVfSU4iOwotLQkgIH0KLS0JcmV0dXJuICJuZSI7Ci0tICAgICAgY2FzZSBMQU5HX05PUldFR0lBTjoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMOiByZXR1cm4gIm5iX05PIjsKLS0JICBjYXNlIFNVQkxBTkdfTk9SV0VHSUFOX05ZTk9SU0s6IHJldHVybiAibm5fTk8iOwotLQkgIH0KLS0JcmV0dXJuICJubyI7Ci0tICAgICAgY2FzZSBMQU5HX09SSVlBOiByZXR1cm4gIm9yX0lOIjsKLS0gICAgICBjYXNlIExBTkdfT1JPTU86IHJldHVybiAib21fRVQiOwotLSAgICAgIGNhc2UgTEFOR19QQVBJQU1FTlRVOiByZXR1cm4gInBhcF9BTiI7Ci0tICAgICAgY2FzZSBMQU5HX1BBU0hUTzoKLS0JcmV0dXJuICJwcyI7IC8qIEFtYmlndW91czogY291bGQgYmUgInBzX1BLIiBvciAicHNfQUYiLiAgKi8KLS0gICAgICBjYXNlIExBTkdfUE9MSVNIOiByZXR1cm4gInBsX1BMIjsKLS0gICAgICBjYXNlIExBTkdfUE9SVFVHVUVTRToKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19QT1JUVUdVRVNFOiByZXR1cm4gInB0X1BUIjsKLS0JICAvKiBIbW0uIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4gPT0gU1VCTEFOR19ERUZBVUxULgotLQkgICAgIFNhbWUgcGhlbm9tZW5vbiBhcyBTVUJMQU5HX0VOR0xJU0hfVVMgPT0gU1VCTEFOR19ERUZBVUxULiAqLwotLQkgIGNhc2UgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTjogcmV0dXJuICJwdF9CUiI7Ci0tCSAgfQotLQlyZXR1cm4gInB0IjsKLS0gICAgICBjYXNlIExBTkdfUFVOSkFCSToKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19QVU5KQUJJX0lORElBOiByZXR1cm4gInBhX0lOIjsgLyogR3VybXVraGkgc2NyaXB0ICovCi0tCSAgY2FzZSBTVUJMQU5HX1BVTkpBQklfUEFLSVNUQU46IHJldHVybiAicGFfUEsiOyAvKiBBcmFiaWMgc2NyaXB0ICovCi0tCSAgfQotLQlyZXR1cm4gInBhIjsKLS0gICAgICBjYXNlIExBTkdfUkhBRVRPX1JPTUFOQ0U6IHJldHVybiAicm1fQ0giOwotLSAgICAgIGNhc2UgTEFOR19ST01BTklBTjoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19ST01BTklBTl9ST01BTklBOiByZXR1cm4gInJvX1JPIjsKLS0JICBjYXNlIFNVQkxBTkdfUk9NQU5JQU5fTU9MRE9WQTogcmV0dXJuICJyb19NRCI7Ci0tCSAgfQotLQlyZXR1cm4gInJvIjsKLS0gICAgICBjYXNlIExBTkdfUlVTU0lBTjoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gInJ1X1JVIjsKLS0JICB9Ci0tCXJldHVybiAicnUiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJydV9SVSIgb3IgInJ1X1VBIiBvciAicnVfTUQiLiAgKi8KLS0gICAgICBjYXNlIExBTkdfU0FBTUk6IC8qIGFjdHVhbGx5IE5vcnRoZXJuIFNhbWkgKi8gcmV0dXJuICJzZV9OTyI7Ci0tICAgICAgY2FzZSBMQU5HX1NBTlNLUklUOiByZXR1cm4gInNhX0lOIjsKLS0gICAgICBjYXNlIExBTkdfU0lOREhJOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX1NJTkRISV9QQUtJU1RBTjogcmV0dXJuICJzZF9QSyI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NJTkRISV9BRkdIQU5JU1RBTjogcmV0dXJuICJzZF9BRiI7Ci0tCSAgfQotLQlyZXR1cm4gInNkIjsKLS0gICAgICBjYXNlIExBTkdfU0lOSEFMRVNFOiByZXR1cm4gInNpX0xLIjsKLS0gICAgICBjYXNlIExBTkdfU0xPVkFLOiByZXR1cm4gInNrX1NLIjsKLS0gICAgICBjYXNlIExBTkdfU0xPVkVOSUFOOiByZXR1cm4gInNsX1NJIjsKLS0gICAgICBjYXNlIExBTkdfU09NQUxJOiByZXR1cm4gInNvX1NPIjsKLS0gICAgICBjYXNlIExBTkdfU09SQklBTjoKLS0JLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gc3VjaCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KLS0JcmV0dXJuICJ3ZW5fREUiOwotLSAgICAgIGNhc2UgTEFOR19TUEFOSVNIOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0g6IHJldHVybiAiZXNfRVMiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX01FWElDQU46IHJldHVybiAiZXNfTVgiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX01PREVSTjoKLS0JICAgIHJldHVybiAiZXNfRVNAbW9kZXJuIjsJLyogbm90IHNlZW4gb24gVW5peCAqLwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQTogcmV0dXJuICJlc19HVCI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfQ09TVEFfUklDQTogcmV0dXJuICJlc19DUiI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BOiByZXR1cm4gImVzX1BBIjsKLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUM6IHJldHVybiAiZXNfRE8iOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQTogcmV0dXJuICJlc19WRSI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUE6IHJldHVybiAiZXNfQ08iOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX1BFUlU6IHJldHVybiAiZXNfUEUiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQTogcmV0dXJuICJlc19BUiI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfRUNVQURPUjogcmV0dXJuICJlc19FQyI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfQ0hJTEU6IHJldHVybiAiZXNfQ0wiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVk6IHJldHVybiAiZXNfVVkiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX1BBUkFHVUFZOiByZXR1cm4gImVzX1BZIjsKLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9CT0xJVklBOiByZXR1cm4gImVzX0JPIjsKLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUjogcmV0dXJuICJlc19TViI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfSE9ORFVSQVM6IHJldHVybiAiZXNfSE4iOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQTogcmV0dXJuICJlc19OSSI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ086IHJldHVybiAiZXNfUFIiOwotLQkgIH0KLS0JcmV0dXJuICJlcyI7Ci0tICAgICAgY2FzZSBMQU5HX1NVVFU6IHJldHVybiAiYm50X1RaIjsgLyogb3IgInN0X0xTIiBvciAibnNvX1pBIj8gKi8KLS0gICAgICBjYXNlIExBTkdfU1dBSElMSTogcmV0dXJuICJzd19LRSI7Ci0tICAgICAgY2FzZSBMQU5HX1NXRURJU0g6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJzdl9TRSI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NXRURJU0hfRklOTEFORDogcmV0dXJuICJzdl9GSSI7Ci0tCSAgfQotLQlyZXR1cm4gInN2IjsKLS0gICAgICBjYXNlIExBTkdfU1lSSUFDOiByZXR1cm4gInN5cl9UUiI7IC8qIEFuIGV4dGluY3QgbGFuZ3VhZ2UuICAqLwotLSAgICAgIGNhc2UgTEFOR19UQUdBTE9HOiByZXR1cm4gInRsX1BIIjsKLS0gICAgICBjYXNlIExBTkdfVEFKSUs6IHJldHVybiAidGdfVEoiOwotLSAgICAgIGNhc2UgTEFOR19UQU1BWklHSFQ6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICAvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBUYW1hemlnaHQgbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCi0tCSAgY2FzZSBTVUJMQU5HX1RBTUFaSUdIVF9BUkFCSUM6IHJldHVybiAiYmVyX01BQGFyYWJpYyI7Ci0tCSAgY2FzZSBTVUJMQU5HX1RBTUFaSUdIVF9BTEdFUklBX0xBVElOOiByZXR1cm4gImJlcl9EWkBsYXRpbiI7Ci0tCSAgfQotLQlyZXR1cm4gImJlcl9NQSI7Ci0tICAgICAgY2FzZSBMQU5HX1RBTUlMOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAidGFfSU4iOwotLQkgIH0KLS0JcmV0dXJuICJ0YSI7IC8qIEFtYmlndW91czogY291bGQgYmUgInRhX0lOIiBvciAidGFfTEsiIG9yICJ0YV9TRyIuICAqLwotLSAgICAgIGNhc2UgTEFOR19UQVRBUjogcmV0dXJuICJ0dF9SVSI7Ci0tICAgICAgY2FzZSBMQU5HX1RFTFVHVTogcmV0dXJuICJ0ZV9JTiI7Ci0tICAgICAgY2FzZSBMQU5HX1RIQUk6IHJldHVybiAidGhfVEgiOwotLSAgICAgIGNhc2UgTEFOR19USUJFVEFOOiByZXR1cm4gImJvX0NOIjsKLS0gICAgICBjYXNlIExBTkdfVElHUklOWUE6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUE6IHJldHVybiAidGlfRVQiOwotLQkgIGNhc2UgU1VCTEFOR19USUdSSU5ZQV9FUklUUkVBOiByZXR1cm4gInRpX0VSIjsKLS0JICB9Ci0tCXJldHVybiAidGkiOwotLSAgICAgIGNhc2UgTEFOR19UU09OR0E6IHJldHVybiAidHNfWkEiOwotLSAgICAgIGNhc2UgTEFOR19UU1dBTkE6IHJldHVybiAidG5fQlciOwotLSAgICAgIGNhc2UgTEFOR19UVVJLSVNIOiByZXR1cm4gInRyX1RSIjsKLS0gICAgICBjYXNlIExBTkdfVFVSS01FTjogcmV0dXJuICJ0a19UTSI7Ci0tICAgICAgY2FzZSBMQU5HX1VLUkFJTklBTjogcmV0dXJuICJ1a19VQSI7Ci0tICAgICAgY2FzZSBMQU5HX1VSRFU6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfVVJEVV9QQUtJU1RBTjogcmV0dXJuICJ1cl9QSyI7Ci0tCSAgY2FzZSBTVUJMQU5HX1VSRFVfSU5ESUE6IHJldHVybiAidXJfSU4iOwotLQkgIH0KLS0JcmV0dXJuICJ1ciI7Ci0tICAgICAgY2FzZSBMQU5HX1VaQkVLOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX1VaQkVLX0xBVElOOiByZXR1cm4gInV6X1VaIjsKLS0JICBjYXNlIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUM6IHJldHVybiAidXpfVVpAY3lyaWxsaWMiOwotLQkgIH0KLS0JcmV0dXJuICJ1eiI7Ci0tICAgICAgY2FzZSBMQU5HX1ZFTkRBOiByZXR1cm4gInZlX1pBIjsKLS0gICAgICBjYXNlIExBTkdfVklFVE5BTUVTRTogcmV0dXJuICJ2aV9WTiI7Ci0tICAgICAgY2FzZSBMQU5HX1dFTFNIOiByZXR1cm4gImN5X0dCIjsKLS0gICAgICBjYXNlIExBTkdfWEhPU0E6IHJldHVybiAieGhfWkEiOwotLSAgICAgIGNhc2UgTEFOR19ZSTogcmV0dXJuICJzaXRfQ04iOwotLSAgICAgIGNhc2UgTEFOR19ZSURESVNIOiByZXR1cm4gInlpX0lMIjsKLS0gICAgICBjYXNlIExBTkdfWU9SVUJBOiByZXR1cm4gInlvX05HIjsKLS0gICAgICBjYXNlIExBTkdfWlVMVTogcmV0dXJuICJ6dV9aQSI7Ci0tICAgICAgZGVmYXVsdDogcmV0dXJuICJDIjsKLS0gICAgICB9Ci0tICB9Ci0tIyBlbmRpZgotLSNlbmRpZgotLX0KLS0KLS1jb25zdCBjaGFyICoKLS1nbF9sb2NhbGVfbmFtZSAoaW50IGNhdGVnb3J5LCBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCi0tewotLSAgY29uc3QgY2hhciAqcmV0dmFsOwotLQotLSAgcmV0dmFsID0gZ2xfbG9jYWxlX25hbWVfcG9zaXggKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOwotLSAgaWYgKHJldHZhbCAhPSBOVUxMKQotLSAgICByZXR1cm4gcmV0dmFsOwotLQotLSAgcmV0dXJuIGdsX2xvY2FsZV9uYW1lX2RlZmF1bHQgKCk7Ci0tfQotLS0tIGEvaW50bC9sb2NrLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDkyMiArMCwwIEBACi0tLyogTG9ja2luZyBpbiBtdWx0aXRocmVhZGVkIHNpdHVhdGlvbnMuCi0tICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwNS4KLS0gICBCYXNlZCBvbiBHQ0MncyBndGhyLXBvc2l4LmgsIGd0aHItcG9zaXg5NS5oLCBndGhyLXNvbGFyaXMuaCwKLS0gICBndGhyLXdpbjMyLmguICAqLwotLQotLSNpbmNsdWRlIDxjb25maWcuaD4KLS0KLS0jaW5jbHVkZSAibG9jay5oIgotLQotLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS0KLS0jaWYgVVNFX1BPU0lYX1RIUkVBRFMKLS0KLS0vKiBVc2UgdGhlIFBPU0lYIHRocmVhZHMgbGlicmFyeS4gICovCi0tCi0tIyBpZiBQVEhSRUFEX0lOX1VTRV9ERVRFQ1RJT05fSEFSRAotLQotLS8qIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBieSBhIGR1bW15IHRocmVhZC4gICovCi0tc3RhdGljIHZvaWQgKgotLWR1bW15X3RocmVhZF9mdW5jICh2b2lkICphcmcpCi0tewotLSAgcmV0dXJuIGFyZzsKLS19Ci0tCi0taW50Ci0tZ2x0aHJlYWRfaW5fdXNlICh2b2lkKQotLXsKLS0gIHN0YXRpYyBpbnQgdGVzdGVkOwotLSAgc3RhdGljIGludCByZXN1bHQ7IC8qIDE6IGxpbmtlZCB3aXRoIC1scHRocmVhZCwgMDogb25seSB3aXRoIGxpYmMgKi8KLS0KLS0gIGlmICghdGVzdGVkKQotLSAgICB7Ci0tICAgICAgcHRocmVhZF90IHRocmVhZDsKLS0KLS0gICAgICBpZiAocHRocmVhZF9jcmVhdGUgKCZ0aHJlYWQsIE5VTEwsIGR1bW15X3RocmVhZF9mdW5jLCBOVUxMKSAhPSAwKQotLQkvKiBUaHJlYWQgY3JlYXRpb24gZmFpbGVkLiAgKi8KLS0JcmVzdWx0ID0gMDsKLS0gICAgICBlbHNlCi0tCXsKLS0JICAvKiBUaHJlYWQgY3JlYXRpb24gd29ya3MuICAqLwotLQkgIHZvaWQgKnJldHZhbDsKLS0JICBpZiAocHRocmVhZF9qb2luICh0aHJlYWQsICZyZXR2YWwpICE9IDApCi0tCSAgICBhYm9ydCAoKTsKLS0JICByZXN1bHQgPSAxOwotLQl9Ci0tICAgICAgdGVzdGVkID0gMTsKLS0gICAgfQotLSAgcmV0dXJuIHJlc3VsdDsKLS19Ci0tCi0tIyBlbmRpZgotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcndsb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLSMgaWYgSEFWRV9QVEhSRUFEX1JXTE9DSwotLQotLSMgIGlmICFkZWZpbmVkIFBUSFJFQURfUldMT0NLX0lOSVRJQUxJWkVSCi0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja19pbml0IChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAocHRocmVhZF9yd2xvY2tfaW5pdCAoJmxvY2stPnJ3bG9jaywgTlVMTCkgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBsb2NrLT5pbml0aWFsaXplZCA9IDE7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yd2xvY2tfcmRsb2NrIChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAoIWxvY2stPmluaXRpYWxpemVkKQotLSAgICB7Ci0tICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jayAoJmxvY2stPmd1YXJkKSAhPSAwKQotLQlhYm9ydCAoKTsKLS0gICAgICBpZiAoIWxvY2stPmluaXRpYWxpemVkKQotLQlnbHRocmVhZF9yd2xvY2tfaW5pdCAobG9jayk7Ci0tICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbG9jay0+Z3VhcmQpICE9IDApCi0tCWFib3J0ICgpOwotLSAgICB9Ci0tICBpZiAocHRocmVhZF9yd2xvY2tfcmRsb2NrICgmbG9jay0+cndsb2NrKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja193cmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKQotLXsKLS0gIGlmICghbG9jay0+aW5pdGlhbGl6ZWQpCi0tICAgIHsKLS0gICAgICBpZiAocHRocmVhZF9tdXRleF9sb2NrICgmbG9jay0+Z3VhcmQpICE9IDApCi0tCWFib3J0ICgpOwotLSAgICAgIGlmICghbG9jay0+aW5pdGlhbGl6ZWQpCi0tCWdsdGhyZWFkX3J3bG9ja19pbml0IChsb2NrKTsKLS0gICAgICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCZsb2NrLT5ndWFyZCkgIT0gMCkKLS0JYWJvcnQgKCk7Ci0tICAgIH0KLS0gIGlmIChwdGhyZWFkX3J3bG9ja193cmxvY2sgKCZsb2NrLT5yd2xvY2spICE9IDApCi0tICAgIGFib3J0ICgpOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcndsb2NrX3VubG9jayAoZ2xfcndsb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5pbml0aWFsaXplZCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAocHRocmVhZF9yd2xvY2tfdW5sb2NrICgmbG9jay0+cndsb2NrKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja19kZXN0cm95IChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAoIWxvY2stPmluaXRpYWxpemVkKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmIChwdGhyZWFkX3J3bG9ja19kZXN0cm95ICgmbG9jay0+cndsb2NrKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGxvY2stPmluaXRpYWxpemVkID0gMDsKLS19Ci0tCi0tIyAgZW5kaWYKLS0KLS0jIGVsc2UKLS0KLS12b2lkCi0tZ2x0aHJlYWRfcndsb2NrX2luaXQgKGdsX3J3bG9ja190ICpsb2NrKQotLXsKLS0gIGlmIChwdGhyZWFkX211dGV4X2luaXQgKCZsb2NrLT5sb2NrLCBOVUxMKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmIChwdGhyZWFkX2NvbmRfaW5pdCAoJmxvY2stPndhaXRpbmdfcmVhZGVycywgTlVMTCkgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAocHRocmVhZF9jb25kX2luaXQgKCZsb2NrLT53YWl0aW5nX3dyaXRlcnMsIE5VTEwpICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgbG9jay0+d2FpdGluZ193cml0ZXJzX2NvdW50ID0gMDsKLS0gIGxvY2stPnJ1bmNvdW50ID0gMDsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja19yZGxvY2sgKGdsX3J3bG9ja190ICpsb2NrKQotLXsKLS0gIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZsb2NrLT5sb2NrKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIC8qIFRlc3Qgd2hldGhlciBvbmx5IHJlYWRlcnMgYXJlIGN1cnJlbnRseSBydW5uaW5nLCBhbmQgd2hldGhlciB0aGUgcnVuY291bnQKLS0gICAgIGZpZWxkIHdpbGwgbm90IG92ZXJmbG93LiAgKi8KLS0gIC8qIFBPU0lYIHNheXM6ICJJdCBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHdoZXRoZXIgdGhlIGNhbGxpbmcgdGhyZWFkCi0tICAgICBhY3F1aXJlcyB0aGUgbG9jayB3aGVuIGEgd3JpdGVyIGRvZXMgbm90IGhvbGQgdGhlIGxvY2sgYW5kIHRoZXJlIGFyZQotLSAgICAgd3JpdGVycyBibG9ja2VkIG9uIHRoZSBsb2NrLiIgIExldCdzIHNheSwgbm86IGdpdmUgdGhlIHdyaXRlcnMgYSBoaWdoZXIKLS0gICAgIHByaW9yaXR5LiAgKi8KLS0gIHdoaWxlICghKGxvY2stPnJ1bmNvdW50ICsgMSA+IDAgJiYgbG9jay0+d2FpdGluZ193cml0ZXJzX2NvdW50ID09IDApKQotLSAgICB7Ci0tICAgICAgLyogVGhpcyB0aHJlYWQgaGFzIHRvIHdhaXQgZm9yIGEgd2hpbGUuICBFbnF1ZXVlIGl0IGFtb25nIHRoZQotLQkgd2FpdGluZ19yZWFkZXJzLiAgKi8KLS0gICAgICBpZiAocHRocmVhZF9jb25kX3dhaXQgKCZsb2NrLT53YWl0aW5nX3JlYWRlcnMsICZsb2NrLT5sb2NrKSAhPSAwKQotLQlhYm9ydCAoKTsKLS0gICAgfQotLSAgbG9jay0+cnVuY291bnQrKzsKLS0gIGlmIChwdGhyZWFkX211dGV4X3VubG9jayAoJmxvY2stPmxvY2spICE9IDApCi0tICAgIGFib3J0ICgpOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoZ2xfcndsb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jayAoJmxvY2stPmxvY2spICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgLyogVGVzdCB3aGV0aGVyIG5vIHJlYWRlcnMgb3Igd3JpdGVycyBhcmUgY3VycmVudGx5IHJ1bm5pbmcuICAqLwotLSAgd2hpbGUgKCEobG9jay0+cnVuY291bnQgPT0gMCkpCi0tICAgIHsKLS0gICAgICAvKiBUaGlzIHRocmVhZCBoYXMgdG8gd2FpdCBmb3IgYSB3aGlsZS4gIEVucXVldWUgaXQgYW1vbmcgdGhlCi0tCSB3YWl0aW5nX3dyaXRlcnMuICAqLwotLSAgICAgIGxvY2stPndhaXRpbmdfd3JpdGVyc19jb3VudCsrOwotLSAgICAgIGlmIChwdGhyZWFkX2NvbmRfd2FpdCAoJmxvY2stPndhaXRpbmdfd3JpdGVycywgJmxvY2stPmxvY2spICE9IDApCi0tCWFib3J0ICgpOwotLSAgICAgIGxvY2stPndhaXRpbmdfd3JpdGVyc19jb3VudC0tOwotLSAgICB9Ci0tICBsb2NrLT5ydW5jb3VudC0tOyAvKiBydW5jb3VudCBiZWNvbWVzIC0xICovCi0tICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCZsb2NrLT5sb2NrKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja191bmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKQotLXsKLS0gIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZsb2NrLT5sb2NrKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmIChsb2NrLT5ydW5jb3VudCA8IDApCi0tICAgIHsKLS0gICAgICAvKiBEcm9wIGEgd3JpdGVyIGxvY2suICAqLwotLSAgICAgIGlmICghKGxvY2stPnJ1bmNvdW50ID09IC0xKSkKLS0JYWJvcnQgKCk7Ci0tICAgICAgbG9jay0+cnVuY291bnQgPSAwOwotLSAgICB9Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICAvKiBEcm9wIGEgcmVhZGVyIGxvY2suICAqLwotLSAgICAgIGlmICghKGxvY2stPnJ1bmNvdW50ID4gMCkpCi0tCWFib3J0ICgpOwotLSAgICAgIGxvY2stPnJ1bmNvdW50LS07Ci0tICAgIH0KLS0gIGlmIChsb2NrLT5ydW5jb3VudCA9PSAwKQotLSAgICB7Ci0tICAgICAgLyogUE9TSVggcmVjb21tZW5kcyB0aGF0ICJ3cml0ZSBsb2NrcyBzaGFsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciByZWFkCi0tCSBsb2NrcyIsIHRvIGF2b2lkICJ3cml0ZXIgc3RhcnZhdGlvbiIuICAqLwotLSAgICAgIGlmIChsb2NrLT53YWl0aW5nX3dyaXRlcnNfY291bnQgPiAwKQotLQl7Ci0tCSAgLyogV2FrZSB1cCBvbmUgb2YgdGhlIHdhaXRpbmcgd3JpdGVycy4gICovCi0tCSAgaWYgKHB0aHJlYWRfY29uZF9zaWduYWwgKCZsb2NrLT53YWl0aW5nX3dyaXRlcnMpICE9IDApCi0tCSAgICBhYm9ydCAoKTsKLS0JfQotLSAgICAgIGVsc2UKLS0JewotLQkgIC8qIFdha2UgdXAgYWxsIHdhaXRpbmcgcmVhZGVycy4gICovCi0tCSAgaWYgKHB0aHJlYWRfY29uZF9icm9hZGNhc3QgKCZsb2NrLT53YWl0aW5nX3JlYWRlcnMpICE9IDApCi0tCSAgICBhYm9ydCAoKTsKLS0JfQotLSAgICB9Ci0tICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCZsb2NrLT5sb2NrKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja19kZXN0cm95IChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAocHRocmVhZF9tdXRleF9kZXN0cm95ICgmbG9jay0+bG9jaykgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAocHRocmVhZF9jb25kX2Rlc3Ryb3kgKCZsb2NrLT53YWl0aW5nX3JlYWRlcnMpICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKHB0aHJlYWRfY29uZF9kZXN0cm95ICgmbG9jay0+d2FpdGluZ193cml0ZXJzKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tIyBlbmRpZgotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLSMgaWYgSEFWRV9QVEhSRUFEX01VVEVYX1JFQ1VSU0lWRQotLQotLSMgIGlmICEoZGVmaW5lZCBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUiB8fCBkZWZpbmVkIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKQotLQotLXZvaWQKLS1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIHB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cmlidXRlczsKLS0KLS0gIGlmIChwdGhyZWFkX211dGV4YXR0cl9pbml0ICgmYXR0cmlidXRlcykgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAocHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSAoJmF0dHJpYnV0ZXMsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmIChwdGhyZWFkX211dGV4X2luaXQgKCZsb2NrLT5yZWNtdXRleCwgJmF0dHJpYnV0ZXMpICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kgKCZhdHRyaWJ1dGVzKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGxvY2stPmluaXRpYWxpemVkID0gMTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2xvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5pbml0aWFsaXplZCkKLS0gICAgewotLSAgICAgIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZsb2NrLT5ndWFyZCkgIT0gMCkKLS0JYWJvcnQgKCk7Ci0tICAgICAgaWYgKCFsb2NrLT5pbml0aWFsaXplZCkKLS0JZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAobG9jayk7Ci0tICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbG9jay0+Z3VhcmQpICE9IDApCi0tCWFib3J0ICgpOwotLSAgICB9Ci0tICBpZiAocHRocmVhZF9tdXRleF9sb2NrICgmbG9jay0+cmVjbXV0ZXgpICE9IDApCi0tICAgIGFib3J0ICgpOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIGlmICghbG9jay0+aW5pdGlhbGl6ZWQpCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbG9jay0+cmVjbXV0ZXgpICE9IDApCi0tICAgIGFib3J0ICgpOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAoIWxvY2stPmluaXRpYWxpemVkKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmIChwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCZsb2NrLT5yZWNtdXRleCkgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBsb2NrLT5pbml0aWFsaXplZCA9IDA7Ci0tfQotLQotLSMgIGVuZGlmCi0tCi0tIyBlbHNlCi0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdCAoJmxvY2stPm11dGV4LCBOVUxMKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGxvY2stPm93bmVyID0gKHB0aHJlYWRfdCkgMDsKLS0gIGxvY2stPmRlcHRoID0gMDsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2xvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi0tewotLSAgcHRocmVhZF90IHNlbGYgPSBwdGhyZWFkX3NlbGYgKCk7Ci0tICBpZiAobG9jay0+b3duZXIgIT0gc2VsZikKLS0gICAgewotLSAgICAgIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZsb2NrLT5tdXRleCkgIT0gMCkKLS0JYWJvcnQgKCk7Ci0tICAgICAgbG9jay0+b3duZXIgPSBzZWxmOwotLSAgICB9Ci0tICBpZiAoKysobG9jay0+ZGVwdGgpID09IDApIC8qIHdyYXBhcm91bmQ/ICovCi0tICAgIGFib3J0ICgpOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIGlmIChsb2NrLT5vd25lciAhPSBwdGhyZWFkX3NlbGYgKCkpCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKGxvY2stPmRlcHRoID09IDApCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKC0tKGxvY2stPmRlcHRoKSA9PSAwKQotLSAgICB7Ci0tICAgICAgbG9jay0+b3duZXIgPSAocHRocmVhZF90KSAwOwotLSAgICAgIGlmIChwdGhyZWFkX211dGV4X3VubG9jayAoJmxvY2stPm11dGV4KSAhPSAwKQotLQlhYm9ydCAoKTsKLS0gICAgfQotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAobG9jay0+b3duZXIgIT0gKHB0aHJlYWRfdCkgMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAocHRocmVhZF9tdXRleF9kZXN0cm95ICgmbG9jay0+bXV0ZXgpICE9IDApCi0tICAgIGFib3J0ICgpOwotLX0KLS0KLS0jIGVuZGlmCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfb25jZV90IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tc3RhdGljIGNvbnN0IHB0aHJlYWRfb25jZV90IGZyZXNoX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKLS0KLS1pbnQKLS1nbHRocmVhZF9vbmNlX3NpbmdsZXRocmVhZGVkIChwdGhyZWFkX29uY2VfdCAqb25jZV9jb250cm9sKQotLXsKLS0gIC8qIFdlIGRvbid0IGtub3cgd2hldGhlciBwdGhyZWFkX29uY2VfdCBpcyBhbiBpbnRlZ2VyIHR5cGUsIGEgZmxvYXRpbmctcG9pbnQKLS0gICAgIHR5cGUsIGEgcG9pbnRlciB0eXBlLCBvciBhIHN0cnVjdHVyZSB0eXBlLiAgKi8KLS0gIGNoYXIgKmZpcnN0Ynl0ZSA9IChjaGFyICopb25jZV9jb250cm9sOwotLSAgaWYgKCpmaXJzdGJ5dGUgPT0gKihjb25zdCBjaGFyICopJmZyZXNoX29uY2UpCi0tICAgIHsKLS0gICAgICAvKiBGaXJzdCB0aW1lIHVzZSBvZiBvbmNlX2NvbnRyb2wuICBJbnZlcnQgdGhlIGZpcnN0IGJ5dGUuICAqLwotLSAgICAgICpmaXJzdGJ5dGUgPSB+ICooY29uc3QgY2hhciAqKSZmcmVzaF9vbmNlOwotLSAgICAgIHJldHVybiAxOwotLSAgICB9Ci0tICBlbHNlCi0tICAgIHJldHVybiAwOwotLX0KLS0KLS0jZW5kaWYKLS0KLS0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0tCi0tI2lmIFVTRV9QVEhfVEhSRUFEUwotLQotLS8qIFVzZSB0aGUgR05VIFB0aCB0aHJlYWRzIGxpYnJhcnkuICAqLwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcndsb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXZvaWQKLS1nbHRocmVhZF9vbmNlX2NhbGwgKHZvaWQgKmFyZykKLS17Ci0tICB2b2lkICgqKmdsX29uY2VfdGVtcF9hZGRyKSAodm9pZCkgPSAodm9pZCAoKiopICh2b2lkKSkgYXJnOwotLSAgdm9pZCAoKmluaXRmdW5jdGlvbikgKHZvaWQpID0gKmdsX29uY2VfdGVtcF9hZGRyOwotLSAgaW5pdGZ1bmN0aW9uICgpOwotLX0KLS0KLS1pbnQKLS1nbHRocmVhZF9vbmNlX3NpbmdsZXRocmVhZGVkIChwdGhfb25jZV90ICpvbmNlX2NvbnRyb2wpCi0tewotLSAgLyogV2Uga25vdyB0aGF0IHB0aF9vbmNlX3QgaXMgYW4gaW50ZWdlciB0eXBlLiAgKi8KLS0gIGlmICgqb25jZV9jb250cm9sID09IFBUSF9PTkNFX0lOSVQpCi0tICAgIHsKLS0gICAgICAvKiBGaXJzdCB0aW1lIHVzZSBvZiBvbmNlX2NvbnRyb2wuICBJbnZlcnQgdGhlIG1hcmtlci4gICovCi0tICAgICAgKm9uY2VfY29udHJvbCA9IH4gUFRIX09OQ0VfSU5JVDsKLS0gICAgICByZXR1cm4gMTsKLS0gICAgfQotLSAgZWxzZQotLSAgICByZXR1cm4gMDsKLS19Ci0tCi0tI2VuZGlmCi0tCi0tLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLQotLSNpZiBVU0VfU09MQVJJU19USFJFQURTCi0tCi0tLyogVXNlIHRoZSBvbGQgU29sYXJpcyB0aHJlYWRzIGxpYnJhcnkuICAqLwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcndsb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXZvaWQKLS1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIGlmIChtdXRleF9pbml0ICgmbG9jay0+bXV0ZXgsIFVTWU5DX1RIUkVBRCwgTlVMTCkgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBsb2NrLT5vd25lciA9ICh0aHJlYWRfdCkgMDsKLS0gIGxvY2stPmRlcHRoID0gMDsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2xvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi0tewotLSAgdGhyZWFkX3Qgc2VsZiA9IHRocl9zZWxmICgpOwotLSAgaWYgKGxvY2stPm93bmVyICE9IHNlbGYpCi0tICAgIHsKLS0gICAgICBpZiAobXV0ZXhfbG9jayAoJmxvY2stPm11dGV4KSAhPSAwKQotLQlhYm9ydCAoKTsKLS0gICAgICBsb2NrLT5vd25lciA9IHNlbGY7Ci0tICAgIH0KLS0gIGlmICgrKyhsb2NrLT5kZXB0aCkgPT0gMCkgLyogd3JhcGFyb3VuZD8gKi8KLS0gICAgYWJvcnQgKCk7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKGxvY2stPm93bmVyICE9IHRocl9zZWxmICgpKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmIChsb2NrLT5kZXB0aCA9PSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmICgtLShsb2NrLT5kZXB0aCkgPT0gMCkKLS0gICAgewotLSAgICAgIGxvY2stPm93bmVyID0gKHRocmVhZF90KSAwOwotLSAgICAgIGlmIChtdXRleF91bmxvY2sgKCZsb2NrLT5tdXRleCkgIT0gMCkKLS0JYWJvcnQgKCk7Ci0tICAgIH0KLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3kgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKGxvY2stPm93bmVyICE9ICh0aHJlYWRfdCkgMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAobXV0ZXhfZGVzdHJveSAoJmxvY2stPm11dGV4KSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfb25jZV90IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdm9pZAotLWdsdGhyZWFkX29uY2UgKGdsX29uY2VfdCAqb25jZV9jb250cm9sLCB2b2lkICgqaW5pdGZ1bmN0aW9uKSAodm9pZCkpCi0tewotLSAgaWYgKCFvbmNlX2NvbnRyb2wtPmluaXRlZCkKLS0gICAgewotLSAgICAgIC8qIFVzZSB0aGUgbXV0ZXggdG8gZ3VhcmFudGVlIHRoYXQgaWYgYW5vdGhlciB0aHJlYWQgaXMgYWxyZWFkeSBjYWxsaW5nCi0tCSB0aGUgaW5pdGZ1bmN0aW9uLCB0aGlzIHRocmVhZCB3YWl0cyB1bnRpbCBpdCdzIGZpbmlzaGVkLiAgKi8KLS0gICAgICBpZiAobXV0ZXhfbG9jayAoJm9uY2VfY29udHJvbC0+bXV0ZXgpICE9IDApCi0tCWFib3J0ICgpOwotLSAgICAgIGlmICghb25jZV9jb250cm9sLT5pbml0ZWQpCi0tCXsKLS0JICBvbmNlX2NvbnRyb2wtPmluaXRlZCA9IDE7Ci0tCSAgaW5pdGZ1bmN0aW9uICgpOwotLQl9Ci0tICAgICAgaWYgKG11dGV4X3VubG9jayAoJm9uY2VfY29udHJvbC0+bXV0ZXgpICE9IDApCi0tCWFib3J0ICgpOwotLSAgICB9Ci0tfQotLQotLWludAotLWdsdGhyZWFkX29uY2Vfc2luZ2xldGhyZWFkZWQgKGdsX29uY2VfdCAqb25jZV9jb250cm9sKQotLXsKLS0gIC8qIFdlIGtub3cgdGhhdCBnbF9vbmNlX3QgY29udGFpbnMgYW4gaW50ZWdlciB0eXBlLiAgKi8KLS0gIGlmICghb25jZV9jb250cm9sLT5pbml0ZWQpCi0tICAgIHsKLS0gICAgICAvKiBGaXJzdCB0aW1lIHVzZSBvZiBvbmNlX2NvbnRyb2wuICBJbnZlcnQgdGhlIG1hcmtlci4gICovCi0tICAgICAgb25jZV9jb250cm9sLT5pbml0ZWQgPSB+IDA7Ci0tICAgICAgcmV0dXJuIDE7Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgcmV0dXJuIDA7Ci0tfQotLQotLSNlbmRpZgotLQotLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS0KLS0jaWYgVVNFX1dJTjMyX1RIUkVBRFMKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS12b2lkCi0tZ2x0aHJlYWRfbG9ja19pbml0IChnbF9sb2NrX3QgKmxvY2spCi0tewotLSAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLSAgbG9jay0+Z3VhcmQuZG9uZSA9IDE7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9sb2NrX2xvY2sgKGdsX2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAoIWxvY2stPmd1YXJkLmRvbmUpCi0tICAgIHsKLS0gICAgICBpZiAoSW50ZXJsb2NrZWRJbmNyZW1lbnQgKCZsb2NrLT5ndWFyZC5zdGFydGVkKSA9PSAwKQotLQkvKiBUaGlzIHRocmVhZCBpcyB0aGUgZmlyc3Qgb25lIHRvIG5lZWQgdGhpcyBsb2NrLiAgSW5pdGlhbGl6ZSBpdC4gICovCi0tCWdsdGhyZWFkX2xvY2tfaW5pdCAobG9jayk7Ci0tICAgICAgZWxzZQotLQkvKiBZaWVsZCB0aGUgQ1BVIHdoaWxlIHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkIHRvIGZpbmlzaAotLQkgICBpbml0aWFsaXppbmcgdGhpcyBsb2NrLiAgKi8KLS0Jd2hpbGUgKCFsb2NrLT5ndWFyZC5kb25lKQotLQkgIFNsZWVwICgwKTsKLS0gICAgfQotLSAgRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX2xvY2tfdW5sb2NrIChnbF9sb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5ndWFyZC5kb25lKQotLSAgICBhYm9ydCAoKTsKLS0gIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9sb2NrX2Rlc3Ryb3kgKGdsX2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAoIWxvY2stPmd1YXJkLmRvbmUpCi0tICAgIGFib3J0ICgpOwotLSAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tICBsb2NrLT5ndWFyZC5kb25lID0gMDsKLS19Ci0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yd2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tc3RhdGljIGlubGluZSB2b2lkCi0tZ2xfd2FpdHF1ZXVlX2luaXQgKGdsX3dhaXRxdWV1ZV90ICp3cSkKLS17Ci0tICB3cS0+YXJyYXkgPSBOVUxMOwotLSAgd3EtPmNvdW50ID0gMDsKLS0gIHdxLT5hbGxvYyA9IDA7Ci0tICB3cS0+b2Zmc2V0ID0gMDsKLS19Ci0tCi0tLyogRW5xdWV1ZXMgdGhlIGN1cnJlbnQgdGhyZWFkLCByZXByZXNlbnRlZCBieSBhbiBldmVudCwgaW4gYSB3YWl0IHF1ZXVlLgotLSAgIFJldHVybnMgSU5WQUxJRF9IQU5ETEVfVkFMVUUgaWYgYW4gYWxsb2NhdGlvbiBmYWlsdXJlIG9jY3Vycy4gICovCi0tc3RhdGljIEhBTkRMRQotLWdsX3dhaXRxdWV1ZV9hZGQgKGdsX3dhaXRxdWV1ZV90ICp3cSkKLS17Ci0tICBIQU5ETEUgZXZlbnQ7Ci0tICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0tCi0tICBpZiAod3EtPmNvdW50ID09IHdxLT5hbGxvYykKLS0gICAgewotLSAgICAgIHVuc2lnbmVkIGludCBuZXdfYWxsb2MgPSAyICogd3EtPmFsbG9jICsgMTsKLS0gICAgICBIQU5ETEUgKm5ld19hcnJheSA9Ci0tCShIQU5ETEUgKikgcmVhbGxvYyAod3EtPmFycmF5LCBuZXdfYWxsb2MgKiBzaXplb2YgKEhBTkRMRSkpOwotLSAgICAgIGlmIChuZXdfYXJyYXkgPT0gTlVMTCkKLS0JLyogTm8gbW9yZSBtZW1vcnkuICAqLwotLQlyZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0tICAgICAgLyogTm93IGlzIGEgZ29vZCBvcHBvcnR1bml0eSB0byByb3RhdGUgdGhlIGFycmF5IHNvIHRoYXQgaXRzIGNvbnRlbnRzCi0tCSBzdGFydHMgYXQgb2Zmc2V0IDAuICAqLwotLSAgICAgIGlmICh3cS0+b2Zmc2V0ID4gMCkKLS0JewotLQkgIHVuc2lnbmVkIGludCBvbGRfY291bnQgPSB3cS0+Y291bnQ7Ci0tCSAgdW5zaWduZWQgaW50IG9sZF9hbGxvYyA9IHdxLT5hbGxvYzsKLS0JICB1bnNpZ25lZCBpbnQgb2xkX29mZnNldCA9IHdxLT5vZmZzZXQ7Ci0tCSAgdW5zaWduZWQgaW50IGk7Ci0tCSAgaWYgKG9sZF9vZmZzZXQgKyBvbGRfY291bnQgPiBvbGRfYWxsb2MpCi0tCSAgICB7Ci0tCSAgICAgIHVuc2lnbmVkIGludCBsaW1pdCA9IG9sZF9vZmZzZXQgKyBvbGRfY291bnQgLSBvbGRfYWxsb2M7Ci0tCSAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrKQotLQkJbmV3X2FycmF5W29sZF9hbGxvYyArIGldID0gbmV3X2FycmF5W2ldOwotLQkgICAgfQotLQkgIGZvciAoaSA9IDA7IGkgPCBvbGRfY291bnQ7IGkrKykKLS0JICAgIG5ld19hcnJheVtpXSA9IG5ld19hcnJheVtvbGRfb2Zmc2V0ICsgaV07Ci0tCSAgd3EtPm9mZnNldCA9IDA7Ci0tCX0KLS0gICAgICB3cS0+YXJyYXkgPSBuZXdfYXJyYXk7Ci0tICAgICAgd3EtPmFsbG9jID0gbmV3X2FsbG9jOwotLSAgICB9Ci0tICBldmVudCA9IENyZWF0ZUV2ZW50IChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7Ci0tICBpZiAoZXZlbnQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0tICAgIC8qIE5vIHdheSB0byBhbGxvY2F0ZSBhbiBldmVudC4gICovCi0tICAgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLS0gIGluZGV4ID0gd3EtPm9mZnNldCArIHdxLT5jb3VudDsKLS0gIGlmIChpbmRleCA+PSB3cS0+YWxsb2MpCi0tICAgIGluZGV4IC09IHdxLT5hbGxvYzsKLS0gIHdxLT5hcnJheVtpbmRleF0gPSBldmVudDsKLS0gIHdxLT5jb3VudCsrOwotLSAgcmV0dXJuIGV2ZW50OwotLX0KLS0KLS0vKiBOb3RpZmllcyB0aGUgZmlyc3QgdGhyZWFkIGZyb20gYSB3YWl0IHF1ZXVlIGFuZCBkZXF1ZXVlcyBpdC4gICovCi0tc3RhdGljIGlubGluZSB2b2lkCi0tZ2xfd2FpdHF1ZXVlX25vdGlmeV9maXJzdCAoZ2xfd2FpdHF1ZXVlX3QgKndxKQotLXsKLS0gIFNldEV2ZW50ICh3cS0+YXJyYXlbd3EtPm9mZnNldCArIDBdKTsKLS0gIHdxLT5vZmZzZXQrKzsKLS0gIHdxLT5jb3VudC0tOwotLSAgaWYgKHdxLT5jb3VudCA9PSAwIHx8IHdxLT5vZmZzZXQgPT0gd3EtPmFsbG9jKQotLSAgICB3cS0+b2Zmc2V0ID0gMDsKLS19Ci0tCi0tLyogTm90aWZpZXMgYWxsIHRocmVhZHMgZnJvbSBhIHdhaXQgcXVldWUgYW5kIGRlcXVldWVzIHRoZW0gYWxsLiAgKi8KLS1zdGF0aWMgaW5saW5lIHZvaWQKLS1nbF93YWl0cXVldWVfbm90aWZ5X2FsbCAoZ2xfd2FpdHF1ZXVlX3QgKndxKQotLXsKLS0gIHVuc2lnbmVkIGludCBpOwotLQotLSAgZm9yIChpID0gMDsgaSA8IHdxLT5jb3VudDsgaSsrKQotLSAgICB7Ci0tICAgICAgdW5zaWduZWQgaW50IGluZGV4ID0gd3EtPm9mZnNldCArIGk7Ci0tICAgICAgaWYgKGluZGV4ID49IHdxLT5hbGxvYykKLS0JaW5kZXggLT0gd3EtPmFsbG9jOwotLSAgICAgIFNldEV2ZW50ICh3cS0+YXJyYXlbaW5kZXhdKTsKLS0gICAgfQotLSAgd3EtPmNvdW50ID0gMDsKLS0gIHdxLT5vZmZzZXQgPSAwOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcndsb2NrX2luaXQgKGdsX3J3bG9ja190ICpsb2NrKQotLXsKLS0gIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS0gIGdsX3dhaXRxdWV1ZV9pbml0ICgmbG9jay0+d2FpdGluZ19yZWFkZXJzKTsKLS0gIGdsX3dhaXRxdWV1ZV9pbml0ICgmbG9jay0+d2FpdGluZ193cml0ZXJzKTsKLS0gIGxvY2stPnJ1bmNvdW50ID0gMDsKLS0gIGxvY2stPmd1YXJkLmRvbmUgPSAxOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcndsb2NrX3JkbG9jayAoZ2xfcndsb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5ndWFyZC5kb25lKQotLSAgICB7Ci0tICAgICAgaWYgKEludGVybG9ja2VkSW5jcmVtZW50ICgmbG9jay0+Z3VhcmQuc3RhcnRlZCkgPT0gMCkKLS0JLyogVGhpcyB0aHJlYWQgaXMgdGhlIGZpcnN0IG9uZSB0byBuZWVkIHRoaXMgbG9jay4gIEluaXRpYWxpemUgaXQuICAqLwotLQlnbHRocmVhZF9yd2xvY2tfaW5pdCAobG9jayk7Ci0tICAgICAgZWxzZQotLQkvKiBZaWVsZCB0aGUgQ1BVIHdoaWxlIHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkIHRvIGZpbmlzaAotLQkgICBpbml0aWFsaXppbmcgdGhpcyBsb2NrLiAgKi8KLS0Jd2hpbGUgKCFsb2NrLT5ndWFyZC5kb25lKQotLQkgIFNsZWVwICgwKTsKLS0gICAgfQotLSAgRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS0gIC8qIFRlc3Qgd2hldGhlciBvbmx5IHJlYWRlcnMgYXJlIGN1cnJlbnRseSBydW5uaW5nLCBhbmQgd2hldGhlciB0aGUgcnVuY291bnQKLS0gICAgIGZpZWxkIHdpbGwgbm90IG92ZXJmbG93LiAgKi8KLS0gIGlmICghKGxvY2stPnJ1bmNvdW50ICsgMSA+IDApKQotLSAgICB7Ci0tICAgICAgLyogVGhpcyB0aHJlYWQgaGFzIHRvIHdhaXQgZm9yIGEgd2hpbGUuICBFbnF1ZXVlIGl0IGFtb25nIHRoZQotLQkgd2FpdGluZ19yZWFkZXJzLiAgKi8KLS0gICAgICBIQU5ETEUgZXZlbnQgPSBnbF93YWl0cXVldWVfYWRkICgmbG9jay0+d2FpdGluZ19yZWFkZXJzKTsKLS0gICAgICBpZiAoZXZlbnQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0tCXsKLS0JICBEV09SRCByZXN1bHQ7Ci0tCSAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS0JICAvKiBXYWl0IHVudGlsIGFub3RoZXIgdGhyZWFkIHNpZ25hbHMgdGhpcyBldmVudC4gICovCi0tCSAgcmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIElORklOSVRFKTsKLS0JICBpZiAocmVzdWx0ID09IFdBSVRfRkFJTEVEIHx8IHJlc3VsdCA9PSBXQUlUX1RJTUVPVVQpCi0tCSAgICBhYm9ydCAoKTsKLS0JICBDbG9zZUhhbmRsZSAoZXZlbnQpOwotLQkgIC8qIFRoZSB0aHJlYWQgd2hpY2ggc2lnbmFsbGVkIHRoZSBldmVudCBhbHJlYWR5IGRpZCB0aGUgYm9va2tlZXBpbmc6Ci0tCSAgICAgcmVtb3ZlZCB1cyBmcm9tIHRoZSB3YWl0aW5nX3JlYWRlcnMsIGluY3JlbWVudGVkIGxvY2stPnJ1bmNvdW50LiAgKi8KLS0JICBpZiAoIShsb2NrLT5ydW5jb3VudCA+IDApKQotLQkgICAgYWJvcnQgKCk7Ci0tCSAgcmV0dXJuOwotLQl9Ci0tICAgICAgZWxzZQotLQl7Ci0tCSAgLyogQWxsb2NhdGlvbiBmYWlsdXJlLiAgV2VpcmQuICAqLwotLQkgIGRvCi0tCSAgICB7Ci0tCSAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tCSAgICAgIFNsZWVwICgxKTsKLS0JICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS0JICAgIH0KLS0JICB3aGlsZSAoIShsb2NrLT5ydW5jb3VudCArIDEgPiAwKSk7Ci0tCX0KLS0gICAgfQotLSAgbG9jay0+cnVuY291bnQrKzsKLS0gIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yd2xvY2tfd3Jsb2NrIChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAoIWxvY2stPmd1YXJkLmRvbmUpCi0tICAgIHsKLS0gICAgICBpZiAoSW50ZXJsb2NrZWRJbmNyZW1lbnQgKCZsb2NrLT5ndWFyZC5zdGFydGVkKSA9PSAwKQotLQkvKiBUaGlzIHRocmVhZCBpcyB0aGUgZmlyc3Qgb25lIHRvIG5lZWQgdGhpcyBsb2NrLiAgSW5pdGlhbGl6ZSBpdC4gICovCi0tCWdsdGhyZWFkX3J3bG9ja19pbml0IChsb2NrKTsKLS0gICAgICBlbHNlCi0tCS8qIFlpZWxkIHRoZSBDUFUgd2hpbGUgd2FpdGluZyBmb3IgYW5vdGhlciB0aHJlYWQgdG8gZmluaXNoCi0tCSAgIGluaXRpYWxpemluZyB0aGlzIGxvY2suICAqLwotLQl3aGlsZSAoIWxvY2stPmd1YXJkLmRvbmUpCi0tCSAgU2xlZXAgKDApOwotLSAgICB9Ci0tICBFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLSAgLyogVGVzdCB3aGV0aGVyIG5vIHJlYWRlcnMgb3Igd3JpdGVycyBhcmUgY3VycmVudGx5IHJ1bm5pbmcuICAqLwotLSAgaWYgKCEobG9jay0+cnVuY291bnQgPT0gMCkpCi0tICAgIHsKLS0gICAgICAvKiBUaGlzIHRocmVhZCBoYXMgdG8gd2FpdCBmb3IgYSB3aGlsZS4gIEVucXVldWUgaXQgYW1vbmcgdGhlCi0tCSB3YWl0aW5nX3dyaXRlcnMuICAqLwotLSAgICAgIEhBTkRMRSBldmVudCA9IGdsX3dhaXRxdWV1ZV9hZGQgKCZsb2NrLT53YWl0aW5nX3dyaXRlcnMpOwotLSAgICAgIGlmIChldmVudCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLS0JewotLQkgIERXT1JEIHJlc3VsdDsKLS0JICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLQkgIC8qIFdhaXQgdW50aWwgYW5vdGhlciB0aHJlYWQgc2lnbmFscyB0aGlzIGV2ZW50LiAgKi8KLS0JICByZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0IChldmVudCwgSU5GSU5JVEUpOwotLQkgIGlmIChyZXN1bHQgPT0gV0FJVF9GQUlMRUQgfHwgcmVzdWx0ID09IFdBSVRfVElNRU9VVCkKLS0JICAgIGFib3J0ICgpOwotLQkgIENsb3NlSGFuZGxlIChldmVudCk7Ci0tCSAgLyogVGhlIHRocmVhZCB3aGljaCBzaWduYWxsZWQgdGhlIGV2ZW50IGFscmVhZHkgZGlkIHRoZSBib29ra2VlcGluZzoKLS0JICAgICByZW1vdmVkIHVzIGZyb20gdGhlIHdhaXRpbmdfd3JpdGVycywgc2V0IGxvY2stPnJ1bmNvdW50ID0gLTEuICAqLwotLQkgIGlmICghKGxvY2stPnJ1bmNvdW50ID09IC0xKSkKLS0JICAgIGFib3J0ICgpOwotLQkgIHJldHVybjsKLS0JfQotLSAgICAgIGVsc2UKLS0JewotLQkgIC8qIEFsbG9jYXRpb24gZmFpbHVyZS4gIFdlaXJkLiAgKi8KLS0JICBkbwotLQkgICAgewotLQkgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLQkgICAgICBTbGVlcCAoMSk7Ci0tCSAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tCSAgICB9Ci0tCSAgd2hpbGUgKCEobG9jay0+cnVuY291bnQgPT0gMCkpOwotLQl9Ci0tICAgIH0KLS0gIGxvY2stPnJ1bmNvdW50LS07IC8qIHJ1bmNvdW50IGJlY29tZXMgLTEgKi8KLS0gIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yd2xvY2tfdW5sb2NrIChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAoIWxvY2stPmd1YXJkLmRvbmUpCi0tICAgIGFib3J0ICgpOwotLSAgRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS0gIGlmIChsb2NrLT5ydW5jb3VudCA8IDApCi0tICAgIHsKLS0gICAgICAvKiBEcm9wIGEgd3JpdGVyIGxvY2suICAqLwotLSAgICAgIGlmICghKGxvY2stPnJ1bmNvdW50ID09IC0xKSkKLS0JYWJvcnQgKCk7Ci0tICAgICAgbG9jay0+cnVuY291bnQgPSAwOwotLSAgICB9Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICAvKiBEcm9wIGEgcmVhZGVyIGxvY2suICAqLwotLSAgICAgIGlmICghKGxvY2stPnJ1bmNvdW50ID4gMCkpCi0tCWFib3J0ICgpOwotLSAgICAgIGxvY2stPnJ1bmNvdW50LS07Ci0tICAgIH0KLS0gIGlmIChsb2NrLT5ydW5jb3VudCA9PSAwKQotLSAgICB7Ci0tICAgICAgLyogUE9TSVggcmVjb21tZW5kcyB0aGF0ICJ3cml0ZSBsb2NrcyBzaGFsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciByZWFkCi0tCSBsb2NrcyIsIHRvIGF2b2lkICJ3cml0ZXIgc3RhcnZhdGlvbiIuICAqLwotLSAgICAgIGlmIChsb2NrLT53YWl0aW5nX3dyaXRlcnMuY291bnQgPiAwKQotLQl7Ci0tCSAgLyogV2FrZSB1cCBvbmUgb2YgdGhlIHdhaXRpbmcgd3JpdGVycy4gICovCi0tCSAgbG9jay0+cnVuY291bnQtLTsKLS0JICBnbF93YWl0cXVldWVfbm90aWZ5X2ZpcnN0ICgmbG9jay0+d2FpdGluZ193cml0ZXJzKTsKLS0JfQotLSAgICAgIGVsc2UKLS0JewotLQkgIC8qIFdha2UgdXAgYWxsIHdhaXRpbmcgcmVhZGVycy4gICovCi0tCSAgbG9jay0+cnVuY291bnQgKz0gbG9jay0+d2FpdGluZ19yZWFkZXJzLmNvdW50OwotLQkgIGdsX3dhaXRxdWV1ZV9ub3RpZnlfYWxsICgmbG9jay0+d2FpdGluZ19yZWFkZXJzKTsKLS0JfQotLSAgICB9Ci0tICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKGdsX3J3bG9ja190ICpsb2NrKQotLXsKLS0gIGlmICghbG9jay0+Z3VhcmQuZG9uZSkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAobG9jay0+cnVuY291bnQgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBEZWxldGVDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS0gIGlmIChsb2NrLT53YWl0aW5nX3JlYWRlcnMuYXJyYXkgIT0gTlVMTCkKLS0gICAgZnJlZSAobG9jay0+d2FpdGluZ19yZWFkZXJzLmFycmF5KTsKLS0gIGlmIChsb2NrLT53YWl0aW5nX3dyaXRlcnMuYXJyYXkgIT0gTlVMTCkKLS0gICAgZnJlZSAobG9jay0+d2FpdGluZ193cml0ZXJzLmFycmF5KTsKLS0gIGxvY2stPmd1YXJkLmRvbmUgPSAwOwotLX0KLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcmVjdXJzaXZlX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jaykKLS17Ci0tICBsb2NrLT5vd25lciA9IDA7Ci0tICBsb2NrLT5kZXB0aCA9IDA7Ci0tICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tICBsb2NrLT5ndWFyZC5kb25lID0gMTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2xvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5ndWFyZC5kb25lKQotLSAgICB7Ci0tICAgICAgaWYgKEludGVybG9ja2VkSW5jcmVtZW50ICgmbG9jay0+Z3VhcmQuc3RhcnRlZCkgPT0gMCkKLS0JLyogVGhpcyB0aHJlYWQgaXMgdGhlIGZpcnN0IG9uZSB0byBuZWVkIHRoaXMgbG9jay4gIEluaXRpYWxpemUgaXQuICAqLwotLQlnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0IChsb2NrKTsKLS0gICAgICBlbHNlCi0tCS8qIFlpZWxkIHRoZSBDUFUgd2hpbGUgd2FpdGluZyBmb3IgYW5vdGhlciB0aHJlYWQgdG8gZmluaXNoCi0tCSAgIGluaXRpYWxpemluZyB0aGlzIGxvY2suICAqLwotLQl3aGlsZSAoIWxvY2stPmd1YXJkLmRvbmUpCi0tCSAgU2xlZXAgKDApOwotLSAgICB9Ci0tICB7Ci0tICAgIERXT1JEIHNlbGYgPSBHZXRDdXJyZW50VGhyZWFkSWQgKCk7Ci0tICAgIGlmIChsb2NrLT5vd25lciAhPSBzZWxmKQotLSAgICAgIHsKLS0JRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS0JbG9jay0+b3duZXIgPSBzZWxmOwotLSAgICAgIH0KLS0gICAgaWYgKCsrKGxvY2stPmRlcHRoKSA9PSAwKSAvKiB3cmFwYXJvdW5kPyAqLwotLSAgICAgIGFib3J0ICgpOwotLSAgfQotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIGlmIChsb2NrLT5vd25lciAhPSBHZXRDdXJyZW50VGhyZWFkSWQgKCkpCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKGxvY2stPmRlcHRoID09IDApCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKC0tKGxvY2stPmRlcHRoKSA9PSAwKQotLSAgICB7Ci0tICAgICAgbG9jay0+b3duZXIgPSAwOwotLSAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tICAgIH0KLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3kgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKGxvY2stPm93bmVyICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tICBsb2NrLT5ndWFyZC5kb25lID0gMDsKLS19Ci0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfb25jZV90IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdm9pZAotLWdsdGhyZWFkX29uY2UgKGdsX29uY2VfdCAqb25jZV9jb250cm9sLCB2b2lkICgqaW5pdGZ1bmN0aW9uKSAodm9pZCkpCi0tewotLSAgaWYgKG9uY2VfY29udHJvbC0+aW5pdGVkIDw9IDApCi0tICAgIHsKLS0gICAgICBpZiAoSW50ZXJsb2NrZWRJbmNyZW1lbnQgKCZvbmNlX2NvbnRyb2wtPnN0YXJ0ZWQpID09IDApCi0tCXsKLS0JICAvKiBUaGlzIHRocmVhZCBpcyB0aGUgZmlyc3Qgb25lIHRvIGNvbWUgdG8gdGhpcyBvbmNlX2NvbnRyb2wuICAqLwotLQkgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24gKCZvbmNlX2NvbnRyb2wtPmxvY2spOwotLQkgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmb25jZV9jb250cm9sLT5sb2NrKTsKLS0JICBvbmNlX2NvbnRyb2wtPmluaXRlZCA9IDA7Ci0tCSAgaW5pdGZ1bmN0aW9uICgpOwotLQkgIG9uY2VfY29udHJvbC0+aW5pdGVkID0gMTsKLS0JICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJm9uY2VfY29udHJvbC0+bG9jayk7Ci0tCX0KLS0gICAgICBlbHNlCi0tCXsKLS0JICAvKiBVbmRvIGxhc3Qgb3BlcmF0aW9uLiAgKi8KLS0JICBJbnRlcmxvY2tlZERlY3JlbWVudCAoJm9uY2VfY29udHJvbC0+c3RhcnRlZCk7Ci0tCSAgLyogU29tZSBvdGhlciB0aHJlYWQgaGFzIGFscmVhZHkgc3RhcnRlZCB0aGUgaW5pdGlhbGl6YXRpb24uCi0tCSAgICAgWWllbGQgdGhlIENQVSB3aGlsZSB3YWl0aW5nIGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIGZpbmlzaAotLQkgICAgIGluaXRpYWxpemluZyBhbmQgdGFraW5nIHRoZSBsb2NrLiAgKi8KLS0JICB3aGlsZSAob25jZV9jb250cm9sLT5pbml0ZWQgPCAwKQotLQkgICAgU2xlZXAgKDApOwotLQkgIGlmIChvbmNlX2NvbnRyb2wtPmluaXRlZCA8PSAwKQotLQkgICAgewotLQkgICAgICAvKiBUYWtlIHRoZSBsb2NrLiAgVGhpcyBibG9ja3MgdW50aWwgdGhlIG90aGVyIHRocmVhZCBoYXMKLS0JCSBmaW5pc2hlZCBjYWxsaW5nIHRoZSBpbml0ZnVuY3Rpb24uICAqLwotLQkgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiAoJm9uY2VfY29udHJvbC0+bG9jayk7Ci0tCSAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmb25jZV9jb250cm9sLT5sb2NrKTsKLS0JICAgICAgaWYgKCEob25jZV9jb250cm9sLT5pbml0ZWQgPiAwKSkKLS0JCWFib3J0ICgpOwotLQkgICAgfQotLQl9Ci0tICAgIH0KLS19Ci0tCi0tI2VuZGlmCi0tCi0tLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLS0tIGEvaW50bC9sb2NrLmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDExMDUgKzAsMCBAQAotLS8qIExvY2tpbmcgaW4gbXVsdGl0aHJlYWRlZCBzaXR1YXRpb25zLgotLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tLyogV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4sIDIwMDUuCi0tICAgQmFzZWQgb24gR0NDJ3MgZ3Roci1wb3NpeC5oLCBndGhyLXBvc2l4OTUuaCwgZ3Roci1zb2xhcmlzLmgsCi0tICAgZ3Roci13aW4zMi5oLiAgKi8KLS0KLS0vKiBUaGlzIGZpbGUgY29udGFpbnMgbG9ja2luZyBwcmltaXRpdmVzIGZvciB1c2Ugd2l0aCBhIGdpdmVuIHRocmVhZCBsaWJyYXJ5LgotLSAgIEl0IGRvZXMgbm90IGNvbnRhaW4gcHJpbWl0aXZlcyBmb3IgY3JlYXRpbmcgdGhyZWFkcyBvciBmb3Igb3RoZXIKLS0gICBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KLS0KLS0gICBOb3JtYWwgKG5vbi1yZWN1cnNpdmUpIGxvY2tzOgotLSAgICAgVHlwZTogICAgICAgICAgICAgICAgZ2xfbG9ja190Ci0tICAgICBEZWNsYXJhdGlvbjogICAgICAgICBnbF9sb2NrX2RlZmluZShleHRlcm4sIG5hbWUpCi0tICAgICBJbml0aWFsaXplcjogICAgICAgICBnbF9sb2NrX2RlZmluZV9pbml0aWFsaXplZCgsIG5hbWUpCi0tICAgICBJbml0aWFsaXphdGlvbjogICAgICBnbF9sb2NrX2luaXQgKG5hbWUpOwotLSAgICAgVGFraW5nIHRoZSBsb2NrOiAgICAgZ2xfbG9ja19sb2NrIChuYW1lKTsKLS0gICAgIFJlbGVhc2luZyB0aGUgbG9jazogIGdsX2xvY2tfdW5sb2NrIChuYW1lKTsKLS0gICAgIERlLWluaXRpYWxpemF0aW9uOiAgIGdsX2xvY2tfZGVzdHJveSAobmFtZSk7Ci0tCi0tICAgUmVhZC1Xcml0ZSAobm9uLXJlY3Vyc2l2ZSkgbG9ja3M6Ci0tICAgICBUeXBlOiAgICAgICAgICAgICAgICBnbF9yd2xvY2tfdAotLSAgICAgRGVjbGFyYXRpb246ICAgICAgICAgZ2xfcndsb2NrX2RlZmluZShleHRlcm4sIG5hbWUpCi0tICAgICBJbml0aWFsaXplcjogICAgICAgICBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKCwgbmFtZSkKLS0gICAgIEluaXRpYWxpemF0aW9uOiAgICAgIGdsX3J3bG9ja19pbml0IChuYW1lKTsKLS0gICAgIFRha2luZyB0aGUgbG9jazogICAgIGdsX3J3bG9ja19yZGxvY2sgKG5hbWUpOwotLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfcndsb2NrX3dybG9jayAobmFtZSk7Ci0tICAgICBSZWxlYXNpbmcgdGhlIGxvY2s6ICBnbF9yd2xvY2tfdW5sb2NrIChuYW1lKTsKLS0gICAgIERlLWluaXRpYWxpemF0aW9uOiAgIGdsX3J3bG9ja19kZXN0cm95IChuYW1lKTsKLS0KLS0gICBSZWN1cnNpdmUgbG9ja3M6Ci0tICAgICBUeXBlOiAgICAgICAgICAgICAgICBnbF9yZWN1cnNpdmVfbG9ja190Ci0tICAgICBEZWNsYXJhdGlvbjogICAgICAgICBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmUoZXh0ZXJuLCBuYW1lKQotLSAgICAgSW5pdGlhbGl6ZXI6ICAgICAgICAgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKCwgbmFtZSkKLS0gICAgIEluaXRpYWxpemF0aW9uOiAgICAgIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKG5hbWUpOwotLSAgICAgVGFraW5nIHRoZSBsb2NrOiAgICAgZ2xfcmVjdXJzaXZlX2xvY2tfbG9jayAobmFtZSk7Ci0tICAgICBSZWxlYXNpbmcgdGhlIGxvY2s6ICBnbF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKG5hbWUpOwotLSAgICAgRGUtaW5pdGlhbGl6YXRpb246ICAgZ2xfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAobmFtZSk7Ci0tCi0tICBPbmNlLW9ubHkgZXhlY3V0aW9uOgotLSAgICAgVHlwZTogICAgICAgICAgICAgICAgZ2xfb25jZV90Ci0tICAgICBJbml0aWFsaXplcjogICAgICAgICBnbF9vbmNlX2RlZmluZShleHRlcm4sIG5hbWUpCi0tICAgICBFeGVjdXRpb246ICAgICAgICAgICBnbF9vbmNlIChuYW1lLCBpbml0ZnVuY3Rpb24pOwotLSovCi0tCi0tCi0tI2lmbmRlZiBfTE9DS19ICi0tI2RlZmluZSBfTE9DS19ICi0tCi0tLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLQotLSNpZiBVU0VfUE9TSVhfVEhSRUFEUwotLQotLS8qIFVzZSB0aGUgUE9TSVggdGhyZWFkcyBsaWJyYXJ5LiAgKi8KLS0KLS0jIGluY2x1ZGUgPHB0aHJlYWQuaD4KLS0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotLQotLSMgaWZkZWYgX19jcGx1c3BsdXMKLS1leHRlcm4gIkMiIHsKLS0jIGVuZGlmCi0tCi0tIyBpZiBQVEhSRUFEX0lOX1VTRV9ERVRFQ1RJT05fSEFSRAotLQotLS8qIFRoZSBwdGhyZWFkX2luX3VzZSgpIGRldGVjdGlvbiBuZWVkcyB0byBiZSBkb25lIGF0IHJ1bnRpbWUuICAqLwotLSMgIGRlZmluZSBwdGhyZWFkX2luX3VzZSgpIFwKLS0gICAgIGdsdGhyZWFkX2luX3VzZSAoKQotLWV4dGVybiBpbnQgZ2x0aHJlYWRfaW5fdXNlICh2b2lkKTsKLS0KLS0jIGVuZGlmCi0tCi0tIyBpZiBVU0VfUE9TSVhfVEhSRUFEU19XRUFLCi0tCi0tLyogVXNlIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUgUE9TSVggdGhyZWFkcyBsaWJyYXJ5LiAgKi8KLS0KLS0vKiBXZWFrIHJlZmVyZW5jZXMgYXZvaWQgZHJhZ2dpbmcgaW4gZXh0ZXJuYWwgbGlicmFyaWVzIGlmIHRoZSBvdGhlciBwYXJ0cwotLSAgIG9mIHRoZSBwcm9ncmFtIGRvbid0IHVzZSB0aGVtLiAgSGVyZSB3ZSB1c2UgdGhlbSwgYmVjYXVzZSB3ZSBkb24ndCB3YW50Ci0tICAgZXZlcnkgcHJvZ3JhbSB0aGF0IHVzZXMgbGliaW50bCB0byBkZXBlbmQgb24gbGlicHRocmVhZC4gIFRoaXMgYXNzdW1lcwotLSAgIHRoYXQgbGlicHRocmVhZCB3b3VsZCBub3QgYmUgbG9hZGVkIGFmdGVyIGxpYmludGw7IGkuZS4gaWYgbGliaW50bCBpcwotLSAgIGxvYWRlZCBmaXJzdCwgYnkgYW4gZXhlY3V0YWJsZSB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiBsaWJwdGhyZWFkLCBhbmQKLS0gICB0aGVuIGEgbW9kdWxlIGlzIGR5bmFtaWNhbGx5IGxvYWRlZCB0aGF0IGRlcGVuZHMgb24gbGlicHRocmVhZCwgbGliaW50bAotLSAgIHdpbGwgbm90IGJlIG11bHRpdGhyZWFkLXNhZmUuICAqLwotLQotLS8qIFRoZSB3YXkgdG8gdGVzdCBhdCBydW50aW1lIHdoZXRoZXIgbGlicHRocmVhZCBpcyBwcmVzZW50IGlzIHRvIHRlc3QKLS0gICB3aGV0aGVyIGEgZnVuY3Rpb24gcG9pbnRlcidzIHZhbHVlLCBzdWNoIGFzICZwdGhyZWFkX211dGV4X2luaXQsIGlzCi0tICAgbm9uLU5VTEwuICBIb3dldmVyLCBzb21lIHZlcnNpb25zIG9mIEdDQyBoYXZlIGEgYnVnIHRocm91Z2ggd2hpY2gsIGluCi0tICAgUElDIG1vZGUsICZmb28gIT0gTlVMTCBhbHdheXMgZXZhbHVhdGVzIHRvIHRydWUgaWYgdGhlcmUgaXMgYSBkaXJlY3QKLS0gICBjYWxsIHRvIGZvbyguLi4pIGluIHRoZSBzYW1lIGZ1bmN0aW9uLiAgVG8gYXZvaWQgdGhpcywgd2UgdGVzdCB0aGUKLS0gICBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gaW4gbGlicHRocmVhZCB0aGF0IHdlIGRvbid0IHVzZS4gICovCi0tCi0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9tdXRleF9pbml0Ci0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9tdXRleF9sb2NrCi0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9tdXRleF91bmxvY2sKLS0jICBwcmFnbWEgd2VhayBwdGhyZWFkX211dGV4X2Rlc3Ryb3kKLS0jICBwcmFnbWEgd2VhayBwdGhyZWFkX3J3bG9ja19pbml0Ci0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9yd2xvY2tfcmRsb2NrCi0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9yd2xvY2tfd3Jsb2NrCi0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9yd2xvY2tfdW5sb2NrCi0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9yd2xvY2tfZGVzdHJveQotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfb25jZQotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfY29uZF9pbml0Ci0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9jb25kX3dhaXQKLS0jICBwcmFnbWEgd2VhayBwdGhyZWFkX2NvbmRfc2lnbmFsCi0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9jb25kX2Jyb2FkY2FzdAotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfY29uZF9kZXN0cm95Ci0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9tdXRleGF0dHJfaW5pdAotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUKLS0jICBwcmFnbWEgd2VhayBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95Ci0tIyAgaWZuZGVmIHB0aHJlYWRfc2VsZgotLSMgICBwcmFnbWEgd2VhayBwdGhyZWFkX3NlbGYKLS0jICBlbmRpZgotLQotLSMgIGlmICFQVEhSRUFEX0lOX1VTRV9ERVRFQ1RJT05fSEFSRAotLSMgICBwcmFnbWEgd2VhayBwdGhyZWFkX2NhbmNlbAotLSMgICBkZWZpbmUgcHRocmVhZF9pbl91c2UoKSAocHRocmVhZF9jYW5jZWwgIT0gTlVMTCkKLS0jICBlbmRpZgotLQotLSMgZWxzZQotLQotLSMgIGlmICFQVEhSRUFEX0lOX1VTRV9ERVRFQ1RJT05fSEFSRAotLSMgICBkZWZpbmUgcHRocmVhZF9pbl91c2UoKSAxCi0tIyAgZW5kaWYKLS0KLS0jIGVuZGlmCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiBwdGhyZWFkX211dGV4X3QgZ2xfbG9ja190OwotLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgcHRocmVhZF9tdXRleF90IE5BTUU7Ci0tIyBkZWZpbmUgZ2xfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgIFNUT1JBR0VDTEFTUyBwdGhyZWFkX211dGV4X3QgTkFNRSA9IGdsX2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyBkZWZpbmUgZ2xfbG9ja19pbml0aWFsaXplciBcCi0tICAgIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKLS0jIGRlZmluZSBnbF9sb2NrX2luaXQoTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9tdXRleF9pbml0ICgmTkFNRSwgTlVMTCkgIT0gMCkgXAotLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX2xvY2tfbG9jayhOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX211dGV4X2xvY2sgKCZOQU1FKSAhPSAwKSBcCi0tICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfbG9ja191bmxvY2soTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9tdXRleF9kZXN0cm95ICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcndsb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLSMgaWYgSEFWRV9QVEhSRUFEX1JXTE9DSwotLQotLSMgIGlmZGVmIFBUSFJFQURfUldMT0NLX0lOSVRJQUxJWkVSCi0tCi0tdHlwZWRlZiBwdGhyZWFkX3J3bG9ja190IGdsX3J3bG9ja190OwotLSMgICBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgICBTVE9SQUdFQ0xBU1MgcHRocmVhZF9yd2xvY2tfdCBOQU1FOwotLSMgICBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgICBTVE9SQUdFQ0xBU1MgcHRocmVhZF9yd2xvY2tfdCBOQU1FID0gZ2xfcndsb2NrX2luaXRpYWxpemVyOwotLSMgICBkZWZpbmUgZ2xfcndsb2NrX2luaXRpYWxpemVyIFwKLS0gICAgICBQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUgotLSMgICBkZWZpbmUgZ2xfcndsb2NrX2luaXQoTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX3J3bG9ja19pbml0ICgmTkFNRSwgTlVMTCkgIT0gMCkgXAotLSAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tIyAgIGRlZmluZSBnbF9yd2xvY2tfcmRsb2NrKE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfcndsb2NrX3JkbG9jayAoJk5BTUUpICE9IDApIFwKLS0gICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS0jICAgZGVmaW5lIGdsX3J3bG9ja193cmxvY2soTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9yd2xvY2tfd3Jsb2NrICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHdoaWxlICgwKQotLSMgICBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayhOQU1FKSBcCi0tICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX3J3bG9ja191bmxvY2sgKCZOQU1FKSAhPSAwKSBcCi0tICAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tIyAgIGRlZmluZSBnbF9yd2xvY2tfZGVzdHJveShOQU1FKSBcCi0tICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKCZOQU1FKSAhPSAwKSBcCi0tICAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS0KLS0jICBlbHNlCi0tCi0tdHlwZWRlZiBzdHJ1Y3QKLS0gICAgICAgIHsKLS0gICAgICAgICAgaW50IGluaXRpYWxpemVkOwotLSAgICAgICAgICBwdGhyZWFkX211dGV4X3QgZ3VhcmQ7ICAgLyogcHJvdGVjdHMgdGhlIGluaXRpYWxpemF0aW9uICovCi0tICAgICAgICAgIHB0aHJlYWRfcndsb2NrX3Qgcndsb2NrOyAvKiByZWFkLXdyaXRlIGxvY2sgKi8KLS0gICAgICAgIH0KLS0gICAgICAgIGdsX3J3bG9ja190OwotLSMgICBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgICBTVE9SQUdFQ0xBU1MgZ2xfcndsb2NrX3QgTkFNRTsKLS0jICAgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgICAgU1RPUkFHRUNMQVNTIGdsX3J3bG9ja190IE5BTUUgPSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyAgIGRlZmluZSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICAgIHsgMCwgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiB9Ci0tIyAgIGRlZmluZSBnbF9yd2xvY2tfaW5pdChOQU1FKSBcCi0tICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICBcCi0tICAgICAgICAgICAgZ2x0aHJlYWRfcndsb2NrX2luaXQgKCZOQU1FKTsgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS0jICAgZGVmaW5lIGdsX3J3bG9ja19yZGxvY2soTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgXAotLSAgICAgICAgICAgIGdsdGhyZWFkX3J3bG9ja19yZGxvY2sgKCZOQU1FKTsgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHdoaWxlICgwKQotLSMgICBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayhOQU1FKSBcCi0tICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICBcCi0tICAgICAgICAgICAgZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoJk5BTUUpOyBcCi0tICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tIyAgIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgIFwKLS0gICAgICAgICAgICBnbHRocmVhZF9yd2xvY2tfdW5sb2NrICgmTkFNRSk7IFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS0jICAgZGVmaW5lIGdsX3J3bG9ja19kZXN0cm95KE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgIFwKLS0gICAgICAgICAgICBnbHRocmVhZF9yd2xvY2tfZGVzdHJveSAoJk5BTUUpOyBcCi0tICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHdoaWxlICgwKQotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja19pbml0IChnbF9yd2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3JkbG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja193cmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfdW5sb2NrIChnbF9yd2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKGdsX3J3bG9ja190ICpsb2NrKTsKLS0KLS0jICBlbmRpZgotLQotLSMgZWxzZQotLQotLXR5cGVkZWYgc3RydWN0Ci0tICAgICAgICB7Ci0tICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBsb2NrOyAvKiBwcm90ZWN0cyB0aGUgcmVtYWluaW5nIGZpZWxkcyAqLwotLSAgICAgICAgICBwdGhyZWFkX2NvbmRfdCB3YWl0aW5nX3JlYWRlcnM7IC8qIHdhaXRpbmcgcmVhZGVycyAqLwotLSAgICAgICAgICBwdGhyZWFkX2NvbmRfdCB3YWl0aW5nX3dyaXRlcnM7IC8qIHdhaXRpbmcgd3JpdGVycyAqLwotLSAgICAgICAgICB1bnNpZ25lZCBpbnQgd2FpdGluZ193cml0ZXJzX2NvdW50OyAvKiBudW1iZXIgb2Ygd2FpdGluZyB3cml0ZXJzICovCi0tICAgICAgICAgIGludCBydW5jb3VudDsgLyogbnVtYmVyIG9mIHJlYWRlcnMgcnVubmluZywgb3IgLTEgd2hlbiBhIHdyaXRlciBydW5zICovCi0tICAgICAgICB9Ci0tICAgICAgICBnbF9yd2xvY2tfdDsKLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgZ2xfcndsb2NrX3QgTkFNRTsKLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgZ2xfcndsb2NrX3QgTkFNRSA9IGdsX3J3bG9ja19pbml0aWFsaXplcjsKLS0jIGRlZmluZSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICB7IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUiwgUFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSLCAwLCAwIH0KLS0jIGRlZmluZSBnbF9yd2xvY2tfaW5pdChOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICBcCi0tICAgICAgICAgIGdsdGhyZWFkX3J3bG9ja19pbml0ICgmTkFNRSk7IFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9yd2xvY2tfcmRsb2NrKE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgIFwKLS0gICAgICAgICAgZ2x0aHJlYWRfcndsb2NrX3JkbG9jayAoJk5BTUUpOyBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrKE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgIFwKLS0gICAgICAgICAgZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoJk5BTUUpOyBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgIFwKLS0gICAgICAgICAgZ2x0aHJlYWRfcndsb2NrX3VubG9jayAoJk5BTUUpOyBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVzdHJveShOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICBcCi0tICAgICAgICAgIGdsdGhyZWFkX3J3bG9ja19kZXN0cm95ICgmTkFNRSk7IFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfaW5pdCAoZ2xfcndsb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja19yZGxvY2sgKGdsX3J3bG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfd3Jsb2NrIChnbF9yd2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3VubG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja19kZXN0cm95IChnbF9yd2xvY2tfdCAqbG9jayk7Ci0tCi0tIyBlbmRpZgotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLSMgaWYgSEFWRV9QVEhSRUFEX01VVEVYX1JFQ1VSU0lWRQotLQotLSMgIGlmIGRlZmluZWQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVIgfHwgZGVmaW5lZCBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAotLQotLXR5cGVkZWYgcHRocmVhZF9tdXRleF90IGdsX3JlY3Vyc2l2ZV9sb2NrX3Q7Ci0tIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgICAgU1RPUkFHRUNMQVNTIHB0aHJlYWRfbXV0ZXhfdCBOQU1FOwotLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICAgIFNUT1JBR0VDTEFTUyBwdGhyZWFkX211dGV4X3QgTkFNRSA9IGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXRpYWxpemVyOwotLSMgICBpZmRlZiBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUgotLSMgICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXRpYWxpemVyIFwKLS0gICAgICAgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVIKLS0jICAgZWxzZQotLSMgICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXRpYWxpemVyIFwKLS0gICAgICAgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKLS0jICAgZW5kaWYKLS0jICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXQoTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9tdXRleF9pbml0ICgmTkFNRSwgTlVMTCkgIT0gMCkgXAotLSAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHdoaWxlICgwKQotLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfbG9jayhOQU1FKSBcCi0tICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX211dGV4X2xvY2sgKCZOQU1FKSAhPSAwKSBcCi0tICAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja191bmxvY2soTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS0jICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9tdXRleF9kZXN0cm95ICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHdoaWxlICgwKQotLQotLSMgIGVsc2UKLS0KLS10eXBlZGVmIHN0cnVjdAotLSAgICAgICAgewotLSAgICAgICAgICBwdGhyZWFkX211dGV4X3QgcmVjbXV0ZXg7IC8qIHJlY3Vyc2l2ZSBtdXRleCAqLwotLSAgICAgICAgICBwdGhyZWFkX211dGV4X3QgZ3VhcmQ7ICAgIC8qIHByb3RlY3RzIHRoZSBpbml0aWFsaXphdGlvbiAqLwotLSAgICAgICAgICBpbnQgaW5pdGlhbGl6ZWQ7Ci0tICAgICAgICB9Ci0tICAgICAgICBnbF9yZWN1cnNpdmVfbG9ja190OwotLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICAgIFNUT1JBR0VDTEFTUyBnbF9yZWN1cnNpdmVfbG9ja190IE5BTUU7Ci0tIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgICAgU1RPUkFHRUNMQVNTIGdsX3JlY3Vyc2l2ZV9sb2NrX3QgTkFNRSA9IGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXRpYWxpemVyOwotLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICAgIHsgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiwgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiwgMCB9Ci0tIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0KE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0ICgmTkFNRSk7IFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS0jICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2xvY2soTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2xvY2sgKCZOQU1FKTsgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHdoaWxlICgwKQotLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKCZOQU1FKTsgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZXN0cm95KE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95ICgmTkFNRSk7IFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3kgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotLQotLSMgIGVuZGlmCi0tCi0tIyBlbHNlCi0tCi0tLyogT2xkIHZlcnNpb25zIG9mIFBPU0lYIHRocmVhZHMgb24gU29sYXJpcyBkaWQgbm90IGhhdmUgcmVjdXJzaXZlIGxvY2tzLgotLSAgIFdlIGhhdmUgdG8gaW1wbGVtZW50IHRoZW0gb3Vyc2VsdmVzLiAgKi8KLS0KLS10eXBlZGVmIHN0cnVjdAotLSAgICAgICAgewotLSAgICAgICAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Ci0tICAgICAgICAgIHB0aHJlYWRfdCBvd25lcjsKLS0gICAgICAgICAgdW5zaWduZWQgbG9uZyBkZXB0aDsKLS0gICAgICAgIH0KLS0gICAgICAgIGdsX3JlY3Vyc2l2ZV9sb2NrX3Q7Ci0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgIFNUT1JBR0VDTEFTUyBnbF9yZWN1cnNpdmVfbG9ja190IE5BTUU7Ci0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgIFNUT1JBR0VDTEFTUyBnbF9yZWN1cnNpdmVfbG9ja190IE5BTUUgPSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplcjsKLS0jICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICAgeyBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSLCAocHRocmVhZF90KSAwLCAwIH0KLS0jICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdChOQU1FKSBcCi0tICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0ICgmTkFNRSk7IFwKLS0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgd2hpbGUgKDApCi0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2xvY2soTkFNRSkgXAotLSAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfbG9jayAoJk5BTUUpOyBcCi0tICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgIHdoaWxlICgwKQotLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja191bmxvY2soTkFNRSkgXAotLSAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrICgmTkFNRSk7IFwKLS0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICB3aGlsZSAoMCkKLS0jICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVzdHJveShOQU1FKSBcCi0tICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95ICgmTkFNRSk7IFwKLS0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgd2hpbGUgKDApCi0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfbG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS0KLS0jIGVuZGlmCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfb25jZV90IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiBwdGhyZWFkX29uY2VfdCBnbF9vbmNlX3Q7Ci0tIyBkZWZpbmUgZ2xfb25jZV9kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgIFNUT1JBR0VDTEFTUyBwdGhyZWFkX29uY2VfdCBOQU1FID0gUFRIUkVBRF9PTkNFX0lOSVQ7Ci0tIyBkZWZpbmUgZ2xfb25jZShOQU1FLCBJTklURlVOQ1RJT04pIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgaWYgKHB0aHJlYWRfb25jZSAoJk5BTUUsIElOSVRGVU5DVElPTikgIT0gMCkgXAotLSAgICAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgICBpZiAoZ2x0aHJlYWRfb25jZV9zaW5nbGV0aHJlYWRlZCAoJk5BTUUpKSAgICBcCi0tICAgICAgICAgICAgICBJTklURlVOQ1RJT04gKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLWV4dGVybiBpbnQgZ2x0aHJlYWRfb25jZV9zaW5nbGV0aHJlYWRlZCAocHRocmVhZF9vbmNlX3QgKm9uY2VfY29udHJvbCk7Ci0tCi0tIyBpZmRlZiBfX2NwbHVzcGx1cwotLX0KLS0jIGVuZGlmCi0tCi0tI2VuZGlmCi0tCi0tLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLQotLSNpZiBVU0VfUFRIX1RIUkVBRFMKLS0KLS0vKiBVc2UgdGhlIEdOVSBQdGggdGhyZWFkcyBsaWJyYXJ5LiAgKi8KLS0KLS0jIGluY2x1ZGUgPHB0aC5oPgotLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0tCi0tIyBpZmRlZiBfX2NwbHVzcGx1cwotLWV4dGVybiAiQyIgewotLSMgZW5kaWYKLS0KLS0jIGlmIFVTRV9QVEhfVEhSRUFEU19XRUFLCi0tCi0tLyogVXNlIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUgR05VIFB0aCB0aHJlYWRzIGxpYnJhcnkuICAqLwotLQotLSMgIHByYWdtYSB3ZWFrIHB0aF9tdXRleF9pbml0Ci0tIyAgcHJhZ21hIHdlYWsgcHRoX211dGV4X2FjcXVpcmUKLS0jICBwcmFnbWEgd2VhayBwdGhfbXV0ZXhfcmVsZWFzZQotLSMgIHByYWdtYSB3ZWFrIHB0aF9yd2xvY2tfaW5pdAotLSMgIHByYWdtYSB3ZWFrIHB0aF9yd2xvY2tfYWNxdWlyZQotLSMgIHByYWdtYSB3ZWFrIHB0aF9yd2xvY2tfcmVsZWFzZQotLSMgIHByYWdtYSB3ZWFrIHB0aF9vbmNlCi0tCi0tIyAgcHJhZ21hIHdlYWsgcHRoX2NhbmNlbAotLSMgIGRlZmluZSBwdGhfaW5fdXNlKCkgKHB0aF9jYW5jZWwgIT0gTlVMTCkKLS0KLS0jIGVsc2UKLS0KLS0jICBkZWZpbmUgcHRoX2luX3VzZSgpIDEKLS0KLS0jIGVuZGlmCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiBwdGhfbXV0ZXhfdCBnbF9sb2NrX3Q7Ci0tIyBkZWZpbmUgZ2xfbG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgIFNUT1JBR0VDTEFTUyBwdGhfbXV0ZXhfdCBOQU1FOwotLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgcHRoX211dGV4X3QgTkFNRSA9IGdsX2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyBkZWZpbmUgZ2xfbG9ja19pbml0aWFsaXplciBcCi0tICAgIFBUSF9NVVRFWF9JTklUCi0tIyBkZWZpbmUgZ2xfbG9ja19pbml0KE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmIChwdGhfaW5fdXNlKCkgJiYgIXB0aF9tdXRleF9pbml0ICgmTkFNRSkpIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfbG9ja19sb2NrKE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmIChwdGhfaW5fdXNlKCkgJiYgIXB0aF9tdXRleF9hY3F1aXJlICgmTkFNRSwgMCwgTlVMTCkpIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfbG9ja191bmxvY2soTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHB0aF9pbl91c2UoKSAmJiAhcHRoX211dGV4X3JlbGVhc2UgKCZOQU1FKSkgXAotLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICAodm9pZCkoJk5BTUUpCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yd2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiBwdGhfcndsb2NrX3QgZ2xfcndsb2NrX3Q7Ci0tIyAgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgICBTVE9SQUdFQ0xBU1MgcHRoX3J3bG9ja190IE5BTUU7Ci0tIyAgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgICBTVE9SQUdFQ0xBU1MgcHRoX3J3bG9ja190IE5BTUUgPSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyAgZGVmaW5lIGdsX3J3bG9ja19pbml0aWFsaXplciBcCi0tICAgICBQVEhfUldMT0NLX0lOSVQKLS0jICBkZWZpbmUgZ2xfcndsb2NrX2luaXQoTkFNRSkgXAotLSAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICBpZiAocHRoX2luX3VzZSgpICYmICFwdGhfcndsb2NrX2luaXQgKCZOQU1FKSkgXAotLSAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgIHdoaWxlICgwKQotLSMgIGRlZmluZSBnbF9yd2xvY2tfcmRsb2NrKE5BTUUpIFwKLS0gICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgIGlmIChwdGhfaW5fdXNlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgICAgJiYgIXB0aF9yd2xvY2tfYWNxdWlyZSAoJk5BTUUsIFBUSF9SV0xPQ0tfUkQsIDAsIE5VTEwpKSBcCi0tICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgIHdoaWxlICgwKQotLSMgIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrKE5BTUUpIFwKLS0gICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgIGlmIChwdGhfaW5fdXNlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgICAgJiYgIXB0aF9yd2xvY2tfYWNxdWlyZSAoJk5BTUUsIFBUSF9SV0xPQ0tfUlcsIDAsIE5VTEwpKSBcCi0tICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgIHdoaWxlICgwKQotLSMgIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgaWYgKHB0aF9pbl91c2UoKSAmJiAhcHRoX3J3bG9ja19yZWxlYXNlICgmTkFNRSkpIFwKLS0gICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICB3aGlsZSAoMCkKLS0jICBkZWZpbmUgZ2xfcndsb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICAgKHZvaWQpKCZOQU1FKQotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLS8qIEluIFB0aCwgbXV0ZXhlcyBhcmUgcmVjdXJzaXZlIGJ5IGRlZmF1bHQuICAqLwotLXR5cGVkZWYgcHRoX211dGV4X3QgZ2xfcmVjdXJzaXZlX2xvY2tfdDsKLS0jICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICAgU1RPUkFHRUNMQVNTIHB0aF9tdXRleF90IE5BTUU7Ci0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgIFNUT1JBR0VDTEFTUyBwdGhfbXV0ZXhfdCBOQU1FID0gZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXRpYWxpemVyIFwKLS0gICAgIFBUSF9NVVRFWF9JTklUCi0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXQoTkFNRSkgXAotLSAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgaWYgKHB0aF9pbl91c2UoKSAmJiAhcHRoX211dGV4X2luaXQgKCZOQU1FKSkgXAotLSAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICB3aGlsZSAoMCkKLS0jICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfbG9jayhOQU1FKSBcCi0tICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICBpZiAocHRoX2luX3VzZSgpICYmICFwdGhfbXV0ZXhfYWNxdWlyZSAoJk5BTUUsIDAsIE5VTEwpKSBcCi0tICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgIHdoaWxlICgwKQotLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja191bmxvY2soTkFNRSkgXAotLSAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgaWYgKHB0aF9pbl91c2UoKSAmJiAhcHRoX211dGV4X3JlbGVhc2UgKCZOQU1FKSkgXAotLSAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICB3aGlsZSAoMCkKLS0jICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVzdHJveShOQU1FKSBcCi0tICAgICAodm9pZCkoJk5BTUUpCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfb25jZV90IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiBwdGhfb25jZV90IGdsX29uY2VfdDsKLS0jIGRlZmluZSBnbF9vbmNlX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIHB0aF9vbmNlX3QgTkFNRSA9IFBUSF9PTkNFX0lOSVQ7Ci0tIyBkZWZpbmUgZ2xfb25jZShOQU1FLCBJTklURlVOQ1RJT04pIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAocHRoX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgIHZvaWQgKCpnbF9vbmNlX3RlbXApICh2b2lkKSA9IElOSVRGVU5DVElPTjsgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgaWYgKCFwdGhfb25jZSAoJk5BTUUsIGdsdGhyZWFkX29uY2VfY2FsbCwgJmdsX29uY2VfdGVtcCkpIFwKLS0gICAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgIGlmIChnbHRocmVhZF9vbmNlX3NpbmdsZXRocmVhZGVkICgmTkFNRSkpICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgICBJTklURlVOQ1RJT04gKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLWV4dGVybiB2b2lkIGdsdGhyZWFkX29uY2VfY2FsbCAodm9pZCAqYXJnKTsKLS1leHRlcm4gaW50IGdsdGhyZWFkX29uY2Vfc2luZ2xldGhyZWFkZWQgKHB0aF9vbmNlX3QgKm9uY2VfY29udHJvbCk7Ci0tCi0tIyBpZmRlZiBfX2NwbHVzcGx1cwotLX0KLS0jIGVuZGlmCi0tCi0tI2VuZGlmCi0tCi0tLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLQotLSNpZiBVU0VfU09MQVJJU19USFJFQURTCi0tCi0tLyogVXNlIHRoZSBvbGQgU29sYXJpcyB0aHJlYWRzIGxpYnJhcnkuICAqLwotLQotLSMgaW5jbHVkZSA8dGhyZWFkLmg+Ci0tIyBpbmNsdWRlIDxzeW5jaC5oPgotLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0tCi0tIyBpZmRlZiBfX2NwbHVzcGx1cwotLWV4dGVybiAiQyIgewotLSMgZW5kaWYKLS0KLS0jIGlmIFVTRV9TT0xBUklTX1RIUkVBRFNfV0VBSwotLQotLS8qIFVzZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIG9sZCBTb2xhcmlzIHRocmVhZHMgbGlicmFyeS4gICovCi0tCi0tIyAgcHJhZ21hIHdlYWsgbXV0ZXhfaW5pdAotLSMgIHByYWdtYSB3ZWFrIG11dGV4X2xvY2sKLS0jICBwcmFnbWEgd2VhayBtdXRleF91bmxvY2sKLS0jICBwcmFnbWEgd2VhayBtdXRleF9kZXN0cm95Ci0tIyAgcHJhZ21hIHdlYWsgcndsb2NrX2luaXQKLS0jICBwcmFnbWEgd2VhayByd19yZGxvY2sKLS0jICBwcmFnbWEgd2VhayByd193cmxvY2sKLS0jICBwcmFnbWEgd2VhayByd191bmxvY2sKLS0jICBwcmFnbWEgd2VhayByd2xvY2tfZGVzdHJveQotLSMgIHByYWdtYSB3ZWFrIHRocl9zZWxmCi0tCi0tIyAgcHJhZ21hIHdlYWsgdGhyX3N1c3BlbmQKLS0jICBkZWZpbmUgdGhyZWFkX2luX3VzZSgpICh0aHJfc3VzcGVuZCAhPSBOVUxMKQotLQotLSMgZWxzZQotLQotLSMgIGRlZmluZSB0aHJlYWRfaW5fdXNlKCkgMQotLQotLSMgZW5kaWYKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS10eXBlZGVmIG11dGV4X3QgZ2xfbG9ja190OwotLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgbXV0ZXhfdCBOQU1FOwotLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgbXV0ZXhfdCBOQU1FID0gZ2xfbG9ja19pbml0aWFsaXplcjsKLS0jIGRlZmluZSBnbF9sb2NrX2luaXRpYWxpemVyIFwKLS0gICAgREVGQVVMVE1VVEVYCi0tIyBkZWZpbmUgZ2xfbG9ja19pbml0KE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmICh0aHJlYWRfaW5fdXNlICgpICYmIG11dGV4X2luaXQgKCZOQU1FLCBVU1lOQ19USFJFQUQsIE5VTEwpICE9IDApIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfbG9ja19sb2NrKE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkgJiYgbXV0ZXhfbG9jayAoJk5BTUUpICE9IDApIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9sb2NrX3VubG9jayhOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSAmJiBtdXRleF91bmxvY2sgKCZOQU1FKSAhPSAwKSBcCi0tICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX2xvY2tfZGVzdHJveShOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmICh0aHJlYWRfaW5fdXNlICgpICYmIG11dGV4X2Rlc3Ryb3kgKCZOQU1FKSAhPSAwKSBcCi0tICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yd2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiByd2xvY2tfdCBnbF9yd2xvY2tfdDsKLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1Mgcndsb2NrX3QgTkFNRTsKLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1Mgcndsb2NrX3QgTkFNRSA9IGdsX3J3bG9ja19pbml0aWFsaXplcjsKLS0jIGRlZmluZSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICBERUZBVUxUUldMT0NLCi0tIyBkZWZpbmUgZ2xfcndsb2NrX2luaXQoTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSAmJiByd2xvY2tfaW5pdCAoJk5BTUUsIFVTWU5DX1RIUkVBRCwgTlVMTCkgIT0gMCkgXAotLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX3J3bG9ja19yZGxvY2soTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkgJiYgcndfcmRsb2NrICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrKE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmICh0aHJlYWRfaW5fdXNlICgpICYmIHJ3X3dybG9jayAoJk5BTUUpICE9IDApIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayhOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSAmJiByd191bmxvY2sgKCZOQU1FKSAhPSAwKSBcCi0tICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX3J3bG9ja19kZXN0cm95KE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSAmJiByd2xvY2tfZGVzdHJveSAoJk5BTUUpICE9IDApIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLS8qIE9sZCBTb2xhcmlzIHRocmVhZHMgZGlkIG5vdCBoYXZlIHJlY3Vyc2l2ZSBsb2Nrcy4KLS0gICBXZSBoYXZlIHRvIGltcGxlbWVudCB0aGVtIG91cnNlbHZlcy4gICovCi0tCi0tdHlwZWRlZiBzdHJ1Y3QKLS0gICAgICAgIHsKLS0gICAgICAgICAgbXV0ZXhfdCBtdXRleDsKLS0gICAgICAgICAgdGhyZWFkX3Qgb3duZXI7Ci0tICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZGVwdGg7Ci0tICAgICAgICB9Ci0tICAgICAgICBnbF9yZWN1cnNpdmVfbG9ja190OwotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIGdsX3JlY3Vyc2l2ZV9sb2NrX3QgTkFNRTsKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgIFNUT1JBR0VDTEFTUyBnbF9yZWN1cnNpdmVfbG9ja190IE5BTUUgPSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplcjsKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplciBcCi0tICAgIHsgREVGQVVMVE1VVEVYLCAodGhyZWFkX3QpIDAsIDAgfQotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXQoTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0ICgmTkFNRSk7IFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2xvY2soTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrICgmTkFNRSk7IFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayhOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayAoJk5BTUUpOyBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95ICgmTkFNRSk7IFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2xvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfb25jZV90IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiBzdHJ1Y3QKLS0gICAgICAgIHsKLS0gICAgICAgICAgdm9sYXRpbGUgaW50IGluaXRlZDsKLS0gICAgICAgICAgbXV0ZXhfdCBtdXRleDsKLS0gICAgICAgIH0KLS0gICAgICAgIGdsX29uY2VfdDsKLS0jIGRlZmluZSBnbF9vbmNlX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIGdsX29uY2VfdCBOQU1FID0geyAwLCBERUZBVUxUTVVURVggfTsKLS0jIGRlZmluZSBnbF9vbmNlKE5BTUUsIElOSVRGVU5DVElPTikgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgICBnbHRocmVhZF9vbmNlICgmTkFNRSwgSU5JVEZVTkNUSU9OKTsgICAgICBcCi0tICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgaWYgKGdsdGhyZWFkX29uY2Vfc2luZ2xldGhyZWFkZWQgKCZOQU1FKSkgXAotLSAgICAgICAgICAgICAgSU5JVEZVTkNUSU9OICgpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9vbmNlIChnbF9vbmNlX3QgKm9uY2VfY29udHJvbCwgdm9pZCAoKmluaXRmdW5jdGlvbikgKHZvaWQpKTsKLS1leHRlcm4gaW50IGdsdGhyZWFkX29uY2Vfc2luZ2xldGhyZWFkZWQgKGdsX29uY2VfdCAqb25jZV9jb250cm9sKTsKLS0KLS0jIGlmZGVmIF9fY3BsdXNwbHVzCi0tfQotLSMgZW5kaWYKLS0KLS0jZW5kaWYKLS0KLS0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0tCi0tI2lmIFVTRV9XSU4zMl9USFJFQURTCi0tCi0tIyBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0tCi0tIyBpZmRlZiBfX2NwbHVzcGx1cwotLWV4dGVybiAiQyIgewotLSMgZW5kaWYKLS0KLS0vKiBXZSBjYW4gdXNlIENSSVRJQ0FMX1NFQ1RJT04gZGlyZWN0bHksIHJhdGhlciB0aGFuIHRoZSBXaW4zMiBFdmVudCwgTXV0ZXgsCi0tICAgU2VtYXBob3JlIHR5cGVzLCBiZWNhdXNlCi0tICAgICAtIHdlIG5lZWQgb25seSB0byBzeW5jaHJvbml6ZSBpbnNpZGUgYSBzaW5nbGUgcHJvY2VzcyAoYWRkcmVzcyBzcGFjZSksCi0tICAgICAgIG5vdCBpbnRlci1wcm9jZXNzIGxvY2tpbmcsCi0tICAgICAtIHdlIGRvbid0IG5lZWQgdG8gc3VwcG9ydCB0cnlsb2NrIG9wZXJhdGlvbnMuICAoVHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24KLS0gICAgICAgZG9lcyBub3Qgd29yayBvbiBXaW5kb3dzIDk1Lzk4L01FLiAgUGFja2FnZXMgdGhhdCBuZWVkIHRyeWxvY2sgdXN1YWxseQotLSAgICAgICBkZWZpbmUgdGhlaXIgb3duIG11dGV4IHR5cGUuKSAgKi8KLS0KLS0vKiBUaGVyZSBpcyBubyB3YXkgdG8gc3RhdGljYWxseSBpbml0aWFsaXplIGEgQ1JJVElDQUxfU0VDVElPTi4gIEl0IG5lZWRzCi0tICAgdG8gYmUgZG9uZSBsYXppbHksIG9uY2Ugb25seS4gIEZvciB0aGlzIHdlIG5lZWQgc3BpbmxvY2tzLiAgKi8KLS0KLS10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBkb25lOyB2b2xhdGlsZSBsb25nIHN0YXJ0ZWQ7IH0gZ2xfc3BpbmxvY2tfdDsKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS10eXBlZGVmIHN0cnVjdAotLSAgICAgICAgewotLSAgICAgICAgICBnbF9zcGlubG9ja190IGd1YXJkOyAvKiBwcm90ZWN0cyB0aGUgaW5pdGlhbGl6YXRpb24gKi8KLS0gICAgICAgICAgQ1JJVElDQUxfU0VDVElPTiBsb2NrOwotLSAgICAgICAgfQotLSAgICAgICAgZ2xfbG9ja190OwotLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgZ2xfbG9ja190IE5BTUU7Ci0tIyBkZWZpbmUgZ2xfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgIFNUT1JBR0VDTEFTUyBnbF9sb2NrX3QgTkFNRSA9IGdsX2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyBkZWZpbmUgZ2xfbG9ja19pbml0aWFsaXplciBcCi0tICAgIHsgeyAwLCAtMSB9IH0KLS0jIGRlZmluZSBnbF9sb2NrX2luaXQoTkFNRSkgXAotLSAgICBnbHRocmVhZF9sb2NrX2luaXQgKCZOQU1FKQotLSMgZGVmaW5lIGdsX2xvY2tfbG9jayhOQU1FKSBcCi0tICAgIGdsdGhyZWFkX2xvY2tfbG9jayAoJk5BTUUpCi0tIyBkZWZpbmUgZ2xfbG9ja191bmxvY2soTkFNRSkgXAotLSAgICBnbHRocmVhZF9sb2NrX3VubG9jayAoJk5BTUUpCi0tIyBkZWZpbmUgZ2xfbG9ja19kZXN0cm95KE5BTUUpIFwKLS0gICAgZ2x0aHJlYWRfbG9ja19kZXN0cm95ICgmTkFNRSkKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9sb2NrX2luaXQgKGdsX2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfbG9ja19sb2NrIChnbF9sb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX2xvY2tfdW5sb2NrIChnbF9sb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX2xvY2tfZGVzdHJveSAoZ2xfbG9ja190ICpsb2NrKTsKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3J3bG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0vKiBJdCBpcyBpbXBvc3NpYmxlIHRvIGltcGxlbWVudCByZWFkLXdyaXRlIGxvY2tzIHVzaW5nIHBsYWluIGxvY2tzLCB3aXRob3V0Ci0tICAgaW50cm9kdWNpbmcgYW4gZXh0cmEgdGhyZWFkIGRlZGljYXRlZCB0byBtYW5hZ2luZyByZWFkLXdyaXRlIGxvY2tzLgotLSAgIFRoZXJlZm9yZSBoZXJlIHdlIG5lZWQgdG8gdXNlIHRoZSBsb3ctbGV2ZWwgRXZlbnQgdHlwZS4gICovCi0tCi0tdHlwZWRlZiBzdHJ1Y3QKLS0gICAgICAgIHsKLS0gICAgICAgICAgSEFORExFICphcnJheTsgLyogYXJyYXkgb2Ygd2FpdGluZyB0aHJlYWRzLCBlYWNoIHJlcHJlc2VudGVkIGJ5IGFuIGV2ZW50ICovCi0tICAgICAgICAgIHVuc2lnbmVkIGludCBjb3VudDsgLyogbnVtYmVyIG9mIHdhaXRpbmcgdGhyZWFkcyAqLwotLSAgICAgICAgICB1bnNpZ25lZCBpbnQgYWxsb2M7IC8qIGxlbmd0aCBvZiBhbGxvY2F0ZWQgYXJyYXkgKi8KLS0gICAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldDsgLyogaW5kZXggb2YgZmlyc3Qgd2FpdGluZyB0aHJlYWQgaW4gYXJyYXkgKi8KLS0gICAgICAgIH0KLS0gICAgICAgIGdsX3dhaXRxdWV1ZV90OwotLXR5cGVkZWYgc3RydWN0Ci0tICAgICAgICB7Ci0tICAgICAgICAgIGdsX3NwaW5sb2NrX3QgZ3VhcmQ7IC8qIHByb3RlY3RzIHRoZSBpbml0aWFsaXphdGlvbiAqLwotLSAgICAgICAgICBDUklUSUNBTF9TRUNUSU9OIGxvY2s7IC8qIHByb3RlY3RzIHRoZSByZW1haW5pbmcgZmllbGRzICovCi0tICAgICAgICAgIGdsX3dhaXRxdWV1ZV90IHdhaXRpbmdfcmVhZGVyczsgLyogd2FpdGluZyByZWFkZXJzICovCi0tICAgICAgICAgIGdsX3dhaXRxdWV1ZV90IHdhaXRpbmdfd3JpdGVyczsgLyogd2FpdGluZyB3cml0ZXJzICovCi0tICAgICAgICAgIGludCBydW5jb3VudDsgLyogbnVtYmVyIG9mIHJlYWRlcnMgcnVubmluZywgb3IgLTEgd2hlbiBhIHdyaXRlciBydW5zICovCi0tICAgICAgICB9Ci0tICAgICAgICBnbF9yd2xvY2tfdDsKLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgZ2xfcndsb2NrX3QgTkFNRTsKLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgZ2xfcndsb2NrX3QgTkFNRSA9IGdsX3J3bG9ja19pbml0aWFsaXplcjsKLS0jIGRlZmluZSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICB7IHsgMCwgLTEgfSB9Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2luaXQoTkFNRSkgXAotLSAgICBnbHRocmVhZF9yd2xvY2tfaW5pdCAoJk5BTUUpCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3JkbG9jayhOQU1FKSBcCi0tICAgIGdsdGhyZWFkX3J3bG9ja19yZGxvY2sgKCZOQU1FKQotLSMgZGVmaW5lIGdsX3J3bG9ja193cmxvY2soTkFNRSkgXAotLSAgICBnbHRocmVhZF9yd2xvY2tfd3Jsb2NrICgmTkFNRSkKLS0jIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgZ2x0aHJlYWRfcndsb2NrX3VubG9jayAoJk5BTUUpCi0tIyBkZWZpbmUgZ2xfcndsb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICBnbHRocmVhZF9yd2xvY2tfZGVzdHJveSAoJk5BTUUpCi0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX2luaXQgKGdsX3J3bG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfcmRsb2NrIChnbF9yd2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja191bmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfZGVzdHJveSAoZ2xfcndsb2NrX3QgKmxvY2spOwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLS8qIFRoZSBXaW4zMiBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCBDUklUSUNBTF9TRUNUSU9OIGFscmVhZHkgaW1wbGVtZW50cyBhCi0tICAgcmVjdXJzaXZlIGxvY2suICBCdXQgd2UgbmVlZCBub3QgcmVseSBvbiBpdDogSXQncyBlYXN5IHRvIGltcGxlbWVudCBhCi0tICAgcmVjdXJzaXZlIGxvY2sgd2l0aG91dCB0aGlzIGFzc3VtcHRpb24uICAqLwotLQotLXR5cGVkZWYgc3RydWN0Ci0tICAgICAgICB7Ci0tICAgICAgICAgIGdsX3NwaW5sb2NrX3QgZ3VhcmQ7IC8qIHByb3RlY3RzIHRoZSBpbml0aWFsaXphdGlvbiAqLwotLSAgICAgICAgICBEV09SRCBvd25lcjsKLS0gICAgICAgICAgdW5zaWduZWQgbG9uZyBkZXB0aDsKLS0gICAgICAgICAgQ1JJVElDQUxfU0VDVElPTiBsb2NrOwotLSAgICAgICAgfQotLSAgICAgICAgZ2xfcmVjdXJzaXZlX2xvY2tfdDsKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgIFNUT1JBR0VDTEFTUyBnbF9yZWN1cnNpdmVfbG9ja190IE5BTUU7Ci0tIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgZ2xfcmVjdXJzaXZlX2xvY2tfdCBOQU1FID0gZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICB7IHsgMCwgLTEgfSwgMCwgMCB9Ci0tIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdChOQU1FKSBcCi0tICAgIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKCZOQU1FKQotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2xvY2soTkFNRSkgXAotLSAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrICgmTkFNRSkKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja191bmxvY2soTkFNRSkgXAotLSAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKCZOQU1FKQotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95ICgmTkFNRSkKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3kgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXR5cGVkZWYgc3RydWN0Ci0tICAgICAgICB7Ci0tICAgICAgICAgIHZvbGF0aWxlIGludCBpbml0ZWQ7Ci0tICAgICAgICAgIHZvbGF0aWxlIGxvbmcgc3RhcnRlZDsKLS0gICAgICAgICAgQ1JJVElDQUxfU0VDVElPTiBsb2NrOwotLSAgICAgICAgfQotLSAgICAgICAgZ2xfb25jZV90OwotLSMgZGVmaW5lIGdsX29uY2VfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgZ2xfb25jZV90IE5BTUUgPSB7IC0xLCAtMSB9OwotLSMgZGVmaW5lIGdsX29uY2UoTkFNRSwgSU5JVEZVTkNUSU9OKSBcCi0tICAgIGdsdGhyZWFkX29uY2UgKCZOQU1FLCBJTklURlVOQ1RJT04pCi0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfb25jZSAoZ2xfb25jZV90ICpvbmNlX2NvbnRyb2wsIHZvaWQgKCppbml0ZnVuY3Rpb24pICh2b2lkKSk7Ci0tCi0tIyBpZmRlZiBfX2NwbHVzcGx1cwotLX0KLS0jIGVuZGlmCi0tCi0tI2VuZGlmCi0tCi0tLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLQotLSNpZiAhKFVTRV9QT1NJWF9USFJFQURTIHx8IFVTRV9QVEhfVEhSRUFEUyB8fCBVU0VfU09MQVJJU19USFJFQURTIHx8IFVTRV9XSU4zMl9USFJFQURTKQotLQotLS8qIFByb3ZpZGUgZHVtbXkgaW1wbGVtZW50YXRpb24gaWYgdGhyZWFkcyBhcmUgbm90IHN1cHBvcnRlZC4gICovCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiBpbnQgZ2xfbG9ja190OwotLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkKLS0jIGRlZmluZSBnbF9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpCi0tIyBkZWZpbmUgZ2xfbG9ja19pbml0KE5BTUUpCi0tIyBkZWZpbmUgZ2xfbG9ja19sb2NrKE5BTUUpCi0tIyBkZWZpbmUgZ2xfbG9ja191bmxvY2soTkFNRSkKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3J3bG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS10eXBlZGVmIGludCBnbF9yd2xvY2tfdDsKLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkKLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkKLS0jIGRlZmluZSBnbF9yd2xvY2tfaW5pdChOQU1FKQotLSMgZGVmaW5lIGdsX3J3bG9ja19yZGxvY2soTkFNRSkKLS0jIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrKE5BTUUpCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayhOQU1FKQotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXR5cGVkZWYgaW50IGdsX3JlY3Vyc2l2ZV9sb2NrX3Q7Ci0tIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKQotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXQoTkFNRSkKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19sb2NrKE5BTUUpCi0tIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfdW5sb2NrKE5BTUUpCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfb25jZV90IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiBpbnQgZ2xfb25jZV90OwotLSMgZGVmaW5lIGdsX29uY2VfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgZ2xfb25jZV90IE5BTUUgPSAwOwotLSMgZGVmaW5lIGdsX29uY2UoTkFNRSwgSU5JVEZVTkNUSU9OKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAoTkFNRSA9PSAwKSAgICAgICBcCi0tICAgICAgICAgIHsgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgTkFNRSA9IH4gMDsgICAgICBcCi0tICAgICAgICAgICAgSU5JVEZVTkNUSU9OICgpOyBcCi0tICAgICAgICAgIH0gICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLQotLSNlbmRpZgotLQotLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS0KLS0jZW5kaWYgLyogX0xPQ0tfSCAqLwotLS0tIGEvaW50bC9sb2cuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMTE2ICswLDAgQEAKLS0vKiBMb2cgZmlsZSBvdXRwdXQuCi0tICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tLyogV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4uICAqLwotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8c3RkaW8uaD4KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tI2luY2x1ZGUgPHN0cmluZy5oPgotLQotLS8qIEhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KLS0jZWxzZQotLSMgaW5jbHVkZSAibG9jay5oIgotLSNlbmRpZgotLQotLS8qIFByaW50IGFuIEFTQ0lJIHN0cmluZyB3aXRoIHF1b3RlcyBhbmQgZXNjYXBlIHNlcXVlbmNlcyB3aGVyZSBuZWVkZWQuICAqLwotLXN0YXRpYyB2b2lkCi0tcHJpbnRfZXNjYXBlZCAoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzdHIpCi0tewotLSAgcHV0YyAoJyInLCBzdHJlYW0pOwotLSAgZm9yICg7ICpzdHIgIT0gJ1wwJzsgc3RyKyspCi0tICAgIGlmICgqc3RyID09ICdcbicpCi0tICAgICAgewotLQlmcHV0cyAoIlxcblwiIiwgc3RyZWFtKTsKLS0JaWYgKHN0clsxXSA9PSAnXDAnKQotLQkgIHJldHVybjsKLS0JZnB1dHMgKCJcblwiIiwgc3RyZWFtKTsKLS0gICAgICB9Ci0tICAgIGVsc2UKLS0gICAgICB7Ci0tCWlmICgqc3RyID09ICciJyB8fCAqc3RyID09ICdcXCcpCi0tCSAgcHV0YyAoJ1xcJywgc3RyZWFtKTsKLS0JcHV0YyAoKnN0ciwgc3RyZWFtKTsKLS0gICAgICB9Ci0tICBwdXRjICgnIicsIHN0cmVhbSk7Ci0tfQotLQotLXN0YXRpYyBjaGFyICpsYXN0X2xvZ2ZpbGVuYW1lID0gTlVMTDsKLS1zdGF0aWMgRklMRSAqbGFzdF9sb2dmaWxlID0gTlVMTDsKLS1fX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKHN0YXRpYywgbG9jaykKLS0KLS1zdGF0aWMgaW5saW5lIHZvaWQKLS1fbmxfbG9nX3VudHJhbnNsYXRlZF9sb2NrZWQgKGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lLCBjb25zdCBjaGFyICpkb21haW5uYW1lLAotLQkJCSAgICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIGludCBwbHVyYWwpCi0tewotLSAgRklMRSAqbG9nZmlsZTsKLS0KLS0gIC8qIENhbiB3ZSByZXVzZSB0aGUgbGFzdCBvcGVuZWQgbG9nZmlsZT8gICovCi0tICBpZiAobGFzdF9sb2dmaWxlbmFtZSA9PSBOVUxMIHx8IHN0cmNtcCAobG9nZmlsZW5hbWUsIGxhc3RfbG9nZmlsZW5hbWUpICE9IDApCi0tICAgIHsKLS0gICAgICAvKiBDbG9zZSB0aGUgbGFzdCB1c2VkIGxvZ2ZpbGUuICAqLwotLSAgICAgIGlmIChsYXN0X2xvZ2ZpbGVuYW1lICE9IE5VTEwpCi0tCXsKLS0JICBpZiAobGFzdF9sb2dmaWxlICE9IE5VTEwpCi0tCSAgICB7Ci0tCSAgICAgIGZjbG9zZSAobGFzdF9sb2dmaWxlKTsKLS0JICAgICAgbGFzdF9sb2dmaWxlID0gTlVMTDsKLS0JICAgIH0KLS0JICBmcmVlIChsYXN0X2xvZ2ZpbGVuYW1lKTsKLS0JICBsYXN0X2xvZ2ZpbGVuYW1lID0gTlVMTDsKLS0JfQotLSAgICAgIC8qIE9wZW4gdGhlIGxvZ2ZpbGUuICAqLwotLSAgICAgIGxhc3RfbG9nZmlsZW5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAobG9nZmlsZW5hbWUpICsgMSk7Ci0tICAgICAgaWYgKGxhc3RfbG9nZmlsZW5hbWUgPT0gTlVMTCkKLS0JcmV0dXJuOwotLSAgICAgIHN0cmNweSAobGFzdF9sb2dmaWxlbmFtZSwgbG9nZmlsZW5hbWUpOwotLSAgICAgIGxhc3RfbG9nZmlsZSA9IGZvcGVuIChsb2dmaWxlbmFtZSwgImEiKTsKLS0gICAgICBpZiAobGFzdF9sb2dmaWxlID09IE5VTEwpCi0tCXJldHVybjsKLS0gICAgfQotLSAgbG9nZmlsZSA9IGxhc3RfbG9nZmlsZTsKLS0KLS0gIGZwcmludGYgKGxvZ2ZpbGUsICJkb21haW4gIik7Ci0tICBwcmludF9lc2NhcGVkIChsb2dmaWxlLCBkb21haW5uYW1lKTsKLS0gIGZwcmludGYgKGxvZ2ZpbGUsICJcbm1zZ2lkICIpOwotLSAgcHJpbnRfZXNjYXBlZCAobG9nZmlsZSwgbXNnaWQxKTsKLS0gIGlmIChwbHVyYWwpCi0tICAgIHsKLS0gICAgICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dpZF9wbHVyYWwgIik7Ci0tICAgICAgcHJpbnRfZXNjYXBlZCAobG9nZmlsZSwgbXNnaWQyKTsKLS0gICAgICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dzdHJbMF0gXCJcIlxuIik7Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgZnByaW50ZiAobG9nZmlsZSwgIlxubXNnc3RyIFwiXCJcbiIpOwotLSAgcHV0YyAoJ1xuJywgbG9nZmlsZSk7Ci0tfQotLQotLS8qIEFkZCB0byB0aGUgbG9nIGZpbGUgYW4gZW50cnkgZGVub3RpbmcgYSBmYWlsZWQgdHJhbnNsYXRpb24uICAqLwotLXZvaWQKLS1fbmxfbG9nX3VudHJhbnNsYXRlZCAoY29uc3QgY2hhciAqbG9nZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCi0tCQkgICAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgaW50IHBsdXJhbCkKLS17Ci0tICBfX2xpYmNfbG9ja19sb2NrIChsb2NrKTsKLS0gIF9ubF9sb2dfdW50cmFuc2xhdGVkX2xvY2tlZCAobG9nZmlsZW5hbWUsIGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBwbHVyYWwpOwotLSAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKLS19Ci0tLS0gYS9pbnRsL25nZXR0ZXh0LmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDY1ICswLDAgQEAKLS0vKiBJbXBsZW1lbnRhdGlvbiBvZiBuZ2V0dGV4dCgzKSBmdW5jdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSBfX25lZWRfTlVMTAotLSMgaW5jbHVkZSA8c3RkZGVmLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCi0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgImdldHRleHRQLmgiCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLQotLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLS0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0tICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0tICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSBOR0VUVEVYVCBfX25nZXR0ZXh0Ci0tIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKLS0jZWxzZQotLSMgZGVmaW5lIE5HRVRURVhUIGxpYmludGxfbmdldHRleHQKLS0jIGRlZmluZSBEQ05HRVRURVhUIGxpYmludGxfZGNuZ2V0dGV4dAotLSNlbmRpZgotLQotLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0tICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLS0gICB0ZXh0KS4gICovCi0tY2hhciAqCi0tTkdFVFRFWFQgKGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQotLXsKLS0gIHJldHVybiBEQ05HRVRURVhUIChOVUxMLCBtc2dpZDEsIG1zZ2lkMiwgbiwgTENfTUVTU0FHRVMpOwotLX0KLS0KLS0jaWZkZWYgX0xJQkMKLS0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLS13ZWFrX2FsaWFzIChfX25nZXR0ZXh0LCBuZ2V0dGV4dCk7Ci0tI2VuZGlmCi0tLS0gYS9pbnRsL29zMmNvbXBhdC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw5OCArMCwwIEBACi0tLyogT1MvMiBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucy4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNkZWZpbmUgT1MyX0FXQVJFCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0tCi0tLyogQSB2ZXJzaW9uIG9mIGdldGVudigpIHRoYXQgd29ya3MgZnJvbSBETExzICovCi0tZXh0ZXJuIHVuc2lnbmVkIGxvbmcgRG9zU2NhbkVudiAoY29uc3QgdW5zaWduZWQgY2hhciAqcHN6TmFtZSwgdW5zaWduZWQgY2hhciAqKnBwc3pWYWx1ZSk7Ci0tCi0tY2hhciAqCi0tX25sX2dldGVudiAoY29uc3QgY2hhciAqbmFtZSkKLS17Ci0tICB1bnNpZ25lZCBjaGFyICp2YWx1ZTsKLS0gIGlmIChEb3NTY2FuRW52IChuYW1lLCAmdmFsdWUpKQotLSAgICByZXR1cm4gTlVMTDsKLS0gIGVsc2UKLS0gICAgcmV0dXJuIHZhbHVlOwotLX0KLS0KLS0vKiBBIGZpeGVkIHNpemUgYnVmZmVyLiAgKi8KLS1jaGFyIGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lW01BWFBBVEhMRU4rMV07Ci0tCi0tY2hhciAqX25sb3MyX2xpYmRpciA9IE5VTEw7Ci0tY2hhciAqX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IE5VTEw7Ci0tY2hhciAqX25sb3MyX2xvY2FsZWRpciA9IE5VTEw7Ci0tCi0tc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZAotLW5sb3MyX2luaXRpYWxpemUgKCkKLS17Ci0tICBjaGFyICpyb290ID0gZ2V0ZW52ICgiVU5JWFJPT1QiKTsKLS0gIGNoYXIgKmdudWxvY2FsZWRpciA9IGdldGVudiAoIkdOVUxPQ0FMRURJUiIpOwotLQotLSAgX25sb3MyX2xpYmRpciA9IGdudWxvY2FsZWRpcjsKLS0gIGlmICghX25sb3MyX2xpYmRpcikKLS0gICAgewotLSAgICAgIGlmIChyb290KQotLSAgICAgICAgewotLSAgICAgICAgICBzaXplX3Qgc2wgPSBzdHJsZW4gKHJvb3QpOwotLSAgICAgICAgICBfbmxvczJfbGliZGlyID0gKGNoYXIgKikgbWFsbG9jIChzbCArIHN0cmxlbiAoTElCRElSKSArIDEpOwotLSAgICAgICAgICBtZW1jcHkgKF9ubG9zMl9saWJkaXIsIHJvb3QsIHNsKTsKLS0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbGliZGlyICsgc2wsIExJQkRJUiwgc3RybGVuIChMSUJESVIpICsgMSk7Ci0tICAgICAgICB9Ci0tICAgICAgZWxzZQotLSAgICAgICAgX25sb3MyX2xpYmRpciA9IExJQkRJUjsKLS0gICAgfQotLQotLSAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IGdudWxvY2FsZWRpcjsKLS0gIGlmICghX25sb3MyX2xvY2FsZWFsaWFzcGF0aCkKLS0gICAgewotLSAgICAgIGlmIChyb290KQotLSAgICAgICAgewotLSAgICAgICAgICBzaXplX3Qgc2wgPSBzdHJsZW4gKHJvb3QpOwotLSAgICAgICAgICBfbmxvczJfbG9jYWxlYWxpYXNwYXRoID0gKGNoYXIgKikgbWFsbG9jIChzbCArIHN0cmxlbiAoTE9DQUxFX0FMSUFTX1BBVEgpICsgMSk7Ci0tICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWFsaWFzcGF0aCwgcm9vdCwgc2wpOwotLSAgICAgICAgICBtZW1jcHkgKF9ubG9zMl9sb2NhbGVhbGlhc3BhdGggKyBzbCwgTE9DQUxFX0FMSUFTX1BBVEgsIHN0cmxlbiAoTE9DQUxFX0FMSUFTX1BBVEgpICsgMSk7Ci0tICAgICAgICB9Ci0tICAgICBlbHNlCi0tICAgICAgICBfbmxvczJfbG9jYWxlYWxpYXNwYXRoID0gTE9DQUxFX0FMSUFTX1BBVEg7Ci0tICAgIH0KLS0KLS0gIF9ubG9zMl9sb2NhbGVkaXIgPSBnbnVsb2NhbGVkaXI7Ci0tICBpZiAoIV9ubG9zMl9sb2NhbGVkaXIpCi0tICAgIHsKLS0gICAgICBpZiAocm9vdCkKLS0gICAgICAgIHsKLS0gICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKLS0gICAgICAgICAgX25sb3MyX2xvY2FsZWRpciA9IChjaGFyICopIG1hbGxvYyAoc2wgKyBzdHJsZW4gKExPQ0FMRURJUikgKyAxKTsKLS0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlZGlyLCByb290LCBzbCk7Ci0tICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWRpciArIHNsLCBMT0NBTEVESVIsIHN0cmxlbiAoTE9DQUxFRElSKSArIDEpOwotLSAgICAgICAgfQotLSAgICAgIGVsc2UKLS0gICAgICAgIF9ubG9zMl9sb2NhbGVkaXIgPSBMT0NBTEVESVI7Ci0tICAgIH0KLS0KLS0gIGlmIChzdHJsZW4gKF9ubG9zMl9sb2NhbGVkaXIpIDw9IE1BWFBBVEhMRU4pCi0tICAgIHN0cmNweSAobGliaW50bF9ubF9kZWZhdWx0X2Rpcm5hbWUsIF9ubG9zMl9sb2NhbGVkaXIpOwotLX0KLS0tLSBhL2ludGwvb3MyY29tcGF0LmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDQ2ICswLDAgQEAKLS0vKiBPUy8yIGNvbXBhdGliaWxpdHkgZGVmaW5lcy4KLS0gICBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgZnJvbSBjb25maWcuaAotLSAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tLyogV2hlbiBpbmNsdWRlZCBmcm9tIG9zMmNvbXBhdC5oIHdlIG5lZWQgYWxsIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9ucyAqLwotLSNpZm5kZWYgT1MyX0FXQVJFCi0tCi0tI3VuZGVmIExJQkRJUgotLSNkZWZpbmUgTElCRElSCQkJX25sb3MyX2xpYmRpcgotLWV4dGVybiBjaGFyICpfbmxvczJfbGliZGlyOwotLQotLSN1bmRlZiBMT0NBTEVESVIKLS0jZGVmaW5lIExPQ0FMRURJUgkJX25sb3MyX2xvY2FsZWRpcgotLWV4dGVybiBjaGFyICpfbmxvczJfbG9jYWxlZGlyOwotLQotLSN1bmRlZiBMT0NBTEVfQUxJQVNfUEFUSAotLSNkZWZpbmUgTE9DQUxFX0FMSUFTX1BBVEgJX25sb3MyX2xvY2FsZWFsaWFzcGF0aAotLWV4dGVybiBjaGFyICpfbmxvczJfbG9jYWxlYWxpYXNwYXRoOwotLQotLSNlbmRpZgotLQotLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLS0jZGVmaW5lIEhBVkVfU1RSQ0FTRUNNUCAxCi0tI2RlZmluZSBzdHJjYXNlY21wIHN0cmljbXAKLS0jZGVmaW5lIHN0cm5jYXNlY21wIHN0cm5pY21wCi0tCi0tLyogV2UgaGF2ZSBvdXIgb3duIGdldGVudigpIHdoaWNoIHdvcmtzIGV2ZW4gaWYgbGlicmFyeSBpcyBjb21waWxlZCBhcyBETEwgKi8KLS0jZGVmaW5lIGdldGVudiBfbmxfZ2V0ZW52Ci0tCi0tLyogT2xkZXIgdmVyc2lvbnMgb2YgZ2V0dGV4dCB1c2VkIC0xIGFzIHRoZSB2YWx1ZSBvZiBMQ19NRVNTQUdFUyAqLwotLSNkZWZpbmUgTENfTUVTU0FHRVNfQ09NUEFUICgtMSkKLS0tLSBhL2ludGwvb3NkZXAuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMjYgKzAsMCBAQAotLS8qIE9TIGRlcGVuZGVudCBwYXJ0cyBvZiBsaWJpbnRsLgotLSAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyLCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmIGRlZmluZWQgX19DWUdXSU5fXwotLSMgaW5jbHVkZSAiaW50bC1leHBvcnRzLmMiCi0tI2VsaWYgZGVmaW5lZCBfX0VNWF9fCi0tIyBpbmNsdWRlICJvczJjb21wYXQuYyIKLS0jZWxzZQotLS8qIEF2b2lkIEFJWCBjb21waWxlciB3YXJuaW5nLiAgKi8KLS10eXBlZGVmIGludCBkdW1teTsKLS0jZW5kaWYKLS0tLSBhL2ludGwvcGx1cmFsLWV4cC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxNTUgKzAsMCBAQAotLS8qIEV4cHJlc3Npb24gcGFyc2luZyBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgotLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxLCAyMDAzLCAyMDA1LTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8Y3R5cGUuaD4KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tI2luY2x1ZGUgPHN0cmluZy5oPgotLQotLSNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCi0tCi0tI2lmIChkZWZpbmVkIF9fR05VQ19fICYmICEoX19BUFBMRV9DQ19fID4gMSkgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMpIFwKLS0gICAgfHwgKGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCi0tCi0tLyogVGhlc2Ugc3RydWN0cyBhcmUgdGhlIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIHRoZSBnZXJtYW5pYyBwbHVyYWwKLS0gICBmb3JtIGRldGVybWluYXRpb24uICBJdCByZXByZXNlbnRzIHRoZSBleHByZXNzaW9uICAibiAhPSAxIi4gICovCi0tc3RhdGljIGNvbnN0IHN0cnVjdCBleHByZXNzaW9uIHBsdmFyID0KLS17Ci0tICAubmFyZ3MgPSAwLAotLSAgLm9wZXJhdGlvbiA9IHZhciwKLS19OwotLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiBwbG9uZSA9Ci0tewotLSAgLm5hcmdzID0gMCwKLS0gIC5vcGVyYXRpb24gPSBudW0sCi0tICAudmFsID0KLS0gIHsKLS0gICAgLm51bSA9IDEKLS0gIH0KLS19OwotLXN0cnVjdCBleHByZXNzaW9uIEdFUk1BTklDX1BMVVJBTCA9Ci0tewotLSAgLm5hcmdzID0gMiwKLS0gIC5vcGVyYXRpb24gPSBub3RfZXF1YWwsCi0tICAudmFsID0KLS0gIHsKLS0gICAgLmFyZ3MgPQotLSAgICB7Ci0tICAgICAgWzBdID0gKHN0cnVjdCBleHByZXNzaW9uICopICZwbHZhciwKLS0gICAgICBbMV0gPSAoc3RydWN0IGV4cHJlc3Npb24gKikgJnBsb25lCi0tICAgIH0KLS0gIH0KLS19OwotLQotLSMgZGVmaW5lIElOSVRfR0VSTUFOSUNfUExVUkFMKCkKLS0KLS0jZWxzZQotLQotLS8qIEZvciBjb21waWxlcnMgd2l0aG91dCBzdXBwb3J0IGZvciBJU08gQyA5OSBzdHJ1Y3QvdW5pb24gaW5pdGlhbGl6ZXJzOgotLSAgIEluaXRpYWxpemF0aW9uIGF0IHJ1bi10aW1lLiAgKi8KLS0KLS1zdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gcGx2YXI7Ci0tc3RhdGljIHN0cnVjdCBleHByZXNzaW9uIHBsb25lOwotLXN0cnVjdCBleHByZXNzaW9uIEdFUk1BTklDX1BMVVJBTDsKLS0KLS1zdGF0aWMgdm9pZAotLWluaXRfZ2VybWFuaWNfcGx1cmFsICgpCi0tewotLSAgaWYgKHBsb25lLnZhbC5udW0gPT0gMCkKLS0gICAgewotLSAgICAgIHBsdmFyLm5hcmdzID0gMDsKLS0gICAgICBwbHZhci5vcGVyYXRpb24gPSB2YXI7Ci0tCi0tICAgICAgcGxvbmUubmFyZ3MgPSAwOwotLSAgICAgIHBsb25lLm9wZXJhdGlvbiA9IG51bTsKLS0gICAgICBwbG9uZS52YWwubnVtID0gMTsKLS0KLS0gICAgICBHRVJNQU5JQ19QTFVSQUwubmFyZ3MgPSAyOwotLSAgICAgIEdFUk1BTklDX1BMVVJBTC5vcGVyYXRpb24gPSBub3RfZXF1YWw7Ci0tICAgICAgR0VSTUFOSUNfUExVUkFMLnZhbC5hcmdzWzBdID0gJnBsdmFyOwotLSAgICAgIEdFUk1BTklDX1BMVVJBTC52YWwuYXJnc1sxXSA9ICZwbG9uZTsKLS0gICAgfQotLX0KLS0KLS0jIGRlZmluZSBJTklUX0dFUk1BTklDX1BMVVJBTCgpIGluaXRfZ2VybWFuaWNfcGx1cmFsICgpCi0tCi0tI2VuZGlmCi0tCi0tdm9pZAotLWludGVybmFsX2Z1bmN0aW9uCi0tRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiAoY29uc3QgY2hhciAqbnVsbGVudHJ5LAotLQkJCSAgIGNvbnN0IHN0cnVjdCBleHByZXNzaW9uICoqcGx1cmFscCwKLS0JCQkgICB1bnNpZ25lZCBsb25nIGludCAqbnBsdXJhbHNwKQotLXsKLS0gIGlmIChudWxsZW50cnkgIT0gTlVMTCkKLS0gICAgewotLSAgICAgIGNvbnN0IGNoYXIgKnBsdXJhbDsKLS0gICAgICBjb25zdCBjaGFyICpucGx1cmFsczsKLS0KLS0gICAgICBwbHVyYWwgPSBzdHJzdHIgKG51bGxlbnRyeSwgInBsdXJhbD0iKTsKLS0gICAgICBucGx1cmFscyA9IHN0cnN0ciAobnVsbGVudHJ5LCAibnBsdXJhbHM9Iik7Ci0tICAgICAgaWYgKHBsdXJhbCA9PSBOVUxMIHx8IG5wbHVyYWxzID09IE5VTEwpCi0tCWdvdG8gbm9fcGx1cmFsOwotLSAgICAgIGVsc2UKLS0JewotLQkgIGNoYXIgKmVuZHA7Ci0tCSAgdW5zaWduZWQgbG9uZyBpbnQgbjsKLS0JICBzdHJ1Y3QgcGFyc2VfYXJncyBhcmdzOwotLQotLQkgIC8qIEZpcnN0IGdldCB0aGUgbnVtYmVyLiAgKi8KLS0JICBucGx1cmFscyArPSA5OwotLQkgIHdoaWxlICgqbnBsdXJhbHMgIT0gJ1wwJyAmJiBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKm5wbHVyYWxzKSkKLS0JICAgICsrbnBsdXJhbHM7Ci0tCSAgaWYgKCEoKm5wbHVyYWxzID49ICcwJyAmJiAqbnBsdXJhbHMgPD0gJzknKSkKLS0JICAgIGdvdG8gbm9fcGx1cmFsOwotLSNpZiBkZWZpbmVkIEhBVkVfU1RSVE9VTCB8fCBkZWZpbmVkIF9MSUJDCi0tCSAgbiA9IHN0cnRvdWwgKG5wbHVyYWxzLCAmZW5kcCwgMTApOwotLSNlbHNlCi0tCSAgZm9yIChlbmRwID0gbnBsdXJhbHMsIG4gPSAwOyAqZW5kcCA+PSAnMCcgJiYgKmVuZHAgPD0gJzknOyBlbmRwKyspCi0tCSAgICBuID0gbiAqIDEwICsgKCplbmRwIC0gJzAnKTsKLS0jZW5kaWYKLS0JICBpZiAobnBsdXJhbHMgPT0gZW5kcCkKLS0JICAgIGdvdG8gbm9fcGx1cmFsOwotLQkgICpucGx1cmFsc3AgPSBuOwotLQotLQkgIC8qIER1ZSB0byB0aGUgcmVzdHJpY3Rpb25zIGJpc29uIGltcG9zZXMgb250byB0aGUgaW50ZXJmYWNlIG9mIHRoZQotLQkgICAgIHNjYW5uZXIgZnVuY3Rpb24gd2UgaGF2ZSB0byBwdXQgdGhlIGlucHV0IHN0cmluZyBhbmQgdGhlIHJlc3VsdAotLQkgICAgIHBhc3NlZCB1cCBmcm9tIHRoZSBwYXJzZXIgaW50byB0aGUgc2FtZSBzdHJ1Y3R1cmUgd2hpY2ggYWRkcmVzcwotLQkgICAgIGlzIHBhc3NlZCBkb3duIHRvIHRoZSBwYXJzZXIuICAqLwotLQkgIHBsdXJhbCArPSA3OwotLQkgIGFyZ3MuY3AgPSBwbHVyYWw7Ci0tCSAgaWYgKFBMVVJBTF9QQVJTRSAoJmFyZ3MpICE9IDApCi0tCSAgICBnb3RvIG5vX3BsdXJhbDsKLS0JICAqcGx1cmFscCA9IGFyZ3MucmVzOwotLQl9Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgewotLSAgICAgIC8qIEJ5IGRlZmF1bHQgd2UgYXJlIHVzaW5nIHRoZSBHZXJtYW5pYyBmb3JtOiBzaW5ndWxhciBmb3JtIG9ubHkKLS0gICAgICAgICBmb3IgYG9uZScsIHRoZSBwbHVyYWwgZm9ybSBvdGhlcndpc2UuICBZZXMsIHRoaXMgaXMgYWxzbyB3aGF0Ci0tICAgICAgICAgRW5nbGlzaCBpcyB1c2luZyBzaW5jZSBFbmdsaXNoIGlzIGEgR2VybWFuaWMgbGFuZ3VhZ2UuICAqLwotLSAgICBub19wbHVyYWw6Ci0tICAgICAgSU5JVF9HRVJNQU5JQ19QTFVSQUwgKCk7Ci0tICAgICAgKnBsdXJhbHAgPSAmR0VSTUFOSUNfUExVUkFMOwotLSAgICAgICpucGx1cmFsc3AgPSAyOwotLSAgICB9Ci0tfQotLS0tIGEvaW50bC9wbHVyYWwtZXhwLmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDEyOSArMCwwIEBACi0tLyogRXhwcmVzc2lvbiBwYXJzaW5nIGFuZCBldmFsdWF0aW9uIGZvciBwbHVyYWwgZm9ybSBzZWxlY3Rpb24uCi0tICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMsIDIwMDUtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBfUExVUkFMX0VYUF9ICi0tI2RlZmluZSBfUExVUkFMX0VYUF9ICi0tCi0tI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgotLSMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCi0tI2VuZGlmCi0tCi0tI2lmbmRlZiBhdHRyaWJ1dGVfaGlkZGVuCi0tIyBkZWZpbmUgYXR0cmlidXRlX2hpZGRlbgotLSNlbmRpZgotLQotLSNpZmRlZiBfX2NwbHVzcGx1cwotLWV4dGVybiAiQyIgewotLSNlbmRpZgotLQotLQotLWVudW0gZXhwcmVzc2lvbl9vcGVyYXRvcgotLXsKLS0gIC8qIFdpdGhvdXQgYXJndW1lbnRzOiAgKi8KLS0gIHZhciwJCQkJLyogVGhlIHZhcmlhYmxlICJuIi4gICovCi0tICBudW0sCQkJCS8qIERlY2ltYWwgbnVtYmVyLiAgKi8KLS0gIC8qIFVuYXJ5IG9wZXJhdG9yczogICovCi0tICBsbm90LAkJCQkvKiBMb2dpY2FsIE5PVC4gICovCi0tICAvKiBCaW5hcnkgb3BlcmF0b3JzOiAgKi8KLS0gIG11bHQsCQkJCS8qIE11bHRpcGxpY2F0aW9uLiAgKi8KLS0gIGRpdmlkZSwJCQkvKiBEaXZpc2lvbi4gICovCi0tICBtb2R1bGUsCQkJLyogTW9kdWxvIG9wZXJhdGlvbi4gICovCi0tICBwbHVzLAkJCQkvKiBBZGRpdGlvbi4gICovCi0tICBtaW51cywJCQkvKiBTdWJ0cmFjdGlvbi4gICovCi0tICBsZXNzX3RoYW4sCQkJLyogQ29tcGFyaXNvbi4gICovCi0tICBncmVhdGVyX3RoYW4sCQkJLyogQ29tcGFyaXNvbi4gICovCi0tICBsZXNzX29yX2VxdWFsLAkJLyogQ29tcGFyaXNvbi4gICovCi0tICBncmVhdGVyX29yX2VxdWFsLAkJLyogQ29tcGFyaXNvbi4gICovCi0tICBlcXVhbCwJCQkvKiBDb21wYXJpc29uIGZvciBlcXVhbGl0eS4gICovCi0tICBub3RfZXF1YWwsCQkJLyogQ29tcGFyaXNvbiBmb3IgaW5lcXVhbGl0eS4gICovCi0tICBsYW5kLAkJCQkvKiBMb2dpY2FsIEFORC4gICovCi0tICBsb3IsCQkJCS8qIExvZ2ljYWwgT1IuICAqLwotLSAgLyogVGVybmFyeSBvcGVyYXRvcnM6ICAqLwotLSAgcW1vcAkJCQkvKiBRdWVzdGlvbiBtYXJrIG9wZXJhdG9yLiAgKi8KLS19OwotLQotLS8qIFRoaXMgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBleHByZXNzaW9ucyB0byBkZXRlcm1pbmUgdGhlCi0tICAgcGx1cmFsIGZvcm0uICAqLwotLXN0cnVjdCBleHByZXNzaW9uCi0tewotLSAgaW50IG5hcmdzOwkJCS8qIE51bWJlciBvZiBhcmd1bWVudHMuICAqLwotLSAgZW51bSBleHByZXNzaW9uX29wZXJhdG9yIG9wZXJhdGlvbjsKLS0gIHVuaW9uCi0tICB7Ci0tICAgIHVuc2lnbmVkIGxvbmcgaW50IG51bTsJLyogTnVtYmVyIHZhbHVlIGZvciBgbnVtJy4gICovCi0tICAgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzNdOwkvKiBVcCB0byB0aHJlZSBhcmd1bWVudHMuICAqLwotLSAgfSB2YWw7Ci0tfTsKLS0KLS0vKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHRoZSBwYXJzZXIgYW5kIGdldAotLSAgIHRoZSByZXN1bHQgaW4gYSB0aHJlYWQtc2FmZSB3YXkuICAqLwotLXN0cnVjdCBwYXJzZV9hcmdzCi0tewotLSAgY29uc3QgY2hhciAqY3A7Ci0tICBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmVzOwotLX07Ci0tCi0tCi0tLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhpcyBzb3VyY2UgY29kZSBpcyB1c2VkCi0tICAgMS4gaW4gdGhlIEdOVSBDIExpYnJhcnkgbGlicmFyeSwKLS0gICAyLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSwKLS0gICAzLiBpbiB0aGUgR05VIGdldHRleHQgdG9vbHMuCi0tICAgVGhlIGZ1bmN0aW9uIG5hbWVzIGluIGVhY2ggc2l0dWF0aW9uIG11c3QgYmUgZGlmZmVyZW50LCB0byBhbGxvdyBmb3IKLS0gICBiaW5hcnkgaW5jb21wYXRpYmxlIGNoYW5nZXMgaW4gJ3N0cnVjdCBleHByZXNzaW9uJy4gIEZ1cnRoZXJtb3JlLAotLSAgIDEuIGluIHRoZSBHTlUgQyBMaWJyYXJ5IGxpYnJhcnksIHRoZSBuYW1lcyBoYXZlIGEgX18gcHJlZml4LAotLSAgIDIuKzMuIGluIHRoZSBHTlUgbGliaW50bCBsaWJyYXJ5IGFuZCBpbiB0aGUgR05VIGdldHRleHQgdG9vbHMsIHRoZSBuYW1lcwotLSAgICAgICAgIG11c3QgZm9sbG93IEFOU0kgQyBhbmQgbm90IHN0YXJ0IHdpdGggX18uCi0tICAgU28gd2UgaGF2ZSB0byBkaXN0aW5ndWlzaCB0aGUgdGhyZWUgY2FzZXMuICAqLwotLSNpZmRlZiBfTElCQwotLSMgZGVmaW5lIEZSRUVfRVhQUkVTU0lPTiBfX2dldHRleHRfZnJlZV9leHAKLS0jIGRlZmluZSBQTFVSQUxfUEFSU0UgX19nZXR0ZXh0cGFyc2UKLS0jIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgX19nZXR0ZXh0X2dlcm1hbmljX3BsdXJhbAotLSMgZGVmaW5lIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gX19nZXR0ZXh0X2V4dHJhY3RfcGx1cmFsCi0tI2VsaWYgZGVmaW5lZCAoSU5fTElCSU5UTCkKLS0jIGRlZmluZSBGUkVFX0VYUFJFU1NJT04gbGliaW50bF9nZXR0ZXh0X2ZyZWVfZXhwCi0tIyBkZWZpbmUgUExVUkFMX1BBUlNFIGxpYmludGxfZ2V0dGV4dHBhcnNlCi0tIyBkZWZpbmUgR0VSTUFOSUNfUExVUkFMIGxpYmludGxfZ2V0dGV4dF9nZXJtYW5pY19wbHVyYWwKLS0jIGRlZmluZSBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIGxpYmludGxfZ2V0dGV4dF9leHRyYWN0X3BsdXJhbAotLSNlbHNlCi0tIyBkZWZpbmUgRlJFRV9FWFBSRVNTSU9OIGZyZWVfcGx1cmFsX2V4cHJlc3Npb24KLS0jIGRlZmluZSBQTFVSQUxfUEFSU0UgcGFyc2VfcGx1cmFsX2V4cHJlc3Npb24KLS0jIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgZ2VybWFuaWNfcGx1cmFsCi0tIyBkZWZpbmUgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiBleHRyYWN0X3BsdXJhbF9leHByZXNzaW9uCi0tI2VuZGlmCi0tCi0tZXh0ZXJuIHZvaWQgRlJFRV9FWFBSRVNTSU9OIChzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwKQotLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0tZXh0ZXJuIGludCBQTFVSQUxfUEFSU0UgKHZvaWQgKmFyZyk7Ci0tZXh0ZXJuIHN0cnVjdCBleHByZXNzaW9uIEdFUk1BTklDX1BMVVJBTCBhdHRyaWJ1dGVfaGlkZGVuOwotLWV4dGVybiB2b2lkIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gKGNvbnN0IGNoYXIgKm51bGxlbnRyeSwKLS0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBleHByZXNzaW9uICoqcGx1cmFscCwKLS0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW50ICpucGx1cmFsc3ApCi0tICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLS0KLS0jaWYgIWRlZmluZWQgKF9MSUJDKSAmJiAhZGVmaW5lZCAoSU5fTElCSU5UTCkgJiYgIWRlZmluZWQgKElOX0xJQkdMT0NBTEUpCi0tZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHBsdXJhbF9ldmFsIChjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcGV4cCwKLS0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbnQgbik7Ci0tI2VuZGlmCi0tCi0tCi0tI2lmZGVmIF9fY3BsdXNwbHVzCi0tfQotLSNlbmRpZgotLQotLSNlbmRpZiAvKiBfUExVUkFMX0VYUF9IICovCi0tLS0gYS9pbnRsL3BsdXJhbC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxOTgxICswLDAgQEAKLS0KLS0vKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjEuICAqLwotLQotLS8qIFNrZWxldG9uIGltcGxlbWVudGF0aW9uIGZvciBCaXNvbidzIFlhY2MtbGlrZSBwYXJzZXJzIGluIEMKLS0gICAKLS0gICAgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKLS0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0gICAKLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0tICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLS0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLSAgIAotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tICAgCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLS0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0tCi0tLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgeW91IG1heSBjcmVhdGUgYSBsYXJnZXIgd29yayB0aGF0IGNvbnRhaW5zCi0tICAgcGFydCBvciBhbGwgb2YgdGhlIEJpc29uIHBhcnNlciBza2VsZXRvbiBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKLS0gICB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgc28gbG9uZyBhcyB0aGF0IHdvcmsgaXNuJ3QgaXRzZWxmIGEKLS0gICBwYXJzZXIgZ2VuZXJhdG9yIHVzaW5nIHRoZSBza2VsZXRvbiBvciBhIG1vZGlmaWVkIHZlcnNpb24gdGhlcmVvZgotLSAgIGFzIGEgcGFyc2VyIHNrZWxldG9uLiAgQWx0ZXJuYXRpdmVseSwgaWYgeW91IG1vZGlmeSBvciByZWRpc3RyaWJ1dGUKLS0gICB0aGUgcGFyc2VyIHNrZWxldG9uIGl0c2VsZiwgeW91IG1heSAoYXQgeW91ciBvcHRpb24pIHJlbW92ZSB0aGlzCi0tICAgc3BlY2lhbCBleGNlcHRpb24sIHdoaWNoIHdpbGwgY2F1c2UgdGhlIHNrZWxldG9uIGFuZCB0aGUgcmVzdWx0aW5nCi0tICAgQmlzb24gb3V0cHV0IGZpbGVzIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIHdpdGhvdXQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbi4KLS0gICAKLS0gICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluCi0tICAgdmVyc2lvbiAyLjIgb2YgQmlzb24uICAqLwotLQotLS8qIEMgTEFMUigxKSBwYXJzZXIgc2tlbGV0b24gd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuLCBieQotLSAgIHNpbXBsaWZ5aW5nIHRoZSBvcmlnaW5hbCBzby1jYWxsZWQgInNlbWFudGljIiBwYXJzZXIuICAqLwotLQotLS8qIEFsbCBzeW1ib2xzIGRlZmluZWQgYmVsb3cgc2hvdWxkIGJlZ2luIHdpdGggeXkgb3IgWVksIHRvIGF2b2lkCi0tICAgaW5mcmluZ2luZyBvbiB1c2VyIG5hbWUgc3BhY2UuICBUaGlzIHNob3VsZCBiZSBkb25lIGV2ZW4gZm9yIGxvY2FsCi0tICAgdmFyaWFibGVzLCBhcyB0aGV5IG1pZ2h0IG90aGVyd2lzZSBiZSBleHBhbmRlZCBieSB1c2VyIG1hY3Jvcy4KLS0gICBUaGVyZSBhcmUgc29tZSB1bmF2b2lkYWJsZSBleGNlcHRpb25zIHdpdGhpbiBpbmNsdWRlIGZpbGVzIHRvCi0tICAgZGVmaW5lIG5lY2Vzc2FyeSBsaWJyYXJ5IHN5bWJvbHM7IHRoZXkgYXJlIG5vdGVkICJJTkZSSU5HRVMgT04KLS0gICBVU0VSIE5BTUUgU1BBQ0UiIGJlbG93LiAgKi8KLS0KLS0vKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLwotLSNkZWZpbmUgWVlCSVNPTiAxCi0tCi0tLyogQmlzb24gdmVyc2lvbi4gICovCi0tI2RlZmluZSBZWUJJU09OX1ZFUlNJT04gIjIuNC4xIgotLQotLS8qIFNrZWxldG9uIG5hbWUuICAqLwotLSNkZWZpbmUgWVlTS0VMRVRPTl9OQU1FICJ5YWNjLmMiCi0tCi0tLyogUHVyZSBwYXJzZXJzLiAgKi8KLS0jZGVmaW5lIFlZUFVSRSAxCi0tCi0tLyogUHVzaCBwYXJzZXJzLiAgKi8KLS0jZGVmaW5lIFlZUFVTSCAwCi0tCi0tLyogUHVsbCBwYXJzZXJzLiAgKi8KLS0jZGVmaW5lIFlZUFVMTCAxCi0tCi0tLyogVXNpbmcgbG9jYXRpb25zLiAgKi8KLS0jZGVmaW5lIFlZTFNQX05FRURFRCAwCi0tCi0tLyogU3Vic3RpdHV0ZSB0aGUgdmFyaWFibGUgYW5kIGZ1bmN0aW9uIG5hbWVzLiAgKi8KLS0jZGVmaW5lIHl5cGFyc2UgICAgICAgICBfX2dldHRleHRwYXJzZQotLSNkZWZpbmUgeXlsZXggICAgICAgICAgIF9fZ2V0dGV4dGxleAotLSNkZWZpbmUgeXllcnJvciAgICAgICAgIF9fZ2V0dGV4dGVycm9yCi0tI2RlZmluZSB5eWx2YWwgICAgICAgICAgX19nZXR0ZXh0bHZhbAotLSNkZWZpbmUgeXljaGFyICAgICAgICAgIF9fZ2V0dGV4dGNoYXIKLS0jZGVmaW5lIHl5ZGVidWcgICAgICAgICBfX2dldHRleHRkZWJ1ZwotLSNkZWZpbmUgeXluZXJycyAgICAgICAgIF9fZ2V0dGV4dG5lcnJzCi0tCi0tCi0tLyogQ29weSB0aGUgZmlyc3QgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCi0tCi0tLyogTGluZSAxODkgb2YgeWFjYy5jICAqLwotLSNsaW5lIDEgInBsdXJhbC55IgotLQotLS8qIEV4cHJlc3Npb24gcGFyc2luZyBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgotLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxLCAyMDAzLCAyMDA1LTIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIEZvciBiaXNvbiA8IDIuMCwgdGhlIGJpc29uIGdlbmVyYXRlZCBwYXJzZXIgdXNlcyBhbGxvY2EuICBBSVggMyBmb3JjZXMgdXMKLS0gICB0byBwdXQgdGhpcyBkZWNsYXJhdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiAgVGhlIGRlY2xhcmF0aW9uIGluCi0tICAgYmlzb24ncyBza2VsZXRvbiBmaWxlIGNvbWVzIHRvbyBsYXRlLiAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4KLS0gICBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUgYXJiaXRyYXJ5IHN5c3RlbSBoZWFkZXJzLgotLSAgIFRoaXMgY2FuIGdvIGF3YXkgb25jZSB0aGUgQU1fSU5UTF9TVUJESVIgbWFjcm8gcmVxdWlyZXMgYmlzb24gPj0gMi4wLiAgKi8KLS0jaWYgZGVmaW5lZCBfQUlYICYmICFkZWZpbmVkIF9fR05VQ19fCi0tICNwcmFnbWEgYWxsb2NhCi0tI2VuZGlmCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxzdGRkZWYuaD4KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tI2luY2x1ZGUgPHN0cmluZy5oPgotLSNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCi0tCi0tLyogVGhlIG1haW4gZnVuY3Rpb24gZ2VuZXJhdGVkIGJ5IHRoZSBwYXJzZXIgaXMgY2FsbGVkIF9fZ2V0dGV4dHBhcnNlLAotLSAgIGJ1dCB3ZSB3YW50IGl0IHRvIGJlIGNhbGxlZCBQTFVSQUxfUEFSU0UuICAqLwotLSNpZm5kZWYgX0xJQkMKLS0jIGRlZmluZSBfX2dldHRleHRwYXJzZSBQTFVSQUxfUEFSU0UKLS0jZW5kaWYKLS0KLS0jZGVmaW5lIFlZTEVYX1BBUkFNCSYoKHN0cnVjdCBwYXJzZV9hcmdzICopIGFyZyktPmNwCi0tI2RlZmluZSBZWVBBUlNFX1BBUkFNCWFyZwotLQotLQotLS8qIExpbmUgMTg5IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxMzAgInBsdXJhbC5jIgotLQotLS8qIEVuYWJsaW5nIHRyYWNlcy4gICovCi0tI2lmbmRlZiBZWURFQlVHCi0tIyBkZWZpbmUgWVlERUJVRyAwCi0tI2VuZGlmCi0tCi0tLyogRW5hYmxpbmcgdmVyYm9zZSBlcnJvciBtZXNzYWdlcy4gICovCi0tI2lmZGVmIFlZRVJST1JfVkVSQk9TRQotLSMgdW5kZWYgWVlFUlJPUl9WRVJCT1NFCi0tIyBkZWZpbmUgWVlFUlJPUl9WRVJCT1NFIDEKLS0jZWxzZQotLSMgZGVmaW5lIFlZRVJST1JfVkVSQk9TRSAwCi0tI2VuZGlmCi0tCi0tLyogRW5hYmxpbmcgdGhlIHRva2VuIHRhYmxlLiAgKi8KLS0jaWZuZGVmIFlZVE9LRU5fVEFCTEUKLS0jIGRlZmluZSBZWVRPS0VOX1RBQkxFIDAKLS0jZW5kaWYKLS0KLS0KLS0vKiBUb2tlbnMuICAqLwotLSNpZm5kZWYgWVlUT0tFTlRZUEUKLS0jIGRlZmluZSBZWVRPS0VOVFlQRQotLSAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycwotLSAgICAgIGtub3cgYWJvdXQgdGhlbS4gICovCi0tICAgZW51bSB5eXRva2VudHlwZSB7Ci0tICAgICBFUVVPUDIgPSAyNTgsCi0tICAgICBDTVBPUDIgPSAyNTksCi0tICAgICBBRERPUDIgPSAyNjAsCi0tICAgICBNVUxPUDIgPSAyNjEsCi0tICAgICBOVU1CRVIgPSAyNjIKLS0gICB9OwotLSNlbmRpZgotLS8qIFRva2Vucy4gICovCi0tI2RlZmluZSBFUVVPUDIgMjU4Ci0tI2RlZmluZSBDTVBPUDIgMjU5Ci0tI2RlZmluZSBBRERPUDIgMjYwCi0tI2RlZmluZSBNVUxPUDIgMjYxCi0tI2RlZmluZSBOVU1CRVIgMjYyCi0tCi0tCi0tCi0tCi0tI2lmICEgZGVmaW5lZCBZWVNUWVBFICYmICEgZGVmaW5lZCBZWVNUWVBFX0lTX0RFQ0xBUkVECi0tdHlwZWRlZiB1bmlvbiBZWVNUWVBFCi0tewotLQotLS8qIExpbmUgMjE0IG9mIHlhY2MuYyAgKi8KLS0jbGluZSA1MSAicGx1cmFsLnkiCi0tCi0tICB1bnNpZ25lZCBsb25nIGludCBudW07Ci0tICBlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3A7Ci0tICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOwotLQotLQotLQotLS8qIExpbmUgMjE0IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxODggInBsdXJhbC5jIgotLX0gWVlTVFlQRTsKLS0jIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQotLSMgZGVmaW5lIHl5c3R5cGUgWVlTVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KLS0jIGRlZmluZSBZWVNUWVBFX0lTX0RFQ0xBUkVEIDEKLS0jZW5kaWYKLS0KLS0KLS0vKiBDb3B5IHRoZSBzZWNvbmQgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCi0tCi0tLyogTGluZSAyNjQgb2YgeWFjYy5jICAqLwotLSNsaW5lIDU3ICJwbHVyYWwueSIKLS0KLS0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotLXN0YXRpYyBpbnQgeXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKTsKLS1zdGF0aWMgdm9pZCB5eWVycm9yIChjb25zdCBjaGFyICpzdHIpOwotLQotLS8qIEFsbG9jYXRpb24gb2YgZXhwcmVzc2lvbnMuICAqLwotLQotLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi0tbmV3X2V4cCAoaW50IG5hcmdzLCBlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3AsCi0tCSBzdHJ1Y3QgZXhwcmVzc2lvbiAqIGNvbnN0ICphcmdzKQotLXsKLS0gIGludCBpOwotLSAgc3RydWN0IGV4cHJlc3Npb24gKm5ld3A7Ci0tCi0tICAvKiBJZiBhbnkgb2YgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBtYWxsb2MnZWQsIGp1c3QgcmV0dXJuIE5VTEwuICAqLwotLSAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKLS0gICAgaWYgKGFyZ3NbaV0gPT0gTlVMTCkKLS0gICAgICBnb3RvIGZhaWw7Ci0tCi0tICAvKiBBbGxvY2F0ZSBhIG5ldyBleHByZXNzaW9uLiAgKi8KLS0gIG5ld3AgPSAoc3RydWN0IGV4cHJlc3Npb24gKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7Ci0tICBpZiAobmV3cCAhPSBOVUxMKQotLSAgICB7Ci0tICAgICAgbmV3cC0+bmFyZ3MgPSBuYXJnczsKLS0gICAgICBuZXdwLT5vcGVyYXRpb24gPSBvcDsKLS0gICAgICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQotLQluZXdwLT52YWwuYXJnc1tpXSA9IGFyZ3NbaV07Ci0tICAgICAgcmV0dXJuIG5ld3A7Ci0tICAgIH0KLS0KLS0gZmFpbDoKLS0gIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCi0tICAgIEZSRUVfRVhQUkVTU0lPTiAoYXJnc1tpXSk7Ci0tCi0tICByZXR1cm4gTlVMTDsKLS19Ci0tCi0tc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi0tbmV3X2V4cF8wIChlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3ApCi0tewotLSAgcmV0dXJuIG5ld19leHAgKDAsIG9wLCBOVUxMKTsKLS19Ci0tCi0tc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi0tbmV3X2V4cF8xIChlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKLS17Ci0tICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1sxXTsKLS0KLS0gIGFyZ3NbMF0gPSByaWdodDsKLS0gIHJldHVybiBuZXdfZXhwICgxLCBvcCwgYXJncyk7Ci0tfQotLQotLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi0tbmV3X2V4cF8yIChlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpsZWZ0LAotLQkgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmlnaHQpCi0tewotLSAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMl07Ci0tCi0tICBhcmdzWzBdID0gbGVmdDsKLS0gIGFyZ3NbMV0gPSByaWdodDsKLS0gIHJldHVybiBuZXdfZXhwICgyLCBvcCwgYXJncyk7Ci0tfQotLQotLXN0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgotLW5ld19leHBfMyAoZW51bSBleHByZXNzaW9uX29wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqYmV4cCwKLS0JICAgc3RydWN0IGV4cHJlc3Npb24gKnRicmFuY2gsIHN0cnVjdCBleHByZXNzaW9uICpmYnJhbmNoKQotLXsKLS0gIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzNdOwotLQotLSAgYXJnc1swXSA9IGJleHA7Ci0tICBhcmdzWzFdID0gdGJyYW5jaDsKLS0gIGFyZ3NbMl0gPSBmYnJhbmNoOwotLSAgcmV0dXJuIG5ld19leHAgKDMsIG9wLCBhcmdzKTsKLS19Ci0tCi0tCi0tCi0tLyogTGluZSAyNjQgb2YgeWFjYy5jICAqLwotLSNsaW5lIDI3OCAicGx1cmFsLmMiCi0tCi0tI2lmZGVmIHNob3J0Ci0tIyB1bmRlZiBzaG9ydAotLSNlbmRpZgotLQotLSNpZmRlZiBZWVRZUEVfVUlOVDgKLS10eXBlZGVmIFlZVFlQRV9VSU5UOCB5eXR5cGVfdWludDg7Ci0tI2Vsc2UKLS10eXBlZGVmIHVuc2lnbmVkIGNoYXIgeXl0eXBlX3VpbnQ4OwotLSNlbmRpZgotLQotLSNpZmRlZiBZWVRZUEVfSU5UOAotLXR5cGVkZWYgWVlUWVBFX0lOVDggeXl0eXBlX2ludDg7Ci0tI2VsaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS10eXBlZGVmIHNpZ25lZCBjaGFyIHl5dHlwZV9pbnQ4OwotLSNlbHNlCi0tdHlwZWRlZiBzaG9ydCBpbnQgeXl0eXBlX2ludDg7Ci0tI2VuZGlmCi0tCi0tI2lmZGVmIFlZVFlQRV9VSU5UMTYKLS10eXBlZGVmIFlZVFlQRV9VSU5UMTYgeXl0eXBlX3VpbnQxNjsKLS0jZWxzZQotLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHl5dHlwZV91aW50MTY7Ci0tI2VuZGlmCi0tCi0tI2lmZGVmIFlZVFlQRV9JTlQxNgotLXR5cGVkZWYgWVlUWVBFX0lOVDE2IHl5dHlwZV9pbnQxNjsKLS0jZWxzZQotLXR5cGVkZWYgc2hvcnQgaW50IHl5dHlwZV9pbnQxNjsKLS0jZW5kaWYKLS0KLS0jaWZuZGVmIFlZU0laRV9UCi0tIyBpZmRlZiBfX1NJWkVfVFlQRV9fCi0tIyAgZGVmaW5lIFlZU0laRV9UIF9fU0laRV9UWVBFX18KLS0jIGVsaWYgZGVmaW5lZCBzaXplX3QKLS0jICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90Ci0tIyBlbGlmICEgZGVmaW5lZCBZWVNJWkVfVCAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotLSMgIGluY2x1ZGUgPHN0ZGRlZi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0tIyAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAotLSMgZWxzZQotLSMgIGRlZmluZSBZWVNJWkVfVCB1bnNpZ25lZCBpbnQKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tI2RlZmluZSBZWVNJWkVfTUFYSU1VTSAoKFlZU0laRV9UKSAtMSkKLS0KLS0jaWZuZGVmIFlZXwotLSMgaWYgWVlFTkFCTEVfTkxTCi0tIyAgaWYgRU5BQkxFX05MUwotLSMgICBpbmNsdWRlIDxsaWJpbnRsLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLS0jICAgZGVmaW5lIFlZXyhtc2dpZCkgZGdldHRleHQgKCJiaXNvbi1ydW50aW1lIiwgbXNnaWQpCi0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgWVlfCi0tIyAgZGVmaW5lIFlZXyhtc2dpZCkgbXNnaWQKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tLyogU3VwcHJlc3MgdW51c2VkLXZhcmlhYmxlIHdhcm5pbmdzIGJ5ICJ1c2luZyIgRS4gICovCi0tI2lmICEgZGVmaW5lZCBsaW50IHx8IGRlZmluZWQgX19HTlVDX18KLS0jIGRlZmluZSBZWVVTRShlKSAoKHZvaWQpIChlKSkKLS0jZWxzZQotLSMgZGVmaW5lIFlZVVNFKGUpIC8qIGVtcHR5ICovCi0tI2VuZGlmCi0tCi0tLyogSWRlbnRpdHkgZnVuY3Rpb24sIHVzZWQgdG8gc3VwcHJlc3Mgd2FybmluZ3MgYWJvdXQgY29uc3RhbnQgY29uZGl0aW9ucy4gICovCi0tI2lmbmRlZiBsaW50Ci0tIyBkZWZpbmUgWVlJRChuKSAobikKLS0jZWxzZQotLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotLXN0YXRpYyBpbnQKLS1ZWUlEIChpbnQgeXlpKQotLSNlbHNlCi0tc3RhdGljIGludAotLVlZSUQgKHl5aSkKLS0gICAgaW50IHl5aTsKLS0jZW5kaWYKLS17Ci0tICByZXR1cm4geXlpOwotLX0KLS0jZW5kaWYKLS0KLS0jaWYgISBkZWZpbmVkIHl5b3ZlcmZsb3cgfHwgWVlFUlJPUl9WRVJCT1NFCi0tCi0tLyogVGhlIHBhcnNlciBpbnZva2VzIGFsbG9jYSBvciBtYWxsb2M7IGRlZmluZSB0aGUgbmVjZXNzYXJ5IHN5bWJvbHMuICAqLwotLQotLSMgaWZkZWYgWVlTVEFDS19VU0VfQUxMT0NBCi0tIyAgaWYgWVlTVEFDS19VU0VfQUxMT0NBCi0tIyAgIGlmZGVmIF9fR05VQ19fCi0tIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBfX2J1aWx0aW5fYWxsb2NhCi0tIyAgIGVsaWYgZGVmaW5lZCBfX0JVSUxUSU5fVkFfQVJHX0lOQ1IKLS0jICAgIGluY2x1ZGUgPGFsbG9jYS5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0tIyAgIGVsaWYgZGVmaW5lZCBfQUlYCi0tIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBfX2FsbG9jYQotLSMgICBlbGlmIGRlZmluZWQgX01TQ19WRVIKLS0jICAgIGluY2x1ZGUgPG1hbGxvYy5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0tIyAgICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLS0jICAgZWxzZQotLSMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCi0tIyAgICBpZiAhIGRlZmluZWQgX0FMTE9DQV9IICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS0jICAgICBpbmNsdWRlIDxzdGRsaWIuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotLSMgICAgIGlmbmRlZiBfU1RETElCX0gKLS0jICAgICAgZGVmaW5lIF9TVERMSUJfSCAxCi0tIyAgICAgZW5kaWYKLS0jICAgIGVuZGlmCi0tIyAgIGVuZGlmCi0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tCi0tIyBpZmRlZiBZWVNUQUNLX0FMTE9DCi0tICAgLyogUGFjaWZ5IEdDQydzIGBlbXB0eSBpZi1ib2R5JyB3YXJuaW5nLiAgKi8KLS0jICBkZWZpbmUgWVlTVEFDS19GUkVFKFB0cikgZG8geyAvKiBlbXB0eSAqLzsgfSB3aGlsZSAoWVlJRCAoMCkpCi0tIyAgaWZuZGVmIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTQotLSAgICAvKiBUaGUgT1MgbWlnaHQgZ3VhcmFudGVlIG9ubHkgb25lIGd1YXJkIHBhZ2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2ssCi0tICAgICAgIGFuZCBhIHBhZ2Ugc2l6ZSBjYW4gYmUgYXMgc21hbGwgYXMgNDA5NiBieXRlcy4gIFNvIHdlIGNhbm5vdCBzYWZlbHkKLS0gICAgICAgaW52b2tlIGFsbG9jYSAoTikgaWYgTiBleGNlZWRzIDQwOTYuICBVc2UgYSBzbGlnaHRseSBzbWFsbGVyIG51bWJlcgotLSAgICAgICB0byBhbGxvdyBmb3IgYSBmZXcgY29tcGlsZXItYWxsb2NhdGVkIHRlbXBvcmFyeSBzdGFjayBzbG90cy4gICovCi0tIyAgIGRlZmluZSBZWVNUQUNLX0FMTE9DX01BWElNVU0gNDAzMiAvKiByZWFzb25hYmxlIGNpcmNhIDIwMDYgKi8KLS0jICBlbmRpZgotLSMgZWxzZQotLSMgIGRlZmluZSBZWVNUQUNLX0FMTE9DIFlZTUFMTE9DCi0tIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRSBZWUZSRUUKLS0jICBpZm5kZWYgWVlTVEFDS19BTExPQ19NQVhJTVVNCi0tIyAgIGRlZmluZSBZWVNUQUNLX0FMTE9DX01BWElNVU0gWVlTSVpFX01BWElNVU0KLS0jICBlbmRpZgotLSMgIGlmIChkZWZpbmVkIF9fY3BsdXNwbHVzICYmICEgZGVmaW5lZCBfU1RETElCX0ggXAotLSAgICAgICAmJiAhICgoZGVmaW5lZCBZWU1BTExPQyB8fCBkZWZpbmVkIG1hbGxvYykgXAotLQkgICAgICYmIChkZWZpbmVkIFlZRlJFRSB8fCBkZWZpbmVkIGZyZWUpKSkKLS0jICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLS0jICAgaWZuZGVmIF9TVERMSUJfSAotLSMgICAgZGVmaW5lIF9TVERMSUJfSCAxCi0tIyAgIGVuZGlmCi0tIyAgZW5kaWYKLS0jICBpZm5kZWYgWVlNQUxMT0MKLS0jICAgZGVmaW5lIFlZTUFMTE9DIG1hbGxvYwotLSMgICBpZiAhIGRlZmluZWQgbWFsbG9jICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS12b2lkICptYWxsb2MgKFlZU0laRV9UKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotLSMgICBlbmRpZgotLSMgIGVuZGlmCi0tIyAgaWZuZGVmIFlZRlJFRQotLSMgICBkZWZpbmUgWVlGUkVFIGZyZWUKLS0jICAgaWYgISBkZWZpbmVkIGZyZWUgJiYgISBkZWZpbmVkIF9TVERMSUJfSCAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotLXZvaWQgZnJlZSAodm9pZCAqKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotLSMgICBlbmRpZgotLSMgIGVuZGlmCi0tIyBlbmRpZgotLSNlbmRpZiAvKiAhIGRlZmluZWQgeXlvdmVyZmxvdyB8fCBZWUVSUk9SX1ZFUkJPU0UgKi8KLS0KLS0KLS0jaWYgKCEgZGVmaW5lZCB5eW92ZXJmbG93IFwKLS0gICAgICYmICghIGRlZmluZWQgX19jcGx1c3BsdXMgXAotLQkgfHwgKGRlZmluZWQgWVlTVFlQRV9JU19UUklWSUFMICYmIFlZU1RZUEVfSVNfVFJJVklBTCkpKQotLQotLS8qIEEgdHlwZSB0aGF0IGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIGFueSBzdGFjayBtZW1iZXIuICAqLwotLXVuaW9uIHl5YWxsb2MKLS17Ci0tICB5eXR5cGVfaW50MTYgeXlzc19hbGxvYzsKLS0gIFlZU1RZUEUgeXl2c19hbGxvYzsKLS19OwotLQotLS8qIFRoZSBzaXplIG9mIHRoZSBtYXhpbXVtIGdhcCBiZXR3ZWVuIG9uZSBhbGlnbmVkIHN0YWNrIGFuZCB0aGUgbmV4dC4gICovCi0tIyBkZWZpbmUgWVlTVEFDS19HQVBfTUFYSU1VTSAoc2l6ZW9mICh1bmlvbiB5eWFsbG9jKSAtIDEpCi0tCi0tLyogVGhlIHNpemUgb2YgYW4gYXJyYXkgbGFyZ2UgdG8gZW5vdWdoIHRvIGhvbGQgYWxsIHN0YWNrcywgZWFjaCB3aXRoCi0tICAgTiBlbGVtZW50cy4gICovCi0tIyBkZWZpbmUgWVlTVEFDS19CWVRFUyhOKSBcCi0tICAgICAoKE4pICogKHNpemVvZiAoeXl0eXBlX2ludDE2KSArIHNpemVvZiAoWVlTVFlQRSkpIFwKLS0gICAgICArIFlZU1RBQ0tfR0FQX01BWElNVU0pCi0tCi0tLyogQ29weSBDT1VOVCBvYmplY3RzIGZyb20gRlJPTSB0byBUTy4gIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRvCi0tICAgbm90IG92ZXJsYXAuICAqLwotLSMgaWZuZGVmIFlZQ09QWQotLSMgIGlmIGRlZmluZWQgX19HTlVDX18gJiYgMSA8IF9fR05VQ19fCi0tIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KSBcCi0tICAgICAgX19idWlsdGluX21lbWNweSAoVG8sIEZyb20sIChDb3VudCkgKiBzaXplb2YgKCooRnJvbSkpKQotLSMgIGVsc2UKLS0jICAgZGVmaW5lIFlZQ09QWShUbywgRnJvbSwgQ291bnQpCQlcCi0tICAgICAgZG8JCQkJCVwKLS0JewkJCQkJXAotLQkgIFlZU0laRV9UIHl5aTsJCQkJXAotLQkgIGZvciAoeXlpID0gMDsgeXlpIDwgKENvdW50KTsgeXlpKyspCVwKLS0JICAgIChUbylbeXlpXSA9IChGcm9tKVt5eWldOwkJXAotLQl9CQkJCQlcCi0tICAgICAgd2hpbGUgKFlZSUQgKDApKQotLSMgIGVuZGlmCi0tIyBlbmRpZgotLQotLS8qIFJlbG9jYXRlIFNUQUNLIGZyb20gaXRzIG9sZCBsb2NhdGlvbiB0byB0aGUgbmV3IG9uZS4gIFRoZQotLSAgIGxvY2FsIHZhcmlhYmxlcyBZWVNJWkUgYW5kIFlZU1RBQ0tTSVpFIGdpdmUgdGhlIG9sZCBhbmQgbmV3IG51bWJlciBvZgotLSAgIGVsZW1lbnRzIGluIHRoZSBzdGFjaywgYW5kIFlZUFRSIGdpdmVzIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlCi0tICAgc3RhY2suICBBZHZhbmNlIFlZUFRSIHRvIGEgcHJvcGVybHkgYWxpZ25lZCBsb2NhdGlvbiBmb3IgdGhlIG5leHQKLS0gICBzdGFjay4gICovCi0tIyBkZWZpbmUgWVlTVEFDS19SRUxPQ0FURShTdGFja19hbGxvYywgU3RhY2spCQkJCVwKLS0gICAgZG8JCQkJCQkJCQlcCi0tICAgICAgewkJCQkJCQkJCVwKLS0JWVlTSVpFX1QgeXluZXdieXRlczsJCQkJCQlcCi0tCVlZQ09QWSAoJnl5cHRyLT5TdGFja19hbGxvYywgU3RhY2ssIHl5c2l6ZSk7CQkJXAotLQlTdGFjayA9ICZ5eXB0ci0+U3RhY2tfYWxsb2M7CQkJCQlcCi0tCXl5bmV3Ynl0ZXMgPSB5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKlN0YWNrKSArIFlZU1RBQ0tfR0FQX01BWElNVU07IFwKLS0JeXlwdHIgKz0geXluZXdieXRlcyAvIHNpemVvZiAoKnl5cHRyKTsJCQkJXAotLSAgICAgIH0JCQkJCQkJCQlcCi0tICAgIHdoaWxlIChZWUlEICgwKSkKLS0KLS0jZW5kaWYKLS0KLS0vKiBZWUZJTkFMIC0tIFN0YXRlIG51bWJlciBvZiB0aGUgdGVybWluYXRpb24gc3RhdGUuICAqLwotLSNkZWZpbmUgWVlGSU5BTCAgOQotLS8qIFlZTEFTVCAtLSBMYXN0IGluZGV4IGluIFlZVEFCTEUuICAqLwotLSNkZWZpbmUgWVlMQVNUICAgNTQKLS0KLS0vKiBZWU5UT0tFTlMgLS0gTnVtYmVyIG9mIHRlcm1pbmFscy4gICovCi0tI2RlZmluZSBZWU5UT0tFTlMgIDE2Ci0tLyogWVlOTlRTIC0tIE51bWJlciBvZiBub250ZXJtaW5hbHMuICAqLwotLSNkZWZpbmUgWVlOTlRTICAzCi0tLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHJ1bGVzLiAgKi8KLS0jZGVmaW5lIFlZTlJVTEVTICAxMwotLS8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBzdGF0ZXMuICAqLwotLSNkZWZpbmUgWVlOU1RBVEVTICAyNwotLQotLS8qIFlZVFJBTlNMQVRFKFlZTEVYKSAtLSBCaXNvbiBzeW1ib2wgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICAqLwotLSNkZWZpbmUgWVlVTkRFRlRPSyAgMgotLSNkZWZpbmUgWVlNQVhVVE9LICAgMjYyCi0tCi0tI2RlZmluZSBZWVRSQU5TTEFURShZWVgpCQkJCQkJXAotLSAgKCh1bnNpZ25lZCBpbnQpIChZWVgpIDw9IFlZTUFYVVRPSyA/IHl5dHJhbnNsYXRlW1lZWF0gOiBZWVVOREVGVE9LKQotLQotLS8qIFlZVFJBTlNMQVRFW1lZTEVYXSAtLSBCaXNvbiBzeW1ib2wgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICAqLwotLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXl0cmFuc2xhdGVbXSA9Ci0tewotLSAgICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgIDEwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDUsICAgICAyLAotLSAgICAgIDE0LCAgICAxNSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgIDEzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDYsICAgICA3LAotLSAgICAgICA4LCAgICAgOSwgICAgMTEKLS19OwotLQotLSNpZiBZWURFQlVHCi0tLyogWVlQUkhTW1lZTl0gLS0gSW5kZXggb2YgdGhlIGZpcnN0IFJIUyBzeW1ib2wgb2YgcnVsZSBudW1iZXIgWVlOIGluCi0tICAgWVlSSFMuICAqLwotLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlwcmhzW10gPQotLXsKLS0gICAgICAgMCwgICAgIDAsICAgICAzLCAgICAgNSwgICAgMTEsICAgIDE1LCAgICAxOSwgICAgMjMsICAgIDI3LCAgICAzMSwKLS0gICAgICAzNSwgICAgMzgsICAgIDQwLCAgICA0MgotLX07Ci0tCi0tLyogWVlSSFMgLS0gQSBgLTEnLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBydWxlcycgUkhTLiAgKi8KLS1zdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlyaHNbXSA9Ci0tewotLSAgICAgIDE3LCAgICAgMCwgICAgLTEsICAgIDE4LCAgICAtMSwgICAgMTgsICAgICAzLCAgICAxOCwgICAgMTIsICAgIDE4LAotLSAgICAgIC0xLCAgICAxOCwgICAgIDQsICAgIDE4LCAgICAtMSwgICAgMTgsICAgICA1LCAgICAxOCwgICAgLTEsICAgIDE4LAotLSAgICAgICA2LCAgICAxOCwgICAgLTEsICAgIDE4LCAgICAgNywgICAgMTgsICAgIC0xLCAgICAxOCwgICAgIDgsICAgIDE4LAotLSAgICAgIC0xLCAgICAxOCwgICAgIDksICAgIDE4LCAgICAtMSwgICAgMTAsICAgIDE4LCAgICAtMSwgICAgMTMsICAgIC0xLAotLSAgICAgIDExLCAgICAtMSwgICAgMTQsICAgIDE4LCAgICAxNSwgICAgLTEKLS19OwotLQotLS8qIFlZUkxJTkVbWVlOXSAtLSBzb3VyY2UgbGluZSB3aGVyZSBydWxlIG51bWJlciBZWU4gd2FzIGRlZmluZWQuICAqLwotLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlybGluZVtdID0KLS17Ci0tICAgICAgIDAsICAgMTU0LCAgIDE1NCwgICAxNjIsICAgMTY2LCAgIDE3MCwgICAxNzQsICAgMTc4LCAgIDE4MiwgICAxODYsCi0tICAgICAxOTAsICAgMTk0LCAgIDE5OCwgICAyMDMKLS19OwotLSNlbmRpZgotLQotLSNpZiBZWURFQlVHIHx8IFlZRVJST1JfVkVSQk9TRSB8fCBZWVRPS0VOX1RBQkxFCi0tLyogWVlUTkFNRVtTWU1CT0wtTlVNXSAtLSBTdHJpbmcgbmFtZSBvZiB0aGUgc3ltYm9sIFNZTUJPTC1OVU0uCi0tICAgRmlyc3QsIHRoZSB0ZXJtaW5hbHMsIHRoZW4sIHN0YXJ0aW5nIGF0IFlZTlRPS0VOUywgbm9udGVybWluYWxzLiAgKi8KLS1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgeXl0bmFtZVtdID0KLS17Ci0tICAiJGVuZCIsICJlcnJvciIsICIkdW5kZWZpbmVkIiwgIic/JyIsICInfCciLCAiJyYnIiwgIkVRVU9QMiIsICJDTVBPUDIiLAotLSAgIkFERE9QMiIsICJNVUxPUDIiLCAiJyEnIiwgIk5VTUJFUiIsICInOiciLCAiJ24nIiwgIicoJyIsICInKSciLAotLSAgIiRhY2NlcHQiLCAic3RhcnQiLCAiZXhwIiwgMAotLX07Ci0tI2VuZGlmCi0tCi0tIyBpZmRlZiBZWVBSSU5UCi0tLyogWVlUT0tOVU1bWVlMRVgtTlVNXSAtLSBJbnRlcm5hbCB0b2tlbiBudW1iZXIgY29ycmVzcG9uZGluZyB0bwotLSAgIHRva2VuIFlZTEVYLU5VTS4gICovCi0tc3RhdGljIGNvbnN0IHl5dHlwZV91aW50MTYgeXl0b2tudW1bXSA9Ci0tewotLSAgICAgICAwLCAgIDI1NiwgICAyNTcsICAgIDYzLCAgIDEyNCwgICAgMzgsICAgMjU4LCAgIDI1OSwgICAyNjAsICAgMjYxLAotLSAgICAgIDMzLCAgIDI2MiwgICAgNTgsICAgMTEwLCAgICA0MCwgICAgNDEKLS19OwotLSMgZW5kaWYKLS0KLS0vKiBZWVIxW1lZTl0gLS0gU3ltYm9sIG51bWJlciBvZiBzeW1ib2wgdGhhdCBydWxlIFlZTiBkZXJpdmVzLiAgKi8KLS1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjFbXSA9Ci0tewotLSAgICAgICAwLCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LAotLSAgICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4Ci0tfTsKLS0KLS0vKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gICovCi0tc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXIyW10gPQotLXsKLS0gICAgICAgMCwgICAgIDIsICAgICAxLCAgICAgNSwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywKLS0gICAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMwotLX07Ci0tCi0tLyogWVlERUZBQ1RbU1RBVEUtTkFNRV0gLS0gRGVmYXVsdCBydWxlIHRvIHJlZHVjZSB3aXRoIGluIHN0YXRlCi0tICAgU1RBVEUtTlVNIHdoZW4gWVlUQUJMRSBkb2Vzbid0IHNwZWNpZnkgc29tZXRoaW5nIGVsc2UgdG8gZG8uICBaZXJvCi0tICAgbWVhbnMgdGhlIGRlZmF1bHQgaXMgYW4gZXJyb3IuICAqLwotLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlkZWZhY3RbXSA9Ci0tewotLSAgICAgICAwLCAgICAgMCwgICAgMTIsICAgIDExLCAgICAgMCwgICAgIDAsICAgICAyLCAgICAxMCwgICAgIDAsICAgICAxLAotLSAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxMywgICAgIDAsICAgICA0LAotLSAgICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDAsICAgICAzCi0tfTsKLS0KLS0vKiBZWURFRkdPVE9bTlRFUk0tTlVNXS4gICovCi0tc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5ZGVmZ290b1tdID0KLS17Ci0tICAgICAgLTEsICAgICA1LCAgICAgNgotLX07Ci0tCi0tLyogWVlQQUNUW1NUQVRFLU5VTV0gLS0gSW5kZXggaW4gWVlUQUJMRSBvZiB0aGUgcG9ydGlvbiBkZXNjcmliaW5nCi0tICAgU1RBVEUtTlVNLiAgKi8KLS0jZGVmaW5lIFlZUEFDVF9OSU5GIC0xMAotLXN0YXRpYyBjb25zdCB5eXR5cGVfaW50OCB5eXBhY3RbXSA9Ci0tewotLSAgICAgIC05LCAgICAtOSwgICAtMTAsICAgLTEwLCAgICAtOSwgICAgIDgsICAgIDM2LCAgIC0xMCwgICAgMTMsICAgLTEwLAotLSAgICAgIC05LCAgICAtOSwgICAgLTksICAgIC05LCAgICAtOSwgICAgLTksICAgIC05LCAgIC0xMCwgICAgMjYsICAgIDQxLAotLSAgICAgIDQ1LCAgICAxOCwgICAgLTIsICAgIDE0LCAgIC0xMCwgICAgLTksICAgIDM2Ci0tfTsKLS0KLS0vKiBZWVBHT1RPW05URVJNLU5VTV0uICAqLwotLXN0YXRpYyBjb25zdCB5eXR5cGVfaW50OCB5eXBnb3RvW10gPQotLXsKLS0gICAgIC0xMCwgICAtMTAsICAgIC0xCi0tfTsKLS0KLS0vKiBZWVRBQkxFW1lZUEFDVFtTVEFURS1OVU1dXS4gIFdoYXQgdG8gZG8gaW4gc3RhdGUgU1RBVEUtTlVNLiAgSWYKLS0gICBwb3NpdGl2ZSwgc2hpZnQgdGhhdCB0b2tlbi4gIElmIG5lZ2F0aXZlLCByZWR1Y2UgdGhlIHJ1bGUgd2hpY2gKLS0gICBudW1iZXIgaXMgdGhlIG9wcG9zaXRlLiAgSWYgemVybywgZG8gd2hhdCBZWURFRkFDVCBzYXlzLgotLSAgIElmIFlZVEFCTEVfTklORiwgc3ludGF4IGVycm9yLiAgKi8KLS0jZGVmaW5lIFlZVEFCTEVfTklORiAtMQotLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXl0YWJsZVtdID0KLS17Ci0tICAgICAgIDcsICAgICAxLCAgICAgMiwgICAgIDgsICAgICAzLCAgICAgNCwgICAgMTUsICAgIDE2LCAgICAgOSwgICAgMTgsCi0tICAgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsCi0tICAgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTYsICAgIDI2LCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTAsCi0tICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgIDAsICAgICAwLCAgICAyNSwgICAgMTAsCi0tICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsCi0tICAgICAgMTYsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2Ci0tfTsKLS0KLS1zdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXljaGVja1tdID0KLS17Ci0tICAgICAgIDEsICAgIDEwLCAgICAxMSwgICAgIDQsICAgIDEzLCAgICAxNCwgICAgIDgsICAgICA5LCAgICAgMCwgICAgMTAsCi0tICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsCi0tICAgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDksICAgIDI1LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxNSwgICAgIDMsCi0tICAgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgLTEsICAgIC0xLCAgICAxMiwgICAgIDMsCi0tICAgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsCi0tICAgICAgIDksICAgICA2LCAgICAgNywgICAgIDgsICAgICA5Ci0tfTsKLS0KLS0vKiBZWVNUT1NbU1RBVEUtTlVNXSAtLSBUaGUgKGludGVybmFsIG51bWJlciBvZiB0aGUpIGFjY2Vzc2luZwotLSAgIHN5bWJvbCBvZiBzdGF0ZSBTVEFURS1OVU0uICAqLwotLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlzdG9zW10gPQotLXsKLS0gICAgICAgMCwgICAgMTAsICAgIDExLCAgICAxMywgICAgMTQsICAgIDE3LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAgMCwKLS0gICAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTUsICAgIDE4LCAgICAxOCwKLS0gICAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDEyLCAgICAxOAotLX07Ci0tCi0tI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQotLSNkZWZpbmUgeXljbGVhcmluCSh5eWNoYXIgPSBZWUVNUFRZKQotLSNkZWZpbmUgWVlFTVBUWQkJKC0yKQotLSNkZWZpbmUgWVlFT0YJCTAKLS0KLS0jZGVmaW5lIFlZQUNDRVBUCWdvdG8geXlhY2NlcHRsYWIKLS0jZGVmaW5lIFlZQUJPUlQJCWdvdG8geXlhYm9ydGxhYgotLSNkZWZpbmUgWVlFUlJPUgkJZ290byB5eWVycm9ybGFiCi0tCi0tCi0tLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseQotLSAgIHRvIGVhc2UgdGhlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCi0tICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLwotLQotLSNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCi0tCi0tI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCi0tCi0tI2RlZmluZSBZWUJBQ0tVUChUb2tlbiwgVmFsdWUpCQkJCQlcCi0tZG8JCQkJCQkJCVwKLS0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCi0tICAgIHsJCQkJCQkJCVwKLS0gICAgICB5eWNoYXIgPSAoVG9rZW4pOwkJCQkJCVwKLS0gICAgICB5eWx2YWwgPSAoVmFsdWUpOwkJCQkJCVwKLS0gICAgICB5eXRva2VuID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CQkJCVwKLS0gICAgICBZWVBPUFNUQUNLICgxKTsJCQkJCQlcCi0tICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCi0tICAgIH0JCQkJCQkJCVwKLS0gIGVsc2UJCQkJCQkJCVwKLS0gICAgewkJCQkJCQkJXAotLSAgICAgIHl5ZXJyb3IgKFlZXygic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpKTsgXAotLSAgICAgIFlZRVJST1I7CQkJCQkJCVwKLS0gICAgfQkJCQkJCQkJXAotLXdoaWxlIChZWUlEICgwKSkKLS0KLS0KLS0jZGVmaW5lIFlZVEVSUk9SCTEKLS0jZGVmaW5lIFlZRVJSQ09ERQkyNTYKLS0KLS0KLS0vKiBZWUxMT0NfREVGQVVMVCAtLSBTZXQgQ1VSUkVOVCB0byBzcGFuIGZyb20gUkhTWzFdIHRvIFJIU1tOXS4KLS0gICBJZiBOIGlzIDAsIHRoZW4gc2V0IENVUlJFTlQgdG8gdGhlIGVtcHR5IGxvY2F0aW9uIHdoaWNoIGVuZHMKLS0gICB0aGUgcHJldmlvdXMgc3ltYm9sOiBSSFNbMF0gKGFsd2F5cyBkZWZpbmVkKS4gICovCi0tCi0tI2RlZmluZSBZWVJIU0xPQyhSaHMsIEspICgoUmhzKVtLXSkKLS0jaWZuZGVmIFlZTExPQ19ERUZBVUxUCi0tIyBkZWZpbmUgWVlMTE9DX0RFRkFVTFQoQ3VycmVudCwgUmhzLCBOKQkJCQlcCi0tICAgIGRvCQkJCQkJCQkJXAotLSAgICAgIGlmIChZWUlEIChOKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLQl7CQkJCQkJCQlcCi0tCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2xpbmU7CVwKLS0JICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gWVlSSFNMT0MgKFJocywgMSkuZmlyc3RfY29sdW1uOwlcCi0tCSAgKEN1cnJlbnQpLmxhc3RfbGluZSAgICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfbGluZTsJCVwKLS0JICAoQ3VycmVudCkubGFzdF9jb2x1bW4gID0gWVlSSFNMT0MgKFJocywgTikubGFzdF9jb2x1bW47CVwKLS0JfQkJCQkJCQkJXAotLSAgICAgIGVsc2UJCQkJCQkJCVwKLS0JewkJCQkJCQkJXAotLQkgIChDdXJyZW50KS5maXJzdF9saW5lICAgPSAoQ3VycmVudCkubGFzdF9saW5lICAgPQkJXAotLQkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9saW5lOwkJCQlcCi0tCSAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IChDdXJyZW50KS5sYXN0X2NvbHVtbiA9CQlcCi0tCSAgICBZWVJIU0xPQyAoUmhzLCAwKS5sYXN0X2NvbHVtbjsJCQkJXAotLQl9CQkJCQkJCQlcCi0tICAgIHdoaWxlIChZWUlEICgwKSkKLS0jZW5kaWYKLS0KLS0KLS0vKiBZWV9MT0NBVElPTl9QUklOVCAtLSBQcmludCB0aGUgbG9jYXRpb24gb24gdGhlIHN0cmVhbS4KLS0gICBUaGlzIG1hY3JvIHdhcyBub3QgbWFuZGF0ZWQgb3JpZ2luYWxseTogZGVmaW5lIG9ubHkgaWYgd2Uga25vdwotLSAgIHdlIHdvbid0IGJyZWFrIHVzZXIgY29kZTogd2hlbiB0aGVzZSBhcmUgdGhlIGxvY2F0aW9ucyB3ZSBrbm93LiAgKi8KLS0KLS0jaWZuZGVmIFlZX0xPQ0FUSU9OX1BSSU5UCi0tIyBpZiBZWUxUWVBFX0lTX1RSSVZJQUwKLS0jICBkZWZpbmUgWVlfTE9DQVRJT05fUFJJTlQoRmlsZSwgTG9jKQkJCVwKLS0gICAgIGZwcmludGYgKEZpbGUsICIlZC4lZC0lZC4lZCIsCQkJXAotLQkgICAgICAoTG9jKS5maXJzdF9saW5lLCAoTG9jKS5maXJzdF9jb2x1bW4sCVwKLS0JICAgICAgKExvYykubGFzdF9saW5lLCAgKExvYykubGFzdF9jb2x1bW4pCi0tIyBlbHNlCi0tIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykgKCh2b2lkKSAwKQotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0KLS0vKiBZWUxFWCAtLSBjYWxsaW5nIGB5eWxleCcgd2l0aCB0aGUgcmlnaHQgYXJndW1lbnRzLiAgKi8KLS0KLS0jaWZkZWYgWVlMRVhfUEFSQU0KLS0jIGRlZmluZSBZWUxFWCB5eWxleCAoJnl5bHZhbCwgWVlMRVhfUEFSQU0pCi0tI2Vsc2UKLS0jIGRlZmluZSBZWUxFWCB5eWxleCAoJnl5bHZhbCkKLS0jZW5kaWYKLS0KLS0vKiBFbmFibGUgZGVidWdnaW5nIGlmIHJlcXVlc3RlZC4gICovCi0tI2lmIFlZREVCVUcKLS0KLS0jIGlmbmRlZiBZWUZQUklOVEYKLS0jICBpbmNsdWRlIDxzdGRpby5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0tIyAgZGVmaW5lIFlZRlBSSU5URiBmcHJpbnRmCi0tIyBlbmRpZgotLQotLSMgZGVmaW5lIFlZRFBSSU5URihBcmdzKQkJCVwKLS1kbyB7CQkJCQkJXAotLSAgaWYgKHl5ZGVidWcpCQkJCQlcCi0tICAgIFlZRlBSSU5URiBBcmdzOwkJCQlcCi0tfSB3aGlsZSAoWVlJRCAoMCkpCi0tCi0tIyBkZWZpbmUgWVlfU1lNQk9MX1BSSU5UKFRpdGxlLCBUeXBlLCBWYWx1ZSwgTG9jYXRpb24pCQkJICBcCi0tZG8gewkJCQkJCQkJCSAgXAotLSAgaWYgKHl5ZGVidWcpCQkJCQkJCQkgIFwKLS0gICAgewkJCQkJCQkJCSAgXAotLSAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgVGl0bGUpOwkJCQkJICBcCi0tICAgICAgeXlfc3ltYm9sX3ByaW50IChzdGRlcnIsCQkJCQkJICBcCi0tCQkgIFR5cGUsIFZhbHVlKTsgXAotLSAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsJCQkJCQkgIFwKLS0gICAgfQkJCQkJCQkJCSAgXAotLX0gd2hpbGUgKFlZSUQgKDApKQotLQotLQotLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0tfCBQcmludCB0aGlzIHN5bWJvbCBvbiBZWU9VVFBVVC4gIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLQotLS8qQVJHU1VTRUQqLwotLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotLXN0YXRpYyB2b2lkCi0teXlfc3ltYm9sX3ZhbHVlX3ByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwKQotLSNlbHNlCi0tc3RhdGljIHZvaWQKLS15eV9zeW1ib2xfdmFsdWVfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwKQotLSAgICBGSUxFICp5eW91dHB1dDsKLS0gICAgaW50IHl5dHlwZTsKLS0gICAgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwOwotLSNlbmRpZgotLXsKLS0gIGlmICgheXl2YWx1ZXApCi0tICAgIHJldHVybjsKLS0jIGlmZGVmIFlZUFJJTlQKLS0gIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCi0tICAgIFlZUFJJTlQgKHl5b3V0cHV0LCB5eXRva251bVt5eXR5cGVdLCAqeXl2YWx1ZXApOwotLSMgZWxzZQotLSAgWVlVU0UgKHl5b3V0cHV0KTsKLS0jIGVuZGlmCi0tICBzd2l0Y2ggKHl5dHlwZSkKLS0gICAgewotLSAgICAgIGRlZmF1bHQ6Ci0tCWJyZWFrOwotLSAgICB9Ci0tfQotLQotLQotLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0tfCBQcmludCB0aGlzIHN5bWJvbCBvbiBZWU9VVFBVVC4gIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLQotLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotLXN0YXRpYyB2b2lkCi0teXlfc3ltYm9sX3ByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwKQotLSNlbHNlCi0tc3RhdGljIHZvaWQKLS15eV9zeW1ib2xfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwKQotLSAgICBGSUxFICp5eW91dHB1dDsKLS0gICAgaW50IHl5dHlwZTsKLS0gICAgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwOwotLSNlbmRpZgotLXsKLS0gIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCi0tICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJ0b2tlbiAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKLS0gIGVsc2UKLS0gICAgWVlGUFJJTlRGICh5eW91dHB1dCwgIm50ZXJtICVzICgiLCB5eXRuYW1lW3l5dHlwZV0pOwotLQotLSAgeXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCk7Ci0tICBZWUZQUklOVEYgKHl5b3V0cHV0LCAiKSIpOwotLX0KLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLS18IHl5X3N0YWNrX3ByaW50IC0tIFByaW50IHRoZSBzdGF0ZSBzdGFjayBmcm9tIGl0cyBCT1RUT00gdXAgdG8gaXRzIHwKLS18IFRPUCAoaW5jbHVkZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS0KLS0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS1zdGF0aWMgdm9pZAotLXl5X3N0YWNrX3ByaW50ICh5eXR5cGVfaW50MTYgKnl5Ym90dG9tLCB5eXR5cGVfaW50MTYgKnl5dG9wKQotLSNlbHNlCi0tc3RhdGljIHZvaWQKLS15eV9zdGFja19wcmludCAoeXlib3R0b20sIHl5dG9wKQotLSAgICB5eXR5cGVfaW50MTYgKnl5Ym90dG9tOwotLSAgICB5eXR5cGVfaW50MTYgKnl5dG9wOwotLSNlbmRpZgotLXsKLS0gIFlZRlBSSU5URiAoc3RkZXJyLCAiU3RhY2sgbm93Iik7Ci0tICBmb3IgKDsgeXlib3R0b20gPD0geXl0b3A7IHl5Ym90dG9tKyspCi0tICAgIHsKLS0gICAgICBpbnQgeXlib3QgPSAqeXlib3R0b207Ci0tICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgJWQiLCB5eWJvdCk7Ci0tICAgIH0KLS0gIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKLS19Ci0tCi0tIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCQkJCVwKLS1kbyB7CQkJCQkJCQlcCi0tICBpZiAoeXlkZWJ1ZykJCQkJCQkJXAotLSAgICB5eV9zdGFja19wcmludCAoKEJvdHRvbSksIChUb3ApKTsJCQkJXAotLX0gd2hpbGUgKFlZSUQgKDApKQotLQotLQotLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotLXwgUmVwb3J0IHRoYXQgdGhlIFlZUlVMRSBpcyBnb2luZyB0byBiZSByZWR1Y2VkLiAgfAotLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLQotLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotLXN0YXRpYyB2b2lkCi0teXlfcmVkdWNlX3ByaW50IChZWVNUWVBFICp5eXZzcCwgaW50IHl5cnVsZSkKLS0jZWxzZQotLXN0YXRpYyB2b2lkCi0teXlfcmVkdWNlX3ByaW50ICh5eXZzcCwgeXlydWxlKQotLSAgICBZWVNUWVBFICp5eXZzcDsKLS0gICAgaW50IHl5cnVsZTsKLS0jZW5kaWYKLS17Ci0tICBpbnQgeXlucmhzID0geXlyMlt5eXJ1bGVdOwotLSAgaW50IHl5aTsKLS0gIHVuc2lnbmVkIGxvbmcgaW50IHl5bG5vID0geXlybGluZVt5eXJ1bGVdOwotLSAgWVlGUFJJTlRGIChzdGRlcnIsICJSZWR1Y2luZyBzdGFjayBieSBydWxlICVkIChsaW5lICVsdSk6XG4iLAotLQkgICAgIHl5cnVsZSAtIDEsIHl5bG5vKTsKLS0gIC8qIFRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQuICAqLwotLSAgZm9yICh5eWkgPSAwOyB5eWkgPCB5eW5yaHM7IHl5aSsrKQotLSAgICB7Ci0tICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgICAkJWQgPSAiLCB5eWkgKyAxKTsKLS0gICAgICB5eV9zeW1ib2xfcHJpbnQgKHN0ZGVyciwgeXlyaHNbeXlwcmhzW3l5cnVsZV0gKyB5eWldLAotLQkJICAgICAgICYoeXl2c3BbKHl5aSArIDEpIC0gKHl5bnJocyldKQotLQkJICAgICAgIAkJICAgICAgICk7Ci0tICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwotLSAgICB9Ci0tfQotLQotLSMgZGVmaW5lIFlZX1JFRFVDRV9QUklOVChSdWxlKQkJXAotLWRvIHsJCQkJCVwKLS0gIGlmICh5eWRlYnVnKQkJCQlcCi0tICAgIHl5X3JlZHVjZV9wcmludCAoeXl2c3AsIFJ1bGUpOyBcCi0tfSB3aGlsZSAoWVlJRCAoMCkpCi0tCi0tLyogTm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZS4gIEl0IGlzIGxlZnQgdW5pbml0aWFsaXplZCBzbyB0aGF0Ci0tICAgbXVsdGlwbGUgcGFyc2VycyBjYW4gY29leGlzdC4gICovCi0taW50IHl5ZGVidWc7Ci0tI2Vsc2UgLyogIVlZREVCVUcgKi8KLS0jIGRlZmluZSBZWURQUklOVEYoQXJncykKLS0jIGRlZmluZSBZWV9TWU1CT0xfUFJJTlQoVGl0bGUsIFR5cGUsIFZhbHVlLCBMb2NhdGlvbikKLS0jIGRlZmluZSBZWV9TVEFDS19QUklOVChCb3R0b20sIFRvcCkKLS0jIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkKLS0jZW5kaWYgLyogIVlZREVCVUcgKi8KLS0KLS0KLS0vKiBZWUlOSVRERVBUSCAtLSBpbml0aWFsIHNpemUgb2YgdGhlIHBhcnNlcidzIHN0YWNrcy4gICovCi0tI2lmbmRlZglZWUlOSVRERVBUSAotLSMgZGVmaW5lIFlZSU5JVERFUFRIIDIwMAotLSNlbmRpZgotLQotLS8qIFlZTUFYREVQVEggLS0gbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8gKGVmZmVjdGl2ZSBvbmx5Ci0tICAgaWYgdGhlIGJ1aWx0LWluIHN0YWNrIGV4dGVuc2lvbiBtZXRob2QgaXMgdXNlZCkuCi0tCi0tICAgRG8gbm90IG1ha2UgdGhpcyB2YWx1ZSB0b28gbGFyZ2U7IHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgaWYKLS0gICBZWVNUQUNLX0FMTE9DX01BWElNVU0gPCBZWVNUQUNLX0JZVEVTIChZWU1BWERFUFRIKQotLSAgIGV2YWx1YXRlZCB3aXRoIGluZmluaXRlLXByZWNpc2lvbiBpbnRlZ2VyIGFyaXRobWV0aWMuICAqLwotLQotLSNpZm5kZWYgWVlNQVhERVBUSAotLSMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKLS0jZW5kaWYKLS0KLS0MCi0tCi0tI2lmIFlZRVJST1JfVkVSQk9TRQotLQotLSMgaWZuZGVmIHl5c3RybGVuCi0tIyAgaWYgZGVmaW5lZCBfX0dMSUJDX18gJiYgZGVmaW5lZCBfU1RSSU5HX0gKLS0jICAgZGVmaW5lIHl5c3RybGVuIHN0cmxlbgotLSMgIGVsc2UKLS0vKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiBZWVNUUi4gICovCi0tI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0tICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi0tc3RhdGljIFlZU0laRV9UCi0teXlzdHJsZW4gKGNvbnN0IGNoYXIgKnl5c3RyKQotLSNlbHNlCi0tc3RhdGljIFlZU0laRV9UCi0teXlzdHJsZW4gKHl5c3RyKQotLSAgICBjb25zdCBjaGFyICp5eXN0cjsKLS0jZW5kaWYKLS17Ci0tICBZWVNJWkVfVCB5eWxlbjsKLS0gIGZvciAoeXlsZW4gPSAwOyB5eXN0clt5eWxlbl07IHl5bGVuKyspCi0tICAgIGNvbnRpbnVlOwotLSAgcmV0dXJuIHl5bGVuOwotLX0KLS0jICBlbmRpZgotLSMgZW5kaWYKLS0KLS0jIGlmbmRlZiB5eXN0cGNweQotLSMgIGlmIGRlZmluZWQgX19HTElCQ19fICYmIGRlZmluZWQgX1NUUklOR19IICYmIGRlZmluZWQgX0dOVV9TT1VSQ0UKLS0jICAgZGVmaW5lIHl5c3RwY3B5IHN0cGNweQotLSMgIGVsc2UKLS0vKiBDb3B5IFlZU1JDIHRvIFlZREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyAnXDAnIGluCi0tICAgWVlERVNULiAgKi8KLS0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS1zdGF0aWMgY2hhciAqCi0teXlzdHBjcHkgKGNoYXIgKnl5ZGVzdCwgY29uc3QgY2hhciAqeXlzcmMpCi0tI2Vsc2UKLS1zdGF0aWMgY2hhciAqCi0teXlzdHBjcHkgKHl5ZGVzdCwgeXlzcmMpCi0tICAgIGNoYXIgKnl5ZGVzdDsKLS0gICAgY29uc3QgY2hhciAqeXlzcmM7Ci0tI2VuZGlmCi0tewotLSAgY2hhciAqeXlkID0geXlkZXN0OwotLSAgY29uc3QgY2hhciAqeXlzID0geXlzcmM7Ci0tCi0tICB3aGlsZSAoKCp5eWQrKyA9ICp5eXMrKykgIT0gJ1wwJykKLS0gICAgY29udGludWU7Ci0tCi0tICByZXR1cm4geXlkIC0gMTsKLS19Ci0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tCi0tIyBpZm5kZWYgeXl0bmFtZXJyCi0tLyogQ29weSB0byBZWVJFUyB0aGUgY29udGVudHMgb2YgWVlTVFIgYWZ0ZXIgc3RyaXBwaW5nIGF3YXkgdW5uZWNlc3NhcnkKLS0gICBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzLCBzbyB0aGF0IGl0J3Mgc3VpdGFibGUgZm9yIHl5ZXJyb3IuICBUaGUKLS0gICBoZXVyaXN0aWMgaXMgdGhhdCBkb3VibGUtcXVvdGluZyBpcyB1bm5lY2Vzc2FyeSB1bmxlc3MgdGhlIHN0cmluZwotLSAgIGNvbnRhaW5zIGFuIGFwb3N0cm9waGUsIGEgY29tbWEsIG9yIGJhY2tzbGFzaCAob3RoZXIgdGhhbgotLSAgIGJhY2tzbGFzaC1iYWNrc2xhc2gpLiAgWVlTVFIgaXMgdGFrZW4gZnJvbSB5eXRuYW1lLiAgSWYgWVlSRVMgaXMKLS0gICBudWxsLCBkbyBub3QgY29weTsgaW5zdGVhZCwgcmV0dXJuIHRoZSBsZW5ndGggb2Ygd2hhdCB0aGUgcmVzdWx0Ci0tICAgd291bGQgaGF2ZSBiZWVuLiAgKi8KLS1zdGF0aWMgWVlTSVpFX1QKLS15eXRuYW1lcnIgKGNoYXIgKnl5cmVzLCBjb25zdCBjaGFyICp5eXN0cikKLS17Ci0tICBpZiAoKnl5c3RyID09ICciJykKLS0gICAgewotLSAgICAgIFlZU0laRV9UIHl5biA9IDA7Ci0tICAgICAgY2hhciBjb25zdCAqeXlwID0geXlzdHI7Ci0tCi0tICAgICAgZm9yICg7OykKLS0Jc3dpdGNoICgqKyt5eXApCi0tCSAgewotLQkgIGNhc2UgJ1wnJzoKLS0JICBjYXNlICcsJzoKLS0JICAgIGdvdG8gZG9fbm90X3N0cmlwX3F1b3RlczsKLS0KLS0JICBjYXNlICdcXCc6Ci0tCSAgICBpZiAoKisreXlwICE9ICdcXCcpCi0tCSAgICAgIGdvdG8gZG9fbm90X3N0cmlwX3F1b3RlczsKLS0JICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0tCSAgZGVmYXVsdDoKLS0JICAgIGlmICh5eXJlcykKLS0JICAgICAgeXlyZXNbeXluXSA9ICp5eXA7Ci0tCSAgICB5eW4rKzsKLS0JICAgIGJyZWFrOwotLQotLQkgIGNhc2UgJyInOgotLQkgICAgaWYgKHl5cmVzKQotLQkgICAgICB5eXJlc1t5eW5dID0gJ1wwJzsKLS0JICAgIHJldHVybiB5eW47Ci0tCSAgfQotLSAgICBkb19ub3Rfc3RyaXBfcXVvdGVzOiA7Ci0tICAgIH0KLS0KLS0gIGlmICghIHl5cmVzKQotLSAgICByZXR1cm4geXlzdHJsZW4gKHl5c3RyKTsKLS0KLS0gIHJldHVybiB5eXN0cGNweSAoeXlyZXMsIHl5c3RyKSAtIHl5cmVzOwotLX0KLS0jIGVuZGlmCi0tCi0tLyogQ29weSBpbnRvIFlZUkVTVUxUIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIHVuZXhwZWN0ZWQgdG9rZW4KLS0gICBZWUNIQVIgd2hpbGUgaW4gc3RhdGUgWVlTVEFURS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCwKLS0gICBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bGwgYnl0ZS4gIElmIFlZUkVTVUxUIGlzIG51bGwsIGRvIG5vdAotLSAgIGNvcHkgYW55dGhpbmc7IGp1c3QgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZQotLSAgIGNvcGllZC4gIEFzIGEgc3BlY2lhbCBjYXNlLCByZXR1cm4gMCBpZiBhbiBvcmRpbmFyeSAic3ludGF4IGVycm9yIgotLSAgIG1lc3NhZ2Ugd2lsbCBkby4gIFJldHVybiBZWVNJWkVfTUFYSU1VTSBpZiBvdmVyZmxvdyBvY2N1cnMgZHVyaW5nCi0tICAgc2l6ZSBjYWxjdWxhdGlvbi4gICovCi0tc3RhdGljIFlZU0laRV9UCi0teXlzeW50YXhfZXJyb3IgKGNoYXIgKnl5cmVzdWx0LCBpbnQgeXlzdGF0ZSwgaW50IHl5Y2hhcikKLS17Ci0tICBpbnQgeXluID0geXlwYWN0W3l5c3RhdGVdOwotLQotLSAgaWYgKCEgKFlZUEFDVF9OSU5GIDwgeXluICYmIHl5biA8PSBZWUxBU1QpKQotLSAgICByZXR1cm4gMDsKLS0gIGVsc2UKLS0gICAgewotLSAgICAgIGludCB5eXR5cGUgPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKLS0gICAgICBZWVNJWkVfVCB5eXNpemUwID0geXl0bmFtZXJyICgwLCB5eXRuYW1lW3l5dHlwZV0pOwotLSAgICAgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c2l6ZTA7Ci0tICAgICAgWVlTSVpFX1QgeXlzaXplMTsKLS0gICAgICBpbnQgeXlzaXplX292ZXJmbG93ID0gMDsKLS0gICAgICBlbnVtIHsgWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSA9IDUgfTsKLS0gICAgICBjaGFyIGNvbnN0ICp5eWFyZ1tZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNXTsKLS0gICAgICBpbnQgeXl4OwotLQotLSMgaWYgMAotLSAgICAgIC8qIFRoaXMgaXMgc28geGdldHRleHQgc2VlcyB0aGUgdHJhbnNsYXRhYmxlIGZvcm1hdHMgdGhhdCBhcmUKLS0JIGNvbnN0cnVjdGVkIG9uIHRoZSBmbHkuICAqLwotLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIik7Ci0tICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyIpOwotLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMiKTsKLS0gICAgICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIik7Ci0tICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyBvciAlcyBvciAlcyIpOwotLSMgZW5kaWYKLS0gICAgICBjaGFyICp5eWZtdDsKLS0gICAgICBjaGFyIGNvbnN0ICp5eWY7Ci0tICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXl1bmV4cGVjdGVkW10gPSAic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIjsKLS0gICAgICBzdGF0aWMgY2hhciBjb25zdCB5eWV4cGVjdGluZ1tdID0gIiwgZXhwZWN0aW5nICVzIjsKLS0gICAgICBzdGF0aWMgY2hhciBjb25zdCB5eW9yW10gPSAiIG9yICVzIjsKLS0gICAgICBjaGFyIHl5Zm9ybWF0W3NpemVvZiB5eXVuZXhwZWN0ZWQKLS0JCSAgICArIHNpemVvZiB5eWV4cGVjdGluZyAtIDEKLS0JCSAgICArICgoWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSAtIDIpCi0tCQkgICAgICAgKiAoc2l6ZW9mIHl5b3IgLSAxKSldOwotLSAgICAgIGNoYXIgY29uc3QgKnl5cHJlZml4ID0geXlleHBlY3Rpbmc7Ci0tCi0tICAgICAgLyogU3RhcnQgWVlYIGF0IC1ZWU4gaWYgbmVnYXRpdmUgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbgotLQkgWVlDSEVDSy4gICovCi0tICAgICAgaW50IHl5eGJlZ2luID0geXluIDwgMCA/IC15eW4gOiAwOwotLQotLSAgICAgIC8qIFN0YXkgd2l0aGluIGJvdW5kcyBvZiBib3RoIHl5Y2hlY2sgYW5kIHl5dG5hbWUuICAqLwotLSAgICAgIGludCB5eWNoZWNrbGltID0gWVlMQVNUIC0geXluICsgMTsKLS0gICAgICBpbnQgeXl4ZW5kID0geXljaGVja2xpbSA8IFlZTlRPS0VOUyA/IHl5Y2hlY2tsaW0gOiBZWU5UT0tFTlM7Ci0tICAgICAgaW50IHl5Y291bnQgPSAxOwotLQotLSAgICAgIHl5YXJnWzBdID0geXl0bmFtZVt5eXR5cGVdOwotLSAgICAgIHl5Zm10ID0geXlzdHBjcHkgKHl5Zm9ybWF0LCB5eXVuZXhwZWN0ZWQpOwotLQotLSAgICAgIGZvciAoeXl4ID0geXl4YmVnaW47IHl5eCA8IHl5eGVuZDsgKyt5eXgpCi0tCWlmICh5eWNoZWNrW3l5eCArIHl5bl0gPT0geXl4ICYmIHl5eCAhPSBZWVRFUlJPUikKLS0JICB7Ci0tCSAgICBpZiAoeXljb3VudCA9PSBZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNKQotLQkgICAgICB7Ci0tCQl5eWNvdW50ID0gMTsKLS0JCXl5c2l6ZSA9IHl5c2l6ZTA7Ci0tCQl5eWZvcm1hdFtzaXplb2YgeXl1bmV4cGVjdGVkIC0gMV0gPSAnXDAnOwotLQkJYnJlYWs7Ci0tCSAgICAgIH0KLS0JICAgIHl5YXJnW3l5Y291bnQrK10gPSB5eXRuYW1lW3l5eF07Ci0tCSAgICB5eXNpemUxID0geXlzaXplICsgeXl0bmFtZXJyICgwLCB5eXRuYW1lW3l5eF0pOwotLQkgICAgeXlzaXplX292ZXJmbG93IHw9ICh5eXNpemUxIDwgeXlzaXplKTsKLS0JICAgIHl5c2l6ZSA9IHl5c2l6ZTE7Ci0tCSAgICB5eWZtdCA9IHl5c3RwY3B5ICh5eWZtdCwgeXlwcmVmaXgpOwotLQkgICAgeXlwcmVmaXggPSB5eW9yOwotLQkgIH0KLS0KLS0gICAgICB5eWYgPSBZWV8oeXlmb3JtYXQpOwotLSAgICAgIHl5c2l6ZTEgPSB5eXNpemUgKyB5eXN0cmxlbiAoeXlmKTsKLS0gICAgICB5eXNpemVfb3ZlcmZsb3cgfD0gKHl5c2l6ZTEgPCB5eXNpemUpOwotLSAgICAgIHl5c2l6ZSA9IHl5c2l6ZTE7Ci0tCi0tICAgICAgaWYgKHl5c2l6ZV9vdmVyZmxvdykKLS0JcmV0dXJuIFlZU0laRV9NQVhJTVVNOwotLQotLSAgICAgIGlmICh5eXJlc3VsdCkKLS0JewotLQkgIC8qIEF2b2lkIHNwcmludGYsIGFzIHRoYXQgaW5mcmluZ2VzIG9uIHRoZSB1c2VyJ3MgbmFtZSBzcGFjZS4KLS0JICAgICBEb24ndCBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvciBldmVuIGlmIHRoZSB0cmFuc2xhdGlvbgotLQkgICAgIHByb2R1Y2VkIGEgc3RyaW5nIHdpdGggdGhlIHdyb25nIG51bWJlciBvZiAiJXMicy4gICovCi0tCSAgY2hhciAqeXlwID0geXlyZXN1bHQ7Ci0tCSAgaW50IHl5aSA9IDA7Ci0tCSAgd2hpbGUgKCgqeXlwID0gKnl5ZikgIT0gJ1wwJykKLS0JICAgIHsKLS0JICAgICAgaWYgKCp5eXAgPT0gJyUnICYmIHl5ZlsxXSA9PSAncycgJiYgeXlpIDwgeXljb3VudCkKLS0JCXsKLS0JCSAgeXlwICs9IHl5dG5hbWVyciAoeXlwLCB5eWFyZ1t5eWkrK10pOwotLQkJICB5eWYgKz0gMjsKLS0JCX0KLS0JICAgICAgZWxzZQotLQkJewotLQkJICB5eXArKzsKLS0JCSAgeXlmKys7Ci0tCQl9Ci0tCSAgICB9Ci0tCX0KLS0gICAgICByZXR1cm4geXlzaXplOwotLSAgICB9Ci0tfQotLSNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KLS0MCi0tCi0tLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLS18IFJlbGVhc2UgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIHRoaXMgc3ltYm9sLiAgfAotLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0tCi0tLypBUkdTVVNFRCovCi0tI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0tICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi0tc3RhdGljIHZvaWQKLS15eWRlc3RydWN0IChjb25zdCBjaGFyICp5eW1zZywgaW50IHl5dHlwZSwgWVlTVFlQRSAqeXl2YWx1ZXApCi0tI2Vsc2UKLS1zdGF0aWMgdm9pZAotLXl5ZGVzdHJ1Y3QgKHl5bXNnLCB5eXR5cGUsIHl5dmFsdWVwKQotLSAgICBjb25zdCBjaGFyICp5eW1zZzsKLS0gICAgaW50IHl5dHlwZTsKLS0gICAgWVlTVFlQRSAqeXl2YWx1ZXA7Ci0tI2VuZGlmCi0tewotLSAgWVlVU0UgKHl5dmFsdWVwKTsKLS0KLS0gIGlmICgheXltc2cpCi0tICAgIHl5bXNnID0gIkRlbGV0aW5nIjsKLS0gIFlZX1NZTUJPTF9QUklOVCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wKTsKLS0KLS0gIHN3aXRjaCAoeXl0eXBlKQotLSAgICB7Ci0tCi0tICAgICAgZGVmYXVsdDoKLS0JYnJlYWs7Ci0tICAgIH0KLS19Ci0tCi0tLyogUHJldmVudCB3YXJuaW5ncyBmcm9tIC1XbWlzc2luZy1wcm90b3R5cGVzLiAgKi8KLS0jaWZkZWYgWVlQQVJTRV9QQVJBTQotLSNpZiBkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19jcGx1c3BsdXMKLS1pbnQgeXlwYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSk7Ci0tI2Vsc2UKLS1pbnQgeXlwYXJzZSAoKTsKLS0jZW5kaWYKLS0jZWxzZSAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KLS0jaWYgZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCi0taW50IHl5cGFyc2UgKHZvaWQpOwotLSNlbHNlCi0taW50IHl5cGFyc2UgKCk7Ci0tI2VuZGlmCi0tI2VuZGlmIC8qICEgWVlQQVJTRV9QQVJBTSAqLwotLQotLQotLQotLQotLQotLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLS18IHl5cGFyc2Ugb3IgeXlwdXNoX3BhcnNlLiAgfAotLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS0KLS0jaWZkZWYgWVlQQVJTRV9QQVJBTQotLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotLWludAotLXl5cGFyc2UgKHZvaWQgKllZUEFSU0VfUEFSQU0pCi0tI2Vsc2UKLS1pbnQKLS15eXBhcnNlIChZWVBBUlNFX1BBUkFNKQotLSAgICB2b2lkICpZWVBBUlNFX1BBUkFNOwotLSNlbmRpZgotLSNlbHNlIC8qICEgWVlQQVJTRV9QQVJBTSAqLwotLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotLWludAotLXl5cGFyc2UgKHZvaWQpCi0tI2Vsc2UKLS1pbnQKLS15eXBhcnNlICgpCi0tCi0tI2VuZGlmCi0tI2VuZGlmCi0tewotLS8qIFRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8KLS1pbnQgeXljaGFyOwotLQotLS8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUgbG9va2FoZWFkIHN5bWJvbC4gICovCi0tWVlTVFlQRSB5eWx2YWw7Ci0tCi0tICAgIC8qIE51bWJlciBvZiBzeW50YXggZXJyb3JzIHNvIGZhci4gICovCi0tICAgIGludCB5eW5lcnJzOwotLQotLSAgICBpbnQgeXlzdGF0ZTsKLS0gICAgLyogTnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZC4gICovCi0tICAgIGludCB5eWVycnN0YXR1czsKLS0KLS0gICAgLyogVGhlIHN0YWNrcyBhbmQgdGhlaXIgdG9vbHM6Ci0tICAgICAgIGB5eXNzJzogcmVsYXRlZCB0byBzdGF0ZXMuCi0tICAgICAgIGB5eXZzJzogcmVsYXRlZCB0byBzZW1hbnRpYyB2YWx1ZXMuCi0tCi0tICAgICAgIFJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycywgdG8gYWxsb3cgeXlvdmVyZmxvdwotLSAgICAgICB0byByZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlLiAgKi8KLS0KLS0gICAgLyogVGhlIHN0YXRlIHN0YWNrLiAgKi8KLS0gICAgeXl0eXBlX2ludDE2IHl5c3NhW1lZSU5JVERFUFRIXTsKLS0gICAgeXl0eXBlX2ludDE2ICp5eXNzOwotLSAgICB5eXR5cGVfaW50MTYgKnl5c3NwOwotLQotLSAgICAvKiBUaGUgc2VtYW50aWMgdmFsdWUgc3RhY2suICAqLwotLSAgICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsKLS0gICAgWVlTVFlQRSAqeXl2czsKLS0gICAgWVlTVFlQRSAqeXl2c3A7Ci0tCi0tICAgIFlZU0laRV9UIHl5c3RhY2tzaXplOwotLQotLSAgaW50IHl5bjsKLS0gIGludCB5eXJlc3VsdDsKLS0gIC8qIExvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyLiAgKi8KLS0gIGludCB5eXRva2VuOwotLSAgLyogVGhlIHZhcmlhYmxlcyB1c2VkIHRvIHJldHVybiBzZW1hbnRpYyB2YWx1ZSBhbmQgbG9jYXRpb24gZnJvbSB0aGUKLS0gICAgIGFjdGlvbiByb3V0aW5lcy4gICovCi0tICBZWVNUWVBFIHl5dmFsOwotLQotLSNpZiBZWUVSUk9SX1ZFUkJPU0UKLS0gIC8qIEJ1ZmZlciBmb3IgZXJyb3IgbWVzc2FnZXMsIGFuZCBpdHMgYWxsb2NhdGVkIHNpemUuICAqLwotLSAgY2hhciB5eW1zZ2J1ZlsxMjhdOwotLSAgY2hhciAqeXltc2cgPSB5eW1zZ2J1ZjsKLS0gIFlZU0laRV9UIHl5bXNnX2FsbG9jID0gc2l6ZW9mIHl5bXNnYnVmOwotLSNlbmRpZgotLQotLSNkZWZpbmUgWVlQT1BTVEFDSyhOKSAgICh5eXZzcCAtPSAoTiksIHl5c3NwIC09IChOKSkKLS0KLS0gIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBvbiB0aGUgUkhTIG9mIHRoZSByZWR1Y2VkIHJ1bGUuCi0tICAgICBLZWVwIHRvIHplcm8gd2hlbiBubyBzeW1ib2wgc2hvdWxkIGJlIHBvcHBlZC4gICovCi0tICBpbnQgeXlsZW4gPSAwOwotLQotLSAgeXl0b2tlbiA9IDA7Ci0tICB5eXNzID0geXlzc2E7Ci0tICB5eXZzID0geXl2c2E7Ci0tICB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOwotLQotLSAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpKTsKLS0KLS0gIHl5c3RhdGUgPSAwOwotLSAgeXllcnJzdGF0dXMgPSAwOwotLSAgeXluZXJycyA9IDA7Ci0tICB5eWNoYXIgPSBZWUVNUFRZOyAvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLwotLQotLSAgLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVycy4KLS0gICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjawotLSAgICAgc28gdGhhdCB0aGV5IHN0YXkgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHN0YXRlIHN0YWNrLgotLSAgICAgVGhlIHdhc3RlZCBlbGVtZW50cyBhcmUgbmV2ZXIgaW5pdGlhbGl6ZWQuICAqLwotLSAgeXlzc3AgPSB5eXNzOwotLSAgeXl2c3AgPSB5eXZzOwotLQotLSAgZ290byB5eXNldHN0YXRlOwotLQotLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotLXwgeXluZXdzdGF0ZSAtLSBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiB5eXN0YXRlLiAgfAotLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLSB5eW5ld3N0YXRlOgotLSAgLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKLS0gICAgIGhhdmUganVzdCBiZWVuIHB1c2hlZC4gIFNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuICAqLwotLSAgeXlzc3ArKzsKLS0KLS0geXlzZXRzdGF0ZToKLS0gICp5eXNzcCA9IHl5c3RhdGU7Ci0tCi0tICBpZiAoeXlzcyArIHl5c3RhY2tzaXplIC0gMSA8PSB5eXNzcCkKLS0gICAgewotLSAgICAgIC8qIEdldCB0aGUgY3VycmVudCB1c2VkIHNpemUgb2YgdGhlIHRocmVlIHN0YWNrcywgaW4gZWxlbWVudHMuICAqLwotLSAgICAgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c3NwIC0geXlzcyArIDE7Ci0tCi0tI2lmZGVmIHl5b3ZlcmZsb3cKLS0gICAgICB7Ci0tCS8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byByZWFsbG9jYXRlIHRoZSBzdGFjay4gIFVzZSBjb3BpZXMgb2YKLS0JICAgdGhlc2Ugc28gdGhhdCB0aGUgJidzIGRvbid0IGZvcmNlIHRoZSByZWFsIG9uZXMgaW50bwotLQkgICBtZW1vcnkuICAqLwotLQlZWVNUWVBFICp5eXZzMSA9IHl5dnM7Ci0tCXl5dHlwZV9pbnQxNiAqeXlzczEgPSB5eXNzOwotLQotLQkvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZiB0aGUKLS0JICAgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICBUaGlzIHVzZWQgdG8gYmUgYQotLQkgICBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsIGJ1dCB0aGF0IG1pZ2h0Ci0tCSAgIGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLwotLQl5eW92ZXJmbG93IChZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSwKLS0JCSAgICAmeXlzczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKLS0JCSAgICAmeXl2czEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLS0JCSAgICAmeXlzdGFja3NpemUpOwotLQotLQl5eXNzID0geXlzczE7Ci0tCXl5dnMgPSB5eXZzMTsKLS0gICAgICB9Ci0tI2Vsc2UgLyogbm8geXlvdmVyZmxvdyAqLwotLSMgaWZuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKLS0gICAgICBnb3RvIHl5ZXhoYXVzdGVkbGFiOwotLSMgZWxzZQotLSAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLwotLSAgICAgIGlmIChZWU1BWERFUFRIIDw9IHl5c3RhY2tzaXplKQotLQlnb3RvIHl5ZXhoYXVzdGVkbGFiOwotLSAgICAgIHl5c3RhY2tzaXplICo9IDI7Ci0tICAgICAgaWYgKFlZTUFYREVQVEggPCB5eXN0YWNrc2l6ZSkKLS0JeXlzdGFja3NpemUgPSBZWU1BWERFUFRIOwotLQotLSAgICAgIHsKLS0JeXl0eXBlX2ludDE2ICp5eXNzMSA9IHl5c3M7Ci0tCXVuaW9uIHl5YWxsb2MgKnl5cHRyID0KLS0JICAodW5pb24geXlhbGxvYyAqKSBZWVNUQUNLX0FMTE9DIChZWVNUQUNLX0JZVEVTICh5eXN0YWNrc2l6ZSkpOwotLQlpZiAoISB5eXB0cikKLS0JICBnb3RvIHl5ZXhoYXVzdGVkbGFiOwotLQlZWVNUQUNLX1JFTE9DQVRFICh5eXNzX2FsbG9jLCB5eXNzKTsKLS0JWVlTVEFDS19SRUxPQ0FURSAoeXl2c19hbGxvYywgeXl2cyk7Ci0tIyAgdW5kZWYgWVlTVEFDS19SRUxPQ0FURQotLQlpZiAoeXlzczEgIT0geXlzc2EpCi0tCSAgWVlTVEFDS19GUkVFICh5eXNzMSk7Ci0tICAgICAgfQotLSMgZW5kaWYKLS0jZW5kaWYgLyogbm8geXlvdmVyZmxvdyAqLwotLQotLSAgICAgIHl5c3NwID0geXlzcyArIHl5c2l6ZSAtIDE7Ci0tICAgICAgeXl2c3AgPSB5eXZzICsgeXlzaXplIC0gMTsKLS0KLS0gICAgICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlbHVcbiIsCi0tCQkgICh1bnNpZ25lZCBsb25nIGludCkgeXlzdGFja3NpemUpKTsKLS0KLS0gICAgICBpZiAoeXlzcyArIHl5c3RhY2tzaXplIC0gMSA8PSB5eXNzcCkKLS0JWVlBQk9SVDsKLS0gICAgfQotLQotLSAgWVlEUFJJTlRGICgoc3RkZXJyLCAiRW50ZXJpbmcgc3RhdGUgJWRcbiIsIHl5c3RhdGUpKTsKLS0KLS0gIGlmICh5eXN0YXRlID09IFlZRklOQUwpCi0tICAgIFlZQUNDRVBUOwotLQotLSAgZ290byB5eWJhY2t1cDsKLS0KLS0vKi0tLS0tLS0tLS0tLgotLXwgeXliYWNrdXAuICB8Ci0tYC0tLS0tLS0tLS0tKi8KLS15eWJhY2t1cDoKLS0KLS0gIC8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICBSZWFkIGEKLS0gICAgIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCi0tCi0tICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KLS0gIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLS0gIGlmICh5eW4gPT0gWVlQQUNUX05JTkYpCi0tICAgIGdvdG8geXlkZWZhdWx0OwotLQotLSAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2thaGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLS0KLS0gIC8qIFlZQ0hBUiBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRiBvciBhIHZhbGlkIGxvb2thaGVhZCBzeW1ib2wuICAqLwotLSAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQotLSAgICB7Ci0tICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKSk7Ci0tICAgICAgeXljaGFyID0gWVlMRVg7Ci0tICAgIH0KLS0KLS0gIGlmICh5eWNoYXIgPD0gWVlFT0YpCi0tICAgIHsKLS0gICAgICB5eWNoYXIgPSB5eXRva2VuID0gWVlFT0Y7Ci0tICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpKTsKLS0gICAgfQotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgeXl0b2tlbiA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwotLSAgICAgIFlZX1NZTUJPTF9QUklOVCAoIk5leHQgdG9rZW4gaXMiLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKLS0gICAgfQotLQotLSAgLyogSWYgdGhlIHByb3BlciBhY3Rpb24gb24gc2VlaW5nIHRva2VuIFlZVE9LRU4gaXMgdG8gcmVkdWNlIG9yIHRvCi0tICAgICBkZXRlY3QgYW4gZXJyb3IsIHRha2UgdGhhdCBhY3Rpb24uICAqLwotLSAgeXluICs9IHl5dG9rZW47Ci0tICBpZiAoeXluIDwgMCB8fCBZWUxBU1QgPCB5eW4gfHwgeXljaGVja1t5eW5dICE9IHl5dG9rZW4pCi0tICAgIGdvdG8geXlkZWZhdWx0OwotLSAgeXluID0geXl0YWJsZVt5eW5dOwotLSAgaWYgKHl5biA8PSAwKQotLSAgICB7Ci0tICAgICAgaWYgKHl5biA9PSAwIHx8IHl5biA9PSBZWVRBQkxFX05JTkYpCi0tCWdvdG8geXllcnJsYWI7Ci0tICAgICAgeXluID0gLXl5bjsKLS0gICAgICBnb3RvIHl5cmVkdWNlOwotLSAgICB9Ci0tCi0tICAvKiBDb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yCi0tICAgICBzdGF0dXMuICAqLwotLSAgaWYgKHl5ZXJyc3RhdHVzKQotLSAgICB5eWVycnN0YXR1cy0tOwotLQotLSAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCi0tICBZWV9TWU1CT0xfUFJJTlQgKCJTaGlmdGluZyIsIHl5dG9rZW4sICZ5eWx2YWwsICZ5eWxsb2MpOwotLQotLSAgLyogRGlzY2FyZCB0aGUgc2hpZnRlZCB0b2tlbi4gICovCi0tICB5eWNoYXIgPSBZWUVNUFRZOwotLQotLSAgeXlzdGF0ZSA9IHl5bjsKLS0gICorK3l5dnNwID0geXlsdmFsOwotLQotLSAgZ290byB5eW5ld3N0YXRlOwotLQotLQotLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0tfCB5eWRlZmF1bHQgLS0gZG8gdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZS4gIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLXl5ZGVmYXVsdDoKLS0gIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOwotLSAgaWYgKHl5biA9PSAwKQotLSAgICBnb3RvIHl5ZXJybGFiOwotLSAgZ290byB5eXJlZHVjZTsKLS0KLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotLXwgeXlyZWR1Y2UgLS0gRG8gYSByZWR1Y3Rpb24uICB8Ci0tYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS15eXJlZHVjZToKLS0gIC8qIHl5biBpcyB0aGUgbnVtYmVyIG9mIGEgcnVsZSB0byByZWR1Y2Ugd2l0aC4gICovCi0tICB5eWxlbiA9IHl5cjJbeXluXTsKLS0KLS0gIC8qIElmIFlZTEVOIGlzIG5vbnplcm8sIGltcGxlbWVudCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYWN0aW9uOgotLSAgICAgYCQkID0gJDEnLgotLQotLSAgICAgT3RoZXJ3aXNlLCB0aGUgZm9sbG93aW5nIGxpbmUgc2V0cyBZWVZBTCB0byBnYXJiYWdlLgotLSAgICAgVGhpcyBiZWhhdmlvciBpcyB1bmRvY3VtZW50ZWQgYW5kIEJpc29uCi0tICAgICB1c2VycyBzaG91bGQgbm90IHJlbHkgdXBvbiBpdC4gIEFzc2lnbmluZyB0byBZWVZBTAotLSAgICAgdW5jb25kaXRpb25hbGx5IG1ha2VzIHRoZSBwYXJzZXIgYSBiaXQgc21hbGxlciwgYW5kIGl0IGF2b2lkcyBhCi0tICAgICBHQ0Mgd2FybmluZyB0aGF0IFlZVkFMIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQuICAqLwotLSAgeXl2YWwgPSB5eXZzcFsxLXl5bGVuXTsKLS0KLS0KLS0gIFlZX1JFRFVDRV9QUklOVCAoeXluKTsKLS0gIHN3aXRjaCAoeXluKQotLSAgICB7Ci0tICAgICAgICBjYXNlIDI6Ci0tCi0tLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxNTUgInBsdXJhbC55IgotLSAgICB7Ci0tCSAgICBpZiAoKHl5dnNwWygxKSAtICgxKV0uZXhwKSA9PSBOVUxMKQotLQkgICAgICBZWUFCT1JUOwotLQkgICAgKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5yZXMgPSAoeXl2c3BbKDEpIC0gKDEpXS5leHApOwotLQkgIH0KLS0gICAgYnJlYWs7Ci0tCi0tICBjYXNlIDM6Ci0tCi0tLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxNjMgInBsdXJhbC55IgotLSAgICB7Ci0tCSAgICAoeXl2YWwuZXhwKSA9IG5ld19leHBfMyAocW1vcCwgKHl5dnNwWygxKSAtICg1KV0uZXhwKSwgKHl5dnNwWygzKSAtICg1KV0uZXhwKSwgKHl5dnNwWyg1KSAtICg1KV0uZXhwKSk7Ci0tCSAgfQotLSAgICBicmVhazsKLS0KLS0gIGNhc2UgNDoKLS0KLS0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotLSNsaW5lIDE2NyAicGx1cmFsLnkiCi0tICAgIHsKLS0JICAgICh5eXZhbC5leHApID0gbmV3X2V4cF8yIChsb3IsICh5eXZzcFsoMSkgLSAoMyldLmV4cCksICh5eXZzcFsoMykgLSAoMyldLmV4cCkpOwotLQkgIH0KLS0gICAgYnJlYWs7Ci0tCi0tICBjYXNlIDU6Ci0tCi0tLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxNzEgInBsdXJhbC55IgotLSAgICB7Ci0tCSAgICAoeXl2YWwuZXhwKSA9IG5ld19leHBfMiAobGFuZCwgKHl5dnNwWygxKSAtICgzKV0uZXhwKSwgKHl5dnNwWygzKSAtICgzKV0uZXhwKSk7Ci0tCSAgfQotLSAgICBicmVhazsKLS0KLS0gIGNhc2UgNjoKLS0KLS0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotLSNsaW5lIDE3NSAicGx1cmFsLnkiCi0tICAgIHsKLS0JICAgICh5eXZhbC5leHApID0gbmV3X2V4cF8yICgoeXl2c3BbKDIpIC0gKDMpXS5vcCksICh5eXZzcFsoMSkgLSAoMyldLmV4cCksICh5eXZzcFsoMykgLSAoMyldLmV4cCkpOwotLQkgIH0KLS0gICAgYnJlYWs7Ci0tCi0tICBjYXNlIDc6Ci0tCi0tLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxNzkgInBsdXJhbC55IgotLSAgICB7Ci0tCSAgICAoeXl2YWwuZXhwKSA9IG5ld19leHBfMiAoKHl5dnNwWygyKSAtICgzKV0ub3ApLCAoeXl2c3BbKDEpIC0gKDMpXS5leHApLCAoeXl2c3BbKDMpIC0gKDMpXS5leHApKTsKLS0JICB9Ci0tICAgIGJyZWFrOwotLQotLSAgY2FzZSA4OgotLQotLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0tI2xpbmUgMTgzICJwbHVyYWwueSIKLS0gICAgewotLQkgICAgKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzIgKCh5eXZzcFsoMikgLSAoMyldLm9wKSwgKHl5dnNwWygxKSAtICgzKV0uZXhwKSwgKHl5dnNwWygzKSAtICgzKV0uZXhwKSk7Ci0tCSAgfQotLSAgICBicmVhazsKLS0KLS0gIGNhc2UgOToKLS0KLS0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotLSNsaW5lIDE4NyAicGx1cmFsLnkiCi0tICAgIHsKLS0JICAgICh5eXZhbC5leHApID0gbmV3X2V4cF8yICgoeXl2c3BbKDIpIC0gKDMpXS5vcCksICh5eXZzcFsoMSkgLSAoMyldLmV4cCksICh5eXZzcFsoMykgLSAoMyldLmV4cCkpOwotLQkgIH0KLS0gICAgYnJlYWs7Ci0tCi0tICBjYXNlIDEwOgotLQotLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0tI2xpbmUgMTkxICJwbHVyYWwueSIKLS0gICAgewotLQkgICAgKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzEgKGxub3QsICh5eXZzcFsoMikgLSAoMildLmV4cCkpOwotLQkgIH0KLS0gICAgYnJlYWs7Ci0tCi0tICBjYXNlIDExOgotLQotLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0tI2xpbmUgMTk1ICJwbHVyYWwueSIKLS0gICAgewotLQkgICAgKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzAgKHZhcik7Ci0tCSAgfQotLSAgICBicmVhazsKLS0KLS0gIGNhc2UgMTI6Ci0tCi0tLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxOTkgInBsdXJhbC55IgotLSAgICB7Ci0tCSAgICBpZiAoKCh5eXZhbC5leHApID0gbmV3X2V4cF8wIChudW0pKSAhPSBOVUxMKQotLQkgICAgICAoeXl2YWwuZXhwKS0+dmFsLm51bSA9ICh5eXZzcFsoMSkgLSAoMSldLm51bSk7Ci0tCSAgfQotLSAgICBicmVhazsKLS0KLS0gIGNhc2UgMTM6Ci0tCi0tLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAyMDQgInBsdXJhbC55IgotLSAgICB7Ci0tCSAgICAoeXl2YWwuZXhwKSA9ICh5eXZzcFsoMikgLSAoMyldLmV4cCk7Ci0tCSAgfQotLSAgICBicmVhazsKLS0KLS0KLS0KLS0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotLSNsaW5lIDE1OTIgInBsdXJhbC5jIgotLSAgICAgIGRlZmF1bHQ6IGJyZWFrOwotLSAgICB9Ci0tICBZWV9TWU1CT0xfUFJJTlQgKCItPiAkJCA9IiwgeXlyMVt5eW5dLCAmeXl2YWwsICZ5eWxvYyk7Ci0tCi0tICBZWVBPUFNUQUNLICh5eWxlbik7Ci0tICB5eWxlbiA9IDA7Ci0tICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOwotLQotLSAgKisreXl2c3AgPSB5eXZhbDsKLS0KLS0gIC8qIE5vdyBgc2hpZnQnIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4gIERldGVybWluZSB3aGF0IHN0YXRlCi0tICAgICB0aGF0IGdvZXMgdG8sIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0byBhbmQgdGhlIHJ1bGUKLS0gICAgIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KLS0KLS0gIHl5biA9IHl5cjFbeXluXTsKLS0KLS0gIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRPS0VOU10gKyAqeXlzc3A7Ci0tICBpZiAoMCA8PSB5eXN0YXRlICYmIHl5c3RhdGUgPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXlzdGF0ZV0gPT0gKnl5c3NwKQotLSAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKLS0gIGVsc2UKLS0gICAgeXlzdGF0ZSA9IHl5ZGVmZ290b1t5eW4gLSBZWU5UT0tFTlNdOwotLQotLSAgZ290byB5eW5ld3N0YXRlOwotLQotLQotLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotLXwgeXllcnJsYWIgLS0gaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgfAotLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLXl5ZXJybGFiOgotLSAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCi0tICBpZiAoIXl5ZXJyc3RhdHVzKQotLSAgICB7Ci0tICAgICAgKyt5eW5lcnJzOwotLSNpZiAhIFlZRVJST1JfVkVSQk9TRQotLSAgICAgIHl5ZXJyb3IgKFlZXygic3ludGF4IGVycm9yIikpOwotLSNlbHNlCi0tICAgICAgewotLQlZWVNJWkVfVCB5eXNpemUgPSB5eXN5bnRheF9lcnJvciAoMCwgeXlzdGF0ZSwgeXljaGFyKTsKLS0JaWYgKHl5bXNnX2FsbG9jIDwgeXlzaXplICYmIHl5bXNnX2FsbG9jIDwgWVlTVEFDS19BTExPQ19NQVhJTVVNKQotLQkgIHsKLS0JICAgIFlZU0laRV9UIHl5YWxsb2MgPSAyICogeXlzaXplOwotLQkgICAgaWYgKCEgKHl5c2l6ZSA8PSB5eWFsbG9jICYmIHl5YWxsb2MgPD0gWVlTVEFDS19BTExPQ19NQVhJTVVNKSkKLS0JICAgICAgeXlhbGxvYyA9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTTsKLS0JICAgIGlmICh5eW1zZyAhPSB5eW1zZ2J1ZikKLS0JICAgICAgWVlTVEFDS19GUkVFICh5eW1zZyk7Ci0tCSAgICB5eW1zZyA9IChjaGFyICopIFlZU1RBQ0tfQUxMT0MgKHl5YWxsb2MpOwotLQkgICAgaWYgKHl5bXNnKQotLQkgICAgICB5eW1zZ19hbGxvYyA9IHl5YWxsb2M7Ci0tCSAgICBlbHNlCi0tCSAgICAgIHsKLS0JCXl5bXNnID0geXltc2didWY7Ci0tCQl5eW1zZ19hbGxvYyA9IHNpemVvZiB5eW1zZ2J1ZjsKLS0JICAgICAgfQotLQkgIH0KLS0KLS0JaWYgKDAgPCB5eXNpemUgJiYgeXlzaXplIDw9IHl5bXNnX2FsbG9jKQotLQkgIHsKLS0JICAgICh2b2lkKSB5eXN5bnRheF9lcnJvciAoeXltc2csIHl5c3RhdGUsIHl5Y2hhcik7Ci0tCSAgICB5eWVycm9yICh5eW1zZyk7Ci0tCSAgfQotLQllbHNlCi0tCSAgewotLQkgICAgeXllcnJvciAoWVlfKCJzeW50YXggZXJyb3IiKSk7Ci0tCSAgICBpZiAoeXlzaXplICE9IDApCi0tCSAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7Ci0tCSAgfQotLSAgICAgIH0KLS0jZW5kaWYKLS0gICAgfQotLQotLQotLQotLSAgaWYgKHl5ZXJyc3RhdHVzID09IDMpCi0tICAgIHsKLS0gICAgICAvKiBJZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuCi0tCSBlcnJvciwgZGlzY2FyZCBpdC4gICovCi0tCi0tICAgICAgaWYgKHl5Y2hhciA8PSBZWUVPRikKLS0JewotLQkgIC8qIFJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dC4gICovCi0tCSAgaWYgKHl5Y2hhciA9PSBZWUVPRikKLS0JICAgIFlZQUJPUlQ7Ci0tCX0KLS0gICAgICBlbHNlCi0tCXsKLS0JICB5eWRlc3RydWN0ICgiRXJyb3I6IGRpc2NhcmRpbmciLAotLQkJICAgICAgeXl0b2tlbiwgJnl5bHZhbCk7Ci0tCSAgeXljaGFyID0gWVlFTVBUWTsKLS0JfQotLSAgICB9Ci0tCi0tICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IKLS0gICAgIHRva2VuLiAgKi8KLS0gIGdvdG8geXllcnJsYWIxOwotLQotLQotLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotLXwgeXllcnJvcmxhYiAtLSBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBZWUVSUk9SLiAgfAotLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLXl5ZXJyb3JsYWI6Ci0tCi0tICAvKiBQYWNpZnkgY29tcGlsZXJzIGxpa2UgR0NDIHdoZW4gdGhlIHVzZXIgY29kZSBuZXZlciBpbnZva2VzCi0tICAgICBZWUVSUk9SIGFuZCB0aGUgbGFiZWwgeXllcnJvcmxhYiB0aGVyZWZvcmUgbmV2ZXIgYXBwZWFycyBpbiB1c2VyCi0tICAgICBjb2RlLiAgKi8KLS0gIGlmICgvKkNPTlNUQ09ORCovIDApCi0tICAgICBnb3RvIHl5ZXJyb3JsYWI7Ci0tCi0tICAvKiBEbyBub3QgcmVjbGFpbSB0aGUgc3ltYm9scyBvZiB0aGUgcnVsZSB3aGljaCBhY3Rpb24gdHJpZ2dlcmVkCi0tICAgICB0aGlzIFlZRVJST1IuICAqLwotLSAgWVlQT1BTVEFDSyAoeXlsZW4pOwotLSAgeXlsZW4gPSAwOwotLSAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKLS0gIHl5c3RhdGUgPSAqeXlzc3A7Ci0tICBnb3RvIHl5ZXJybGFiMTsKLS0KLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0tfCB5eWVycmxhYjEgLS0gY29tbW9uIGNvZGUgZm9yIGJvdGggc3ludGF4IGVycm9yIGFuZCBZWUVSUk9SLiAgfAotLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS15eWVycmxhYjE6Ci0tICB5eWVycnN0YXR1cyA9IDM7CS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcy4gICovCi0tCi0tICBmb3IgKDs7KQotLSAgICB7Ci0tICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotLSAgICAgIGlmICh5eW4gIT0gWVlQQUNUX05JTkYpCi0tCXsKLS0JICB5eW4gKz0gWVlURVJST1I7Ci0tCSAgaWYgKDAgPD0geXluICYmIHl5biA8PSBZWUxBU1QgJiYgeXljaGVja1t5eW5dID09IFlZVEVSUk9SKQotLQkgICAgewotLQkgICAgICB5eW4gPSB5eXRhYmxlW3l5bl07Ci0tCSAgICAgIGlmICgwIDwgeXluKQotLQkJYnJlYWs7Ci0tCSAgICB9Ci0tCX0KLS0KLS0gICAgICAvKiBQb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSBlcnJvciB0b2tlbi4gICovCi0tICAgICAgaWYgKHl5c3NwID09IHl5c3MpCi0tCVlZQUJPUlQ7Ci0tCi0tCi0tICAgICAgeXlkZXN0cnVjdCAoIkVycm9yOiBwb3BwaW5nIiwKLS0JCSAgeXlzdG9zW3l5c3RhdGVdLCB5eXZzcCk7Ci0tICAgICAgWVlQT1BTVEFDSyAoMSk7Ci0tICAgICAgeXlzdGF0ZSA9ICp5eXNzcDsKLS0gICAgICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOwotLSAgICB9Ci0tCi0tICAqKyt5eXZzcCA9IHl5bHZhbDsKLS0KLS0KLS0gIC8qIFNoaWZ0IHRoZSBlcnJvciB0b2tlbi4gICovCi0tICBZWV9TWU1CT0xfUFJJTlQgKCJTaGlmdGluZyIsIHl5c3Rvc1t5eW5dLCB5eXZzcCwgeXlsc3ApOwotLQotLSAgeXlzdGF0ZSA9IHl5bjsKLS0gIGdvdG8geXluZXdzdGF0ZTsKLS0KLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0tfCB5eWFjY2VwdGxhYiAtLSBZWUFDQ0VQVCBjb21lcyBoZXJlLiAgfAotLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS15eWFjY2VwdGxhYjoKLS0gIHl5cmVzdWx0ID0gMDsKLS0gIGdvdG8geXlyZXR1cm47Ci0tCi0tLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLS18IHl5YWJvcnRsYWIgLS0gWVlBQk9SVCBjb21lcyBoZXJlLiAgfAotLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0teXlhYm9ydGxhYjoKLS0gIHl5cmVzdWx0ID0gMTsKLS0gIGdvdG8geXlyZXR1cm47Ci0tCi0tI2lmICFkZWZpbmVkKHl5b3ZlcmZsb3cpIHx8IFlZRVJST1JfVkVSQk9TRQotLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLS18IHl5ZXhoYXVzdGVkbGFiIC0tIG1lbW9yeSBleGhhdXN0aW9uIGNvbWVzIGhlcmUuICB8Ci0tYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLXl5ZXhoYXVzdGVkbGFiOgotLSAgeXllcnJvciAoWVlfKCJtZW1vcnkgZXhoYXVzdGVkIikpOwotLSAgeXlyZXN1bHQgPSAyOwotLSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLS0jZW5kaWYKLS0KLS15eXJldHVybjoKLS0gIGlmICh5eWNoYXIgIT0gWVlFTVBUWSkKLS0gICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBkaXNjYXJkaW5nIGxvb2thaGVhZCIsCi0tCQkgeXl0b2tlbiwgJnl5bHZhbCk7Ci0tICAvKiBEbyBub3QgcmVjbGFpbSB0aGUgc3ltYm9scyBvZiB0aGUgcnVsZSB3aGljaCBhY3Rpb24gdHJpZ2dlcmVkCi0tICAgICB0aGlzIFlZQUJPUlQgb3IgWVlBQ0NFUFQuICAqLwotLSAgWVlQT1BTVEFDSyAoeXlsZW4pOwotLSAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKLS0gIHdoaWxlICh5eXNzcCAhPSB5eXNzKQotLSAgICB7Ci0tICAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IHBvcHBpbmciLAotLQkJICB5eXN0b3NbKnl5c3NwXSwgeXl2c3ApOwotLSAgICAgIFlZUE9QU1RBQ0sgKDEpOwotLSAgICB9Ci0tI2lmbmRlZiB5eW92ZXJmbG93Ci0tICBpZiAoeXlzcyAhPSB5eXNzYSkKLS0gICAgWVlTVEFDS19GUkVFICh5eXNzKTsKLS0jZW5kaWYKLS0jaWYgWVlFUlJPUl9WRVJCT1NFCi0tICBpZiAoeXltc2cgIT0geXltc2didWYpCi0tICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOwotLSNlbmRpZgotLSAgLyogTWFrZSBzdXJlIFlZSUQgaXMgdXNlZC4gICovCi0tICByZXR1cm4gWVlJRCAoeXlyZXN1bHQpOwotLX0KLS0KLS0KLS0KLS0vKiBMaW5lIDE2NzUgb2YgeWFjYy5jICAqLwotLSNsaW5lIDIwOSAicGx1cmFsLnkiCi0tCi0tCi0tdm9pZAotLWludGVybmFsX2Z1bmN0aW9uCi0tRlJFRV9FWFBSRVNTSU9OIChzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwKQotLXsKLS0gIGlmIChleHAgPT0gTlVMTCkKLS0gICAgcmV0dXJuOwotLQotLSAgLyogSGFuZGxlIHRoZSByZWN1cnNpdmUgY2FzZS4gICovCi0tICBzd2l0Y2ggKGV4cC0+bmFyZ3MpCi0tICAgIHsKLS0gICAgY2FzZSAzOgotLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1syXSk7Ci0tICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLS0gICAgY2FzZSAyOgotLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1sxXSk7Ci0tICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLS0gICAgY2FzZSAxOgotLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1swXSk7Ci0tICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLS0gICAgZGVmYXVsdDoKLS0gICAgICBicmVhazsKLS0gICAgfQotLQotLSAgZnJlZSAoZXhwKTsKLS19Ci0tCi0tCi0tc3RhdGljIGludAotLXl5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCkKLS17Ci0tICBjb25zdCBjaGFyICpleHAgPSAqcGV4cDsKLS0gIGludCByZXN1bHQ7Ci0tCi0tICB3aGlsZSAoMSkKLS0gICAgewotLSAgICAgIGlmIChleHBbMF0gPT0gJ1wwJykKLS0JewotLQkgICpwZXhwID0gZXhwOwotLQkgIHJldHVybiBZWUVPRjsKLS0JfQotLQotLSAgICAgIGlmIChleHBbMF0gIT0gJyAnICYmIGV4cFswXSAhPSAnXHQnKQotLQlicmVhazsKLS0KLS0gICAgICArK2V4cDsKLS0gICAgfQotLQotLSAgcmVzdWx0ID0gKmV4cCsrOwotLSAgc3dpdGNoIChyZXN1bHQpCi0tICAgIHsKLS0gICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotLSAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0tICAgICAgewotLQl1bnNpZ25lZCBsb25nIGludCBuID0gcmVzdWx0IC0gJzAnOwotLQl3aGlsZSAoZXhwWzBdID49ICcwJyAmJiBleHBbMF0gPD0gJzknKQotLQkgIHsKLS0JICAgIG4gKj0gMTA7Ci0tCSAgICBuICs9IGV4cFswXSAtICcwJzsKLS0JICAgICsrZXhwOwotLQkgIH0KLS0JbHZhbC0+bnVtID0gbjsKLS0JcmVzdWx0ID0gTlVNQkVSOwotLSAgICAgIH0KLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnPSc6Ci0tICAgICAgaWYgKGV4cFswXSA9PSAnPScpCi0tCXsKLS0JICArK2V4cDsKLS0JICBsdmFsLT5vcCA9IGVxdWFsOwotLQkgIHJlc3VsdCA9IEVRVU9QMjsKLS0JfQotLSAgICAgIGVsc2UKLS0JcmVzdWx0ID0gWVlFUlJDT0RFOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICchJzoKLS0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLS0JewotLQkgICsrZXhwOwotLQkgIGx2YWwtPm9wID0gbm90X2VxdWFsOwotLQkgIHJlc3VsdCA9IEVRVU9QMjsKLS0JfQotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICcmJzoKLS0gICAgY2FzZSAnfCc6Ci0tICAgICAgaWYgKGV4cFswXSA9PSByZXN1bHQpCi0tCSsrZXhwOwotLSAgICAgIGVsc2UKLS0JcmVzdWx0ID0gWVlFUlJDT0RFOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICc8JzoKLS0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLS0JewotLQkgICsrZXhwOwotLQkgIGx2YWwtPm9wID0gbGVzc19vcl9lcXVhbDsKLS0JfQotLSAgICAgIGVsc2UKLS0JbHZhbC0+b3AgPSBsZXNzX3RoYW47Ci0tICAgICAgcmVzdWx0ID0gQ01QT1AyOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICc+JzoKLS0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLS0JewotLQkgICsrZXhwOwotLQkgIGx2YWwtPm9wID0gZ3JlYXRlcl9vcl9lcXVhbDsKLS0JfQotLSAgICAgIGVsc2UKLS0JbHZhbC0+b3AgPSBncmVhdGVyX3RoYW47Ci0tICAgICAgcmVzdWx0ID0gQ01QT1AyOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICcqJzoKLS0gICAgICBsdmFsLT5vcCA9IG11bHQ7Ci0tICAgICAgcmVzdWx0ID0gTVVMT1AyOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICcvJzoKLS0gICAgICBsdmFsLT5vcCA9IGRpdmlkZTsKLS0gICAgICByZXN1bHQgPSBNVUxPUDI7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJyUnOgotLSAgICAgIGx2YWwtPm9wID0gbW9kdWxlOwotLSAgICAgIHJlc3VsdCA9IE1VTE9QMjsKLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnKyc6Ci0tICAgICAgbHZhbC0+b3AgPSBwbHVzOwotLSAgICAgIHJlc3VsdCA9IEFERE9QMjsKLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnLSc6Ci0tICAgICAgbHZhbC0+b3AgPSBtaW51czsKLS0gICAgICByZXN1bHQgPSBBRERPUDI7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJ24nOgotLSAgICBjYXNlICc/JzoKLS0gICAgY2FzZSAnOic6Ci0tICAgIGNhc2UgJygnOgotLSAgICBjYXNlICcpJzoKLS0gICAgICAvKiBOb3RoaW5nLCBqdXN0IHJldHVybiB0aGUgY2hhcmFjdGVyLiAgKi8KLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnOyc6Ci0tICAgIGNhc2UgJ1xuJzoKLS0gICAgY2FzZSAnXDAnOgotLSAgICAgIC8qIEJlIHNhZmUgYW5kIGxldCB0aGUgdXNlciBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4uICAqLwotLSAgICAgIC0tZXhwOwotLSAgICAgIHJlc3VsdCA9IFlZRU9GOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBkZWZhdWx0OgotLSAgICAgIHJlc3VsdCA9IFlZRVJSQ09ERTsKLS0jaWYgWVlERUJVRyAhPSAwCi0tICAgICAgLS1leHA7Ci0tI2VuZGlmCi0tICAgICAgYnJlYWs7Ci0tICAgIH0KLS0KLS0gICpwZXhwID0gZXhwOwotLQotLSAgcmV0dXJuIHJlc3VsdDsKLS19Ci0tCi0tCi0tc3RhdGljIHZvaWQKLS15eWVycm9yIChjb25zdCBjaGFyICpzdHIpCi0tewotLSAgLyogRG8gbm90aGluZy4gIFdlIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUuICAqLwotLX0KLS0KLS0tLSBhL2ludGwvcGx1cmFsLnkKLSsrKyAvZGV2L251bGwKLUBAIC0xLDM4NSArMCwwIEBACi0tJXsKLS0vKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSwgMjAwMywgMjAwNS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDIwMDAuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBGb3IgYmlzb24gPCAyLjAsIHRoZSBiaXNvbiBnZW5lcmF0ZWQgcGFyc2VyIHVzZXMgYWxsb2NhLiAgQUlYIDMgZm9yY2VzIHVzCi0tICAgdG8gcHV0IHRoaXMgZGVjbGFyYXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gIFRoZSBkZWNsYXJhdGlvbiBpbgotLSAgIGJpc29uJ3Mgc2tlbGV0b24gZmlsZSBjb21lcyB0b28gbGF0ZS4gIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+Ci0tICAgYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlIGFyYml0cmFyeSBzeXN0ZW0gaGVhZGVycy4KLS0gICBUaGlzIGNhbiBnbyBhd2F5IG9uY2UgdGhlIEFNX0lOVExfU1VCRElSIG1hY3JvIHJlcXVpcmVzIGJpc29uID49IDIuMC4gICovCi0tI2lmIGRlZmluZWQgX0FJWCAmJiAhZGVmaW5lZCBfX0dOVUNfXwotLSAjcHJhZ21hIGFsbG9jYQotLSNlbmRpZgotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0jaW5jbHVkZSAicGx1cmFsLWV4cC5oIgotLQotLS8qIFRoZSBtYWluIGZ1bmN0aW9uIGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyIGlzIGNhbGxlZCBfX2dldHRleHRwYXJzZSwKLS0gICBidXQgd2Ugd2FudCBpdCB0byBiZSBjYWxsZWQgUExVUkFMX1BBUlNFLiAgKi8KLS0jaWZuZGVmIF9MSUJDCi0tIyBkZWZpbmUgX19nZXR0ZXh0cGFyc2UgUExVUkFMX1BBUlNFCi0tI2VuZGlmCi0tCi0tI2RlZmluZSBZWUxFWF9QQVJBTQkmKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5jcAotLSNkZWZpbmUgWVlQQVJTRV9QQVJBTQlhcmcKLS0lfQotLSVwdXJlX3BhcnNlcgotLSVleHBlY3QgNwotLQotLSV1bmlvbiB7Ci0tICB1bnNpZ25lZCBsb25nIGludCBudW07Ci0tICBlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3A7Ci0tICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOwotLX0KLS0KLS0lewotLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCi0tc3RhdGljIGludCB5eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApOwotLXN0YXRpYyB2b2lkIHl5ZXJyb3IgKGNvbnN0IGNoYXIgKnN0cik7Ci0tCi0tLyogQWxsb2NhdGlvbiBvZiBleHByZXNzaW9ucy4gICovCi0tCi0tc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKLS1uZXdfZXhwIChpbnQgbmFyZ3MsIGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcCwKLS0JIHN0cnVjdCBleHByZXNzaW9uICogY29uc3QgKmFyZ3MpCi0tewotLSAgaW50IGk7Ci0tICBzdHJ1Y3QgZXhwcmVzc2lvbiAqbmV3cDsKLS0KLS0gIC8qIElmIGFueSBvZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIG1hbGxvYydlZCwganVzdCByZXR1cm4gTlVMTC4gICovCi0tICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQotLSAgICBpZiAoYXJnc1tpXSA9PSBOVUxMKQotLSAgICAgIGdvdG8gZmFpbDsKLS0KLS0gIC8qIEFsbG9jYXRlIGEgbmV3IGV4cHJlc3Npb24uICAqLwotLSAgbmV3cCA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsKLS0gIGlmIChuZXdwICE9IE5VTEwpCi0tICAgIHsKLS0gICAgICBuZXdwLT5uYXJncyA9IG5hcmdzOwotLSAgICAgIG5ld3AtPm9wZXJhdGlvbiA9IG9wOwotLSAgICAgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCi0tCW5ld3AtPnZhbC5hcmdzW2ldID0gYXJnc1tpXTsKLS0gICAgICByZXR1cm4gbmV3cDsKLS0gICAgfQotLQotLSBmYWlsOgotLSAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKLS0gICAgRlJFRV9FWFBSRVNTSU9OIChhcmdzW2ldKTsKLS0KLS0gIHJldHVybiBOVUxMOwotLX0KLS0KLS1zdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKLS1uZXdfZXhwXzAgKGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcCkKLS17Ci0tICByZXR1cm4gbmV3X2V4cCAoMCwgb3AsIE5VTEwpOwotLX0KLS0KLS1zdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKLS1uZXdfZXhwXzEgKGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0KQotLXsKLS0gIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzFdOwotLQotLSAgYXJnc1swXSA9IHJpZ2h0OwotLSAgcmV0dXJuIG5ld19leHAgKDEsIG9wLCBhcmdzKTsKLS19Ci0tCi0tc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKLS1uZXdfZXhwXzIgKGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmxlZnQsCi0tCSAgIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKLS17Ci0tICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1syXTsKLS0KLS0gIGFyZ3NbMF0gPSBsZWZ0OwotLSAgYXJnc1sxXSA9IHJpZ2h0OwotLSAgcmV0dXJuIG5ld19leHAgKDIsIG9wLCBhcmdzKTsKLS19Ci0tCi0tc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi0tbmV3X2V4cF8zIChlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpiZXhwLAotLQkgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqdGJyYW5jaCwgc3RydWN0IGV4cHJlc3Npb24gKmZicmFuY2gpCi0tewotLSAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbM107Ci0tCi0tICBhcmdzWzBdID0gYmV4cDsKLS0gIGFyZ3NbMV0gPSB0YnJhbmNoOwotLSAgYXJnc1syXSA9IGZicmFuY2g7Ci0tICByZXR1cm4gbmV3X2V4cCAoMywgb3AsIGFyZ3MpOwotLX0KLS0KLS0lfQotLQotLS8qIFRoaXMgZGVjbGFyZXMgdGhhdCBhbGwgb3BlcmF0b3JzIGhhdmUgdGhlIHNhbWUgYXNzb2NpYXRpdml0eSBhbmQgdGhlCi0tICAgcHJlY2VkZW5jZSBvcmRlciBhcyBpbiBDLiAgU2VlIFtIYXJiaXNvbiwgU3RlZWxlOiBDLCBBIFJlZmVyZW5jZSBNYW51YWxdLgotLSAgIFRoZXJlIGlzIG5vIHVuYXJ5IG1pbnVzIGFuZCBubyBiaXR3aXNlIG9wZXJhdG9ycy4KLS0gICBPcGVyYXRvcnMgd2l0aCB0aGUgc2FtZSBzeW50YWN0aWMgYmVoYXZpb3VyIGhhdmUgYmVlbiBtZXJnZWQgaW50byBhIHNpbmdsZQotLSAgIHRva2VuLCB0byBzYXZlIHNwYWNlIGluIHRoZSBhcnJheSBnZW5lcmF0ZWQgYnkgYmlzb24uICAqLwotLSVyaWdodCAnPycJCS8qICAgPwkJKi8KLS0lbGVmdCAnfCcJCS8qICAgfHwJCSovCi0tJWxlZnQgJyYnCQkvKiAgICYmCQkqLwotLSVsZWZ0IEVRVU9QMgkJLyogICA9PSAhPQkqLwotLSVsZWZ0IENNUE9QMgkJLyogICA8ID4gPD0gPj0JKi8KLS0lbGVmdCBBRERPUDIJCS8qICAgKyAtCSovCi0tJWxlZnQgTVVMT1AyCQkvKiAgICogLyAlCSovCi0tJXJpZ2h0ICchJwkJLyogICAhCQkqLwotLQotLSV0b2tlbiA8b3A+IEVRVU9QMiBDTVBPUDIgQURET1AyIE1VTE9QMgotLSV0b2tlbiA8bnVtPiBOVU1CRVIKLS0ldHlwZSA8ZXhwPiBleHAKLS0KLS0lJQotLQotLXN0YXJ0OgkgIGV4cAotLQkgIHsKLS0JICAgIGlmICgkMSA9PSBOVUxMKQotLQkgICAgICBZWUFCT1JUOwotLQkgICAgKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5yZXMgPSAkMTsKLS0JICB9Ci0tCTsKLS0KLS1leHA6CSAgZXhwICc/JyBleHAgJzonIGV4cAotLQkgIHsKLS0JICAgICQkID0gbmV3X2V4cF8zIChxbW9wLCAkMSwgJDMsICQ1KTsKLS0JICB9Ci0tCXwgZXhwICd8JyBleHAKLS0JICB7Ci0tCSAgICAkJCA9IG5ld19leHBfMiAobG9yLCAkMSwgJDMpOwotLQkgIH0KLS0JfCBleHAgJyYnIGV4cAotLQkgIHsKLS0JICAgICQkID0gbmV3X2V4cF8yIChsYW5kLCAkMSwgJDMpOwotLQkgIH0KLS0JfCBleHAgRVFVT1AyIGV4cAotLQkgIHsKLS0JICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKLS0JICB9Ci0tCXwgZXhwIENNUE9QMiBleHAKLS0JICB7Ci0tCSAgICAkJCA9IG5ld19leHBfMiAoJDIsICQxLCAkMyk7Ci0tCSAgfQotLQl8IGV4cCBBRERPUDIgZXhwCi0tCSAgewotLQkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOwotLQkgIH0KLS0JfCBleHAgTVVMT1AyIGV4cAotLQkgIHsKLS0JICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKLS0JICB9Ci0tCXwgJyEnIGV4cAotLQkgIHsKLS0JICAgICQkID0gbmV3X2V4cF8xIChsbm90LCAkMik7Ci0tCSAgfQotLQl8ICduJwotLQkgIHsKLS0JICAgICQkID0gbmV3X2V4cF8wICh2YXIpOwotLQkgIH0KLS0JfCBOVU1CRVIKLS0JICB7Ci0tCSAgICBpZiAoKCQkID0gbmV3X2V4cF8wIChudW0pKSAhPSBOVUxMKQotLQkgICAgICAkJC0+dmFsLm51bSA9ICQxOwotLQkgIH0KLS0JfCAnKCcgZXhwICcpJwotLQkgIHsKLS0JICAgICQkID0gJDI7Ci0tCSAgfQotLQk7Ci0tCi0tJSUKLS0KLS12b2lkCi0taW50ZXJuYWxfZnVuY3Rpb24KLS1GUkVFX0VYUFJFU1NJT04gKHN0cnVjdCBleHByZXNzaW9uICpleHApCi0tewotLSAgaWYgKGV4cCA9PSBOVUxMKQotLSAgICByZXR1cm47Ci0tCi0tICAvKiBIYW5kbGUgdGhlIHJlY3Vyc2l2ZSBjYXNlLiAgKi8KLS0gIHN3aXRjaCAoZXhwLT5uYXJncykKLS0gICAgewotLSAgICBjYXNlIDM6Ci0tICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzJdKTsKLS0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotLSAgICBjYXNlIDI6Ci0tICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzFdKTsKLS0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotLSAgICBjYXNlIDE6Ci0tICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzBdKTsKLS0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotLSAgICBkZWZhdWx0OgotLSAgICAgIGJyZWFrOwotLSAgICB9Ci0tCi0tICBmcmVlIChleHApOwotLX0KLS0KLS0KLS1zdGF0aWMgaW50Ci0teXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKQotLXsKLS0gIGNvbnN0IGNoYXIgKmV4cCA9ICpwZXhwOwotLSAgaW50IHJlc3VsdDsKLS0KLS0gIHdoaWxlICgxKQotLSAgICB7Ci0tICAgICAgaWYgKGV4cFswXSA9PSAnXDAnKQotLQl7Ci0tCSAgKnBleHAgPSBleHA7Ci0tCSAgcmV0dXJuIFlZRU9GOwotLQl9Ci0tCi0tICAgICAgaWYgKGV4cFswXSAhPSAnICcgJiYgZXhwWzBdICE9ICdcdCcpCi0tCWJyZWFrOwotLQotLSAgICAgICsrZXhwOwotLSAgICB9Ci0tCi0tICByZXN1bHQgPSAqZXhwKys7Ci0tICBzd2l0Y2ggKHJlc3VsdCkKLS0gICAgewotLSAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6Ci0tICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLS0gICAgICB7Ci0tCXVuc2lnbmVkIGxvbmcgaW50IG4gPSByZXN1bHQgLSAnMCc7Ci0tCXdoaWxlIChleHBbMF0gPj0gJzAnICYmIGV4cFswXSA8PSAnOScpCi0tCSAgewotLQkgICAgbiAqPSAxMDsKLS0JICAgIG4gKz0gZXhwWzBdIC0gJzAnOwotLQkgICAgKytleHA7Ci0tCSAgfQotLQlsdmFsLT5udW0gPSBuOwotLQlyZXN1bHQgPSBOVU1CRVI7Ci0tICAgICAgfQotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICc9JzoKLS0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLS0JewotLQkgICsrZXhwOwotLQkgIGx2YWwtPm9wID0gZXF1YWw7Ci0tCSAgcmVzdWx0ID0gRVFVT1AyOwotLQl9Ci0tICAgICAgZWxzZQotLQlyZXN1bHQgPSBZWUVSUkNPREU7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJyEnOgotLSAgICAgIGlmIChleHBbMF0gPT0gJz0nKQotLQl7Ci0tCSAgKytleHA7Ci0tCSAgbHZhbC0+b3AgPSBub3RfZXF1YWw7Ci0tCSAgcmVzdWx0ID0gRVFVT1AyOwotLQl9Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJyYnOgotLSAgICBjYXNlICd8JzoKLS0gICAgICBpZiAoZXhwWzBdID09IHJlc3VsdCkKLS0JKytleHA7Ci0tICAgICAgZWxzZQotLQlyZXN1bHQgPSBZWUVSUkNPREU7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJzwnOgotLSAgICAgIGlmIChleHBbMF0gPT0gJz0nKQotLQl7Ci0tCSAgKytleHA7Ci0tCSAgbHZhbC0+b3AgPSBsZXNzX29yX2VxdWFsOwotLQl9Ci0tICAgICAgZWxzZQotLQlsdmFsLT5vcCA9IGxlc3NfdGhhbjsKLS0gICAgICByZXN1bHQgPSBDTVBPUDI7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJz4nOgotLSAgICAgIGlmIChleHBbMF0gPT0gJz0nKQotLQl7Ci0tCSAgKytleHA7Ci0tCSAgbHZhbC0+b3AgPSBncmVhdGVyX29yX2VxdWFsOwotLQl9Ci0tICAgICAgZWxzZQotLQlsdmFsLT5vcCA9IGdyZWF0ZXJfdGhhbjsKLS0gICAgICByZXN1bHQgPSBDTVBPUDI7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJyonOgotLSAgICAgIGx2YWwtPm9wID0gbXVsdDsKLS0gICAgICByZXN1bHQgPSBNVUxPUDI7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJy8nOgotLSAgICAgIGx2YWwtPm9wID0gZGl2aWRlOwotLSAgICAgIHJlc3VsdCA9IE1VTE9QMjsKLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnJSc6Ci0tICAgICAgbHZhbC0+b3AgPSBtb2R1bGU7Ci0tICAgICAgcmVzdWx0ID0gTVVMT1AyOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICcrJzoKLS0gICAgICBsdmFsLT5vcCA9IHBsdXM7Ci0tICAgICAgcmVzdWx0ID0gQURET1AyOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICctJzoKLS0gICAgICBsdmFsLT5vcCA9IG1pbnVzOwotLSAgICAgIHJlc3VsdCA9IEFERE9QMjsKLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnbic6Ci0tICAgIGNhc2UgJz8nOgotLSAgICBjYXNlICc6JzoKLS0gICAgY2FzZSAnKCc6Ci0tICAgIGNhc2UgJyknOgotLSAgICAgIC8qIE5vdGhpbmcsIGp1c3QgcmV0dXJuIHRoZSBjaGFyYWN0ZXIuICAqLwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICc7JzoKLS0gICAgY2FzZSAnXG4nOgotLSAgICBjYXNlICdcMCc6Ci0tICAgICAgLyogQmUgc2FmZSBhbmQgbGV0IHRoZSB1c2VyIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2Fpbi4gICovCi0tICAgICAgLS1leHA7Ci0tICAgICAgcmVzdWx0ID0gWVlFT0Y7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGRlZmF1bHQ6Ci0tICAgICAgcmVzdWx0ID0gWVlFUlJDT0RFOwotLSNpZiBZWURFQlVHICE9IDAKLS0gICAgICAtLWV4cDsKLS0jZW5kaWYKLS0gICAgICBicmVhazsKLS0gICAgfQotLQotLSAgKnBleHAgPSBleHA7Ci0tCi0tICByZXR1cm4gcmVzdWx0OwotLX0KLS0KLS0KLS1zdGF0aWMgdm9pZAotLXl5ZXJyb3IgKGNvbnN0IGNoYXIgKnN0cikKLS17Ci0tICAvKiBEbyBub3RoaW5nLiAgV2UgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaGVyZS4gICovCi0tfQotLS0tIGEvaW50bC9wcmludGYtYXJncy5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxODggKzAsMCBAQAotLS8qIERlY29tcG9zZWQgcHJpbnRmIGFyZ3VtZW50IGxpc3QuCi0tICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMsIDIwMDUtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFRoaXMgZmlsZSBjYW4gYmUgcGFyYW1ldHJpemVkIHdpdGggdGhlIGZvbGxvd2luZyBtYWNyb3M6Ci0tICAgICBFTkFCTEVfVU5JU1RESU8gICAgU2V0IHRvIDEgdG8gZW5hYmxlIHRoZSB1bmlzdGRpbyBleHRlbnNpb25zLgotLSAgICAgUFJJTlRGX0ZFVENIQVJHUyAgIE5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGRlZmluZWQuCi0tICAgICBTVEFUSUMgICAgICAgICAgICAgU2V0IHRvICdzdGF0aWMnIHRvIGRlY2xhcmUgdGhlIGZ1bmN0aW9uIHN0YXRpYy4gICovCi0tCi0tI2lmbmRlZiBQUklOVEZfRkVUQ0hBUkdTCi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0vKiBTcGVjaWZpY2F0aW9uLiAgKi8KLS0jaWZuZGVmIFBSSU5URl9GRVRDSEFSR1MKLS0jIGluY2x1ZGUgInByaW50Zi1hcmdzLmgiCi0tI2VuZGlmCi0tCi0tI2lmZGVmIFNUQVRJQwotLVNUQVRJQwotLSNlbmRpZgotLWludAotLVBSSU5URl9GRVRDSEFSR1MgKHZhX2xpc3QgYXJncywgYXJndW1lbnRzICphKQotLXsKLS0gIHNpemVfdCBpOwotLSAgYXJndW1lbnQgKmFwOwotLQotLSAgZm9yIChpID0gMCwgYXAgPSAmYS0+YXJnWzBdOyBpIDwgYS0+Y291bnQ7IGkrKywgYXArKykKLS0gICAgc3dpdGNoIChhcC0+dHlwZSkKLS0gICAgICB7Ci0tICAgICAgY2FzZSBUWVBFX1NDSEFSOgotLQlhcC0+YS5hX3NjaGFyID0gdmFfYXJnIChhcmdzLCAvKnNpZ25lZCBjaGFyKi8gaW50KTsKLS0JYnJlYWs7Ci0tICAgICAgY2FzZSBUWVBFX1VDSEFSOgotLQlhcC0+YS5hX3VjaGFyID0gdmFfYXJnIChhcmdzLCAvKnVuc2lnbmVkIGNoYXIqLyBpbnQpOwotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfU0hPUlQ6Ci0tCWFwLT5hLmFfc2hvcnQgPSB2YV9hcmcgKGFyZ3MsIC8qc2hvcnQqLyBpbnQpOwotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfVVNIT1JUOgotLQlhcC0+YS5hX3VzaG9ydCA9IHZhX2FyZyAoYXJncywgLyp1bnNpZ25lZCBzaG9ydCovIGludCk7Ci0tCWJyZWFrOwotLSAgICAgIGNhc2UgVFlQRV9JTlQ6Ci0tCWFwLT5hLmFfaW50ID0gdmFfYXJnIChhcmdzLCBpbnQpOwotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfVUlOVDoKLS0JYXAtPmEuYV91aW50ID0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBpbnQpOwotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfTE9OR0lOVDoKLS0JYXAtPmEuYV9sb25naW50ID0gdmFfYXJnIChhcmdzLCBsb25nIGludCk7Ci0tCWJyZWFrOwotLSAgICAgIGNhc2UgVFlQRV9VTE9OR0lOVDoKLS0JYXAtPmEuYV91bG9uZ2ludCA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgbG9uZyBpbnQpOwotLQlicmVhazsKLS0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0tICAgICAgY2FzZSBUWVBFX0xPTkdMT05HSU5UOgotLQlhcC0+YS5hX2xvbmdsb25naW50ID0gdmFfYXJnIChhcmdzLCBsb25nIGxvbmcgaW50KTsKLS0JYnJlYWs7Ci0tICAgICAgY2FzZSBUWVBFX1VMT05HTE9OR0lOVDoKLS0JYXAtPmEuYV91bG9uZ2xvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpOwotLQlicmVhazsKLS0jZW5kaWYKLS0gICAgICBjYXNlIFRZUEVfRE9VQkxFOgotLQlhcC0+YS5hX2RvdWJsZSA9IHZhX2FyZyAoYXJncywgZG91YmxlKTsKLS0JYnJlYWs7Ci0tICAgICAgY2FzZSBUWVBFX0xPTkdET1VCTEU6Ci0tCWFwLT5hLmFfbG9uZ2RvdWJsZSA9IHZhX2FyZyAoYXJncywgbG9uZyBkb3VibGUpOwotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfQ0hBUjoKLS0JYXAtPmEuYV9jaGFyID0gdmFfYXJnIChhcmdzLCBpbnQpOwotLQlicmVhazsKLS0jaWYgSEFWRV9XSU5UX1QKLS0gICAgICBjYXNlIFRZUEVfV0lERV9DSEFSOgotLQkvKiBBbHRob3VnaCBJU08gQyA5OSA3LjI0LjEuKDIpIHNheXMgdGhhdCB3aW50X3QgaXMgInVuY2hhbmdlZCBieQotLQkgICBkZWZhdWx0IGFyZ3VtZW50IHByb21vdGlvbnMiLCB0aGlzIGlzIG5vdCB0aGUgY2FzZSBpbiBtaW5ndzMyLAotLQkgICB3aGVyZSB3aW50X3QgaXMgJ3Vuc2lnbmVkIHNob3J0Jy4gICovCi0tCWFwLT5hLmFfd2lkZV9jaGFyID0KLS0JICAoc2l6ZW9mICh3aW50X3QpIDwgc2l6ZW9mIChpbnQpCi0tCSAgID8gdmFfYXJnIChhcmdzLCBpbnQpCi0tCSAgIDogdmFfYXJnIChhcmdzLCB3aW50X3QpKTsKLS0JYnJlYWs7Ci0tI2VuZGlmCi0tICAgICAgY2FzZSBUWVBFX1NUUklORzoKLS0JYXAtPmEuYV9zdHJpbmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKik7Ci0tCS8qIEEgbnVsbCBwb2ludGVyIGlzIGFuIGludmFsaWQgYXJndW1lbnQgZm9yICIlcyIsIGJ1dCBpbiBwcmFjdGljZQotLQkgICBpdCBvY2N1cnMgcXVpdGUgZnJlcXVlbnRseSBpbiBwcmludGYgc3RhdGVtZW50cyB0aGF0IHByb2R1Y2UKLS0JICAgZGVidWcgb3V0cHV0LiAgVXNlIGEgZmFsbGJhY2sgaW4gdGhpcyBjYXNlLiAgKi8KLS0JaWYgKGFwLT5hLmFfc3RyaW5nID09IE5VTEwpCi0tCSAgYXAtPmEuYV9zdHJpbmcgPSAiKE5VTEwpIjsKLS0JYnJlYWs7Ci0tI2lmIEhBVkVfV0NIQVJfVAotLSAgICAgIGNhc2UgVFlQRV9XSURFX1NUUklORzoKLS0JYXAtPmEuYV93aWRlX3N0cmluZyA9IHZhX2FyZyAoYXJncywgY29uc3Qgd2NoYXJfdCAqKTsKLS0JLyogQSBudWxsIHBvaW50ZXIgaXMgYW4gaW52YWxpZCBhcmd1bWVudCBmb3IgIiVscyIsIGJ1dCBpbiBwcmFjdGljZQotLQkgICBpdCBvY2N1cnMgcXVpdGUgZnJlcXVlbnRseSBpbiBwcmludGYgc3RhdGVtZW50cyB0aGF0IHByb2R1Y2UKLS0JICAgZGVidWcgb3V0cHV0LiAgVXNlIGEgZmFsbGJhY2sgaW4gdGhpcyBjYXNlLiAgKi8KLS0JaWYgKGFwLT5hLmFfd2lkZV9zdHJpbmcgPT0gTlVMTCkKLS0JICB7Ci0tCSAgICBzdGF0aWMgY29uc3Qgd2NoYXJfdCB3aWRlX251bGxfc3RyaW5nW10gPQotLQkgICAgICB7Ci0tCQkod2NoYXJfdCknKCcsCi0tCQkod2NoYXJfdCknTicsICh3Y2hhcl90KSdVJywgKHdjaGFyX3QpJ0wnLCAod2NoYXJfdCknTCcsCi0tCQkod2NoYXJfdCknKScsCi0tCQkod2NoYXJfdCkwCi0tCSAgICAgIH07Ci0tCSAgICBhcC0+YS5hX3dpZGVfc3RyaW5nID0gd2lkZV9udWxsX3N0cmluZzsKLS0JICB9Ci0tCWJyZWFrOwotLSNlbmRpZgotLSAgICAgIGNhc2UgVFlQRV9QT0lOVEVSOgotLQlhcC0+YS5hX3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIHZvaWQgKik7Ci0tCWJyZWFrOwotLSAgICAgIGNhc2UgVFlQRV9DT1VOVF9TQ0hBUl9QT0lOVEVSOgotLQlhcC0+YS5hX2NvdW50X3NjaGFyX3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIHNpZ25lZCBjaGFyICopOwotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUjoKLS0JYXAtPmEuYV9jb3VudF9zaG9ydF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBzaG9ydCAqKTsKLS0JYnJlYWs7Ci0tICAgICAgY2FzZSBUWVBFX0NPVU5UX0lOVF9QT0lOVEVSOgotLQlhcC0+YS5hX2NvdW50X2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBpbnQgKik7Ci0tCWJyZWFrOwotLSAgICAgIGNhc2UgVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVI6Ci0tCWFwLT5hLmFfY291bnRfbG9uZ2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBsb25nIGludCAqKTsKLS0JYnJlYWs7Ci0tI2lmIEhBVkVfTE9OR19MT05HX0lOVAotLSAgICAgIGNhc2UgVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSOgotLQlhcC0+YS5hX2NvdW50X2xvbmdsb25naW50X3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgbG9uZyBpbnQgKik7Ci0tCWJyZWFrOwotLSNlbmRpZgotLSNpZiBFTkFCTEVfVU5JU1RESU8KLS0gICAgICAvKiBUaGUgdW5pc3RkaW8gZXh0ZW5zaW9ucy4gICovCi0tICAgICAgY2FzZSBUWVBFX1U4X1NUUklORzoKLS0JYXAtPmEuYV91OF9zdHJpbmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IHVpbnQ4X3QgKik7Ci0tCS8qIEEgbnVsbCBwb2ludGVyIGlzIGFuIGludmFsaWQgYXJndW1lbnQgZm9yICIlVSIsIGJ1dCBpbiBwcmFjdGljZQotLQkgICBpdCBvY2N1cnMgcXVpdGUgZnJlcXVlbnRseSBpbiBwcmludGYgc3RhdGVtZW50cyB0aGF0IHByb2R1Y2UKLS0JICAgZGVidWcgb3V0cHV0LiAgVXNlIGEgZmFsbGJhY2sgaW4gdGhpcyBjYXNlLiAgKi8KLS0JaWYgKGFwLT5hLmFfdThfc3RyaW5nID09IE5VTEwpCi0tCSAgewotLQkgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdThfbnVsbF9zdHJpbmdbXSA9Ci0tCSAgICAgIHsgJygnLCAnTicsICdVJywgJ0wnLCAnTCcsICcpJywgMCB9OwotLQkgICAgYXAtPmEuYV91OF9zdHJpbmcgPSB1OF9udWxsX3N0cmluZzsKLS0JICB9Ci0tCWJyZWFrOwotLSAgICAgIGNhc2UgVFlQRV9VMTZfU1RSSU5HOgotLQlhcC0+YS5hX3UxNl9zdHJpbmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IHVpbnQxNl90ICopOwotLQkvKiBBIG51bGwgcG9pbnRlciBpcyBhbiBpbnZhbGlkIGFyZ3VtZW50IGZvciAiJWxVIiwgYnV0IGluIHByYWN0aWNlCi0tCSAgIGl0IG9jY3VycyBxdWl0ZSBmcmVxdWVudGx5IGluIHByaW50ZiBzdGF0ZW1lbnRzIHRoYXQgcHJvZHVjZQotLQkgICBkZWJ1ZyBvdXRwdXQuICBVc2UgYSBmYWxsYmFjayBpbiB0aGlzIGNhc2UuICAqLwotLQlpZiAoYXAtPmEuYV91MTZfc3RyaW5nID09IE5VTEwpCi0tCSAgewotLQkgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHUxNl9udWxsX3N0cmluZ1tdID0KLS0JICAgICAgeyAnKCcsICdOJywgJ1UnLCAnTCcsICdMJywgJyknLCAwIH07Ci0tCSAgICBhcC0+YS5hX3UxNl9zdHJpbmcgPSB1MTZfbnVsbF9zdHJpbmc7Ci0tCSAgfQotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfVTMyX1NUUklORzoKLS0JYXAtPmEuYV91MzJfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCB1aW50MzJfdCAqKTsKLS0JLyogQSBudWxsIHBvaW50ZXIgaXMgYW4gaW52YWxpZCBhcmd1bWVudCBmb3IgIiVsbFUiLCBidXQgaW4gcHJhY3RpY2UKLS0JICAgaXQgb2NjdXJzIHF1aXRlIGZyZXF1ZW50bHkgaW4gcHJpbnRmIHN0YXRlbWVudHMgdGhhdCBwcm9kdWNlCi0tCSAgIGRlYnVnIG91dHB1dC4gIFVzZSBhIGZhbGxiYWNrIGluIHRoaXMgY2FzZS4gICovCi0tCWlmIChhcC0+YS5hX3UzMl9zdHJpbmcgPT0gTlVMTCkKLS0JICB7Ci0tCSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgdTMyX251bGxfc3RyaW5nW10gPQotLQkgICAgICB7ICcoJywgJ04nLCAnVScsICdMJywgJ0wnLCAnKScsIDAgfTsKLS0JICAgIGFwLT5hLmFfdTMyX3N0cmluZyA9IHUzMl9udWxsX3N0cmluZzsKLS0JICB9Ci0tCWJyZWFrOwotLSNlbmRpZgotLSAgICAgIGRlZmF1bHQ6Ci0tCS8qIFVua25vd24gdHlwZS4gICovCi0tCXJldHVybiAtMTsKLS0gICAgICB9Ci0tICByZXR1cm4gMDsKLS19Ci0tLS0gYS9pbnRsL3ByaW50Zi1hcmdzLmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDE1NSArMCwwIEBACi0tLyogRGVjb21wb3NlZCBwcmludGYgYXJndW1lbnQgbGlzdC4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDItMjAwMywgMjAwNi0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBfUFJJTlRGX0FSR1NfSAotLSNkZWZpbmUgX1BSSU5URl9BUkdTX0gKLS0KLS0vKiBUaGlzIGZpbGUgY2FuIGJlIHBhcmFtZXRyaXplZCB3aXRoIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgotLSAgICAgRU5BQkxFX1VOSVNURElPICAgIFNldCB0byAxIHRvIGVuYWJsZSB0aGUgdW5pc3RkaW8gZXh0ZW5zaW9ucy4KLS0gICAgIFBSSU5URl9GRVRDSEFSR1MgICBOYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBkZWNsYXJlZC4KLS0gICAgIFNUQVRJQyAgICAgICAgICAgICBTZXQgdG8gJ3N0YXRpYycgdG8gZGVjbGFyZSB0aGUgZnVuY3Rpb24gc3RhdGljLiAgKi8KLS0KLS0vKiBEZWZhdWx0IHBhcmFtZXRlcnMuICAqLwotLSNpZm5kZWYgUFJJTlRGX0ZFVENIQVJHUwotLSMgZGVmaW5lIFBSSU5URl9GRVRDSEFSR1MgcHJpbnRmX2ZldGNoYXJncwotLSNlbmRpZgotLQotLS8qIEdldCBzaXplX3QuICAqLwotLSNpbmNsdWRlIDxzdGRkZWYuaD4KLS0KLS0vKiBHZXQgd2NoYXJfdC4gICovCi0tI2lmIEhBVkVfV0NIQVJfVAotLSMgaW5jbHVkZSA8c3RkZGVmLmg+Ci0tI2VuZGlmCi0tCi0tLyogR2V0IHdpbnRfdC4gICovCi0tI2lmIEhBVkVfV0lOVF9UCi0tIyBpbmNsdWRlIDx3Y2hhci5oPgotLSNlbmRpZgotLQotLS8qIEdldCB2YV9saXN0LiAgKi8KLS0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0tCi0tCi0tLyogQXJndW1lbnQgdHlwZXMgKi8KLS10eXBlZGVmIGVudW0KLS17Ci0tICBUWVBFX05PTkUsCi0tICBUWVBFX1NDSEFSLAotLSAgVFlQRV9VQ0hBUiwKLS0gIFRZUEVfU0hPUlQsCi0tICBUWVBFX1VTSE9SVCwKLS0gIFRZUEVfSU5ULAotLSAgVFlQRV9VSU5ULAotLSAgVFlQRV9MT05HSU5ULAotLSAgVFlQRV9VTE9OR0lOVCwKLS0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0tICBUWVBFX0xPTkdMT05HSU5ULAotLSAgVFlQRV9VTE9OR0xPTkdJTlQsCi0tI2VuZGlmCi0tICBUWVBFX0RPVUJMRSwKLS0gIFRZUEVfTE9OR0RPVUJMRSwKLS0gIFRZUEVfQ0hBUiwKLS0jaWYgSEFWRV9XSU5UX1QKLS0gIFRZUEVfV0lERV9DSEFSLAotLSNlbmRpZgotLSAgVFlQRV9TVFJJTkcsCi0tI2lmIEhBVkVfV0NIQVJfVAotLSAgVFlQRV9XSURFX1NUUklORywKLS0jZW5kaWYKLS0gIFRZUEVfUE9JTlRFUiwKLS0gIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUiwKLS0gIFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUiwKLS0gIFRZUEVfQ09VTlRfSU5UX1BPSU5URVIsCi0tICBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUgotLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLS0sIFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUgotLSNlbmRpZgotLSNpZiBFTkFCTEVfVU5JU1RESU8KLS0gIC8qIFRoZSB1bmlzdGRpbyBleHRlbnNpb25zLiAgKi8KLS0sIFRZUEVfVThfU1RSSU5HCi0tLCBUWVBFX1UxNl9TVFJJTkcKLS0sIFRZUEVfVTMyX1NUUklORwotLSNlbmRpZgotLX0gYXJnX3R5cGU7Ci0tCi0tLyogUG9seW1vcnBoaWMgYXJndW1lbnQgKi8KLS10eXBlZGVmIHN0cnVjdAotLXsKLS0gIGFyZ190eXBlIHR5cGU7Ci0tICB1bmlvbgotLSAgewotLSAgICBzaWduZWQgY2hhcgkJCWFfc2NoYXI7Ci0tICAgIHVuc2lnbmVkIGNoYXIJCWFfdWNoYXI7Ci0tICAgIHNob3J0CQkJYV9zaG9ydDsKLS0gICAgdW5zaWduZWQgc2hvcnQJCWFfdXNob3J0OwotLSAgICBpbnQJCQkJYV9pbnQ7Ci0tICAgIHVuc2lnbmVkIGludAkJYV91aW50OwotLSAgICBsb25nIGludAkJCWFfbG9uZ2ludDsKLS0gICAgdW5zaWduZWQgbG9uZyBpbnQJCWFfdWxvbmdpbnQ7Ci0tI2lmIEhBVkVfTE9OR19MT05HX0lOVAotLSAgICBsb25nIGxvbmcgaW50CQlhX2xvbmdsb25naW50OwotLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50CWFfdWxvbmdsb25naW50OwotLSNlbmRpZgotLSAgICBmbG9hdAkJCWFfZmxvYXQ7Ci0tICAgIGRvdWJsZQkJCWFfZG91YmxlOwotLSAgICBsb25nIGRvdWJsZQkJCWFfbG9uZ2RvdWJsZTsKLS0gICAgaW50CQkJCWFfY2hhcjsKLS0jaWYgSEFWRV9XSU5UX1QKLS0gICAgd2ludF90CQkJYV93aWRlX2NoYXI7Ci0tI2VuZGlmCi0tICAgIGNvbnN0IGNoYXIqCQkJYV9zdHJpbmc7Ci0tI2lmIEhBVkVfV0NIQVJfVAotLSAgICBjb25zdCB3Y2hhcl90KgkJYV93aWRlX3N0cmluZzsKLS0jZW5kaWYKLS0gICAgdm9pZCoJCQlhX3BvaW50ZXI7Ci0tICAgIHNpZ25lZCBjaGFyICoJCWFfY291bnRfc2NoYXJfcG9pbnRlcjsKLS0gICAgc2hvcnQgKgkJCWFfY291bnRfc2hvcnRfcG9pbnRlcjsKLS0gICAgaW50ICoJCQlhX2NvdW50X2ludF9wb2ludGVyOwotLSAgICBsb25nIGludCAqCQkJYV9jb3VudF9sb25naW50X3BvaW50ZXI7Ci0tI2lmIEhBVkVfTE9OR19MT05HX0lOVAotLSAgICBsb25nIGxvbmcgaW50ICoJCWFfY291bnRfbG9uZ2xvbmdpbnRfcG9pbnRlcjsKLS0jZW5kaWYKLS0jaWYgRU5BQkxFX1VOSVNURElPCi0tICAgIC8qIFRoZSB1bmlzdGRpbyBleHRlbnNpb25zLiAgKi8KLS0gICAgY29uc3QgdWludDhfdCAqCQlhX3U4X3N0cmluZzsKLS0gICAgY29uc3QgdWludDE2X3QgKgkJYV91MTZfc3RyaW5nOwotLSAgICBjb25zdCB1aW50MzJfdCAqCQlhX3UzMl9zdHJpbmc7Ci0tI2VuZGlmCi0tICB9Ci0tICBhOwotLX0KLS1hcmd1bWVudDsKLS0KLS10eXBlZGVmIHN0cnVjdAotLXsKLS0gIHNpemVfdCBjb3VudDsKLS0gIGFyZ3VtZW50ICphcmc7Ci0tfQotLWFyZ3VtZW50czsKLS0KLS0KLS0vKiBGZXRjaCB0aGUgYXJndW1lbnRzLCBwdXR0aW5nIHRoZW0gaW50byBhLiAqLwotLSNpZmRlZiBTVEFUSUMKLS1TVEFUSUMKLS0jZWxzZQotLWV4dGVybgotLSNlbmRpZgotLWludCBQUklOVEZfRkVUQ0hBUkdTICh2YV9saXN0IGFyZ3MsIGFyZ3VtZW50cyAqYSk7Ci0tCi0tI2VuZGlmIC8qIF9QUklOVEZfQVJHU19IICovCi0tLS0gYS9pbnRsL3ByaW50Zi1wYXJzZS5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw1OTAgKzAsMCBAQAotLS8qIEZvcm1hdHRlZCBvdXRwdXQgdG8gc3RyaW5ncy4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCwgMjAwMi0yMDAzLCAyMDA2LTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBUaGlzIGZpbGUgY2FuIGJlIHBhcmFtZXRyaXplZCB3aXRoIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgotLSAgICAgQ0hBUl9UICAgICAgICAgICAgIFRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGZvcm1hdCBzdHJpbmcuCi0tICAgICBDSEFSX1RfT05MWV9BU0NJSSAgU2V0IHRvIDEgdG8gZW5hYmxlIHZlcmlmaWNhdGlvbiB0aGF0IGFsbCBjaGFyYWN0ZXJzCi0tICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZvcm1hdCBzdHJpbmcgYXJlIEFTQ0lJLgotLSAgICAgRElSRUNUSVZFICAgICAgICAgIFN0cnVjdHVyZSBkZW5vdGluZyBhIGZvcm1hdCBkaXJlY3RpdmUuCi0tICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kcyBvbiBDSEFSX1QuCi0tICAgICBESVJFQ1RJVkVTICAgICAgICAgU3RydWN0dXJlIGRlbm90aW5nIHRoZSBzZXQgb2YgZm9ybWF0IGRpcmVjdGl2ZXMgb2YgYQotLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBzdHJpbmcuICBEZXBlbmRzIG9uIENIQVJfVC4KLS0gICAgIFBSSU5URl9QQVJTRSAgICAgICBGdW5jdGlvbiB0aGF0IHBhcnNlcyBhIGZvcm1hdCBzdHJpbmcuCi0tICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kcyBvbiBDSEFSX1QuCi0tICAgICBTVEFUSUMgICAgICAgICAgICAgU2V0IHRvICdzdGF0aWMnIHRvIGRlY2xhcmUgdGhlIGZ1bmN0aW9uIHN0YXRpYy4KLS0gICAgIEVOQUJMRV9VTklTVERJTyAgICBTZXQgdG8gMSB0byBlbmFibGUgdGhlIHVuaXN0ZGlvIGV4dGVuc2lvbnMuICAqLwotLQotLSNpZm5kZWYgUFJJTlRGX1BBUlNFCi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0vKiBTcGVjaWZpY2F0aW9uLiAgKi8KLS0jaWZuZGVmIFBSSU5URl9QQVJTRQotLSMgaW5jbHVkZSAicHJpbnRmLXBhcnNlLmgiCi0tI2VuZGlmCi0tCi0tLyogRGVmYXVsdCBwYXJhbWV0ZXJzLiAgKi8KLS0jaWZuZGVmIFBSSU5URl9QQVJTRQotLSMgZGVmaW5lIFBSSU5URl9QQVJTRSBwcmludGZfcGFyc2UKLS0jIGRlZmluZSBDSEFSX1QgY2hhcgotLSMgZGVmaW5lIERJUkVDVElWRSBjaGFyX2RpcmVjdGl2ZQotLSMgZGVmaW5lIERJUkVDVElWRVMgY2hhcl9kaXJlY3RpdmVzCi0tI2VuZGlmCi0tCi0tLyogR2V0IHNpemVfdCwgTlVMTC4gICovCi0tI2luY2x1ZGUgPHN0ZGRlZi5oPgotLQotLS8qIEdldCBpbnRtYXhfdC4gICovCi0tI2lmIGRlZmluZWQgSU5fTElCSU5UTCB8fCBkZWZpbmVkIElOX0xJQkFTUFJJTlRGCi0tIyBpZiBIQVZFX1NURElOVF9IX1dJVEhfVUlOVE1BWAotLSMgIGluY2x1ZGUgPHN0ZGludC5oPgotLSMgZW5kaWYKLS0jIGlmIEhBVkVfSU5UVFlQRVNfSF9XSVRIX1VJTlRNQVgKLS0jICBpbmNsdWRlIDxpbnR0eXBlcy5oPgotLSMgZW5kaWYKLS0jZWxzZQotLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0tI2VuZGlmCi0tCi0tLyogbWFsbG9jKCksIHJlYWxsb2MoKSwgZnJlZSgpLiAgKi8KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tCi0tLyogZXJybm8uICAqLwotLSNpbmNsdWRlIDxlcnJuby5oPgotLQotLS8qIENoZWNrZWQgc2l6ZV90IGNvbXB1dGF0aW9ucy4gICovCi0tI2luY2x1ZGUgInhzaXplLmgiCi0tCi0tI2lmIENIQVJfVF9PTkxZX0FTQ0lJCi0tLyogY19pc2FzY2lpKCkuICAqLwotLSMgaW5jbHVkZSAiYy1jdHlwZS5oIgotLSNlbmRpZgotLQotLSNpZmRlZiBTVEFUSUMKLS1TVEFUSUMKLS0jZW5kaWYKLS1pbnQKLS1QUklOVEZfUEFSU0UgKGNvbnN0IENIQVJfVCAqZm9ybWF0LCBESVJFQ1RJVkVTICpkLCBhcmd1bWVudHMgKmEpCi0tewotLSAgY29uc3QgQ0hBUl9UICpjcCA9IGZvcm1hdDsJCS8qIHBvaW50ZXIgaW50byBmb3JtYXQgKi8KLS0gIHNpemVfdCBhcmdfcG9zbiA9IDA7CQkvKiBudW1iZXIgb2YgcmVndWxhciBhcmd1bWVudHMgY29uc3VtZWQgKi8KLS0gIHNpemVfdCBkX2FsbG9jYXRlZDsJCQkvKiBhbGxvY2F0ZWQgZWxlbWVudHMgb2YgZC0+ZGlyICovCi0tICBzaXplX3QgYV9hbGxvY2F0ZWQ7CQkJLyogYWxsb2NhdGVkIGVsZW1lbnRzIG9mIGEtPmFyZyAqLwotLSAgc2l6ZV90IG1heF93aWR0aF9sZW5ndGggPSAwOwotLSAgc2l6ZV90IG1heF9wcmVjaXNpb25fbGVuZ3RoID0gMDsKLS0KLS0gIGQtPmNvdW50ID0gMDsKLS0gIGRfYWxsb2NhdGVkID0gMTsKLS0gIGQtPmRpciA9IChESVJFQ1RJVkUgKikgbWFsbG9jIChkX2FsbG9jYXRlZCAqIHNpemVvZiAoRElSRUNUSVZFKSk7Ci0tICBpZiAoZC0+ZGlyID09IE5VTEwpCi0tICAgIC8qIE91dCBvZiBtZW1vcnkuICAqLwotLSAgICBnb3RvIG91dF9vZl9tZW1vcnlfMTsKLS0KLS0gIGEtPmNvdW50ID0gMDsKLS0gIGFfYWxsb2NhdGVkID0gMDsKLS0gIGEtPmFyZyA9IE5VTEw7Ci0tCi0tI2RlZmluZSBSRUdJU1RFUl9BUkcoX2luZGV4XyxfdHlwZV8pIFwKLS0gIHsJCQkJCQkJCQlcCi0tICAgIHNpemVfdCBuID0gKF9pbmRleF8pOwkJCQkJCVwKLS0gICAgaWYgKG4gPj0gYV9hbGxvY2F0ZWQpCQkJCQkJXAotLSAgICAgIHsJCQkJCQkJCQlcCi0tCXNpemVfdCBtZW1vcnlfc2l6ZTsJCQkJCQlcCi0tCWFyZ3VtZW50ICptZW1vcnk7CQkJCQkJXAotLQkJCQkJCQkJCVwKLS0JYV9hbGxvY2F0ZWQgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCAyKTsJCQkJXAotLQlpZiAoYV9hbGxvY2F0ZWQgPD0gbikJCQkJCQlcCi0tCSAgYV9hbGxvY2F0ZWQgPSB4c3VtIChuLCAxKTsJCQkJCVwKLS0JbWVtb3J5X3NpemUgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCBzaXplb2YgKGFyZ3VtZW50KSk7CQlcCi0tCWlmIChzaXplX292ZXJmbG93X3AgKG1lbW9yeV9zaXplKSkJCQkJXAotLQkgIC8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLwkJCVwKLS0JICBnb3RvIG91dF9vZl9tZW1vcnk7CQkJCQkJXAotLQltZW1vcnkgPSAoYXJndW1lbnQgKikgKGEtPmFyZwkJCQkJXAotLQkJCSAgICAgICA/IHJlYWxsb2MgKGEtPmFyZywgbWVtb3J5X3NpemUpCQlcCi0tCQkJICAgICAgIDogbWFsbG9jIChtZW1vcnlfc2l6ZSkpOwkJCVwKLS0JaWYgKG1lbW9yeSA9PSBOVUxMKQkJCQkJCVwKLS0JICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8JCQkJCQlcCi0tCSAgZ290byBvdXRfb2ZfbWVtb3J5OwkJCQkJCVwKLS0JYS0+YXJnID0gbWVtb3J5OwkJCQkJCVwKLS0gICAgICB9CQkJCQkJCQkJXAotLSAgICB3aGlsZSAoYS0+Y291bnQgPD0gbikJCQkJCQlcCi0tICAgICAgYS0+YXJnW2EtPmNvdW50KytdLnR5cGUgPSBUWVBFX05PTkU7CQkJCVwKLS0gICAgaWYgKGEtPmFyZ1tuXS50eXBlID09IFRZUEVfTk9ORSkJCQkJCVwKLS0gICAgICBhLT5hcmdbbl0udHlwZSA9IChfdHlwZV8pOwkJCQkJXAotLSAgICBlbHNlIGlmIChhLT5hcmdbbl0udHlwZSAhPSAoX3R5cGVfKSkJCQkJXAotLSAgICAgIC8qIEFtYmlndW91cyB0eXBlIGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8JCQlcCi0tICAgICAgZ290byBlcnJvcjsJCQkJCQkJXAotLSAgfQotLQotLSAgd2hpbGUgKCpjcCAhPSAnXDAnKQotLSAgICB7Ci0tICAgICAgQ0hBUl9UIGMgPSAqY3ArKzsKLS0gICAgICBpZiAoYyA9PSAnJScpCi0tCXsKLS0JICBzaXplX3QgYXJnX2luZGV4ID0gQVJHX05PTkU7Ci0tCSAgRElSRUNUSVZFICpkcCA9ICZkLT5kaXJbZC0+Y291bnRdOyAvKiBwb2ludGVyIHRvIG5leHQgZGlyZWN0aXZlICovCi0tCi0tCSAgLyogSW5pdGlhbGl6ZSB0aGUgbmV4dCBkaXJlY3RpdmUuICAqLwotLQkgIGRwLT5kaXJfc3RhcnQgPSBjcCAtIDE7Ci0tCSAgZHAtPmZsYWdzID0gMDsKLS0JICBkcC0+d2lkdGhfc3RhcnQgPSBOVUxMOwotLQkgIGRwLT53aWR0aF9lbmQgPSBOVUxMOwotLQkgIGRwLT53aWR0aF9hcmdfaW5kZXggPSBBUkdfTk9ORTsKLS0JICBkcC0+cHJlY2lzaW9uX3N0YXJ0ID0gTlVMTDsKLS0JICBkcC0+cHJlY2lzaW9uX2VuZCA9IE5VTEw7Ci0tCSAgZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPSBBUkdfTk9ORTsKLS0JICBkcC0+YXJnX2luZGV4ID0gQVJHX05PTkU7Ci0tCi0tCSAgLyogVGVzdCBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCi0tCSAgaWYgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKLS0JICAgIHsKLS0JICAgICAgY29uc3QgQ0hBUl9UICpucDsKLS0KLS0JICAgICAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCi0tCQk7Ci0tCSAgICAgIGlmICgqbnAgPT0gJyQnKQotLQkJewotLQkJICBzaXplX3QgbiA9IDA7Ci0tCi0tCQkgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQotLQkJICAgIG4gPSB4c3VtICh4dGltZXMgKG4sIDEwKSwgKm5wIC0gJzAnKTsKLS0JCSAgaWYgKG4gPT0gMCkKLS0JCSAgICAvKiBQb3NpdGlvbmFsIGFyZ3VtZW50IDAuICAqLwotLQkJICAgIGdvdG8gZXJyb3I7Ci0tCQkgIGlmIChzaXplX292ZXJmbG93X3AgKG4pKQotLQkJICAgIC8qIG4gdG9vIGxhcmdlLCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkgbGF0ZXIuICAqLwotLQkJICAgIGdvdG8gZXJyb3I7Ci0tCQkgIGFyZ19pbmRleCA9IG4gLSAxOwotLQkJICBjcCA9IG5wICsgMTsKLS0JCX0KLS0JICAgIH0KLS0KLS0JICAvKiBSZWFkIHRoZSBmbGFncy4gICovCi0tCSAgZm9yICg7OykKLS0JICAgIHsKLS0JICAgICAgaWYgKCpjcCA9PSAnXCcnKQotLQkJewotLQkJICBkcC0+ZmxhZ3MgfD0gRkxBR19HUk9VUDsKLS0JCSAgY3ArKzsKLS0JCX0KLS0JICAgICAgZWxzZSBpZiAoKmNwID09ICctJykKLS0JCXsKLS0JCSAgZHAtPmZsYWdzIHw9IEZMQUdfTEVGVDsKLS0JCSAgY3ArKzsKLS0JCX0KLS0JICAgICAgZWxzZSBpZiAoKmNwID09ICcrJykKLS0JCXsKLS0JCSAgZHAtPmZsYWdzIHw9IEZMQUdfU0hPV1NJR047Ci0tCQkgIGNwKys7Ci0tCQl9Ci0tCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnICcpCi0tCQl7Ci0tCQkgIGRwLT5mbGFncyB8PSBGTEFHX1NQQUNFOwotLQkJICBjcCsrOwotLQkJfQotLQkgICAgICBlbHNlIGlmICgqY3AgPT0gJyMnKQotLQkJewotLQkJICBkcC0+ZmxhZ3MgfD0gRkxBR19BTFQ7Ci0tCQkgIGNwKys7Ci0tCQl9Ci0tCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnMCcpCi0tCQl7Ci0tCQkgIGRwLT5mbGFncyB8PSBGTEFHX1pFUk87Ci0tCQkgIGNwKys7Ci0tCQl9Ci0tCSAgICAgIGVsc2UKLS0JCWJyZWFrOwotLQkgICAgfQotLQotLQkgIC8qIFBhcnNlIHRoZSBmaWVsZCB3aWR0aC4gICovCi0tCSAgaWYgKCpjcCA9PSAnKicpCi0tCSAgICB7Ci0tCSAgICAgIGRwLT53aWR0aF9zdGFydCA9IGNwOwotLQkgICAgICBjcCsrOwotLQkgICAgICBkcC0+d2lkdGhfZW5kID0gY3A7Ci0tCSAgICAgIGlmIChtYXhfd2lkdGhfbGVuZ3RoIDwgMSkKLS0JCW1heF93aWR0aF9sZW5ndGggPSAxOwotLQotLQkgICAgICAvKiBUZXN0IGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8KLS0JICAgICAgaWYgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKLS0JCXsKLS0JCSAgY29uc3QgQ0hBUl9UICpucDsKLS0KLS0JCSAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCi0tCQkgICAgOwotLQkJICBpZiAoKm5wID09ICckJykKLS0JCSAgICB7Ci0tCQkgICAgICBzaXplX3QgbiA9IDA7Ci0tCi0tCQkgICAgICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKLS0JCQluID0geHN1bSAoeHRpbWVzIChuLCAxMCksICpucCAtICcwJyk7Ci0tCQkgICAgICBpZiAobiA9PSAwKQotLQkJCS8qIFBvc2l0aW9uYWwgYXJndW1lbnQgMC4gICovCi0tCQkJZ290byBlcnJvcjsKLS0JCSAgICAgIGlmIChzaXplX292ZXJmbG93X3AgKG4pKQotLQkJCS8qIG4gdG9vIGxhcmdlLCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkgbGF0ZXIuICAqLwotLQkJCWdvdG8gZXJyb3I7Ci0tCQkgICAgICBkcC0+d2lkdGhfYXJnX2luZGV4ID0gbiAtIDE7Ci0tCQkgICAgICBjcCA9IG5wICsgMTsKLS0JCSAgICB9Ci0tCQl9Ci0tCSAgICAgIGlmIChkcC0+d2lkdGhfYXJnX2luZGV4ID09IEFSR19OT05FKQotLQkJewotLQkJICBkcC0+d2lkdGhfYXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKLS0JCSAgaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggPT0gQVJHX05PTkUpCi0tCQkgICAgLyogYXJnX3Bvc24gd3JhcHBlZCBhcm91bmQuICAqLwotLQkJICAgIGdvdG8gZXJyb3I7Ci0tCQl9Ci0tCSAgICAgIFJFR0lTVEVSX0FSRyAoZHAtPndpZHRoX2FyZ19pbmRleCwgVFlQRV9JTlQpOwotLQkgICAgfQotLQkgIGVsc2UgaWYgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKLS0JICAgIHsKLS0JICAgICAgc2l6ZV90IHdpZHRoX2xlbmd0aDsKLS0KLS0JICAgICAgZHAtPndpZHRoX3N0YXJ0ID0gY3A7Ci0tCSAgICAgIGZvciAoOyAqY3AgPj0gJzAnICYmICpjcCA8PSAnOSc7IGNwKyspCi0tCQk7Ci0tCSAgICAgIGRwLT53aWR0aF9lbmQgPSBjcDsKLS0JICAgICAgd2lkdGhfbGVuZ3RoID0gZHAtPndpZHRoX2VuZCAtIGRwLT53aWR0aF9zdGFydDsKLS0JICAgICAgaWYgKG1heF93aWR0aF9sZW5ndGggPCB3aWR0aF9sZW5ndGgpCi0tCQltYXhfd2lkdGhfbGVuZ3RoID0gd2lkdGhfbGVuZ3RoOwotLQkgICAgfQotLQotLQkgIC8qIFBhcnNlIHRoZSBwcmVjaXNpb24uICAqLwotLQkgIGlmICgqY3AgPT0gJy4nKQotLQkgICAgewotLQkgICAgICBjcCsrOwotLQkgICAgICBpZiAoKmNwID09ICcqJykKLS0JCXsKLS0JCSAgZHAtPnByZWNpc2lvbl9zdGFydCA9IGNwIC0gMTsKLS0JCSAgY3ArKzsKLS0JCSAgZHAtPnByZWNpc2lvbl9lbmQgPSBjcDsKLS0JCSAgaWYgKG1heF9wcmVjaXNpb25fbGVuZ3RoIDwgMikKLS0JCSAgICBtYXhfcHJlY2lzaW9uX2xlbmd0aCA9IDI7Ci0tCi0tCQkgIC8qIFRlc3QgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQuICAqLwotLQkJICBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQotLQkJICAgIHsKLS0JCSAgICAgIGNvbnN0IENIQVJfVCAqbnA7Ci0tCi0tCQkgICAgICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKLS0JCQk7Ci0tCQkgICAgICBpZiAoKm5wID09ICckJykKLS0JCQl7Ci0tCQkJICBzaXplX3QgbiA9IDA7Ci0tCi0tCQkJICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKLS0JCQkgICAgbiA9IHhzdW0gKHh0aW1lcyAobiwgMTApLCAqbnAgLSAnMCcpOwotLQkJCSAgaWYgKG4gPT0gMCkKLS0JCQkgICAgLyogUG9zaXRpb25hbCBhcmd1bWVudCAwLiAgKi8KLS0JCQkgICAgZ290byBlcnJvcjsKLS0JCQkgIGlmIChzaXplX292ZXJmbG93X3AgKG4pKQotLQkJCSAgICAvKiBuIHRvbyBsYXJnZSwgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5Ci0tCQkJICAgICAgIGxhdGVyLiAgKi8KLS0JCQkgICAgZ290byBlcnJvcjsKLS0JCQkgIGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID0gbiAtIDE7Ci0tCQkJICBjcCA9IG5wICsgMTsKLS0JCQl9Ci0tCQkgICAgfQotLQkJICBpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPT0gQVJHX05PTkUpCi0tCQkgICAgewotLQkJICAgICAgZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPSBhcmdfcG9zbisrOwotLQkJICAgICAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID09IEFSR19OT05FKQotLQkJCS8qIGFyZ19wb3NuIHdyYXBwZWQgYXJvdW5kLiAgKi8KLS0JCQlnb3RvIGVycm9yOwotLQkJICAgIH0KLS0JCSAgUkVHSVNURVJfQVJHIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCwgVFlQRV9JTlQpOwotLQkJfQotLQkgICAgICBlbHNlCi0tCQl7Ci0tCQkgIHNpemVfdCBwcmVjaXNpb25fbGVuZ3RoOwotLQotLQkJICBkcC0+cHJlY2lzaW9uX3N0YXJ0ID0gY3AgLSAxOwotLQkJICBmb3IgKDsgKmNwID49ICcwJyAmJiAqY3AgPD0gJzknOyBjcCsrKQotLQkJICAgIDsKLS0JCSAgZHAtPnByZWNpc2lvbl9lbmQgPSBjcDsKLS0JCSAgcHJlY2lzaW9uX2xlbmd0aCA9IGRwLT5wcmVjaXNpb25fZW5kIC0gZHAtPnByZWNpc2lvbl9zdGFydDsKLS0JCSAgaWYgKG1heF9wcmVjaXNpb25fbGVuZ3RoIDwgcHJlY2lzaW9uX2xlbmd0aCkKLS0JCSAgICBtYXhfcHJlY2lzaW9uX2xlbmd0aCA9IHByZWNpc2lvbl9sZW5ndGg7Ci0tCQl9Ci0tCSAgICB9Ci0tCi0tCSAgewotLQkgICAgYXJnX3R5cGUgdHlwZTsKLS0KLS0JICAgIC8qIFBhcnNlIGFyZ3VtZW50IHR5cGUvc2l6ZSBzcGVjaWZpZXJzLiAgKi8KLS0JICAgIHsKLS0JICAgICAgaW50IGZsYWdzID0gMDsKLS0KLS0JICAgICAgZm9yICg7OykKLS0JCXsKLS0JCSAgaWYgKCpjcCA9PSAnaCcpCi0tCQkgICAgewotLQkJICAgICAgZmxhZ3MgfD0gKDEgPDwgKGZsYWdzICYgMSkpOwotLQkJICAgICAgY3ArKzsKLS0JCSAgICB9Ci0tCQkgIGVsc2UgaWYgKCpjcCA9PSAnTCcpCi0tCQkgICAgewotLQkJICAgICAgZmxhZ3MgfD0gNDsKLS0JCSAgICAgIGNwKys7Ci0tCQkgICAgfQotLQkJICBlbHNlIGlmICgqY3AgPT0gJ2wnKQotLQkJICAgIHsKLS0JCSAgICAgIGZsYWdzICs9IDg7Ci0tCQkgICAgICBjcCsrOwotLQkJICAgIH0KLS0JCSAgZWxzZSBpZiAoKmNwID09ICdqJykKLS0JCSAgICB7Ci0tCQkgICAgICBpZiAoc2l6ZW9mIChpbnRtYXhfdCkgPiBzaXplb2YgKGxvbmcpKQotLQkJCXsKLS0JCQkgIC8qIGludG1heF90ID0gbG9uZyBsb25nICovCi0tCQkJICBmbGFncyArPSAxNjsKLS0JCQl9Ci0tCQkgICAgICBlbHNlIGlmIChzaXplb2YgKGludG1heF90KSA+IHNpemVvZiAoaW50KSkKLS0JCQl7Ci0tCQkJICAvKiBpbnRtYXhfdCA9IGxvbmcgKi8KLS0JCQkgIGZsYWdzICs9IDg7Ci0tCQkJfQotLQkJICAgICAgY3ArKzsKLS0JCSAgICB9Ci0tCQkgIGVsc2UgaWYgKCpjcCA9PSAneicgfHwgKmNwID09ICdaJykKLS0JCSAgICB7Ci0tCQkgICAgICAvKiAneicgaXMgc3RhbmRhcmRpemVkIGluIElTTyBDIDk5LCBidXQgZ2xpYmMgdXNlcyAnWicKLS0JCQkgYmVjYXVzZSB0aGUgd2FybmluZyBmYWNpbGl0eSBpbiBnY2MtMi45NS4yIHVuZGVyc3RhbmRzCi0tCQkJIG9ubHkgJ1onIChzZWUgZ2NjLTIuOTUuMi9nY2MvYy1jb21tb24uYzoxNzg0KS4gICovCi0tCQkgICAgICBpZiAoc2l6ZW9mIChzaXplX3QpID4gc2l6ZW9mIChsb25nKSkKLS0JCQl7Ci0tCQkJICAvKiBzaXplX3QgPSBsb25nIGxvbmcgKi8KLS0JCQkgIGZsYWdzICs9IDE2OwotLQkJCX0KLS0JCSAgICAgIGVsc2UgaWYgKHNpemVvZiAoc2l6ZV90KSA+IHNpemVvZiAoaW50KSkKLS0JCQl7Ci0tCQkJICAvKiBzaXplX3QgPSBsb25nICovCi0tCQkJICBmbGFncyArPSA4OwotLQkJCX0KLS0JCSAgICAgIGNwKys7Ci0tCQkgICAgfQotLQkJICBlbHNlIGlmICgqY3AgPT0gJ3QnKQotLQkJICAgIHsKLS0JCSAgICAgIGlmIChzaXplb2YgKHB0cmRpZmZfdCkgPiBzaXplb2YgKGxvbmcpKQotLQkJCXsKLS0JCQkgIC8qIHB0cmRpZmZfdCA9IGxvbmcgbG9uZyAqLwotLQkJCSAgZmxhZ3MgKz0gMTY7Ci0tCQkJfQotLQkJICAgICAgZWxzZSBpZiAoc2l6ZW9mIChwdHJkaWZmX3QpID4gc2l6ZW9mIChpbnQpKQotLQkJCXsKLS0JCQkgIC8qIHB0cmRpZmZfdCA9IGxvbmcgKi8KLS0JCQkgIGZsYWdzICs9IDg7Ci0tCQkJfQotLQkJICAgICAgY3ArKzsKLS0JCSAgICB9Ci0tCQkgIGVsc2UKLS0JCSAgICBicmVhazsKLS0JCX0KLS0KLS0JICAgICAgLyogUmVhZCB0aGUgY29udmVyc2lvbiBjaGFyYWN0ZXIuICAqLwotLQkgICAgICBjID0gKmNwKys7Ci0tCSAgICAgIHN3aXRjaCAoYykKLS0JCXsKLS0JCWNhc2UgJ2QnOiBjYXNlICdpJzoKLS0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0tCQkgIC8qIElmICdsb25nIGxvbmcnIGV4aXN0cyBhbmQgaXMgbGFyZ2VyIHRoYW4gJ2xvbmcnOiAgKi8KLS0JCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQotLQkJICAgIHR5cGUgPSBUWVBFX0xPTkdMT05HSU5UOwotLQkJICBlbHNlCi0tI2VuZGlmCi0tCQkgIC8qIElmICdsb25nIGxvbmcnIGV4aXN0cyBhbmQgaXMgdGhlIHNhbWUgYXMgJ2xvbmcnLCB3ZSBwYXJzZQotLQkJICAgICAibGxkIiBpbnRvIFRZUEVfTE9OR0lOVC4gICovCi0tCQkgIGlmIChmbGFncyA+PSA4KQotLQkJICAgIHR5cGUgPSBUWVBFX0xPTkdJTlQ7Ci0tCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKLS0JCSAgICB0eXBlID0gVFlQRV9TQ0hBUjsKLS0JCSAgZWxzZSBpZiAoZmxhZ3MgJiAxKQotLQkJICAgIHR5cGUgPSBUWVBFX1NIT1JUOwotLQkJICBlbHNlCi0tCQkgICAgdHlwZSA9IFRZUEVfSU5UOwotLQkJICBicmVhazsKLS0JCWNhc2UgJ28nOiBjYXNlICd1JzogY2FzZSAneCc6IGNhc2UgJ1gnOgotLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLS0JCSAgLyogSWYgJ2xvbmcgbG9uZycgZXhpc3RzIGFuZCBpcyBsYXJnZXIgdGhhbiAnbG9uZyc6ICAqLwotLQkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCi0tCQkgICAgdHlwZSA9IFRZUEVfVUxPTkdMT05HSU5UOwotLQkJICBlbHNlCi0tI2VuZGlmCi0tCQkgIC8qIElmICd1bnNpZ25lZCBsb25nIGxvbmcnIGV4aXN0cyBhbmQgaXMgdGhlIHNhbWUgYXMKLS0JCSAgICAgJ3Vuc2lnbmVkIGxvbmcnLCB3ZSBwYXJzZSAibGx1IiBpbnRvIFRZUEVfVUxPTkdJTlQuICAqLwotLQkJICBpZiAoZmxhZ3MgPj0gOCkKLS0JCSAgICB0eXBlID0gVFlQRV9VTE9OR0lOVDsKLS0JCSAgZWxzZSBpZiAoZmxhZ3MgJiAyKQotLQkJICAgIHR5cGUgPSBUWVBFX1VDSEFSOwotLQkJICBlbHNlIGlmIChmbGFncyAmIDEpCi0tCQkgICAgdHlwZSA9IFRZUEVfVVNIT1JUOwotLQkJICBlbHNlCi0tCQkgICAgdHlwZSA9IFRZUEVfVUlOVDsKLS0JCSAgYnJlYWs7Ci0tCQljYXNlICdmJzogY2FzZSAnRic6IGNhc2UgJ2UnOiBjYXNlICdFJzogY2FzZSAnZyc6IGNhc2UgJ0cnOgotLQkJY2FzZSAnYSc6IGNhc2UgJ0EnOgotLQkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCi0tCQkgICAgdHlwZSA9IFRZUEVfTE9OR0RPVUJMRTsKLS0JCSAgZWxzZQotLQkJICAgIHR5cGUgPSBUWVBFX0RPVUJMRTsKLS0JCSAgYnJlYWs7Ci0tCQljYXNlICdjJzoKLS0JCSAgaWYgKGZsYWdzID49IDgpCi0tI2lmIEhBVkVfV0lOVF9UCi0tCQkgICAgdHlwZSA9IFRZUEVfV0lERV9DSEFSOwotLSNlbHNlCi0tCQkgICAgZ290byBlcnJvcjsKLS0jZW5kaWYKLS0JCSAgZWxzZQotLQkJICAgIHR5cGUgPSBUWVBFX0NIQVI7Ci0tCQkgIGJyZWFrOwotLSNpZiBIQVZFX1dJTlRfVAotLQkJY2FzZSAnQyc6Ci0tCQkgIHR5cGUgPSBUWVBFX1dJREVfQ0hBUjsKLS0JCSAgYyA9ICdjJzsKLS0JCSAgYnJlYWs7Ci0tI2VuZGlmCi0tCQljYXNlICdzJzoKLS0JCSAgaWYgKGZsYWdzID49IDgpCi0tI2lmIEhBVkVfV0NIQVJfVAotLQkJICAgIHR5cGUgPSBUWVBFX1dJREVfU1RSSU5HOwotLSNlbHNlCi0tCQkgICAgZ290byBlcnJvcjsKLS0jZW5kaWYKLS0JCSAgZWxzZQotLQkJICAgIHR5cGUgPSBUWVBFX1NUUklORzsKLS0JCSAgYnJlYWs7Ci0tI2lmIEhBVkVfV0NIQVJfVAotLQkJY2FzZSAnUyc6Ci0tCQkgIHR5cGUgPSBUWVBFX1dJREVfU1RSSU5HOwotLQkJICBjID0gJ3MnOwotLQkJICBicmVhazsKLS0jZW5kaWYKLS0JCWNhc2UgJ3AnOgotLQkJICB0eXBlID0gVFlQRV9QT0lOVEVSOwotLQkJICBicmVhazsKLS0JCWNhc2UgJ24nOgotLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLS0JCSAgLyogSWYgJ2xvbmcgbG9uZycgZXhpc3RzIGFuZCBpcyBsYXJnZXIgdGhhbiAnbG9uZyc6ICAqLwotLQkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCi0tCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUjsKLS0JCSAgZWxzZQotLSNlbmRpZgotLQkJICAvKiBJZiAnbG9uZyBsb25nJyBleGlzdHMgYW5kIGlzIHRoZSBzYW1lIGFzICdsb25nJywgd2UgcGFyc2UKLS0JCSAgICAgImxsbiIgaW50byBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUi4gICovCi0tCQkgIGlmIChmbGFncyA+PSA4KQotLQkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUjsKLS0JCSAgZWxzZSBpZiAoZmxhZ3MgJiAyKQotLQkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVI7Ci0tCQkgIGVsc2UgaWYgKGZsYWdzICYgMSkKLS0JCSAgICB0eXBlID0gVFlQRV9DT1VOVF9TSE9SVF9QT0lOVEVSOwotLQkJICBlbHNlCi0tCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfSU5UX1BPSU5URVI7Ci0tCQkgIGJyZWFrOwotLSNpZiBFTkFCTEVfVU5JU1RESU8KLS0JCS8qIFRoZSB1bmlzdGRpbyBleHRlbnNpb25zLiAgKi8KLS0JCWNhc2UgJ1UnOgotLQkJICBpZiAoZmxhZ3MgPj0gMTYpCi0tCQkgICAgdHlwZSA9IFRZUEVfVTMyX1NUUklORzsKLS0JCSAgZWxzZSBpZiAoZmxhZ3MgPj0gOCkKLS0JCSAgICB0eXBlID0gVFlQRV9VMTZfU1RSSU5HOwotLQkJICBlbHNlCi0tCQkgICAgdHlwZSA9IFRZUEVfVThfU1RSSU5HOwotLQkJICBicmVhazsKLS0jZW5kaWYKLS0JCWNhc2UgJyUnOgotLQkJICB0eXBlID0gVFlQRV9OT05FOwotLQkJICBicmVhazsKLS0JCWRlZmF1bHQ6Ci0tCQkgIC8qIFVua25vd24gY29udmVyc2lvbiBjaGFyYWN0ZXIuICAqLwotLQkJICBnb3RvIGVycm9yOwotLQkJfQotLQkgICAgfQotLQotLQkgICAgaWYgKHR5cGUgIT0gVFlQRV9OT05FKQotLQkgICAgICB7Ci0tCQlkcC0+YXJnX2luZGV4ID0gYXJnX2luZGV4OwotLQkJaWYgKGRwLT5hcmdfaW5kZXggPT0gQVJHX05PTkUpCi0tCQkgIHsKLS0JCSAgICBkcC0+YXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKLS0JCSAgICBpZiAoZHAtPmFyZ19pbmRleCA9PSBBUkdfTk9ORSkKLS0JCSAgICAgIC8qIGFyZ19wb3NuIHdyYXBwZWQgYXJvdW5kLiAgKi8KLS0JCSAgICAgIGdvdG8gZXJyb3I7Ci0tCQkgIH0KLS0JCVJFR0lTVEVSX0FSRyAoZHAtPmFyZ19pbmRleCwgdHlwZSk7Ci0tCSAgICAgIH0KLS0JICAgIGRwLT5jb252ZXJzaW9uID0gYzsKLS0JICAgIGRwLT5kaXJfZW5kID0gY3A7Ci0tCSAgfQotLQotLQkgIGQtPmNvdW50Kys7Ci0tCSAgaWYgKGQtPmNvdW50ID49IGRfYWxsb2NhdGVkKQotLQkgICAgewotLQkgICAgICBzaXplX3QgbWVtb3J5X3NpemU7Ci0tCSAgICAgIERJUkVDVElWRSAqbWVtb3J5OwotLQotLQkgICAgICBkX2FsbG9jYXRlZCA9IHh0aW1lcyAoZF9hbGxvY2F0ZWQsIDIpOwotLQkgICAgICBtZW1vcnlfc2l6ZSA9IHh0aW1lcyAoZF9hbGxvY2F0ZWQsIHNpemVvZiAoRElSRUNUSVZFKSk7Ci0tCSAgICAgIGlmIChzaXplX292ZXJmbG93X3AgKG1lbW9yeV9zaXplKSkKLS0JCS8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLwotLQkJZ290byBvdXRfb2ZfbWVtb3J5OwotLQkgICAgICBtZW1vcnkgPSAoRElSRUNUSVZFICopIHJlYWxsb2MgKGQtPmRpciwgbWVtb3J5X3NpemUpOwotLQkgICAgICBpZiAobWVtb3J5ID09IE5VTEwpCi0tCQkvKiBPdXQgb2YgbWVtb3J5LiAgKi8KLS0JCWdvdG8gb3V0X29mX21lbW9yeTsKLS0JICAgICAgZC0+ZGlyID0gbWVtb3J5OwotLQkgICAgfQotLQl9Ci0tI2lmIENIQVJfVF9PTkxZX0FTQ0lJCi0tICAgICAgZWxzZSBpZiAoIWNfaXNhc2NpaSAoYykpCi0tCXsKLS0JICAvKiBOb24tQVNDSUkgY2hhcmFjdGVyLiAgTm90IHN1cHBvcnRlZC4gICovCi0tCSAgZ290byBlcnJvcjsKLS0JfQotLSNlbmRpZgotLSAgICB9Ci0tICBkLT5kaXJbZC0+Y291bnRdLmRpcl9zdGFydCA9IGNwOwotLQotLSAgZC0+bWF4X3dpZHRoX2xlbmd0aCA9IG1heF93aWR0aF9sZW5ndGg7Ci0tICBkLT5tYXhfcHJlY2lzaW9uX2xlbmd0aCA9IG1heF9wcmVjaXNpb25fbGVuZ3RoOwotLSAgcmV0dXJuIDA7Ci0tCi0tZXJyb3I6Ci0tICBpZiAoYS0+YXJnKQotLSAgICBmcmVlIChhLT5hcmcpOwotLSAgaWYgKGQtPmRpcikKLS0gICAgZnJlZSAoZC0+ZGlyKTsKLS0gIGVycm5vID0gRUlOVkFMOwotLSAgcmV0dXJuIC0xOwotLQotLW91dF9vZl9tZW1vcnk6Ci0tICBpZiAoYS0+YXJnKQotLSAgICBmcmVlIChhLT5hcmcpOwotLSAgaWYgKGQtPmRpcikKLS0gICAgZnJlZSAoZC0+ZGlyKTsKLS1vdXRfb2ZfbWVtb3J5XzE6Ci0tICBlcnJubyA9IEVOT01FTTsKLS0gIHJldHVybiAtMTsKLS19Ci0tCi0tI3VuZGVmIFBSSU5URl9QQVJTRQotLSN1bmRlZiBESVJFQ1RJVkVTCi0tI3VuZGVmIERJUkVDVElWRQotLSN1bmRlZiBDSEFSX1RfT05MWV9BU0NJSQotLSN1bmRlZiBDSEFSX1QKLS0tLSBhL2ludGwvcHJpbnRmLXBhcnNlLmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDc1ICswLDAgQEAKLS0vKiBQYXJzZSBwcmludGYgZm9ybWF0IHN0cmluZy4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZm5kZWYgX1BSSU5URl9QQVJTRV9ICi0tI2RlZmluZSBfUFJJTlRGX1BBUlNFX0gKLS0KLS0jaW5jbHVkZSAicHJpbnRmLWFyZ3MuaCIKLS0KLS0KLS0vKiBGbGFncyAqLwotLSNkZWZpbmUgRkxBR19HUk9VUAkgMQkvKiAnIGZsYWcgKi8KLS0jZGVmaW5lIEZMQUdfTEVGVAkgMgkvKiAtIGZsYWcgKi8KLS0jZGVmaW5lIEZMQUdfU0hPV1NJR04JIDQJLyogKyBmbGFnICovCi0tI2RlZmluZSBGTEFHX1NQQUNFCSA4CS8qIHNwYWNlIGZsYWcgKi8KLS0jZGVmaW5lIEZMQUdfQUxUCTE2CS8qICMgZmxhZyAqLwotLSNkZWZpbmUgRkxBR19aRVJPCTMyCi0tCi0tLyogYXJnX2luZGV4IHZhbHVlIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudCBpcyBjb25zdW1lZC4gICovCi0tI2RlZmluZSBBUkdfTk9ORQkofihzaXplX3QpMCkKLS0KLS0vKiBBIHBhcnNlZCBkaXJlY3RpdmUuICAqLwotLXR5cGVkZWYgc3RydWN0Ci0tewotLSAgY29uc3QgY2hhciogZGlyX3N0YXJ0OwotLSAgY29uc3QgY2hhciogZGlyX2VuZDsKLS0gIGludCBmbGFnczsKLS0gIGNvbnN0IGNoYXIqIHdpZHRoX3N0YXJ0OwotLSAgY29uc3QgY2hhciogd2lkdGhfZW5kOwotLSAgc2l6ZV90IHdpZHRoX2FyZ19pbmRleDsKLS0gIGNvbnN0IGNoYXIqIHByZWNpc2lvbl9zdGFydDsKLS0gIGNvbnN0IGNoYXIqIHByZWNpc2lvbl9lbmQ7Ci0tICBzaXplX3QgcHJlY2lzaW9uX2FyZ19pbmRleDsKLS0gIGNoYXIgY29udmVyc2lvbjsgLyogZCBpIG8gdSB4IFggZiBlIEUgZyBHIGMgcyBwIG4gVSAlIGJ1dCBub3QgQyBTICovCi0tICBzaXplX3QgYXJnX2luZGV4OwotLX0KLS1jaGFyX2RpcmVjdGl2ZTsKLS0KLS0vKiBBIHBhcnNlZCBmb3JtYXQgc3RyaW5nLiAgKi8KLS10eXBlZGVmIHN0cnVjdAotLXsKLS0gIHNpemVfdCBjb3VudDsKLS0gIGNoYXJfZGlyZWN0aXZlICpkaXI7Ci0tICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aDsKLS0gIHNpemVfdCBtYXhfcHJlY2lzaW9uX2xlbmd0aDsKLS19Ci0tY2hhcl9kaXJlY3RpdmVzOwotLQotLQotLS8qIFBhcnNlcyB0aGUgZm9ybWF0IHN0cmluZy4gIEZpbGxzIGluIHRoZSBudW1iZXIgTiBvZiBkaXJlY3RpdmVzLCBhbmQgZmlsbHMKLS0gICBpbiBkaXJlY3RpdmVzWzBdLCAuLi4sIGRpcmVjdGl2ZXNbTi0xXSwgYW5kIHNldHMgZGlyZWN0aXZlc1tOXS5kaXJfc3RhcnQKLS0gICB0byB0aGUgZW5kIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAgQWxzbyBmaWxscyBpbiB0aGUgYXJnX3R5cGUgZmllbGRzIG9mIHRoZQotLSAgIGFyZ3VtZW50cyBhbmQgdGhlIG5lZWRlZCBjb3VudCBvZiBhcmd1bWVudHMuICAqLwotLSNpZmRlZiBTVEFUSUMKLS1TVEFUSUMKLS0jZWxzZQotLWV4dGVybgotLSNlbmRpZgotLWludCBwcmludGZfcGFyc2UgKGNvbnN0IGNoYXIgKmZvcm1hdCwgY2hhcl9kaXJlY3RpdmVzICpkLCBhcmd1bWVudHMgKmEpOwotLQotLSNlbmRpZiAvKiBfUFJJTlRGX1BBUlNFX0ggKi8KLS0tLSBhL2ludGwvcHJpbnRmLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDQyNyArMCwwIEBACi0tLyogRm9ybWF0dGVkIG91dHB1dCB0byBzdHJpbmdzLCB1c2luZyBQT1NJWC9YU0kgZm9ybWF0IHN0cmluZ3Mgd2l0aCBwb3NpdGlvbnMuCi0tICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA2LTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4sIDIwMDMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2lmZGVmIF9fR05VQ19fCi0tIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLS0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0tI2Vsc2UKLS0jIGlmZGVmIF9NU0NfVkVSCi0tIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0tIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0tIyBlbHNlCi0tIyAgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKLS0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0tIyAgZWxzZQotLSMgICBpZmRlZiBfQUlYCi0tICNwcmFnbWEgYWxsb2NhCi0tIyAgIGVsc2UKLS0jICAgIGlmbmRlZiBhbGxvY2EKLS1jaGFyICphbGxvY2EgKCk7Ci0tIyAgICBlbmRpZgotLSMgICBlbmRpZgotLSMgIGVuZGlmCi0tIyBlbmRpZgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxzdGRpby5oPgotLQotLSNpZiAhSEFWRV9QT1NJWF9QUklOVEYKLS0KLS0jaW5jbHVkZSA8ZXJybm8uaD4KLS0jaW5jbHVkZSA8bGltaXRzLmg+Ci0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0KLS0vKiBTb21lIHN5c3RlbXMsIGxpa2UgT1NGLzEgNC4wIGFuZCBXb2UzMiwgZG9uJ3QgaGF2ZSBFT1ZFUkZMT1cuICAqLwotLSNpZm5kZWYgRU9WRVJGTE9XCi0tIyBkZWZpbmUgRU9WRVJGTE9XIEUyQklHCi0tI2VuZGlmCi0tCi0tLyogV2hlbiBidWlsZGluZyBhIERMTCwgd2UgbXVzdCBleHBvcnQgc29tZSBmdW5jdGlvbnMuICBOb3RlIHRoYXQgYmVjYXVzZQotLSAgIHRoZSBmdW5jdGlvbnMgYXJlIG9ubHkgZGVmaW5lZCBmb3IgYmluYXJ5IGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdlCi0tICAgZG9uJ3QgbmVlZCB0byB1c2UgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGluIGFueSBjYXNlLiAgKi8KLS0jaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBCVUlMRElOR19ETEwKLS0jIGRlZmluZSBETExfRVhQT1JURUQgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0tI2Vsc2UKLS0jIGRlZmluZSBETExfRVhQT1JURUQKLS0jZW5kaWYKLS0KLS0jZGVmaW5lIFNUQVRJQyBzdGF0aWMKLS0KLS0vKiBUaGlzIG5lZWRzIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBsaWJnbnVpbnRsLmguaW4uICAqLwotLSNpZiBkZWZpbmVkIF9fTmV0QlNEX18gfHwgZGVmaW5lZCBfX0JFT1NfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18gfHwgZGVmaW5lZCBfX01JTkdXMzJfXwotLS8qIERvbid0IGJyZWFrIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsTSxOKSkpLgotLSAgIFRoaXMgcmVkZWZpbml0aW9uIGlzIG9ubHkgcG9zc2libGUgYmVjYXVzZSB0aGUgbGliYyBpbiBOZXRCU0QsIEN5Z3dpbiwKLS0gICBtaW5ndyBkb2VzIG5vdCBoYXZlIGEgZnVuY3Rpb24gX19wcmludGZfXy4gICovCi0tIyBkZWZpbmUgbGliaW50bF9wcmludGYgX19wcmludGZfXwotLSNlbmRpZgotLQotLS8qIERlZmluZSBhdXhpbGlhcnkgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJwcmludGYtYXJncy5oIi4gICovCi0tI2luY2x1ZGUgInByaW50Zi1hcmdzLmMiCi0tCi0tLyogRGVmaW5lIGF1eGlsaWFyeSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gInByaW50Zi1wYXJzZS5oIi4gICovCi0tI2luY2x1ZGUgInByaW50Zi1wYXJzZS5jIgotLQotLS8qIERlZmluZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gInZhc25wcmludGYuaCIuICAqLwotLSNkZWZpbmUgdmFzbnByaW50ZiBsaWJpbnRsX3Zhc25wcmludGYKLS0jaW5jbHVkZSAidmFzbnByaW50Zi5jIgotLSNpZiAwIC8qIG5vdCBuZWVkZWQgKi8KLS0jZGVmaW5lIGFzbnByaW50ZiBsaWJpbnRsX2FzbnByaW50ZgotLSNpbmNsdWRlICJhc25wcmludGYuYyIKLS0jZW5kaWYKLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX3ZmcHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotLXsKLS0gIGlmIChzdHJjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQotLSAgICByZXR1cm4gdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKLS0gIGVsc2UKLS0gICAgewotLSAgICAgIHNpemVfdCBsZW5ndGg7Ci0tICAgICAgY2hhciAqcmVzdWx0ID0gbGliaW50bF92YXNucHJpbnRmIChOVUxMLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotLSAgICAgIGludCByZXR2YWwgPSAtMTsKLS0gICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCi0tCXsKLS0JICBzaXplX3Qgd3JpdHRlbiA9IGZ3cml0ZSAocmVzdWx0LCAxLCBsZW5ndGgsIHN0cmVhbSk7Ci0tCSAgZnJlZSAocmVzdWx0KTsKLS0JICBpZiAod3JpdHRlbiA9PSBsZW5ndGgpCi0tCSAgICB7Ci0tCSAgICAgIGlmIChsZW5ndGggPiBJTlRfTUFYKQotLQkJZXJybm8gPSBFT1ZFUkZMT1c7Ci0tCSAgICAgIGVsc2UKLS0JCXJldHZhbCA9IGxlbmd0aDsKLS0JICAgIH0KLS0JfQotLSAgICAgIHJldHVybiByZXR2YWw7Ci0tICAgIH0KLS19Ci0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF9mcHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotLXsKLS0gIHZhX2xpc3QgYXJnczsKLS0gIGludCByZXR2YWw7Ci0tCi0tICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLS0gIHJldHZhbCA9IGxpYmludGxfdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKLS0gIHZhX2VuZCAoYXJncyk7Ci0tICByZXR1cm4gcmV0dmFsOwotLX0KLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX3ZwcmludGYgKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotLXsKLS0gIHJldHVybiBsaWJpbnRsX3ZmcHJpbnRmIChzdGRvdXQsIGZvcm1hdCwgYXJncyk7Ci0tfQotLQotLURMTF9FWFBPUlRFRAotLWludAotLWxpYmludGxfcHJpbnRmIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLS17Ci0tICB2YV9saXN0IGFyZ3M7Ci0tICBpbnQgcmV0dmFsOwotLQotLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0tICByZXR2YWwgPSBsaWJpbnRsX3ZwcmludGYgKGZvcm1hdCwgYXJncyk7Ci0tICB2YV9lbmQgKGFyZ3MpOwotLSAgcmV0dXJuIHJldHZhbDsKLS19Ci0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF92c3ByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLS17Ci0tICBpZiAoc3RyY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKLS0gICAgcmV0dXJuIHZzcHJpbnRmIChyZXN1bHRidWYsIGZvcm1hdCwgYXJncyk7Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICBzaXplX3QgbGVuZ3RoID0gKHNpemVfdCkgfjAgLyAoNCAqIHNpemVvZiAoY2hhcikpOwotLSAgICAgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAocmVzdWx0YnVmLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotLSAgICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmKQotLQl7Ci0tCSAgZnJlZSAocmVzdWx0KTsKLS0JICByZXR1cm4gLTE7Ci0tCX0KLS0gICAgICBpZiAobGVuZ3RoID4gSU5UX01BWCkKLS0JewotLQkgIGVycm5vID0gRU9WRVJGTE9XOwotLQkgIHJldHVybiAtMTsKLS0JfQotLSAgICAgIGVsc2UKLS0JcmV0dXJuIGxlbmd0aDsKLS0gICAgfQotLX0KLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX3NwcmludGYgKGNoYXIgKnJlc3VsdGJ1ZiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0tewotLSAgdmFfbGlzdCBhcmdzOwotLSAgaW50IHJldHZhbDsKLS0KLS0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotLSAgcmV0dmFsID0gbGliaW50bF92c3ByaW50ZiAocmVzdWx0YnVmLCBmb3JtYXQsIGFyZ3MpOwotLSAgdmFfZW5kIChhcmdzKTsKLS0gIHJldHVybiByZXR2YWw7Ci0tfQotLQotLSNpZiBIQVZFX1NOUFJJTlRGCi0tCi0tIyBpZiBIQVZFX0RFQ0xfX1NOUFJJTlRGCi0tICAgLyogV2luZG93cy4gICovCi0tIyAgZGVmaW5lIHN5c3RlbV92c25wcmludGYgX3ZzbnByaW50ZgotLSMgZWxzZQotLSAgIC8qIFVuaXguICAqLwotLSMgIGRlZmluZSBzeXN0ZW1fdnNucHJpbnRmIHZzbnByaW50ZgotLSMgZW5kaWYKLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX3ZzbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLS17Ci0tICBpZiAoc3RyY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKLS0gICAgcmV0dXJuIHN5c3RlbV92c25wcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgc2l6ZV90IG1heGxlbmd0aCA9IGxlbmd0aDsKLS0gICAgICBjaGFyICpyZXN1bHQgPSBsaWJpbnRsX3Zhc25wcmludGYgKHJlc3VsdGJ1ZiwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLS0gICAgICBpZiAocmVzdWx0ICE9IHJlc3VsdGJ1ZikKLS0JewotLQkgIGlmIChtYXhsZW5ndGggPiAwKQotLQkgICAgewotLQkgICAgICBzaXplX3QgcHJ1bmVkX2xlbmd0aCA9Ci0tCQkobGVuZ3RoIDwgbWF4bGVuZ3RoID8gbGVuZ3RoIDogbWF4bGVuZ3RoIC0gMSk7Ci0tCSAgICAgIG1lbWNweSAocmVzdWx0YnVmLCByZXN1bHQsIHBydW5lZF9sZW5ndGgpOwotLQkgICAgICByZXN1bHRidWZbcHJ1bmVkX2xlbmd0aF0gPSAnXDAnOwotLQkgICAgfQotLQkgIGZyZWUgKHJlc3VsdCk7Ci0tCX0KLS0gICAgICBpZiAobGVuZ3RoID4gSU5UX01BWCkKLS0JewotLQkgIGVycm5vID0gRU9WRVJGTE9XOwotLQkgIHJldHVybiAtMTsKLS0JfQotLSAgICAgIGVsc2UKLS0JcmV0dXJuIGxlbmd0aDsKLS0gICAgfQotLX0KLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX3NucHJpbnRmIChjaGFyICpyZXN1bHRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotLXsKLS0gIHZhX2xpc3QgYXJnczsKLS0gIGludCByZXR2YWw7Ci0tCi0tICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLS0gIHJldHZhbCA9IGxpYmludGxfdnNucHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLS0gIHZhX2VuZCAoYXJncyk7Ci0tICByZXR1cm4gcmV0dmFsOwotLX0KLS0KLS0jZW5kaWYKLS0KLS0jaWYgSEFWRV9BU1BSSU5URgotLQotLURMTF9FWFBPUlRFRAotLWludAotLWxpYmludGxfdmFzcHJpbnRmIChjaGFyICoqcmVzdWx0cCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi0tewotLSAgc2l6ZV90IGxlbmd0aDsKLS0gIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAoTlVMTCwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLS0gIGlmIChyZXN1bHQgPT0gTlVMTCkKLS0gICAgcmV0dXJuIC0xOwotLSAgaWYgKGxlbmd0aCA+IElOVF9NQVgpCi0tICAgIHsKLS0gICAgICBmcmVlIChyZXN1bHQpOwotLSAgICAgIGVycm5vID0gRU9WRVJGTE9XOwotLSAgICAgIHJldHVybiAtMTsKLS0gICAgfQotLSAgKnJlc3VsdHAgPSByZXN1bHQ7Ci0tICByZXR1cm4gbGVuZ3RoOwotLX0KLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX2FzcHJpbnRmIChjaGFyICoqcmVzdWx0cCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0tewotLSAgdmFfbGlzdCBhcmdzOwotLSAgaW50IHJldHZhbDsKLS0KLS0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotLSAgcmV0dmFsID0gbGliaW50bF92YXNwcmludGYgKHJlc3VsdHAsIGZvcm1hdCwgYXJncyk7Ci0tICB2YV9lbmQgKGFyZ3MpOwotLSAgcmV0dXJuIHJldHZhbDsKLS19Ci0tCi0tI2VuZGlmCi0tCi0tI2lmIEhBVkVfRldQUklOVEYKLS0KLS0jaW5jbHVkZSA8d2NoYXIuaD4KLS0KLS0jZGVmaW5lIFdJREVfQ0hBUl9WRVJTSU9OIDEKLS0KLS0jaW5jbHVkZSAid3ByaW50Zi1wYXJzZS5oIgotLS8qIERlZmluZSBhdXhpbGlhcnkgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJ3cHJpbnRmLXBhcnNlLmgiLiAgKi8KLS0jZGVmaW5lIENIQVJfVCB3Y2hhcl90Ci0tI2RlZmluZSBESVJFQ1RJVkUgd2NoYXJfdF9kaXJlY3RpdmUKLS0jZGVmaW5lIERJUkVDVElWRVMgd2NoYXJfdF9kaXJlY3RpdmVzCi0tI2RlZmluZSBQUklOVEZfUEFSU0Ugd3ByaW50Zl9wYXJzZQotLSNpbmNsdWRlICJwcmludGYtcGFyc2UuYyIKLS0KLS0vKiBEZWZpbmUgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJ2YXNucHJpbnRmLmgiLiAgKi8KLS0jZGVmaW5lIHZhc253cHJpbnRmIGxpYmludGxfdmFzbndwcmludGYKLS0jaW5jbHVkZSAidmFzbnByaW50Zi5jIgotLSNpZiAwIC8qIG5vdCBuZWVkZWQgKi8KLS0jZGVmaW5lIGFzbndwcmludGYgbGliaW50bF9hc253cHJpbnRmCi0tI2luY2x1ZGUgImFzbnByaW50Zi5jIgotLSNlbmRpZgotLQotLSMgaWYgSEFWRV9ERUNMX19TTldQUklOVEYKLS0gICAvKiBXaW5kb3dzLiAgKi8KLS0jICBkZWZpbmUgc3lzdGVtX3Zzd3ByaW50ZiBfdnNud3ByaW50ZgotLSMgZWxzZQotLSAgIC8qIFVuaXguICAqLwotLSMgIGRlZmluZSBzeXN0ZW1fdnN3cHJpbnRmIHZzd3ByaW50ZgotLSMgZW5kaWYKLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX3Zmd3ByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLS17Ci0tICBpZiAod2NzY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKLS0gICAgcmV0dXJuIHZmd3ByaW50ZiAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOwotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgc2l6ZV90IGxlbmd0aDsKLS0gICAgICB3Y2hhcl90ICpyZXN1bHQgPSBsaWJpbnRsX3Zhc253cHJpbnRmIChOVUxMLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotLSAgICAgIGludCByZXR2YWwgPSAtMTsKLS0gICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCi0tCXsKLS0JICBzaXplX3QgaTsKLS0JICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0tCSAgICBpZiAoZnB1dHdjIChyZXN1bHRbaV0sIHN0cmVhbSkgPT0gV0VPRikKLS0JICAgICAgYnJlYWs7Ci0tCSAgZnJlZSAocmVzdWx0KTsKLS0JICBpZiAoaSA9PSBsZW5ndGgpCi0tCSAgICB7Ci0tCSAgICAgIGlmIChsZW5ndGggPiBJTlRfTUFYKQotLQkJZXJybm8gPSBFT1ZFUkZMT1c7Ci0tCSAgICAgIGVsc2UKLS0JCXJldHZhbCA9IGxlbmd0aDsKLS0JICAgIH0KLS0JfQotLSAgICAgIHJldHVybiByZXR2YWw7Ci0tICAgIH0KLS19Ci0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF9md3ByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLikKLS17Ci0tICB2YV9saXN0IGFyZ3M7Ci0tICBpbnQgcmV0dmFsOwotLQotLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0tICByZXR2YWwgPSBsaWJpbnRsX3Zmd3ByaW50ZiAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOwotLSAgdmFfZW5kIChhcmdzKTsKLS0gIHJldHVybiByZXR2YWw7Ci0tfQotLQotLURMTF9FWFBPUlRFRAotLWludAotLWxpYmludGxfdndwcmludGYgKGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotLXsKLS0gIHJldHVybiBsaWJpbnRsX3Zmd3ByaW50ZiAoc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOwotLX0KLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX3dwcmludGYgKGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKQotLXsKLS0gIHZhX2xpc3QgYXJnczsKLS0gIGludCByZXR2YWw7Ci0tCi0tICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLS0gIHJldHZhbCA9IGxpYmludGxfdndwcmludGYgKGZvcm1hdCwgYXJncyk7Ci0tICB2YV9lbmQgKGFyZ3MpOwotLSAgcmV0dXJuIHJldHZhbDsKLS19Ci0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF92c3dwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi0tewotLSAgaWYgKHdjc2NociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCi0tICAgIHJldHVybiBzeXN0ZW1fdnN3cHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLS0gIGVsc2UKLS0gICAgewotLSAgICAgIHNpemVfdCBtYXhsZW5ndGggPSBsZW5ndGg7Ci0tICAgICAgd2NoYXJfdCAqcmVzdWx0ID0gbGliaW50bF92YXNud3ByaW50ZiAocmVzdWx0YnVmLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotLSAgICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmKQotLQl7Ci0tCSAgaWYgKG1heGxlbmd0aCA+IDApCi0tCSAgICB7Ci0tCSAgICAgIHNpemVfdCBwcnVuZWRfbGVuZ3RoID0KLS0JCShsZW5ndGggPCBtYXhsZW5ndGggPyBsZW5ndGggOiBtYXhsZW5ndGggLSAxKTsKLS0JICAgICAgbWVtY3B5IChyZXN1bHRidWYsIHJlc3VsdCwgcHJ1bmVkX2xlbmd0aCAqIHNpemVvZiAod2NoYXJfdCkpOwotLQkgICAgICByZXN1bHRidWZbcHJ1bmVkX2xlbmd0aF0gPSAwOwotLQkgICAgfQotLQkgIGZyZWUgKHJlc3VsdCk7Ci0tCSAgLyogVW5saWtlIHZzbnByaW50Ziwgd2hpY2ggaGFzIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlciB0aGF0Ci0tCSAgICAgd291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGlmIHRoZSByZXN1bHRidWYgaGFkIGJlZW4gc3VmZmljaWVudGx5Ci0tCSAgICAgbGFyZ2UsIHRoZSB2c3dwcmludGYgZnVuY3Rpb24gaGFzIHRvIHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmCi0tCSAgICAgdGhlIHJlc3VsdGJ1ZiB3YXMgbm90IHN1ZmZpY2llbnRseSBsYXJnZS4gICovCi0tCSAgaWYgKGxlbmd0aCA+PSBtYXhsZW5ndGgpCi0tCSAgICByZXR1cm4gLTE7Ci0tCX0KLS0gICAgICBpZiAobGVuZ3RoID4gSU5UX01BWCkKLS0JewotLQkgIGVycm5vID0gRU9WRVJGTE9XOwotLQkgIHJldHVybiAtMTsKLS0JfQotLSAgICAgIGVsc2UKLS0JcmV0dXJuIGxlbmd0aDsKLS0gICAgfQotLX0KLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX3N3cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKQotLXsKLS0gIHZhX2xpc3QgYXJnczsKLS0gIGludCByZXR2YWw7Ci0tCi0tICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLS0gIHJldHZhbCA9IGxpYmludGxfdnN3cHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLS0gIHZhX2VuZCAoYXJncyk7Ci0tICByZXR1cm4gcmV0dmFsOwotLX0KLS0KLS0jZW5kaWYKLS0KLS0jZW5kaWYKLS0tLSBhL2ludGwvcmVmLWFkZC5zaW4KLSsrKyAvZGV2L251bGwKLUBAIC0xLDMxICswLDAgQEAKLS0jIEFkZCB0aGlzIHBhY2thZ2UgdG8gYSBsaXN0IG9mIHJlZmVyZW5jZXMgc3RvcmVkIGluIGEgdGV4dCBmaWxlLgotLSMKLS0jICAgQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSMKLS0jICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0jICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tIyAgIGFueSBsYXRlciB2ZXJzaW9uLgotLSMKLS0jICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLSMKLS0jICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0jICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSMgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tIyAgIFVTQS4KLS0jCi0tIyBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPi4KLS0jCi0tL14jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTogLyB7Ci0tICBzLyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOi8vCi0tICB0YQotLSAgOmEKLS0gIHMvIEBQQUNLQUdFQCAvIEBQQUNLQUdFQCAvCi0tICB0YgotLSAgcy8gJC8gQFBBQ0tBR0VAIC8KLS0gIDpiCi0tICBzL14vIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6LwotLX0KLS0tLSBhL2ludGwvcmVmLWRlbC5zaW4KLSsrKyAvZGV2L251bGwKLUBAIC0xLDI2ICswLDAgQEAKLS0jIFJlbW92ZSB0aGlzIHBhY2thZ2UgZnJvbSBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBzdG9yZWQgaW4gYSB0ZXh0IGZpbGUuCi0tIwotLSMgICBDb3B5cmlnaHQgKEMpIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tIwotLSMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0jICAgYW55IGxhdGVyIHZlcnNpb24uCi0tIwotLSMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0jICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0jICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0jICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tIwotLSMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tIyAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0jICAgVVNBLgotLSMKLS0jIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxoYWlibGVAY2xpc3AuY29ucy5vcmc+LgotLSMKLS0vXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAvIHsKLS0gIHMvIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6Ly8KLS0gIHMvIEBQQUNLQUdFQCAvIC8KLS0gIHMvXi8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovCi0tfQotLS0tIGEvaW50bC9yZWxvY2F0YWJsZS5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw0NjggKzAsMCBAQAotLS8qIFByb3ZpZGUgcmVsb2NhdGFibGUgcGFja2FnZXMuCi0tICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4sIDIwMDMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0KLS0vKiBUZWxsIGdsaWJjJ3MgPHN0ZGlvLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIGdldGxpbmUoKS4KLS0gICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKLS0gICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCi0tI2lmbmRlZiBfR05VX1NPVVJDRQotLSMgZGVmaW5lIF9HTlVfU09VUkNFCTEKLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0tCi0tLyogU3BlY2lmaWNhdGlvbi4gICovCi0tI2luY2x1ZGUgInJlbG9jYXRhYmxlLmgiCi0tCi0tI2lmIEVOQUJMRV9SRUxPQ0FUQUJMRQotLQotLSNpbmNsdWRlIDxzdGRkZWYuaD4KLS0jaW5jbHVkZSA8c3RkaW8uaD4KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tI2luY2x1ZGUgPHN0cmluZy5oPgotLQotLSNpZmRlZiBOT19YTUFMTE9DCi0tIyBkZWZpbmUgeG1hbGxvYyBtYWxsb2MKLS0jZWxzZQotLSMgaW5jbHVkZSAieGFsbG9jLmgiCi0tI2VuZGlmCi0tCi0tI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19DWUdXSU5fXwotLSMgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLS0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLS0jZW5kaWYKLS0KLS0jaWYgREVQRU5EU19PTl9MSUJDSEFSU0VUCi0tIyBpbmNsdWRlIDxsaWJjaGFyc2V0Lmg+Ci0tI2VuZGlmCi0tI2lmIERFUEVORFNfT05fTElCSUNPTlYgJiYgSEFWRV9JQ09OVgotLSMgaW5jbHVkZSA8aWNvbnYuaD4KLS0jZW5kaWYKLS0jaWYgREVQRU5EU19PTl9MSUJJTlRMICYmIEVOQUJMRV9OTFMKLS0jIGluY2x1ZGUgPGxpYmludGwuaD4KLS0jZW5kaWYKLS0KLS0vKiBGYWtlZCBjaGVhcCAnYm9vbCcuICAqLwotLSN1bmRlZiBib29sCi0tI3VuZGVmIGZhbHNlCi0tI3VuZGVmIHRydWUKLS0jZGVmaW5lIGJvb2wgaW50Ci0tI2RlZmluZSBmYWxzZSAwCi0tI2RlZmluZSB0cnVlIDEKLS0KLS0vKiBQYXRobmFtZSBzdXBwb3J0LgotLSAgIElTU0xBU0goQykgICAgICAgICAgIHRlc3RzIHdoZXRoZXIgQyBpcyBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgY2hhcmFjdGVyLgotLSAgIElTX1BBVEhfV0lUSF9ESVIoUCkgIHRlc3RzIHdoZXRoZXIgUCBjb250YWlucyBhIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uLgotLSAqLwotLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCi0tICAvKiBXaW4zMiwgQ3lnd2luLCBPUy8yLCBET1MgKi8KLS0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQotLSMgZGVmaW5lIEhBU19ERVZJQ0UoUCkgXAotLSAgICAoKCgoUClbMF0gPj0gJ0EnICYmIChQKVswXSA8PSAnWicpIHx8ICgoUClbMF0gPj0gJ2EnICYmIChQKVswXSA8PSAneicpKSBcCi0tICAgICAmJiAoUClbMV0gPT0gJzonKQotLSMgZGVmaW5lIElTX1BBVEhfV0lUSF9ESVIoUCkgXAotLSAgICAoc3RyY2hyIChQLCAnLycpICE9IE5VTEwgfHwgc3RyY2hyIChQLCAnXFwnKSAhPSBOVUxMIHx8IEhBU19ERVZJQ0UgKFApKQotLSMgZGVmaW5lIEZJTEVfU1lTVEVNX1BSRUZJWF9MRU4oUCkgKEhBU19ERVZJQ0UgKFApID8gMiA6IDApCi0tI2Vsc2UKLS0gIC8qIFVuaXggKi8KLS0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nKQotLSMgZGVmaW5lIElTX1BBVEhfV0lUSF9ESVIoUCkgKHN0cmNociAoUCwgJy8nKSAhPSBOVUxMKQotLSMgZGVmaW5lIEZJTEVfU1lTVEVNX1BSRUZJWF9MRU4oUCkgMAotLSNlbmRpZgotLQotLS8qIE9yaWdpbmFsIGluc3RhbGxhdGlvbiBwcmVmaXguICAqLwotLXN0YXRpYyBjaGFyICpvcmlnX3ByZWZpeDsKLS1zdGF0aWMgc2l6ZV90IG9yaWdfcHJlZml4X2xlbjsKLS0vKiBDdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXguICAqLwotLXN0YXRpYyBjaGFyICpjdXJyX3ByZWZpeDsKLS1zdGF0aWMgc2l6ZV90IGN1cnJfcHJlZml4X2xlbjsKLS0vKiBUaGVzZSBwcmVmaXhlcyBkbyBub3QgZW5kIGluIGEgc2xhc2guICBBbnl0aGluZyB0aGF0IHdpbGwgYmUgY29uY2F0ZW5hdGVkCi0tICAgdG8gdGhlbSBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaC4gICovCi0tCi0tLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhpcyBtb2R1bGUuCi0tICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKLS0gICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAotLSAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKLS0gICBpbnN0ZWFkIG9mICIvIikuICAqLwotLXN0YXRpYyB2b2lkCi0tc2V0X3RoaXNfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4X2FyZywKLS0JCQkgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXhfYXJnKQotLXsKLS0gIGlmIChvcmlnX3ByZWZpeF9hcmcgIT0gTlVMTCAmJiBjdXJyX3ByZWZpeF9hcmcgIT0gTlVMTAotLSAgICAgIC8qIE9wdGltaXphdGlvbjogaWYgb3JpZ19wcmVmaXggYW5kIGN1cnJfcHJlZml4IGFyZSBlcXVhbCwgdGhlCi0tCSByZWxvY2F0aW9uIGlzIGEgbm9wLiAgKi8KLS0gICAgICAmJiBzdHJjbXAgKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKSAhPSAwKQotLSAgICB7Ci0tICAgICAgLyogRHVwbGljYXRlIHRoZSBhcmd1bWVudCBzdHJpbmdzLiAgKi8KLS0gICAgICBjaGFyICptZW1vcnk7Ci0tCi0tICAgICAgb3JpZ19wcmVmaXhfbGVuID0gc3RybGVuIChvcmlnX3ByZWZpeF9hcmcpOwotLSAgICAgIGN1cnJfcHJlZml4X2xlbiA9IHN0cmxlbiAoY3Vycl9wcmVmaXhfYXJnKTsKLS0gICAgICBtZW1vcnkgPSAoY2hhciAqKSB4bWFsbG9jIChvcmlnX3ByZWZpeF9sZW4gKyAxICsgY3Vycl9wcmVmaXhfbGVuICsgMSk7Ci0tI2lmZGVmIE5PX1hNQUxMT0MKLS0gICAgICBpZiAobWVtb3J5ICE9IE5VTEwpCi0tI2VuZGlmCi0tCXsKLS0JICBtZW1jcHkgKG1lbW9yeSwgb3JpZ19wcmVmaXhfYXJnLCBvcmlnX3ByZWZpeF9sZW4gKyAxKTsKLS0JICBvcmlnX3ByZWZpeCA9IG1lbW9yeTsKLS0JICBtZW1vcnkgKz0gb3JpZ19wcmVmaXhfbGVuICsgMTsKLS0JICBtZW1jcHkgKG1lbW9yeSwgY3Vycl9wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9sZW4gKyAxKTsKLS0JICBjdXJyX3ByZWZpeCA9IG1lbW9yeTsKLS0JICByZXR1cm47Ci0tCX0KLS0gICAgfQotLSAgb3JpZ19wcmVmaXggPSBOVUxMOwotLSAgY3Vycl9wcmVmaXggPSBOVUxMOwotLSAgLyogRG9uJ3Qgd29ycnkgYWJvdXQgd2FzdGVkIG1lbW9yeSBoZXJlIC0gdGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IG9ubHkKLS0gICAgIGNhbGxlZCBvbmNlLiAgKi8KLS19Ci0tCi0tLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCi0tICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKLS0gICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAotLSAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKLS0gICBpbnN0ZWFkIG9mICIvIikuICAqLwotLXZvaWQKLS1zZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4X2FyZywgY29uc3QgY2hhciAqY3Vycl9wcmVmaXhfYXJnKQotLXsKLS0gIHNldF90aGlzX3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7Ci0tCi0tICAvKiBOb3cgbm90aWZ5IGFsbCBkZXBlbmRlbnQgbGlicmFyaWVzLiAgKi8KLS0jaWYgREVQRU5EU19PTl9MSUJDSEFSU0VUCi0tICBsaWJjaGFyc2V0X3NldF9yZWxvY2F0aW9uX3ByZWZpeCAob3JpZ19wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9hcmcpOwotLSNlbmRpZgotLSNpZiBERVBFTkRTX09OX0xJQklDT05WICYmIEhBVkVfSUNPTlYgJiYgX0xJQklDT05WX1ZFUlNJT04gPj0gMHgwMTA5Ci0tICBsaWJpY29udl9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKLS0jZW5kaWYKLS0jaWYgREVQRU5EU19PTl9MSUJJTlRMICYmIEVOQUJMRV9OTFMgJiYgZGVmaW5lZCBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeAotLSAgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKLS0jZW5kaWYKLS19Ci0tCi0tI2lmICFkZWZpbmVkIElOX0xJQlJBUlkgfHwgKGRlZmluZWQgUElDICYmIGRlZmluZWQgSU5TVEFMTERJUikKLS0KLS0vKiBDb252ZW5pZW5jZSBmdW5jdGlvbjoKLS0gICBDb21wdXRlcyB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwKLS0gICBpbnN0YWxsYXRpb24gcHJlZml4LCB0aGUgb3JpZ2luYWwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBhIHBhcnRpY3VsYXIKLS0gICBmaWxlLCBhbmQgdGhlIGN1cnJlbnQgcGF0aG5hbWUgb2YgdGhpcyBmaWxlLiAgUmV0dXJucyBOVUxMIHVwb24gZmFpbHVyZS4gICovCi0tI2lmZGVmIElOX0xJQlJBUlkKLS0jZGVmaW5lIGNvbXB1dGVfY3Vycl9wcmVmaXggbG9jYWxfY29tcHV0ZV9jdXJyX3ByZWZpeAotLXN0YXRpYwotLSNlbmRpZgotLWNvbnN0IGNoYXIgKgotLWNvbXB1dGVfY3Vycl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbHByZWZpeCwKLS0JCSAgICAgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyLAotLQkJICAgICBjb25zdCBjaGFyICpjdXJyX3BhdGhuYW1lKQotLXsKLS0gIGNvbnN0IGNoYXIgKmN1cnJfaW5zdGFsbGRpcjsKLS0gIGNvbnN0IGNoYXIgKnJlbF9pbnN0YWxsZGlyOwotLQotLSAgaWYgKGN1cnJfcGF0aG5hbWUgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tCi0tICAvKiBEZXRlcm1pbmUgdGhlIHJlbGF0aXZlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIHJlbGF0aXZlIHRvIHRoZSBwcmVmaXguCi0tICAgICBUaGlzIGlzIHNpbXBseSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9yaWdfaW5zdGFsbHByZWZpeCBhbmQKLS0gICAgIG9yaWdfaW5zdGFsbGRpci4gICovCi0tICBpZiAoc3RybmNtcCAob3JpZ19pbnN0YWxscHJlZml4LCBvcmlnX2luc3RhbGxkaXIsIHN0cmxlbiAob3JpZ19pbnN0YWxscHJlZml4KSkKLS0gICAgICAhPSAwKQotLSAgICAvKiBTaG91bGRuJ3QgaGFwcGVuIC0gbm90aGluZyBzaG91bGQgYmUgaW5zdGFsbGVkIG91dHNpZGUgJChwcmVmaXgpLiAgKi8KLS0gICAgcmV0dXJuIE5VTEw7Ci0tICByZWxfaW5zdGFsbGRpciA9IG9yaWdfaW5zdGFsbGRpciArIHN0cmxlbiAob3JpZ19pbnN0YWxscHJlZml4KTsKLS0KLS0gIC8qIERldGVybWluZSB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiAgKi8KLS0gIHsKLS0gICAgY29uc3QgY2hhciAqcF9iYXNlID0gY3Vycl9wYXRobmFtZSArIEZJTEVfU1lTVEVNX1BSRUZJWF9MRU4gKGN1cnJfcGF0aG5hbWUpOwotLSAgICBjb25zdCBjaGFyICpwID0gY3Vycl9wYXRobmFtZSArIHN0cmxlbiAoY3Vycl9wYXRobmFtZSk7Ci0tICAgIGNoYXIgKnE7Ci0tCi0tICAgIHdoaWxlIChwID4gcF9iYXNlKQotLSAgICAgIHsKLS0JcC0tOwotLQlpZiAoSVNTTEFTSCAoKnApKQotLQkgIGJyZWFrOwotLSAgICAgIH0KLS0KLS0gICAgcSA9IChjaGFyICopIHhtYWxsb2MgKHAgLSBjdXJyX3BhdGhuYW1lICsgMSk7Ci0tI2lmZGVmIE5PX1hNQUxMT0MKLS0gICAgaWYgKHEgPT0gTlVMTCkKLS0gICAgICByZXR1cm4gTlVMTDsKLS0jZW5kaWYKLS0gICAgbWVtY3B5IChxLCBjdXJyX3BhdGhuYW1lLCBwIC0gY3Vycl9wYXRobmFtZSk7Ci0tICAgIHFbcCAtIGN1cnJfcGF0aG5hbWVdID0gJ1wwJzsKLS0gICAgY3Vycl9pbnN0YWxsZGlyID0gcTsKLS0gIH0KLS0KLS0gIC8qIENvbXB1dGUgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCBieSByZW1vdmluZyB0aGUgdHJhaWxpbmcKLS0gICAgIHJlbF9pbnN0YWxsZGlyIGZyb20gaXQuICAqLwotLSAgewotLSAgICBjb25zdCBjaGFyICpycCA9IHJlbF9pbnN0YWxsZGlyICsgc3RybGVuIChyZWxfaW5zdGFsbGRpcik7Ci0tICAgIGNvbnN0IGNoYXIgKmNwID0gY3Vycl9pbnN0YWxsZGlyICsgc3RybGVuIChjdXJyX2luc3RhbGxkaXIpOwotLSAgICBjb25zdCBjaGFyICpjcF9iYXNlID0KLS0gICAgICBjdXJyX2luc3RhbGxkaXIgKyBGSUxFX1NZU1RFTV9QUkVGSVhfTEVOIChjdXJyX2luc3RhbGxkaXIpOwotLQotLSAgICB3aGlsZSAocnAgPiByZWxfaW5zdGFsbGRpciAmJiBjcCA+IGNwX2Jhc2UpCi0tICAgICAgewotLQlib29sIHNhbWUgPSBmYWxzZTsKLS0JY29uc3QgY2hhciAqcnBpID0gcnA7Ci0tCWNvbnN0IGNoYXIgKmNwaSA9IGNwOwotLQotLQl3aGlsZSAocnBpID4gcmVsX2luc3RhbGxkaXIgJiYgY3BpID4gY3BfYmFzZSkKLS0JICB7Ci0tCSAgICBycGktLTsKLS0JICAgIGNwaS0tOwotLQkgICAgaWYgKElTU0xBU0ggKCpycGkpIHx8IElTU0xBU0ggKCpjcGkpKQotLQkgICAgICB7Ci0tCQlpZiAoSVNTTEFTSCAoKnJwaSkgJiYgSVNTTEFTSCAoKmNwaSkpCi0tCQkgIHNhbWUgPSB0cnVlOwotLQkJYnJlYWs7Ci0tCSAgICAgIH0KLS0JICAgIC8qIERvIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbiBpZiB0aGUgZmlsZXN5c3RlbSBpcyBhbHdheXMgb3IKLS0JICAgICAgIG9mdGVuIGNhc2UtaW5zZW5zaXRpdmUuICBJdCdzIGJldHRlciB0byBhY2NlcHQgdGhlIGNvbXBhcmlzb24KLS0JICAgICAgIGlmIHRoZSBkaWZmZXJlbmNlIGlzIG9ubHkgaW4gY2FzZSwgcmF0aGVyIHRoYW4gdG8gZmFpbC4gICovCi0tI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19DWUdXSU5fXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KLS0JICAgIC8qIFdpbjMyLCBDeWd3aW4sIE9TLzIsIERPUyAtIGNhc2UgaW5zaWduaWZpY2FudCBmaWxlc3lzdGVtICovCi0tCSAgICBpZiAoKCpycGkgPj0gJ2EnICYmICpycGkgPD0gJ3onID8gKnJwaSAtICdhJyArICdBJyA6ICpycGkpCi0tCQkhPSAoKmNwaSA+PSAnYScgJiYgKmNwaSA8PSAneicgPyAqY3BpIC0gJ2EnICsgJ0EnIDogKmNwaSkpCi0tCSAgICAgIGJyZWFrOwotLSNlbHNlCi0tCSAgICBpZiAoKnJwaSAhPSAqY3BpKQotLQkgICAgICBicmVhazsKLS0jZW5kaWYKLS0JICB9Ci0tCWlmICghc2FtZSkKLS0JICBicmVhazsKLS0JLyogVGhlIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50IHdhcyB0aGUgc2FtZS4gIG9waSBhbmQgY3BpIG5vdyBwb2ludAotLQkgICB0byB0aGUgc2xhc2ggYmVmb3JlIGl0LiAgKi8KLS0JcnAgPSBycGk7Ci0tCWNwID0gY3BpOwotLSAgICAgIH0KLS0KLS0gICAgaWYgKHJwID4gcmVsX2luc3RhbGxkaXIpCi0tICAgICAgLyogVW5leHBlY3RlZDogVGhlIGN1cnJfaW5zdGFsbGRpciBkb2VzIG5vdCBlbmQgd2l0aCByZWxfaW5zdGFsbGRpci4gICovCi0tICAgICAgcmV0dXJuIE5VTEw7Ci0tCi0tICAgIHsKLS0gICAgICBzaXplX3QgY3Vycl9wcmVmaXhfbGVuID0gY3AgLSBjdXJyX2luc3RhbGxkaXI7Ci0tICAgICAgY2hhciAqY3Vycl9wcmVmaXg7Ci0tCi0tICAgICAgY3Vycl9wcmVmaXggPSAoY2hhciAqKSB4bWFsbG9jIChjdXJyX3ByZWZpeF9sZW4gKyAxKTsKLS0jaWZkZWYgTk9fWE1BTExPQwotLSAgICAgIGlmIChjdXJyX3ByZWZpeCA9PSBOVUxMKQotLQlyZXR1cm4gTlVMTDsKLS0jZW5kaWYKLS0gICAgICBtZW1jcHkgKGN1cnJfcHJlZml4LCBjdXJyX2luc3RhbGxkaXIsIGN1cnJfcHJlZml4X2xlbik7Ci0tICAgICAgY3Vycl9wcmVmaXhbY3Vycl9wcmVmaXhfbGVuXSA9ICdcMCc7Ci0tCi0tICAgICAgcmV0dXJuIGN1cnJfcHJlZml4OwotLSAgICB9Ci0tICB9Ci0tfQotLQotLSNlbmRpZiAvKiAhSU5fTElCUkFSWSB8fCBQSUMgKi8KLS0KLS0jaWYgZGVmaW5lZCBQSUMgJiYgZGVmaW5lZCBJTlNUQUxMRElSCi0tCi0tLyogRnVsbCBwYXRobmFtZSBvZiBzaGFyZWQgbGlicmFyeSwgb3IgTlVMTC4gICovCi0tc3RhdGljIGNoYXIgKnNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOwotLQotLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18KLS0KLS0vKiBEZXRlcm1pbmUgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IHdoZW4gaXQgaXMgbG9hZGVkLiAgKi8KLS0KLS1CT09MIFdJTkFQSQotLURsbE1haW4gKEhJTlNUQU5DRSBtb2R1bGVfaGFuZGxlLCBEV09SRCBldmVudCwgTFBWT0lEIHJlc2VydmVkKQotLXsKLS0gICh2b2lkKSByZXNlcnZlZDsKLS0KLS0gIGlmIChldmVudCA9PSBETExfUFJPQ0VTU19BVFRBQ0gpCi0tICAgIHsKLS0gICAgICAvKiBUaGUgRExMIGlzIGJlaW5nIGxvYWRlZCBpbnRvIGFuIGFwcGxpY2F0aW9uJ3MgYWRkcmVzcyByYW5nZS4gICovCi0tICAgICAgc3RhdGljIGNoYXIgbG9jYXRpb25bTUFYX1BBVEhdOwotLQotLSAgICAgIGlmICghR2V0TW9kdWxlRmlsZU5hbWUgKG1vZHVsZV9oYW5kbGUsIGxvY2F0aW9uLCBzaXplb2YgKGxvY2F0aW9uKSkpCi0tCS8qIFNob3VsZG4ndCBoYXBwZW4uICAqLwotLQlyZXR1cm4gRkFMU0U7Ci0tCi0tICAgICAgaWYgKCFJU19QQVRIX1dJVEhfRElSIChsb2NhdGlvbikpCi0tCS8qIFNob3VsZG4ndCBoYXBwZW4uICAqLwotLQlyZXR1cm4gRkFMU0U7Ci0tCi0tICAgICAgewotLSNpZiBkZWZpbmVkIF9fQ1lHV0lOX18KLS0JLyogT24gQ3lnd2luLCB3ZSBuZWVkIHRvIGNvbnZlcnQgcGF0aHMgY29taW5nIGZyb20gV2luMzIgc3lzdGVtIGNhbGxzCi0tCSAgIHRvIHRoZSBVbml4LWxpa2Ugc2xhc2hpZmllZCBub3RhdGlvbi4gICovCi0tCXN0YXRpYyBjaGFyIGxvY2F0aW9uX2FzX3Bvc2l4X3BhdGhbMiAqIE1BWF9QQVRIXTsKLS0JLyogVGhlcmUncyBubyBlcnJvciByZXR1cm4gZGVmaW5lZCBmb3IgY3lnd2luX2NvbnZfdG9fcG9zaXhfcGF0aC4KLS0JICAgU2VlIGN5Z3dpbi1hcGkvZnVuYy1jeWd3aW4tY29udi10by1wb3NpeC1wYXRoLmh0bWwuCi0tCSAgIERvZXMgaXQgb3ZlcmZsb3cgdGhlIGJ1ZmZlciBvZiBleHBlY3RlZCBzaXplIE1BWF9QQVRIIG9yIGRvZXMgaXQKLS0JICAgdHJ1bmNhdGUgdGhlIHBhdGg/ICBJIGRvbid0IGtub3cuICBMZXQncyBjYXRjaCBib3RoLiAgKi8KLS0JY3lnd2luX2NvbnZfdG9fcG9zaXhfcGF0aCAobG9jYXRpb24sIGxvY2F0aW9uX2FzX3Bvc2l4X3BhdGgpOwotLQlsb2NhdGlvbl9hc19wb3NpeF9wYXRoW01BWF9QQVRIIC0gMV0gPSAnXDAnOwotLQlpZiAoc3RybGVuIChsb2NhdGlvbl9hc19wb3NpeF9wYXRoKSA+PSBNQVhfUEFUSCAtIDEpCi0tCSAgLyogQSBzaWduIG9mIGJ1ZmZlciBvdmVyZmxvdyBvciBwYXRoIHRydW5jYXRpb24uICAqLwotLQkgIHJldHVybiBGQUxTRTsKLS0Jc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgPSBzdHJkdXAgKGxvY2F0aW9uX2FzX3Bvc2l4X3BhdGgpOwotLSNlbHNlCi0tCXNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lID0gc3RyZHVwIChsb2NhdGlvbik7Ci0tI2VuZGlmCi0tICAgICAgfQotLSAgICB9Ci0tCi0tICByZXR1cm4gVFJVRTsKLS19Ci0tCi0tI2Vsc2UgLyogVW5peCBleGNlcHQgQ3lnd2luICovCi0tCi0tc3RhdGljIHZvaWQKLS1maW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpCi0tewotLSNpZiBkZWZpbmVkIF9fbGludXhfXyAmJiBfX0dMSUJDX18gPj0gMgotLSAgLyogTGludXggaGFzIC9wcm9jL3NlbGYvbWFwcy4gZ2xpYmMgMiBoYXMgdGhlIGdldGxpbmUoKSBmdW5jdGlvbi4gICovCi0tICBGSUxFICpmcDsKLS0KLS0gIC8qIE9wZW4gdGhlIGN1cnJlbnQgcHJvY2VzcycgbWFwcyBmaWxlLiAgSXQgZGVzY3JpYmVzIG9uZSBWTUEgcGVyIGxpbmUuICAqLwotLSAgZnAgPSBmb3BlbiAoIi9wcm9jL3NlbGYvbWFwcyIsICJyIik7Ci0tICBpZiAoZnApCi0tICAgIHsKLS0gICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykgJmZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7Ci0tICAgICAgZm9yICg7OykKLS0JewotLQkgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKLS0JICBpbnQgYzsKLS0KLS0JICBpZiAoZnNjYW5mIChmcCwgIiVseC0lbHgiLCAmc3RhcnQsICZlbmQpICE9IDIpCi0tCSAgICBicmVhazsKLS0JICBpZiAoYWRkcmVzcyA+PSBzdGFydCAmJiBhZGRyZXNzIDw9IGVuZCAtIDEpCi0tCSAgICB7Ci0tCSAgICAgIC8qIEZvdW5kIGl0LiAgTm93IHNlZSBpZiB0aGlzIGxpbmUgY29udGFpbnMgYSBmaWxlbmFtZS4gICovCi0tCSAgICAgIHdoaWxlIChjID0gZ2V0YyAoZnApLCBjICE9IEVPRiAmJiBjICE9ICdcbicgJiYgYyAhPSAnLycpCi0tCQljb250aW51ZTsKLS0JICAgICAgaWYgKGMgPT0gJy8nKQotLQkJewotLQkJICBzaXplX3Qgc2l6ZTsKLS0JCSAgaW50IGxlbjsKLS0KLS0JCSAgdW5nZXRjIChjLCBmcCk7Ci0tCQkgIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lID0gTlVMTDsgc2l6ZSA9IDA7Ci0tCQkgIGxlbiA9IGdldGxpbmUgKCZzaGFyZWRfbGlicmFyeV9mdWxsbmFtZSwgJnNpemUsIGZwKTsKLS0JCSAgaWYgKGxlbiA+PSAwKQotLQkJICAgIHsKLS0JCSAgICAgIC8qIFN1Y2Nlc3M6IGZpbGxlZCBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZS4gICovCi0tCQkgICAgICBpZiAobGVuID4gMCAmJiBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZVtsZW4gLSAxXSA9PSAnXG4nKQotLQkJCXNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lW2xlbiAtIDFdID0gJ1wwJzsKLS0JCSAgICB9Ci0tCQl9Ci0tCSAgICAgIGJyZWFrOwotLQkgICAgfQotLQkgIHdoaWxlIChjID0gZ2V0YyAoZnApLCBjICE9IEVPRiAmJiBjICE9ICdcbicpCi0tCSAgICBjb250aW51ZTsKLS0JfQotLSAgICAgIGZjbG9zZSAoZnApOwotLSAgICB9Ci0tI2VuZGlmCi0tfQotLQotLSNlbmRpZiAvKiAoV0lOMzIgb3IgQ3lnd2luKSAvIChVbml4IGV4Y2VwdCBDeWd3aW4pICovCi0tCi0tLyogUmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBjdXJyZW50IHNoYXJlZCBsaWJyYXJ5LgotLSAgIFJldHVybiBOVUxMIGlmIHVua25vd24uCi0tICAgR3VhcmFudGVlZCB0byB3b3JrIG9ubHkgb24gTGludXgsIEN5Z3dpbiBhbmQgV29lMzIuICAqLwotLXN0YXRpYyBjaGFyICoKLS1nZXRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCkKLS17Ci0tI2lmICEoZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fKQotLSAgc3RhdGljIGJvb2wgdHJpZWRfZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKLS0gIGlmICghdHJpZWRfZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSkKLS0gICAgewotLSAgICAgIGZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCk7Ci0tICAgICAgdHJpZWRfZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IHRydWU7Ci0tICAgIH0KLS0jZW5kaWYKLS0gIHJldHVybiBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKLS19Ci0tCi0tI2VuZGlmIC8qIFBJQyAqLwotLQotLS8qIFJldHVybnMgdGhlIHBhdGhuYW1lLCByZWxvY2F0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbgotLSAgIGRpcmVjdG9yeS4gICovCi0tY29uc3QgY2hhciAqCi0tcmVsb2NhdGUgKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQotLXsKLS0jaWYgZGVmaW5lZCBQSUMgJiYgZGVmaW5lZCBJTlNUQUxMRElSCi0tICBzdGF0aWMgaW50IGluaXRpYWxpemVkOwotLQotLSAgLyogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgYSBzaGFyZWQgbGlicmFyeS4gICovCi0tICBpZiAoIWluaXRpYWxpemVkKQotLSAgICB7Ci0tICAgICAgLyogQXQgdGhpcyBwb2ludCwgb3JpZ19wcmVmaXggYW5kIGN1cnJfcHJlZml4IGxpa2VseSBoYXZlIGFscmVhZHkgYmVlbgotLQkgc2V0IHRocm91Z2ggdGhlIG1haW4gcHJvZ3JhbSdzIHNldF9wcm9ncmFtX25hbWVfYW5kX2luc3RhbGxkaXIKLS0JIGZ1bmN0aW9uLiAgVGhpcyBpcyBzdWZmaWNpZW50IGluIHRoZSBjYXNlIHRoYXQgdGhlIGxpYnJhcnkgaGFzCi0tCSBpbml0aWFsbHkgYmVlbiBpbnN0YWxsZWQgaW4gdGhlIHNhbWUgb3JpZ19wcmVmaXguICBCdXQgd2UgY2FuIGRvCi0tCSBiZXR0ZXIsIHRvIGFsc28gY292ZXIgdGhlIGNhc2VzIHRoYXQgMS4gaXQgaGFzIGJlZW4gaW5zdGFsbGVkCi0tCSBpbiBhIGRpZmZlcmVudCBwcmVmaXggYmVmb3JlIGJlaW5nIG1vdmVkIHRvIG9yaWdfcHJlZml4IGFuZCAobGF0ZXIpCi0tCSB0byBjdXJyX3ByZWZpeCwgMi4gdW5saWtlIHRoZSBwcm9ncmFtLCBpdCBoYXMgbm90IG1vdmVkIGF3YXkgZnJvbQotLQkgb3JpZ19wcmVmaXguICAqLwotLSAgICAgIGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbHByZWZpeCA9IElOU1RBTExQUkVGSVg7Ci0tICAgICAgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyID0gSU5TVEFMTERJUjsKLS0gICAgICBjb25zdCBjaGFyICpjdXJyX3ByZWZpeF9iZXR0ZXI7Ci0tCi0tICAgICAgY3Vycl9wcmVmaXhfYmV0dGVyID0KLS0JY29tcHV0ZV9jdXJyX3ByZWZpeCAob3JpZ19pbnN0YWxscHJlZml4LCBvcmlnX2luc3RhbGxkaXIsCi0tCQkJICAgICBnZXRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCkpOwotLSAgICAgIGlmIChjdXJyX3ByZWZpeF9iZXR0ZXIgPT0gTlVMTCkKLS0JY3Vycl9wcmVmaXhfYmV0dGVyID0gY3Vycl9wcmVmaXg7Ci0tCi0tICAgICAgc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX2luc3RhbGxwcmVmaXgsIGN1cnJfcHJlZml4X2JldHRlcik7Ci0tCi0tICAgICAgaW5pdGlhbGl6ZWQgPSAxOwotLSAgICB9Ci0tI2VuZGlmCi0tCi0tICAvKiBOb3RlOiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uIGhlcmUsCi0tICAgICBldmVuIGZvciBET1MtbGlrZSBmaWxlc3lzdGVtcywgYmVjYXVzZSB0aGUgcGF0aG5hbWUgYXJndW1lbnQgd2FzCi0tICAgICB0eXBpY2FsbHkgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIE1ha2VmaWxlIHZhcmlhYmxlIGFzIG9yaWdfcHJlZml4IGNhbWUKLS0gICAgIGZyb20uICAqLwotLSAgaWYgKG9yaWdfcHJlZml4ICE9IE5VTEwgJiYgY3Vycl9wcmVmaXggIT0gTlVMTAotLSAgICAgICYmIHN0cm5jbXAgKHBhdGhuYW1lLCBvcmlnX3ByZWZpeCwgb3JpZ19wcmVmaXhfbGVuKSA9PSAwKQotLSAgICB7Ci0tICAgICAgaWYgKHBhdGhuYW1lW29yaWdfcHJlZml4X2xlbl0gPT0gJ1wwJykKLS0JLyogcGF0aG5hbWUgZXF1YWxzIG9yaWdfcHJlZml4LiAgKi8KLS0JcmV0dXJuIGN1cnJfcHJlZml4OwotLSAgICAgIGlmIChJU1NMQVNIIChwYXRobmFtZVtvcmlnX3ByZWZpeF9sZW5dKSkKLS0JewotLQkgIC8qIHBhdGhuYW1lIHN0YXJ0cyB3aXRoIG9yaWdfcHJlZml4LiAgKi8KLS0JICBjb25zdCBjaGFyICpwYXRobmFtZV90YWlsID0gJnBhdGhuYW1lW29yaWdfcHJlZml4X2xlbl07Ci0tCSAgY2hhciAqcmVzdWx0ID0KLS0JICAgIChjaGFyICopIHhtYWxsb2MgKGN1cnJfcHJlZml4X2xlbiArIHN0cmxlbiAocGF0aG5hbWVfdGFpbCkgKyAxKTsKLS0KLS0jaWZkZWYgTk9fWE1BTExPQwotLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLS0jZW5kaWYKLS0JICAgIHsKLS0JICAgICAgbWVtY3B5IChyZXN1bHQsIGN1cnJfcHJlZml4LCBjdXJyX3ByZWZpeF9sZW4pOwotLQkgICAgICBzdHJjcHkgKHJlc3VsdCArIGN1cnJfcHJlZml4X2xlbiwgcGF0aG5hbWVfdGFpbCk7Ci0tCSAgICAgIHJldHVybiByZXN1bHQ7Ci0tCSAgICB9Ci0tCX0KLS0gICAgfQotLSAgLyogTm90aGluZyB0byByZWxvY2F0ZS4gICovCi0tICByZXR1cm4gcGF0aG5hbWU7Ci0tfQotLQotLSNlbmRpZgotLS0tIGEvaW50bC9yZWxvY2F0YWJsZS5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSw3OSArMCwwIEBACi0tLyogUHJvdmlkZSByZWxvY2F0YWJsZSBwYWNrYWdlcy4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4sIDIwMDMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZuZGVmIF9SRUxPQ0FUQUJMRV9ICi0tI2RlZmluZSBfUkVMT0NBVEFCTEVfSAotLQotLSNpZmRlZiBfX2NwbHVzcGx1cwotLWV4dGVybiAiQyIgewotLSNlbmRpZgotLQotLQotLS8qIFRoaXMgY2FuIGJlIGVuYWJsZWQgdGhyb3VnaCB0aGUgY29uZmlndXJlIC0tZW5hYmxlLXJlbG9jYXRhYmxlIG9wdGlvbi4gICovCi0tI2lmIEVOQUJMRV9SRUxPQ0FUQUJMRQotLQotLS8qIFdoZW4gYnVpbGRpbmcgYSBETEwsIHdlIG11c3QgZXhwb3J0IHNvbWUgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGJlY2F1c2UKLS0gICB0aGlzIGlzIGEgcHJpdmF0ZSAuaCBmaWxlLCB3ZSBkb24ndCBuZWVkIHRvIHVzZSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLS0gICBpbiBhbnkgY2FzZS4gICovCi0tI2lmIEhBVkVfVklTSUJJTElUWSAmJiBCVUlMRElOR19ETEwKLS0jIGRlZmluZSBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQgX19hdHRyaWJ1dGVfXygoX192aXNpYmlsaXR5X18oImRlZmF1bHQiKSkpCi0tI2VsaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBCVUlMRElOR19ETEwKLS0jIGRlZmluZSBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0tI2Vsc2UKLS0jIGRlZmluZSBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQKLS0jZW5kaWYKLS0KLS0vKiBTZXRzIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCBvZiB0aGUgcGFja2FnZS4KLS0gICBSZWxvY2F0aW9uIHNpbXBseSByZXBsYWNlcyBhIHBhdGhuYW1lIHN0YXJ0aW5nIHdpdGggdGhlIG9yaWdpbmFsIHByZWZpeAotLSAgIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHBhdGhuYW1lIHdpdGggdGhlIGN1cnJlbnQgcHJlZml4IGluc3RlYWQuICBCb3RoCi0tICAgcHJlZml4ZXMgc2hvdWxkIGJlIGRpcmVjdG9yeSBuYW1lcyB3aXRob3V0IHRyYWlsaW5nIHNsYXNoIChpLmUuIHVzZSAiIgotLSAgIGluc3RlYWQgb2YgIi8iKS4gICovCi0tZXh0ZXJuIFJFTE9DQVRBQkxFX0RMTF9FWFBPUlRFRCB2b2lkCi0tICAgICAgIHNldF9yZWxvY2F0aW9uX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19wcmVmaXgsCi0tCQkJICAgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXgpOwotLQotLS8qIFJldHVybnMgdGhlIHBhdGhuYW1lLCByZWxvY2F0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbgotLSAgIGRpcmVjdG9yeS4gICovCi0tZXh0ZXJuIGNvbnN0IGNoYXIgKiByZWxvY2F0ZSAoY29uc3QgY2hhciAqcGF0aG5hbWUpOwotLQotLS8qIE1lbW9yeSBtYW5hZ2VtZW50OiByZWxvY2F0ZSgpIGxlYWtzIG1lbW9yeSwgYmVjYXVzZSBpdCBoYXMgdG8gY29uc3RydWN0Ci0tICAgYSBmcmVzaCBwYXRobmFtZS4gIElmIHRoaXMgaXMgYSBwcm9ibGVtIGJlY2F1c2UgeW91ciBwcm9ncmFtIGNhbGxzCi0tICAgcmVsb2NhdGUoKSBmcmVxdWVudGx5LCB0aGluayBhYm91dCBjYWNoaW5nIHRoZSByZXN1bHQuICAqLwotLQotLS8qIENvbnZlbmllbmNlIGZ1bmN0aW9uOgotLSAgIENvbXB1dGVzIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXgsIGJhc2VkIG9uIHRoZSBvcmlnaW5hbAotLSAgIGluc3RhbGxhdGlvbiBwcmVmaXgsIHRoZSBvcmlnaW5hbCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGEgcGFydGljdWxhcgotLSAgIGZpbGUsIGFuZCB0aGUgY3VycmVudCBwYXRobmFtZSBvZiB0aGlzIGZpbGUuICBSZXR1cm5zIE5VTEwgdXBvbiBmYWlsdXJlLiAgKi8KLS1leHRlcm4gY29uc3QgY2hhciAqIGNvbXB1dGVfY3Vycl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbHByZWZpeCwKLS0JCQkJCSBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxkaXIsCi0tCQkJCQkgY29uc3QgY2hhciAqY3Vycl9wYXRobmFtZSk7Ci0tCi0tI2Vsc2UKLS0KLS0vKiBCeSBkZWZhdWx0LCB3ZSB1c2UgdGhlIGhhcmR3aXJlZCBwYXRobmFtZXMuICAqLwotLSNkZWZpbmUgcmVsb2NhdGUocGF0aG5hbWUpIChwYXRobmFtZSkKLS0KLS0jZW5kaWYKLS0KLS0KLS0jaWZkZWYgX19jcGx1c3BsdXMKLS19Ci0tI2VuZGlmCi0tCi0tI2VuZGlmIC8qIF9SRUxPQ0FUQUJMRV9IICovCi0tLS0gYS9pbnRsL3RleHRkb21haW4uYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMTI3ICswLDAgQEAKLS0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGV4dGRvbWFpbigzKSBmdW5jdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMC0yMDAzLCAyMDA1LTIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0KLS0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGxpYmludGwuaD4KLS0jZWxzZQotLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotLSNlbmRpZgotLQotLS8qIEhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayBfX2xpYmNfcndsb2NrX3dybG9jawotLSMgZGVmaW5lIGdsX3J3bG9ja191bmxvY2sgX19saWJjX3J3bG9ja191bmxvY2sKLS0jZWxzZQotLSMgaW5jbHVkZSAibG9jay5oIgotLSNlbmRpZgotLQotLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS0KLS0KLS0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0tICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBkZWZpbmUgVEVYVERPTUFJTiBfX3RleHRkb21haW4KLS0jIGlmbmRlZiBzdHJkdXAKLS0jICBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKLS0jIGVuZGlmCi0tI2Vsc2UKLS0jIGRlZmluZSBURVhURE9NQUlOIGxpYmludGxfdGV4dGRvbWFpbgotLSNlbmRpZgotLQotLS8qIExvY2sgdmFyaWFibGUgdG8gcHJvdGVjdCB0aGUgZ2xvYmFsIGRhdGEgaW4gdGhlIGdldHRleHQgaW1wbGVtZW50YXRpb24uICAqLwotLWdsX3J3bG9ja19kZWZpbmUgKGV4dGVybiwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKLS0KLS0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KLS0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotLWNoYXIgKgotLVRFWFRET01BSU4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUpCi0tewotLSAgY2hhciAqbmV3X2RvbWFpbjsKLS0gIGNoYXIgKm9sZF9kb21haW47Ci0tCi0tICAvKiBBIE5VTEwgcG9pbnRlciByZXF1ZXN0cyB0aGUgY3VycmVudCBzZXR0aW5nLiAgKi8KLS0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0tICAgIHJldHVybiAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLS0KLS0gIGdsX3J3bG9ja193cmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLS0KLS0gIG9sZF9kb21haW4gPSAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLS0KLS0gIC8qIElmIGRvbWFpbiBuYW1lIGlzIHRoZSBudWxsIHN0cmluZyBzZXQgdG8gZGVmYXVsdCBkb21haW4gIm1lc3NhZ2VzIi4gICovCi0tICBpZiAoZG9tYWlubmFtZVswXSA9PSAnXDAnCi0tICAgICAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikgPT0gMCkKLS0gICAgewotLSAgICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47Ci0tICAgICAgbmV3X2RvbWFpbiA9IChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotLSAgICB9Ci0tICBlbHNlIGlmIChzdHJjbXAgKGRvbWFpbm5hbWUsIG9sZF9kb21haW4pID09IDApCi0tICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBhbmQgcGVvcGxlIHdpbGwgdXNlIGl0IHRvIHNpZ25hbCB0aGF0IHNvbWUKLS0gICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgY2hhbmdlZC4gICovCi0tICAgIG5ld19kb21haW4gPSBvbGRfZG9tYWluOwotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgLyogSWYgdGhlIGZvbGxvd2luZyBtYWxsb2MgZmFpbHMgYF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluJwotLQkgd2lsbCBiZSBOVUxMLiAgVGhpcyB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGFuZCBzbyBzaWduYWxzIHdlCi0tCSBhcmUgb3V0IG9mIGNvcmUuICAqLwotLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLS0gICAgICBuZXdfZG9tYWluID0gc3RyZHVwIChkb21haW5uYW1lKTsKLS0jZWxzZQotLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRvbWFpbm5hbWUpICsgMTsKLS0gICAgICBuZXdfZG9tYWluID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotLSAgICAgIGlmIChuZXdfZG9tYWluICE9IE5VTEwpCi0tCW1lbWNweSAobmV3X2RvbWFpbiwgZG9tYWlubmFtZSwgbGVuKTsKLS0jZW5kaWYKLS0KLS0gICAgICBpZiAobmV3X2RvbWFpbiAhPSBOVUxMKQotLQlfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IG5ld19kb21haW47Ci0tICAgIH0KLS0KLS0gIC8qIFdlIHVzZSB0aGlzIHBvc3NpYmlsaXR5IHRvIHNpZ25hbCBhIGNoYW5nZSBvZiB0aGUgbG9hZGVkIGNhdGFsb2dzCi0tICAgICBzaW5jZSB0aGlzIGlzIG1vc3QgbGlrZWx5IHRoZSBjYXNlIGFuZCB0aGVyZSBpcyBubyBvdGhlciBlYXN5IHdlCi0tICAgICB0byBkbyBpdC4gIERvIGl0IG9ubHkgd2hlbiB0aGUgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4gICovCi0tICBpZiAobmV3X2RvbWFpbiAhPSBOVUxMKQotLSAgICB7Ci0tICAgICAgKytfbmxfbXNnX2NhdF9jbnRyOwotLQotLSAgICAgIGlmIChvbGRfZG9tYWluICE9IG5ld19kb21haW4gJiYgb2xkX2RvbWFpbiAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKLS0JZnJlZSAob2xkX2RvbWFpbik7Ci0tICAgIH0KLS0KLS0gIGdsX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLS0KLS0gIHJldHVybiBuZXdfZG9tYWluOwotLX0KLS0KLS0jaWZkZWYgX0xJQkMKLS0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLS13ZWFrX2FsaWFzIChfX3RleHRkb21haW4sIHRleHRkb21haW4pOwotLSNlbmRpZgotLS0tIGEvaW50bC90c2VhcmNoLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDY4NCArMCwwIEBACi0tLyogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwLCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIENvbnRyaWJ1dGVkIGJ5IEJlcm5kIFNjaG1pZHQgPGNydXhAUG9vbC5JbmZvcm1hdGlrLlJXVEgtQWFjaGVuLkRFPiwgMTk5Ny4KLS0KLS0gICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQwotLSAgIExpYnJhcnkuICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFRyZWUgc2VhcmNoIGZvciByZWQvYmxhY2sgdHJlZXMuCi0tICAgVGhlIGFsZ29yaXRobSBmb3IgYWRkaW5nIG5vZGVzIGlzIHRha2VuIGZyb20gb25lIG9mIHRoZSBtYW55ICJBbGdvcml0aG1zIgotLSAgIGJvb2tzIGJ5IFJvYmVydCBTZWRnZXdpY2ssIGFsdGhvdWdoIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmZXJzLgotLSAgIFRoZSBhbGdvcml0aG0gZm9yIGRlbGV0aW5nIG5vZGVzIGNhbiBwcm9iYWJseSBiZSBmb3VuZCBpbiBhIGJvb2sgbmFtZWQKLS0gICAiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXMiIGJ5IENvcm1lbi9MZWlzZXJzb24vUml2ZXN0LiAgQXQgbGVhc3QgdGhhdCdzCi0tICAgdGhlIGJvb2sgdGhhdCBteSBwcm9mZXNzb3IgdG9vayBtb3N0IGFsZ29yaXRobXMgZnJvbSBkdXJpbmcgdGhlICJEYXRhCi0tICAgU3RydWN0dXJlcyIgY291cnNlLi4uCi0tCi0tICAgVG90YWxseSBwdWJsaWMgZG9tYWluLiAgKi8KLS0KLS0vKiBSZWQvYmxhY2sgdHJlZXMgYXJlIGJpbmFyeSB0cmVlcyBpbiB3aGljaCB0aGUgZWRnZXMgYXJlIGNvbG9yZWQgZWl0aGVyIHJlZAotLSAgIG9yIGJsYWNrLiAgVGhleSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKLS0gICAxLiBUaGUgbnVtYmVyIG9mIGJsYWNrIGVkZ2VzIG9uIGV2ZXJ5IHBhdGggZnJvbSB0aGUgcm9vdCB0byBhIGxlYWYgaXMKLS0gICAgICBjb25zdGFudC4KLS0gICAyLiBObyB0d28gcmVkIGVkZ2VzIGFyZSBhZGphY2VudC4KLS0gICBUaGVyZWZvcmUgdGhlcmUgaXMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGxlbmd0aCBvZiBldmVyeSBwYXRoLCBpdCdzCi0tICAgTyhsb2cgbikgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSB0cmVlLiAgTm8gcGF0aCBjYW4gYmUgbG9uZ2VyCi0tICAgdGhhbiAxKzIqUCB3aGVyZSBQIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXN0IHBhdGggaW4gdGhlIHRyZWUuCi0tICAgVXNlZnVsIGZvciB0aGUgaW1wbGVtZW50YXRpb246Ci0tICAgMy4gSWYgb25lIG9mIHRoZSBjaGlsZHJlbiBvZiBhIG5vZGUgaXMgTlVMTCwgdGhlbiB0aGUgb3RoZXIgb25lIGlzIHJlZAotLSAgICAgIChpZiBpdCBleGlzdHMpLgotLQotLSAgIEluIHRoZSBpbXBsZW1lbnRhdGlvbiwgbm90IHRoZSBlZGdlcyBhcmUgY29sb3JlZCwgYnV0IHRoZSBub2Rlcy4gIFRoZSBjb2xvcgotLSAgIGludGVycHJldGVkIGFzIHRoZSBjb2xvciBvZiB0aGUgZWRnZSBsZWFkaW5nIHRvIHRoaXMgbm9kZS4gIFRoZSBjb2xvciBpcwotLSAgIG1lYW5pbmdsZXNzIGZvciB0aGUgcm9vdCBub2RlLCBidXQgd2UgY29sb3IgdGhlIHJvb3Qgbm9kZSBibGFjayBmb3IKLS0gICBjb252ZW5pZW5jZS4gIEFsbCBhZGRlZCBub2RlcyBhcmUgcmVkIGluaXRpYWxseS4KLS0KLS0gICBBZGRpbmcgdG8gYSByZWQvYmxhY2sgdHJlZSBpcyByYXRoZXIgZWFzeS4gIFRoZSByaWdodCBwbGFjZSBpcyBzZWFyY2hlZAotLSAgIHdpdGggYSB1c3VhbCBiaW5hcnkgdHJlZSBzZWFyY2guICBBZGRpdGlvbmFsbHksIHdoZW5ldmVyIGEgbm9kZSBOIGlzCi0tICAgcmVhY2hlZCB0aGF0IGhhcyB0d28gcmVkIHN1Y2Nlc3NvcnMsIHRoZSBzdWNjZXNzb3JzIGFyZSBjb2xvcmVkIGJsYWNrIGFuZAotLSAgIHRoZSBub2RlIGl0c2VsZiBjb2xvcmVkIHJlZC4gIFRoaXMgbW92ZXMgcmVkIGVkZ2VzIHVwIHRoZSB0cmVlIHdoZXJlIHRoZXkKLS0gICBwb3NlIGxlc3Mgb2YgYSBwcm9ibGVtIG9uY2Ugd2UgZ2V0IHRvIHJlYWxseSBpbnNlcnQgdGhlIG5ldyBub2RlLiAgQ2hhbmdpbmcKLS0gICBOJ3MgY29sb3IgdG8gcmVkIG1heSB2aW9sYXRlIHJ1bGUgMiwgaG93ZXZlciwgc28gcm90YXRpb25zIG1heSBiZWNvbWUKLS0gICBuZWNlc3NhcnkgdG8gcmVzdG9yZSB0aGUgaW52YXJpYW50cy4gIEFkZGluZyBhIG5ldyByZWQgbGVhZiBtYXkgdmlvbGF0ZQotLSAgIHRoZSBzYW1lIHJ1bGUsIHNvIGFmdGVyd2FyZHMgYW4gYWRkaXRpb25hbCBjaGVjayBpcyBydW4gYW5kIHRoZSB0cmVlCi0tICAgcG9zc2libHkgcm90YXRlZC4KLS0KLS0gICBEZWxldGluZyBpcyBoYWlyeS4gIFRoZXJlIGFyZSBtYWlubHkgdHdvIG5vZGVzIGludm9sdmVkOiB0aGUgbm9kZSB0byBiZQotLSAgIGRlbGV0ZWQgKG4xKSwgYW5kIGFub3RoZXIgbm9kZSB0aGF0IGlzIHRvIGJlIHVuY2hhaW5lZCBmcm9tIHRoZSB0cmVlIChuMikuCi0tICAgSWYgbjEgaGFzIGEgc3VjY2Vzc29yICh0aGUgbm9kZSB3aXRoIGEgc21hbGxlc3Qga2V5IHRoYXQgaXMgbGFyZ2VyIHRoYW4KLS0gICBuMSksIHRoZW4gdGhlIHN1Y2Nlc3NvciBiZWNvbWVzIG4yIGFuZCBpdHMgY29udGVudHMgYXJlIGNvcGllZCBpbnRvIG4xLAotLSAgIG90aGVyd2lzZSBuMSBiZWNvbWVzIG4yLgotLSAgIFVuY2hhaW5pbmcgYSBub2RlIG1heSB2aW9sYXRlIHJ1bGUgMTogaWYgbjIgaXMgYmxhY2ssIG9uZSBzdWJ0cmVlIGlzCi0tICAgbWlzc2luZyBvbmUgYmxhY2sgZWRnZSBhZnRlcndhcmRzLiAgVGhlIGFsZ29yaXRobSBtdXN0IHRyeSB0byBtb3ZlIHRoaXMKLS0gICBlcnJvciB1cHdhcmRzIHRvd2FyZHMgdGhlIHJvb3QsIHNvIHRoYXQgdGhlIHN1YnRyZWUgdGhhdCBkb2VzIG5vdCBoYXZlCi0tICAgZW5vdWdoIGJsYWNrIGVkZ2VzIGJlY29tZXMgdGhlIHdob2xlIHRyZWUuICBPbmNlIHRoYXQgaGFwcGVucywgdGhlIGVycm9yCi0tICAgaGFzIGRpc2FwcGVhcmVkLiAgSXQgbWF5IG5vdCBiZSBuZWNlc3NhcnkgdG8gZ28gYWxsIHRoZSB3YXkgdXAsIHNpbmNlIGl0Ci0tICAgaXMgcG9zc2libGUgdGhhdCByb3RhdGlvbnMgYW5kIHJlY29sb3JpbmcgY2FuIGZpeCB0aGUgZXJyb3IgYmVmb3JlIHRoYXQuCi0tCi0tICAgQWx0aG91Z2ggdGhlIGRlbGV0aW9uIGFsZ29yaXRobSBtdXN0IHdhbGsgdXB3YXJkcyB0aHJvdWdoIHRoZSB0cmVlLCB3ZQotLSAgIGRvIG5vdCBzdG9yZSBwYXJlbnQgcG9pbnRlcnMgaW4gdGhlIG5vZGVzLiAgSW5zdGVhZCwgZGVsZXRlIGFsbG9jYXRlcyBhCi0tICAgc21hbGwgYXJyYXkgb2YgcGFyZW50IHBvaW50ZXJzIGFuZCBmaWxscyBpdCB3aGlsZSBkZXNjZW5kaW5nIHRoZSB0cmVlLgotLSAgIFNpbmNlIHdlIGtub3cgdGhhdCB0aGUgbGVuZ3RoIG9mIGEgcGF0aCBpcyBPKGxvZyBuKSwgd2hlcmUgbiBpcyB0aGUgbnVtYmVyCi0tICAgb2Ygbm9kZXMsIHRoaXMgaXMgbGlrZWx5IHRvIHVzZSBsZXNzIG1lbW9yeS4gICovCi0tCi0tLyogVHJlZSByb3RhdGlvbnMgbG9vayBsaWtlIHRoaXM6Ci0tICAgICAgQSAgICAgICAgICAgICAgICBDCi0tICAgICAvIFwgICAgICAgICAgICAgIC8gXAotLSAgICBCICAgQyAgICAgICAgICAgIEEgICBHCi0tICAgLyBcIC8gXCAgLS0+ICAgICAvIFwKLS0gICBEIEUgRiBHICAgICAgICAgQiAgIEYKLS0gICAgICAgICAgICAgICAgICAvIFwKLS0gICAgICAgICAgICAgICAgIEQgICBFCi0tCi0tICAgSW4gdGhpcyBjYXNlLCBBIGhhcyBiZWVuIHJvdGF0ZWQgbGVmdC4gIFRoaXMgcHJlc2VydmVzIHRoZSBvcmRlcmluZyBvZiB0aGUKLS0gICBiaW5hcnkgdHJlZS4gICovCi0tCi0tI2luY2x1ZGUgPGNvbmZpZy5oPgotLQotLS8qIFNwZWNpZmljYXRpb24uICAqLwotLSNpZmRlZiBJTl9MSUJJTlRMCi0tIyBpbmNsdWRlICJ0c2VhcmNoLmgiCi0tI2Vsc2UKLS0jIGluY2x1ZGUgPHNlYXJjaC5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0KLS10eXBlZGVmIGludCAoKl9fY29tcGFyX2ZuX3QpIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7Ci0tdHlwZWRlZiB2b2lkICgqX19hY3Rpb25fZm5fdCkgKGNvbnN0IHZvaWQgKiwgVklTSVQsIGludCk7Ci0tCi0tI2lmbmRlZiB3ZWFrX2FsaWFzCi0tIyBkZWZpbmUgX190c2VhcmNoIHRzZWFyY2gKLS0jIGRlZmluZSBfX3RmaW5kIHRmaW5kCi0tIyBkZWZpbmUgX190ZGVsZXRlIHRkZWxldGUKLS0jIGRlZmluZSBfX3R3YWxrIHR3YWxrCi0tI2VuZGlmCi0tCi0tI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgotLS8qIEluc2lkZSBHTlUgbGliYyB3ZSBtYXJrIHNvbWUgZnVuY3Rpb24gaW4gYSBzcGVjaWFsIHdheS4gIEluIG90aGVyCi0tICAgZW52aXJvbm1lbnRzIHNpbXBseSBpZ25vcmUgdGhlIG1hcmtpbmcuICAqLwotLSMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCi0tI2VuZGlmCi0tCi0tdHlwZWRlZiBzdHJ1Y3Qgbm9kZV90Ci0tewotLSAgLyogQ2FsbGVycyBleHBlY3QgdGhpcyB0byBiZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc3RydWN0dXJlIC0gZG8gbm90Ci0tICAgICBtb3ZlISAgKi8KLS0gIGNvbnN0IHZvaWQgKmtleTsKLS0gIHN0cnVjdCBub2RlX3QgKmxlZnQ7Ci0tICBzdHJ1Y3Qgbm9kZV90ICpyaWdodDsKLS0gIHVuc2lnbmVkIGludCByZWQ6MTsKLS19ICpub2RlOwotLXR5cGVkZWYgY29uc3Qgc3RydWN0IG5vZGVfdCAqY29uc3Rfbm9kZTsKLS0KLS0jdW5kZWYgREVCVUdHSU5HCi0tCi0tI2lmZGVmIERFQlVHR0lORwotLQotLS8qIFJvdXRpbmVzIHRvIGNoZWNrIHRyZWUgaW52YXJpYW50cy4gICovCi0tCi0tI2luY2x1ZGUgPGFzc2VydC5oPgotLQotLSNkZWZpbmUgQ0hFQ0tfVFJFRShhKSBjaGVja190cmVlKGEpCi0tCi0tc3RhdGljIHZvaWQKLS1jaGVja190cmVlX3JlY3Vyc2UgKG5vZGUgcCwgaW50IGRfc29mYXIsIGludCBkX3RvdGFsKQotLXsKLS0gIGlmIChwID09IE5VTEwpCi0tICAgIHsKLS0gICAgICBhc3NlcnQgKGRfc29mYXIgPT0gZF90b3RhbCk7Ci0tICAgICAgcmV0dXJuOwotLSAgICB9Ci0tCi0tICBjaGVja190cmVlX3JlY3Vyc2UgKHAtPmxlZnQsIGRfc29mYXIgKyAocC0+bGVmdCAmJiAhcC0+bGVmdC0+cmVkKSwgZF90b3RhbCk7Ci0tICBjaGVja190cmVlX3JlY3Vyc2UgKHAtPnJpZ2h0LCBkX3NvZmFyICsgKHAtPnJpZ2h0ICYmICFwLT5yaWdodC0+cmVkKSwgZF90b3RhbCk7Ci0tICBpZiAocC0+bGVmdCkKLS0gICAgYXNzZXJ0ICghKHAtPmxlZnQtPnJlZCAmJiBwLT5yZWQpKTsKLS0gIGlmIChwLT5yaWdodCkKLS0gICAgYXNzZXJ0ICghKHAtPnJpZ2h0LT5yZWQgJiYgcC0+cmVkKSk7Ci0tfQotLQotLXN0YXRpYyB2b2lkCi0tY2hlY2tfdHJlZSAobm9kZSByb290KQotLXsKLS0gIGludCBjbnQgPSAwOwotLSAgbm9kZSBwOwotLSAgaWYgKHJvb3QgPT0gTlVMTCkKLS0gICAgcmV0dXJuOwotLSAgcm9vdC0+cmVkID0gMDsKLS0gIGZvcihwID0gcm9vdC0+bGVmdDsgcDsgcCA9IHAtPmxlZnQpCi0tICAgIGNudCArPSAhcC0+cmVkOwotLSAgY2hlY2tfdHJlZV9yZWN1cnNlIChyb290LCAwLCBjbnQpOwotLX0KLS0KLS0KLS0jZWxzZQotLQotLSNkZWZpbmUgQ0hFQ0tfVFJFRShhKQotLQotLSNlbmRpZgotLQotLS8qIFBvc3NpYmx5ICJzcGxpdCIgYSBub2RlIHdpdGggdHdvIHJlZCBzdWNjZXNzb3JzLCBhbmQvb3IgZml4IHVwIHR3byByZWQKLS0gICBlZGdlcyBpbiBhIHJvdy4gIFJPT1RQIGlzIGEgcG9pbnRlciB0byB0aGUgbG93ZXN0IG5vZGUgd2UgdmlzaXRlZCwgUEFSRU5UUAotLSAgIGFuZCBHUEFSRU5UUCBwb2ludGVycyB0byBpdHMgcGFyZW50L2dyYW5kcGFyZW50LiAgUF9SIGFuZCBHUF9SIGNvbnRhaW4gdGhlCi0tICAgY29tcGFyaXNvbiB2YWx1ZXMgdGhhdCBkZXRlcm1pbmVkIHdoaWNoIHdheSB3YXMgdGFrZW4gaW4gdGhlIHRyZWUgdG8gcmVhY2gKLS0gICBST09UUC4gIE1PREUgaXMgMSBpZiB3ZSBuZWVkIG5vdCBkbyB0aGUgc3BsaXQsIGJ1dCBtdXN0IGNoZWNrIGZvciB0d28gcmVkCi0tICAgZWRnZXMgYmV0d2VlbiBHUEFSRU5UUCBhbmQgUk9PVFAuICAqLwotLXN0YXRpYyB2b2lkCi0tbWF5YmVfc3BsaXRfZm9yX2luc2VydCAobm9kZSAqcm9vdHAsIG5vZGUgKnBhcmVudHAsIG5vZGUgKmdwYXJlbnRwLAotLQkJCWludCBwX3IsIGludCBncF9yLCBpbnQgbW9kZSkKLS17Ci0tICBub2RlIHJvb3QgPSAqcm9vdHA7Ci0tICBub2RlICpycCwgKmxwOwotLSAgcnAgPSAmKCpyb290cCktPnJpZ2h0OwotLSAgbHAgPSAmKCpyb290cCktPmxlZnQ7Ci0tCi0tICAvKiBTZWUgaWYgd2UgaGF2ZSB0byBzcGxpdCB0aGlzIG5vZGUgKGJvdGggc3VjY2Vzc29ycyByZWQpLiAgKi8KLS0gIGlmIChtb2RlID09IDEKLS0gICAgICB8fCAoKCpycCkgIT0gTlVMTCAmJiAoKmxwKSAhPSBOVUxMICYmICgqcnApLT5yZWQgJiYgKCpscCktPnJlZCkpCi0tICAgIHsKLS0gICAgICAvKiBUaGlzIG5vZGUgYmVjb21lcyByZWQsIGl0cyBzdWNjZXNzb3JzIGJsYWNrLiAgKi8KLS0gICAgICByb290LT5yZWQgPSAxOwotLSAgICAgIGlmICgqcnApCi0tCSgqcnApLT5yZWQgPSAwOwotLSAgICAgIGlmICgqbHApCi0tCSgqbHApLT5yZWQgPSAwOwotLQotLSAgICAgIC8qIElmIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlIGlzIGFsc28gcmVkLCB3ZSBoYXZlIHRvIGRvCi0tCSByb3RhdGlvbnMuICAqLwotLSAgICAgIGlmIChwYXJlbnRwICE9IE5VTEwgJiYgKCpwYXJlbnRwKS0+cmVkKQotLQl7Ci0tCSAgbm9kZSBncCA9ICpncGFyZW50cDsKLS0JICBub2RlIHAgPSAqcGFyZW50cDsKLS0JICAvKiBUaGVyZSBhcmUgdHdvIG1haW4gY2FzZXM6Ci0tCSAgICAgMS4gVGhlIGVkZ2UgdHlwZXMgKGxlZnQgb3IgcmlnaHQpIG9mIHRoZSB0d28gcmVkIGVkZ2VzIGRpZmZlci4KLS0JICAgICAyLiBCb3RoIHJlZCBlZGdlcyBhcmUgb2YgdGhlIHNhbWUgdHlwZS4KLS0JICAgICBUaGVyZSBleGlzdCB0d28gc3ltbWV0cmllcyBvZiBlYWNoIGNhc2UsIHNvIHRoZXJlIGlzIGEgdG90YWwgb2YKLS0JICAgICA0IGNhc2VzLiAgKi8KLS0JICBpZiAoKHBfciA+IDApICE9IChncF9yID4gMCkpCi0tCSAgICB7Ci0tCSAgICAgIC8qIFB1dCB0aGUgY2hpbGQgYXQgdGhlIHRvcCBvZiB0aGUgdHJlZSwgd2l0aCBpdHMgcGFyZW50Ci0tCQkgYW5kIGdyYW5kcGFyZW50IGFzIHN1Y2Nlc3NvcnMuICAqLwotLQkgICAgICBwLT5yZWQgPSAxOwotLQkgICAgICBncC0+cmVkID0gMTsKLS0JICAgICAgcm9vdC0+cmVkID0gMDsKLS0JICAgICAgaWYgKHBfciA8IDApCi0tCQl7Ci0tCQkgIC8qIENoaWxkIGlzIGxlZnQgb2YgcGFyZW50LiAgKi8KLS0JCSAgcC0+bGVmdCA9ICpycDsKLS0JCSAgKnJwID0gcDsKLS0JCSAgZ3AtPnJpZ2h0ID0gKmxwOwotLQkJICAqbHAgPSBncDsKLS0JCX0KLS0JICAgICAgZWxzZQotLQkJewotLQkJICAvKiBDaGlsZCBpcyByaWdodCBvZiBwYXJlbnQuICAqLwotLQkJICBwLT5yaWdodCA9ICpscDsKLS0JCSAgKmxwID0gcDsKLS0JCSAgZ3AtPmxlZnQgPSAqcnA7Ci0tCQkgICpycCA9IGdwOwotLQkJfQotLQkgICAgICAqZ3BhcmVudHAgPSByb290OwotLQkgICAgfQotLQkgIGVsc2UKLS0JICAgIHsKLS0JICAgICAgKmdwYXJlbnRwID0gKnBhcmVudHA7Ci0tCSAgICAgIC8qIFBhcmVudCBiZWNvbWVzIHRoZSB0b3Agb2YgdGhlIHRyZWUsIGdyYW5kcGFyZW50IGFuZAotLQkJIGNoaWxkIGFyZSBpdHMgc3VjY2Vzc29ycy4gICovCi0tCSAgICAgIHAtPnJlZCA9IDA7Ci0tCSAgICAgIGdwLT5yZWQgPSAxOwotLQkgICAgICBpZiAocF9yIDwgMCkKLS0JCXsKLS0JCSAgLyogTGVmdCBlZGdlcy4gICovCi0tCQkgIGdwLT5sZWZ0ID0gcC0+cmlnaHQ7Ci0tCQkgIHAtPnJpZ2h0ID0gZ3A7Ci0tCQl9Ci0tCSAgICAgIGVsc2UKLS0JCXsKLS0JCSAgLyogUmlnaHQgZWRnZXMuICAqLwotLQkJICBncC0+cmlnaHQgPSBwLT5sZWZ0OwotLQkJICBwLT5sZWZ0ID0gZ3A7Ci0tCQl9Ci0tCSAgICB9Ci0tCX0KLS0gICAgfQotLX0KLS0KLS0vKiBGaW5kIG9yIGluc2VydCBkYXR1bSBpbnRvIHNlYXJjaCB0cmVlLgotLSAgIEtFWSBpcyB0aGUga2V5IHRvIGJlIGxvY2F0ZWQsIFJPT1RQIGlzIHRoZSBhZGRyZXNzIG9mIHRyZWUgcm9vdCwKLS0gICBDT01QQVIgdGhlIG9yZGVyaW5nIGZ1bmN0aW9uLiAgKi8KLS12b2lkICoKLS1fX3RzZWFyY2ggKGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqKnZyb290cCwgX19jb21wYXJfZm5fdCBjb21wYXIpCi0tewotLSAgbm9kZSBxOwotLSAgbm9kZSAqcGFyZW50cCA9IE5VTEwsICpncGFyZW50cCA9IE5VTEw7Ci0tICBub2RlICpyb290cCA9IChub2RlICopIHZyb290cDsKLS0gIG5vZGUgKm5leHRwOwotLSAgaW50IHIgPSAwLCBwX3IgPSAwLCBncF9yID0gMDsgLyogTm8gdGhleSBtaWdodCBub3QsIE1yIENvbXBpbGVyLiAgKi8KLS0KLS0gIGlmIChyb290cCA9PSBOVUxMKQotLSAgICByZXR1cm4gTlVMTDsKLS0KLS0gIC8qIFRoaXMgc2F2ZXMgc29tZSBhZGRpdGlvbmFsIHRlc3RzIGJlbG93LiAgKi8KLS0gIGlmICgqcm9vdHAgIT0gTlVMTCkKLS0gICAgKCpyb290cCktPnJlZCA9IDA7Ci0tCi0tICBDSEVDS19UUkVFICgqcm9vdHApOwotLQotLSAgbmV4dHAgPSByb290cDsKLS0gIHdoaWxlICgqbmV4dHAgIT0gTlVMTCkKLS0gICAgewotLSAgICAgIG5vZGUgcm9vdCA9ICpyb290cDsKLS0gICAgICByID0gKCpjb21wYXIpIChrZXksIHJvb3QtPmtleSk7Ci0tICAgICAgaWYgKHIgPT0gMCkKLS0JcmV0dXJuIHJvb3Q7Ci0tCi0tICAgICAgbWF5YmVfc3BsaXRfZm9yX2luc2VydCAocm9vdHAsIHBhcmVudHAsIGdwYXJlbnRwLCBwX3IsIGdwX3IsIDApOwotLSAgICAgIC8qIElmIHRoYXQgZGlkIGFueSByb3RhdGlvbnMsIHBhcmVudHAgYW5kIGdwYXJlbnRwIGFyZSBub3cgZ2FyYmFnZS4KLS0JIFRoYXQgZG9lc24ndCBtYXR0ZXIsIGJlY2F1c2UgdGhlIHZhbHVlcyB0aGV5IGNvbnRhaW4gYXJlIG5ldmVyCi0tCSB1c2VkIGFnYWluIGluIHRoYXQgY2FzZS4gICovCi0tCi0tICAgICAgbmV4dHAgPSByIDwgMCA/ICZyb290LT5sZWZ0IDogJnJvb3QtPnJpZ2h0OwotLSAgICAgIGlmICgqbmV4dHAgPT0gTlVMTCkKLS0JYnJlYWs7Ci0tCi0tICAgICAgZ3BhcmVudHAgPSBwYXJlbnRwOwotLSAgICAgIHBhcmVudHAgPSByb290cDsKLS0gICAgICByb290cCA9IG5leHRwOwotLQotLSAgICAgIGdwX3IgPSBwX3I7Ci0tICAgICAgcF9yID0gcjsKLS0gICAgfQotLQotLSAgcSA9IChzdHJ1Y3Qgbm9kZV90ICopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgbm9kZV90KSk7Ci0tICBpZiAocSAhPSBOVUxMKQotLSAgICB7Ci0tICAgICAgKm5leHRwID0gcTsJCQkvKiBsaW5rIG5ldyBub2RlIHRvIG9sZCAqLwotLSAgICAgIHEtPmtleSA9IGtleTsJCQkvKiBpbml0aWFsaXplIG5ldyBub2RlICovCi0tICAgICAgcS0+cmVkID0gMTsKLS0gICAgICBxLT5sZWZ0ID0gcS0+cmlnaHQgPSBOVUxMOwotLQotLSAgICAgIGlmIChuZXh0cCAhPSByb290cCkKLS0JLyogVGhlcmUgbWF5IGJlIHR3byByZWQgZWRnZXMgaW4gYSByb3cgbm93LCB3aGljaCB3ZSBtdXN0IGF2b2lkIGJ5Ci0tCSAgIHJvdGF0aW5nIHRoZSB0cmVlLiAgKi8KLS0JbWF5YmVfc3BsaXRfZm9yX2luc2VydCAobmV4dHAsIHJvb3RwLCBwYXJlbnRwLCByLCBwX3IsIDEpOwotLSAgICB9Ci0tCi0tICByZXR1cm4gcTsKLS19Ci0tI2lmZGVmIHdlYWtfYWxpYXMKLS13ZWFrX2FsaWFzIChfX3RzZWFyY2gsIHRzZWFyY2gpCi0tI2VuZGlmCi0tCi0tCi0tLyogRmluZCBkYXR1bSBpbiBzZWFyY2ggdHJlZS4KLS0gICBLRVkgaXMgdGhlIGtleSB0byBiZSBsb2NhdGVkLCBST09UUCBpcyB0aGUgYWRkcmVzcyBvZiB0cmVlIHJvb3QsCi0tICAgQ09NUEFSIHRoZSBvcmRlcmluZyBmdW5jdGlvbi4gICovCi0tdm9pZCAqCi0tX190ZmluZCAoa2V5LCB2cm9vdHAsIGNvbXBhcikKLS0gICAgIGNvbnN0IHZvaWQgKmtleTsKLS0gICAgIHZvaWQgKmNvbnN0ICp2cm9vdHA7Ci0tICAgICBfX2NvbXBhcl9mbl90IGNvbXBhcjsKLS17Ci0tICBub2RlICpyb290cCA9IChub2RlICopIHZyb290cDsKLS0KLS0gIGlmIChyb290cCA9PSBOVUxMKQotLSAgICByZXR1cm4gTlVMTDsKLS0KLS0gIENIRUNLX1RSRUUgKCpyb290cCk7Ci0tCi0tICB3aGlsZSAoKnJvb3RwICE9IE5VTEwpCi0tICAgIHsKLS0gICAgICBub2RlIHJvb3QgPSAqcm9vdHA7Ci0tICAgICAgaW50IHI7Ci0tCi0tICAgICAgciA9ICgqY29tcGFyKSAoa2V5LCByb290LT5rZXkpOwotLSAgICAgIGlmIChyID09IDApCi0tCXJldHVybiByb290OwotLQotLSAgICAgIHJvb3RwID0gciA8IDAgPyAmcm9vdC0+bGVmdCA6ICZyb290LT5yaWdodDsKLS0gICAgfQotLSAgcmV0dXJuIE5VTEw7Ci0tfQotLSNpZmRlZiB3ZWFrX2FsaWFzCi0td2Vha19hbGlhcyAoX190ZmluZCwgdGZpbmQpCi0tI2VuZGlmCi0tCi0tCi0tLyogRGVsZXRlIG5vZGUgd2l0aCBnaXZlbiBrZXkuCi0tICAgS0VZIGlzIHRoZSBrZXkgdG8gYmUgZGVsZXRlZCwgUk9PVFAgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJvb3Qgb2YgdHJlZSwKLS0gICBDT01QQVIgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24uICAqLwotLXZvaWQgKgotLV9fdGRlbGV0ZSAoY29uc3Qgdm9pZCAqa2V5LCB2b2lkICoqdnJvb3RwLCBfX2NvbXBhcl9mbl90IGNvbXBhcikKLS17Ci0tICBub2RlIHAsIHEsIHIsIHJldHZhbDsKLS0gIGludCBjbXA7Ci0tICBub2RlICpyb290cCA9IChub2RlICopIHZyb290cDsKLS0gIG5vZGUgcm9vdCwgdW5jaGFpbmVkOwotLSAgLyogU3RhY2sgb2Ygbm9kZXMgc28gd2UgcmVtZW1iZXIgdGhlIHBhcmVudHMgd2l0aG91dCByZWN1cnNpb24uICBJdCdzCi0tICAgICBfdmVyeV8gdW5saWtlbHkgdGhhdCB0aGVyZSBhcmUgcGF0aHMgbG9uZ2VyIHRoYW4gNDAgbm9kZXMuICBUaGUgdHJlZQotLSAgICAgd291bGQgbmVlZCB0byBoYXZlIGFyb3VuZCAyNTAuMDAwIG5vZGVzLiAgKi8KLS0gIGludCBzdGFja3NpemUgPSAxMDA7Ci0tICBpbnQgc3AgPSAwOwotLSAgbm9kZSAqbm9kZXN0YWNrWzEwMF07Ci0tCi0tICBpZiAocm9vdHAgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tICBwID0gKnJvb3RwOwotLSAgaWYgKHAgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tCi0tICBDSEVDS19UUkVFIChwKTsKLS0KLS0gIHdoaWxlICgoY21wID0gKCpjb21wYXIpIChrZXksICgqcm9vdHApLT5rZXkpKSAhPSAwKQotLSAgICB7Ci0tICAgICAgaWYgKHNwID09IHN0YWNrc2l6ZSkKLS0JYWJvcnQgKCk7Ci0tCi0tICAgICAgbm9kZXN0YWNrW3NwKytdID0gcm9vdHA7Ci0tICAgICAgcCA9ICpyb290cDsKLS0gICAgICByb290cCA9ICgoY21wIDwgMCkKLS0JICAgICAgID8gJigqcm9vdHApLT5sZWZ0Ci0tCSAgICAgICA6ICYoKnJvb3RwKS0+cmlnaHQpOwotLSAgICAgIGlmICgqcm9vdHAgPT0gTlVMTCkKLS0JcmV0dXJuIE5VTEw7Ci0tICAgIH0KLS0KLS0gIC8qIFRoaXMgaXMgYm9ndXMgaWYgdGhlIG5vZGUgdG8gYmUgZGVsZXRlZCBpcyB0aGUgcm9vdC4uLiB0aGlzIHJvdXRpbmUKLS0gICAgIHJlYWxseSBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIgd2l0aCAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZmFpbHVyZQotLSAgICAgYW5kIGVycm5vID0gRVNSQ0ggb3Igc29tZXRoaW5nLiAgKi8KLS0gIHJldHZhbCA9IHA7Ci0tCi0tICAvKiBXZSBkb24ndCB1bmNoYWluIHRoZSBub2RlIHdlIHdhbnQgdG8gZGVsZXRlLiBJbnN0ZWFkLCB3ZSBvdmVyd3JpdGUKLS0gICAgIGl0IHdpdGggaXRzIHN1Y2Nlc3NvciBhbmQgdW5jaGFpbiB0aGUgc3VjY2Vzc29yLiAgSWYgdGhlcmUgaXMgbm8KLS0gICAgIHN1Y2Nlc3Nvciwgd2UgcmVhbGx5IHVuY2hhaW4gdGhlIG5vZGUgdG8gYmUgZGVsZXRlZC4gICovCi0tCi0tICByb290ID0gKnJvb3RwOwotLQotLSAgciA9IHJvb3QtPnJpZ2h0OwotLSAgcSA9IHJvb3QtPmxlZnQ7Ci0tCi0tICBpZiAocSA9PSBOVUxMIHx8IHIgPT0gTlVMTCkKLS0gICAgdW5jaGFpbmVkID0gcm9vdDsKLS0gIGVsc2UKLS0gICAgewotLSAgICAgIG5vZGUgKnBhcmVudCA9IHJvb3RwLCAqdXAgPSAmcm9vdC0+cmlnaHQ7Ci0tICAgICAgZm9yICg7OykKLS0JewotLQkgIGlmIChzcCA9PSBzdGFja3NpemUpCi0tCSAgICBhYm9ydCAoKTsKLS0JICBub2Rlc3RhY2tbc3ArK10gPSBwYXJlbnQ7Ci0tCSAgcGFyZW50ID0gdXA7Ci0tCSAgaWYgKCgqdXApLT5sZWZ0ID09IE5VTEwpCi0tCSAgICBicmVhazsKLS0JICB1cCA9ICYoKnVwKS0+bGVmdDsKLS0JfQotLSAgICAgIHVuY2hhaW5lZCA9ICp1cDsKLS0gICAgfQotLQotLSAgLyogV2Uga25vdyB0aGF0IGVpdGhlciB0aGUgbGVmdCBvciByaWdodCBzdWNjZXNzb3Igb2YgVU5DSEFJTkVEIGlzIE5VTEwuCi0tICAgICBSIGJlY29tZXMgdGhlIG90aGVyIG9uZSwgaXQgaXMgY2hhaW5lZCBpbnRvIHRoZSBwYXJlbnQgb2YgVU5DSEFJTkVELiAgKi8KLS0gIHIgPSB1bmNoYWluZWQtPmxlZnQ7Ci0tICBpZiAociA9PSBOVUxMKQotLSAgICByID0gdW5jaGFpbmVkLT5yaWdodDsKLS0gIGlmIChzcCA9PSAwKQotLSAgICAqcm9vdHAgPSByOwotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgcSA9ICpub2Rlc3RhY2tbc3AtMV07Ci0tICAgICAgaWYgKHVuY2hhaW5lZCA9PSBxLT5yaWdodCkKLS0JcS0+cmlnaHQgPSByOwotLSAgICAgIGVsc2UKLS0JcS0+bGVmdCA9IHI7Ci0tICAgIH0KLS0KLS0gIGlmICh1bmNoYWluZWQgIT0gcm9vdCkKLS0gICAgcm9vdC0+a2V5ID0gdW5jaGFpbmVkLT5rZXk7Ci0tICBpZiAoIXVuY2hhaW5lZC0+cmVkKQotLSAgICB7Ci0tICAgICAgLyogTm93IHdlIGxvc3QgYSBibGFjayBlZGdlLCB3aGljaCBtZWFucyB0aGF0IHRoZSBudW1iZXIgb2YgYmxhY2sKLS0JIGVkZ2VzIG9uIGV2ZXJ5IHBhdGggaXMgbm8gbG9uZ2VyIGNvbnN0YW50LiAgV2UgbXVzdCBiYWxhbmNlIHRoZQotLQkgdHJlZS4gICovCi0tICAgICAgLyogTk9ERVNUQUNLIG5vdyBjb250YWlucyBhbGwgcGFyZW50cyBvZiBSLiAgUiBpcyBsaWtlbHkgdG8gYmUgTlVMTAotLQkgaW4gdGhlIGZpcnN0IGl0ZXJhdGlvbi4gICovCi0tICAgICAgLyogTlVMTCBub2RlcyBhcmUgY29uc2lkZXJlZCBibGFjayB0aHJvdWdob3V0IC0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yCi0tCSBjb3JyZWN0bmVzcy4gICovCi0tICAgICAgd2hpbGUgKHNwID4gMCAmJiAociA9PSBOVUxMIHx8ICFyLT5yZWQpKQotLQl7Ci0tCSAgbm9kZSAqcHAgPSBub2Rlc3RhY2tbc3AgLSAxXTsKLS0JICBwID0gKnBwOwotLQkgIC8qIFR3byBzeW1tZXRyaWMgY2FzZXMuICAqLwotLQkgIGlmIChyID09IHAtPmxlZnQpCi0tCSAgICB7Ci0tCSAgICAgIC8qIFEgaXMgUidzIGJyb3RoZXIsIFAgaXMgUidzIHBhcmVudC4gIFRoZSBzdWJ0cmVlIHdpdGggcm9vdAotLQkJIFIgaGFzIG9uZSBibGFjayBlZGdlIGxlc3MgdGhhbiB0aGUgc3VidHJlZSB3aXRoIHJvb3QgUS4gICovCi0tCSAgICAgIHEgPSBwLT5yaWdodDsKLS0JICAgICAgaWYgKHEtPnJlZCkKLS0JCXsKLS0JCSAgLyogSWYgUSBpcyByZWQsIHdlIGtub3cgdGhhdCBQIGlzIGJsYWNrLiBXZSByb3RhdGUgUCBsZWZ0Ci0tCQkgICAgIHNvIHRoYXQgUSBiZWNvbWVzIHRoZSB0b3Agbm9kZSBpbiB0aGUgdHJlZSwgd2l0aCBQIGJlbG93Ci0tCQkgICAgIGl0LiAgUCBpcyBjb2xvcmVkIHJlZCwgUSBpcyBjb2xvcmVkIGJsYWNrLgotLQkJICAgICBUaGlzIGFjdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGJsYWNrIGVkZ2UgY291bnQgZm9yIGFueQotLQkJICAgICBsZWFmIGluIHRoZSB0cmVlLCBidXQgd2Ugd2lsbCBiZSBhYmxlIHRvIHJlY29nbml6ZSBvbmUKLS0JCSAgICAgb2YgdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zLCB3aGljaCBhbGwgcmVxdWlyZSB0aGF0IFEKLS0JCSAgICAgaXMgYmxhY2suICAqLwotLQkJICBxLT5yZWQgPSAwOwotLQkJICBwLT5yZWQgPSAxOwotLQkJICAvKiBMZWZ0IHJvdGF0ZSBwLiAgKi8KLS0JCSAgcC0+cmlnaHQgPSBxLT5sZWZ0OwotLQkJICBxLT5sZWZ0ID0gcDsKLS0JCSAgKnBwID0gcTsKLS0JCSAgLyogTWFrZSBzdXJlIHBwIGlzIHJpZ2h0IGlmIHRoZSBjYXNlIGJlbG93IHRyaWVzIHRvIHVzZQotLQkJICAgICBpdC4gICovCi0tCQkgIG5vZGVzdGFja1tzcCsrXSA9IHBwID0gJnEtPmxlZnQ7Ci0tCQkgIHEgPSBwLT5yaWdodDsKLS0JCX0KLS0JICAgICAgLyogV2Uga25vdyB0aGF0IFEgY2FuJ3QgYmUgTlVMTCBoZXJlLiAgV2UgYWxzbyBrbm93IHRoYXQgUSBpcwotLQkJIGJsYWNrLiAgKi8KLS0JICAgICAgaWYgKChxLT5sZWZ0ID09IE5VTEwgfHwgIXEtPmxlZnQtPnJlZCkKLS0JCSAgJiYgKHEtPnJpZ2h0ID09IE5VTEwgfHwgIXEtPnJpZ2h0LT5yZWQpKQotLQkJewotLQkJICAvKiBRIGhhcyB0d28gYmxhY2sgc3VjY2Vzc29ycy4gIFdlIGNhbiBzaW1wbHkgY29sb3IgUSByZWQuCi0tCQkgICAgIFRoZSB3aG9sZSBzdWJ0cmVlIHdpdGggcm9vdCBQIGlzIG5vdyBtaXNzaW5nIG9uZSBibGFjawotLQkJICAgICBlZGdlLiAgTm90ZSB0aGF0IHRoaXMgYWN0aW9uIGNhbiB0ZW1wb3JhcmlseSBtYWtlIHRoZQotLQkJICAgICB0cmVlIGludmFsaWQgKGlmIFAgaXMgcmVkKS4gIEJ1dCB3ZSB3aWxsIGV4aXQgdGhlIGxvb3AKLS0JCSAgICAgaW4gdGhhdCBjYXNlIGFuZCBzZXQgUCBibGFjaywgd2hpY2ggYm90aCBtYWtlcyB0aGUgdHJlZQotLQkJICAgICB2YWxpZCBhbmQgYWxzbyBtYWtlcyB0aGUgYmxhY2sgZWRnZSBjb3VudCBjb21lIG91dAotLQkJICAgICByaWdodC4gIElmIFAgaXMgYmxhY2ssIHdlIGFyZSBhdCBsZWFzdCBvbmUgc3RlcCBjbG9zZXIKLS0JCSAgICAgdG8gdGhlIHJvb3QgYW5kIHdlJ2xsIHRyeSBhZ2FpbiB0aGUgbmV4dCBpdGVyYXRpb24uICAqLwotLQkJICBxLT5yZWQgPSAxOwotLQkJICByID0gcDsKLS0JCX0KLS0JICAgICAgZWxzZQotLQkJewotLQkJICAvKiBRIGlzIGJsYWNrLCBvbmUgb2YgUSdzIHN1Y2Nlc3NvcnMgaXMgcmVkLiAgV2UgY2FuCi0tCQkgICAgIHJlcGFpciB0aGUgdHJlZSB3aXRoIG9uZSBvcGVyYXRpb24gYW5kIHdpbGwgZXhpdCB0aGUKLS0JCSAgICAgbG9vcCBhZnRlcndhcmRzLiAgKi8KLS0JCSAgaWYgKHEtPnJpZ2h0ID09IE5VTEwgfHwgIXEtPnJpZ2h0LT5yZWQpCi0tCQkgICAgewotLQkJICAgICAgLyogVGhlIGxlZnQgb25lIGlzIHJlZC4gIFdlIHBlcmZvcm0gdGhlIHNhbWUgYWN0aW9uIGFzCi0tCQkJIGluIG1heWJlX3NwbGl0X2Zvcl9pbnNlcnQgd2hlcmUgdHdvIHJlZCBlZGdlcyBhcmUKLS0JCQkgYWRqYWNlbnQgYnV0IHBvaW50IGluIGRpZmZlcmVudCBkaXJlY3Rpb25zOgotLQkJCSBRJ3MgbGVmdCBzdWNjZXNzb3IgKGxldCdzIGNhbGwgaXQgUTIpIGJlY29tZXMgdGhlCi0tCQkJIHRvcCBvZiB0aGUgc3VidHJlZSB3ZSBhcmUgbG9va2luZyBhdCwgaXRzIHBhcmVudCAoUSkKLS0JCQkgYW5kIGdyYW5kcGFyZW50IChQKSBiZWNvbWUgaXRzIHN1Y2Nlc3NvcnMuIFRoZSBmb3JtZXIKLS0JCQkgc3VjY2Vzc29ycyBvZiBRMiBhcmUgcGxhY2VkIGJlbG93IFAgYW5kIFEuCi0tCQkJIFAgYmVjb21lcyBibGFjaywgYW5kIFEyIGdldHMgdGhlIGNvbG9yIHRoYXQgUCBoYWQuCi0tCQkJIFRoaXMgY2hhbmdlcyB0aGUgYmxhY2sgZWRnZSBjb3VudCBvbmx5IGZvciBub2RlIFIgYW5kCi0tCQkJIGl0cyBzdWNjZXNzb3JzLiAgKi8KLS0JCSAgICAgIG5vZGUgcTIgPSBxLT5sZWZ0OwotLQkJICAgICAgcTItPnJlZCA9IHAtPnJlZDsKLS0JCSAgICAgIHAtPnJpZ2h0ID0gcTItPmxlZnQ7Ci0tCQkgICAgICBxLT5sZWZ0ID0gcTItPnJpZ2h0OwotLQkJICAgICAgcTItPnJpZ2h0ID0gcTsKLS0JCSAgICAgIHEyLT5sZWZ0ID0gcDsKLS0JCSAgICAgICpwcCA9IHEyOwotLQkJICAgICAgcC0+cmVkID0gMDsKLS0JCSAgICB9Ci0tCQkgIGVsc2UKLS0JCSAgICB7Ci0tCQkgICAgICAvKiBJdCdzIHRoZSByaWdodCBvbmUuICBSb3RhdGUgUCBsZWZ0LiBQIGJlY29tZXMgYmxhY2ssCi0tCQkJIGFuZCBRIGdldHMgdGhlIGNvbG9yIHRoYXQgUCBoYWQuICBRJ3MgcmlnaHQgc3VjY2Vzc29yCi0tCQkJIGFsc28gYmVjb21lcyBibGFjay4gIFRoaXMgY2hhbmdlcyB0aGUgYmxhY2sgZWRnZQotLQkJCSBjb3VudCBvbmx5IGZvciBub2RlIFIgYW5kIGl0cyBzdWNjZXNzb3JzLiAgKi8KLS0JCSAgICAgIHEtPnJlZCA9IHAtPnJlZDsKLS0JCSAgICAgIHAtPnJlZCA9IDA7Ci0tCi0tCQkgICAgICBxLT5yaWdodC0+cmVkID0gMDsKLS0KLS0JCSAgICAgIC8qIGxlZnQgcm90YXRlIHAgKi8KLS0JCSAgICAgIHAtPnJpZ2h0ID0gcS0+bGVmdDsKLS0JCSAgICAgIHEtPmxlZnQgPSBwOwotLQkJICAgICAgKnBwID0gcTsKLS0JCSAgICB9Ci0tCi0tCQkgIC8qIFdlJ3JlIGRvbmUuICAqLwotLQkJICBzcCA9IDE7Ci0tCQkgIHIgPSBOVUxMOwotLQkJfQotLQkgICAgfQotLQkgIGVsc2UKLS0JICAgIHsKLS0JICAgICAgLyogQ29tbWVudHM6IHNlZSBhYm92ZS4gICovCi0tCSAgICAgIHEgPSBwLT5sZWZ0OwotLQkgICAgICBpZiAocS0+cmVkKQotLQkJewotLQkJICBxLT5yZWQgPSAwOwotLQkJICBwLT5yZWQgPSAxOwotLQkJICBwLT5sZWZ0ID0gcS0+cmlnaHQ7Ci0tCQkgIHEtPnJpZ2h0ID0gcDsKLS0JCSAgKnBwID0gcTsKLS0JCSAgbm9kZXN0YWNrW3NwKytdID0gcHAgPSAmcS0+cmlnaHQ7Ci0tCQkgIHEgPSBwLT5sZWZ0OwotLQkJfQotLQkgICAgICBpZiAoKHEtPnJpZ2h0ID09IE5VTEwgfHwgIXEtPnJpZ2h0LT5yZWQpCi0tCQkgICAgICAgJiYgKHEtPmxlZnQgPT0gTlVMTCB8fCAhcS0+bGVmdC0+cmVkKSkKLS0JCXsKLS0JCSAgcS0+cmVkID0gMTsKLS0JCSAgciA9IHA7Ci0tCQl9Ci0tCSAgICAgIGVsc2UKLS0JCXsKLS0JCSAgaWYgKHEtPmxlZnQgPT0gTlVMTCB8fCAhcS0+bGVmdC0+cmVkKQotLQkJICAgIHsKLS0JCSAgICAgIG5vZGUgcTIgPSBxLT5yaWdodDsKLS0JCSAgICAgIHEyLT5yZWQgPSBwLT5yZWQ7Ci0tCQkgICAgICBwLT5sZWZ0ID0gcTItPnJpZ2h0OwotLQkJICAgICAgcS0+cmlnaHQgPSBxMi0+bGVmdDsKLS0JCSAgICAgIHEyLT5sZWZ0ID0gcTsKLS0JCSAgICAgIHEyLT5yaWdodCA9IHA7Ci0tCQkgICAgICAqcHAgPSBxMjsKLS0JCSAgICAgIHAtPnJlZCA9IDA7Ci0tCQkgICAgfQotLQkJICBlbHNlCi0tCQkgICAgewotLQkJICAgICAgcS0+cmVkID0gcC0+cmVkOwotLQkJICAgICAgcC0+cmVkID0gMDsKLS0JCSAgICAgIHEtPmxlZnQtPnJlZCA9IDA7Ci0tCQkgICAgICBwLT5sZWZ0ID0gcS0+cmlnaHQ7Ci0tCQkgICAgICBxLT5yaWdodCA9IHA7Ci0tCQkgICAgICAqcHAgPSBxOwotLQkJICAgIH0KLS0JCSAgc3AgPSAxOwotLQkJICByID0gTlVMTDsKLS0JCX0KLS0JICAgIH0KLS0JICAtLXNwOwotLQl9Ci0tICAgICAgaWYgKHIgIT0gTlVMTCkKLS0Jci0+cmVkID0gMDsKLS0gICAgfQotLQotLSAgZnJlZSAodW5jaGFpbmVkKTsKLS0gIHJldHVybiByZXR2YWw7Ci0tfQotLSNpZmRlZiB3ZWFrX2FsaWFzCi0td2Vha19hbGlhcyAoX190ZGVsZXRlLCB0ZGVsZXRlKQotLSNlbmRpZgotLQotLQotLS8qIFdhbGsgdGhlIG5vZGVzIG9mIGEgdHJlZS4KLS0gICBST09UIGlzIHRoZSByb290IG9mIHRoZSB0cmVlIHRvIGJlIHdhbGtlZCwgQUNUSU9OIHRoZSBmdW5jdGlvbiB0byBiZQotLSAgIGNhbGxlZCBhdCBlYWNoIG5vZGUuICBMRVZFTCBpcyB0aGUgbGV2ZWwgb2YgUk9PVCBpbiB0aGUgd2hvbGUgdHJlZS4gICovCi0tc3RhdGljIHZvaWQKLS1pbnRlcm5hbF9mdW5jdGlvbgotLXRyZWN1cnNlIChjb25zdCB2b2lkICp2cm9vdCwgX19hY3Rpb25fZm5fdCBhY3Rpb24sIGludCBsZXZlbCkKLS17Ci0tICBjb25zdF9ub2RlIHJvb3QgPSAoY29uc3Rfbm9kZSkgdnJvb3Q7Ci0tCi0tICBpZiAocm9vdC0+bGVmdCA9PSBOVUxMICYmIHJvb3QtPnJpZ2h0ID09IE5VTEwpCi0tICAgICgqYWN0aW9uKSAocm9vdCwgbGVhZiwgbGV2ZWwpOwotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgKCphY3Rpb24pIChyb290LCBwcmVvcmRlciwgbGV2ZWwpOwotLSAgICAgIGlmIChyb290LT5sZWZ0ICE9IE5VTEwpCi0tCXRyZWN1cnNlIChyb290LT5sZWZ0LCBhY3Rpb24sIGxldmVsICsgMSk7Ci0tICAgICAgKCphY3Rpb24pIChyb290LCBwb3N0b3JkZXIsIGxldmVsKTsKLS0gICAgICBpZiAocm9vdC0+cmlnaHQgIT0gTlVMTCkKLS0JdHJlY3Vyc2UgKHJvb3QtPnJpZ2h0LCBhY3Rpb24sIGxldmVsICsgMSk7Ci0tICAgICAgKCphY3Rpb24pIChyb290LCBlbmRvcmRlciwgbGV2ZWwpOwotLSAgICB9Ci0tfQotLQotLQotLS8qIFdhbGsgdGhlIG5vZGVzIG9mIGEgdHJlZS4KLS0gICBST09UIGlzIHRoZSByb290IG9mIHRoZSB0cmVlIHRvIGJlIHdhbGtlZCwgQUNUSU9OIHRoZSBmdW5jdGlvbiB0byBiZQotLSAgIGNhbGxlZCBhdCBlYWNoIG5vZGUuICAqLwotLXZvaWQKLS1fX3R3YWxrIChjb25zdCB2b2lkICp2cm9vdCwgX19hY3Rpb25fZm5fdCBhY3Rpb24pCi0tewotLSAgY29uc3Rfbm9kZSByb290ID0gKGNvbnN0X25vZGUpIHZyb290OwotLQotLSAgQ0hFQ0tfVFJFRSAocm9vdCk7Ci0tCi0tICBpZiAocm9vdCAhPSBOVUxMICYmIGFjdGlvbiAhPSBOVUxMKQotLSAgICB0cmVjdXJzZSAocm9vdCwgYWN0aW9uLCAwKTsKLS19Ci0tI2lmZGVmIHdlYWtfYWxpYXMKLS13ZWFrX2FsaWFzIChfX3R3YWxrLCB0d2FsaykKLS0jZW5kaWYKLS0KLS0KLS0jaWZkZWYgX0xJQkMKLS0KLS0vKiBUaGUgc3RhbmRhcmRpemVkIGZ1bmN0aW9ucyBtaXNzIGFuIGltcG9ydGFudCBmdW5jdGlvbmFsaXR5OiB0aGUKLS0gICB0cmVlIGNhbm5vdCBiZSByZW1vdmVkIGVhc2lseS4gIFdlIHByb3ZpZGUgYSBmdW5jdGlvbiB0byBkbyB0aGlzLiAgKi8KLS1zdGF0aWMgdm9pZAotLWludGVybmFsX2Z1bmN0aW9uCi0tdGRlc3Ryb3lfcmVjdXJzZSAobm9kZSByb290LCBfX2ZyZWVfZm5fdCBmcmVlZmN0KQotLXsKLS0gIGlmIChyb290LT5sZWZ0ICE9IE5VTEwpCi0tICAgIHRkZXN0cm95X3JlY3Vyc2UgKHJvb3QtPmxlZnQsIGZyZWVmY3QpOwotLSAgaWYgKHJvb3QtPnJpZ2h0ICE9IE5VTEwpCi0tICAgIHRkZXN0cm95X3JlY3Vyc2UgKHJvb3QtPnJpZ2h0LCBmcmVlZmN0KTsKLS0gICgqZnJlZWZjdCkgKCh2b2lkICopIHJvb3QtPmtleSk7Ci0tICAvKiBGcmVlIHRoZSBub2RlIGl0c2VsZi4gICovCi0tICBmcmVlIChyb290KTsKLS19Ci0tCi0tdm9pZAotLV9fdGRlc3Ryb3kgKHZvaWQgKnZyb290LCBfX2ZyZWVfZm5fdCBmcmVlZmN0KQotLXsKLS0gIG5vZGUgcm9vdCA9IChub2RlKSB2cm9vdDsKLS0KLS0gIENIRUNLX1RSRUUgKHJvb3QpOwotLQotLSAgaWYgKHJvb3QgIT0gTlVMTCkKLS0gICAgdGRlc3Ryb3lfcmVjdXJzZSAocm9vdCwgZnJlZWZjdCk7Ci0tfQotLXdlYWtfYWxpYXMgKF9fdGRlc3Ryb3ksIHRkZXN0cm95KQotLQotLSNlbmRpZiAvKiBfTElCQyAqLwotLS0tIGEvaW50bC90c2VhcmNoLmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDgzICswLDAgQEAKLS0vKiBCaW5hcnkgdHJlZSBkYXRhIHN0cnVjdHVyZS4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZuZGVmIF9UU0VBUkNIX0gKLS0jZGVmaW5lIF9UU0VBUkNIX0gKLS0KLS0jaWYgSEFWRV9UU0VBUkNICi0tCi0tLyogR2V0IHRzZWFjaCgpLCB0ZmluZCgpLCB0ZGVsZXRlKCksIHR3YWxrKCkgZGVjbGFyYXRpb25zLiAgKi8KLS0jaW5jbHVkZSA8c2VhcmNoLmg+Ci0tCi0tI2Vsc2UKLS0KLS0jaWZkZWYgX19jcGx1c3BsdXMKLS1leHRlcm4gIkMiIHsKLS0jZW5kaWYKLS0KLS0vKiBTZWUgPGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9zdXN2M3hiZC9zZWFyY2guaC5odG1sPiwKLS0gICAgICAgPGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9zdXN2M3hzaC90c2VhcmNoLmh0bWw+Ci0tICAgZm9yIGRldGFpbHMuICAqLwotLQotLXR5cGVkZWYgZW51bQotLXsgCi0tICBwcmVvcmRlciwKLS0gIHBvc3RvcmRlciwgCi0tICBlbmRvcmRlciwKLS0gIGxlYWYKLS19Ci0tVklTSVQ7Ci0tCi0tLyogU2VhcmNoZXMgYW4gZWxlbWVudCBpbiB0aGUgdHJlZSAqVlJPT1RQIHRoYXQgY29tcGFyZXMgZXF1YWwgdG8gS0VZLgotLSAgIElmIG9uZSBpcyBmb3VuZCwgaXQgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIGEgbmV3IGVsZW1lbnQgZXF1YWwgdG8gS0VZCi0tICAgaXMgaW5zZXJ0ZWQgaW4gdGhlIHRyZWUgYW5kIGlzIHJldHVybmVkLiAgKi8KLS1leHRlcm4gdm9pZCAqIHRzZWFyY2ggKGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqKnZyb290cCwKLS0JCSAgICAgICBpbnQgKCpjb21wYXIpIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotLQotLS8qIFNlYXJjaGVzIGFuIGVsZW1lbnQgaW4gdGhlIHRyZWUgKlZST09UUCB0aGF0IGNvbXBhcmVzIGVxdWFsIHRvIEtFWS4KLS0gICBJZiBvbmUgaXMgZm91bmQsIGl0IGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBOVUxMIGlzIHJldHVybmVkLiAgKi8KLS1leHRlcm4gdm9pZCAqIHRmaW5kIChjb25zdCB2b2lkICprZXksIHZvaWQgKmNvbnN0ICp2cm9vdHAsCi0tCQkgICAgIGludCAoKmNvbXBhcikgKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci0tCi0tLyogU2VhcmNoZXMgYW4gZWxlbWVudCBpbiB0aGUgdHJlZSAqVlJPT1RQIHRoYXQgY29tcGFyZXMgZXF1YWwgdG8gS0VZLgotLSAgIElmIG9uZSBpcyBmb3VuZCwgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLCBhbmQgaXRzIHBhcmVudCBub2RlIGlzCi0tICAgcmV0dXJuZWQuICBPdGhlcndpc2UsIE5VTEwgaXMgcmV0dXJuZWQuICAqLwotLWV4dGVybiB2b2lkICogdGRlbGV0ZSAoY29uc3Qgdm9pZCAqa2V5LCB2b2lkICoqdnJvb3RwLAotLQkJICAgICAgIGludCAoKmNvbXBhcikgKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci0tCi0tLyogUGVyZm9ybSBhIGRlcHRoLWZpcnN0LCBsZWZ0LXRvLXJpZ2h0IHRyYXZlcnNhbCBvZiB0aGUgdHJlZSBWUk9PVC4KLS0gICBUaGUgQUNUSU9OIGZ1bmN0aW9uIGlzIGNhbGxlZDoKLS0gICAgIC0gZm9yIG5vbi1sZWFmIG5vZGVzOiAzIHRpbWVzLCBiZWZvcmUgdGhlIGxlZnQgc3VidHJlZSB0cmF2ZXJzYWwsCi0tICAgICAgIGFmdGVyIHRoZSBsZWZ0IHN1YnRyZWUgdHJhdmVyc2FsIGJ1dCBiZWZvcmUgdGhlIHJpZ2h0IHN1YnRyZWUgdHJhdmVyc2FsLAotLSAgICAgICBhbmQgYWZ0ZXIgdGhlIHJpZ2h0IHN1YnRyZWUgdHJhdmVyc2FsLAotLSAgICAgLSBmb3IgbGVhZiBub2Rlczogb25jZS4KLS0gICBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byBBQ1RJT04gYXJlOgotLSAgICAgMS4gdGhlIG5vZGU7IGl0IGNhbiBiZSBjYXN0ZWQgdG8gYSAnY29uc3Qgdm9pZCAqIGNvbnN0IConLCBpLmUuIGludG8gYQotLSAgICAgICAgcG9pbnRlciB0byB0aGUga2V5LAotLSAgICAgMi4gYW4gaW5kaWNhdG9yIHdoaWNoIHZpc2l0IG9mIHRoZSBub2RlIHRoaXMgaXMsCi0tICAgICAzLiB0aGUgbGV2ZWwgb2YgdGhlIG5vZGUgaW4gdGhlIHRyZWUgKDAgZm9yIHRoZSByb290KS4gICovCi0tZXh0ZXJuIHZvaWQgdHdhbGsgKGNvbnN0IHZvaWQgKnZyb290LAotLQkJICAgdm9pZCAoKmFjdGlvbikgKGNvbnN0IHZvaWQgKiwgVklTSVQsIGludCkpOwotLQotLSNpZmRlZiBfX2NwbHVzcGx1cwotLX0KLS0jZW5kaWYKLS0KLS0jZW5kaWYKLS0KLS0jZW5kaWYgLyogX1RTRUFSQ0hfSCAqLwotLS0tIGEvaW50bC92YXNucHJpbnRmLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDQ2NzcgKzAsMCBAQAotLS8qIHZzcHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgotLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tLyogVGhpcyBmaWxlIGNhbiBiZSBwYXJhbWV0cml6ZWQgd2l0aCB0aGUgZm9sbG93aW5nIG1hY3JvczoKLS0gICAgIFZBU05QUklOVEYgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgZGVmaW5lZC4KLS0gICAgIEZDSEFSX1QgICAgICAgICAgICBUaGUgZWxlbWVudCB0eXBlIG9mIHRoZSBmb3JtYXQgc3RyaW5nLgotLSAgICAgRENIQVJfVCAgICAgICAgICAgIFRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGRlc3RpbmF0aW9uIChyZXN1bHQpIHN0cmluZy4KLS0gICAgIEZDSEFSX1RfT05MWV9BU0NJSSBTZXQgdG8gMSB0byBlbmFibGUgdmVyaWZpY2F0aW9uIHRoYXQgYWxsIGNoYXJhY3RlcnMKLS0gICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZm9ybWF0IHN0cmluZyBhcmUgQVNDSUkuIE1VU1QgYmUgc2V0IGlmCi0tICAgICAgICAgICAgICAgICAgICAgICAgRkNIQVJfVCBhbmQgRENIQVJfVCBhcmUgbm90IHRoZSBzYW1lIHR5cGUuCi0tICAgICBESVJFQ1RJVkUgICAgICAgICAgU3RydWN0dXJlIGRlbm90aW5nIGEgZm9ybWF0IGRpcmVjdGl2ZS4KLS0gICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRzIG9uIEZDSEFSX1QuCi0tICAgICBESVJFQ1RJVkVTICAgICAgICAgU3RydWN0dXJlIGRlbm90aW5nIHRoZSBzZXQgb2YgZm9ybWF0IGRpcmVjdGl2ZXMgb2YgYQotLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBzdHJpbmcuICBEZXBlbmRzIG9uIEZDSEFSX1QuCi0tICAgICBQUklOVEZfUEFSU0UgICAgICAgRnVuY3Rpb24gdGhhdCBwYXJzZXMgYSBmb3JtYXQgc3RyaW5nLgotLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZHMgb24gRkNIQVJfVC4KLS0gICAgIERDSEFSX0NQWSAgICAgICAgICBtZW1jcHkgbGlrZSBmdW5jdGlvbiBmb3IgRENIQVJfVFtdIGFycmF5cy4KLS0gICAgIERDSEFSX1NFVCAgICAgICAgICBtZW1zZXQgbGlrZSBmdW5jdGlvbiBmb3IgRENIQVJfVFtdIGFycmF5cy4KLS0gICAgIERDSEFSX01CU05MRU4gICAgICBtYnNubGVuIGxpa2UgZnVuY3Rpb24gZm9yIERDSEFSX1RbXSBhcnJheXMuCi0tICAgICBTTlBSSU5URiAgICAgICAgICAgVGhlIHN5c3RlbSdzIHNucHJpbnRmIChvciBzaW1pbGFyKSBmdW5jdGlvbi4KLS0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1heSBiZSBlaXRoZXIgc25wcmludGYgb3Igc3dwcmludGYuCi0tICAgICBUQ0hBUl9UICAgICAgICAgICAgVGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgYXJndW1lbnQgYW5kIHJlc3VsdCBzdHJpbmcKLS0gICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2FpZCBTTlBSSU5URiBmdW5jdGlvbi4gIFRoaXMgbWF5IGJlIGVpdGhlcgotLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgb3Igd2NoYXJfdC4gIFRoZSBjb2RlIGV4cGxvaXRzIHRoYXQKLS0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKFRDSEFSX1QpIHwgc2l6ZW9mIChEQ0hBUl9UKSBhbmQKLS0gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm9mIChUQ0hBUl9UKSA8PSBhbGlnbm9mIChEQ0hBUl9UKS4KLS0gICAgIERDSEFSX0lTX1RDSEFSICAgICBTZXQgdG8gMSBpZiBEQ0hBUl9UIGFuZCBUQ0hBUl9UIGFyZSB0aGUgc2FtZSB0eXBlLgotLSAgICAgRENIQVJfQ09OVl9GUk9NX0VOQ09ESU5HIEEgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIGNoYXJbXSB0byBEQ0hBUltdLgotLSAgICAgRENIQVJfSVNfVUlOVDhfVCAgIFNldCB0byAxIGlmIERDSEFSX1QgaXMgdWludDhfdC4KLS0gICAgIERDSEFSX0lTX1VJTlQxNl9UICBTZXQgdG8gMSBpZiBEQ0hBUl9UIGlzIHVpbnQxNl90LgotLSAgICAgRENIQVJfSVNfVUlOVDMyX1QgIFNldCB0byAxIGlmIERDSEFSX1QgaXMgdWludDMyX3QuICAqLwotLQotLS8qIFRlbGwgZ2xpYmMncyA8c3RkaW8uaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3Igc25wcmludGYoKS4KLS0gICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKLS0gICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCi0tI2lmbmRlZiBfR05VX1NPVVJDRQotLSMgZGVmaW5lIF9HTlVfU09VUkNFICAgIDEKLS0jZW5kaWYKLS0KLS0jaWZuZGVmIFZBU05QUklOVEYKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLSNpZm5kZWYgSU5fTElCSU5UTAotLSMgaW5jbHVkZSA8YWxsb2NhLmg+Ci0tI2VuZGlmCi0tCi0tLyogU3BlY2lmaWNhdGlvbi4gICovCi0tI2lmbmRlZiBWQVNOUFJJTlRGCi0tIyBpZiBXSURFX0NIQVJfVkVSU0lPTgotLSMgIGluY2x1ZGUgInZhc253cHJpbnRmLmgiCi0tIyBlbHNlCi0tIyAgaW5jbHVkZSAidmFzbnByaW50Zi5oIgotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8bG9jYWxlLmg+CS8qIGxvY2FsZWNvbnYoKSAqLwotLSNpbmNsdWRlIDxzdGRpby5oPgkvKiBzbnByaW50ZigpLCBzcHJpbnRmKCkgKi8KLS0jaW5jbHVkZSA8c3RkbGliLmg+CS8qIGFib3J0KCksIG1hbGxvYygpLCByZWFsbG9jKCksIGZyZWUoKSAqLwotLSNpbmNsdWRlIDxzdHJpbmcuaD4JLyogbWVtY3B5KCksIHN0cmxlbigpICovCi0tI2luY2x1ZGUgPGVycm5vLmg+CS8qIGVycm5vICovCi0tI2luY2x1ZGUgPGxpbWl0cy5oPgkvKiBDSEFSX0JJVCAqLwotLSNpbmNsdWRlIDxmbG9hdC5oPgkvKiBEQkxfTUFYX0VYUCwgTERCTF9NQVhfRVhQICovCi0tI2lmIEhBVkVfTkxfTEFOR0lORk8KLS0jIGluY2x1ZGUgPGxhbmdpbmZvLmg+Ci0tI2VuZGlmCi0tI2lmbmRlZiBWQVNOUFJJTlRGCi0tIyBpZiBXSURFX0NIQVJfVkVSU0lPTgotLSMgIGluY2x1ZGUgIndwcmludGYtcGFyc2UuaCIKLS0jIGVsc2UKLS0jICBpbmNsdWRlICJwcmludGYtcGFyc2UuaCIKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tLyogQ2hlY2tlZCBzaXplX3QgY29tcHV0YXRpb25zLiAgKi8KLS0jaW5jbHVkZSAieHNpemUuaCIKLS0KLS0jaWYgKE5FRURfUFJJTlRGX0RPVUJMRSB8fCBORUVEX1BSSU5URl9MT05HX0RPVUJMRSkgJiYgIWRlZmluZWQgSU5fTElCSU5UTAotLSMgaW5jbHVkZSA8bWF0aC5oPgotLSMgaW5jbHVkZSAiZmxvYXQrLmgiCi0tI2VuZGlmCi0tCi0tI2lmIChORUVEX1BSSU5URl9ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfRE9VQkxFKSAmJiAhZGVmaW5lZCBJTl9MSUJJTlRMCi0tIyBpbmNsdWRlIDxtYXRoLmg+Ci0tIyBpbmNsdWRlICJpc25hbi5oIgotLSNlbmRpZgotLQotLSNpZiAoTkVFRF9QUklOVEZfTE9OR19ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfTE9OR19ET1VCTEUpICYmICFkZWZpbmVkIElOX0xJQklOVEwKLS0jIGluY2x1ZGUgPG1hdGguaD4KLS0jIGluY2x1ZGUgImlzbmFubC1ub2xpYm0uaCIKLS0jIGluY2x1ZGUgImZwdWN3LmgiCi0tI2VuZGlmCi0tCi0tI2lmIChORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCBORUVEX1BSSU5URl9ET1VCTEUpICYmICFkZWZpbmVkIElOX0xJQklOVEwKLS0jIGluY2x1ZGUgPG1hdGguaD4KLS0jIGluY2x1ZGUgImlzbmFuLmgiCi0tIyBpbmNsdWRlICJwcmludGYtZnJleHAuaCIKLS0jZW5kaWYKLS0KLS0jaWYgKE5FRURfUFJJTlRGX0RJUkVDVElWRV9BIHx8IE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFKSAmJiAhZGVmaW5lZCBJTl9MSUJJTlRMCi0tIyBpbmNsdWRlIDxtYXRoLmg+Ci0tIyBpbmNsdWRlICJpc25hbmwtbm9saWJtLmgiCi0tIyBpbmNsdWRlICJwcmludGYtZnJleHBsLmgiCi0tIyBpbmNsdWRlICJmcHVjdy5oIgotLSNlbmRpZgotLQotLS8qIFNvbWUgc3lzdGVtcywgbGlrZSBPU0YvMSA0LjAgYW5kIFdvZTMyLCBkb24ndCBoYXZlIEVPVkVSRkxPVy4gICovCi0tI2lmbmRlZiBFT1ZFUkZMT1cKLS0jIGRlZmluZSBFT1ZFUkZMT1cgRTJCSUcKLS0jZW5kaWYKLS0KLS0jaWYgSEFWRV9XQ0hBUl9UCi0tIyBpZiBIQVZFX1dDU0xFTgotLSMgIGRlZmluZSBsb2NhbF93Y3NsZW4gd2NzbGVuCi0tIyBlbHNlCi0tICAgLyogU29sYXJpcyAyLjUuMSBoYXMgd2NzbGVuKCkgaW4gYSBzZXBhcmF0ZSBsaWJyYXJ5IGxpYncuc28uIFRvIGF2b2lkCi0tICAgICAgYSBkZXBlbmRlbmN5IHRvd2FyZHMgdGhpcyBsaWJyYXJ5LCBoZXJlIGlzIGEgbG9jYWwgc3Vic3RpdHV0ZS4KLS0gICAgICBEZWZpbmUgdGhpcyBzdWJzdGl0dXRlIG9ubHkgb25jZSwgZXZlbiBpZiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQKLS0gICAgICB0d2ljZSBpbiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0LiAgKi8KLS0jICBpZm5kZWYgbG9jYWxfd2NzbGVuX2RlZmluZWQKLS0jICAgZGVmaW5lIGxvY2FsX3djc2xlbl9kZWZpbmVkIDEKLS1zdGF0aWMgc2l6ZV90Ci0tbG9jYWxfd2NzbGVuIChjb25zdCB3Y2hhcl90ICpzKQotLXsKLS0gIGNvbnN0IHdjaGFyX3QgKnB0cjsKLS0KLS0gIGZvciAocHRyID0gczsgKnB0ciAhPSAod2NoYXJfdCkgMDsgcHRyKyspCi0tICAgIDsKLS0gIHJldHVybiBwdHIgLSBzOwotLX0KLS0jICBlbmRpZgotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0vKiBEZWZhdWx0IHBhcmFtZXRlcnMuICAqLwotLSNpZm5kZWYgVkFTTlBSSU5URgotLSMgaWYgV0lERV9DSEFSX1ZFUlNJT04KLS0jICBkZWZpbmUgVkFTTlBSSU5URiB2YXNud3ByaW50ZgotLSMgIGRlZmluZSBGQ0hBUl9UIHdjaGFyX3QKLS0jICBkZWZpbmUgRENIQVJfVCB3Y2hhcl90Ci0tIyAgZGVmaW5lIFRDSEFSX1Qgd2NoYXJfdAotLSMgIGRlZmluZSBEQ0hBUl9JU19UQ0hBUiAxCi0tIyAgZGVmaW5lIERJUkVDVElWRSB3Y2hhcl90X2RpcmVjdGl2ZQotLSMgIGRlZmluZSBESVJFQ1RJVkVTIHdjaGFyX3RfZGlyZWN0aXZlcwotLSMgIGRlZmluZSBQUklOVEZfUEFSU0Ugd3ByaW50Zl9wYXJzZQotLSMgIGRlZmluZSBEQ0hBUl9DUFkgd21lbWNweQotLSMgZWxzZQotLSMgIGRlZmluZSBWQVNOUFJJTlRGIHZhc25wcmludGYKLS0jICBkZWZpbmUgRkNIQVJfVCBjaGFyCi0tIyAgZGVmaW5lIERDSEFSX1QgY2hhcgotLSMgIGRlZmluZSBUQ0hBUl9UIGNoYXIKLS0jICBkZWZpbmUgRENIQVJfSVNfVENIQVIgMQotLSMgIGRlZmluZSBESVJFQ1RJVkUgY2hhcl9kaXJlY3RpdmUKLS0jICBkZWZpbmUgRElSRUNUSVZFUyBjaGFyX2RpcmVjdGl2ZXMKLS0jICBkZWZpbmUgUFJJTlRGX1BBUlNFIHByaW50Zl9wYXJzZQotLSMgIGRlZmluZSBEQ0hBUl9DUFkgbWVtY3B5Ci0tIyBlbmRpZgotLSNlbmRpZgotLSNpZiBXSURFX0NIQVJfVkVSU0lPTgotLSAgLyogVENIQVJfVCBpcyB3Y2hhcl90LiAgKi8KLS0jIGRlZmluZSBVU0VfU05QUklOVEYgMQotLSMgaWYgSEFWRV9ERUNMX19TTldQUklOVEYKLS0gICAvKiBPbiBXaW5kb3dzLCB0aGUgZnVuY3Rpb24gc3dwcmludGYoKSBoYXMgYSBkaWZmZXJlbnQgc2lnbmF0dXJlIHRoYW4KLS0gICAgICBvbiBVbml4OyB3ZSB1c2UgdGhlIF9zbndwcmludGYoKSBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KLS0jICBkZWZpbmUgU05QUklOVEYgX3Nud3ByaW50ZgotLSMgZWxzZQotLSAgIC8qIFVuaXguICAqLwotLSMgIGRlZmluZSBTTlBSSU5URiBzd3ByaW50ZgotLSMgZW5kaWYKLS0jZWxzZQotLSAgLyogVENIQVJfVCBpcyBjaGFyLiAgKi8KLS0jIC8qIFVzZSBzbnByaW50ZiBpZiBpdCBleGlzdHMgdW5kZXIgdGhlIG5hbWUgJ3NucHJpbnRmJyBvciAnX3NucHJpbnRmJy4KLS0gICAgIEJ1dCBkb24ndCB1c2UgaXQgb24gQmVPUywgc2luY2UgQmVPUyBzbnByaW50ZiBwcm9kdWNlcyBubyBvdXRwdXQgaWYgdGhlCi0tICAgICBzaXplIGFyZ3VtZW50IGlzID49IDB4MzAwMDAwMC4gICovCi0tIyBpZiAoSEFWRV9ERUNMX19TTlBSSU5URiB8fCBIQVZFX1NOUFJJTlRGKSAmJiAhZGVmaW5lZCBfX0JFT1NfXwotLSMgIGRlZmluZSBVU0VfU05QUklOVEYgMQotLSMgZWxzZQotLSMgIGRlZmluZSBVU0VfU05QUklOVEYgMAotLSMgZW5kaWYKLS0jIGlmIEhBVkVfREVDTF9fU05QUklOVEYKLS0gICAvKiBXaW5kb3dzLiAgKi8KLS0jICBkZWZpbmUgU05QUklOVEYgX3NucHJpbnRmCi0tIyBlbHNlCi0tICAgLyogVW5peC4gICovCi0tIyAgZGVmaW5lIFNOUFJJTlRGIHNucHJpbnRmCi0tICAgLyogSGVyZSB3ZSBuZWVkIHRvIGNhbGwgdGhlIG5hdGl2ZSBzbnByaW50Ziwgbm90IHJwbF9zbnByaW50Zi4gICovCi0tIyAgdW5kZWYgc25wcmludGYKLS0jIGVuZGlmCi0tI2VuZGlmCi0tLyogSGVyZSB3ZSBuZWVkIHRvIGNhbGwgdGhlIG5hdGl2ZSBzcHJpbnRmLCBub3QgcnBsX3NwcmludGYuICAqLwotLSN1bmRlZiBzcHJpbnRmCi0tCi0tI2lmIChORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCBORUVEX1BSSU5URl9MT05HX0RPVUJMRSB8fCBORUVEX1BSSU5URl9ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfRE9VQkxFKSAmJiAhZGVmaW5lZCBJTl9MSUJJTlRMCi0tLyogRGV0ZXJtaW5lIHRoZSBkZWNpbWFsLXBvaW50IGNoYXJhY3RlciBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLiAgKi8KLS0jIGlmbmRlZiBkZWNpbWFsX3BvaW50X2NoYXJfZGVmaW5lZAotLSMgIGRlZmluZSBkZWNpbWFsX3BvaW50X2NoYXJfZGVmaW5lZCAxCi0tc3RhdGljIGNoYXIKLS1kZWNpbWFsX3BvaW50X2NoYXIgKCkKLS17Ci0tICBjb25zdCBjaGFyICpwb2ludDsKLS0gIC8qIERldGVybWluZSBpdCBpbiBhIG11bHRpdGhyZWFkLXNhZmUgd2F5LiAgV2Uga25vdyBubF9sYW5naW5mbyBpcwotLSAgICAgbXVsdGl0aHJlYWQtc2FmZSBvbiBnbGliYyBzeXN0ZW1zLCBidXQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIG11bHRpdGhyZWFkLQotLSAgICAgc2FmZSBieSBQT1NJWC4gIHNwcmludGYoKSwgaG93ZXZlciwgaXMgbXVsdGl0aHJlYWQtc2FmZS4gIGxvY2FsZWNvbnYoKQotLSAgICAgaXMgcmFyZWx5IG11bHRpdGhyZWFkLXNhZmUuICAqLwotLSMgIGlmIEhBVkVfTkxfTEFOR0lORk8gJiYgX19HTElCQ19fCi0tICBwb2ludCA9IG5sX2xhbmdpbmZvIChSQURJWENIQVIpOwotLSMgIGVsaWYgMQotLSAgY2hhciBwb2ludGJ1Zls1XTsKLS0gIHNwcmludGYgKHBvaW50YnVmLCAiJSMuMGYiLCAxLjApOwotLSAgcG9pbnQgPSAmcG9pbnRidWZbMV07Ci0tIyAgZWxzZQotLSAgcG9pbnQgPSBsb2NhbGVjb252ICgpIC0+IGRlY2ltYWxfcG9pbnQ7Ci0tIyAgZW5kaWYKLS0gIC8qIFRoZSBkZWNpbWFsIHBvaW50IGlzIGFsd2F5cyBhIHNpbmdsZSBieXRlOiBlaXRoZXIgJy4nIG9yICcsJy4gICovCi0tICByZXR1cm4gKHBvaW50WzBdICE9ICdcMCcgPyBwb2ludFswXSA6ICcuJyk7Ci0tfQotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0jaWYgTkVFRF9QUklOVEZfSU5GSU5JVEVfRE9VQkxFICYmICFORUVEX1BSSU5URl9ET1VCTEUgJiYgIWRlZmluZWQgSU5fTElCSU5UTAotLQotLS8qIEVxdWl2YWxlbnQgdG8gIWlzZmluaXRlKHgpIHx8IHggPT0gMCwgYnV0IGRvZXMgbm90IHJlcXVpcmUgbGlibS4gICovCi0tc3RhdGljIGludAotLWlzX2luZmluaXRlX29yX3plcm8gKGRvdWJsZSB4KQotLXsKLS0gIHJldHVybiBpc25hbiAoeCkgfHwgeCArIHggPT0geDsKLS19Ci0tCi0tI2VuZGlmCi0tCi0tI2lmIE5FRURfUFJJTlRGX0lORklOSVRFX0xPTkdfRE9VQkxFICYmICFORUVEX1BSSU5URl9MT05HX0RPVUJMRSAmJiAhZGVmaW5lZCBJTl9MSUJJTlRMCi0tCi0tLyogRXF1aXZhbGVudCB0byAhaXNmaW5pdGUoeCksIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGxpYm0uICAqLwotLXN0YXRpYyBpbnQKLS1pc19pbmZpbml0ZWwgKGxvbmcgZG91YmxlIHgpCi0tewotLSAgcmV0dXJuIGlzbmFubCAoeCkgfHwgKHggKyB4ID09IHggJiYgeCAhPSAwLjBMKTsKLS19Ci0tCi0tI2VuZGlmCi0tCi0tI2lmIChORUVEX1BSSU5URl9MT05HX0RPVUJMRSB8fCBORUVEX1BSSU5URl9ET1VCTEUpICYmICFkZWZpbmVkIElOX0xJQklOVEwKLS0KLS0vKiBDb252ZXJ0aW5nICdsb25nIGRvdWJsZScgdG8gZGVjaW1hbCB3aXRob3V0IHJhcmUgcm91bmRpbmcgYnVncyByZXF1aXJlcwotLSAgIHJlYWwgYmlnbnVtcy4gIFdlIHVzZSB0aGUgbmFtaW5nIGNvbnZlbnRpb25zIG9mIEdOVSBnbXAsIGJ1dCB2YXN0bHkgc2ltcGxlcgotLSAgIChhbmQgc2xvd2VyKSBhbGdvcml0aG1zLiAgKi8KLS0KLS10eXBlZGVmIHVuc2lnbmVkIGludCBtcF9saW1iX3Q7Ci0tIyBkZWZpbmUgR01QX0xJTUJfQklUUyAzMgotLXR5cGVkZWYgaW50IG1wX2xpbWJfdmVyaWZ5WzIgKiAoc2l6ZW9mIChtcF9saW1iX3QpICogQ0hBUl9CSVQgPT0gR01QX0xJTUJfQklUUykgLSAxXTsKLS0KLS10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBtcF90d29saW1iX3Q7Ci0tIyBkZWZpbmUgR01QX1RXT0xJTUJfQklUUyA2NAotLXR5cGVkZWYgaW50IG1wX3R3b2xpbWJfdmVyaWZ5WzIgKiAoc2l6ZW9mIChtcF90d29saW1iX3QpICogQ0hBUl9CSVQgPT0gR01QX1RXT0xJTUJfQklUUykgLSAxXTsKLS0KLS0vKiBSZXByZXNlbnRhdGlvbiBvZiBhIGJpZ251bSA+PSAwLiAgKi8KLS10eXBlZGVmIHN0cnVjdAotLXsKLS0gIHNpemVfdCBubGltYnM7Ci0tICBtcF9saW1iX3QgKmxpbWJzOyAvKiBCaXRzIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIsIGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLiAgKi8KLS19IG1wbl90OwotLQotLS8qIENvbXB1dGUgdGhlIHByb2R1Y3Qgb2YgdHdvIGJpZ251bXMgPj0gMC4KLS0gICBSZXR1cm4gdGhlIGFsbG9jYXRlZCBtZW1vcnkgaW4gY2FzZSBvZiBzdWNjZXNzLCBOVUxMIGluIGNhc2Ugb2YgbWVtb3J5Ci0tICAgYWxsb2NhdGlvbiBmYWlsdXJlLiAgKi8KLS1zdGF0aWMgdm9pZCAqCi0tbXVsdGlwbHkgKG1wbl90IHNyYzEsIG1wbl90IHNyYzIsIG1wbl90ICpkZXN0KQotLXsKLS0gIGNvbnN0IG1wX2xpbWJfdCAqcDE7Ci0tICBjb25zdCBtcF9saW1iX3QgKnAyOwotLSAgc2l6ZV90IGxlbjE7Ci0tICBzaXplX3QgbGVuMjsKLS0KLS0gIGlmIChzcmMxLm5saW1icyA8PSBzcmMyLm5saW1icykKLS0gICAgewotLSAgICAgIGxlbjEgPSBzcmMxLm5saW1iczsKLS0gICAgICBwMSA9IHNyYzEubGltYnM7Ci0tICAgICAgbGVuMiA9IHNyYzIubmxpbWJzOwotLSAgICAgIHAyID0gc3JjMi5saW1iczsKLS0gICAgfQotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgbGVuMSA9IHNyYzIubmxpbWJzOwotLSAgICAgIHAxID0gc3JjMi5saW1iczsKLS0gICAgICBsZW4yID0gc3JjMS5ubGltYnM7Ci0tICAgICAgcDIgPSBzcmMxLmxpbWJzOwotLSAgICB9Ci0tICAvKiBOb3cgMCA8PSBsZW4xIDw9IGxlbjIuICAqLwotLSAgaWYgKGxlbjEgPT0gMCkKLS0gICAgewotLSAgICAgIC8qIHNyYzEgb3Igc3JjMiBpcyB6ZXJvLiAgKi8KLS0gICAgICBkZXN0LT5ubGltYnMgPSAwOwotLSAgICAgIGRlc3QtPmxpbWJzID0gKG1wX2xpbWJfdCAqKSBtYWxsb2MgKDEpOwotLSAgICB9Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICAvKiBIZXJlIDEgPD0gbGVuMSA8PSBsZW4yLiAgKi8KLS0gICAgICBzaXplX3QgZGxlbjsKLS0gICAgICBtcF9saW1iX3QgKmRwOwotLSAgICAgIHNpemVfdCBrLCBpLCBqOwotLQotLSAgICAgIGRsZW4gPSBsZW4xICsgbGVuMjsKLS0gICAgICBkcCA9IChtcF9saW1iX3QgKikgbWFsbG9jIChkbGVuICogc2l6ZW9mIChtcF9saW1iX3QpKTsKLS0gICAgICBpZiAoZHAgPT0gTlVMTCkKLS0JcmV0dXJuIE5VTEw7Ci0tICAgICAgZm9yIChrID0gbGVuMjsgayA+IDA7ICkKLS0JZHBbLS1rXSA9IDA7Ci0tICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjE7IGkrKykKLS0JewotLQkgIG1wX2xpbWJfdCBkaWdpdDEgPSBwMVtpXTsKLS0JICBtcF90d29saW1iX3QgY2FycnkgPSAwOwotLQkgIGZvciAoaiA9IDA7IGogPCBsZW4yOyBqKyspCi0tCSAgICB7Ci0tCSAgICAgIG1wX2xpbWJfdCBkaWdpdDIgPSBwMltqXTsKLS0JICAgICAgY2FycnkgKz0gKG1wX3R3b2xpbWJfdCkgZGlnaXQxICogKG1wX3R3b2xpbWJfdCkgZGlnaXQyOwotLQkgICAgICBjYXJyeSArPSBkcFtpICsgal07Ci0tCSAgICAgIGRwW2kgKyBqXSA9IChtcF9saW1iX3QpIGNhcnJ5OwotLQkgICAgICBjYXJyeSA9IGNhcnJ5ID4+IEdNUF9MSU1CX0JJVFM7Ci0tCSAgICB9Ci0tCSAgZHBbaSArIGxlbjJdID0gKG1wX2xpbWJfdCkgY2Fycnk7Ci0tCX0KLS0gICAgICAvKiBOb3JtYWxpc2UuICAqLwotLSAgICAgIHdoaWxlIChkbGVuID4gMCAmJiBkcFtkbGVuIC0gMV0gPT0gMCkKLS0JZGxlbi0tOwotLSAgICAgIGRlc3QtPm5saW1icyA9IGRsZW47Ci0tICAgICAgZGVzdC0+bGltYnMgPSBkcDsKLS0gICAgfQotLSAgcmV0dXJuIGRlc3QtPmxpbWJzOwotLX0KLS0KLS0vKiBDb21wdXRlIHRoZSBxdW90aWVudCBvZiBhIGJpZ251bSBhID49IDAgYW5kIGEgYmlnbnVtIGIgPiAwLgotLSAgIGEgaXMgd3JpdHRlbiBhcyAgYSA9IHEgKiBiICsgciAgd2l0aCAwIDw9IHIgPCBiLiAgcSBpcyB0aGUgcXVvdGllbnQsIHIKLS0gICB0aGUgcmVtYWluZGVyLgotLSAgIEZpbmFsbHksIHJvdW5kLXRvLWV2ZW4gaXMgcGVyZm9ybWVkOiBJZiByID4gYi8yIG9yIGlmIHIgPSBiLzIgYW5kIHEgaXMgb2RkLAotLSAgIHEgaXMgaW5jcmVtZW50ZWQuCi0tICAgUmV0dXJuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlIG9mIG1lbW9yeQotLSAgIGFsbG9jYXRpb24gZmFpbHVyZS4gICovCi0tc3RhdGljIHZvaWQgKgotLWRpdmlkZSAobXBuX3QgYSwgbXBuX3QgYiwgbXBuX3QgKnEpCi0tewotLSAgLyogQWxnb3JpdGhtOgotLSAgICAgRmlyc3Qgbm9ybWFsaXNlIGEgYW5kIGI6IGE9W2FbbS0xXSwuLi4sYVswXV0sIGI9W2Jbbi0xXSwuLi4sYlswXV0KLS0gICAgIHdpdGggbT49MCBhbmQgbj4wIChpbiBiYXNlIGJldGEgPSAyXkdNUF9MSU1CX0JJVFMpLgotLSAgICAgSWYgbTxuLCB0aGVuIHE6PTAgYW5kIHI6PWEuCi0tICAgICBJZiBtPj1uPTEsIHBlcmZvcm0gYSBzaW5nbGUtcHJlY2lzaW9uIGRpdmlzaW9uOgotLSAgICAgICByOj0wLCBqOj1tLAotLSAgICAgICB3aGlsZSBqPjAgZG8KLS0gICAgICAgICB7SGVyZSAocVttLTFdKmJldGFeKG0tMSkrLi4uK3Fbal0qYmV0YV5qKSAqIGJbMF0gKyByKmJldGFeaiA9Ci0tICAgICAgICAgICAgICAgPSBhW20tMV0qYmV0YV4obS0xKSsuLi4rYVtqXSpiZXRhXmogdW5kIDA8PXI8YlswXTxiZXRhfQotLSAgICAgICAgIGo6PWotMSwgcjo9cipiZXRhK2Fbal0sIHFbal06PWZsb29yKHIvYlswXSksIHI6PXItYlswXSpxW2pdLgotLSAgICAgICBOb3JtYWxpc2UgW3FbbS0xXSwuLi4scVswXV0sIHlpZWxkcyBxLgotLSAgICAgSWYgbT49bj4xLCBwZXJmb3JtIGEgbXVsdGlwbGUtcHJlY2lzaW9uIGRpdmlzaW9uOgotLSAgICAgICBXZSBoYXZlIGEvYiA8IGJldGFeKG0tbisxKS4KLS0gICAgICAgczo9aW50RHNpemUtMS0oaGlnaHRlc3QgYml0IGluIGJbbi0xXSksIDA8PXM8aW50RHNpemUuCi0tICAgICAgIFNoaWZ0IGEgYW5kIGIgbGVmdCBieSBzIGJpdHMsIGNvcHlpbmcgdGhlbS4gcjo9YS4KLS0gICAgICAgcj1bclttXSwuLi4sclswXV0sIGI9W2Jbbi0xXSwuLi4sYlswXV0gd2l0aCBiW24tMV0+PWJldGEvMi4KLS0gICAgICAgRm9yIGo9bS1uLC4uLiwwOiB7SGVyZSAwIDw9IHIgPCBiKmJldGFeKGorMSkufQotLSAgICAgICAgIENvbXB1dGUgcSogOgotLSAgICAgICAgICAgcSogOj0gZmxvb3IoKHJbaituXSpiZXRhK3JbaituLTFdKS9iW24tMV0pLgotLSAgICAgICAgICAgSW4gY2FzZSBvZiBvdmVyZmxvdyAocSogPj0gYmV0YSkgc2V0IHEqIDo9IGJldGEtMS4KLS0gICAgICAgICAgIENvbXB1dGUgYzIgOj0gKChyW2orbl0qYmV0YStyW2orbi0xXSkgLSBxKiAqIGJbbi0xXSkqYmV0YSArIHJbaituLTJdCi0tICAgICAgICAgICBhbmQgYzMgOj0gYltuLTJdICogcSouCi0tICAgICAgICAgICB7V2UgaGF2ZSAwIDw9IGMyIDwgMipiZXRhXjIsIGV2ZW4gMCA8PSBjMiA8IGJldGFeMiBpZiBubyBvdmVyZmxvdwotLSAgICAgICAgICAgIG9jY3VycmVkLiAgRnVydGhlcm1vcmUgMCA8PSBjMyA8IGJldGFeMi4KLS0gICAgICAgICAgICBJZiB0aGVyZSB3YXMgb3ZlcmZsb3cgYW5kCi0tICAgICAgICAgICAgcltqK25dKmJldGErcltqK24tMV0gLSBxKiAqIGJbbi0xXSA+PSBiZXRhLCBpLmUuIGMyID49IGJldGFeMiwKLS0gICAgICAgICAgICB0aGUgbmV4dCB0ZXN0IGNhbiBiZSBza2lwcGVkLn0KLS0gICAgICAgICAgIFdoaWxlIGMzID4gYzIsIHtIZXJlIDAgPD0gYzIgPCBjMyA8IGJldGFeMn0KLS0gICAgICAgICAgICAgUHV0IHEqIDo9IHEqIC0gMSwgYzIgOj0gYzIgKyBiW24tMV0qYmV0YSwgYzMgOj0gYzMgLSBiW24tMl0uCi0tICAgICAgICAgICBJZiBxKiA+IDA6Ci0tICAgICAgICAgICAgIFB1dCByIDo9IHIgLSBiICogcSogKiBiZXRhXmouIEluIGRldGFpbDoKLS0gICAgICAgICAgICAgICBbcltuK2pdLC4uLixyW2pdXSA6PSBbcltuK2pdLC4uLixyW2pdXSAtIHEqICogW2Jbbi0xXSwuLi4sYlswXV0uCi0tICAgICAgICAgICAgICAgaGVuY2U6IHU6PTAsIGZvciBpOj0wIHRvIG4tMSBkbwotLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgOj0gdSArIHEqICogYltpXSwKLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW2oraV06PXJbaitpXS0odSBtb2QgYmV0YSkgKCsgYmV0YSwgaWYgY2FycnkpLAotLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU6PXUgZGl2IGJldGEgKCsgMSwgaWYgY2FycnkgaW4gc3VidHJhY3Rpb24pCi0tICAgICAgICAgICAgICAgICAgICAgIHJbbitqXTo9cltuK2pdLXUuCi0tICAgICAgICAgICAgICAge1NpbmNlIGFsd2F5cyB1ID0gKHEqICogW2JbaS0xXSwuLi4sYlswXV0gZGl2IGJldGFeaSkgKyAxCi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgcSogKyAxIDw9IGJldGEsCi0tICAgICAgICAgICAgICAgIHRoZSBjYXJyeSB1IGRvZXMgbm90IG92ZXJmbG93Ln0KLS0gICAgICAgICAgICAgSWYgYSBuZWdhdGl2ZSBjYXJyeSBvY2N1cnMsIHB1dCBxKiA6PSBxKiAtIDEKLS0gICAgICAgICAgICAgICBhbmQgW3JbbitqXSwuLi4scltqXV0gOj0gW3JbbitqXSwuLi4scltqXV0gKyBbMCxiW24tMV0sLi4uLGJbMF1dLgotLSAgICAgICAgIFNldCBxW2pdIDo9IHEqLgotLSAgICAgICBOb3JtYWxpc2UgW3FbbS1uXSwuLixxWzBdXTsgdGhpcyB5aWVsZHMgdGhlIHF1b3RpZW50IHEuCi0tICAgICAgIFNoaWZ0IFtyW24tMV0sLi4uLHJbMF1dIHJpZ2h0IGJ5IHMgYml0cyBhbmQgbm9ybWFsaXNlOyB0aGlzIHlpZWxkcyB0aGUKLS0gICAgICAgcmVzdCByLgotLSAgICAgICBUaGUgcm9vbSBmb3IgcVtqXSBjYW4gYmUgYWxsb2NhdGVkIGF0IHRoZSBtZW1vcnkgbG9jYXRpb24gb2YgcltuK2pdLgotLSAgICAgRmluYWxseSwgcm91bmQtdG8tZXZlbjoKLS0gICAgICAgU2hpZnQgciBsZWZ0IGJ5IDEgYml0LgotLSAgICAgICBJZiByID4gYiBvciBpZiByID0gYiBhbmQgcVswXSBpcyBvZGQsIHEgOj0gcSsxLgotLSAgICovCi0tICBjb25zdCBtcF9saW1iX3QgKmFfcHRyID0gYS5saW1iczsKLS0gIHNpemVfdCBhX2xlbiA9IGEubmxpbWJzOwotLSAgY29uc3QgbXBfbGltYl90ICpiX3B0ciA9IGIubGltYnM7Ci0tICBzaXplX3QgYl9sZW4gPSBiLm5saW1iczsKLS0gIG1wX2xpbWJfdCAqcm9vbXB0cjsKLS0gIG1wX2xpbWJfdCAqdG1wX3Jvb21wdHIgPSBOVUxMOwotLSAgbXBfbGltYl90ICpxX3B0cjsKLS0gIHNpemVfdCBxX2xlbjsKLS0gIG1wX2xpbWJfdCAqcl9wdHI7Ci0tICBzaXplX3Qgcl9sZW47Ci0tCi0tICAvKiBBbGxvY2F0ZSByb29tIGZvciBhX2xlbisyIGRpZ2l0cy4KLS0gICAgIChOZWVkIGFfbGVuKzEgZGlnaXRzIGZvciB0aGUgcmVhbCBkaXZpc2lvbiBhbmQgMSBtb3JlIGRpZ2l0IGZvciB0aGUKLS0gICAgIGZpbmFsIHJvdW5kaW5nIG9mIHEuKSAgKi8KLS0gIHJvb21wdHIgPSAobXBfbGltYl90ICopIG1hbGxvYyAoKGFfbGVuICsgMikgKiBzaXplb2YgKG1wX2xpbWJfdCkpOwotLSAgaWYgKHJvb21wdHIgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tCi0tICAvKiBOb3JtYWxpc2UgYS4gICovCi0tICB3aGlsZSAoYV9sZW4gPiAwICYmIGFfcHRyW2FfbGVuIC0gMV0gPT0gMCkKLS0gICAgYV9sZW4tLTsKLS0KLS0gIC8qIE5vcm1hbGlzZSBiLiAgKi8KLS0gIGZvciAoOzspCi0tICAgIHsKLS0gICAgICBpZiAoYl9sZW4gPT0gMCkKLS0JLyogRGl2aXNpb24gYnkgemVyby4gICovCi0tCWFib3J0ICgpOwotLSAgICAgIGlmIChiX3B0cltiX2xlbiAtIDFdID09IDApCi0tCWJfbGVuLS07Ci0tICAgICAgZWxzZQotLQlicmVhazsKLS0gICAgfQotLQotLSAgLyogSGVyZSBtID0gYV9sZW4gPj0gMCBhbmQgbiA9IGJfbGVuID4gMC4gICovCi0tCi0tICBpZiAoYV9sZW4gPCBiX2xlbikKLS0gICAgewotLSAgICAgIC8qIG08bjogdHJpdmlhbCBjYXNlLiAgcT0wLCByIDo9IGNvcHkgb2YgYS4gICovCi0tICAgICAgcl9wdHIgPSByb29tcHRyOwotLSAgICAgIHJfbGVuID0gYV9sZW47Ci0tICAgICAgbWVtY3B5IChyX3B0ciwgYV9wdHIsIGFfbGVuICogc2l6ZW9mIChtcF9saW1iX3QpKTsKLS0gICAgICBxX3B0ciA9IHJvb21wdHIgKyBhX2xlbjsKLS0gICAgICBxX2xlbiA9IDA7Ci0tICAgIH0KLS0gIGVsc2UgaWYgKGJfbGVuID09IDEpCi0tICAgIHsKLS0gICAgICAvKiBuPTE6IHNpbmdsZSBwcmVjaXNpb24gZGl2aXNpb24uCi0tCSBiZXRhXihtLTEpIDw9IGEgPCBiZXRhXm0gID09PiAgYmV0YV4obS0yKSA8PSBhL2IgPCBiZXRhXm0gICovCi0tICAgICAgcl9wdHIgPSByb29tcHRyOwotLSAgICAgIHFfcHRyID0gcm9vbXB0ciArIDE7Ci0tICAgICAgewotLQltcF9saW1iX3QgZGVuID0gYl9wdHJbMF07Ci0tCW1wX2xpbWJfdCByZW1haW5kZXIgPSAwOwotLQljb25zdCBtcF9saW1iX3QgKnNvdXJjZXB0ciA9IGFfcHRyICsgYV9sZW47Ci0tCW1wX2xpbWJfdCAqZGVzdHB0ciA9IHFfcHRyICsgYV9sZW47Ci0tCXNpemVfdCBjb3VudDsKLS0JZm9yIChjb3VudCA9IGFfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0tCSAgewotLQkgICAgbXBfdHdvbGltYl90IG51bSA9Ci0tCSAgICAgICgobXBfdHdvbGltYl90KSByZW1haW5kZXIgPDwgR01QX0xJTUJfQklUUykgfCAqLS1zb3VyY2VwdHI7Ci0tCSAgICAqLS1kZXN0cHRyID0gbnVtIC8gZGVuOwotLQkgICAgcmVtYWluZGVyID0gbnVtICUgZGVuOwotLQkgIH0KLS0JLyogTm9ybWFsaXNlIGFuZCBzdG9yZSByLiAgKi8KLS0JaWYgKHJlbWFpbmRlciA+IDApCi0tCSAgewotLQkgICAgcl9wdHJbMF0gPSByZW1haW5kZXI7Ci0tCSAgICByX2xlbiA9IDE7Ci0tCSAgfQotLQllbHNlCi0tCSAgcl9sZW4gPSAwOwotLQkvKiBOb3JtYWxpc2UgcS4gICovCi0tCXFfbGVuID0gYV9sZW47Ci0tCWlmIChxX3B0cltxX2xlbiAtIDFdID09IDApCi0tCSAgcV9sZW4tLTsKLS0gICAgICB9Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgewotLSAgICAgIC8qIG4+MTogbXVsdGlwbGUgcHJlY2lzaW9uIGRpdmlzaW9uLgotLQkgYmV0YV4obS0xKSA8PSBhIDwgYmV0YV5tLCBiZXRhXihuLTEpIDw9IGIgPCBiZXRhXm4gID09PgotLQkgYmV0YV4obS1uLTEpIDw9IGEvYiA8IGJldGFeKG0tbisxKS4gICovCi0tICAgICAgLyogRGV0ZXJtaW5lIHMuICAqLwotLSAgICAgIHNpemVfdCBzOwotLSAgICAgIHsKLS0JbXBfbGltYl90IG1zZCA9IGJfcHRyW2JfbGVuIC0gMV07IC8qID0gYltuLTFdLCA+IDAgKi8KLS0JcyA9IDMxOwotLQlpZiAobXNkID49IDB4MTAwMDApCi0tCSAgewotLQkgICAgbXNkID0gbXNkID4+IDE2OwotLQkgICAgcyAtPSAxNjsKLS0JICB9Ci0tCWlmIChtc2QgPj0gMHgxMDApCi0tCSAgewotLQkgICAgbXNkID0gbXNkID4+IDg7Ci0tCSAgICBzIC09IDg7Ci0tCSAgfQotLQlpZiAobXNkID49IDB4MTApCi0tCSAgewotLQkgICAgbXNkID0gbXNkID4+IDQ7Ci0tCSAgICBzIC09IDQ7Ci0tCSAgfQotLQlpZiAobXNkID49IDB4NCkKLS0JICB7Ci0tCSAgICBtc2QgPSBtc2QgPj4gMjsKLS0JICAgIHMgLT0gMjsKLS0JICB9Ci0tCWlmIChtc2QgPj0gMHgyKQotLQkgIHsKLS0JICAgIG1zZCA9IG1zZCA+PiAxOwotLQkgICAgcyAtPSAxOwotLQkgIH0KLS0gICAgICB9Ci0tICAgICAgLyogMCA8PSBzIDwgR01QX0xJTUJfQklUUy4KLS0JIENvcHkgYiwgc2hpZnRpbmcgaXQgbGVmdCBieSBzIGJpdHMuICAqLwotLSAgICAgIGlmIChzID4gMCkKLS0JewotLQkgIHRtcF9yb29tcHRyID0gKG1wX2xpbWJfdCAqKSBtYWxsb2MgKGJfbGVuICogc2l6ZW9mIChtcF9saW1iX3QpKTsKLS0JICBpZiAodG1wX3Jvb21wdHIgPT0gTlVMTCkKLS0JICAgIHsKLS0JICAgICAgZnJlZSAocm9vbXB0cik7Ci0tCSAgICAgIHJldHVybiBOVUxMOwotLQkgICAgfQotLQkgIHsKLS0JICAgIGNvbnN0IG1wX2xpbWJfdCAqc291cmNlcHRyID0gYl9wdHI7Ci0tCSAgICBtcF9saW1iX3QgKmRlc3RwdHIgPSB0bXBfcm9vbXB0cjsKLS0JICAgIG1wX3R3b2xpbWJfdCBhY2N1ID0gMDsKLS0JICAgIHNpemVfdCBjb3VudDsKLS0JICAgIGZvciAoY291bnQgPSBiX2xlbjsgY291bnQgPiAwOyBjb3VudC0tKQotLQkgICAgICB7Ci0tCQlhY2N1ICs9IChtcF90d29saW1iX3QpICpzb3VyY2VwdHIrKyA8PCBzOwotLQkJKmRlc3RwdHIrKyA9IChtcF9saW1iX3QpIGFjY3U7Ci0tCQlhY2N1ID0gYWNjdSA+PiBHTVBfTElNQl9CSVRTOwotLQkgICAgICB9Ci0tCSAgICAvKiBhY2N1IG11c3QgYmUgemVybywgc2luY2UgdGhhdCB3YXMgaG93IHMgd2FzIGRldGVybWluZWQuICAqLwotLQkgICAgaWYgKGFjY3UgIT0gMCkKLS0JICAgICAgYWJvcnQgKCk7Ci0tCSAgfQotLQkgIGJfcHRyID0gdG1wX3Jvb21wdHI7Ci0tCX0KLS0gICAgICAvKiBDb3B5IGEsIHNoaWZ0aW5nIGl0IGxlZnQgYnkgcyBiaXRzLCB5aWVsZHMgci4KLS0JIE1lbW9yeSBsYXlvdXQ6Ci0tCSBBdCB0aGUgYmVnaW5uaW5nOiByID0gcm9vbXB0clswLi5hX2xlbl0sCi0tCSBhdCB0aGUgZW5kOiByID0gcm9vbXB0clswLi5iX2xlbi0xXSwgcSA9IHJvb21wdHJbYl9sZW4uLmFfbGVuXSAgKi8KLS0gICAgICByX3B0ciA9IHJvb21wdHI7Ci0tICAgICAgaWYgKHMgPT0gMCkKLS0JewotLQkgIG1lbWNweSAocl9wdHIsIGFfcHRyLCBhX2xlbiAqIHNpemVvZiAobXBfbGltYl90KSk7Ci0tCSAgcl9wdHJbYV9sZW5dID0gMDsKLS0JfQotLSAgICAgIGVsc2UKLS0JewotLQkgIGNvbnN0IG1wX2xpbWJfdCAqc291cmNlcHRyID0gYV9wdHI7Ci0tCSAgbXBfbGltYl90ICpkZXN0cHRyID0gcl9wdHI7Ci0tCSAgbXBfdHdvbGltYl90IGFjY3UgPSAwOwotLQkgIHNpemVfdCBjb3VudDsKLS0JICBmb3IgKGNvdW50ID0gYV9sZW47IGNvdW50ID4gMDsgY291bnQtLSkKLS0JICAgIHsKLS0JICAgICAgYWNjdSArPSAobXBfdHdvbGltYl90KSAqc291cmNlcHRyKysgPDwgczsKLS0JICAgICAgKmRlc3RwdHIrKyA9IChtcF9saW1iX3QpIGFjY3U7Ci0tCSAgICAgIGFjY3UgPSBhY2N1ID4+IEdNUF9MSU1CX0JJVFM7Ci0tCSAgICB9Ci0tCSAgKmRlc3RwdHIrKyA9IChtcF9saW1iX3QpIGFjY3U7Ci0tCX0KLS0gICAgICBxX3B0ciA9IHJvb21wdHIgKyBiX2xlbjsKLS0gICAgICBxX2xlbiA9IGFfbGVuIC0gYl9sZW4gKyAxOyAvKiBxIHdpbGwgaGF2ZSBtLW4rMSBsaW1icyAqLwotLSAgICAgIHsKLS0Jc2l6ZV90IGogPSBhX2xlbiAtIGJfbGVuOyAvKiBtLW4gKi8KLS0JbXBfbGltYl90IGJfbXNkID0gYl9wdHJbYl9sZW4gLSAxXTsgLyogYltuLTFdICovCi0tCW1wX2xpbWJfdCBiXzJtc2QgPSBiX3B0cltiX2xlbiAtIDJdOyAvKiBiW24tMl0gKi8KLS0JbXBfdHdvbGltYl90IGJfbXNkZCA9IC8qIGJbbi0xXSpiZXRhK2Jbbi0yXSAqLwotLQkgICgobXBfdHdvbGltYl90KSBiX21zZCA8PCBHTVBfTElNQl9CSVRTKSB8IGJfMm1zZDsKLS0JLyogRGl2aXNpb24gbG9vcCwgdHJhdmVyc2VkIG0tbisxIHRpbWVzLgotLQkgICBqIGNvdW50cyBkb3duLCBiIGlzIHVuY2hhbmdlZCwgYmV0YS8yIDw9IGJbbi0xXSA8IGJldGEuICAqLwotLQlmb3IgKDs7KQotLQkgIHsKLS0JICAgIG1wX2xpbWJfdCBxX3N0YXI7Ci0tCSAgICBtcF9saW1iX3QgYzE7Ci0tCSAgICBpZiAocl9wdHJbaiArIGJfbGVuXSA8IGJfbXNkKSAvKiByW2orbl0gPCBiW24tMV0gPyAqLwotLQkgICAgICB7Ci0tCQkvKiBEaXZpZGUgcltqK25dKmJldGErcltqK24tMV0gYnkgYltuLTFdLCBubyBvdmVyZmxvdy4gICovCi0tCQltcF90d29saW1iX3QgbnVtID0KLS0JCSAgKChtcF90d29saW1iX3QpIHJfcHRyW2ogKyBiX2xlbl0gPDwgR01QX0xJTUJfQklUUykKLS0JCSAgfCByX3B0cltqICsgYl9sZW4gLSAxXTsKLS0JCXFfc3RhciA9IG51bSAvIGJfbXNkOwotLQkJYzEgPSBudW0gJSBiX21zZDsKLS0JICAgICAgfQotLQkgICAgZWxzZQotLQkgICAgICB7Ci0tCQkvKiBPdmVyZmxvdywgaGVuY2UgcltqK25dKmJldGErcltqK24tMV0gPj0gYmV0YSpiW24tMV0uICAqLwotLQkJcV9zdGFyID0gKG1wX2xpbWJfdCl+KG1wX2xpbWJfdCkwOyAvKiBxKiA9IGJldGEtMSAqLwotLQkJLyogVGVzdCB3aGV0aGVyIHJbaituXSpiZXRhK3JbaituLTFdIC0gKGJldGEtMSkqYltuLTFdID49IGJldGEKLS0JCSAgIDw9PT4gcltqK25dKmJldGErcltqK24tMV0gKyBiW24tMV0gPj0gYmV0YSpiW24tMV0rYmV0YQotLQkJICAgPD09PiBiW24tMV0gPCBmbG9vcigocltqK25dKmJldGErcltqK24tMV0rYltuLTFdKS9iZXRhKQotLQkJICAgICAgICB7PD0gYmV0YSAhfS4KLS0JCSAgIElmIHllcywganVtcCBkaXJlY3RseSB0byB0aGUgc3VidHJhY3Rpb24gbG9vcC4KLS0JCSAgIChPdGhlcndpc2UsIHJbaituXSpiZXRhK3JbaituLTFdIC0gKGJldGEtMSkqYltuLTFdIDwgYmV0YQotLQkJICAgIDw9PT4gZmxvb3IoKHJbaituXSpiZXRhK3JbaituLTFdK2Jbbi0xXSkvYmV0YSkgPSBiW24tMV0gKSAqLwotLQkJaWYgKHJfcHRyW2ogKyBiX2xlbl0gPiBiX21zZAotLQkJICAgIHx8IChjMSA9IHJfcHRyW2ogKyBiX2xlbiAtIDFdICsgYl9tc2QpIDwgYl9tc2QpCi0tCQkgIC8qIHJbaituXSA+PSBiW24tMV0rMSBvcgotLQkJICAgICByW2orbl0gPSBiW24tMV0gYW5kIHRoZSBhZGRpdGlvbiByW2orbi0xXStiW24tMV0gZ2l2ZXMgYQotLQkJICAgICBjYXJyeS4gICovCi0tCQkgIGdvdG8gc3VidHJhY3Q7Ci0tCSAgICAgIH0KLS0JICAgIC8qIHFfc3RhciA9IHEqLAotLQkgICAgICAgYzEgPSAocltqK25dKmJldGErcltqK24tMV0pIC0gcSogKiBiW24tMV0gKD49MCwgPGJldGEpLiAgKi8KLS0JICAgIHsKLS0JICAgICAgbXBfdHdvbGltYl90IGMyID0gLyogYzEqYmV0YStyW2orbi0yXSAqLwotLQkJKChtcF90d29saW1iX3QpIGMxIDw8IEdNUF9MSU1CX0JJVFMpIHwgcl9wdHJbaiArIGJfbGVuIC0gMl07Ci0tCSAgICAgIG1wX3R3b2xpbWJfdCBjMyA9IC8qIGJbbi0yXSAqIHEqICovCi0tCQkobXBfdHdvbGltYl90KSBiXzJtc2QgKiAobXBfdHdvbGltYl90KSBxX3N0YXI7Ci0tCSAgICAgIC8qIFdoaWxlIGMyIDwgYzMsIGluY3JlYXNlIGMyIGFuZCBkZWNyZWFzZSBjMy4KLS0JCSBDb25zaWRlciBjMy1jMi4gIFdoaWxlIGl0IGlzID4gMCwgZGVjcmVhc2UgaXQgYnkKLS0JCSBiW24tMV0qYmV0YStiW24tMl0uICBCZWNhdXNlIG9mIGJbbi0xXSpiZXRhK2Jbbi0yXSA+PSBiZXRhXjIvMgotLQkJIHRoaXMgY2FuIGhhcHBlbiBvbmx5IHR3aWNlLiAgKi8KLS0JICAgICAgaWYgKGMzID4gYzIpCi0tCQl7Ci0tCQkgIHFfc3RhciA9IHFfc3RhciAtIDE7IC8qIHEqIDo9IHEqIC0gMSAqLwotLQkJICBpZiAoYzMgLSBjMiA+IGJfbXNkZCkKLS0JCSAgICBxX3N0YXIgPSBxX3N0YXIgLSAxOyAvKiBxKiA6PSBxKiAtIDEgKi8KLS0JCX0KLS0JICAgIH0KLS0JICAgIGlmIChxX3N0YXIgPiAwKQotLQkgICAgICBzdWJ0cmFjdDoKLS0JICAgICAgewotLQkJLyogU3VidHJhY3QgciA6PSByIC0gYiAqIHEqICogYmV0YV5qLiAgKi8KLS0JCW1wX2xpbWJfdCBjcjsKLS0JCXsKLS0JCSAgY29uc3QgbXBfbGltYl90ICpzb3VyY2VwdHIgPSBiX3B0cjsKLS0JCSAgbXBfbGltYl90ICpkZXN0cHRyID0gcl9wdHIgKyBqOwotLQkJICBtcF90d29saW1iX3QgY2FycnkgPSAwOwotLQkJICBzaXplX3QgY291bnQ7Ci0tCQkgIGZvciAoY291bnQgPSBiX2xlbjsgY291bnQgPiAwOyBjb3VudC0tKQotLQkJICAgIHsKLS0JCSAgICAgIC8qIEhlcmUgMCA8PSBjYXJyeSA8PSBxKi4gICovCi0tCQkgICAgICBjYXJyeSA9Ci0tCQkJY2FycnkKLS0JCQkrIChtcF90d29saW1iX3QpIHFfc3RhciAqIChtcF90d29saW1iX3QpICpzb3VyY2VwdHIrKwotLQkJCSsgKG1wX2xpbWJfdCkgfigqZGVzdHB0cik7Ci0tCQkgICAgICAvKiBIZXJlIDAgPD0gY2FycnkgPD0gYmV0YSpxKiArIGJldGEtMS4gICovCi0tCQkgICAgICAqZGVzdHB0cisrID0gfihtcF9saW1iX3QpIGNhcnJ5OwotLQkJICAgICAgY2FycnkgPSBjYXJyeSA+PiBHTVBfTElNQl9CSVRTOyAvKiA8PSBxKiAqLwotLQkJICAgIH0KLS0JCSAgY3IgPSAobXBfbGltYl90KSBjYXJyeTsKLS0JCX0KLS0JCS8qIFN1YnRyYWN0IGNyIGZyb20gcl9wdHJbaiArIGJfbGVuXSwgdGhlbiBmb3JnZXQgYWJvdXQKLS0JCSAgIHJfcHRyW2ogKyBiX2xlbl0uICAqLwotLQkJaWYgKGNyID4gcl9wdHJbaiArIGJfbGVuXSkKLS0JCSAgewotLQkJICAgIC8qIFN1YnRyYWN0aW9uIGdhdmUgYSBjYXJyeS4gICovCi0tCQkgICAgcV9zdGFyID0gcV9zdGFyIC0gMTsgLyogcSogOj0gcSogLSAxICovCi0tCQkgICAgLyogQWRkIGIgYmFjay4gICovCi0tCQkgICAgewotLQkJICAgICAgY29uc3QgbXBfbGltYl90ICpzb3VyY2VwdHIgPSBiX3B0cjsKLS0JCSAgICAgIG1wX2xpbWJfdCAqZGVzdHB0ciA9IHJfcHRyICsgajsKLS0JCSAgICAgIG1wX2xpbWJfdCBjYXJyeSA9IDA7Ci0tCQkgICAgICBzaXplX3QgY291bnQ7Ci0tCQkgICAgICBmb3IgKGNvdW50ID0gYl9sZW47IGNvdW50ID4gMDsgY291bnQtLSkKLS0JCQl7Ci0tCQkJICBtcF9saW1iX3Qgc291cmNlMSA9ICpzb3VyY2VwdHIrKzsKLS0JCQkgIG1wX2xpbWJfdCBzb3VyY2UyID0gKmRlc3RwdHI7Ci0tCQkJICAqZGVzdHB0cisrID0gc291cmNlMSArIHNvdXJjZTIgKyBjYXJyeTsKLS0JCQkgIGNhcnJ5ID0KLS0JCQkgICAgKGNhcnJ5Ci0tCQkJICAgICA/IHNvdXJjZTEgPj0gKG1wX2xpbWJfdCkgfnNvdXJjZTIKLS0JCQkgICAgIDogc291cmNlMSA+IChtcF9saW1iX3QpIH5zb3VyY2UyKTsKLS0JCQl9Ci0tCQkgICAgfQotLQkJICAgIC8qIEZvcmdldCBhYm91dCB0aGUgY2FycnkgYW5kIGFib3V0IHJbaituXS4gICovCi0tCQkgIH0KLS0JICAgICAgfQotLQkgICAgLyogcSogaXMgZGV0ZXJtaW5lZC4gIFN0b3JlIGl0IGFzIHFbal0uICAqLwotLQkgICAgcV9wdHJbal0gPSBxX3N0YXI7Ci0tCSAgICBpZiAoaiA9PSAwKQotLQkgICAgICBicmVhazsKLS0JICAgIGotLTsKLS0JICB9Ci0tICAgICAgfQotLSAgICAgIHJfbGVuID0gYl9sZW47Ci0tICAgICAgLyogTm9ybWFsaXNlIHEuICAqLwotLSAgICAgIGlmIChxX3B0cltxX2xlbiAtIDFdID09IDApCi0tCXFfbGVuLS07Ci0tIyBpZiAwIC8qIE5vdCBuZWVkZWQgaGVyZSwgc2luY2Ugd2UgbmVlZCByIG9ubHkgdG8gY29tcGFyZSBpdCB3aXRoIGIvMiwgYW5kCi0tCSAgYiBpcyBzaGlmdGVkIGxlZnQgYnkgcyBiaXRzLiAgKi8KLS0gICAgICAvKiBTaGlmdCByIHJpZ2h0IGJ5IHMgYml0cy4gICovCi0tICAgICAgaWYgKHMgPiAwKQotLQl7Ci0tCSAgbXBfbGltYl90IHB0ciA9IHJfcHRyICsgcl9sZW47Ci0tCSAgbXBfdHdvbGltYl90IGFjY3UgPSAwOwotLQkgIHNpemVfdCBjb3VudDsKLS0JICBmb3IgKGNvdW50ID0gcl9sZW47IGNvdW50ID4gMDsgY291bnQtLSkKLS0JICAgIHsKLS0JICAgICAgYWNjdSA9IChtcF90d29saW1iX3QpIChtcF9saW1iX3QpIGFjY3UgPDwgR01QX0xJTUJfQklUUzsKLS0JICAgICAgYWNjdSArPSAobXBfdHdvbGltYl90KSAqLS1wdHIgPDwgKEdNUF9MSU1CX0JJVFMgLSBzKTsKLS0JICAgICAgKnB0ciA9IChtcF9saW1iX3QpIChhY2N1ID4+IEdNUF9MSU1CX0JJVFMpOwotLQkgICAgfQotLQl9Ci0tIyBlbmRpZgotLSAgICAgIC8qIE5vcm1hbGlzZSByLiAgKi8KLS0gICAgICB3aGlsZSAocl9sZW4gPiAwICYmIHJfcHRyW3JfbGVuIC0gMV0gPT0gMCkKLS0Jcl9sZW4tLTsKLS0gICAgfQotLSAgLyogQ29tcGFyZSByIDw8IDEgd2l0aCBiLiAgKi8KLS0gIGlmIChyX2xlbiA+IGJfbGVuKQotLSAgICBnb3RvIGluY3JlbWVudF9xOwotLSAgewotLSAgICBzaXplX3QgaTsKLS0gICAgZm9yIChpID0gYl9sZW47OykKLS0gICAgICB7Ci0tCW1wX2xpbWJfdCByX2kgPQotLQkgIChpIDw9IHJfbGVuICYmIGkgPiAwID8gcl9wdHJbaSAtIDFdID4+IChHTVBfTElNQl9CSVRTIC0gMSkgOiAwKQotLQkgIHwgKGkgPCByX2xlbiA/IHJfcHRyW2ldIDw8IDEgOiAwKTsKLS0JbXBfbGltYl90IGJfaSA9IChpIDwgYl9sZW4gPyBiX3B0cltpXSA6IDApOwotLQlpZiAocl9pID4gYl9pKQotLQkgIGdvdG8gaW5jcmVtZW50X3E7Ci0tCWlmIChyX2kgPCBiX2kpCi0tCSAgZ290byBrZWVwX3E7Ci0tCWlmIChpID09IDApCi0tCSAgYnJlYWs7Ci0tCWktLTsKLS0gICAgICB9Ci0tICB9Ci0tICBpZiAocV9sZW4gPiAwICYmICgocV9wdHJbMF0gJiAxKSAhPSAwKSkKLS0gICAgLyogcSBpcyBvZGQuICAqLwotLSAgICBpbmNyZW1lbnRfcToKLS0gICAgewotLSAgICAgIHNpemVfdCBpOwotLSAgICAgIGZvciAoaSA9IDA7IGkgPCBxX2xlbjsgaSsrKQotLQlpZiAoKysocV9wdHJbaV0pICE9IDApCi0tCSAgZ290byBrZWVwX3E7Ci0tICAgICAgcV9wdHJbcV9sZW4rK10gPSAxOwotLSAgICB9Ci0tICBrZWVwX3E6Ci0tICBpZiAodG1wX3Jvb21wdHIgIT0gTlVMTCkKLS0gICAgZnJlZSAodG1wX3Jvb21wdHIpOwotLSAgcS0+bGltYnMgPSBxX3B0cjsKLS0gIHEtPm5saW1icyA9IHFfbGVuOwotLSAgcmV0dXJuIHJvb21wdHI7Ci0tfQotLQotLS8qIENvbnZlcnQgYSBiaWdudW0gYSA+PSAwLCBtdWx0aXBsaWVkIHdpdGggMTBeZXh0cmFfemVyb2VzLCB0byBkZWNpbWFsCi0tICAgcmVwcmVzZW50YXRpb24uCi0tICAgRGVzdHJveXMgdGhlIGNvbnRlbnRzIG9mIGEuCi0tICAgUmV0dXJuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IC0gY29udGFpbmluZyB0aGUgZGVjaW1hbCBkaWdpdHMgaW4gbG93LXRvLWhpZ2gKLS0gICBvcmRlciwgdGVybWluYXRlZCB3aXRoIGEgTlVMIGNoYXJhY3RlciAtIGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlCi0tICAgb2YgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4gICovCi0tc3RhdGljIGNoYXIgKgotLWNvbnZlcnRfdG9fZGVjaW1hbCAobXBuX3QgYSwgc2l6ZV90IGV4dHJhX3plcm9lcykKLS17Ci0tICBtcF9saW1iX3QgKmFfcHRyID0gYS5saW1iczsKLS0gIHNpemVfdCBhX2xlbiA9IGEubmxpbWJzOwotLSAgLyogMC4wMzM0NSBpcyBzbGlnaHRseSBsYXJnZXIgdGhhbiBsb2coMikvKDkqbG9nKDEwKSkuICAqLwotLSAgc2l6ZV90IGNfbGVuID0gOSAqICgoc2l6ZV90KShhX2xlbiAqIChHTVBfTElNQl9CSVRTICogMC4wMzM0NWYpKSArIDEpOwotLSAgY2hhciAqY19wdHIgPSAoY2hhciAqKSBtYWxsb2MgKHhzdW0gKGNfbGVuLCBleHRyYV96ZXJvZXMpKTsKLS0gIGlmIChjX3B0ciAhPSBOVUxMKQotLSAgICB7Ci0tICAgICAgY2hhciAqZF9wdHIgPSBjX3B0cjsKLS0gICAgICBmb3IgKDsgZXh0cmFfemVyb2VzID4gMDsgZXh0cmFfemVyb2VzLS0pCi0tCSpkX3B0cisrID0gJzAnOwotLSAgICAgIHdoaWxlIChhX2xlbiA+IDApCi0tCXsKLS0JICAvKiBEaXZpZGUgYSBieSAxMF45LCBpbi1wbGFjZS4gICovCi0tCSAgbXBfbGltYl90IHJlbWFpbmRlciA9IDA7Ci0tCSAgbXBfbGltYl90ICpwdHIgPSBhX3B0ciArIGFfbGVuOwotLQkgIHNpemVfdCBjb3VudDsKLS0JICBmb3IgKGNvdW50ID0gYV9sZW47IGNvdW50ID4gMDsgY291bnQtLSkKLS0JICAgIHsKLS0JICAgICAgbXBfdHdvbGltYl90IG51bSA9Ci0tCQkoKG1wX3R3b2xpbWJfdCkgcmVtYWluZGVyIDw8IEdNUF9MSU1CX0JJVFMpIHwgKi0tcHRyOwotLQkgICAgICAqcHRyID0gbnVtIC8gMTAwMDAwMDAwMDsKLS0JICAgICAgcmVtYWluZGVyID0gbnVtICUgMTAwMDAwMDAwMDsKLS0JICAgIH0KLS0JICAvKiBTdG9yZSB0aGUgcmVtYWluZGVyIGFzIDkgZGVjaW1hbCBkaWdpdHMuICAqLwotLQkgIGZvciAoY291bnQgPSA5OyBjb3VudCA+IDA7IGNvdW50LS0pCi0tCSAgICB7Ci0tCSAgICAgICpkX3B0cisrID0gJzAnICsgKHJlbWFpbmRlciAlIDEwKTsKLS0JICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyIC8gMTA7Ci0tCSAgICB9Ci0tCSAgLyogTm9ybWFsaXplIGEuICAqLwotLQkgIGlmIChhX3B0clthX2xlbiAtIDFdID09IDApCi0tCSAgICBhX2xlbi0tOwotLQl9Ci0tICAgICAgLyogUmVtb3ZlIGxlYWRpbmcgemVyb2VzLiAgKi8KLS0gICAgICB3aGlsZSAoZF9wdHIgPiBjX3B0ciAmJiBkX3B0clstMV0gPT0gJzAnKQotLQlkX3B0ci0tOwotLSAgICAgIC8qIEJ1dCBrZWVwIGF0IGxlYXN0IG9uZSB6ZXJvLiAgKi8KLS0gICAgICBpZiAoZF9wdHIgPT0gY19wdHIpCi0tCSpkX3B0cisrID0gJzAnOwotLSAgICAgIC8qIFRlcm1pbmF0ZSB0aGUgc3RyaW5nLiAgKi8KLS0gICAgICAqZF9wdHIgPSAnXDAnOwotLSAgICB9Ci0tICByZXR1cm4gY19wdHI7Ci0tfQotLQotLSMgaWYgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUKLS0KLS0vKiBBc3N1bWluZyB4IGlzIGZpbml0ZSBhbmQgPj0gMDoKLS0gICB3cml0ZSB4IGFzIHggPSAyXmUgKiBtLCB3aGVyZSBtIGlzIGEgYmlnbnVtLgotLSAgIFJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkKLS0gICBhbGxvY2F0aW9uIGZhaWx1cmUuICAqLwotLXN0YXRpYyB2b2lkICoKLS1kZWNvZGVfbG9uZ19kb3VibGUgKGxvbmcgZG91YmxlIHgsIGludCAqZXAsIG1wbl90ICptcCkKLS17Ci0tICBtcG5fdCBtOwotLSAgaW50IGV4cDsKLS0gIGxvbmcgZG91YmxlIHk7Ci0tICBzaXplX3QgaTsKLS0KLS0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzdWx0LiAgKi8KLS0gIG0ubmxpbWJzID0gKExEQkxfTUFOVF9CSVQgKyBHTVBfTElNQl9CSVRTIC0gMSkgLyBHTVBfTElNQl9CSVRTOwotLSAgbS5saW1icyA9IChtcF9saW1iX3QgKikgbWFsbG9jIChtLm5saW1icyAqIHNpemVvZiAobXBfbGltYl90KSk7Ci0tICBpZiAobS5saW1icyA9PSBOVUxMKQotLSAgICByZXR1cm4gTlVMTDsKLS0gIC8qIFNwbGl0IGludG8gZXhwb25lbnRpYWwgcGFydCBhbmQgbWFudGlzc2EuICAqLwotLSAgeSA9IGZyZXhwbCAoeCwgJmV4cCk7Ci0tICBpZiAoISh5ID49IDAuMEwgJiYgeSA8IDEuMEwpKQotLSAgICBhYm9ydCAoKTsKLS0gIC8qIHggPSAyXmV4cCAqIHkgPSAyXihleHAgLSBMREJMX01BTlRfQklUKSAqICh5ICogTERCTF9NQU5UX0JJVCksIGFuZCB0aGUKLS0gICAgIGxhdHRlciBpcyBhbiBpbnRlZ2VyLiAgKi8KLS0gIC8qIENvbnZlcnQgdGhlIG1hbnRpc3NhICh5ICogTERCTF9NQU5UX0JJVCkgdG8gYSBzZXF1ZW5jZSBvZiBsaW1icy4KLS0gICAgIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0J3Mgc2FmZSB0byBjYXN0IGEgJ2xvbmcgZG91YmxlJyB2YWx1ZSBiZXR3ZWVuCi0tICAgICAyXjMxIGFuZCAyXjMyIHRvICd1bnNpZ25lZCBpbnQnLCB0aGVyZWZvcmUgcGxheSBzYWZlIGFuZCBjYXN0IG9ubHkKLS0gICAgICdsb25nIGRvdWJsZScgdmFsdWVzIGJldHdlZW4gMCBhbmQgMl4xNiAodG8gJ3Vuc2lnbmVkIGludCcgb3IgJ2ludCcsCi0tICAgICBkb2Vzbid0IG1hdHRlcikuICAqLwotLSMgIGlmIChMREJMX01BTlRfQklUICUgR01QX0xJTUJfQklUUykgIT0gMAotLSMgICBpZiAoTERCTF9NQU5UX0JJVCAlIEdNUF9MSU1CX0JJVFMpID4gR01QX0xJTUJfQklUUyAvIDIKLS0gICAgewotLSAgICAgIG1wX2xpbWJfdCBoaSwgbG87Ci0tICAgICAgeSAqPSAobXBfbGltYl90KSAxIDw8IChMREJMX01BTlRfQklUICUgKEdNUF9MSU1CX0JJVFMgLyAyKSk7Ci0tICAgICAgaGkgPSAoaW50KSB5OwotLSAgICAgIHkgLT0gaGk7Ci0tICAgICAgaWYgKCEoeSA+PSAwLjBMICYmIHkgPCAxLjBMKSkKLS0JYWJvcnQgKCk7Ci0tICAgICAgeSAqPSAobXBfbGltYl90KSAxIDw8IChHTVBfTElNQl9CSVRTIC8gMik7Ci0tICAgICAgbG8gPSAoaW50KSB5OwotLSAgICAgIHkgLT0gbG87Ci0tICAgICAgaWYgKCEoeSA+PSAwLjBMICYmIHkgPCAxLjBMKSkKLS0JYWJvcnQgKCk7Ci0tICAgICAgbS5saW1ic1tMREJMX01BTlRfQklUIC8gR01QX0xJTUJfQklUU10gPSAoaGkgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkgfCBsbzsKLS0gICAgfQotLSMgICBlbHNlCi0tICAgIHsKLS0gICAgICBtcF9saW1iX3QgZDsKLS0gICAgICB5ICo9IChtcF9saW1iX3QpIDEgPDwgKExEQkxfTUFOVF9CSVQgJSBHTVBfTElNQl9CSVRTKTsKLS0gICAgICBkID0gKGludCkgeTsKLS0gICAgICB5IC09IGQ7Ci0tICAgICAgaWYgKCEoeSA+PSAwLjBMICYmIHkgPCAxLjBMKSkKLS0JYWJvcnQgKCk7Ci0tICAgICAgbS5saW1ic1tMREJMX01BTlRfQklUIC8gR01QX0xJTUJfQklUU10gPSBkOwotLSAgICB9Ci0tIyAgIGVuZGlmCi0tIyAgZW5kaWYKLS0gIGZvciAoaSA9IExEQkxfTUFOVF9CSVQgLyBHTVBfTElNQl9CSVRTOyBpID4gMDsgKQotLSAgICB7Ci0tICAgICAgbXBfbGltYl90IGhpLCBsbzsKLS0gICAgICB5ICo9IChtcF9saW1iX3QpIDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKTsKLS0gICAgICBoaSA9IChpbnQpIHk7Ci0tICAgICAgeSAtPSBoaTsKLS0gICAgICBpZiAoISh5ID49IDAuMEwgJiYgeSA8IDEuMEwpKQotLQlhYm9ydCAoKTsKLS0gICAgICB5ICo9IChtcF9saW1iX3QpIDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKTsKLS0gICAgICBsbyA9IChpbnQpIHk7Ci0tICAgICAgeSAtPSBsbzsKLS0gICAgICBpZiAoISh5ID49IDAuMEwgJiYgeSA8IDEuMEwpKQotLQlhYm9ydCAoKTsKLS0gICAgICBtLmxpbWJzWy0taV0gPSAoaGkgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkgfCBsbzsKLS0gICAgfQotLSAgaWYgKCEoeSA9PSAwLjBMKSkKLS0gICAgYWJvcnQgKCk7Ci0tICAvKiBOb3JtYWxpc2UuICAqLwotLSAgd2hpbGUgKG0ubmxpbWJzID4gMCAmJiBtLmxpbWJzW20ubmxpbWJzIC0gMV0gPT0gMCkKLS0gICAgbS5ubGltYnMtLTsKLS0gICptcCA9IG07Ci0tICAqZXAgPSBleHAgLSBMREJMX01BTlRfQklUOwotLSAgcmV0dXJuIG0ubGltYnM7Ci0tfQotLQotLSMgZW5kaWYKLS0KLS0jIGlmIE5FRURfUFJJTlRGX0RPVUJMRQotLQotLS8qIEFzc3VtaW5nIHggaXMgZmluaXRlIGFuZCA+PSAwOgotLSAgIHdyaXRlIHggYXMgeCA9IDJeZSAqIG0sIHdoZXJlIG0gaXMgYSBiaWdudW0uCi0tICAgUmV0dXJuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlIG9mIG1lbW9yeQotLSAgIGFsbG9jYXRpb24gZmFpbHVyZS4gICovCi0tc3RhdGljIHZvaWQgKgotLWRlY29kZV9kb3VibGUgKGRvdWJsZSB4LCBpbnQgKmVwLCBtcG5fdCAqbXApCi0tewotLSAgbXBuX3QgbTsKLS0gIGludCBleHA7Ci0tICBkb3VibGUgeTsKLS0gIHNpemVfdCBpOwotLQotLSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciByZXN1bHQuICAqLwotLSAgbS5ubGltYnMgPSAoREJMX01BTlRfQklUICsgR01QX0xJTUJfQklUUyAtIDEpIC8gR01QX0xJTUJfQklUUzsKLS0gIG0ubGltYnMgPSAobXBfbGltYl90ICopIG1hbGxvYyAobS5ubGltYnMgKiBzaXplb2YgKG1wX2xpbWJfdCkpOwotLSAgaWYgKG0ubGltYnMgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tICAvKiBTcGxpdCBpbnRvIGV4cG9uZW50aWFsIHBhcnQgYW5kIG1hbnRpc3NhLiAgKi8KLS0gIHkgPSBmcmV4cCAoeCwgJmV4cCk7Ci0tICBpZiAoISh5ID49IDAuMCAmJiB5IDwgMS4wKSkKLS0gICAgYWJvcnQgKCk7Ci0tICAvKiB4ID0gMl5leHAgKiB5ID0gMl4oZXhwIC0gREJMX01BTlRfQklUKSAqICh5ICogREJMX01BTlRfQklUKSwgYW5kIHRoZQotLSAgICAgbGF0dGVyIGlzIGFuIGludGVnZXIuICAqLwotLSAgLyogQ29udmVydCB0aGUgbWFudGlzc2EgKHkgKiBEQkxfTUFOVF9CSVQpIHRvIGEgc2VxdWVuY2Ugb2YgbGltYnMuCi0tICAgICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCdzIHNhZmUgdG8gY2FzdCBhICdkb3VibGUnIHZhbHVlIGJldHdlZW4KLS0gICAgIDJeMzEgYW5kIDJeMzIgdG8gJ3Vuc2lnbmVkIGludCcsIHRoZXJlZm9yZSBwbGF5IHNhZmUgYW5kIGNhc3Qgb25seQotLSAgICAgJ2RvdWJsZScgdmFsdWVzIGJldHdlZW4gMCBhbmQgMl4xNiAodG8gJ3Vuc2lnbmVkIGludCcgb3IgJ2ludCcsCi0tICAgICBkb2Vzbid0IG1hdHRlcikuICAqLwotLSMgIGlmIChEQkxfTUFOVF9CSVQgJSBHTVBfTElNQl9CSVRTKSAhPSAwCi0tIyAgIGlmIChEQkxfTUFOVF9CSVQgJSBHTVBfTElNQl9CSVRTKSA+IEdNUF9MSU1CX0JJVFMgLyAyCi0tICAgIHsKLS0gICAgICBtcF9saW1iX3QgaGksIGxvOwotLSAgICAgIHkgKj0gKG1wX2xpbWJfdCkgMSA8PCAoREJMX01BTlRfQklUICUgKEdNUF9MSU1CX0JJVFMgLyAyKSk7Ci0tICAgICAgaGkgPSAoaW50KSB5OwotLSAgICAgIHkgLT0gaGk7Ci0tICAgICAgaWYgKCEoeSA+PSAwLjAgJiYgeSA8IDEuMCkpCi0tCWFib3J0ICgpOwotLSAgICAgIHkgKj0gKG1wX2xpbWJfdCkgMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpOwotLSAgICAgIGxvID0gKGludCkgeTsKLS0gICAgICB5IC09IGxvOwotLSAgICAgIGlmICghKHkgPj0gMC4wICYmIHkgPCAxLjApKQotLQlhYm9ydCAoKTsKLS0gICAgICBtLmxpbWJzW0RCTF9NQU5UX0JJVCAvIEdNUF9MSU1CX0JJVFNdID0gKGhpIDw8IChHTVBfTElNQl9CSVRTIC8gMikpIHwgbG87Ci0tICAgIH0KLS0jICAgZWxzZQotLSAgICB7Ci0tICAgICAgbXBfbGltYl90IGQ7Ci0tICAgICAgeSAqPSAobXBfbGltYl90KSAxIDw8IChEQkxfTUFOVF9CSVQgJSBHTVBfTElNQl9CSVRTKTsKLS0gICAgICBkID0gKGludCkgeTsKLS0gICAgICB5IC09IGQ7Ci0tICAgICAgaWYgKCEoeSA+PSAwLjAgJiYgeSA8IDEuMCkpCi0tCWFib3J0ICgpOwotLSAgICAgIG0ubGltYnNbREJMX01BTlRfQklUIC8gR01QX0xJTUJfQklUU10gPSBkOwotLSAgICB9Ci0tIyAgIGVuZGlmCi0tIyAgZW5kaWYKLS0gIGZvciAoaSA9IERCTF9NQU5UX0JJVCAvIEdNUF9MSU1CX0JJVFM7IGkgPiAwOyApCi0tICAgIHsKLS0gICAgICBtcF9saW1iX3QgaGksIGxvOwotLSAgICAgIHkgKj0gKG1wX2xpbWJfdCkgMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpOwotLSAgICAgIGhpID0gKGludCkgeTsKLS0gICAgICB5IC09IGhpOwotLSAgICAgIGlmICghKHkgPj0gMC4wICYmIHkgPCAxLjApKQotLQlhYm9ydCAoKTsKLS0gICAgICB5ICo9IChtcF9saW1iX3QpIDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKTsKLS0gICAgICBsbyA9IChpbnQpIHk7Ci0tICAgICAgeSAtPSBsbzsKLS0gICAgICBpZiAoISh5ID49IDAuMCAmJiB5IDwgMS4wKSkKLS0JYWJvcnQgKCk7Ci0tICAgICAgbS5saW1ic1stLWldID0gKGhpIDw8IChHTVBfTElNQl9CSVRTIC8gMikpIHwgbG87Ci0tICAgIH0KLS0gIGlmICghKHkgPT0gMC4wKSkKLS0gICAgYWJvcnQgKCk7Ci0tICAvKiBOb3JtYWxpc2UuICAqLwotLSAgd2hpbGUgKG0ubmxpbWJzID4gMCAmJiBtLmxpbWJzW20ubmxpbWJzIC0gMV0gPT0gMCkKLS0gICAgbS5ubGltYnMtLTsKLS0gICptcCA9IG07Ci0tICAqZXAgPSBleHAgLSBEQkxfTUFOVF9CSVQ7Ci0tICByZXR1cm4gbS5saW1iczsKLS19Ci0tCi0tIyBlbmRpZgotLQotLS8qIEFzc3VtaW5nIHggPSAyXmUgKiBtIGlzIGZpbml0ZSBhbmQgPj0gMCwgYW5kIG4gaXMgYW4gaW50ZWdlcjoKLS0gICBSZXR1cm5zIHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHJvdW5kICh4ICogMTBebikuCi0tICAgUmV0dXJuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IC0gY29udGFpbmluZyB0aGUgZGVjaW1hbCBkaWdpdHMgaW4gbG93LXRvLWhpZ2gKLS0gICBvcmRlciwgdGVybWluYXRlZCB3aXRoIGEgTlVMIGNoYXJhY3RlciAtIGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlCi0tICAgb2YgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4gICovCi0tc3RhdGljIGNoYXIgKgotLXNjYWxlMTBfcm91bmRfZGVjaW1hbF9kZWNvZGVkIChpbnQgZSwgbXBuX3QgbSwgdm9pZCAqbWVtb3J5LCBpbnQgbikKLS17Ci0tICBpbnQgczsKLS0gIHNpemVfdCBleHRyYV96ZXJvZXM7Ci0tICB1bnNpZ25lZCBpbnQgYWJzX247Ci0tICB1bnNpZ25lZCBpbnQgYWJzX3M7Ci0tICBtcF9saW1iX3QgKnBvdzVfcHRyOwotLSAgc2l6ZV90IHBvdzVfbGVuOwotLSAgdW5zaWduZWQgaW50IHNfbGltYnM7Ci0tICB1bnNpZ25lZCBpbnQgc19iaXRzOwotLSAgbXBuX3QgcG93NTsKLS0gIG1wbl90IHo7Ci0tICB2b2lkICp6X21lbW9yeTsKLS0gIGNoYXIgKmRpZ2l0czsKLS0KLS0gIGlmIChtZW1vcnkgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tICAvKiB4ID0gMl5lICogbSwgaGVuY2UKLS0gICAgIHkgPSByb3VuZCAoMl5lICogMTBebiAqIG0pID0gcm91bmQgKDJeKGUrbikgKiA1Xm4gKiBtKQotLSAgICAgICA9IHJvdW5kICgyXnMgKiA1Xm4gKiBtKS4gICovCi0tICBzID0gZSArIG47Ci0tICBleHRyYV96ZXJvZXMgPSAwOwotLSAgLyogRmFjdG9yIG91dCBhIGNvbW1vbiBwb3dlciBvZiAxMCBpZiBwb3NzaWJsZS4gICovCi0tICBpZiAocyA+IDAgJiYgbiA+IDApCi0tICAgIHsKLS0gICAgICBleHRyYV96ZXJvZXMgPSAocyA8IG4gPyBzIDogbik7Ci0tICAgICAgcyAtPSBleHRyYV96ZXJvZXM7Ci0tICAgICAgbiAtPSBleHRyYV96ZXJvZXM7Ci0tICAgIH0KLS0gIC8qIEhlcmUgeSA9IHJvdW5kICgyXnMgKiA1Xm4gKiBtKSAqIDEwXmV4dHJhX3plcm9lcy4KLS0gICAgIEJlZm9yZSBjb252ZXJ0aW5nIHRvIGRlY2ltYWwsIHdlIG5lZWQgdG8gY29tcHV0ZQotLSAgICAgeiA9IHJvdW5kICgyXnMgKiA1Xm4gKiBtKS4gICovCi0tICAvKiBDb21wdXRlIDVefG58LCBwb3NzaWJseSBzaGlmdGVkIGJ5IHxzfCBiaXRzIGlmIG4gYW5kIHMgaGF2ZSB0aGUgc2FtZQotLSAgICAgc2lnbi4gIDIuMzIyIGlzIHNsaWdodGx5IGxhcmdlciB0aGFuIGxvZyg1KS9sb2coMikuICAqLwotLSAgYWJzX24gPSAobiA+PSAwID8gbiA6IC1uKTsKLS0gIGFic19zID0gKHMgPj0gMCA/IHMgOiAtcyk7Ci0tICBwb3c1X3B0ciA9IChtcF9saW1iX3QgKikgbWFsbG9jICgoKGludCkoYWJzX24gKiAoMi4zMjJmIC8gR01QX0xJTUJfQklUUykpICsgMQotLQkJCQkgICAgKyBhYnNfcyAvIEdNUF9MSU1CX0JJVFMgKyAxKQotLQkJCQkgICAqIHNpemVvZiAobXBfbGltYl90KSk7Ci0tICBpZiAocG93NV9wdHIgPT0gTlVMTCkKLS0gICAgewotLSAgICAgIGZyZWUgKG1lbW9yeSk7Ci0tICAgICAgcmV0dXJuIE5VTEw7Ci0tICAgIH0KLS0gIC8qIEluaXRpYWxpemUgd2l0aCAxLiAgKi8KLS0gIHBvdzVfcHRyWzBdID0gMTsKLS0gIHBvdzVfbGVuID0gMTsKLS0gIC8qIE11bHRpcGx5IHdpdGggNV58bnwuICAqLwotLSAgaWYgKGFic19uID4gMCkKLS0gICAgewotLSAgICAgIHN0YXRpYyBtcF9saW1iX3QgY29uc3Qgc21hbGxfcG93NVsxMyArIDFdID0KLS0JewotLQkgIDEsIDUsIDI1LCAxMjUsIDYyNSwgMzEyNSwgMTU2MjUsIDc4MTI1LCAzOTA2MjUsIDE5NTMxMjUsIDk3NjU2MjUsCi0tCSAgNDg4MjgxMjUsIDI0NDE0MDYyNSwgMTIyMDcwMzEyNQotLQl9OwotLSAgICAgIHVuc2lnbmVkIGludCBuMTM7Ci0tICAgICAgZm9yIChuMTMgPSAwOyBuMTMgPD0gYWJzX247IG4xMyArPSAxMykKLS0JewotLQkgIG1wX2xpbWJfdCBkaWdpdDEgPSBzbWFsbF9wb3c1W24xMyArIDEzIDw9IGFic19uID8gMTMgOiBhYnNfbiAtIG4xM107Ci0tCSAgc2l6ZV90IGo7Ci0tCSAgbXBfdHdvbGltYl90IGNhcnJ5ID0gMDsKLS0JICBmb3IgKGogPSAwOyBqIDwgcG93NV9sZW47IGorKykKLS0JICAgIHsKLS0JICAgICAgbXBfbGltYl90IGRpZ2l0MiA9IHBvdzVfcHRyW2pdOwotLQkgICAgICBjYXJyeSArPSAobXBfdHdvbGltYl90KSBkaWdpdDEgKiAobXBfdHdvbGltYl90KSBkaWdpdDI7Ci0tCSAgICAgIHBvdzVfcHRyW2pdID0gKG1wX2xpbWJfdCkgY2Fycnk7Ci0tCSAgICAgIGNhcnJ5ID0gY2FycnkgPj4gR01QX0xJTUJfQklUUzsKLS0JICAgIH0KLS0JICBpZiAoY2FycnkgPiAwKQotLQkgICAgcG93NV9wdHJbcG93NV9sZW4rK10gPSAobXBfbGltYl90KSBjYXJyeTsKLS0JfQotLSAgICB9Ci0tICBzX2xpbWJzID0gYWJzX3MgLyBHTVBfTElNQl9CSVRTOwotLSAgc19iaXRzID0gYWJzX3MgJSBHTVBfTElNQl9CSVRTOwotLSAgaWYgKG4gPj0gMCA/IHMgPj0gMCA6IHMgPD0gMCkKLS0gICAgewotLSAgICAgIC8qIE11bHRpcGx5IHdpdGggMl58c3wuICAqLwotLSAgICAgIGlmIChzX2JpdHMgPiAwKQotLQl7Ci0tCSAgbXBfbGltYl90ICpwdHIgPSBwb3c1X3B0cjsKLS0JICBtcF90d29saW1iX3QgYWNjdSA9IDA7Ci0tCSAgc2l6ZV90IGNvdW50OwotLQkgIGZvciAoY291bnQgPSBwb3c1X2xlbjsgY291bnQgPiAwOyBjb3VudC0tKQotLQkgICAgewotLQkgICAgICBhY2N1ICs9IChtcF90d29saW1iX3QpICpwdHIgPDwgc19iaXRzOwotLQkgICAgICAqcHRyKysgPSAobXBfbGltYl90KSBhY2N1OwotLQkgICAgICBhY2N1ID0gYWNjdSA+PiBHTVBfTElNQl9CSVRTOwotLQkgICAgfQotLQkgIGlmIChhY2N1ID4gMCkKLS0JICAgIHsKLS0JICAgICAgKnB0ciA9IChtcF9saW1iX3QpIGFjY3U7Ci0tCSAgICAgIHBvdzVfbGVuKys7Ci0tCSAgICB9Ci0tCX0KLS0gICAgICBpZiAoc19saW1icyA+IDApCi0tCXsKLS0JICBzaXplX3QgY291bnQ7Ci0tCSAgZm9yIChjb3VudCA9IHBvdzVfbGVuOyBjb3VudCA+IDA7KQotLQkgICAgewotLQkgICAgICBjb3VudC0tOwotLQkgICAgICBwb3c1X3B0cltzX2xpbWJzICsgY291bnRdID0gcG93NV9wdHJbY291bnRdOwotLQkgICAgfQotLQkgIGZvciAoY291bnQgPSBzX2xpbWJzOyBjb3VudCA+IDA7KQotLQkgICAgewotLQkgICAgICBjb3VudC0tOwotLQkgICAgICBwb3c1X3B0cltjb3VudF0gPSAwOwotLQkgICAgfQotLQkgIHBvdzVfbGVuICs9IHNfbGltYnM7Ci0tCX0KLS0gICAgICBwb3c1LmxpbWJzID0gcG93NV9wdHI7Ci0tICAgICAgcG93NS5ubGltYnMgPSBwb3c1X2xlbjsKLS0gICAgICBpZiAobiA+PSAwKQotLQl7Ci0tCSAgLyogTXVsdGlwbHkgbSB3aXRoIHBvdzUuICBObyBkaXZpc2lvbiBuZWVkZWQuICAqLwotLQkgIHpfbWVtb3J5ID0gbXVsdGlwbHkgKG0sIHBvdzUsICZ6KTsKLS0JfQotLSAgICAgIGVsc2UKLS0JewotLQkgIC8qIERpdmlkZSBtIGJ5IHBvdzUgYW5kIHJvdW5kLiAgKi8KLS0JICB6X21lbW9yeSA9IGRpdmlkZSAobSwgcG93NSwgJnopOwotLQl9Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgewotLSAgICAgIHBvdzUubGltYnMgPSBwb3c1X3B0cjsKLS0gICAgICBwb3c1Lm5saW1icyA9IHBvdzVfbGVuOwotLSAgICAgIGlmIChuID49IDApCi0tCXsKLS0JICAvKiBuID49IDAsIHMgPCAwLgotLQkgICAgIE11bHRpcGx5IG0gd2l0aCBwb3c1LCB0aGVuIGRpdmlkZSBieSAyXnxzfC4gICovCi0tCSAgbXBuX3QgbnVtZXJhdG9yOwotLQkgIG1wbl90IGRlbm9taW5hdG9yOwotLQkgIHZvaWQgKnRtcF9tZW1vcnk7Ci0tCSAgdG1wX21lbW9yeSA9IG11bHRpcGx5IChtLCBwb3c1LCAmbnVtZXJhdG9yKTsKLS0JICBpZiAodG1wX21lbW9yeSA9PSBOVUxMKQotLQkgICAgewotLQkgICAgICBmcmVlIChwb3c1X3B0cik7Ci0tCSAgICAgIGZyZWUgKG1lbW9yeSk7Ci0tCSAgICAgIHJldHVybiBOVUxMOwotLQkgICAgfQotLQkgIC8qIENvbnN0cnVjdCAyXnxzfC4gICovCi0tCSAgewotLQkgICAgbXBfbGltYl90ICpwdHIgPSBwb3c1X3B0ciArIHBvdzVfbGVuOwotLQkgICAgc2l6ZV90IGk7Ci0tCSAgICBmb3IgKGkgPSAwOyBpIDwgc19saW1iczsgaSsrKQotLQkgICAgICBwdHJbaV0gPSAwOwotLQkgICAgcHRyW3NfbGltYnNdID0gKG1wX2xpbWJfdCkgMSA8PCBzX2JpdHM7Ci0tCSAgICBkZW5vbWluYXRvci5saW1icyA9IHB0cjsKLS0JICAgIGRlbm9taW5hdG9yLm5saW1icyA9IHNfbGltYnMgKyAxOwotLQkgIH0KLS0JICB6X21lbW9yeSA9IGRpdmlkZSAobnVtZXJhdG9yLCBkZW5vbWluYXRvciwgJnopOwotLQkgIGZyZWUgKHRtcF9tZW1vcnkpOwotLQl9Ci0tICAgICAgZWxzZQotLQl7Ci0tCSAgLyogbiA8IDAsIHMgPiAwLgotLQkgICAgIE11bHRpcGx5IG0gd2l0aCAyXnMsIHRoZW4gZGl2aWRlIGJ5IHBvdzUuICAqLwotLQkgIG1wbl90IG51bWVyYXRvcjsKLS0JICBtcF9saW1iX3QgKm51bV9wdHI7Ci0tCSAgbnVtX3B0ciA9IChtcF9saW1iX3QgKikgbWFsbG9jICgobS5ubGltYnMgKyBzX2xpbWJzICsgMSkKLS0JCQkJCSAgKiBzaXplb2YgKG1wX2xpbWJfdCkpOwotLQkgIGlmIChudW1fcHRyID09IE5VTEwpCi0tCSAgICB7Ci0tCSAgICAgIGZyZWUgKHBvdzVfcHRyKTsKLS0JICAgICAgZnJlZSAobWVtb3J5KTsKLS0JICAgICAgcmV0dXJuIE5VTEw7Ci0tCSAgICB9Ci0tCSAgewotLQkgICAgbXBfbGltYl90ICpkZXN0cHRyID0gbnVtX3B0cjsKLS0JICAgIHsKLS0JICAgICAgc2l6ZV90IGk7Ci0tCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzX2xpbWJzOyBpKyspCi0tCQkqZGVzdHB0cisrID0gMDsKLS0JICAgIH0KLS0JICAgIGlmIChzX2JpdHMgPiAwKQotLQkgICAgICB7Ci0tCQljb25zdCBtcF9saW1iX3QgKnNvdXJjZXB0ciA9IG0ubGltYnM7Ci0tCQltcF90d29saW1iX3QgYWNjdSA9IDA7Ci0tCQlzaXplX3QgY291bnQ7Ci0tCQlmb3IgKGNvdW50ID0gbS5ubGltYnM7IGNvdW50ID4gMDsgY291bnQtLSkKLS0JCSAgewotLQkJICAgIGFjY3UgKz0gKG1wX3R3b2xpbWJfdCkgKnNvdXJjZXB0cisrIDw8IHNfYml0czsKLS0JCSAgICAqZGVzdHB0cisrID0gKG1wX2xpbWJfdCkgYWNjdTsKLS0JCSAgICBhY2N1ID0gYWNjdSA+PiBHTVBfTElNQl9CSVRTOwotLQkJICB9Ci0tCQlpZiAoYWNjdSA+IDApCi0tCQkgICpkZXN0cHRyKysgPSAobXBfbGltYl90KSBhY2N1OwotLQkgICAgICB9Ci0tCSAgICBlbHNlCi0tCSAgICAgIHsKLS0JCWNvbnN0IG1wX2xpbWJfdCAqc291cmNlcHRyID0gbS5saW1iczsKLS0JCXNpemVfdCBjb3VudDsKLS0JCWZvciAoY291bnQgPSBtLm5saW1iczsgY291bnQgPiAwOyBjb3VudC0tKQotLQkJICAqZGVzdHB0cisrID0gKnNvdXJjZXB0cisrOwotLQkgICAgICB9Ci0tCSAgICBudW1lcmF0b3IubGltYnMgPSBudW1fcHRyOwotLQkgICAgbnVtZXJhdG9yLm5saW1icyA9IGRlc3RwdHIgLSBudW1fcHRyOwotLQkgIH0KLS0JICB6X21lbW9yeSA9IGRpdmlkZSAobnVtZXJhdG9yLCBwb3c1LCAmeik7Ci0tCSAgZnJlZSAobnVtX3B0cik7Ci0tCX0KLS0gICAgfQotLSAgZnJlZSAocG93NV9wdHIpOwotLSAgZnJlZSAobWVtb3J5KTsKLS0KLS0gIC8qIEhlcmUgeSA9IHJvdW5kICh4ICogMTBebikgPSB6ICogMTBeZXh0cmFfemVyb2VzLiAgKi8KLS0KLS0gIGlmICh6X21lbW9yeSA9PSBOVUxMKQotLSAgICByZXR1cm4gTlVMTDsKLS0gIGRpZ2l0cyA9IGNvbnZlcnRfdG9fZGVjaW1hbCAoeiwgZXh0cmFfemVyb2VzKTsKLS0gIGZyZWUgKHpfbWVtb3J5KTsKLS0gIHJldHVybiBkaWdpdHM7Ci0tfQotLQotLSMgaWYgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUKLS0KLS0vKiBBc3N1bWluZyB4IGlzIGZpbml0ZSBhbmQgPj0gMCwgYW5kIG4gaXMgYW4gaW50ZWdlcjoKLS0gICBSZXR1cm5zIHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHJvdW5kICh4ICogMTBebikuCi0tICAgUmV0dXJuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IC0gY29udGFpbmluZyB0aGUgZGVjaW1hbCBkaWdpdHMgaW4gbG93LXRvLWhpZ2gKLS0gICBvcmRlciwgdGVybWluYXRlZCB3aXRoIGEgTlVMIGNoYXJhY3RlciAtIGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlCi0tICAgb2YgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4gICovCi0tc3RhdGljIGNoYXIgKgotLXNjYWxlMTBfcm91bmRfZGVjaW1hbF9sb25nX2RvdWJsZSAobG9uZyBkb3VibGUgeCwgaW50IG4pCi0tewotLSAgaW50IGU7Ci0tICBtcG5fdCBtOwotLSAgdm9pZCAqbWVtb3J5ID0gZGVjb2RlX2xvbmdfZG91YmxlICh4LCAmZSwgJm0pOwotLSAgcmV0dXJuIHNjYWxlMTBfcm91bmRfZGVjaW1hbF9kZWNvZGVkIChlLCBtLCBtZW1vcnksIG4pOwotLX0KLS0KLS0jIGVuZGlmCi0tCi0tIyBpZiBORUVEX1BSSU5URl9ET1VCTEUKLS0KLS0vKiBBc3N1bWluZyB4IGlzIGZpbml0ZSBhbmQgPj0gMCwgYW5kIG4gaXMgYW4gaW50ZWdlcjoKLS0gICBSZXR1cm5zIHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHJvdW5kICh4ICogMTBebikuCi0tICAgUmV0dXJuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IC0gY29udGFpbmluZyB0aGUgZGVjaW1hbCBkaWdpdHMgaW4gbG93LXRvLWhpZ2gKLS0gICBvcmRlciwgdGVybWluYXRlZCB3aXRoIGEgTlVMIGNoYXJhY3RlciAtIGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlCi0tICAgb2YgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4gICovCi0tc3RhdGljIGNoYXIgKgotLXNjYWxlMTBfcm91bmRfZGVjaW1hbF9kb3VibGUgKGRvdWJsZSB4LCBpbnQgbikKLS17Ci0tICBpbnQgZTsKLS0gIG1wbl90IG07Ci0tICB2b2lkICptZW1vcnkgPSBkZWNvZGVfZG91YmxlICh4LCAmZSwgJm0pOwotLSAgcmV0dXJuIHNjYWxlMTBfcm91bmRfZGVjaW1hbF9kZWNvZGVkIChlLCBtLCBtZW1vcnksIG4pOwotLX0KLS0KLS0jIGVuZGlmCi0tCi0tIyBpZiBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotLQotLS8qIEFzc3VtaW5nIHggaXMgZmluaXRlIGFuZCA+IDA6Ci0tICAgUmV0dXJuIGFuIGFwcHJveGltYXRpb24gZm9yIG4gd2l0aCAxMF5uIDw9IHggPCAxMF4obisxKS4KLS0gICBUaGUgYXBwcm94aW1hdGlvbiBpcyB1c3VhbGx5IHRoZSByaWdodCBuLCBidXQgbWF5IGJlIG9mZiBieSAxIHNvbWV0aW1lcy4gICovCi0tc3RhdGljIGludAotLWZsb29ybG9nMTBsIChsb25nIGRvdWJsZSB4KQotLXsKLS0gIGludCBleHA7Ci0tICBsb25nIGRvdWJsZSB5OwotLSAgZG91YmxlIHo7Ci0tICBkb3VibGUgbDsKLS0KLS0gIC8qIFNwbGl0IGludG8gZXhwb25lbnRpYWwgcGFydCBhbmQgbWFudGlzc2EuICAqLwotLSAgeSA9IGZyZXhwbCAoeCwgJmV4cCk7Ci0tICBpZiAoISh5ID49IDAuMEwgJiYgeSA8IDEuMEwpKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmICh5ID09IDAuMEwpCi0tICAgIHJldHVybiBJTlRfTUlOOwotLSAgaWYgKHkgPCAwLjVMKQotLSAgICB7Ci0tICAgICAgd2hpbGUgKHkgPCAoMS4wTCAvICgxIDw8IChHTVBfTElNQl9CSVRTIC8gMikpIC8gKDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkpKQotLQl7Ci0tCSAgeSAqPSAxLjBMICogKDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkgKiAoMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKTsKLS0JICBleHAgLT0gR01QX0xJTUJfQklUUzsKLS0JfQotLSAgICAgIGlmICh5IDwgKDEuMEwgLyAoMSA8PCAxNikpKQotLQl7Ci0tCSAgeSAqPSAxLjBMICogKDEgPDwgMTYpOwotLQkgIGV4cCAtPSAxNjsKLS0JfQotLSAgICAgIGlmICh5IDwgKDEuMEwgLyAoMSA8PCA4KSkpCi0tCXsKLS0JICB5ICo9IDEuMEwgKiAoMSA8PCA4KTsKLS0JICBleHAgLT0gODsKLS0JfQotLSAgICAgIGlmICh5IDwgKDEuMEwgLyAoMSA8PCA0KSkpCi0tCXsKLS0JICB5ICo9IDEuMEwgKiAoMSA8PCA0KTsKLS0JICBleHAgLT0gNDsKLS0JfQotLSAgICAgIGlmICh5IDwgKDEuMEwgLyAoMSA8PCAyKSkpCi0tCXsKLS0JICB5ICo9IDEuMEwgKiAoMSA8PCAyKTsKLS0JICBleHAgLT0gMjsKLS0JfQotLSAgICAgIGlmICh5IDwgKDEuMEwgLyAoMSA8PCAxKSkpCi0tCXsKLS0JICB5ICo9IDEuMEwgKiAoMSA8PCAxKTsKLS0JICBleHAgLT0gMTsKLS0JfQotLSAgICB9Ci0tICBpZiAoISh5ID49IDAuNUwgJiYgeSA8IDEuMEwpKQotLSAgICBhYm9ydCAoKTsKLS0gIC8qIENvbXB1dGUgYW4gYXBwcm94aW1hdGlvbiBmb3IgbCA9IGxvZzIoeCkgPSBleHAgKyBsb2cyKHkpLiAgKi8KLS0gIGwgPSBleHA7Ci0tICB6ID0geTsKLS0gIGlmICh6IDwgMC43MDcxMDY3ODExODY1NDc1MjQ0NCkKLS0gICAgewotLSAgICAgIHogKj0gMS40MTQyMTM1NjIzNzMwOTUwNDg4OwotLSAgICAgIGwgLT0gMC41OwotLSAgICB9Ci0tICBpZiAoeiA8IDAuODQwODk2NDE1MjUzNzE0NTQzMSkKLS0gICAgewotLSAgICAgIHogKj0gMS4xODkyMDcxMTUwMDI3MjEwNjY3OwotLSAgICAgIGwgLT0gMC4yNTsKLS0gICAgfQotLSAgaWYgKHogPCAwLjkxNzAwNDA0MzIwNDY3MTIzMTc1KQotLSAgICB7Ci0tICAgICAgeiAqPSAxLjA5MDUwNzczMjY2NTI1NzY1OTI7Ci0tICAgICAgbCAtPSAwLjEyNTsKLS0gICAgfQotLSAgaWYgKHogPCAwLjk1NzYwMzI4MDY5ODU3MzY0NjkpCi0tICAgIHsKLS0gICAgICB6ICo9IDEuMDQ0MjczNzgyNDI3NDEzODQwMzsKLS0gICAgICBsIC09IDAuMDYyNTsKLS0gICAgfQotLSAgLyogTm93IDAuOTUgPD0geiA8PSAxLjAxLiAgKi8KLS0gIHogPSAxIC0gejsKLS0gIC8qIGxvZygxLXopID0gLSB6IC0gel4yLzIgLSB6XjMvMyAtIHpeNC80IC0gLi4uCi0tICAgICBGb3VyIHRlcm1zIGFyZSBlbm91Z2ggdG8gZ2V0IGFuIGFwcHJveGltYXRpb24gd2l0aCBlcnJvciA8IDEwXi03LiAgKi8KLS0gIGwgLT0geiAqICgxLjAgKyB6ICogKDAuNSArIHogKiAoKDEuMCAvIDMpICsgeiAqIDAuMjUpKSk7Ci0tICAvKiBGaW5hbGx5IG11bHRpcGx5IHdpdGggbG9nKDIpL2xvZygxMCksIHlpZWxkcyBhbiBhcHByb3hpbWF0aW9uIGZvcgotLSAgICAgbG9nMTAoeCkuICAqLwotLSAgbCAqPSAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIzOwotLSAgLyogUm91bmQgZG93biB0byB0aGUgbmV4dCBpbnRlZ2VyLiAgKi8KLS0gIHJldHVybiAoaW50KSBsICsgKGwgPCAwID8gLTEgOiAwKTsKLS19Ci0tCi0tIyBlbmRpZgotLQotLSMgaWYgTkVFRF9QUklOVEZfRE9VQkxFCi0tCi0tLyogQXNzdW1pbmcgeCBpcyBmaW5pdGUgYW5kID4gMDoKLS0gICBSZXR1cm4gYW4gYXBwcm94aW1hdGlvbiBmb3IgbiB3aXRoIDEwXm4gPD0geCA8IDEwXihuKzEpLgotLSAgIFRoZSBhcHByb3hpbWF0aW9uIGlzIHVzdWFsbHkgdGhlIHJpZ2h0IG4sIGJ1dCBtYXkgYmUgb2ZmIGJ5IDEgc29tZXRpbWVzLiAgKi8KLS1zdGF0aWMgaW50Ci0tZmxvb3Jsb2cxMCAoZG91YmxlIHgpCi0tewotLSAgaW50IGV4cDsKLS0gIGRvdWJsZSB5OwotLSAgZG91YmxlIHo7Ci0tICBkb3VibGUgbDsKLS0KLS0gIC8qIFNwbGl0IGludG8gZXhwb25lbnRpYWwgcGFydCBhbmQgbWFudGlzc2EuICAqLwotLSAgeSA9IGZyZXhwICh4LCAmZXhwKTsKLS0gIGlmICghKHkgPj0gMC4wICYmIHkgPCAxLjApKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmICh5ID09IDAuMCkKLS0gICAgcmV0dXJuIElOVF9NSU47Ci0tICBpZiAoeSA8IDAuNSkKLS0gICAgewotLSAgICAgIHdoaWxlICh5IDwgKDEuMCAvICgxIDw8IChHTVBfTElNQl9CSVRTIC8gMikpIC8gKDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkpKQotLQl7Ci0tCSAgeSAqPSAxLjAgKiAoMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSAqICgxIDw8IChHTVBfTElNQl9CSVRTIC8gMikpOwotLQkgIGV4cCAtPSBHTVBfTElNQl9CSVRTOwotLQl9Ci0tICAgICAgaWYgKHkgPCAoMS4wIC8gKDEgPDwgMTYpKSkKLS0JewotLQkgIHkgKj0gMS4wICogKDEgPDwgMTYpOwotLQkgIGV4cCAtPSAxNjsKLS0JfQotLSAgICAgIGlmICh5IDwgKDEuMCAvICgxIDw8IDgpKSkKLS0JewotLQkgIHkgKj0gMS4wICogKDEgPDwgOCk7Ci0tCSAgZXhwIC09IDg7Ci0tCX0KLS0gICAgICBpZiAoeSA8ICgxLjAgLyAoMSA8PCA0KSkpCi0tCXsKLS0JICB5ICo9IDEuMCAqICgxIDw8IDQpOwotLQkgIGV4cCAtPSA0OwotLQl9Ci0tICAgICAgaWYgKHkgPCAoMS4wIC8gKDEgPDwgMikpKQotLQl7Ci0tCSAgeSAqPSAxLjAgKiAoMSA8PCAyKTsKLS0JICBleHAgLT0gMjsKLS0JfQotLSAgICAgIGlmICh5IDwgKDEuMCAvICgxIDw8IDEpKSkKLS0JewotLQkgIHkgKj0gMS4wICogKDEgPDwgMSk7Ci0tCSAgZXhwIC09IDE7Ci0tCX0KLS0gICAgfQotLSAgaWYgKCEoeSA+PSAwLjUgJiYgeSA8IDEuMCkpCi0tICAgIGFib3J0ICgpOwotLSAgLyogQ29tcHV0ZSBhbiBhcHByb3hpbWF0aW9uIGZvciBsID0gbG9nMih4KSA9IGV4cCArIGxvZzIoeSkuICAqLwotLSAgbCA9IGV4cDsKLS0gIHogPSB5OwotLSAgaWYgKHogPCAwLjcwNzEwNjc4MTE4NjU0NzUyNDQ0KQotLSAgICB7Ci0tICAgICAgeiAqPSAxLjQxNDIxMzU2MjM3MzA5NTA0ODg7Ci0tICAgICAgbCAtPSAwLjU7Ci0tICAgIH0KLS0gIGlmICh6IDwgMC44NDA4OTY0MTUyNTM3MTQ1NDMxKQotLSAgICB7Ci0tICAgICAgeiAqPSAxLjE4OTIwNzExNTAwMjcyMTA2Njc7Ci0tICAgICAgbCAtPSAwLjI1OwotLSAgICB9Ci0tICBpZiAoeiA8IDAuOTE3MDA0MDQzMjA0NjcxMjMxNzUpCi0tICAgIHsKLS0gICAgICB6ICo9IDEuMDkwNTA3NzMyNjY1MjU3NjU5MjsKLS0gICAgICBsIC09IDAuMTI1OwotLSAgICB9Ci0tICBpZiAoeiA8IDAuOTU3NjAzMjgwNjk4NTczNjQ2OSkKLS0gICAgewotLSAgICAgIHogKj0gMS4wNDQyNzM3ODI0Mjc0MTM4NDAzOwotLSAgICAgIGwgLT0gMC4wNjI1OwotLSAgICB9Ci0tICAvKiBOb3cgMC45NSA8PSB6IDw9IDEuMDEuICAqLwotLSAgeiA9IDEgLSB6OwotLSAgLyogbG9nKDEteikgPSAtIHogLSB6XjIvMiAtIHpeMy8zIC0gel40LzQgLSAuLi4KLS0gICAgIEZvdXIgdGVybXMgYXJlIGVub3VnaCB0byBnZXQgYW4gYXBwcm94aW1hdGlvbiB3aXRoIGVycm9yIDwgMTBeLTcuICAqLwotLSAgbCAtPSB6ICogKDEuMCArIHogKiAoMC41ICsgeiAqICgoMS4wIC8gMykgKyB6ICogMC4yNSkpKTsKLS0gIC8qIEZpbmFsbHkgbXVsdGlwbHkgd2l0aCBsb2coMikvbG9nKDEwKSwgeWllbGRzIGFuIGFwcHJveGltYXRpb24gZm9yCi0tICAgICBsb2cxMCh4KS4gICovCi0tICBsICo9IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjM7Ci0tICAvKiBSb3VuZCBkb3duIHRvIHRoZSBuZXh0IGludGVnZXIuICAqLwotLSAgcmV0dXJuIChpbnQpIGwgKyAobCA8IDAgPyAtMSA6IDApOwotLX0KLS0KLS0jIGVuZGlmCi0tCi0tI2VuZGlmCi0tCi0tRENIQVJfVCAqCi0tVkFTTlBSSU5URiAoRENIQVJfVCAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsCi0tCSAgICBjb25zdCBGQ0hBUl9UICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLS17Ci0tICBESVJFQ1RJVkVTIGQ7Ci0tICBhcmd1bWVudHMgYTsKLS0KLS0gIGlmIChQUklOVEZfUEFSU0UgKGZvcm1hdCwgJmQsICZhKSA8IDApCi0tICAgIC8qIGVycm5vIGlzIGFscmVhZHkgc2V0LiAgKi8KLS0gICAgcmV0dXJuIE5VTEw7Ci0tCi0tI2RlZmluZSBDTEVBTlVQKCkgXAotLSAgZnJlZSAoZC5kaXIpOwkJCQkJCQkJXAotLSAgaWYgKGEuYXJnKQkJCQkJCQkJXAotLSAgICBmcmVlIChhLmFyZyk7Ci0tCi0tICBpZiAoUFJJTlRGX0ZFVENIQVJHUyAoYXJncywgJmEpIDwgMCkKLS0gICAgewotLSAgICAgIENMRUFOVVAgKCk7Ci0tICAgICAgZXJybm8gPSBFSU5WQUw7Ci0tICAgICAgcmV0dXJuIE5VTEw7Ci0tICAgIH0KLS0KLS0gIHsKLS0gICAgc2l6ZV90IGJ1Zl9uZWVkZWRsZW5ndGg7Ci0tICAgIFRDSEFSX1QgKmJ1ZjsKLS0gICAgVENIQVJfVCAqYnVmX21hbGxvY2VkOwotLSAgICBjb25zdCBGQ0hBUl9UICpjcDsKLS0gICAgc2l6ZV90IGk7Ci0tICAgIERJUkVDVElWRSAqZHA7Ci0tICAgIC8qIE91dHB1dCBzdHJpbmcgYWNjdW11bGF0b3IuICAqLwotLSAgICBEQ0hBUl9UICpyZXN1bHQ7Ci0tICAgIHNpemVfdCBhbGxvY2F0ZWQ7Ci0tICAgIHNpemVfdCBsZW5ndGg7Ci0tCi0tICAgIC8qIEFsbG9jYXRlIGEgc21hbGwgYnVmZmVyIHRoYXQgd2lsbCBob2xkIGEgZGlyZWN0aXZlIHBhc3NlZCB0bwotLSAgICAgICBzcHJpbnRmIG9yIHNucHJpbnRmLiAgKi8KLS0gICAgYnVmX25lZWRlZGxlbmd0aCA9Ci0tICAgICAgeHN1bTQgKDcsIGQubWF4X3dpZHRoX2xlbmd0aCwgZC5tYXhfcHJlY2lzaW9uX2xlbmd0aCwgNik7Ci0tI2lmIEhBVkVfQUxMT0NBCi0tICAgIGlmIChidWZfbmVlZGVkbGVuZ3RoIDwgNDAwMCAvIHNpemVvZiAoVENIQVJfVCkpCi0tICAgICAgewotLQlidWYgPSAoVENIQVJfVCAqKSBhbGxvY2EgKGJ1Zl9uZWVkZWRsZW5ndGggKiBzaXplb2YgKFRDSEFSX1QpKTsKLS0JYnVmX21hbGxvY2VkID0gTlVMTDsKLS0gICAgICB9Ci0tICAgIGVsc2UKLS0jZW5kaWYKLS0gICAgICB7Ci0tCXNpemVfdCBidWZfbWVtc2l6ZSA9IHh0aW1lcyAoYnVmX25lZWRlZGxlbmd0aCwgc2l6ZW9mIChUQ0hBUl9UKSk7Ci0tCWlmIChzaXplX292ZXJmbG93X3AgKGJ1Zl9tZW1zaXplKSkKLS0JICBnb3RvIG91dF9vZl9tZW1vcnlfMTsKLS0JYnVmID0gKFRDSEFSX1QgKikgbWFsbG9jIChidWZfbWVtc2l6ZSk7Ci0tCWlmIChidWYgPT0gTlVMTCkKLS0JICBnb3RvIG91dF9vZl9tZW1vcnlfMTsKLS0JYnVmX21hbGxvY2VkID0gYnVmOwotLSAgICAgIH0KLS0KLS0gICAgaWYgKHJlc3VsdGJ1ZiAhPSBOVUxMKQotLSAgICAgIHsKLS0JcmVzdWx0ID0gcmVzdWx0YnVmOwotLQlhbGxvY2F0ZWQgPSAqbGVuZ3RocDsKLS0gICAgICB9Ci0tICAgIGVsc2UKLS0gICAgICB7Ci0tCXJlc3VsdCA9IE5VTEw7Ci0tCWFsbG9jYXRlZCA9IDA7Ci0tICAgICAgfQotLSAgICBsZW5ndGggPSAwOwotLSAgICAvKiBJbnZhcmlhbnRzOgotLSAgICAgICByZXN1bHQgaXMgZWl0aGVyID09IHJlc3VsdGJ1ZiBvciA9PSBOVUxMIG9yIG1hbGxvYy1hbGxvY2F0ZWQuCi0tICAgICAgIElmIGxlbmd0aCA+IDAsIHRoZW4gcmVzdWx0ICE9IE5VTEwuICAqLwotLQotLSAgICAvKiBFbnN1cmVzIHRoYXQgYWxsb2NhdGVkID49IG5lZWRlZC4gIEFib3J0cyB0aHJvdWdoIGEganVtcCB0bwotLSAgICAgICBvdXRfb2ZfbWVtb3J5IGlmIG5lZWRlZCBpcyBTSVpFX01BWCBvciBvdGhlcndpc2UgdG9vIGJpZy4gICovCi0tI2RlZmluZSBFTlNVUkVfQUxMT0NBVElPTihuZWVkZWQpIFwKLS0gICAgaWYgKChuZWVkZWQpID4gYWxsb2NhdGVkKQkJCQkJCSAgICAgXAotLSAgICAgIHsJCQkJCQkJCQkgICAgIFwKLS0Jc2l6ZV90IG1lbW9yeV9zaXplOwkJCQkJCSAgICAgXAotLQlEQ0hBUl9UICptZW1vcnk7CQkJCQkJICAgICBcCi0tCQkJCQkJCQkJICAgICBcCi0tCWFsbG9jYXRlZCA9IChhbGxvY2F0ZWQgPiAwID8geHRpbWVzIChhbGxvY2F0ZWQsIDIpIDogMTIpOwkgICAgIFwKLS0JaWYgKChuZWVkZWQpID4gYWxsb2NhdGVkKQkJCQkJICAgICBcCi0tCSAgYWxsb2NhdGVkID0gKG5lZWRlZCk7CQkJCQkJICAgICBcCi0tCW1lbW9yeV9zaXplID0geHRpbWVzIChhbGxvY2F0ZWQsIHNpemVvZiAoRENIQVJfVCkpOwkJICAgICBcCi0tCWlmIChzaXplX292ZXJmbG93X3AgKG1lbW9yeV9zaXplKSkJCQkJICAgICBcCi0tCSAgZ290byBvdXRfb2ZfbWVtb3J5OwkJCQkJCSAgICAgXAotLQlpZiAocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkJCQkgICAgIFwKLS0JICBtZW1vcnkgPSAoRENIQVJfVCAqKSBtYWxsb2MgKG1lbW9yeV9zaXplKTsJCQkgICAgIFwKLS0JZWxzZQkJCQkJCQkJICAgICBcCi0tCSAgbWVtb3J5ID0gKERDSEFSX1QgKikgcmVhbGxvYyAocmVzdWx0LCBtZW1vcnlfc2l6ZSk7CQkgICAgIFwKLS0JaWYgKG1lbW9yeSA9PSBOVUxMKQkJCQkJCSAgICAgXAotLQkgIGdvdG8gb3V0X29mX21lbW9yeTsJCQkJCQkgICAgIFwKLS0JaWYgKHJlc3VsdCA9PSByZXN1bHRidWYgJiYgbGVuZ3RoID4gMCkJCQkJICAgICBcCi0tCSAgRENIQVJfQ1BZIChtZW1vcnksIHJlc3VsdCwgbGVuZ3RoKTsJCQkJICAgICBcCi0tCXJlc3VsdCA9IG1lbW9yeTsJCQkJCQkgICAgIFwKLS0gICAgICB9Ci0tCi0tICAgIGZvciAoY3AgPSBmb3JtYXQsIGkgPSAwLCBkcCA9ICZkLmRpclswXTsgOyBjcCA9IGRwLT5kaXJfZW5kLCBpKyssIGRwKyspCi0tICAgICAgewotLQlpZiAoY3AgIT0gZHAtPmRpcl9zdGFydCkKLS0JICB7Ci0tCSAgICBzaXplX3QgbiA9IGRwLT5kaXJfc3RhcnQgLSBjcDsKLS0JICAgIHNpemVfdCBhdWdtZW50ZWRfbGVuZ3RoID0geHN1bSAobGVuZ3RoLCBuKTsKLS0KLS0JICAgIEVOU1VSRV9BTExPQ0FUSU9OIChhdWdtZW50ZWRfbGVuZ3RoKTsKLS0JICAgIC8qIFRoaXMgY29waWVzIGEgcGllY2Ugb2YgRkNIQVJfVFtdIGludG8gYSBEQ0hBUl9UW10uICBIZXJlIHdlCi0tCSAgICAgICBuZWVkIHRoYXQgdGhlIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgb25seSBBU0NJSSBjaGFyYWN0ZXJzCi0tCSAgICAgICBpZiBGQ0hBUl9UIGFuZCBEQ0hBUl9UIGFyZSBub3QgdGhlIHNhbWUgdHlwZS4gICovCi0tCSAgICBpZiAoc2l6ZW9mIChGQ0hBUl9UKSA9PSBzaXplb2YgKERDSEFSX1QpKQotLQkgICAgICB7Ci0tCQlEQ0hBUl9DUFkgKHJlc3VsdCArIGxlbmd0aCwgKGNvbnN0IERDSEFSX1QgKikgY3AsIG4pOwotLQkJbGVuZ3RoID0gYXVnbWVudGVkX2xlbmd0aDsKLS0JICAgICAgfQotLQkgICAgZWxzZQotLQkgICAgICB7Ci0tCQlkbwotLQkJICByZXN1bHRbbGVuZ3RoKytdID0gKHVuc2lnbmVkIGNoYXIpICpjcCsrOwotLQkJd2hpbGUgKC0tbiA+IDApOwotLQkgICAgICB9Ci0tCSAgfQotLQlpZiAoaSA9PSBkLmNvdW50KQotLQkgIGJyZWFrOwotLQotLQkvKiBFeGVjdXRlIGEgc2luZ2xlIGRpcmVjdGl2ZS4gICovCi0tCWlmIChkcC0+Y29udmVyc2lvbiA9PSAnJScpCi0tCSAgewotLQkgICAgc2l6ZV90IGF1Z21lbnRlZF9sZW5ndGg7Ci0tCi0tCSAgICBpZiAoIShkcC0+YXJnX2luZGV4ID09IEFSR19OT05FKSkKLS0JICAgICAgYWJvcnQgKCk7Ci0tCSAgICBhdWdtZW50ZWRfbGVuZ3RoID0geHN1bSAobGVuZ3RoLCAxKTsKLS0JICAgIEVOU1VSRV9BTExPQ0FUSU9OIChhdWdtZW50ZWRfbGVuZ3RoKTsKLS0JICAgIHJlc3VsdFtsZW5ndGhdID0gJyUnOwotLQkgICAgbGVuZ3RoID0gYXVnbWVudGVkX2xlbmd0aDsKLS0JICB9Ci0tCWVsc2UKLS0JICB7Ci0tCSAgICBpZiAoIShkcC0+YXJnX2luZGV4ICE9IEFSR19OT05FKSkKLS0JICAgICAgYWJvcnQgKCk7Ci0tCi0tCSAgICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ24nKQotLQkgICAgICB7Ci0tCQlzd2l0Y2ggKGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGUpCi0tCQkgIHsKLS0JCSAgY2FzZSBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVI6Ci0tCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9zY2hhcl9wb2ludGVyID0gbGVuZ3RoOwotLQkJICAgIGJyZWFrOwotLQkJICBjYXNlIFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUjoKLS0JCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X3Nob3J0X3BvaW50ZXIgPSBsZW5ndGg7Ci0tCQkgICAgYnJlYWs7Ci0tCQkgIGNhc2UgVFlQRV9DT1VOVF9JTlRfUE9JTlRFUjoKLS0JCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X2ludF9wb2ludGVyID0gbGVuZ3RoOwotLQkJICAgIGJyZWFrOwotLQkJICBjYXNlIFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSOgotLQkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfbG9uZ2ludF9wb2ludGVyID0gbGVuZ3RoOwotLQkJICAgIGJyZWFrOwotLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLS0JCSAgY2FzZSBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVI6Ci0tCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9sb25nbG9uZ2ludF9wb2ludGVyID0gbGVuZ3RoOwotLQkJICAgIGJyZWFrOwotLSNlbmRpZgotLQkJICBkZWZhdWx0OgotLQkJICAgIGFib3J0ICgpOwotLQkJICB9Ci0tCSAgICAgIH0KLS0jaWYgRU5BQkxFX1VOSVNURElPCi0tCSAgICAvKiBUaGUgdW5pc3RkaW8gZXh0ZW5zaW9ucy4gICovCi0tCSAgICBlbHNlIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnVScpCi0tCSAgICAgIHsKLS0JCWFyZ190eXBlIHR5cGUgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlOwotLQkJaW50IGZsYWdzID0gZHAtPmZsYWdzOwotLQkJaW50IGhhc193aWR0aDsKLS0JCXNpemVfdCB3aWR0aDsKLS0JCWludCBoYXNfcHJlY2lzaW9uOwotLQkJc2l6ZV90IHByZWNpc2lvbjsKLS0KLS0JCWhhc193aWR0aCA9IDA7Ci0tCQl3aWR0aCA9IDA7Ci0tCQlpZiAoZHAtPndpZHRoX3N0YXJ0ICE9IGRwLT53aWR0aF9lbmQpCi0tCQkgIHsKLS0JCSAgICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKLS0JCSAgICAgIHsKLS0JCQlpbnQgYXJnOwotLQotLQkJCWlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotLQkJCSAgYWJvcnQgKCk7Ci0tCQkJYXJnID0gYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0uYS5hX2ludDsKLS0JCQlpZiAoYXJnIDwgMCkKLS0JCQkgIHsKLS0JCQkgICAgLyogIkEgbmVnYXRpdmUgZmllbGQgd2lkdGggaXMgdGFrZW4gYXMgYSAnLScgZmxhZwotLQkJCSAgICAgICAgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBmaWVsZCB3aWR0aC4iICAqLwotLQkJCSAgICBmbGFncyB8PSBGTEFHX0xFRlQ7Ci0tCQkJICAgIHdpZHRoID0gKHVuc2lnbmVkIGludCkgKC1hcmcpOwotLQkJCSAgfQotLQkJCWVsc2UKLS0JCQkgIHdpZHRoID0gYXJnOwotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQljb25zdCBGQ0hBUl9UICpkaWdpdHAgPSBkcC0+d2lkdGhfc3RhcnQ7Ci0tCi0tCQkJZG8KLS0JCQkgIHdpZHRoID0geHN1bSAoeHRpbWVzICh3aWR0aCwgMTApLCAqZGlnaXRwKysgLSAnMCcpOwotLQkJCXdoaWxlIChkaWdpdHAgIT0gZHAtPndpZHRoX2VuZCk7Ci0tCQkgICAgICB9Ci0tCQkgICAgaGFzX3dpZHRoID0gMTsKLS0JCSAgfQotLQotLQkJaGFzX3ByZWNpc2lvbiA9IDA7Ci0tCQlwcmVjaXNpb24gPSAwOwotLQkJaWYgKGRwLT5wcmVjaXNpb25fc3RhcnQgIT0gZHAtPnByZWNpc2lvbl9lbmQpCi0tCQkgIHsKLS0JCSAgICBpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0tCQkgICAgICB7Ci0tCQkJaW50IGFyZzsKLS0KLS0JCQlpZiAoIShhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCi0tCQkJICBhYm9ydCAoKTsKLS0JCQlhcmcgPSBhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0uYS5hX2ludDsKLS0JCQkvKiAiQSBuZWdhdGl2ZSBwcmVjaXNpb24gaXMgdGFrZW4gYXMgaWYgdGhlIHByZWNpc2lvbgotLQkJCSAgICB3ZXJlIG9taXR0ZWQuIiAgKi8KLS0JCQlpZiAoYXJnID49IDApCi0tCQkJICB7Ci0tCQkJICAgIHByZWNpc2lvbiA9IGFyZzsKLS0JCQkgICAgaGFzX3ByZWNpc2lvbiA9IDE7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tCQkgICAgZWxzZQotLQkJICAgICAgewotLQkJCWNvbnN0IEZDSEFSX1QgKmRpZ2l0cCA9IGRwLT5wcmVjaXNpb25fc3RhcnQgKyAxOwotLQotLQkJCXByZWNpc2lvbiA9IDA7Ci0tCQkJd2hpbGUgKGRpZ2l0cCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKLS0JCQkgIHByZWNpc2lvbiA9IHhzdW0gKHh0aW1lcyAocHJlY2lzaW9uLCAxMCksICpkaWdpdHArKyAtICcwJyk7Ci0tCQkJaGFzX3ByZWNpc2lvbiA9IDE7Ci0tCQkgICAgICB9Ci0tCQkgIH0KLS0KLS0JCXN3aXRjaCAodHlwZSkKLS0JCSAgewotLQkJICBjYXNlIFRZUEVfVThfU1RSSU5HOgotLQkJICAgIHsKLS0JCSAgICAgIGNvbnN0IHVpbnQ4X3QgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91OF9zdHJpbmc7Ci0tCQkgICAgICBjb25zdCB1aW50OF90ICphcmdfZW5kOwotLQkJICAgICAgc2l6ZV90IGNoYXJhY3RlcnM7Ci0tCi0tCQkgICAgICBpZiAoaGFzX3ByZWNpc2lvbikKLS0JCQl7Ci0tCQkJICAvKiBVc2Ugb25seSBQUkVDSVNJT04gY2hhcmFjdGVycywgZnJvbSB0aGUgbGVmdC4gICovCi0tCQkJICBhcmdfZW5kID0gYXJnOwotLQkJCSAgY2hhcmFjdGVycyA9IDA7Ci0tCQkJICBmb3IgKDsgcHJlY2lzaW9uID4gMDsgcHJlY2lzaW9uLS0pCi0tCQkJICAgIHsKLS0JCQkgICAgICBpbnQgY291bnQgPSB1OF9zdHJtYmxlbiAoYXJnX2VuZCk7Ci0tCQkJICAgICAgaWYgKGNvdW50ID09IDApCi0tCQkJCWJyZWFrOwotLQkJCSAgICAgIGlmIChjb3VudCA8IDApCi0tCQkJCXsKLS0JCQkJICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLS0JCQkJICAgIGZyZWUgKHJlc3VsdCk7Ci0tCQkJCSAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotLQkJCQkgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLS0JCQkJICBDTEVBTlVQICgpOwotLQkJCQkgIGVycm5vID0gRUlMU0VROwotLQkJCQkgIHJldHVybiBOVUxMOwotLQkJCQl9Ci0tCQkJICAgICAgYXJnX2VuZCArPSBjb3VudDsKLS0JCQkgICAgICBjaGFyYWN0ZXJzKys7Ci0tCQkJICAgIH0KLS0JCQl9Ci0tCQkgICAgICBlbHNlIGlmIChoYXNfd2lkdGgpCi0tCQkJewotLQkJCSAgLyogVXNlIHRoZSBlbnRpcmUgc3RyaW5nLCBhbmQgY291bnQgdGhlIG51bWJlciBvZgotLQkJCSAgICAgY2hhcmFjdGVycy4gICovCi0tCQkJICBhcmdfZW5kID0gYXJnOwotLQkJCSAgY2hhcmFjdGVycyA9IDA7Ci0tCQkJICBmb3IgKDs7KQotLQkJCSAgICB7Ci0tCQkJICAgICAgaW50IGNvdW50ID0gdThfc3RybWJsZW4gKGFyZ19lbmQpOwotLQkJCSAgICAgIGlmIChjb3VudCA9PSAwKQotLQkJCQlicmVhazsKLS0JCQkgICAgICBpZiAoY291bnQgPCAwKQotLQkJCQl7Ci0tCQkJCSAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0tCQkJCSAgICBmcmVlIChyZXN1bHQpOwotLQkJCQkgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLS0JCQkJICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0tCQkJCSAgQ0xFQU5VUCAoKTsKLS0JCQkJICBlcnJubyA9IEVJTFNFUTsKLS0JCQkJICByZXR1cm4gTlVMTDsKLS0JCQkJfQotLQkJCSAgICAgIGFyZ19lbmQgKz0gY291bnQ7Ci0tCQkJICAgICAgY2hhcmFjdGVycysrOwotLQkJCSAgICB9Ci0tCQkJfQotLQkJICAgICAgZWxzZQotLQkJCXsKLS0JCQkgIC8qIFVzZSB0aGUgZW50aXJlIHN0cmluZy4gICovCi0tCQkJICBhcmdfZW5kID0gYXJnICsgdThfc3RybGVuIChhcmcpOwotLQkJCSAgLyogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGRvZXNuJ3QgbWF0dGVyLiAgKi8KLS0JCQkgIGNoYXJhY3RlcnMgPSAwOwotLQkJCX0KLS0KLS0JCSAgICAgIGlmIChoYXNfd2lkdGggJiYgd2lkdGggPiBjaGFyYWN0ZXJzCi0tCQkJICAmJiAhKGRwLT5mbGFncyAmIEZMQUdfTEVGVCkpCi0tCQkJewotLQkJCSAgc2l6ZV90IG4gPSB3aWR0aCAtIGNoYXJhY3RlcnM7Ci0tCQkJICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBuKSk7Ci0tCQkJICBEQ0hBUl9TRVQgKHJlc3VsdCArIGxlbmd0aCwgJyAnLCBuKTsKLS0JCQkgIGxlbmd0aCArPSBuOwotLQkJCX0KLS0KLS0jIGlmIERDSEFSX0lTX1VJTlQ4X1QKLS0JCSAgICAgIHsKLS0JCQlzaXplX3QgbiA9IGFyZ19lbmQgLSBhcmc7Ci0tCQkJRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgbikpOwotLQkJCURDSEFSX0NQWSAocmVzdWx0ICsgbGVuZ3RoLCBhcmcsIG4pOwotLQkJCWxlbmd0aCArPSBuOwotLQkJICAgICAgfQotLSMgZWxzZQotLQkJICAgICAgeyAvKiBDb252ZXJ0LiAgKi8KLS0JCQlEQ0hBUl9UICpjb252ZXJ0ZWQgPSByZXN1bHQgKyBsZW5ndGg7Ci0tCQkJc2l6ZV90IGNvbnZlcnRlZF9sZW4gPSBhbGxvY2F0ZWQgLSBsZW5ndGg7Ci0tIyAgaWYgRENIQVJfSVNfVENIQVIKLS0JCQkvKiBDb252ZXJ0IGZyb20gVVRGLTggdG8gbG9jYWxlIGVuY29kaW5nLiAgKi8KLS0JCQlpZiAodThfY29udl90b19lbmNvZGluZyAobG9jYWxlX2NoYXJzZXQgKCksCi0tCQkJCQkJIGljb252ZWhfcXVlc3Rpb25fbWFyaywKLS0JCQkJCQkgYXJnLCBhcmdfZW5kIC0gYXJnLCBOVUxMLAotLQkJCQkJCSAmY29udmVydGVkLCAmY29udmVydGVkX2xlbikKLS0JCQkgICAgPCAwKQotLSMgIGVsc2UKLS0JCQkvKiBDb252ZXJ0IGZyb20gVVRGLTggdG8gVVRGLTE2L1VURi0zMi4gICovCi0tCQkJY29udmVydGVkID0KLS0JCQkgIFU4X1RPX0RDSEFSIChhcmcsIGFyZ19lbmQgLSBhcmcsCi0tCQkJCSAgICAgICBjb252ZXJ0ZWQsICZjb252ZXJ0ZWRfbGVuKTsKLS0JCQlpZiAoY29udmVydGVkID09IE5VTEwpCi0tIyAgZW5kaWYKLS0JCQkgIHsKLS0JCQkgICAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87Ci0tCQkJICAgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotLQkJCSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0tCQkJICAgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLS0JCQkgICAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotLQkJCSAgICBDTEVBTlVQICgpOwotLQkJCSAgICBlcnJubyA9IHNhdmVkX2Vycm5vOwotLQkJCSAgICByZXR1cm4gTlVMTDsKLS0JCQkgIH0KLS0JCQlpZiAoY29udmVydGVkICE9IHJlc3VsdCArIGxlbmd0aCkKLS0JCQkgIHsKLS0JCQkgICAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgY29udmVydGVkX2xlbikpOwotLQkJCSAgICBEQ0hBUl9DUFkgKHJlc3VsdCArIGxlbmd0aCwgY29udmVydGVkLCBjb252ZXJ0ZWRfbGVuKTsKLS0JCQkgICAgZnJlZSAoY29udmVydGVkKTsKLS0JCQkgIH0KLS0JCQlsZW5ndGggKz0gY29udmVydGVkX2xlbjsKLS0JCSAgICAgIH0KLS0jIGVuZGlmCi0tCi0tCQkgICAgICBpZiAoaGFzX3dpZHRoICYmIHdpZHRoID4gY2hhcmFjdGVycwotLQkJCSAgJiYgKGRwLT5mbGFncyAmIEZMQUdfTEVGVCkpCi0tCQkJewotLQkJCSAgc2l6ZV90IG4gPSB3aWR0aCAtIGNoYXJhY3RlcnM7Ci0tCQkJICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBuKSk7Ci0tCQkJICBEQ0hBUl9TRVQgKHJlc3VsdCArIGxlbmd0aCwgJyAnLCBuKTsKLS0JCQkgIGxlbmd0aCArPSBuOwotLQkJCX0KLS0JCSAgICB9Ci0tCQkgICAgYnJlYWs7Ci0tCi0tCQkgIGNhc2UgVFlQRV9VMTZfU1RSSU5HOgotLQkJICAgIHsKLS0JCSAgICAgIGNvbnN0IHVpbnQxNl90ICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdTE2X3N0cmluZzsKLS0JCSAgICAgIGNvbnN0IHVpbnQxNl90ICphcmdfZW5kOwotLQkJICAgICAgc2l6ZV90IGNoYXJhY3RlcnM7Ci0tCi0tCQkgICAgICBpZiAoaGFzX3ByZWNpc2lvbikKLS0JCQl7Ci0tCQkJICAvKiBVc2Ugb25seSBQUkVDSVNJT04gY2hhcmFjdGVycywgZnJvbSB0aGUgbGVmdC4gICovCi0tCQkJICBhcmdfZW5kID0gYXJnOwotLQkJCSAgY2hhcmFjdGVycyA9IDA7Ci0tCQkJICBmb3IgKDsgcHJlY2lzaW9uID4gMDsgcHJlY2lzaW9uLS0pCi0tCQkJICAgIHsKLS0JCQkgICAgICBpbnQgY291bnQgPSB1MTZfc3RybWJsZW4gKGFyZ19lbmQpOwotLQkJCSAgICAgIGlmIChjb3VudCA9PSAwKQotLQkJCQlicmVhazsKLS0JCQkgICAgICBpZiAoY291bnQgPCAwKQotLQkJCQl7Ci0tCQkJCSAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0tCQkJCSAgICBmcmVlIChyZXN1bHQpOwotLQkJCQkgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLS0JCQkJICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0tCQkJCSAgQ0xFQU5VUCAoKTsKLS0JCQkJICBlcnJubyA9IEVJTFNFUTsKLS0JCQkJICByZXR1cm4gTlVMTDsKLS0JCQkJfQotLQkJCSAgICAgIGFyZ19lbmQgKz0gY291bnQ7Ci0tCQkJICAgICAgY2hhcmFjdGVycysrOwotLQkJCSAgICB9Ci0tCQkJfQotLQkJICAgICAgZWxzZSBpZiAoaGFzX3dpZHRoKQotLQkJCXsKLS0JCQkgIC8qIFVzZSB0aGUgZW50aXJlIHN0cmluZywgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YKLS0JCQkgICAgIGNoYXJhY3RlcnMuICAqLwotLQkJCSAgYXJnX2VuZCA9IGFyZzsKLS0JCQkgIGNoYXJhY3RlcnMgPSAwOwotLQkJCSAgZm9yICg7OykKLS0JCQkgICAgewotLQkJCSAgICAgIGludCBjb3VudCA9IHUxNl9zdHJtYmxlbiAoYXJnX2VuZCk7Ci0tCQkJICAgICAgaWYgKGNvdW50ID09IDApCi0tCQkJCWJyZWFrOwotLQkJCSAgICAgIGlmIChjb3VudCA8IDApCi0tCQkJCXsKLS0JCQkJICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLS0JCQkJICAgIGZyZWUgKHJlc3VsdCk7Ci0tCQkJCSAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotLQkJCQkgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLS0JCQkJICBDTEVBTlVQICgpOwotLQkJCQkgIGVycm5vID0gRUlMU0VROwotLQkJCQkgIHJldHVybiBOVUxMOwotLQkJCQl9Ci0tCQkJICAgICAgYXJnX2VuZCArPSBjb3VudDsKLS0JCQkgICAgICBjaGFyYWN0ZXJzKys7Ci0tCQkJICAgIH0KLS0JCQl9Ci0tCQkgICAgICBlbHNlCi0tCQkJewotLQkJCSAgLyogVXNlIHRoZSBlbnRpcmUgc3RyaW5nLiAgKi8KLS0JCQkgIGFyZ19lbmQgPSBhcmcgKyB1MTZfc3RybGVuIChhcmcpOwotLQkJCSAgLyogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGRvZXNuJ3QgbWF0dGVyLiAgKi8KLS0JCQkgIGNoYXJhY3RlcnMgPSAwOwotLQkJCX0KLS0KLS0JCSAgICAgIGlmIChoYXNfd2lkdGggJiYgd2lkdGggPiBjaGFyYWN0ZXJzCi0tCQkJICAmJiAhKGRwLT5mbGFncyAmIEZMQUdfTEVGVCkpCi0tCQkJewotLQkJCSAgc2l6ZV90IG4gPSB3aWR0aCAtIGNoYXJhY3RlcnM7Ci0tCQkJICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBuKSk7Ci0tCQkJICBEQ0hBUl9TRVQgKHJlc3VsdCArIGxlbmd0aCwgJyAnLCBuKTsKLS0JCQkgIGxlbmd0aCArPSBuOwotLQkJCX0KLS0KLS0jIGlmIERDSEFSX0lTX1VJTlQxNl9UCi0tCQkgICAgICB7Ci0tCQkJc2l6ZV90IG4gPSBhcmdfZW5kIC0gYXJnOwotLQkJCUVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIG4pKTsKLS0JCQlEQ0hBUl9DUFkgKHJlc3VsdCArIGxlbmd0aCwgYXJnLCBuKTsKLS0JCQlsZW5ndGggKz0gbjsKLS0JCSAgICAgIH0KLS0jIGVsc2UKLS0JCSAgICAgIHsgLyogQ29udmVydC4gICovCi0tCQkJRENIQVJfVCAqY29udmVydGVkID0gcmVzdWx0ICsgbGVuZ3RoOwotLQkJCXNpemVfdCBjb252ZXJ0ZWRfbGVuID0gYWxsb2NhdGVkIC0gbGVuZ3RoOwotLSMgIGlmIERDSEFSX0lTX1RDSEFSCi0tCQkJLyogQ29udmVydCBmcm9tIFVURi0xNiB0byBsb2NhbGUgZW5jb2RpbmcuICAqLwotLQkJCWlmICh1MTZfY29udl90b19lbmNvZGluZyAobG9jYWxlX2NoYXJzZXQgKCksCi0tCQkJCQkJICBpY29udmVoX3F1ZXN0aW9uX21hcmssCi0tCQkJCQkJICBhcmcsIGFyZ19lbmQgLSBhcmcsIE5VTEwsCi0tCQkJCQkJICAmY29udmVydGVkLCAmY29udmVydGVkX2xlbikKLS0JCQkgICAgPCAwKQotLSMgIGVsc2UKLS0JCQkvKiBDb252ZXJ0IGZyb20gVVRGLTE2IHRvIFVURi04L1VURi0zMi4gICovCi0tCQkJY29udmVydGVkID0KLS0JCQkgIFUxNl9UT19EQ0hBUiAoYXJnLCBhcmdfZW5kIC0gYXJnLAotLQkJCQkJY29udmVydGVkLCAmY29udmVydGVkX2xlbik7Ci0tCQkJaWYgKGNvbnZlcnRlZCA9PSBOVUxMKQotLSMgIGVuZGlmCi0tCQkJICB7Ci0tCQkJICAgIGludCBzYXZlZF9lcnJubyA9IGVycm5vOwotLQkJCSAgICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLS0JCQkgICAgICBmcmVlIChyZXN1bHQpOwotLQkJCSAgICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0tCQkJICAgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLS0JCQkgICAgQ0xFQU5VUCAoKTsKLS0JCQkgICAgZXJybm8gPSBzYXZlZF9lcnJubzsKLS0JCQkgICAgcmV0dXJuIE5VTEw7Ci0tCQkJICB9Ci0tCQkJaWYgKGNvbnZlcnRlZCAhPSByZXN1bHQgKyBsZW5ndGgpCi0tCQkJICB7Ci0tCQkJICAgIEVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIGNvbnZlcnRlZF9sZW4pKTsKLS0JCQkgICAgRENIQVJfQ1BZIChyZXN1bHQgKyBsZW5ndGgsIGNvbnZlcnRlZCwgY29udmVydGVkX2xlbik7Ci0tCQkJICAgIGZyZWUgKGNvbnZlcnRlZCk7Ci0tCQkJICB9Ci0tCQkJbGVuZ3RoICs9IGNvbnZlcnRlZF9sZW47Ci0tCQkgICAgICB9Ci0tIyBlbmRpZgotLQotLQkJICAgICAgaWYgKGhhc193aWR0aCAmJiB3aWR0aCA+IGNoYXJhY3RlcnMKLS0JCQkgICYmIChkcC0+ZmxhZ3MgJiBGTEFHX0xFRlQpKQotLQkJCXsKLS0JCQkgIHNpemVfdCBuID0gd2lkdGggLSBjaGFyYWN0ZXJzOwotLQkJCSAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgbikpOwotLQkJCSAgRENIQVJfU0VUIChyZXN1bHQgKyBsZW5ndGgsICcgJywgbik7Ci0tCQkJICBsZW5ndGggKz0gbjsKLS0JCQl9Ci0tCQkgICAgfQotLQkJICAgIGJyZWFrOwotLQotLQkJICBjYXNlIFRZUEVfVTMyX1NUUklORzoKLS0JCSAgICB7Ci0tCQkgICAgICBjb25zdCB1aW50MzJfdCAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3UzMl9zdHJpbmc7Ci0tCQkgICAgICBjb25zdCB1aW50MzJfdCAqYXJnX2VuZDsKLS0JCSAgICAgIHNpemVfdCBjaGFyYWN0ZXJzOwotLQotLQkJICAgICAgaWYgKGhhc19wcmVjaXNpb24pCi0tCQkJewotLQkJCSAgLyogVXNlIG9ubHkgUFJFQ0lTSU9OIGNoYXJhY3RlcnMsIGZyb20gdGhlIGxlZnQuICAqLwotLQkJCSAgYXJnX2VuZCA9IGFyZzsKLS0JCQkgIGNoYXJhY3RlcnMgPSAwOwotLQkJCSAgZm9yICg7IHByZWNpc2lvbiA+IDA7IHByZWNpc2lvbi0tKQotLQkJCSAgICB7Ci0tCQkJICAgICAgaW50IGNvdW50ID0gdTMyX3N0cm1ibGVuIChhcmdfZW5kKTsKLS0JCQkgICAgICBpZiAoY291bnQgPT0gMCkKLS0JCQkJYnJlYWs7Ci0tCQkJICAgICAgaWYgKGNvdW50IDwgMCkKLS0JCQkJewotLQkJCQkgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotLQkJCQkgICAgZnJlZSAocmVzdWx0KTsKLS0JCQkJICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0tCQkJCSAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotLQkJCQkgIENMRUFOVVAgKCk7Ci0tCQkJCSAgZXJybm8gPSBFSUxTRVE7Ci0tCQkJCSAgcmV0dXJuIE5VTEw7Ci0tCQkJCX0KLS0JCQkgICAgICBhcmdfZW5kICs9IGNvdW50OwotLQkJCSAgICAgIGNoYXJhY3RlcnMrKzsKLS0JCQkgICAgfQotLQkJCX0KLS0JCSAgICAgIGVsc2UgaWYgKGhhc193aWR0aCkKLS0JCQl7Ci0tCQkJICAvKiBVc2UgdGhlIGVudGlyZSBzdHJpbmcsIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mCi0tCQkJICAgICBjaGFyYWN0ZXJzLiAgKi8KLS0JCQkgIGFyZ19lbmQgPSBhcmc7Ci0tCQkJICBjaGFyYWN0ZXJzID0gMDsKLS0JCQkgIGZvciAoOzspCi0tCQkJICAgIHsKLS0JCQkgICAgICBpbnQgY291bnQgPSB1MzJfc3RybWJsZW4gKGFyZ19lbmQpOwotLQkJCSAgICAgIGlmIChjb3VudCA9PSAwKQotLQkJCQlicmVhazsKLS0JCQkgICAgICBpZiAoY291bnQgPCAwKQotLQkJCQl7Ci0tCQkJCSAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0tCQkJCSAgICBmcmVlIChyZXN1bHQpOwotLQkJCQkgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLS0JCQkJICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0tCQkJCSAgQ0xFQU5VUCAoKTsKLS0JCQkJICBlcnJubyA9IEVJTFNFUTsKLS0JCQkJICByZXR1cm4gTlVMTDsKLS0JCQkJfQotLQkJCSAgICAgIGFyZ19lbmQgKz0gY291bnQ7Ci0tCQkJICAgICAgY2hhcmFjdGVycysrOwotLQkJCSAgICB9Ci0tCQkJfQotLQkJICAgICAgZWxzZQotLQkJCXsKLS0JCQkgIC8qIFVzZSB0aGUgZW50aXJlIHN0cmluZy4gICovCi0tCQkJICBhcmdfZW5kID0gYXJnICsgdTMyX3N0cmxlbiAoYXJnKTsKLS0JCQkgIC8qIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBkb2Vzbid0IG1hdHRlci4gICovCi0tCQkJICBjaGFyYWN0ZXJzID0gMDsKLS0JCQl9Ci0tCi0tCQkgICAgICBpZiAoaGFzX3dpZHRoICYmIHdpZHRoID4gY2hhcmFjdGVycwotLQkJCSAgJiYgIShkcC0+ZmxhZ3MgJiBGTEFHX0xFRlQpKQotLQkJCXsKLS0JCQkgIHNpemVfdCBuID0gd2lkdGggLSBjaGFyYWN0ZXJzOwotLQkJCSAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgbikpOwotLQkJCSAgRENIQVJfU0VUIChyZXN1bHQgKyBsZW5ndGgsICcgJywgbik7Ci0tCQkJICBsZW5ndGggKz0gbjsKLS0JCQl9Ci0tCi0tIyBpZiBEQ0hBUl9JU19VSU5UMzJfVAotLQkJICAgICAgewotLQkJCXNpemVfdCBuID0gYXJnX2VuZCAtIGFyZzsKLS0JCQlFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBuKSk7Ci0tCQkJRENIQVJfQ1BZIChyZXN1bHQgKyBsZW5ndGgsIGFyZywgbik7Ci0tCQkJbGVuZ3RoICs9IG47Ci0tCQkgICAgICB9Ci0tIyBlbHNlCi0tCQkgICAgICB7IC8qIENvbnZlcnQuICAqLwotLQkJCURDSEFSX1QgKmNvbnZlcnRlZCA9IHJlc3VsdCArIGxlbmd0aDsKLS0JCQlzaXplX3QgY29udmVydGVkX2xlbiA9IGFsbG9jYXRlZCAtIGxlbmd0aDsKLS0jICBpZiBEQ0hBUl9JU19UQ0hBUgotLQkJCS8qIENvbnZlcnQgZnJvbSBVVEYtMzIgdG8gbG9jYWxlIGVuY29kaW5nLiAgKi8KLS0JCQlpZiAodTMyX2NvbnZfdG9fZW5jb2RpbmcgKGxvY2FsZV9jaGFyc2V0ICgpLAotLQkJCQkJCSAgaWNvbnZlaF9xdWVzdGlvbl9tYXJrLAotLQkJCQkJCSAgYXJnLCBhcmdfZW5kIC0gYXJnLCBOVUxMLAotLQkJCQkJCSAgJmNvbnZlcnRlZCwgJmNvbnZlcnRlZF9sZW4pCi0tCQkJICAgIDwgMCkKLS0jICBlbHNlCi0tCQkJLyogQ29udmVydCBmcm9tIFVURi0zMiB0byBVVEYtOC9VVEYtMTYuICAqLwotLQkJCWNvbnZlcnRlZCA9Ci0tCQkJICBVMzJfVE9fRENIQVIgKGFyZywgYXJnX2VuZCAtIGFyZywKLS0JCQkJCWNvbnZlcnRlZCwgJmNvbnZlcnRlZF9sZW4pOwotLQkJCWlmIChjb252ZXJ0ZWQgPT0gTlVMTCkKLS0jICBlbmRpZgotLQkJCSAgewotLQkJCSAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLS0JCQkgICAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0tCQkJICAgICAgZnJlZSAocmVzdWx0KTsKLS0JCQkgICAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotLQkJCSAgICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0tCQkJICAgIENMRUFOVVAgKCk7Ci0tCQkJICAgIGVycm5vID0gc2F2ZWRfZXJybm87Ci0tCQkJICAgIHJldHVybiBOVUxMOwotLQkJCSAgfQotLQkJCWlmIChjb252ZXJ0ZWQgIT0gcmVzdWx0ICsgbGVuZ3RoKQotLQkJCSAgewotLQkJCSAgICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBjb252ZXJ0ZWRfbGVuKSk7Ci0tCQkJICAgIERDSEFSX0NQWSAocmVzdWx0ICsgbGVuZ3RoLCBjb252ZXJ0ZWQsIGNvbnZlcnRlZF9sZW4pOwotLQkJCSAgICBmcmVlIChjb252ZXJ0ZWQpOwotLQkJCSAgfQotLQkJCWxlbmd0aCArPSBjb252ZXJ0ZWRfbGVuOwotLQkJICAgICAgfQotLSMgZW5kaWYKLS0KLS0JCSAgICAgIGlmIChoYXNfd2lkdGggJiYgd2lkdGggPiBjaGFyYWN0ZXJzCi0tCQkJICAmJiAoZHAtPmZsYWdzICYgRkxBR19MRUZUKSkKLS0JCQl7Ci0tCQkJICBzaXplX3QgbiA9IHdpZHRoIC0gY2hhcmFjdGVyczsKLS0JCQkgIEVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIG4pKTsKLS0JCQkgIERDSEFSX1NFVCAocmVzdWx0ICsgbGVuZ3RoLCAnICcsIG4pOwotLQkJCSAgbGVuZ3RoICs9IG47Ci0tCQkJfQotLQkJICAgIH0KLS0JCSAgICBicmVhazsKLS0KLS0JCSAgZGVmYXVsdDoKLS0JCSAgICBhYm9ydCAoKTsKLS0JCSAgfQotLQkgICAgICB9Ci0tI2VuZGlmCi0tI2lmIChORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCBORUVEX1BSSU5URl9MT05HX0RPVUJMRSB8fCBORUVEX1BSSU5URl9ET1VCTEUpICYmICFkZWZpbmVkIElOX0xJQklOVEwKLS0JICAgIGVsc2UgaWYgKChkcC0+Y29udmVyc2lvbiA9PSAnYScgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0EnKQotLSMgaWYgIShORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCAoTkVFRF9QUklOVEZfTE9OR19ET1VCTEUgJiYgTkVFRF9QUklOVEZfRE9VQkxFKSkKLS0JCSAgICAgJiYgKDAKLS0jICBpZiBORUVEX1BSSU5URl9ET1VCTEUKLS0JCQkgfHwgYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZSA9PSBUWVBFX0RPVUJMRQotLSMgIGVuZGlmCi0tIyAgaWYgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUKLS0JCQkgfHwgYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZSA9PSBUWVBFX0xPTkdET1VCTEUKLS0jICBlbmRpZgotLQkJCSkKLS0jIGVuZGlmCi0tCQkgICAgKQotLQkgICAgICB7Ci0tCQlhcmdfdHlwZSB0eXBlID0gYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZTsKLS0JCWludCBmbGFncyA9IGRwLT5mbGFnczsKLS0JCWludCBoYXNfd2lkdGg7Ci0tCQlzaXplX3Qgd2lkdGg7Ci0tCQlpbnQgaGFzX3ByZWNpc2lvbjsKLS0JCXNpemVfdCBwcmVjaXNpb247Ci0tCQlzaXplX3QgdG1wX2xlbmd0aDsKLS0JCURDSEFSX1QgdG1wYnVmWzcwMF07Ci0tCQlEQ0hBUl9UICp0bXA7Ci0tCQlEQ0hBUl9UICpwYWRfcHRyOwotLQkJRENIQVJfVCAqcDsKLS0KLS0JCWhhc193aWR0aCA9IDA7Ci0tCQl3aWR0aCA9IDA7Ci0tCQlpZiAoZHAtPndpZHRoX3N0YXJ0ICE9IGRwLT53aWR0aF9lbmQpCi0tCQkgIHsKLS0JCSAgICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKLS0JCSAgICAgIHsKLS0JCQlpbnQgYXJnOwotLQotLQkJCWlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotLQkJCSAgYWJvcnQgKCk7Ci0tCQkJYXJnID0gYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0uYS5hX2ludDsKLS0JCQlpZiAoYXJnIDwgMCkKLS0JCQkgIHsKLS0JCQkgICAgLyogIkEgbmVnYXRpdmUgZmllbGQgd2lkdGggaXMgdGFrZW4gYXMgYSAnLScgZmxhZwotLQkJCSAgICAgICAgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBmaWVsZCB3aWR0aC4iICAqLwotLQkJCSAgICBmbGFncyB8PSBGTEFHX0xFRlQ7Ci0tCQkJICAgIHdpZHRoID0gKHVuc2lnbmVkIGludCkgKC1hcmcpOwotLQkJCSAgfQotLQkJCWVsc2UKLS0JCQkgIHdpZHRoID0gYXJnOwotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQljb25zdCBGQ0hBUl9UICpkaWdpdHAgPSBkcC0+d2lkdGhfc3RhcnQ7Ci0tCi0tCQkJZG8KLS0JCQkgIHdpZHRoID0geHN1bSAoeHRpbWVzICh3aWR0aCwgMTApLCAqZGlnaXRwKysgLSAnMCcpOwotLQkJCXdoaWxlIChkaWdpdHAgIT0gZHAtPndpZHRoX2VuZCk7Ci0tCQkgICAgICB9Ci0tCQkgICAgaGFzX3dpZHRoID0gMTsKLS0JCSAgfQotLQotLQkJaGFzX3ByZWNpc2lvbiA9IDA7Ci0tCQlwcmVjaXNpb24gPSAwOwotLQkJaWYgKGRwLT5wcmVjaXNpb25fc3RhcnQgIT0gZHAtPnByZWNpc2lvbl9lbmQpCi0tCQkgIHsKLS0JCSAgICBpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0tCQkgICAgICB7Ci0tCQkJaW50IGFyZzsKLS0KLS0JCQlpZiAoIShhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCi0tCQkJICBhYm9ydCAoKTsKLS0JCQlhcmcgPSBhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0uYS5hX2ludDsKLS0JCQkvKiAiQSBuZWdhdGl2ZSBwcmVjaXNpb24gaXMgdGFrZW4gYXMgaWYgdGhlIHByZWNpc2lvbgotLQkJCSAgICB3ZXJlIG9taXR0ZWQuIiAgKi8KLS0JCQlpZiAoYXJnID49IDApCi0tCQkJICB7Ci0tCQkJICAgIHByZWNpc2lvbiA9IGFyZzsKLS0JCQkgICAgaGFzX3ByZWNpc2lvbiA9IDE7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tCQkgICAgZWxzZQotLQkJICAgICAgewotLQkJCWNvbnN0IEZDSEFSX1QgKmRpZ2l0cCA9IGRwLT5wcmVjaXNpb25fc3RhcnQgKyAxOwotLQotLQkJCXByZWNpc2lvbiA9IDA7Ci0tCQkJd2hpbGUgKGRpZ2l0cCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKLS0JCQkgIHByZWNpc2lvbiA9IHhzdW0gKHh0aW1lcyAocHJlY2lzaW9uLCAxMCksICpkaWdpdHArKyAtICcwJyk7Ci0tCQkJaGFzX3ByZWNpc2lvbiA9IDE7Ci0tCQkgICAgICB9Ci0tCQkgIH0KLS0KLS0JCS8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemUuICAqLwotLQkJaWYgKHR5cGUgPT0gVFlQRV9MT05HRE9VQkxFKQotLQkJICB0bXBfbGVuZ3RoID0KLS0JCSAgICAodW5zaWduZWQgaW50KSAoKExEQkxfRElHICsgMSkKLS0JCQkJICAgICogMC44MzEgLyogZGVjaW1hbCAtPiBoZXhhZGVjaW1hbCAqLwotLQkJCQkgICApCi0tCQkgICAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJZWxzZQotLQkJICB0bXBfbGVuZ3RoID0KLS0JCSAgICAodW5zaWduZWQgaW50KSAoKERCTF9ESUcgKyAxKQotLQkJCQkgICAgKiAwLjgzMSAvKiBkZWNpbWFsIC0+IGhleGFkZWNpbWFsICovCi0tCQkJCSAgICkKLS0JCSAgICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQlpZiAodG1wX2xlbmd0aCA8IHByZWNpc2lvbikKLS0JCSAgdG1wX2xlbmd0aCA9IHByZWNpc2lvbjsKLS0JCS8qIEFjY291bnQgZm9yIHNpZ24sIGRlY2ltYWwgcG9pbnQgZXRjLiAqLwotLQkJdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIDEyKTsKLS0KLS0JCWlmICh0bXBfbGVuZ3RoIDwgd2lkdGgpCi0tCQkgIHRtcF9sZW5ndGggPSB3aWR0aDsKLS0KLS0JCXRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCAxKTsgLyogYWNjb3VudCBmb3IgdHJhaWxpbmcgTlVMICovCi0tCi0tCQlpZiAodG1wX2xlbmd0aCA8PSBzaXplb2YgKHRtcGJ1ZikgLyBzaXplb2YgKERDSEFSX1QpKQotLQkJICB0bXAgPSB0bXBidWY7Ci0tCQllbHNlCi0tCQkgIHsKLS0JCSAgICBzaXplX3QgdG1wX21lbXNpemUgPSB4dGltZXMgKHRtcF9sZW5ndGgsIHNpemVvZiAoRENIQVJfVCkpOwotLQotLQkJICAgIGlmIChzaXplX292ZXJmbG93X3AgKHRtcF9tZW1zaXplKSkKLS0JCSAgICAgIC8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLwotLQkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OwotLQkJICAgIHRtcCA9IChEQ0hBUl9UICopIG1hbGxvYyAodG1wX21lbXNpemUpOwotLQkJICAgIGlmICh0bXAgPT0gTlVMTCkKLS0JCSAgICAgIC8qIE91dCBvZiBtZW1vcnkuICAqLwotLQkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OwotLQkJICB9Ci0tCi0tCQlwYWRfcHRyID0gTlVMTDsKLS0JCXAgPSB0bXA7Ci0tCQlpZiAodHlwZSA9PSBUWVBFX0xPTkdET1VCTEUpCi0tCQkgIHsKLS0jIGlmIE5FRURfUFJJTlRGX0RJUkVDVElWRV9BIHx8IE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFCi0tCQkgICAgbG9uZyBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdkb3VibGU7Ci0tCi0tCQkgICAgaWYgKGlzbmFubCAoYXJnKSkKLS0JCSAgICAgIHsKLS0JCQlpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ0EnKQotLQkJCSAgewotLQkJCSAgICAqcCsrID0gJ04nOyAqcCsrID0gJ0EnOyAqcCsrID0gJ04nOwotLQkJCSAgfQotLQkJCWVsc2UKLS0JCQkgIHsKLS0JCQkgICAgKnArKyA9ICduJzsgKnArKyA9ICdhJzsgKnArKyA9ICduJzsKLS0JCQkgIH0KLS0JCSAgICAgIH0KLS0JCSAgICBlbHNlCi0tCQkgICAgICB7Ci0tCQkJaW50IHNpZ24gPSAwOwotLQkJCURFQ0xfTE9OR19ET1VCTEVfUk9VTkRJTkcKLS0KLS0JCQlCRUdJTl9MT05HX0RPVUJMRV9ST1VORElORyAoKTsKLS0KLS0JCQlpZiAoc2lnbmJpdCAoYXJnKSkgLyogYXJnIDwgMC4wTCBvciBuZWdhdGl2ZSB6ZXJvICovCi0tCQkJICB7Ci0tCQkJICAgIHNpZ24gPSAtMTsKLS0JCQkgICAgYXJnID0gLWFyZzsKLS0JCQkgIH0KLS0KLS0JCQlpZiAoc2lnbiA8IDApCi0tCQkJICAqcCsrID0gJy0nOwotLQkJCWVsc2UgaWYgKGZsYWdzICYgRkxBR19TSE9XU0lHTikKLS0JCQkgICpwKysgPSAnKyc7Ci0tCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTEFHX1NQQUNFKQotLQkJCSAgKnArKyA9ICcgJzsKLS0KLS0JCQlpZiAoYXJnID4gMC4wTCAmJiBhcmcgKyBhcmcgPT0gYXJnKQotLQkJCSAgewotLQkJCSAgICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ0EnKQotLQkJCSAgICAgIHsKLS0JCQkJKnArKyA9ICdJJzsgKnArKyA9ICdOJzsgKnArKyA9ICdGJzsKLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UKLS0JCQkgICAgICB7Ci0tCQkJCSpwKysgPSAnaSc7ICpwKysgPSAnbic7ICpwKysgPSAnZic7Ci0tCQkJICAgICAgfQotLQkJCSAgfQotLQkJCWVsc2UKLS0JCQkgIHsKLS0JCQkgICAgaW50IGV4cG9uZW50OwotLQkJCSAgICBsb25nIGRvdWJsZSBtYW50aXNzYTsKLS0KLS0JCQkgICAgaWYgKGFyZyA+IDAuMEwpCi0tCQkJICAgICAgbWFudGlzc2EgPSBwcmludGZfZnJleHBsIChhcmcsICZleHBvbmVudCk7Ci0tCQkJICAgIGVsc2UKLS0JCQkgICAgICB7Ci0tCQkJCWV4cG9uZW50ID0gMDsKLS0JCQkJbWFudGlzc2EgPSAwLjBMOwotLQkJCSAgICAgIH0KLS0KLS0JCQkgICAgaWYgKGhhc19wcmVjaXNpb24KLS0JCQkJJiYgcHJlY2lzaW9uIDwgKHVuc2lnbmVkIGludCkgKChMREJMX0RJRyArIDEpICogMC44MzEpICsgMSkKLS0JCQkgICAgICB7Ci0tCQkJCS8qIFJvdW5kIHRoZSBtYW50aXNzYS4gICovCi0tCQkJCWxvbmcgZG91YmxlIHRhaWwgPSBtYW50aXNzYTsKLS0JCQkJc2l6ZV90IHE7Ci0tCi0tCQkJCWZvciAocSA9IHByZWNpc2lvbjsgOyBxLS0pCi0tCQkJCSAgewotLQkJCQkgICAgaW50IGRpZ2l0ID0gKGludCkgdGFpbDsKLS0JCQkJICAgIHRhaWwgLT0gZGlnaXQ7Ci0tCQkJCSAgICBpZiAocSA9PSAwKQotLQkJCQkgICAgICB7Ci0tCQkJCQlpZiAoZGlnaXQgJiAxID8gdGFpbCA+PSAwLjVMIDogdGFpbCA+IDAuNUwpCi0tCQkJCQkgIHRhaWwgPSAxIC0gdGFpbDsKLS0JCQkJCWVsc2UKLS0JCQkJCSAgdGFpbCA9IC0gdGFpbDsKLS0JCQkJCWJyZWFrOwotLQkJCQkgICAgICB9Ci0tCQkJCSAgICB0YWlsICo9IDE2LjBMOwotLQkJCQkgIH0KLS0JCQkJaWYgKHRhaWwgIT0gMC4wTCkKLS0JCQkJICBmb3IgKHEgPSBwcmVjaXNpb247IHEgPiAwOyBxLS0pCi0tCQkJCSAgICB0YWlsICo9IDAuMDYyNUw7Ci0tCQkJCW1hbnRpc3NhICs9IHRhaWw7Ci0tCQkJICAgICAgfQotLQotLQkJCSAgICAqcCsrID0gJzAnOwotLQkJCSAgICAqcCsrID0gZHAtPmNvbnZlcnNpb24gLSAnQScgKyAnWCc7Ci0tCQkJICAgIHBhZF9wdHIgPSBwOwotLQkJCSAgICB7Ci0tCQkJICAgICAgaW50IGRpZ2l0OwotLQotLQkJCSAgICAgIGRpZ2l0ID0gKGludCkgbWFudGlzc2E7Ci0tCQkJICAgICAgbWFudGlzc2EgLT0gZGlnaXQ7Ci0tCQkJICAgICAgKnArKyA9ICcwJyArIGRpZ2l0OwotLQkJCSAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FMVCkKLS0JCQkJICB8fCBtYW50aXNzYSA+IDAuMEwgfHwgcHJlY2lzaW9uID4gMCkKLS0JCQkJewotLQkJCQkgICpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCSAgLyogVGhpcyBsb29wIHRlcm1pbmF0ZXMgYmVjYXVzZSB3ZSBhc3N1bWUKLS0JCQkJICAgICB0aGF0IEZMVF9SQURJWCBpcyBhIHBvd2VyIG9mIDIuICAqLwotLQkJCQkgIHdoaWxlIChtYW50aXNzYSA+IDAuMEwpCi0tCQkJCSAgICB7Ci0tCQkJCSAgICAgIG1hbnRpc3NhICo9IDE2LjBMOwotLQkJCQkgICAgICBkaWdpdCA9IChpbnQpIG1hbnRpc3NhOwotLQkJCQkgICAgICBtYW50aXNzYSAtPSBkaWdpdDsKLS0JCQkJICAgICAgKnArKyA9IGRpZ2l0Ci0tCQkJCQkgICAgICsgKGRpZ2l0IDwgMTAKLS0JCQkJCQk/ICcwJwotLQkJCQkJCTogZHAtPmNvbnZlcnNpb24gLSAxMCk7Ci0tCQkJCSAgICAgIGlmIChwcmVjaXNpb24gPiAwKQotLQkJCQkJcHJlY2lzaW9uLS07Ci0tCQkJCSAgICB9Ci0tCQkJCSAgd2hpbGUgKHByZWNpc2lvbiA+IDApCi0tCQkJCSAgICB7Ci0tCQkJCSAgICAgICpwKysgPSAnMCc7Ci0tCQkJCSAgICAgIHByZWNpc2lvbi0tOwotLQkJCQkgICAgfQotLQkJCQl9Ci0tCQkJICAgICAgfQotLQkJCSAgICAgICpwKysgPSBkcC0+Y29udmVyc2lvbiAtICdBJyArICdQJzsKLS0jICBpZiBXSURFX0NIQVJfVkVSU0lPTgotLQkJCSAgICAgIHsKLS0JCQkJc3RhdGljIGNvbnN0IHdjaGFyX3QgZGVjaW1hbF9mb3JtYXRbXSA9Ci0tCQkJCSAgeyAnJScsICcrJywgJ2QnLCAnXDAnIH07Ci0tCQkJCVNOUFJJTlRGIChwLCA2ICsgMSwgZGVjaW1hbF9mb3JtYXQsIGV4cG9uZW50KTsKLS0JCQkgICAgICB9Ci0tCQkJICAgICAgd2hpbGUgKCpwICE9ICdcMCcpCi0tCQkJCXArKzsKLS0jICBlbHNlCi0tCQkJICAgICAgaWYgKHNpemVvZiAoRENIQVJfVCkgPT0gMSkKLS0JCQkJewotLQkJCQkgIHNwcmludGYgKChjaGFyICopIHAsICIlK2QiLCBleHBvbmVudCk7Ci0tCQkJCSAgd2hpbGUgKCpwICE9ICdcMCcpCi0tCQkJCSAgICBwKys7Ci0tCQkJCX0KLS0JCQkgICAgICBlbHNlCi0tCQkJCXsKLS0JCQkJICBjaGFyIGV4cGJ1Zls2ICsgMV07Ci0tCQkJCSAgY29uc3QgY2hhciAqZXA7Ci0tCQkJCSAgc3ByaW50ZiAoZXhwYnVmLCAiJStkIiwgZXhwb25lbnQpOwotLQkJCQkgIGZvciAoZXAgPSBleHBidWY7ICgqcCA9ICplcCkgIT0gJ1wwJzsgZXArKykKLS0JCQkJICAgIHArKzsKLS0JCQkJfQotLSMgIGVuZGlmCi0tCQkJICB9Ci0tCi0tCQkJRU5EX0xPTkdfRE9VQkxFX1JPVU5ESU5HICgpOwotLQkJICAgICAgfQotLSMgZWxzZQotLQkJICAgIGFib3J0ICgpOwotLSMgZW5kaWYKLS0JCSAgfQotLQkJZWxzZQotLQkJICB7Ci0tIyBpZiBORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCBORUVEX1BSSU5URl9ET1VCTEUKLS0JCSAgICBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2RvdWJsZTsKLS0KLS0JCSAgICBpZiAoaXNuYW4gKGFyZykpCi0tCQkgICAgICB7Ci0tCQkJaWYgKGRwLT5jb252ZXJzaW9uID09ICdBJykKLS0JCQkgIHsKLS0JCQkgICAgKnArKyA9ICdOJzsgKnArKyA9ICdBJzsgKnArKyA9ICdOJzsKLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICB7Ci0tCQkJICAgICpwKysgPSAnbic7ICpwKysgPSAnYSc7ICpwKysgPSAnbic7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tCQkgICAgZWxzZQotLQkJICAgICAgewotLQkJCWludCBzaWduID0gMDsKLS0KLS0JCQlpZiAoc2lnbmJpdCAoYXJnKSkgLyogYXJnIDwgMC4wIG9yIG5lZ2F0aXZlIHplcm8gKi8KLS0JCQkgIHsKLS0JCQkgICAgc2lnbiA9IC0xOwotLQkJCSAgICBhcmcgPSAtYXJnOwotLQkJCSAgfQotLQotLQkJCWlmIChzaWduIDwgMCkKLS0JCQkgICpwKysgPSAnLSc7Ci0tCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTEFHX1NIT1dTSUdOKQotLQkJCSAgKnArKyA9ICcrJzsKLS0JCQllbHNlIGlmIChmbGFncyAmIEZMQUdfU1BBQ0UpCi0tCQkJICAqcCsrID0gJyAnOwotLQotLQkJCWlmIChhcmcgPiAwLjAgJiYgYXJnICsgYXJnID09IGFyZykKLS0JCQkgIHsKLS0JCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID09ICdBJykKLS0JCQkgICAgICB7Ci0tCQkJCSpwKysgPSAnSSc7ICpwKysgPSAnTic7ICpwKysgPSAnRic7Ci0tCQkJICAgICAgfQotLQkJCSAgICBlbHNlCi0tCQkJICAgICAgewotLQkJCQkqcCsrID0gJ2knOyAqcCsrID0gJ24nOyAqcCsrID0gJ2YnOwotLQkJCSAgICAgIH0KLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICB7Ci0tCQkJICAgIGludCBleHBvbmVudDsKLS0JCQkgICAgZG91YmxlIG1hbnRpc3NhOwotLQotLQkJCSAgICBpZiAoYXJnID4gMC4wKQotLQkJCSAgICAgIG1hbnRpc3NhID0gcHJpbnRmX2ZyZXhwIChhcmcsICZleHBvbmVudCk7Ci0tCQkJICAgIGVsc2UKLS0JCQkgICAgICB7Ci0tCQkJCWV4cG9uZW50ID0gMDsKLS0JCQkJbWFudGlzc2EgPSAwLjA7Ci0tCQkJICAgICAgfQotLQotLQkJCSAgICBpZiAoaGFzX3ByZWNpc2lvbgotLQkJCQkmJiBwcmVjaXNpb24gPCAodW5zaWduZWQgaW50KSAoKERCTF9ESUcgKyAxKSAqIDAuODMxKSArIDEpCi0tCQkJICAgICAgewotLQkJCQkvKiBSb3VuZCB0aGUgbWFudGlzc2EuICAqLwotLQkJCQlkb3VibGUgdGFpbCA9IG1hbnRpc3NhOwotLQkJCQlzaXplX3QgcTsKLS0KLS0JCQkJZm9yIChxID0gcHJlY2lzaW9uOyA7IHEtLSkKLS0JCQkJICB7Ci0tCQkJCSAgICBpbnQgZGlnaXQgPSAoaW50KSB0YWlsOwotLQkJCQkgICAgdGFpbCAtPSBkaWdpdDsKLS0JCQkJICAgIGlmIChxID09IDApCi0tCQkJCSAgICAgIHsKLS0JCQkJCWlmIChkaWdpdCAmIDEgPyB0YWlsID49IDAuNSA6IHRhaWwgPiAwLjUpCi0tCQkJCQkgIHRhaWwgPSAxIC0gdGFpbDsKLS0JCQkJCWVsc2UKLS0JCQkJCSAgdGFpbCA9IC0gdGFpbDsKLS0JCQkJCWJyZWFrOwotLQkJCQkgICAgICB9Ci0tCQkJCSAgICB0YWlsICo9IDE2LjA7Ci0tCQkJCSAgfQotLQkJCQlpZiAodGFpbCAhPSAwLjApCi0tCQkJCSAgZm9yIChxID0gcHJlY2lzaW9uOyBxID4gMDsgcS0tKQotLQkJCQkgICAgdGFpbCAqPSAwLjA2MjU7Ci0tCQkJCW1hbnRpc3NhICs9IHRhaWw7Ci0tCQkJICAgICAgfQotLQotLQkJCSAgICAqcCsrID0gJzAnOwotLQkJCSAgICAqcCsrID0gZHAtPmNvbnZlcnNpb24gLSAnQScgKyAnWCc7Ci0tCQkJICAgIHBhZF9wdHIgPSBwOwotLQkJCSAgICB7Ci0tCQkJICAgICAgaW50IGRpZ2l0OwotLQotLQkJCSAgICAgIGRpZ2l0ID0gKGludCkgbWFudGlzc2E7Ci0tCQkJICAgICAgbWFudGlzc2EgLT0gZGlnaXQ7Ci0tCQkJICAgICAgKnArKyA9ICcwJyArIGRpZ2l0OwotLQkJCSAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FMVCkKLS0JCQkJICB8fCBtYW50aXNzYSA+IDAuMCB8fCBwcmVjaXNpb24gPiAwKQotLQkJCQl7Ci0tCQkJCSAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJICAvKiBUaGlzIGxvb3AgdGVybWluYXRlcyBiZWNhdXNlIHdlIGFzc3VtZQotLQkJCQkgICAgIHRoYXQgRkxUX1JBRElYIGlzIGEgcG93ZXIgb2YgMi4gICovCi0tCQkJCSAgd2hpbGUgKG1hbnRpc3NhID4gMC4wKQotLQkJCQkgICAgewotLQkJCQkgICAgICBtYW50aXNzYSAqPSAxNi4wOwotLQkJCQkgICAgICBkaWdpdCA9IChpbnQpIG1hbnRpc3NhOwotLQkJCQkgICAgICBtYW50aXNzYSAtPSBkaWdpdDsKLS0JCQkJICAgICAgKnArKyA9IGRpZ2l0Ci0tCQkJCQkgICAgICsgKGRpZ2l0IDwgMTAKLS0JCQkJCQk/ICcwJwotLQkJCQkJCTogZHAtPmNvbnZlcnNpb24gLSAxMCk7Ci0tCQkJCSAgICAgIGlmIChwcmVjaXNpb24gPiAwKQotLQkJCQkJcHJlY2lzaW9uLS07Ci0tCQkJCSAgICB9Ci0tCQkJCSAgd2hpbGUgKHByZWNpc2lvbiA+IDApCi0tCQkJCSAgICB7Ci0tCQkJCSAgICAgICpwKysgPSAnMCc7Ci0tCQkJCSAgICAgIHByZWNpc2lvbi0tOwotLQkJCQkgICAgfQotLQkJCQl9Ci0tCQkJICAgICAgfQotLQkJCSAgICAgICpwKysgPSBkcC0+Y29udmVyc2lvbiAtICdBJyArICdQJzsKLS0jICBpZiBXSURFX0NIQVJfVkVSU0lPTgotLQkJCSAgICAgIHsKLS0JCQkJc3RhdGljIGNvbnN0IHdjaGFyX3QgZGVjaW1hbF9mb3JtYXRbXSA9Ci0tCQkJCSAgeyAnJScsICcrJywgJ2QnLCAnXDAnIH07Ci0tCQkJCVNOUFJJTlRGIChwLCA2ICsgMSwgZGVjaW1hbF9mb3JtYXQsIGV4cG9uZW50KTsKLS0JCQkgICAgICB9Ci0tCQkJICAgICAgd2hpbGUgKCpwICE9ICdcMCcpCi0tCQkJCXArKzsKLS0jICBlbHNlCi0tCQkJICAgICAgaWYgKHNpemVvZiAoRENIQVJfVCkgPT0gMSkKLS0JCQkJewotLQkJCQkgIHNwcmludGYgKChjaGFyICopIHAsICIlK2QiLCBleHBvbmVudCk7Ci0tCQkJCSAgd2hpbGUgKCpwICE9ICdcMCcpCi0tCQkJCSAgICBwKys7Ci0tCQkJCX0KLS0JCQkgICAgICBlbHNlCi0tCQkJCXsKLS0JCQkJICBjaGFyIGV4cGJ1Zls2ICsgMV07Ci0tCQkJCSAgY29uc3QgY2hhciAqZXA7Ci0tCQkJCSAgc3ByaW50ZiAoZXhwYnVmLCAiJStkIiwgZXhwb25lbnQpOwotLQkJCQkgIGZvciAoZXAgPSBleHBidWY7ICgqcCA9ICplcCkgIT0gJ1wwJzsgZXArKykKLS0JCQkJICAgIHArKzsKLS0JCQkJfQotLSMgIGVuZGlmCi0tCQkJICB9Ci0tCQkgICAgICB9Ci0tIyBlbHNlCi0tCQkgICAgYWJvcnQgKCk7Ci0tIyBlbmRpZgotLQkJICB9Ci0tCQkvKiBUaGUgZ2VuZXJhdGVkIHN0cmluZyBub3cgZXh0ZW5kcyBmcm9tIHRtcCB0byBwLCB3aXRoIHRoZQotLQkJICAgemVybyBwYWRkaW5nIGluc2VydGlvbiBwb2ludCBiZWluZyBhdCBwYWRfcHRyLiAgKi8KLS0JCWlmIChoYXNfd2lkdGggJiYgcCAtIHRtcCA8IHdpZHRoKQotLQkJICB7Ci0tCQkgICAgc2l6ZV90IHBhZCA9IHdpZHRoIC0gKHAgLSB0bXApOwotLQkJICAgIERDSEFSX1QgKmVuZCA9IHAgKyBwYWQ7Ci0tCi0tCQkgICAgaWYgKGZsYWdzICYgRkxBR19MRUZUKQotLQkJICAgICAgewotLQkJCS8qIFBhZCB3aXRoIHNwYWNlcyBvbiB0aGUgcmlnaHQuICAqLwotLQkJCWZvciAoOyBwYWQgPiAwOyBwYWQtLSkKLS0JCQkgICpwKysgPSAnICc7Ci0tCQkgICAgICB9Ci0tCQkgICAgZWxzZSBpZiAoKGZsYWdzICYgRkxBR19aRVJPKSAmJiBwYWRfcHRyICE9IE5VTEwpCi0tCQkgICAgICB7Ci0tCQkJLyogUGFkIHdpdGggemVyb2VzLiAgKi8KLS0JCQlEQ0hBUl9UICpxID0gZW5kOwotLQotLQkJCXdoaWxlIChwID4gcGFkX3B0cikKLS0JCQkgICotLXEgPSAqLS1wOwotLQkJCWZvciAoOyBwYWQgPiAwOyBwYWQtLSkKLS0JCQkgICpwKysgPSAnMCc7Ci0tCQkgICAgICB9Ci0tCQkgICAgZWxzZQotLQkJICAgICAgewotLQkJCS8qIFBhZCB3aXRoIHNwYWNlcyBvbiB0aGUgbGVmdC4gICovCi0tCQkJRENIQVJfVCAqcSA9IGVuZDsKLS0KLS0JCQl3aGlsZSAocCA+IHRtcCkKLS0JCQkgICotLXEgPSAqLS1wOwotLQkJCWZvciAoOyBwYWQgPiAwOyBwYWQtLSkKLS0JCQkgICpwKysgPSAnICc7Ci0tCQkgICAgICB9Ci0tCi0tCQkgICAgcCA9IGVuZDsKLS0JCSAgfQotLQotLQkJewotLQkJICBzaXplX3QgY291bnQgPSBwIC0gdG1wOwotLQotLQkJICBpZiAoY291bnQgPj0gdG1wX2xlbmd0aCkKLS0JCSAgICAvKiB0bXBfbGVuZ3RoIHdhcyBpbmNvcnJlY3RseSBjYWxjdWxhdGVkIC0gZml4IHRoZQotLQkJICAgICAgIGNvZGUgYWJvdmUhICAqLwotLQkJICAgIGFib3J0ICgpOwotLQotLQkJICAvKiBNYWtlIHJvb20gZm9yIHRoZSByZXN1bHQuICAqLwotLQkJICBpZiAoY291bnQgPj0gYWxsb2NhdGVkIC0gbGVuZ3RoKQotLQkJICAgIHsKLS0JCSAgICAgIHNpemVfdCBuID0geHN1bSAobGVuZ3RoLCBjb3VudCk7Ci0tCi0tCQkgICAgICBFTlNVUkVfQUxMT0NBVElPTiAobik7Ci0tCQkgICAgfQotLQotLQkJICAvKiBBcHBlbmQgdGhlIHJlc3VsdC4gICovCi0tCQkgIG1lbWNweSAocmVzdWx0ICsgbGVuZ3RoLCB0bXAsIGNvdW50ICogc2l6ZW9mIChEQ0hBUl9UKSk7Ci0tCQkgIGlmICh0bXAgIT0gdG1wYnVmKQotLQkJICAgIGZyZWUgKHRtcCk7Ci0tCQkgIGxlbmd0aCArPSBjb3VudDsKLS0JCX0KLS0JICAgICAgfQotLSNlbmRpZgotLSNpZiAoTkVFRF9QUklOVEZfSU5GSU5JVEVfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9MT05HX0RPVUJMRSB8fCBORUVEX1BSSU5URl9MT05HX0RPVUJMRSkgJiYgIWRlZmluZWQgSU5fTElCSU5UTAotLQkgICAgZWxzZSBpZiAoKGRwLT5jb252ZXJzaW9uID09ICdmJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRicKLS0JCSAgICAgIHx8IGRwLT5jb252ZXJzaW9uID09ICdlJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRScKLS0JCSAgICAgIHx8IGRwLT5jb252ZXJzaW9uID09ICdnJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRycKLS0JCSAgICAgIHx8IGRwLT5jb252ZXJzaW9uID09ICdhJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnQScpCi0tCQkgICAgICYmICgwCi0tIyBpZiBORUVEX1BSSU5URl9ET1VCTEUKLS0JCQkgfHwgYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZSA9PSBUWVBFX0RPVUJMRQotLSMgZWxpZiBORUVEX1BSSU5URl9JTkZJTklURV9ET1VCTEUKLS0JCQkgfHwgKGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9ET1VCTEUKLS0JCQkgICAgIC8qIFRoZSBzeXN0ZW1zIChtaW5ndykgd2hpY2ggcHJvZHVjZSB3cm9uZyBvdXRwdXQKLS0JCQkJZm9yIEluZiwgLUluZiwgYW5kIE5hTiBhbHNvIGRvIHNvIGZvciAtMC4wLgotLQkJCQlUaGVyZWZvcmUgd2UgdHJlYXQgdGhpcyBjYXNlIGhlcmUgYXMgd2VsbC4gICovCi0tCQkJICAgICAmJiBpc19pbmZpbml0ZV9vcl96ZXJvIChhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfZG91YmxlKSkKLS0jIGVuZGlmCi0tIyBpZiBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotLQkJCSB8fCBhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlID09IFRZUEVfTE9OR0RPVUJMRQotLSMgZWxpZiBORUVEX1BSSU5URl9JTkZJTklURV9MT05HX0RPVUJMRQotLQkJCSB8fCAoYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZSA9PSBUWVBFX0xPTkdET1VCTEUKLS0JCQkgICAgIC8qIFNvbWUgc3lzdGVtcyBwcm9kdWNlIHdyb25nIG91dHB1dCBmb3IgSW5mLAotLQkJCQktSW5mLCBhbmQgTmFOLiAgKi8KLS0JCQkgICAgICYmIGlzX2luZmluaXRlbCAoYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdkb3VibGUpKQotLSMgZW5kaWYKLS0JCQkpKQotLQkgICAgICB7Ci0tIyBpZiAoTkVFRF9QUklOVEZfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0lORklOSVRFX0RPVUJMRSkgJiYgKE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0lORklOSVRFX0xPTkdfRE9VQkxFKQotLQkJYXJnX3R5cGUgdHlwZSA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGU7Ci0tIyBlbmRpZgotLQkJaW50IGZsYWdzID0gZHAtPmZsYWdzOwotLQkJaW50IGhhc193aWR0aDsKLS0JCXNpemVfdCB3aWR0aDsKLS0JCWludCBoYXNfcHJlY2lzaW9uOwotLQkJc2l6ZV90IHByZWNpc2lvbjsKLS0JCXNpemVfdCB0bXBfbGVuZ3RoOwotLQkJRENIQVJfVCB0bXBidWZbNzAwXTsKLS0JCURDSEFSX1QgKnRtcDsKLS0JCURDSEFSX1QgKnBhZF9wdHI7Ci0tCQlEQ0hBUl9UICpwOwotLQotLQkJaGFzX3dpZHRoID0gMDsKLS0JCXdpZHRoID0gMDsKLS0JCWlmIChkcC0+d2lkdGhfc3RhcnQgIT0gZHAtPndpZHRoX2VuZCkKLS0JCSAgewotLQkJICAgIGlmIChkcC0+d2lkdGhfYXJnX2luZGV4ICE9IEFSR19OT05FKQotLQkJICAgICAgewotLQkJCWludCBhcmc7Ci0tCi0tCQkJaWYgKCEoYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCi0tCQkJICBhYm9ydCAoKTsKLS0JCQlhcmcgPSBhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS5hLmFfaW50OwotLQkJCWlmIChhcmcgPCAwKQotLQkJCSAgewotLQkJCSAgICAvKiAiQSBuZWdhdGl2ZSBmaWVsZCB3aWR0aCBpcyB0YWtlbiBhcyBhICctJyBmbGFnCi0tCQkJICAgICAgICBmb2xsb3dlZCBieSBhIHBvc2l0aXZlIGZpZWxkIHdpZHRoLiIgICovCi0tCQkJICAgIGZsYWdzIHw9IEZMQUdfTEVGVDsKLS0JCQkgICAgd2lkdGggPSAodW5zaWduZWQgaW50KSAoLWFyZyk7Ci0tCQkJICB9Ci0tCQkJZWxzZQotLQkJCSAgd2lkdGggPSBhcmc7Ci0tCQkgICAgICB9Ci0tCQkgICAgZWxzZQotLQkJICAgICAgewotLQkJCWNvbnN0IEZDSEFSX1QgKmRpZ2l0cCA9IGRwLT53aWR0aF9zdGFydDsKLS0KLS0JCQlkbwotLQkJCSAgd2lkdGggPSB4c3VtICh4dGltZXMgKHdpZHRoLCAxMCksICpkaWdpdHArKyAtICcwJyk7Ci0tCQkJd2hpbGUgKGRpZ2l0cCAhPSBkcC0+d2lkdGhfZW5kKTsKLS0JCSAgICAgIH0KLS0JCSAgICBoYXNfd2lkdGggPSAxOwotLQkJICB9Ci0tCi0tCQloYXNfcHJlY2lzaW9uID0gMDsKLS0JCXByZWNpc2lvbiA9IDA7Ci0tCQlpZiAoZHAtPnByZWNpc2lvbl9zdGFydCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKLS0JCSAgewotLQkJICAgIGlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKLS0JCSAgICAgIHsKLS0JCQlpbnQgYXJnOwotLQotLQkJCWlmICghKGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKLS0JCQkgIGFib3J0ICgpOwotLQkJCWFyZyA9IGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS5hLmFfaW50OwotLQkJCS8qICJBIG5lZ2F0aXZlIHByZWNpc2lvbiBpcyB0YWtlbiBhcyBpZiB0aGUgcHJlY2lzaW9uCi0tCQkJICAgIHdlcmUgb21pdHRlZC4iICAqLwotLQkJCWlmIChhcmcgPj0gMCkKLS0JCQkgIHsKLS0JCQkgICAgcHJlY2lzaW9uID0gYXJnOwotLQkJCSAgICBoYXNfcHJlY2lzaW9uID0gMTsKLS0JCQkgIH0KLS0JCSAgICAgIH0KLS0JCSAgICBlbHNlCi0tCQkgICAgICB7Ci0tCQkJY29uc3QgRkNIQVJfVCAqZGlnaXRwID0gZHAtPnByZWNpc2lvbl9zdGFydCArIDE7Ci0tCi0tCQkJcHJlY2lzaW9uID0gMDsKLS0JCQl3aGlsZSAoZGlnaXRwICE9IGRwLT5wcmVjaXNpb25fZW5kKQotLQkJCSAgcHJlY2lzaW9uID0geHN1bSAoeHRpbWVzIChwcmVjaXNpb24sIDEwKSwgKmRpZ2l0cCsrIC0gJzAnKTsKLS0JCQloYXNfcHJlY2lzaW9uID0gMTsKLS0JCSAgICAgIH0KLS0JCSAgfQotLQotLQkJLyogUE9TSVggc3BlY2lmaWVzIHRoZSBkZWZhdWx0IHByZWNpc2lvbiB0byBiZSA2IGZvciAlZiwgJUYsCi0tCQkgICAlZSwgJUUsIGJ1dCBub3QgZm9yICVnLCAlRy4gIEltcGxlbWVudGF0aW9ucyBhcHBlYXIgdG8gdXNlCi0tCQkgICB0aGUgc2FtZSBkZWZhdWx0IHByZWNpc2lvbiBhbHNvIGZvciAlZywgJUcuICAqLwotLQkJaWYgKCFoYXNfcHJlY2lzaW9uKQotLQkJICBwcmVjaXNpb24gPSA2OwotLQotLQkJLyogQWxsb2NhdGUgYSB0ZW1wb3JhcnkgYnVmZmVyIG9mIHN1ZmZpY2llbnQgc2l6ZS4gICovCi0tIyBpZiBORUVEX1BSSU5URl9ET1VCTEUgJiYgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUKLS0JCXRtcF9sZW5ndGggPSAodHlwZSA9PSBUWVBFX0xPTkdET1VCTEUgPyBMREJMX0RJRyArIDEgOiBEQkxfRElHICsgMSk7Ci0tIyBlbGlmIE5FRURfUFJJTlRGX0lORklOSVRFX0RPVUJMRSAmJiBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotLQkJdG1wX2xlbmd0aCA9ICh0eXBlID09IFRZUEVfTE9OR0RPVUJMRSA/IExEQkxfRElHICsgMSA6IDApOwotLSMgZWxpZiBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotLQkJdG1wX2xlbmd0aCA9IExEQkxfRElHICsgMTsKLS0jIGVsaWYgTkVFRF9QUklOVEZfRE9VQkxFCi0tCQl0bXBfbGVuZ3RoID0gREJMX0RJRyArIDE7Ci0tIyBlbHNlCi0tCQl0bXBfbGVuZ3RoID0gMDsKLS0jIGVuZGlmCi0tCQlpZiAodG1wX2xlbmd0aCA8IHByZWNpc2lvbikKLS0JCSAgdG1wX2xlbmd0aCA9IHByZWNpc2lvbjsKLS0jIGlmIE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFCi0tIyAgaWYgTkVFRF9QUklOVEZfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0lORklOSVRFX0RPVUJMRQotLQkJaWYgKHR5cGUgPT0gVFlQRV9MT05HRE9VQkxFKQotLSMgIGVuZGlmCi0tCQkgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZicgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0YnKQotLQkJICAgIHsKLS0JCSAgICAgIGxvbmcgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nZG91YmxlOwotLQkJICAgICAgaWYgKCEoaXNuYW5sIChhcmcpIHx8IGFyZyArIGFyZyA9PSBhcmcpKQotLQkJCXsKLS0JCQkgIC8qIGFyZyBpcyBmaW5pdGUgYW5kIG5vbnplcm8uICAqLwotLQkJCSAgaW50IGV4cG9uZW50ID0gZmxvb3Jsb2cxMGwgKGFyZyA8IDAgPyAtYXJnIDogYXJnKTsKLS0JCQkgIGlmIChleHBvbmVudCA+PSAwICYmIHRtcF9sZW5ndGggPCBleHBvbmVudCArIHByZWNpc2lvbikKLS0JCQkgICAgdG1wX2xlbmd0aCA9IGV4cG9uZW50ICsgcHJlY2lzaW9uOwotLQkJCX0KLS0JCSAgICB9Ci0tIyBlbmRpZgotLSMgaWYgTkVFRF9QUklOVEZfRE9VQkxFCi0tIyAgaWYgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfTE9OR19ET1VCTEUKLS0JCWlmICh0eXBlID09IFRZUEVfRE9VQkxFKQotLSMgIGVuZGlmCi0tCQkgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZicgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0YnKQotLQkJICAgIHsKLS0JCSAgICAgIGRvdWJsZSBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfZG91YmxlOwotLQkJICAgICAgaWYgKCEoaXNuYW4gKGFyZykgfHwgYXJnICsgYXJnID09IGFyZykpCi0tCQkJewotLQkJCSAgLyogYXJnIGlzIGZpbml0ZSBhbmQgbm9uemVyby4gICovCi0tCQkJICBpbnQgZXhwb25lbnQgPSBmbG9vcmxvZzEwIChhcmcgPCAwID8gLWFyZyA6IGFyZyk7Ci0tCQkJICBpZiAoZXhwb25lbnQgPj0gMCAmJiB0bXBfbGVuZ3RoIDwgZXhwb25lbnQgKyBwcmVjaXNpb24pCi0tCQkJICAgIHRtcF9sZW5ndGggPSBleHBvbmVudCArIHByZWNpc2lvbjsKLS0JCQl9Ci0tCQkgICAgfQotLSMgZW5kaWYKLS0JCS8qIEFjY291bnQgZm9yIHNpZ24sIGRlY2ltYWwgcG9pbnQgZXRjLiAqLwotLQkJdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIDEyKTsKLS0KLS0JCWlmICh0bXBfbGVuZ3RoIDwgd2lkdGgpCi0tCQkgIHRtcF9sZW5ndGggPSB3aWR0aDsKLS0KLS0JCXRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCAxKTsgLyogYWNjb3VudCBmb3IgdHJhaWxpbmcgTlVMICovCi0tCi0tCQlpZiAodG1wX2xlbmd0aCA8PSBzaXplb2YgKHRtcGJ1ZikgLyBzaXplb2YgKERDSEFSX1QpKQotLQkJICB0bXAgPSB0bXBidWY7Ci0tCQllbHNlCi0tCQkgIHsKLS0JCSAgICBzaXplX3QgdG1wX21lbXNpemUgPSB4dGltZXMgKHRtcF9sZW5ndGgsIHNpemVvZiAoRENIQVJfVCkpOwotLQotLQkJICAgIGlmIChzaXplX292ZXJmbG93X3AgKHRtcF9tZW1zaXplKSkKLS0JCSAgICAgIC8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLwotLQkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OwotLQkJICAgIHRtcCA9IChEQ0hBUl9UICopIG1hbGxvYyAodG1wX21lbXNpemUpOwotLQkJICAgIGlmICh0bXAgPT0gTlVMTCkKLS0JCSAgICAgIC8qIE91dCBvZiBtZW1vcnkuICAqLwotLQkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OwotLQkJICB9Ci0tCi0tCQlwYWRfcHRyID0gTlVMTDsKLS0JCXAgPSB0bXA7Ci0tCi0tIyBpZiBORUVEX1BSSU5URl9MT05HX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9MT05HX0RPVUJMRQotLSMgIGlmIE5FRURfUFJJTlRGX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9ET1VCTEUKLS0JCWlmICh0eXBlID09IFRZUEVfTE9OR0RPVUJMRSkKLS0jICBlbmRpZgotLQkJICB7Ci0tCQkgICAgbG9uZyBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdkb3VibGU7Ci0tCi0tCQkgICAgaWYgKGlzbmFubCAoYXJnKSkKLS0JCSAgICAgIHsKLS0JCQlpZiAoZHAtPmNvbnZlcnNpb24gPj0gJ0EnICYmIGRwLT5jb252ZXJzaW9uIDw9ICdaJykKLS0JCQkgIHsKLS0JCQkgICAgKnArKyA9ICdOJzsgKnArKyA9ICdBJzsgKnArKyA9ICdOJzsKLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICB7Ci0tCQkJICAgICpwKysgPSAnbic7ICpwKysgPSAnYSc7ICpwKysgPSAnbic7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tCQkgICAgZWxzZQotLQkJICAgICAgewotLQkJCWludCBzaWduID0gMDsKLS0JCQlERUNMX0xPTkdfRE9VQkxFX1JPVU5ESU5HCi0tCi0tCQkJQkVHSU5fTE9OR19ET1VCTEVfUk9VTkRJTkcgKCk7Ci0tCi0tCQkJaWYgKHNpZ25iaXQgKGFyZykpIC8qIGFyZyA8IDAuMEwgb3IgbmVnYXRpdmUgemVybyAqLwotLQkJCSAgewotLQkJCSAgICBzaWduID0gLTE7Ci0tCQkJICAgIGFyZyA9IC1hcmc7Ci0tCQkJICB9Ci0tCi0tCQkJaWYgKHNpZ24gPCAwKQotLQkJCSAgKnArKyA9ICctJzsKLS0JCQllbHNlIGlmIChmbGFncyAmIEZMQUdfU0hPV1NJR04pCi0tCQkJICAqcCsrID0gJysnOwotLQkJCWVsc2UgaWYgKGZsYWdzICYgRkxBR19TUEFDRSkKLS0JCQkgICpwKysgPSAnICc7Ci0tCi0tCQkJaWYgKGFyZyA+IDAuMEwgJiYgYXJnICsgYXJnID09IGFyZykKLS0JCQkgIHsKLS0JCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID49ICdBJyAmJiBkcC0+Y29udmVyc2lvbiA8PSAnWicpCi0tCQkJICAgICAgewotLQkJCQkqcCsrID0gJ0knOyAqcCsrID0gJ04nOyAqcCsrID0gJ0YnOwotLQkJCSAgICAgIH0KLS0JCQkgICAgZWxzZQotLQkJCSAgICAgIHsKLS0JCQkJKnArKyA9ICdpJzsgKnArKyA9ICduJzsgKnArKyA9ICdmJzsKLS0JCQkgICAgICB9Ci0tCQkJICB9Ci0tCQkJZWxzZQotLQkJCSAgewotLSMgIGlmIE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFCi0tCQkJICAgIHBhZF9wdHIgPSBwOwotLQotLQkJCSAgICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ2YnIHx8IGRwLT5jb252ZXJzaW9uID09ICdGJykKLS0JCQkgICAgICB7Ci0tCQkJCWNoYXIgKmRpZ2l0czsKLS0JCQkJc2l6ZV90IG5kaWdpdHM7Ci0tCi0tCQkJCWRpZ2l0cyA9Ci0tCQkJCSAgc2NhbGUxMF9yb3VuZF9kZWNpbWFsX2xvbmdfZG91YmxlIChhcmcsIHByZWNpc2lvbik7Ci0tCQkJCWlmIChkaWdpdHMgPT0gTlVMTCkKLS0JCQkJICB7Ci0tCQkJCSAgICBFTkRfTE9OR19ET1VCTEVfUk9VTkRJTkcgKCk7Ci0tCQkJCSAgICBnb3RvIG91dF9vZl9tZW1vcnk7Ci0tCQkJCSAgfQotLQkJCQluZGlnaXRzID0gc3RybGVuIChkaWdpdHMpOwotLQotLQkJCQlpZiAobmRpZ2l0cyA+IHByZWNpc2lvbikKLS0JCQkJICBkbwotLQkJCQkgICAgewotLQkJCQkgICAgICAtLW5kaWdpdHM7Ci0tCQkJCSAgICAgICpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0tCQkJCSAgICB9Ci0tCQkJCSAgd2hpbGUgKG5kaWdpdHMgPiBwcmVjaXNpb24pOwotLQkJCQllbHNlCi0tCQkJCSAgKnArKyA9ICcwJzsKLS0JCQkJLyogSGVyZSBuZGlnaXRzIDw9IHByZWNpc2lvbi4gICovCi0tCQkJCWlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgfHwgcHJlY2lzaW9uID4gMCkKLS0JCQkJICB7Ci0tCQkJCSAgICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkgICAgZm9yICg7IHByZWNpc2lvbiA+IG5kaWdpdHM7IHByZWNpc2lvbi0tKQotLQkJCQkgICAgICAqcCsrID0gJzAnOwotLQkJCQkgICAgd2hpbGUgKG5kaWdpdHMgPiAwKQotLQkJCQkgICAgICB7Ci0tCQkJCQktLW5kaWdpdHM7Ci0tCQkJCQkqcCsrID0gZGlnaXRzW25kaWdpdHNdOwotLQkJCQkgICAgICB9Ci0tCQkJCSAgfQotLQotLQkJCQlmcmVlIChkaWdpdHMpOwotLQkJCSAgICAgIH0KLS0JCQkgICAgZWxzZSBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ2UnIHx8IGRwLT5jb252ZXJzaW9uID09ICdFJykKLS0JCQkgICAgICB7Ci0tCQkJCWludCBleHBvbmVudDsKLS0KLS0JCQkJaWYgKGFyZyA9PSAwLjBMKQotLQkJCQkgIHsKLS0JCQkJICAgIGV4cG9uZW50ID0gMDsKLS0JCQkJICAgICpwKysgPSAnMCc7Ci0tCQkJCSAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IHByZWNpc2lvbiA+IDApCi0tCQkJCSAgICAgIHsKLS0JCQkJCSpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCQlmb3IgKDsgcHJlY2lzaW9uID4gMDsgcHJlY2lzaW9uLS0pCi0tCQkJCQkgICpwKysgPSAnMCc7Ci0tCQkJCSAgICAgIH0KLS0JCQkJICB9Ci0tCQkJCWVsc2UKLS0JCQkJICB7Ci0tCQkJCSAgICAvKiBhcmcgPiAwLjBMLiAgKi8KLS0JCQkJICAgIGludCBhZGp1c3RlZDsKLS0JCQkJICAgIGNoYXIgKmRpZ2l0czsKLS0JCQkJICAgIHNpemVfdCBuZGlnaXRzOwotLQotLQkJCQkgICAgZXhwb25lbnQgPSBmbG9vcmxvZzEwbCAoYXJnKTsKLS0JCQkJICAgIGFkanVzdGVkID0gMDsKLS0JCQkJICAgIGZvciAoOzspCi0tCQkJCSAgICAgIHsKLS0JCQkJCWRpZ2l0cyA9Ci0tCQkJCQkgIHNjYWxlMTBfcm91bmRfZGVjaW1hbF9sb25nX2RvdWJsZSAoYXJnLAotLQkJCQkJCQkJCSAgICAgKGludClwcmVjaXNpb24gLSBleHBvbmVudCk7Ci0tCQkJCQlpZiAoZGlnaXRzID09IE5VTEwpCi0tCQkJCQkgIHsKLS0JCQkJCSAgICBFTkRfTE9OR19ET1VCTEVfUk9VTkRJTkcgKCk7Ci0tCQkJCQkgICAgZ290byBvdXRfb2ZfbWVtb3J5OwotLQkJCQkJICB9Ci0tCQkJCQluZGlnaXRzID0gc3RybGVuIChkaWdpdHMpOwotLQotLQkJCQkJaWYgKG5kaWdpdHMgPT0gcHJlY2lzaW9uICsgMSkKLS0JCQkJCSAgYnJlYWs7Ci0tCQkJCQlpZiAobmRpZ2l0cyA8IHByZWNpc2lvbgotLQkJCQkJICAgIHx8IG5kaWdpdHMgPiBwcmVjaXNpb24gKyAyKQotLQkJCQkJICAvKiBUaGUgZXhwb25lbnQgd2FzIG5vdCBndWVzc2VkCi0tCQkJCQkgICAgIHByZWNpc2VseSBlbm91Z2guICAqLwotLQkJCQkJICBhYm9ydCAoKTsKLS0JCQkJCWlmIChhZGp1c3RlZCkKLS0JCQkJCSAgLyogTm9uZSBvZiB0d28gdmFsdWVzIG9mIGV4cG9uZW50IGlzCi0tCQkJCQkgICAgIHRoZSByaWdodCBvbmUuICBQcmV2ZW50IGFuIGVuZGxlc3MKLS0JCQkJCSAgICAgbG9vcC4gICovCi0tCQkJCQkgIGFib3J0ICgpOwotLQkJCQkJZnJlZSAoZGlnaXRzKTsKLS0JCQkJCWlmIChuZGlnaXRzID09IHByZWNpc2lvbikKLS0JCQkJCSAgZXhwb25lbnQgLT0gMTsKLS0JCQkJCWVsc2UKLS0JCQkJCSAgZXhwb25lbnQgKz0gMTsKLS0JCQkJCWFkanVzdGVkID0gMTsKLS0JCQkJICAgICAgfQotLQotLQkJCQkgICAgLyogSGVyZSBuZGlnaXRzID0gcHJlY2lzaW9uKzEuICAqLwotLQkJCQkgICAgKnArKyA9IGRpZ2l0c1stLW5kaWdpdHNdOwotLQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBwcmVjaXNpb24gPiAwKQotLQkJCQkgICAgICB7Ci0tCQkJCQkqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkJd2hpbGUgKG5kaWdpdHMgPiAwKQotLQkJCQkJICB7Ci0tCQkJCQkgICAgLS1uZGlnaXRzOwotLQkJCQkJICAgICpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0tCQkJCQkgIH0KLS0JCQkJICAgICAgfQotLQotLQkJCQkgICAgZnJlZSAoZGlnaXRzKTsKLS0JCQkJICB9Ci0tCi0tCQkJCSpwKysgPSBkcC0+Y29udmVyc2lvbjsgLyogJ2UnIG9yICdFJyAqLwotLSMgICBpZiBXSURFX0NIQVJfVkVSU0lPTgotLQkJCQl7Ci0tCQkJCSAgc3RhdGljIGNvbnN0IHdjaGFyX3QgZGVjaW1hbF9mb3JtYXRbXSA9Ci0tCQkJCSAgICB7ICclJywgJysnLCAnLicsICcyJywgJ2QnLCAnXDAnIH07Ci0tCQkJCSAgU05QUklOVEYgKHAsIDYgKyAxLCBkZWNpbWFsX2Zvcm1hdCwgZXhwb25lbnQpOwotLQkJCQl9Ci0tCQkJCXdoaWxlICgqcCAhPSAnXDAnKQotLQkJCQkgIHArKzsKLS0jICAgZWxzZQotLQkJCQlpZiAoc2l6ZW9mIChEQ0hBUl9UKSA9PSAxKQotLQkJCQkgIHsKLS0JCQkJICAgIHNwcmludGYgKChjaGFyICopIHAsICIlKy4yZCIsIGV4cG9uZW50KTsKLS0JCQkJICAgIHdoaWxlICgqcCAhPSAnXDAnKQotLQkJCQkgICAgICBwKys7Ci0tCQkJCSAgfQotLQkJCQllbHNlCi0tCQkJCSAgewotLQkJCQkgICAgY2hhciBleHBidWZbNiArIDFdOwotLQkJCQkgICAgY29uc3QgY2hhciAqZXA7Ci0tCQkJCSAgICBzcHJpbnRmIChleHBidWYsICIlKy4yZCIsIGV4cG9uZW50KTsKLS0JCQkJICAgIGZvciAoZXAgPSBleHBidWY7ICgqcCA9ICplcCkgIT0gJ1wwJzsgZXArKykKLS0JCQkJICAgICAgcCsrOwotLQkJCQkgIH0KLS0jICAgZW5kaWYKLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UgaWYgKGRwLT5jb252ZXJzaW9uID09ICdnJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRycpCi0tCQkJICAgICAgewotLQkJCQlpZiAocHJlY2lzaW9uID09IDApCi0tCQkJCSAgcHJlY2lzaW9uID0gMTsKLS0JCQkJLyogcHJlY2lzaW9uID49IDEuICAqLwotLQotLQkJCQlpZiAoYXJnID09IDAuMEwpCi0tCQkJCSAgLyogVGhlIGV4cG9uZW50IGlzIDAsID49IC00LCA8IHByZWNpc2lvbi4KLS0JCQkJICAgICBVc2UgZml4ZWQtcG9pbnQgbm90YXRpb24uICAqLwotLQkJCQkgIHsKLS0JCQkJICAgIHNpemVfdCBuZGlnaXRzID0gcHJlY2lzaW9uOwotLQkJCQkgICAgLyogTnVtYmVyIG9mIHRyYWlsaW5nIHplcm9lcyB0aGF0IGhhdmUgdG8gYmUKLS0JCQkJICAgICAgIGRyb3BwZWQuICAqLwotLQkJCQkgICAgc2l6ZV90IG56ZXJvZXMgPQotLQkJCQkgICAgICAoZmxhZ3MgJiBGTEFHX0FMVCA/IDAgOiBwcmVjaXNpb24gLSAxKTsKLS0KLS0JCQkJICAgIC0tbmRpZ2l0czsKLS0JCQkJICAgICpwKysgPSAnMCc7Ci0tCQkJCSAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IG5kaWdpdHMgPiBuemVyb2VzKQotLQkJCQkgICAgICB7Ci0tCQkJCQkqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkJd2hpbGUgKG5kaWdpdHMgPiBuemVyb2VzKQotLQkJCQkJICB7Ci0tCQkJCQkgICAgLS1uZGlnaXRzOwotLQkJCQkJICAgICpwKysgPSAnMCc7Ci0tCQkJCQkgIH0KLS0JCQkJICAgICAgfQotLQkJCQkgIH0KLS0JCQkJZWxzZQotLQkJCQkgIHsKLS0JCQkJICAgIC8qIGFyZyA+IDAuMEwuICAqLwotLQkJCQkgICAgaW50IGV4cG9uZW50OwotLQkJCQkgICAgaW50IGFkanVzdGVkOwotLQkJCQkgICAgY2hhciAqZGlnaXRzOwotLQkJCQkgICAgc2l6ZV90IG5kaWdpdHM7Ci0tCQkJCSAgICBzaXplX3Qgbnplcm9lczsKLS0KLS0JCQkJICAgIGV4cG9uZW50ID0gZmxvb3Jsb2cxMGwgKGFyZyk7Ci0tCQkJCSAgICBhZGp1c3RlZCA9IDA7Ci0tCQkJCSAgICBmb3IgKDs7KQotLQkJCQkgICAgICB7Ci0tCQkJCQlkaWdpdHMgPQotLQkJCQkJICBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfbG9uZ19kb3VibGUgKGFyZywKLS0JCQkJCQkJCQkgICAgIChpbnQpKHByZWNpc2lvbiAtIDEpIC0gZXhwb25lbnQpOwotLQkJCQkJaWYgKGRpZ2l0cyA9PSBOVUxMKQotLQkJCQkJICB7Ci0tCQkJCQkgICAgRU5EX0xPTkdfRE9VQkxFX1JPVU5ESU5HICgpOwotLQkJCQkJICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLS0JCQkJCSAgfQotLQkJCQkJbmRpZ2l0cyA9IHN0cmxlbiAoZGlnaXRzKTsKLS0KLS0JCQkJCWlmIChuZGlnaXRzID09IHByZWNpc2lvbikKLS0JCQkJCSAgYnJlYWs7Ci0tCQkJCQlpZiAobmRpZ2l0cyA8IHByZWNpc2lvbiAtIDEKLS0JCQkJCSAgICB8fCBuZGlnaXRzID4gcHJlY2lzaW9uICsgMSkKLS0JCQkJCSAgLyogVGhlIGV4cG9uZW50IHdhcyBub3QgZ3Vlc3NlZAotLQkJCQkJICAgICBwcmVjaXNlbHkgZW5vdWdoLiAgKi8KLS0JCQkJCSAgYWJvcnQgKCk7Ci0tCQkJCQlpZiAoYWRqdXN0ZWQpCi0tCQkJCQkgIC8qIE5vbmUgb2YgdHdvIHZhbHVlcyBvZiBleHBvbmVudCBpcwotLQkJCQkJICAgICB0aGUgcmlnaHQgb25lLiAgUHJldmVudCBhbiBlbmRsZXNzCi0tCQkJCQkgICAgIGxvb3AuICAqLwotLQkJCQkJICBhYm9ydCAoKTsKLS0JCQkJCWZyZWUgKGRpZ2l0cyk7Ci0tCQkJCQlpZiAobmRpZ2l0cyA8IHByZWNpc2lvbikKLS0JCQkJCSAgZXhwb25lbnQgLT0gMTsKLS0JCQkJCWVsc2UKLS0JCQkJCSAgZXhwb25lbnQgKz0gMTsKLS0JCQkJCWFkanVzdGVkID0gMTsKLS0JCQkJICAgICAgfQotLQkJCQkgICAgLyogSGVyZSBuZGlnaXRzID0gcHJlY2lzaW9uLiAgKi8KLS0KLS0JCQkJICAgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm9lcwotLQkJCQkgICAgICAgdGhhdCBoYXZlIHRvIGJlIGRyb3BwZWQuICAqLwotLQkJCQkgICAgbnplcm9lcyA9IDA7Ci0tCQkJCSAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpID09IDApCi0tCQkJCSAgICAgIHdoaWxlIChuemVyb2VzIDwgbmRpZ2l0cwotLQkJCQkJICAgICAmJiBkaWdpdHNbbnplcm9lc10gPT0gJzAnKQotLQkJCQkJbnplcm9lcysrOwotLQotLQkJCQkgICAgLyogVGhlIGV4cG9uZW50IGlzIG5vdyBkZXRlcm1pbmVkLiAgKi8KLS0JCQkJICAgIGlmIChleHBvbmVudCA+PSAtNAotLQkJCQkJJiYgZXhwb25lbnQgPCAobG9uZylwcmVjaXNpb24pCi0tCQkJCSAgICAgIHsKLS0JCQkJCS8qIEZpeGVkLXBvaW50IG5vdGF0aW9uOgotLQkJCQkJICAgbWF4KGV4cG9uZW50LDApKzEgZGlnaXRzLCB0aGVuIHRoZQotLQkJCQkJICAgZGVjaW1hbCBwb2ludCwgdGhlbiB0aGUgcmVtYWluaW5nCi0tCQkJCQkgICBkaWdpdHMgd2l0aG91dCB0cmFpbGluZyB6ZXJvZXMuICAqLwotLQkJCQkJaWYgKGV4cG9uZW50ID49IDApCi0tCQkJCQkgIHsKLS0JCQkJCSAgICBzaXplX3QgY291bnQgPSBleHBvbmVudCArIDE7Ci0tCQkJCQkgICAgLyogTm90ZTogY291bnQgPD0gcHJlY2lzaW9uID0gbmRpZ2l0cy4gICovCi0tCQkJCQkgICAgZm9yICg7IGNvdW50ID4gMDsgY291bnQtLSkKLS0JCQkJCSAgICAgICpwKysgPSBkaWdpdHNbLS1uZGlnaXRzXTsKLS0JCQkJCSAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IG5kaWdpdHMgPiBuemVyb2VzKQotLQkJCQkJICAgICAgewotLQkJCQkJCSpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCQkJd2hpbGUgKG5kaWdpdHMgPiBuemVyb2VzKQotLQkJCQkJCSAgewotLQkJCQkJCSAgICAtLW5kaWdpdHM7Ci0tCQkJCQkJICAgICpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0tCQkJCQkJICB9Ci0tCQkJCQkgICAgICB9Ci0tCQkJCQkgIH0KLS0JCQkJCWVsc2UKLS0JCQkJCSAgewotLQkJCQkJICAgIHNpemVfdCBjb3VudCA9IC1leHBvbmVudCAtIDE7Ci0tCQkJCQkgICAgKnArKyA9ICcwJzsKLS0JCQkJCSAgICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkJICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50LS0pCi0tCQkJCQkgICAgICAqcCsrID0gJzAnOwotLQkJCQkJICAgIHdoaWxlIChuZGlnaXRzID4gbnplcm9lcykKLS0JCQkJCSAgICAgIHsKLS0JCQkJCQktLW5kaWdpdHM7Ci0tCQkJCQkJKnArKyA9IGRpZ2l0c1tuZGlnaXRzXTsKLS0JCQkJCSAgICAgIH0KLS0JCQkJCSAgfQotLQkJCQkgICAgICB9Ci0tCQkJCSAgICBlbHNlCi0tCQkJCSAgICAgIHsKLS0JCQkJCS8qIEV4cG9uZW50aWFsIG5vdGF0aW9uLiAgKi8KLS0JCQkJCSpwKysgPSBkaWdpdHNbLS1uZGlnaXRzXTsKLS0JCQkJCWlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgfHwgbmRpZ2l0cyA+IG56ZXJvZXMpCi0tCQkJCQkgIHsKLS0JCQkJCSAgICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkJICAgIHdoaWxlIChuZGlnaXRzID4gbnplcm9lcykKLS0JCQkJCSAgICAgIHsKLS0JCQkJCQktLW5kaWdpdHM7Ci0tCQkJCQkJKnArKyA9IGRpZ2l0c1tuZGlnaXRzXTsKLS0JCQkJCSAgICAgIH0KLS0JCQkJCSAgfQotLQkJCQkJKnArKyA9IGRwLT5jb252ZXJzaW9uIC0gJ0cnICsgJ0UnOyAvKiAnZScgb3IgJ0UnICovCi0tIyAgIGlmIFdJREVfQ0hBUl9WRVJTSU9OCi0tCQkJCQl7Ci0tCQkJCQkgIHN0YXRpYyBjb25zdCB3Y2hhcl90IGRlY2ltYWxfZm9ybWF0W10gPQotLQkJCQkJICAgIHsgJyUnLCAnKycsICcuJywgJzInLCAnZCcsICdcMCcgfTsKLS0JCQkJCSAgU05QUklOVEYgKHAsIDYgKyAxLCBkZWNpbWFsX2Zvcm1hdCwgZXhwb25lbnQpOwotLQkJCQkJfQotLQkJCQkJd2hpbGUgKCpwICE9ICdcMCcpCi0tCQkJCQkgIHArKzsKLS0jICAgZWxzZQotLQkJCQkJaWYgKHNpemVvZiAoRENIQVJfVCkgPT0gMSkKLS0JCQkJCSAgewotLQkJCQkJICAgIHNwcmludGYgKChjaGFyICopIHAsICIlKy4yZCIsIGV4cG9uZW50KTsKLS0JCQkJCSAgICB3aGlsZSAoKnAgIT0gJ1wwJykKLS0JCQkJCSAgICAgIHArKzsKLS0JCQkJCSAgfQotLQkJCQkJZWxzZQotLQkJCQkJICB7Ci0tCQkJCQkgICAgY2hhciBleHBidWZbNiArIDFdOwotLQkJCQkJICAgIGNvbnN0IGNoYXIgKmVwOwotLQkJCQkJICAgIHNwcmludGYgKGV4cGJ1ZiwgIiUrLjJkIiwgZXhwb25lbnQpOwotLQkJCQkJICAgIGZvciAoZXAgPSBleHBidWY7ICgqcCA9ICplcCkgIT0gJ1wwJzsgZXArKykKLS0JCQkJCSAgICAgIHArKzsKLS0JCQkJCSAgfQotLSMgICBlbmRpZgotLQkJCQkgICAgICB9Ci0tCi0tCQkJCSAgICBmcmVlIChkaWdpdHMpOwotLQkJCQkgIH0KLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UKLS0JCQkgICAgICBhYm9ydCAoKTsKLS0jICBlbHNlCi0tCQkJICAgIC8qIGFyZyBpcyBmaW5pdGUuICAqLwotLQkJCSAgICBhYm9ydCAoKTsKLS0jICBlbmRpZgotLQkJCSAgfQotLQotLQkJCUVORF9MT05HX0RPVUJMRV9ST1VORElORyAoKTsKLS0JCSAgICAgIH0KLS0JCSAgfQotLSMgIGlmIE5FRURfUFJJTlRGX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9ET1VCTEUKLS0JCWVsc2UKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0jIGlmIE5FRURfUFJJTlRGX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9ET1VCTEUKLS0JCSAgewotLQkJICAgIGRvdWJsZSBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfZG91YmxlOwotLQotLQkJICAgIGlmIChpc25hbiAoYXJnKSkKLS0JCSAgICAgIHsKLS0JCQlpZiAoZHAtPmNvbnZlcnNpb24gPj0gJ0EnICYmIGRwLT5jb252ZXJzaW9uIDw9ICdaJykKLS0JCQkgIHsKLS0JCQkgICAgKnArKyA9ICdOJzsgKnArKyA9ICdBJzsgKnArKyA9ICdOJzsKLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICB7Ci0tCQkJICAgICpwKysgPSAnbic7ICpwKysgPSAnYSc7ICpwKysgPSAnbic7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tCQkgICAgZWxzZQotLQkJICAgICAgewotLQkJCWludCBzaWduID0gMDsKLS0KLS0JCQlpZiAoc2lnbmJpdCAoYXJnKSkgLyogYXJnIDwgMC4wIG9yIG5lZ2F0aXZlIHplcm8gKi8KLS0JCQkgIHsKLS0JCQkgICAgc2lnbiA9IC0xOwotLQkJCSAgICBhcmcgPSAtYXJnOwotLQkJCSAgfQotLQotLQkJCWlmIChzaWduIDwgMCkKLS0JCQkgICpwKysgPSAnLSc7Ci0tCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTEFHX1NIT1dTSUdOKQotLQkJCSAgKnArKyA9ICcrJzsKLS0JCQllbHNlIGlmIChmbGFncyAmIEZMQUdfU1BBQ0UpCi0tCQkJICAqcCsrID0gJyAnOwotLQotLQkJCWlmIChhcmcgPiAwLjAgJiYgYXJnICsgYXJnID09IGFyZykKLS0JCQkgIHsKLS0JCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID49ICdBJyAmJiBkcC0+Y29udmVyc2lvbiA8PSAnWicpCi0tCQkJICAgICAgewotLQkJCQkqcCsrID0gJ0knOyAqcCsrID0gJ04nOyAqcCsrID0gJ0YnOwotLQkJCSAgICAgIH0KLS0JCQkgICAgZWxzZQotLQkJCSAgICAgIHsKLS0JCQkJKnArKyA9ICdpJzsgKnArKyA9ICduJzsgKnArKyA9ICdmJzsKLS0JCQkgICAgICB9Ci0tCQkJICB9Ci0tCQkJZWxzZQotLQkJCSAgewotLSMgIGlmIE5FRURfUFJJTlRGX0RPVUJMRQotLQkJCSAgICBwYWRfcHRyID0gcDsKLS0KLS0JCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID09ICdmJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRicpCi0tCQkJICAgICAgewotLQkJCQljaGFyICpkaWdpdHM7Ci0tCQkJCXNpemVfdCBuZGlnaXRzOwotLQotLQkJCQlkaWdpdHMgPQotLQkJCQkgIHNjYWxlMTBfcm91bmRfZGVjaW1hbF9kb3VibGUgKGFyZywgcHJlY2lzaW9uKTsKLS0JCQkJaWYgKGRpZ2l0cyA9PSBOVUxMKQotLQkJCQkgIGdvdG8gb3V0X29mX21lbW9yeTsKLS0JCQkJbmRpZ2l0cyA9IHN0cmxlbiAoZGlnaXRzKTsKLS0KLS0JCQkJaWYgKG5kaWdpdHMgPiBwcmVjaXNpb24pCi0tCQkJCSAgZG8KLS0JCQkJICAgIHsKLS0JCQkJICAgICAgLS1uZGlnaXRzOwotLQkJCQkgICAgICAqcCsrID0gZGlnaXRzW25kaWdpdHNdOwotLQkJCQkgICAgfQotLQkJCQkgIHdoaWxlIChuZGlnaXRzID4gcHJlY2lzaW9uKTsKLS0JCQkJZWxzZQotLQkJCQkgICpwKysgPSAnMCc7Ci0tCQkJCS8qIEhlcmUgbmRpZ2l0cyA8PSBwcmVjaXNpb24uICAqLwotLQkJCQlpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IHByZWNpc2lvbiA+IDApCi0tCQkJCSAgewotLQkJCQkgICAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJICAgIGZvciAoOyBwcmVjaXNpb24gPiBuZGlnaXRzOyBwcmVjaXNpb24tLSkKLS0JCQkJICAgICAgKnArKyA9ICcwJzsKLS0JCQkJICAgIHdoaWxlIChuZGlnaXRzID4gMCkKLS0JCQkJICAgICAgewotLQkJCQkJLS1uZGlnaXRzOwotLQkJCQkJKnArKyA9IGRpZ2l0c1tuZGlnaXRzXTsKLS0JCQkJICAgICAgfQotLQkJCQkgIH0KLS0KLS0JCQkJZnJlZSAoZGlnaXRzKTsKLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UgaWYgKGRwLT5jb252ZXJzaW9uID09ICdlJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRScpCi0tCQkJICAgICAgewotLQkJCQlpbnQgZXhwb25lbnQ7Ci0tCi0tCQkJCWlmIChhcmcgPT0gMC4wKQotLQkJCQkgIHsKLS0JCQkJICAgIGV4cG9uZW50ID0gMDsKLS0JCQkJICAgICpwKysgPSAnMCc7Ci0tCQkJCSAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IHByZWNpc2lvbiA+IDApCi0tCQkJCSAgICAgIHsKLS0JCQkJCSpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCQlmb3IgKDsgcHJlY2lzaW9uID4gMDsgcHJlY2lzaW9uLS0pCi0tCQkJCQkgICpwKysgPSAnMCc7Ci0tCQkJCSAgICAgIH0KLS0JCQkJICB9Ci0tCQkJCWVsc2UKLS0JCQkJICB7Ci0tCQkJCSAgICAvKiBhcmcgPiAwLjAuICAqLwotLQkJCQkgICAgaW50IGFkanVzdGVkOwotLQkJCQkgICAgY2hhciAqZGlnaXRzOwotLQkJCQkgICAgc2l6ZV90IG5kaWdpdHM7Ci0tCi0tCQkJCSAgICBleHBvbmVudCA9IGZsb29ybG9nMTAgKGFyZyk7Ci0tCQkJCSAgICBhZGp1c3RlZCA9IDA7Ci0tCQkJCSAgICBmb3IgKDs7KQotLQkJCQkgICAgICB7Ci0tCQkJCQlkaWdpdHMgPQotLQkJCQkJICBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfZG91YmxlIChhcmcsCi0tCQkJCQkJCQkJKGludClwcmVjaXNpb24gLSBleHBvbmVudCk7Ci0tCQkJCQlpZiAoZGlnaXRzID09IE5VTEwpCi0tCQkJCQkgIGdvdG8gb3V0X29mX21lbW9yeTsKLS0JCQkJCW5kaWdpdHMgPSBzdHJsZW4gKGRpZ2l0cyk7Ci0tCi0tCQkJCQlpZiAobmRpZ2l0cyA9PSBwcmVjaXNpb24gKyAxKQotLQkJCQkJICBicmVhazsKLS0JCQkJCWlmIChuZGlnaXRzIDwgcHJlY2lzaW9uCi0tCQkJCQkgICAgfHwgbmRpZ2l0cyA+IHByZWNpc2lvbiArIDIpCi0tCQkJCQkgIC8qIFRoZSBleHBvbmVudCB3YXMgbm90IGd1ZXNzZWQKLS0JCQkJCSAgICAgcHJlY2lzZWx5IGVub3VnaC4gICovCi0tCQkJCQkgIGFib3J0ICgpOwotLQkJCQkJaWYgKGFkanVzdGVkKQotLQkJCQkJICAvKiBOb25lIG9mIHR3byB2YWx1ZXMgb2YgZXhwb25lbnQgaXMKLS0JCQkJCSAgICAgdGhlIHJpZ2h0IG9uZS4gIFByZXZlbnQgYW4gZW5kbGVzcwotLQkJCQkJICAgICBsb29wLiAgKi8KLS0JCQkJCSAgYWJvcnQgKCk7Ci0tCQkJCQlmcmVlIChkaWdpdHMpOwotLQkJCQkJaWYgKG5kaWdpdHMgPT0gcHJlY2lzaW9uKQotLQkJCQkJICBleHBvbmVudCAtPSAxOwotLQkJCQkJZWxzZQotLQkJCQkJICBleHBvbmVudCArPSAxOwotLQkJCQkJYWRqdXN0ZWQgPSAxOwotLQkJCQkgICAgICB9Ci0tCi0tCQkJCSAgICAvKiBIZXJlIG5kaWdpdHMgPSBwcmVjaXNpb24rMS4gICovCi0tCQkJCSAgICAqcCsrID0gZGlnaXRzWy0tbmRpZ2l0c107Ci0tCQkJCSAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IHByZWNpc2lvbiA+IDApCi0tCQkJCSAgICAgIHsKLS0JCQkJCSpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCQl3aGlsZSAobmRpZ2l0cyA+IDApCi0tCQkJCQkgIHsKLS0JCQkJCSAgICAtLW5kaWdpdHM7Ci0tCQkJCQkgICAgKnArKyA9IGRpZ2l0c1tuZGlnaXRzXTsKLS0JCQkJCSAgfQotLQkJCQkgICAgICB9Ci0tCi0tCQkJCSAgICBmcmVlIChkaWdpdHMpOwotLQkJCQkgIH0KLS0KLS0JCQkJKnArKyA9IGRwLT5jb252ZXJzaW9uOyAvKiAnZScgb3IgJ0UnICovCi0tIyAgIGlmIFdJREVfQ0hBUl9WRVJTSU9OCi0tCQkJCXsKLS0JCQkJICBzdGF0aWMgY29uc3Qgd2NoYXJfdCBkZWNpbWFsX2Zvcm1hdFtdID0KLS0JCQkJICAgIC8qIFByb2R1Y2UgdGhlIHNhbWUgbnVtYmVyIG9mIGV4cG9uZW50IGRpZ2l0cwotLQkJCQkgICAgICAgYXMgdGhlIG5hdGl2ZSBwcmludGYgaW1wbGVtZW50YXRpb24uICAqLwotLSMgICAgaWYgKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKSAmJiAhIGRlZmluZWQgX19DWUdXSU5fXwotLQkJCQkgICAgeyAnJScsICcrJywgJy4nLCAnMycsICdkJywgJ1wwJyB9OwotLSMgICAgZWxzZQotLQkJCQkgICAgeyAnJScsICcrJywgJy4nLCAnMicsICdkJywgJ1wwJyB9OwotLSMgICAgZW5kaWYKLS0JCQkJICBTTlBSSU5URiAocCwgNiArIDEsIGRlY2ltYWxfZm9ybWF0LCBleHBvbmVudCk7Ci0tCQkJCX0KLS0JCQkJd2hpbGUgKCpwICE9ICdcMCcpCi0tCQkJCSAgcCsrOwotLSMgICBlbHNlCi0tCQkJCXsKLS0JCQkJICBzdGF0aWMgY29uc3QgY2hhciBkZWNpbWFsX2Zvcm1hdFtdID0KLS0JCQkJICAgIC8qIFByb2R1Y2UgdGhlIHNhbWUgbnVtYmVyIG9mIGV4cG9uZW50IGRpZ2l0cwotLQkJCQkgICAgICAgYXMgdGhlIG5hdGl2ZSBwcmludGYgaW1wbGVtZW50YXRpb24uICAqLwotLSMgICAgaWYgKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKSAmJiAhIGRlZmluZWQgX19DWUdXSU5fXwotLQkJCQkgICAgIiUrLjNkIjsKLS0jICAgIGVsc2UKLS0JCQkJICAgICIlKy4yZCI7Ci0tIyAgICBlbmRpZgotLQkJCQkgIGlmIChzaXplb2YgKERDSEFSX1QpID09IDEpCi0tCQkJCSAgICB7Ci0tCQkJCSAgICAgIHNwcmludGYgKChjaGFyICopIHAsIGRlY2ltYWxfZm9ybWF0LCBleHBvbmVudCk7Ci0tCQkJCSAgICAgIHdoaWxlICgqcCAhPSAnXDAnKQotLQkJCQkJcCsrOwotLQkJCQkgICAgfQotLQkJCQkgIGVsc2UKLS0JCQkJICAgIHsKLS0JCQkJICAgICAgY2hhciBleHBidWZbNiArIDFdOwotLQkJCQkgICAgICBjb25zdCBjaGFyICplcDsKLS0JCQkJICAgICAgc3ByaW50ZiAoZXhwYnVmLCBkZWNpbWFsX2Zvcm1hdCwgZXhwb25lbnQpOwotLQkJCQkgICAgICBmb3IgKGVwID0gZXhwYnVmOyAoKnAgPSAqZXApICE9ICdcMCc7IGVwKyspCi0tCQkJCQlwKys7Ci0tCQkJCSAgICB9Ci0tCQkJCX0KLS0jICAgZW5kaWYKLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UgaWYgKGRwLT5jb252ZXJzaW9uID09ICdnJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRycpCi0tCQkJICAgICAgewotLQkJCQlpZiAocHJlY2lzaW9uID09IDApCi0tCQkJCSAgcHJlY2lzaW9uID0gMTsKLS0JCQkJLyogcHJlY2lzaW9uID49IDEuICAqLwotLQotLQkJCQlpZiAoYXJnID09IDAuMCkKLS0JCQkJICAvKiBUaGUgZXhwb25lbnQgaXMgMCwgPj0gLTQsIDwgcHJlY2lzaW9uLgotLQkJCQkgICAgIFVzZSBmaXhlZC1wb2ludCBub3RhdGlvbi4gICovCi0tCQkJCSAgewotLQkJCQkgICAgc2l6ZV90IG5kaWdpdHMgPSBwcmVjaXNpb247Ci0tCQkJCSAgICAvKiBOdW1iZXIgb2YgdHJhaWxpbmcgemVyb2VzIHRoYXQgaGF2ZSB0byBiZQotLQkJCQkgICAgICAgZHJvcHBlZC4gICovCi0tCQkJCSAgICBzaXplX3Qgbnplcm9lcyA9Ci0tCQkJCSAgICAgIChmbGFncyAmIEZMQUdfQUxUID8gMCA6IHByZWNpc2lvbiAtIDEpOwotLQotLQkJCQkgICAgLS1uZGlnaXRzOwotLQkJCQkgICAgKnArKyA9ICcwJzsKLS0JCQkJICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgfHwgbmRpZ2l0cyA+IG56ZXJvZXMpCi0tCQkJCSAgICAgIHsKLS0JCQkJCSpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCQl3aGlsZSAobmRpZ2l0cyA+IG56ZXJvZXMpCi0tCQkJCQkgIHsKLS0JCQkJCSAgICAtLW5kaWdpdHM7Ci0tCQkJCQkgICAgKnArKyA9ICcwJzsKLS0JCQkJCSAgfQotLQkJCQkgICAgICB9Ci0tCQkJCSAgfQotLQkJCQllbHNlCi0tCQkJCSAgewotLQkJCQkgICAgLyogYXJnID4gMC4wLiAgKi8KLS0JCQkJICAgIGludCBleHBvbmVudDsKLS0JCQkJICAgIGludCBhZGp1c3RlZDsKLS0JCQkJICAgIGNoYXIgKmRpZ2l0czsKLS0JCQkJICAgIHNpemVfdCBuZGlnaXRzOwotLQkJCQkgICAgc2l6ZV90IG56ZXJvZXM7Ci0tCi0tCQkJCSAgICBleHBvbmVudCA9IGZsb29ybG9nMTAgKGFyZyk7Ci0tCQkJCSAgICBhZGp1c3RlZCA9IDA7Ci0tCQkJCSAgICBmb3IgKDs7KQotLQkJCQkgICAgICB7Ci0tCQkJCQlkaWdpdHMgPQotLQkJCQkJICBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfZG91YmxlIChhcmcsCi0tCQkJCQkJCQkJKGludCkocHJlY2lzaW9uIC0gMSkgLSBleHBvbmVudCk7Ci0tCQkJCQlpZiAoZGlnaXRzID09IE5VTEwpCi0tCQkJCQkgIGdvdG8gb3V0X29mX21lbW9yeTsKLS0JCQkJCW5kaWdpdHMgPSBzdHJsZW4gKGRpZ2l0cyk7Ci0tCi0tCQkJCQlpZiAobmRpZ2l0cyA9PSBwcmVjaXNpb24pCi0tCQkJCQkgIGJyZWFrOwotLQkJCQkJaWYgKG5kaWdpdHMgPCBwcmVjaXNpb24gLSAxCi0tCQkJCQkgICAgfHwgbmRpZ2l0cyA+IHByZWNpc2lvbiArIDEpCi0tCQkJCQkgIC8qIFRoZSBleHBvbmVudCB3YXMgbm90IGd1ZXNzZWQKLS0JCQkJCSAgICAgcHJlY2lzZWx5IGVub3VnaC4gICovCi0tCQkJCQkgIGFib3J0ICgpOwotLQkJCQkJaWYgKGFkanVzdGVkKQotLQkJCQkJICAvKiBOb25lIG9mIHR3byB2YWx1ZXMgb2YgZXhwb25lbnQgaXMKLS0JCQkJCSAgICAgdGhlIHJpZ2h0IG9uZS4gIFByZXZlbnQgYW4gZW5kbGVzcwotLQkJCQkJICAgICBsb29wLiAgKi8KLS0JCQkJCSAgYWJvcnQgKCk7Ci0tCQkJCQlmcmVlIChkaWdpdHMpOwotLQkJCQkJaWYgKG5kaWdpdHMgPCBwcmVjaXNpb24pCi0tCQkJCQkgIGV4cG9uZW50IC09IDE7Ci0tCQkJCQllbHNlCi0tCQkJCQkgIGV4cG9uZW50ICs9IDE7Ci0tCQkJCQlhZGp1c3RlZCA9IDE7Ci0tCQkJCSAgICAgIH0KLS0JCQkJICAgIC8qIEhlcmUgbmRpZ2l0cyA9IHByZWNpc2lvbi4gICovCi0tCi0tCQkJCSAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvZXMKLS0JCQkJICAgICAgIHRoYXQgaGF2ZSB0byBiZSBkcm9wcGVkLiAgKi8KLS0JCQkJICAgIG56ZXJvZXMgPSAwOwotLQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSA9PSAwKQotLQkJCQkgICAgICB3aGlsZSAobnplcm9lcyA8IG5kaWdpdHMKLS0JCQkJCSAgICAgJiYgZGlnaXRzW256ZXJvZXNdID09ICcwJykKLS0JCQkJCW56ZXJvZXMrKzsKLS0KLS0JCQkJICAgIC8qIFRoZSBleHBvbmVudCBpcyBub3cgZGV0ZXJtaW5lZC4gICovCi0tCQkJCSAgICBpZiAoZXhwb25lbnQgPj0gLTQKLS0JCQkJCSYmIGV4cG9uZW50IDwgKGxvbmcpcHJlY2lzaW9uKQotLQkJCQkgICAgICB7Ci0tCQkJCQkvKiBGaXhlZC1wb2ludCBub3RhdGlvbjoKLS0JCQkJCSAgIG1heChleHBvbmVudCwwKSsxIGRpZ2l0cywgdGhlbiB0aGUKLS0JCQkJCSAgIGRlY2ltYWwgcG9pbnQsIHRoZW4gdGhlIHJlbWFpbmluZwotLQkJCQkJICAgZGlnaXRzIHdpdGhvdXQgdHJhaWxpbmcgemVyb2VzLiAgKi8KLS0JCQkJCWlmIChleHBvbmVudCA+PSAwKQotLQkJCQkJICB7Ci0tCQkJCQkgICAgc2l6ZV90IGNvdW50ID0gZXhwb25lbnQgKyAxOwotLQkJCQkJICAgIC8qIE5vdGU6IGNvdW50IDw9IHByZWNpc2lvbiA9IG5kaWdpdHMuICAqLwotLQkJCQkJICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50LS0pCi0tCQkJCQkgICAgICAqcCsrID0gZGlnaXRzWy0tbmRpZ2l0c107Ci0tCQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBuZGlnaXRzID4gbnplcm9lcykKLS0JCQkJCSAgICAgIHsKLS0JCQkJCQkqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkJCXdoaWxlIChuZGlnaXRzID4gbnplcm9lcykKLS0JCQkJCQkgIHsKLS0JCQkJCQkgICAgLS1uZGlnaXRzOwotLQkJCQkJCSAgICAqcCsrID0gZGlnaXRzW25kaWdpdHNdOwotLQkJCQkJCSAgfQotLQkJCQkJICAgICAgfQotLQkJCQkJICB9Ci0tCQkJCQllbHNlCi0tCQkJCQkgIHsKLS0JCQkJCSAgICBzaXplX3QgY291bnQgPSAtZXhwb25lbnQgLSAxOwotLQkJCQkJICAgICpwKysgPSAnMCc7Ci0tCQkJCQkgICAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJCSAgICBmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tKQotLQkJCQkJICAgICAgKnArKyA9ICcwJzsKLS0JCQkJCSAgICB3aGlsZSAobmRpZ2l0cyA+IG56ZXJvZXMpCi0tCQkJCQkgICAgICB7Ci0tCQkJCQkJLS1uZGlnaXRzOwotLQkJCQkJCSpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0tCQkJCQkgICAgICB9Ci0tCQkJCQkgIH0KLS0JCQkJICAgICAgfQotLQkJCQkgICAgZWxzZQotLQkJCQkgICAgICB7Ci0tCQkJCQkvKiBFeHBvbmVudGlhbCBub3RhdGlvbi4gICovCi0tCQkJCQkqcCsrID0gZGlnaXRzWy0tbmRpZ2l0c107Ci0tCQkJCQlpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IG5kaWdpdHMgPiBuemVyb2VzKQotLQkJCQkJICB7Ci0tCQkJCQkgICAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJCSAgICB3aGlsZSAobmRpZ2l0cyA+IG56ZXJvZXMpCi0tCQkJCQkgICAgICB7Ci0tCQkJCQkJLS1uZGlnaXRzOwotLQkJCQkJCSpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0tCQkJCQkgICAgICB9Ci0tCQkJCQkgIH0KLS0JCQkJCSpwKysgPSBkcC0+Y29udmVyc2lvbiAtICdHJyArICdFJzsgLyogJ2UnIG9yICdFJyAqLwotLSMgICBpZiBXSURFX0NIQVJfVkVSU0lPTgotLQkJCQkJewotLQkJCQkJICBzdGF0aWMgY29uc3Qgd2NoYXJfdCBkZWNpbWFsX2Zvcm1hdFtdID0KLS0JCQkJCSAgICAvKiBQcm9kdWNlIHRoZSBzYW1lIG51bWJlciBvZiBleHBvbmVudCBkaWdpdHMKLS0JCQkJCSAgICAgICBhcyB0aGUgbmF0aXZlIHByaW50ZiBpbXBsZW1lbnRhdGlvbi4gICovCi0tIyAgICBpZiAoZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18pICYmICEgZGVmaW5lZCBfX0NZR1dJTl9fCi0tCQkJCQkgICAgeyAnJScsICcrJywgJy4nLCAnMycsICdkJywgJ1wwJyB9OwotLSMgICAgZWxzZQotLQkJCQkJICAgIHsgJyUnLCAnKycsICcuJywgJzInLCAnZCcsICdcMCcgfTsKLS0jICAgIGVuZGlmCi0tCQkJCQkgIFNOUFJJTlRGIChwLCA2ICsgMSwgZGVjaW1hbF9mb3JtYXQsIGV4cG9uZW50KTsKLS0JCQkJCX0KLS0JCQkJCXdoaWxlICgqcCAhPSAnXDAnKQotLQkJCQkJICBwKys7Ci0tIyAgIGVsc2UKLS0JCQkJCXsKLS0JCQkJCSAgc3RhdGljIGNvbnN0IGNoYXIgZGVjaW1hbF9mb3JtYXRbXSA9Ci0tCQkJCQkgICAgLyogUHJvZHVjZSB0aGUgc2FtZSBudW1iZXIgb2YgZXhwb25lbnQgZGlnaXRzCi0tCQkJCQkgICAgICAgYXMgdGhlIG5hdGl2ZSBwcmludGYgaW1wbGVtZW50YXRpb24uICAqLwotLSMgICAgaWYgKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKSAmJiAhIGRlZmluZWQgX19DWUdXSU5fXwotLQkJCQkJICAgICIlKy4zZCI7Ci0tIyAgICBlbHNlCi0tCQkJCQkgICAgIiUrLjJkIjsKLS0jICAgIGVuZGlmCi0tCQkJCQkgIGlmIChzaXplb2YgKERDSEFSX1QpID09IDEpCi0tCQkJCQkgICAgewotLQkJCQkJICAgICAgc3ByaW50ZiAoKGNoYXIgKikgcCwgZGVjaW1hbF9mb3JtYXQsIGV4cG9uZW50KTsKLS0JCQkJCSAgICAgIHdoaWxlICgqcCAhPSAnXDAnKQotLQkJCQkJCXArKzsKLS0JCQkJCSAgICB9Ci0tCQkJCQkgIGVsc2UKLS0JCQkJCSAgICB7Ci0tCQkJCQkgICAgICBjaGFyIGV4cGJ1Zls2ICsgMV07Ci0tCQkJCQkgICAgICBjb25zdCBjaGFyICplcDsKLS0JCQkJCSAgICAgIHNwcmludGYgKGV4cGJ1ZiwgZGVjaW1hbF9mb3JtYXQsIGV4cG9uZW50KTsKLS0JCQkJCSAgICAgIGZvciAoZXAgPSBleHBidWY7ICgqcCA9ICplcCkgIT0gJ1wwJzsgZXArKykKLS0JCQkJCQlwKys7Ci0tCQkJCQkgICAgfQotLQkJCQkJfQotLSMgICBlbmRpZgotLQkJCQkgICAgICB9Ci0tCi0tCQkJCSAgICBmcmVlIChkaWdpdHMpOwotLQkJCQkgIH0KLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UKLS0JCQkgICAgICBhYm9ydCAoKTsKLS0jICBlbHNlCi0tCQkJICAgIC8qIGFyZyBpcyBmaW5pdGUuICAqLwotLQkJCSAgICBpZiAoIShhcmcgPT0gMC4wKSkKLS0JCQkgICAgICBhYm9ydCAoKTsKLS0KLS0JCQkgICAgcGFkX3B0ciA9IHA7Ci0tCi0tCQkJICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZicgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0YnKQotLQkJCSAgICAgIHsKLS0JCQkJKnArKyA9ICcwJzsKLS0JCQkJaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBwcmVjaXNpb24gPiAwKQotLQkJCQkgIHsKLS0JCQkJICAgICpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCSAgICBmb3IgKDsgcHJlY2lzaW9uID4gMDsgcHJlY2lzaW9uLS0pCi0tCQkJCSAgICAgICpwKysgPSAnMCc7Ci0tCQkJCSAgfQotLQkJCSAgICAgIH0KLS0JCQkgICAgZWxzZSBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ2UnIHx8IGRwLT5jb252ZXJzaW9uID09ICdFJykKLS0JCQkgICAgICB7Ci0tCQkJCSpwKysgPSAnMCc7Ci0tCQkJCWlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgfHwgcHJlY2lzaW9uID4gMCkKLS0JCQkJICB7Ci0tCQkJCSAgICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkgICAgZm9yICg7IHByZWNpc2lvbiA+IDA7IHByZWNpc2lvbi0tKQotLQkJCQkgICAgICAqcCsrID0gJzAnOwotLQkJCQkgIH0KLS0JCQkJKnArKyA9IGRwLT5jb252ZXJzaW9uOyAvKiAnZScgb3IgJ0UnICovCi0tCQkJCSpwKysgPSAnKyc7Ci0tCQkJCS8qIFByb2R1Y2UgdGhlIHNhbWUgbnVtYmVyIG9mIGV4cG9uZW50IGRpZ2l0cyBhcwotLQkJCQkgICB0aGUgbmF0aXZlIHByaW50ZiBpbXBsZW1lbnRhdGlvbi4gICovCi0tIyAgIGlmIChkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXykgJiYgISBkZWZpbmVkIF9fQ1lHV0lOX18KLS0JCQkJKnArKyA9ICcwJzsKLS0jICAgZW5kaWYKLS0JCQkJKnArKyA9ICcwJzsKLS0JCQkJKnArKyA9ICcwJzsKLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UgaWYgKGRwLT5jb252ZXJzaW9uID09ICdnJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRycpCi0tCQkJICAgICAgewotLQkJCQkqcCsrID0gJzAnOwotLQkJCQlpZiAoZmxhZ3MgJiBGTEFHX0FMVCkKLS0JCQkJICB7Ci0tCQkJCSAgICBzaXplX3QgbmRpZ2l0cyA9Ci0tCQkJCSAgICAgIChwcmVjaXNpb24gPiAwID8gcHJlY2lzaW9uIC0gMSA6IDApOwotLQkJCQkgICAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJICAgIGZvciAoOyBuZGlnaXRzID4gMDsgLS1uZGlnaXRzKQotLQkJCQkgICAgICAqcCsrID0gJzAnOwotLQkJCQkgIH0KLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UKLS0JCQkgICAgICBhYm9ydCAoKTsKLS0jICBlbmRpZgotLQkJCSAgfQotLQkJICAgICAgfQotLQkJICB9Ci0tIyBlbmRpZgotLQotLQkJLyogVGhlIGdlbmVyYXRlZCBzdHJpbmcgbm93IGV4dGVuZHMgZnJvbSB0bXAgdG8gcCwgd2l0aCB0aGUKLS0JCSAgIHplcm8gcGFkZGluZyBpbnNlcnRpb24gcG9pbnQgYmVpbmcgYXQgcGFkX3B0ci4gICovCi0tCQlpZiAoaGFzX3dpZHRoICYmIHAgLSB0bXAgPCB3aWR0aCkKLS0JCSAgewotLQkJICAgIHNpemVfdCBwYWQgPSB3aWR0aCAtIChwIC0gdG1wKTsKLS0JCSAgICBEQ0hBUl9UICplbmQgPSBwICsgcGFkOwotLQotLQkJICAgIGlmIChmbGFncyAmIEZMQUdfTEVGVCkKLS0JCSAgICAgIHsKLS0JCQkvKiBQYWQgd2l0aCBzcGFjZXMgb24gdGhlIHJpZ2h0LiAgKi8KLS0JCQlmb3IgKDsgcGFkID4gMDsgcGFkLS0pCi0tCQkJICAqcCsrID0gJyAnOwotLQkJICAgICAgfQotLQkJICAgIGVsc2UgaWYgKChmbGFncyAmIEZMQUdfWkVSTykgJiYgcGFkX3B0ciAhPSBOVUxMKQotLQkJICAgICAgewotLQkJCS8qIFBhZCB3aXRoIHplcm9lcy4gICovCi0tCQkJRENIQVJfVCAqcSA9IGVuZDsKLS0KLS0JCQl3aGlsZSAocCA+IHBhZF9wdHIpCi0tCQkJICAqLS1xID0gKi0tcDsKLS0JCQlmb3IgKDsgcGFkID4gMDsgcGFkLS0pCi0tCQkJICAqcCsrID0gJzAnOwotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQkvKiBQYWQgd2l0aCBzcGFjZXMgb24gdGhlIGxlZnQuICAqLwotLQkJCURDSEFSX1QgKnEgPSBlbmQ7Ci0tCi0tCQkJd2hpbGUgKHAgPiB0bXApCi0tCQkJICAqLS1xID0gKi0tcDsKLS0JCQlmb3IgKDsgcGFkID4gMDsgcGFkLS0pCi0tCQkJICAqcCsrID0gJyAnOwotLQkJICAgICAgfQotLQotLQkJICAgIHAgPSBlbmQ7Ci0tCQkgIH0KLS0KLS0JCXsKLS0JCSAgc2l6ZV90IGNvdW50ID0gcCAtIHRtcDsKLS0KLS0JCSAgaWYgKGNvdW50ID49IHRtcF9sZW5ndGgpCi0tCQkgICAgLyogdG1wX2xlbmd0aCB3YXMgaW5jb3JyZWN0bHkgY2FsY3VsYXRlZCAtIGZpeCB0aGUKLS0JCSAgICAgICBjb2RlIGFib3ZlISAgKi8KLS0JCSAgICBhYm9ydCAoKTsKLS0KLS0JCSAgLyogTWFrZSByb29tIGZvciB0aGUgcmVzdWx0LiAgKi8KLS0JCSAgaWYgKGNvdW50ID49IGFsbG9jYXRlZCAtIGxlbmd0aCkKLS0JCSAgICB7Ci0tCQkgICAgICBzaXplX3QgbiA9IHhzdW0gKGxlbmd0aCwgY291bnQpOwotLQotLQkJICAgICAgRU5TVVJFX0FMTE9DQVRJT04gKG4pOwotLQkJICAgIH0KLS0KLS0JCSAgLyogQXBwZW5kIHRoZSByZXN1bHQuICAqLwotLQkJICBtZW1jcHkgKHJlc3VsdCArIGxlbmd0aCwgdG1wLCBjb3VudCAqIHNpemVvZiAoRENIQVJfVCkpOwotLQkJICBpZiAodG1wICE9IHRtcGJ1ZikKLS0JCSAgICBmcmVlICh0bXApOwotLQkJICBsZW5ndGggKz0gY291bnQ7Ci0tCQl9Ci0tCSAgICAgIH0KLS0jZW5kaWYKLS0JICAgIGVsc2UKLS0JICAgICAgewotLQkJYXJnX3R5cGUgdHlwZSA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGU7Ci0tCQlpbnQgZmxhZ3MgPSBkcC0+ZmxhZ3M7Ci0tI2lmICFVU0VfU05QUklOVEYgfHwgIURDSEFSX0lTX1RDSEFSIHx8IEVOQUJMRV9VTklTVERJTyB8fCBORUVEX1BSSU5URl9GTEFHX1pFUk8gfHwgTkVFRF9QUklOVEZfVU5CT1VOREVEX1BSRUNJU0lPTgotLQkJaW50IGhhc193aWR0aDsKLS0JCXNpemVfdCB3aWR0aDsKLS0jZW5kaWYKLS0jaWYgIVVTRV9TTlBSSU5URiB8fCBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0tCQlpbnQgaGFzX3ByZWNpc2lvbjsKLS0JCXNpemVfdCBwcmVjaXNpb247Ci0tI2VuZGlmCi0tI2lmIE5FRURfUFJJTlRGX1VOQk9VTkRFRF9QUkVDSVNJT04KLS0JCWludCBwcmVjX291cnNlbHZlczsKLS0jZWxzZQotLSMJCWRlZmluZSBwcmVjX291cnNlbHZlcyAwCi0tI2VuZGlmCi0tI2lmICFEQ0hBUl9JU19UQ0hBUiB8fCBFTkFCTEVfVU5JU1RESU8gfHwgTkVFRF9QUklOVEZfRkxBR19aRVJPIHx8IE5FRURfUFJJTlRGX1VOQk9VTkRFRF9QUkVDSVNJT04KLS0JCWludCBwYWRfb3Vyc2VsdmVzOwotLSNlbHNlCi0tIwkJZGVmaW5lIHBhZF9vdXJzZWx2ZXMgMAotLSNlbmRpZgotLQkJVENIQVJfVCAqZmJwOwotLQkJdW5zaWduZWQgaW50IHByZWZpeF9jb3VudDsKLS0JCWludCBwcmVmaXhlc1syXTsKLS0jaWYgIVVTRV9TTlBSSU5URgotLQkJc2l6ZV90IHRtcF9sZW5ndGg7Ci0tCQlUQ0hBUl9UIHRtcGJ1Zls3MDBdOwotLQkJVENIQVJfVCAqdG1wOwotLSNlbmRpZgotLQotLSNpZiAhVVNFX1NOUFJJTlRGIHx8ICFEQ0hBUl9JU19UQ0hBUiB8fCBFTkFCTEVfVU5JU1RESU8gfHwgTkVFRF9QUklOVEZfRkxBR19aRVJPIHx8IE5FRURfUFJJTlRGX1VOQk9VTkRFRF9QUkVDSVNJT04KLS0JCWhhc193aWR0aCA9IDA7Ci0tCQl3aWR0aCA9IDA7Ci0tCQlpZiAoZHAtPndpZHRoX3N0YXJ0ICE9IGRwLT53aWR0aF9lbmQpCi0tCQkgIHsKLS0JCSAgICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKLS0JCSAgICAgIHsKLS0JCQlpbnQgYXJnOwotLQotLQkJCWlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotLQkJCSAgYWJvcnQgKCk7Ci0tCQkJYXJnID0gYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0uYS5hX2ludDsKLS0JCQlpZiAoYXJnIDwgMCkKLS0JCQkgIHsKLS0JCQkgICAgLyogIkEgbmVnYXRpdmUgZmllbGQgd2lkdGggaXMgdGFrZW4gYXMgYSAnLScgZmxhZwotLQkJCSAgICAgICAgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBmaWVsZCB3aWR0aC4iICAqLwotLQkJCSAgICBmbGFncyB8PSBGTEFHX0xFRlQ7Ci0tCQkJICAgIHdpZHRoID0gKHVuc2lnbmVkIGludCkgKC1hcmcpOwotLQkJCSAgfQotLQkJCWVsc2UKLS0JCQkgIHdpZHRoID0gYXJnOwotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQljb25zdCBGQ0hBUl9UICpkaWdpdHAgPSBkcC0+d2lkdGhfc3RhcnQ7Ci0tCi0tCQkJZG8KLS0JCQkgIHdpZHRoID0geHN1bSAoeHRpbWVzICh3aWR0aCwgMTApLCAqZGlnaXRwKysgLSAnMCcpOwotLQkJCXdoaWxlIChkaWdpdHAgIT0gZHAtPndpZHRoX2VuZCk7Ci0tCQkgICAgICB9Ci0tCQkgICAgaGFzX3dpZHRoID0gMTsKLS0JCSAgfQotLSNlbmRpZgotLQotLSNpZiAhVVNFX1NOUFJJTlRGIHx8IE5FRURfUFJJTlRGX1VOQk9VTkRFRF9QUkVDSVNJT04KLS0JCWhhc19wcmVjaXNpb24gPSAwOwotLQkJcHJlY2lzaW9uID0gNjsKLS0JCWlmIChkcC0+cHJlY2lzaW9uX3N0YXJ0ICE9IGRwLT5wcmVjaXNpb25fZW5kKQotLQkJICB7Ci0tCQkgICAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ICE9IEFSR19OT05FKQotLQkJICAgICAgewotLQkJCWludCBhcmc7Ci0tCi0tCQkJaWYgKCEoYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotLQkJCSAgYWJvcnQgKCk7Ci0tCQkJYXJnID0gYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0tCQkJLyogIkEgbmVnYXRpdmUgcHJlY2lzaW9uIGlzIHRha2VuIGFzIGlmIHRoZSBwcmVjaXNpb24KLS0JCQkgICAgd2VyZSBvbWl0dGVkLiIgICovCi0tCQkJaWYgKGFyZyA+PSAwKQotLQkJCSAgewotLQkJCSAgICBwcmVjaXNpb24gPSBhcmc7Ci0tCQkJICAgIGhhc19wcmVjaXNpb24gPSAxOwotLQkJCSAgfQotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQljb25zdCBGQ0hBUl9UICpkaWdpdHAgPSBkcC0+cHJlY2lzaW9uX3N0YXJ0ICsgMTsKLS0KLS0JCQlwcmVjaXNpb24gPSAwOwotLQkJCXdoaWxlIChkaWdpdHAgIT0gZHAtPnByZWNpc2lvbl9lbmQpCi0tCQkJICBwcmVjaXNpb24gPSB4c3VtICh4dGltZXMgKHByZWNpc2lvbiwgMTApLCAqZGlnaXRwKysgLSAnMCcpOwotLQkJCWhhc19wcmVjaXNpb24gPSAxOwotLQkJICAgICAgfQotLQkJICB9Ci0tI2VuZGlmCi0tCi0tI2lmICFVU0VfU05QUklOVEYKLS0JCS8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemUgZm9yIGNhbGxpbmcKLS0JCSAgIHNwcmludGYuICAqLwotLQkJewotLQkJICBzd2l0Y2ggKGRwLT5jb252ZXJzaW9uKQotLQkJICAgIHsKLS0KLS0JCSAgICBjYXNlICdkJzogY2FzZSAnaSc6IGNhc2UgJ3UnOgotLSMgaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0tCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdMT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0xPTkdJTlQpCi0tCQkJdG1wX2xlbmd0aCA9Ci0tCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nIGxvbmcpICogQ0hBUl9CSVQKLS0JCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCi0tCQkJCQkgKQotLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJICAgICAgZWxzZQotLSMgZW5kaWYKLS0JCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdJTlQpCi0tCQkJdG1wX2xlbmd0aCA9Ci0tCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nKSAqIENIQVJfQklUCi0tCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLwotLQkJCQkJICkKLS0JCQkgICsgMTsgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLS0JCSAgICAgIGVsc2UKLS0JCQl0bXBfbGVuZ3RoID0KLS0JCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGludCkgKiBDSEFSX0JJVAotLQkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KLS0JCQkJCSApCi0tCQkJICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkgICAgICBpZiAodG1wX2xlbmd0aCA8IHByZWNpc2lvbikKLS0JCQl0bXBfbGVuZ3RoID0gcHJlY2lzaW9uOwotLQkJICAgICAgLyogTXVsdGlwbHkgYnkgMiwgYXMgYW4gZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAuICAqLwotLQkJICAgICAgdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIHRtcF9sZW5ndGgpOwotLQkJICAgICAgLyogQWRkIDEsIHRvIGFjY291bnQgZm9yIGEgbGVhZGluZyBzaWduLiAgKi8KLS0JCSAgICAgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCAxKTsKLS0JCSAgICAgIGJyZWFrOwotLQotLQkJICAgIGNhc2UgJ28nOgotLSMgaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0tCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdMT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0xPTkdJTlQpCi0tCQkJdG1wX2xlbmd0aCA9Ci0tCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nIGxvbmcpICogQ0hBUl9CSVQKLS0JCQkJCSAgKiAwLjMzMzMzNCAvKiBiaW5hcnkgLT4gb2N0YWwgKi8KLS0JCQkJCSApCi0tCQkJICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkgICAgICBlbHNlCi0tIyBlbmRpZgotLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0lOVCkKLS0JCQl0bXBfbGVuZ3RoID0KLS0JCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQKLS0JCQkJCSAgKiAwLjMzMzMzNCAvKiBiaW5hcnkgLT4gb2N0YWwgKi8KLS0JCQkJCSApCi0tCQkJICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkgICAgICBlbHNlCi0tCQkJdG1wX2xlbmd0aCA9Ci0tCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBpbnQpICogQ0hBUl9CSVQKLS0JCQkJCSAgKiAwLjMzMzMzNCAvKiBiaW5hcnkgLT4gb2N0YWwgKi8KLS0JCQkJCSApCi0tCQkJICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkgICAgICBpZiAodG1wX2xlbmd0aCA8IHByZWNpc2lvbikKLS0JCQl0bXBfbGVuZ3RoID0gcHJlY2lzaW9uOwotLQkJICAgICAgLyogQWRkIDEsIHRvIGFjY291bnQgZm9yIGEgbGVhZGluZyBzaWduLiAgKi8KLS0JCSAgICAgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCAxKTsKLS0JCSAgICAgIGJyZWFrOwotLQotLQkJICAgIGNhc2UgJ3gnOiBjYXNlICdYJzoKLS0jIGlmIEhBVkVfTE9OR19MT05HX0lOVAotLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdMT05HSU5UKQotLQkJCXRtcF9sZW5ndGggPQotLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUCi0tCQkJCQkgICogMC4yNSAvKiBiaW5hcnkgLT4gaGV4YWRlY2ltYWwgKi8KLS0JCQkJCSApCi0tCQkJICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkgICAgICBlbHNlCi0tIyBlbmRpZgotLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0lOVCkKLS0JCQl0bXBfbGVuZ3RoID0KLS0JCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQKLS0JCQkJCSAgKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLwotLQkJCQkJICkKLS0JCQkgICsgMTsgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLS0JCSAgICAgIGVsc2UKLS0JCQl0bXBfbGVuZ3RoID0KLS0JCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGludCkgKiBDSEFSX0JJVAotLQkJCQkJICAqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCi0tCQkJCQkgKQotLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJICAgICAgaWYgKHRtcF9sZW5ndGggPCBwcmVjaXNpb24pCi0tCQkJdG1wX2xlbmd0aCA9IHByZWNpc2lvbjsKLS0JCSAgICAgIC8qIEFkZCAyLCB0byBhY2NvdW50IGZvciBhIGxlYWRpbmcgc2lnbiBvciBhbHRlcm5hdGUgZm9ybS4gICovCi0tCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMik7Ci0tCQkgICAgICBicmVhazsKLS0KLS0JCSAgICBjYXNlICdmJzogY2FzZSAnRic6Ci0tCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdET1VCTEUpCi0tCQkJdG1wX2xlbmd0aCA9Ci0tCQkJICAodW5zaWduZWQgaW50KSAoTERCTF9NQVhfRVhQCi0tCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLwotLQkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KLS0JCQkJCSApCi0tCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLS0JCQkgICsgMTA7IC8qIHNpZ24sIGRlY2ltYWwgcG9pbnQgZXRjLiAqLwotLQkJICAgICAgZWxzZQotLQkJCXRtcF9sZW5ndGggPQotLQkJCSAgKHVuc2lnbmVkIGludCkgKERCTF9NQVhfRVhQCi0tCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLwotLQkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KLS0JCQkJCSApCi0tCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLS0JCQkgICsgMTA7IC8qIHNpZ24sIGRlY2ltYWwgcG9pbnQgZXRjLiAqLwotLQkJICAgICAgdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIHByZWNpc2lvbik7Ci0tCQkgICAgICBicmVhazsKLS0KLS0JCSAgICBjYXNlICdlJzogY2FzZSAnRSc6IGNhc2UgJ2cnOiBjYXNlICdHJzoKLS0JCSAgICAgIHRtcF9sZW5ndGggPQotLQkJCTEyOyAvKiBzaWduLCBkZWNpbWFsIHBvaW50LCBleHBvbmVudCBldGMuICovCi0tCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgcHJlY2lzaW9uKTsKLS0JCSAgICAgIGJyZWFrOwotLQotLQkJICAgIGNhc2UgJ2EnOiBjYXNlICdBJzoKLS0JCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0RPVUJMRSkKLS0JCQl0bXBfbGVuZ3RoID0KLS0JCQkgICh1bnNpZ25lZCBpbnQpIChMREJMX0RJRwotLQkJCQkJICAqIDAuODMxIC8qIGRlY2ltYWwgLT4gaGV4YWRlY2ltYWwgKi8KLS0JCQkJCSApCi0tCQkJICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkgICAgICBlbHNlCi0tCQkJdG1wX2xlbmd0aCA9Ci0tCQkJICAodW5zaWduZWQgaW50KSAoREJMX0RJRwotLQkJCQkJICAqIDAuODMxIC8qIGRlY2ltYWwgLT4gaGV4YWRlY2ltYWwgKi8KLS0JCQkJCSApCi0tCQkJICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkgICAgICBpZiAodG1wX2xlbmd0aCA8IHByZWNpc2lvbikKLS0JCQl0bXBfbGVuZ3RoID0gcHJlY2lzaW9uOwotLQkJICAgICAgLyogQWNjb3VudCBmb3Igc2lnbiwgZGVjaW1hbCBwb2ludCBldGMuICovCi0tCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMTIpOwotLQkJICAgICAgYnJlYWs7Ci0tCi0tCQkgICAgY2FzZSAnYyc6Ci0tIyBpZiBIQVZFX1dJTlRfVCAmJiAhV0lERV9DSEFSX1ZFUlNJT04KLS0JCSAgICAgIGlmICh0eXBlID09IFRZUEVfV0lERV9DSEFSKQotLQkJCXRtcF9sZW5ndGggPSBNQl9DVVJfTUFYOwotLQkJICAgICAgZWxzZQotLSMgZW5kaWYKLS0JCQl0bXBfbGVuZ3RoID0gMTsKLS0JCSAgICAgIGJyZWFrOwotLQotLQkJICAgIGNhc2UgJ3MnOgotLSMgaWYgSEFWRV9XQ0hBUl9UCi0tCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX1dJREVfU1RSSU5HKQotLQkJCXsKLS0JCQkgIHRtcF9sZW5ndGggPQotLQkJCSAgICBsb2NhbF93Y3NsZW4gKGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV93aWRlX3N0cmluZyk7Ci0tCi0tIyAgaWYgIVdJREVfQ0hBUl9WRVJTSU9OCi0tCQkJICB0bXBfbGVuZ3RoID0geHRpbWVzICh0bXBfbGVuZ3RoLCBNQl9DVVJfTUFYKTsKLS0jICBlbmRpZgotLQkJCX0KLS0JCSAgICAgIGVsc2UKLS0jIGVuZGlmCi0tCQkJdG1wX2xlbmd0aCA9IHN0cmxlbiAoYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3N0cmluZyk7Ci0tCQkgICAgICBicmVhazsKLS0KLS0JCSAgICBjYXNlICdwJzoKLS0JCSAgICAgIHRtcF9sZW5ndGggPQotLQkJCSh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHZvaWQgKikgKiBDSEFSX0JJVAotLQkJCQkJKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLwotLQkJCQkgICAgICAgKQotLQkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkJICArIDI7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgMHggKi8KLS0JCSAgICAgIGJyZWFrOwotLQotLQkJICAgIGRlZmF1bHQ6Ci0tCQkgICAgICBhYm9ydCAoKTsKLS0JCSAgICB9Ci0tCi0tIyBpZiBFTkFCTEVfVU5JU1RESU8KLS0JCSAgLyogUGFkZGluZyBjb25zaWRlcnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLCB0aGVyZWZvcmUgdGhlCi0tCQkgICAgIG51bWJlciBvZiBlbGVtZW50cyBhZnRlciBwYWRkaW5nIG1heSBiZQotLQkJICAgICAgID4gbWF4ICh0bXBfbGVuZ3RoLCB3aWR0aCkKLS0JCSAgICAgYnV0IGlzIGNlcnRhaW5seQotLQkJICAgICAgIDw9IHRtcF9sZW5ndGggKyB3aWR0aC4gICovCi0tCQkgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCB3aWR0aCk7Ci0tIyBlbHNlCi0tCQkgIC8qIFBhZGRpbmcgY29uc2lkZXJzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIHNheXMgUE9TSVguICAqLwotLQkJICBpZiAodG1wX2xlbmd0aCA8IHdpZHRoKQotLQkJICAgIHRtcF9sZW5ndGggPSB3aWR0aDsKLS0jIGVuZGlmCi0tCi0tCQkgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCAxKTsgLyogYWNjb3VudCBmb3IgdHJhaWxpbmcgTlVMICovCi0tCQl9Ci0tCi0tCQlpZiAodG1wX2xlbmd0aCA8PSBzaXplb2YgKHRtcGJ1ZikgLyBzaXplb2YgKFRDSEFSX1QpKQotLQkJICB0bXAgPSB0bXBidWY7Ci0tCQllbHNlCi0tCQkgIHsKLS0JCSAgICBzaXplX3QgdG1wX21lbXNpemUgPSB4dGltZXMgKHRtcF9sZW5ndGgsIHNpemVvZiAoVENIQVJfVCkpOwotLQotLQkJICAgIGlmIChzaXplX292ZXJmbG93X3AgKHRtcF9tZW1zaXplKSkKLS0JCSAgICAgIC8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLwotLQkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OwotLQkJICAgIHRtcCA9IChUQ0hBUl9UICopIG1hbGxvYyAodG1wX21lbXNpemUpOwotLQkJICAgIGlmICh0bXAgPT0gTlVMTCkKLS0JCSAgICAgIC8qIE91dCBvZiBtZW1vcnkuICAqLwotLQkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OwotLQkJICB9Ci0tI2VuZGlmCi0tCi0tCQkvKiBEZWNpZGUgd2hldGhlciB0byBoYW5kbGUgdGhlIHByZWNpc2lvbiBvdXJzZWx2ZXMuICAqLwotLSNpZiBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0tCQlzd2l0Y2ggKGRwLT5jb252ZXJzaW9uKQotLQkJICB7Ci0tCQkgIGNhc2UgJ2QnOiBjYXNlICdpJzogY2FzZSAndSc6Ci0tCQkgIGNhc2UgJ28nOgotLQkJICBjYXNlICd4JzogY2FzZSAnWCc6IGNhc2UgJ3AnOgotLQkJICAgIHByZWNfb3Vyc2VsdmVzID0gaGFzX3ByZWNpc2lvbiAmJiAocHJlY2lzaW9uID4gMCk7Ci0tCQkgICAgYnJlYWs7Ci0tCQkgIGRlZmF1bHQ6Ci0tCQkgICAgcHJlY19vdXJzZWx2ZXMgPSAwOwotLQkJICAgIGJyZWFrOwotLQkJICB9Ci0tI2VuZGlmCi0tCi0tCQkvKiBEZWNpZGUgd2hldGhlciB0byBwZXJmb3JtIHRoZSBwYWRkaW5nIG91cnNlbHZlcy4gICovCi0tI2lmICFEQ0hBUl9JU19UQ0hBUiB8fCBFTkFCTEVfVU5JU1RESU8gfHwgTkVFRF9QUklOVEZfRkxBR19aRVJPIHx8IE5FRURfUFJJTlRGX1VOQk9VTkRFRF9QUkVDSVNJT04KLS0JCXN3aXRjaCAoZHAtPmNvbnZlcnNpb24pCi0tCQkgIHsKLS0jIGlmICFEQ0hBUl9JU19UQ0hBUiB8fCBFTkFCTEVfVU5JU1RESU8KLS0JCSAgLyogSWYgd2UgbmVlZCBjb252ZXJzaW9uIGZyb20gVENIQVJfVFtdIHRvIERDSEFSX1RbXSwgd2UgbmVlZAotLQkJICAgICB0byBwZXJmb3JtIHRoZSBwYWRkaW5nIGFmdGVyIHRoaXMgY29udmVyc2lvbi4gIEZ1bmN0aW9ucwotLQkJICAgICB3aXRoIHVuaXN0ZGlvIGV4dGVuc2lvbnMgcGVyZm9ybSB0aGUgcGFkZGluZyBiYXNlZCBvbgotLQkJICAgICBjaGFyYWN0ZXIgY291bnQgcmF0aGVyIHRoYW4gZWxlbWVudCBjb3VudC4gICovCi0tCQkgIGNhc2UgJ2MnOiBjYXNlICdzJzoKLS0jIGVuZGlmCi0tIyBpZiBORUVEX1BSSU5URl9GTEFHX1pFUk8KLS0JCSAgY2FzZSAnZic6IGNhc2UgJ0YnOiBjYXNlICdlJzogY2FzZSAnRSc6IGNhc2UgJ2cnOiBjYXNlICdHJzoKLS0JCSAgY2FzZSAnYSc6IGNhc2UgJ0EnOgotLSMgZW5kaWYKLS0JCSAgICBwYWRfb3Vyc2VsdmVzID0gMTsKLS0JCSAgICBicmVhazsKLS0JCSAgZGVmYXVsdDoKLS0JCSAgICBwYWRfb3Vyc2VsdmVzID0gcHJlY19vdXJzZWx2ZXM7Ci0tCQkgICAgYnJlYWs7Ci0tCQkgIH0KLS0jZW5kaWYKLS0KLS0JCS8qIENvbnN0cnVjdCB0aGUgZm9ybWF0IHN0cmluZyBmb3IgY2FsbGluZyBzbnByaW50ZiBvcgotLQkJICAgc3ByaW50Zi4gICovCi0tCQlmYnAgPSBidWY7Ci0tCQkqZmJwKysgPSAnJSc7Ci0tI2lmIE5FRURfUFJJTlRGX0ZMQUdfR1JPVVBJTkcKLS0JCS8qIFRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgJyBmbGFnLgotLQkJICAgUHJvZHVjZSBubyBncm91cGluZyBjaGFyYWN0ZXJzIGluIHRoaXMgY2FzZTsgdGhpcyBpcwotLQkJICAgYWNjZXB0YWJsZSBiZWNhdXNlIHRoZSBncm91cGluZyBpcyBsb2NhbGUgZGVwZW5kZW50LiAgKi8KLS0jZWxzZQotLQkJaWYgKGZsYWdzICYgRkxBR19HUk9VUCkKLS0JCSAgKmZicCsrID0gJ1wnJzsKLS0jZW5kaWYKLS0JCWlmIChmbGFncyAmIEZMQUdfTEVGVCkKLS0JCSAgKmZicCsrID0gJy0nOwotLQkJaWYgKGZsYWdzICYgRkxBR19TSE9XU0lHTikKLS0JCSAgKmZicCsrID0gJysnOwotLQkJaWYgKGZsYWdzICYgRkxBR19TUEFDRSkKLS0JCSAgKmZicCsrID0gJyAnOwotLQkJaWYgKGZsYWdzICYgRkxBR19BTFQpCi0tCQkgICpmYnArKyA9ICcjJzsKLS0JCWlmICghcGFkX291cnNlbHZlcykKLS0JCSAgewotLQkJICAgIGlmIChmbGFncyAmIEZMQUdfWkVSTykKLS0JCSAgICAgICpmYnArKyA9ICcwJzsKLS0JCSAgICBpZiAoZHAtPndpZHRoX3N0YXJ0ICE9IGRwLT53aWR0aF9lbmQpCi0tCQkgICAgICB7Ci0tCQkJc2l6ZV90IG4gPSBkcC0+d2lkdGhfZW5kIC0gZHAtPndpZHRoX3N0YXJ0OwotLQkJCS8qIFRoZSB3aWR0aCBzcGVjaWZpY2F0aW9uIGlzIGtub3duIHRvIGNvbnNpc3Qgb25seQotLQkJCSAgIG9mIHN0YW5kYXJkIEFTQ0lJIGNoYXJhY3RlcnMuICAqLwotLQkJCWlmIChzaXplb2YgKEZDSEFSX1QpID09IHNpemVvZiAoVENIQVJfVCkpCi0tCQkJICB7Ci0tCQkJICAgIG1lbWNweSAoZmJwLCBkcC0+d2lkdGhfc3RhcnQsIG4gKiBzaXplb2YgKFRDSEFSX1QpKTsKLS0JCQkgICAgZmJwICs9IG47Ci0tCQkJICB9Ci0tCQkJZWxzZQotLQkJCSAgewotLQkJCSAgICBjb25zdCBGQ0hBUl9UICptcCA9IGRwLT53aWR0aF9zdGFydDsKLS0JCQkgICAgZG8KLS0JCQkgICAgICAqZmJwKysgPSAodW5zaWduZWQgY2hhcikgKm1wKys7Ci0tCQkJICAgIHdoaWxlICgtLW4gPiAwKTsKLS0JCQkgIH0KLS0JCSAgICAgIH0KLS0JCSAgfQotLQkJaWYgKCFwcmVjX291cnNlbHZlcykKLS0JCSAgewotLQkJICAgIGlmIChkcC0+cHJlY2lzaW9uX3N0YXJ0ICE9IGRwLT5wcmVjaXNpb25fZW5kKQotLQkJICAgICAgewotLQkJCXNpemVfdCBuID0gZHAtPnByZWNpc2lvbl9lbmQgLSBkcC0+cHJlY2lzaW9uX3N0YXJ0OwotLQkJCS8qIFRoZSBwcmVjaXNpb24gc3BlY2lmaWNhdGlvbiBpcyBrbm93biB0byBjb25zaXN0IG9ubHkKLS0JCQkgICBvZiBzdGFuZGFyZCBBU0NJSSBjaGFyYWN0ZXJzLiAgKi8KLS0JCQlpZiAoc2l6ZW9mIChGQ0hBUl9UKSA9PSBzaXplb2YgKFRDSEFSX1QpKQotLQkJCSAgewotLQkJCSAgICBtZW1jcHkgKGZicCwgZHAtPnByZWNpc2lvbl9zdGFydCwgbiAqIHNpemVvZiAoVENIQVJfVCkpOwotLQkJCSAgICBmYnAgKz0gbjsKLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICB7Ci0tCQkJICAgIGNvbnN0IEZDSEFSX1QgKm1wID0gZHAtPnByZWNpc2lvbl9zdGFydDsKLS0JCQkgICAgZG8KLS0JCQkgICAgICAqZmJwKysgPSAodW5zaWduZWQgY2hhcikgKm1wKys7Ci0tCQkJICAgIHdoaWxlICgtLW4gPiAwKTsKLS0JCQkgIH0KLS0JCSAgICAgIH0KLS0JCSAgfQotLQotLQkJc3dpdGNoICh0eXBlKQotLQkJICB7Ci0tI2lmIEhBVkVfTE9OR19MT05HX0lOVAotLQkJICBjYXNlIFRZUEVfTE9OR0xPTkdJTlQ6Ci0tCQkgIGNhc2UgVFlQRV9VTE9OR0xPTkdJTlQ6Ci0tIyBpZiAoZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18pICYmICEgZGVmaW5lZCBfX0NZR1dJTl9fCi0tCQkgICAgKmZicCsrID0gJ0knOwotLQkJICAgICpmYnArKyA9ICc2JzsKLS0JCSAgICAqZmJwKysgPSAnNCc7Ci0tCQkgICAgYnJlYWs7Ci0tIyBlbHNlCi0tCQkgICAgKmZicCsrID0gJ2wnOwotLQkJICAgIC8qRkFMTFRIUk9VR0gqLwotLSMgZW5kaWYKLS0jZW5kaWYKLS0JCSAgY2FzZSBUWVBFX0xPTkdJTlQ6Ci0tCQkgIGNhc2UgVFlQRV9VTE9OR0lOVDoKLS0jaWYgSEFWRV9XSU5UX1QKLS0JCSAgY2FzZSBUWVBFX1dJREVfQ0hBUjoKLS0jZW5kaWYKLS0jaWYgSEFWRV9XQ0hBUl9UCi0tCQkgIGNhc2UgVFlQRV9XSURFX1NUUklORzoKLS0jZW5kaWYKLS0JCSAgICAqZmJwKysgPSAnbCc7Ci0tCQkgICAgYnJlYWs7Ci0tCQkgIGNhc2UgVFlQRV9MT05HRE9VQkxFOgotLQkJICAgICpmYnArKyA9ICdMJzsKLS0JCSAgICBicmVhazsKLS0JCSAgZGVmYXVsdDoKLS0JCSAgICBicmVhazsKLS0JCSAgfQotLSNpZiBORUVEX1BSSU5URl9ESVJFQ1RJVkVfRgotLQkJaWYgKGRwLT5jb252ZXJzaW9uID09ICdGJykKLS0JCSAgKmZicCA9ICdmJzsKLS0JCWVsc2UKLS0jZW5kaWYKLS0JCSAgKmZicCA9IGRwLT5jb252ZXJzaW9uOwotLSNpZiBVU0VfU05QUklOVEYKLS0jIGlmICEoX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDMpKQotLQkJZmJwWzFdID0gJyUnOwotLQkJZmJwWzJdID0gJ24nOwotLQkJZmJwWzNdID0gJ1wwJzsKLS0jIGVsc2UKLS0JCS8qIE9uIGdsaWJjMiBzeXN0ZW1zIGZyb20gZ2xpYmMgPj0gMi4zIC0gcHJvYmFibHkgYWxzbyBvbGRlcgotLQkJICAgb25lcyAtIHdlIGtub3cgdGhhdCBzbnByaW50ZidzIHJldHVybnMgdmFsdWUgY29uZm9ybXMgdG8KLS0JCSAgIElTTyBDIDk5OiB0aGUgZ2xfU05QUklOVEZfRElSRUNUSVZFX04gdGVzdCBwYXNzZXMuCi0tCQkgICBUaGVyZWZvcmUgd2UgY2FuIGF2b2lkIHVzaW5nICVuIGluIHRoaXMgc2l0dWF0aW9uLgotLQkJICAgT24gZ2xpYmMyIHN5c3RlbXMgZnJvbSAyMDA0LTEwLTE4IG9yIG5ld2VyLCB0aGUgdXNlIG9mICVuCi0tCQkgICBpbiBmb3JtYXQgc3RyaW5ncyBpbiB3cml0YWJsZSBtZW1vcnkgbWF5IGNyYXNoIHRoZSBwcm9ncmFtCi0tCQkgICAoaWYgY29tcGlsZWQgd2l0aCBfRk9SVElGWV9TT1VSQ0U9MiksIHNvIHdlIHNob3VsZCBhdm9pZCBpdAotLQkJICAgaW4gdGhpcyBzaXR1YXRpb24uICAqLwotLQkJZmJwWzFdID0gJ1wwJzsKLS0jIGVuZGlmCi0tI2Vsc2UKLS0JCWZicFsxXSA9ICdcMCc7Ci0tI2VuZGlmCi0tCi0tCQkvKiBDb25zdHJ1Y3QgdGhlIGFyZ3VtZW50cyBmb3IgY2FsbGluZyBzbnByaW50ZiBvciBzcHJpbnRmLiAgKi8KLS0JCXByZWZpeF9jb3VudCA9IDA7Ci0tCQlpZiAoIXBhZF9vdXJzZWx2ZXMgJiYgZHAtPndpZHRoX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKLS0JCSAgewotLQkJICAgIGlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotLQkJICAgICAgYWJvcnQgKCk7Ci0tCQkgICAgcHJlZml4ZXNbcHJlZml4X2NvdW50KytdID0gYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0uYS5hX2ludDsKLS0JCSAgfQotLQkJaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ICE9IEFSR19OT05FKQotLQkJICB7Ci0tCQkgICAgaWYgKCEoYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotLQkJICAgICAgYWJvcnQgKCk7Ci0tCQkgICAgcHJlZml4ZXNbcHJlZml4X2NvdW50KytdID0gYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0tCQkgIH0KLS0KLS0jaWYgVVNFX1NOUFJJTlRGCi0tCQkvKiBUaGUgU05QUklOVEYgcmVzdWx0IGlzIGFwcGVuZGVkIGFmdGVyIHJlc3VsdFswLi5sZW5ndGhdLgotLQkJICAgVGhlIGxhdHRlciBpcyBhbiBhcnJheSBvZiBEQ0hBUl9UOyBTTlBSSU5URiBhcHBlbmRzIGFuCi0tCQkgICBhcnJheSBvZiBUQ0hBUl9UIHRvIGl0LiAgVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlCi0tCQkgICBzaXplb2YgKFRDSEFSX1QpIGRpdmlkZXMgc2l6ZW9mIChEQ0hBUl9UKSBhbmQKLS0JCSAgIGFsaWdub2YgKFRDSEFSX1QpIDw9IGFsaWdub2YgKERDSEFSX1QpLiAgKi8KLS0jIGRlZmluZSBUQ0hBUlNfUEVSX0RDSEFSIChzaXplb2YgKERDSEFSX1QpIC8gc2l6ZW9mIChUQ0hBUl9UKSkKLS0JCS8qIFByZXBhcmUgY2hlY2tpbmcgd2hldGhlciBzbnByaW50ZiByZXR1cm5zIHRoZSBjb3VudAotLQkJICAgdmlhICVuLiAgKi8KLS0JCUVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIDEpKTsKLS0JCSooVENIQVJfVCAqKSAocmVzdWx0ICsgbGVuZ3RoKSA9ICdcMCc7Ci0tI2VuZGlmCi0tCi0tCQlmb3IgKDs7KQotLQkJICB7Ci0tCQkgICAgaW50IGNvdW50ID0gLTE7Ci0tCi0tI2lmIFVTRV9TTlBSSU5URgotLQkJICAgIGludCByZXRjb3VudCA9IDA7Ci0tCQkgICAgc2l6ZV90IG1heGxlbiA9IGFsbG9jYXRlZCAtIGxlbmd0aDsKLS0JCSAgICAvKiBTTlBSSU5URiBjYW4gZmFpbCBpZiBpdHMgc2Vjb25kIGFyZ3VtZW50IGlzCi0tCQkgICAgICAgPiBJTlRfTUFYLiAgKi8KLS0JCSAgICBpZiAobWF4bGVuID4gSU5UX01BWCAvIFRDSEFSU19QRVJfRENIQVIpCi0tCQkgICAgICBtYXhsZW4gPSBJTlRfTUFYIC8gVENIQVJTX1BFUl9EQ0hBUjsKLS0JCSAgICBtYXhsZW4gPSBtYXhsZW4gKiBUQ0hBUlNfUEVSX0RDSEFSOwotLSMgZGVmaW5lIFNOUFJJTlRGX0JVRihhcmcpIFwKLS0JCSAgICBzd2l0Y2ggKHByZWZpeF9jb3VudCkJCQkJICAgIFwKLS0JCSAgICAgIHsJCQkJCQkJICAgIFwKLS0JCSAgICAgIGNhc2UgMDoJCQkJCQkgICAgXAotLQkJCXJldGNvdW50ID0gU05QUklOVEYgKChUQ0hBUl9UICopIChyZXN1bHQgKyBsZW5ndGgpLCBcCi0tCQkJCQkgICAgIG1heGxlbiwgYnVmLAkJICAgIFwKLS0JCQkJCSAgICAgYXJnLCAmY291bnQpOwkJICAgIFwKLS0JCQlicmVhazsJCQkJCQkgICAgXAotLQkJICAgICAgY2FzZSAxOgkJCQkJCSAgICBcCi0tCQkJcmV0Y291bnQgPSBTTlBSSU5URiAoKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCksIFwKLS0JCQkJCSAgICAgbWF4bGVuLCBidWYsCQkgICAgXAotLQkJCQkJICAgICBwcmVmaXhlc1swXSwgYXJnLCAmY291bnQpOwkgICAgXAotLQkJCWJyZWFrOwkJCQkJCSAgICBcCi0tCQkgICAgICBjYXNlIDI6CQkJCQkJICAgIFwKLS0JCQlyZXRjb3VudCA9IFNOUFJJTlRGICgoVENIQVJfVCAqKSAocmVzdWx0ICsgbGVuZ3RoKSwgXAotLQkJCQkJICAgICBtYXhsZW4sIGJ1ZiwJCSAgICBcCi0tCQkJCQkgICAgIHByZWZpeGVzWzBdLCBwcmVmaXhlc1sxXSwgYXJnLCBcCi0tCQkJCQkgICAgICZjb3VudCk7CQkJICAgIFwKLS0JCQlicmVhazsJCQkJCQkgICAgXAotLQkJICAgICAgZGVmYXVsdDoJCQkJCQkgICAgXAotLQkJCWFib3J0ICgpOwkJCQkJICAgIFwKLS0JCSAgICAgIH0KLS0jZWxzZQotLSMgZGVmaW5lIFNOUFJJTlRGX0JVRihhcmcpIFwKLS0JCSAgICBzd2l0Y2ggKHByZWZpeF9jb3VudCkJCQkJICAgIFwKLS0JCSAgICAgIHsJCQkJCQkJICAgIFwKLS0JCSAgICAgIGNhc2UgMDoJCQkJCQkgICAgXAotLQkJCWNvdW50ID0gc3ByaW50ZiAodG1wLCBidWYsIGFyZyk7CQkgICAgXAotLQkJCWJyZWFrOwkJCQkJCSAgICBcCi0tCQkgICAgICBjYXNlIDE6CQkJCQkJICAgIFwKLS0JCQljb3VudCA9IHNwcmludGYgKHRtcCwgYnVmLCBwcmVmaXhlc1swXSwgYXJnKTsJICAgIFwKLS0JCQlicmVhazsJCQkJCQkgICAgXAotLQkJICAgICAgY2FzZSAyOgkJCQkJCSAgICBcCi0tCQkJY291bnQgPSBzcHJpbnRmICh0bXAsIGJ1ZiwgcHJlZml4ZXNbMF0sIHByZWZpeGVzWzFdLFwKLS0JCQkJCSBhcmcpOwkJCQkgICAgXAotLQkJCWJyZWFrOwkJCQkJCSAgICBcCi0tCQkgICAgICBkZWZhdWx0OgkJCQkJCSAgICBcCi0tCQkJYWJvcnQgKCk7CQkJCQkgICAgXAotLQkJICAgICAgfQotLSNlbmRpZgotLQotLQkJICAgIHN3aXRjaCAodHlwZSkKLS0JCSAgICAgIHsKLS0JCSAgICAgIGNhc2UgVFlQRV9TQ0hBUjoKLS0JCQl7Ci0tCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3NjaGFyOwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0JCSAgICAgIGNhc2UgVFlQRV9VQ0hBUjoKLS0JCQl7Ci0tCQkJICB1bnNpZ25lZCBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3VjaGFyOwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0JCSAgICAgIGNhc2UgVFlQRV9TSE9SVDoKLS0JCQl7Ci0tCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3Nob3J0OwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0JCSAgICAgIGNhc2UgVFlQRV9VU0hPUlQ6Ci0tCQkJewotLQkJCSAgdW5zaWduZWQgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91c2hvcnQ7Ci0tCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0tCQkJfQotLQkJCWJyZWFrOwotLQkJICAgICAgY2FzZSBUWVBFX0lOVDoKLS0JCQl7Ci0tCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2ludDsKLS0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLS0JCQl9Ci0tCQkJYnJlYWs7Ci0tCQkgICAgICBjYXNlIFRZUEVfVUlOVDoKLS0JCQl7Ci0tCQkJICB1bnNpZ25lZCBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3VpbnQ7Ci0tCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0tCQkJfQotLQkJCWJyZWFrOwotLQkJICAgICAgY2FzZSBUWVBFX0xPTkdJTlQ6Ci0tCQkJewotLQkJCSAgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdpbnQ7Ci0tCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0tCQkJfQotLQkJCWJyZWFrOwotLQkJICAgICAgY2FzZSBUWVBFX1VMT05HSU5UOgotLQkJCXsKLS0JCQkgIHVuc2lnbmVkIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91bG9uZ2ludDsKLS0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLS0JCQl9Ci0tCQkJYnJlYWs7Ci0tI2lmIEhBVkVfTE9OR19MT05HX0lOVAotLQkJICAgICAgY2FzZSBUWVBFX0xPTkdMT05HSU5UOgotLQkJCXsKLS0JCQkgIGxvbmcgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdsb25naW50OwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0JCSAgICAgIGNhc2UgVFlQRV9VTE9OR0xPTkdJTlQ6Ci0tCQkJewotLQkJCSAgdW5zaWduZWQgbG9uZyBsb25nIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdWxvbmdsb25naW50OwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0jZW5kaWYKLS0JCSAgICAgIGNhc2UgVFlQRV9ET1VCTEU6Ci0tCQkJewotLQkJCSAgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9kb3VibGU7Ci0tCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0tCQkJfQotLQkJCWJyZWFrOwotLQkJICAgICAgY2FzZSBUWVBFX0xPTkdET1VCTEU6Ci0tCQkJewotLQkJCSAgbG9uZyBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdkb3VibGU7Ci0tCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0tCQkJfQotLQkJCWJyZWFrOwotLQkJICAgICAgY2FzZSBUWVBFX0NIQVI6Ci0tCQkJewotLQkJCSAgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jaGFyOwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0jaWYgSEFWRV9XSU5UX1QKLS0JCSAgICAgIGNhc2UgVFlQRV9XSURFX0NIQVI6Ci0tCQkJewotLQkJCSAgd2ludF90IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV93aWRlX2NoYXI7Ci0tCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0tCQkJfQotLQkJCWJyZWFrOwotLSNlbmRpZgotLQkJICAgICAgY2FzZSBUWVBFX1NUUklORzoKLS0JCQl7Ci0tCQkJICBjb25zdCBjaGFyICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc3RyaW5nOwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0jaWYgSEFWRV9XQ0hBUl9UCi0tCQkgICAgICBjYXNlIFRZUEVfV0lERV9TVFJJTkc6Ci0tCQkJewotLQkJCSAgY29uc3Qgd2NoYXJfdCAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3dpZGVfc3RyaW5nOwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0jZW5kaWYKLS0JCSAgICAgIGNhc2UgVFlQRV9QT0lOVEVSOgotLQkJCXsKLS0JCQkgIHZvaWQgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9wb2ludGVyOwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0JCSAgICAgIGRlZmF1bHQ6Ci0tCQkJYWJvcnQgKCk7Ci0tCQkgICAgICB9Ci0tCi0tI2lmIFVTRV9TTlBSSU5URgotLQkJICAgIC8qIFBvcnRhYmlsaXR5OiBOb3QgYWxsIGltcGxlbWVudGF0aW9ucyBvZiBzbnByaW50ZigpCi0tCQkgICAgICAgYXJlIElTTyBDIDk5IGNvbXBsaWFudC4gIERldGVybWluZSB0aGUgbnVtYmVyIG9mCi0tCQkgICAgICAgYnl0ZXMgdGhhdCBzbnByaW50ZigpIGhhcyBwcm9kdWNlZCBvciB3b3VsZCBoYXZlCi0tCQkgICAgICAgcHJvZHVjZWQuICAqLwotLQkJICAgIGlmIChjb3VudCA+PSAwKQotLQkJICAgICAgewotLQkJCS8qIFZlcmlmeSB0aGF0IHNucHJpbnRmKCkgaGFzIE5VTC10ZXJtaW5hdGVkIGl0cwotLQkJCSAgIHJlc3VsdC4gICovCi0tCQkJaWYgKGNvdW50IDwgbWF4bGVuCi0tCQkJICAgICYmICgoVENIQVJfVCAqKSAocmVzdWx0ICsgbGVuZ3RoKSkgW2NvdW50XSAhPSAnXDAnKQotLQkJCSAgYWJvcnQgKCk7Ci0tCQkJLyogUG9ydGFiaWxpdHkgaGFjay4gICovCi0tCQkJaWYgKHJldGNvdW50ID4gY291bnQpCi0tCQkJICBjb3VudCA9IHJldGNvdW50OwotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQkvKiBzbnByaW50ZigpIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgJyVuJwotLQkJCSAgIGRpcmVjdGl2ZS4gICovCi0tCQkJaWYgKGZicFsxXSAhPSAnXDAnKQotLQkJCSAgewotLQkJCSAgICAvKiBEb24ndCB1c2UgdGhlICclbicgZGlyZWN0aXZlOyBpbnN0ZWFkLCBsb29rCi0tCQkJICAgICAgIGF0IHRoZSBzbnByaW50ZigpIHJldHVybiB2YWx1ZS4gICovCi0tCQkJICAgIGZicFsxXSA9ICdcMCc7Ci0tCQkJICAgIGNvbnRpbnVlOwotLQkJCSAgfQotLQkJCWVsc2UKLS0JCQkgIHsKLS0JCQkgICAgLyogTG9vayBhdCB0aGUgc25wcmludGYoKSByZXR1cm4gdmFsdWUuICAqLwotLQkJCSAgICBpZiAocmV0Y291bnQgPCAwKQotLQkJCSAgICAgIHsKLS0JCQkJLyogSFAtVVggMTAuMjAgc25wcmludGYoKSBpcyBkb3VibHkgZGVmaWNpZW50OgotLQkJCQkgICBJdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlICclbicgZGlyZWN0aXZlLAotLQkJCQkgICAqYW5kKiBpdCByZXR1cm5zIC0xIChyYXRoZXIgdGhhbiB0aGUgbGVuZ3RoCi0tCQkJCSAgIHRoYXQgd291bGQgaGF2ZSBiZWVuIHJlcXVpcmVkKSB3aGVuIHRoZQotLQkJCQkgICBidWZmZXIgaXMgdG9vIHNtYWxsLiAgKi8KLS0JCQkJc2l6ZV90IGJpZ2dlcl9uZWVkID0KLS0JCQkJICB4c3VtICh4dGltZXMgKGFsbG9jYXRlZCwgMiksIDEyKTsKLS0JCQkJRU5TVVJFX0FMTE9DQVRJT04gKGJpZ2dlcl9uZWVkKTsKLS0JCQkJY29udGludWU7Ci0tCQkJICAgICAgfQotLQkJCSAgICBlbHNlCi0tCQkJICAgICAgY291bnQgPSByZXRjb3VudDsKLS0JCQkgIH0KLS0JCSAgICAgIH0KLS0jZW5kaWYKLS0KLS0JCSAgICAvKiBBdHRlbXB0IHRvIGhhbmRsZSBmYWlsdXJlLiAgKi8KLS0JCSAgICBpZiAoY291bnQgPCAwKQotLQkJICAgICAgewotLQkJCWlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotLQkJCSAgZnJlZSAocmVzdWx0KTsKLS0JCQlpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0tCQkJICBmcmVlIChidWZfbWFsbG9jZWQpOwotLQkJCUNMRUFOVVAgKCk7Ci0tCQkJZXJybm8gPSBFSU5WQUw7Ci0tCQkJcmV0dXJuIE5VTEw7Ci0tCQkgICAgICB9Ci0tCi0tI2lmIFVTRV9TTlBSSU5URgotLQkJICAgIC8qIEhhbmRsZSBvdmVyZmxvdyBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KLS0JCSAgICAgICBJZiBzdWNoIGFuIG92ZXJmbG93IG9jY3VycywgYSBDOTkgY29tcGxpYW50IHNucHJpbnRmKCkKLS0JCSAgICAgICByZXR1cm5zIGEgY291bnQgPj0gbWF4bGVuLiAgSG93ZXZlciwgYSBub24tY29tcGxpYW50Ci0tCQkgICAgICAgc25wcmludGYoKSBmdW5jdGlvbiByZXR1cm5zIG9ubHkgY291bnQgPSBtYXhsZW4gLSAxLiAgVG8KLS0JCSAgICAgICBjb3ZlciBib3RoIGNhc2VzLCB0ZXN0IHdoZXRoZXIgY291bnQgPj0gbWF4bGVuIC0gMS4gICovCi0tCQkgICAgaWYgKCh1bnNpZ25lZCBpbnQpIGNvdW50ICsgMSA+PSBtYXhsZW4pCi0tCQkgICAgICB7Ci0tCQkJLyogSWYgbWF4bGVuIGFscmVhZHkgaGFzIGF0dGFpbmVkIGl0cyBhbGxvd2VkIG1heGltdW0sCi0tCQkJICAgYWxsb2NhdGluZyBtb3JlIG1lbW9yeSB3aWxsIG5vdCBpbmNyZWFzZSBtYXhsZW4uCi0tCQkJICAgSW5zdGVhZCBvZiBsb29waW5nLCBiYWlsIG91dC4gICovCi0tCQkJaWYgKG1heGxlbiA9PSBJTlRfTUFYIC8gVENIQVJTX1BFUl9EQ0hBUikKLS0JCQkgIGdvdG8gb3ZlcmZsb3c7Ci0tCQkJZWxzZQotLQkJCSAgewotLQkJCSAgICAvKiBOZWVkIGF0IGxlYXN0IGNvdW50ICogc2l6ZW9mIChUQ0hBUl9UKSBieXRlcy4KLS0JCQkgICAgICAgQnV0IGFsbG9jYXRlIHByb3BvcnRpb25hbGx5LCB0byBhdm9pZCBsb29waW5nCi0tCQkJICAgICAgIGV0ZXJuYWxseSBpZiBzbnByaW50ZigpIHJlcG9ydHMgYSB0b28gc21hbGwKLS0JCQkgICAgICAgY291bnQuICAqLwotLQkJCSAgICBzaXplX3QgbiA9Ci0tCQkJICAgICAgeG1heCAoeHN1bSAobGVuZ3RoLAotLQkJCQkJICAoY291bnQgKyBUQ0hBUlNfUEVSX0RDSEFSIC0gMSkKLS0JCQkJCSAgLyBUQ0hBUlNfUEVSX0RDSEFSKSwKLS0JCQkJICAgIHh0aW1lcyAoYWxsb2NhdGVkLCAyKSk7Ci0tCi0tCQkJICAgIEVOU1VSRV9BTExPQ0FUSU9OIChuKTsKLS0JCQkgICAgY29udGludWU7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tI2VuZGlmCi0tCi0tI2lmIE5FRURfUFJJTlRGX1VOQk9VTkRFRF9QUkVDSVNJT04KLS0JCSAgICBpZiAocHJlY19vdXJzZWx2ZXMpCi0tCQkgICAgICB7Ci0tCQkJLyogSGFuZGxlIHRoZSBwcmVjaXNpb24uICAqLwotLQkJCVRDSEFSX1QgKnByZWNfcHRyID0gCi0tIyBpZiBVU0VfU05QUklOVEYKLS0JCQkgIChUQ0hBUl9UICopIChyZXN1bHQgKyBsZW5ndGgpOwotLSMgZWxzZQotLQkJCSAgdG1wOwotLSMgZW5kaWYKLS0JCQlzaXplX3QgcHJlZml4X2NvdW50OwotLQkJCXNpemVfdCBtb3ZlOwotLQotLQkJCXByZWZpeF9jb3VudCA9IDA7Ci0tCQkJLyogUHV0IHRoZSBhZGRpdGlvbmFsIHplcm9lcyBhZnRlciB0aGUgc2lnbi4gICovCi0tCQkJaWYgKGNvdW50ID49IDEKLS0JCQkgICAgJiYgKCpwcmVjX3B0ciA9PSAnLScgfHwgKnByZWNfcHRyID09ICcrJwotLQkJCQl8fCAqcHJlY19wdHIgPT0gJyAnKSkKLS0JCQkgIHByZWZpeF9jb3VudCA9IDE7Ci0tCQkJLyogUHV0IHRoZSBhZGRpdGlvbmFsIHplcm9lcyBhZnRlciB0aGUgMHggcHJlZml4IGlmCi0tCQkJICAgKGZsYWdzICYgRkxBR19BTFQpIHx8IChkcC0+Y29udmVyc2lvbiA9PSAncCcpLiAgKi8KLS0JCQllbHNlIGlmIChjb3VudCA+PSAyCi0tCQkJCSAmJiBwcmVjX3B0clswXSA9PSAnMCcKLS0JCQkJICYmIChwcmVjX3B0clsxXSA9PSAneCcgfHwgcHJlY19wdHJbMV0gPT0gJ1gnKSkKLS0JCQkgIHByZWZpeF9jb3VudCA9IDI7Ci0tCi0tCQkJbW92ZSA9IGNvdW50IC0gcHJlZml4X2NvdW50OwotLQkJCWlmIChwcmVjaXNpb24gPiBtb3ZlKQotLQkJCSAgewotLQkJCSAgICAvKiBJbnNlcnQgemVyb2VzLiAgKi8KLS0JCQkgICAgc2l6ZV90IGluc2VydCA9IHByZWNpc2lvbiAtIG1vdmU7Ci0tCQkJICAgIFRDSEFSX1QgKnByZWNfZW5kOwotLQotLSMgaWYgVVNFX1NOUFJJTlRGCi0tCQkJICAgIHNpemVfdCBuID0KLS0JCQkgICAgICB4c3VtIChsZW5ndGgsCi0tCQkJCSAgICAoY291bnQgKyBpbnNlcnQgKyBUQ0hBUlNfUEVSX0RDSEFSIC0gMSkKLS0JCQkJICAgIC8gVENIQVJTX1BFUl9EQ0hBUik7Ci0tCQkJICAgIGxlbmd0aCArPSAoY291bnQgKyBUQ0hBUlNfUEVSX0RDSEFSIC0gMSkgLyBUQ0hBUlNfUEVSX0RDSEFSOwotLQkJCSAgICBFTlNVUkVfQUxMT0NBVElPTiAobik7Ci0tCQkJICAgIGxlbmd0aCAtPSAoY291bnQgKyBUQ0hBUlNfUEVSX0RDSEFSIC0gMSkgLyBUQ0hBUlNfUEVSX0RDSEFSOwotLQkJCSAgICBwcmVjX3B0ciA9IChUQ0hBUl9UICopIChyZXN1bHQgKyBsZW5ndGgpOwotLSMgZW5kaWYKLS0KLS0JCQkgICAgcHJlY19lbmQgPSBwcmVjX3B0ciArIGNvdW50OwotLQkJCSAgICBwcmVjX3B0ciArPSBwcmVmaXhfY291bnQ7Ci0tCi0tCQkJICAgIHdoaWxlIChwcmVjX2VuZCA+IHByZWNfcHRyKQotLQkJCSAgICAgIHsKLS0JCQkJcHJlY19lbmQtLTsKLS0JCQkJcHJlY19lbmRbaW5zZXJ0XSA9IHByZWNfZW5kWzBdOwotLQkJCSAgICAgIH0KLS0KLS0JCQkgICAgcHJlY19lbmQgKz0gaW5zZXJ0OwotLQkJCSAgICBkbwotLQkJCSAgICAgICotLXByZWNfZW5kID0gJzAnOwotLQkJCSAgICB3aGlsZSAocHJlY19lbmQgPiBwcmVjX3B0cik7Ci0tCi0tCQkJICAgIGNvdW50ICs9IGluc2VydDsKLS0JCQkgIH0KLS0JCSAgICAgIH0KLS0jZW5kaWYKLS0KLS0jaWYgIURDSEFSX0lTX1RDSEFSCi0tIyBpZiAhVVNFX1NOUFJJTlRGCi0tCQkgICAgaWYgKGNvdW50ID49IHRtcF9sZW5ndGgpCi0tCQkgICAgICAvKiB0bXBfbGVuZ3RoIHdhcyBpbmNvcnJlY3RseSBjYWxjdWxhdGVkIC0gZml4IHRoZQotLQkJCSBjb2RlIGFib3ZlISAgKi8KLS0JCSAgICAgIGFib3J0ICgpOwotLSMgZW5kaWYKLS0KLS0JCSAgICAvKiBDb252ZXJ0IGZyb20gVENIQVJfVFtdIHRvIERDSEFSX1RbXS4gICovCi0tCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID09ICdjJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAncycpCi0tCQkgICAgICB7Ci0tCQkJLyogdHlwZSA9IFRZUEVfQ0hBUiBvciBUWVBFX1dJREVfQ0hBUiBvciBUWVBFX1NUUklORwotLQkJCSAgIFRZUEVfV0lERV9TVFJJTkcuCi0tCQkJICAgVGhlIHJlc3VsdCBzdHJpbmcgaXMgbm90IGNlcnRhaW5seSBBU0NJSS4gICovCi0tCQkJY29uc3QgVENIQVJfVCAqdG1wc3JjOwotLQkJCURDSEFSX1QgKnRtcGRzdDsKLS0JCQlzaXplX3QgdG1wZHN0X2xlbjsKLS0JCQkvKiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IFRDSEFSX1QgaXMgJ2NoYXInLiAgKi8KLS0JCQl0eXBlZGVmIGludCBUQ0hBUl9UX3ZlcmlmeQotLQkJCQkgICAgWzIgKiAoc2l6ZW9mIChUQ0hBUl9UKSA9PSAxKSAtIDFdOwotLSMgaWYgVVNFX1NOUFJJTlRGCi0tCQkJdG1wc3JjID0gKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCk7Ci0tIyBlbHNlCi0tCQkJdG1wc3JjID0gdG1wOwotLSMgZW5kaWYKLS0JCQl0bXBkc3QgPSBOVUxMOwotLQkJCXRtcGRzdF9sZW4gPSAwOwotLQkJCWlmIChEQ0hBUl9DT05WX0ZST01fRU5DT0RJTkcgKGxvY2FsZV9jaGFyc2V0ICgpLAotLQkJCQkJCSAgICAgIGljb252ZWhfcXVlc3Rpb25fbWFyaywKLS0JCQkJCQkgICAgICB0bXBzcmMsIGNvdW50LAotLQkJCQkJCSAgICAgIE5VTEwsCi0tCQkJCQkJICAgICAgJnRtcGRzdCwgJnRtcGRzdF9sZW4pCi0tCQkJICAgIDwgMCkKLS0JCQkgIHsKLS0JCQkgICAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87Ci0tCQkJICAgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotLQkJCSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0tCQkJICAgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLS0JCQkgICAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotLQkJCSAgICBDTEVBTlVQICgpOwotLQkJCSAgICBlcnJubyA9IHNhdmVkX2Vycm5vOwotLQkJCSAgICByZXR1cm4gTlVMTDsKLS0JCQkgIH0KLS0JCQlFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCB0bXBkc3RfbGVuKSk7Ci0tCQkJRENIQVJfQ1BZIChyZXN1bHQgKyBsZW5ndGgsIHRtcGRzdCwgdG1wZHN0X2xlbik7Ci0tCQkJZnJlZSAodG1wZHN0KTsKLS0JCQljb3VudCA9IHRtcGRzdF9sZW47Ci0tCQkgICAgICB9Ci0tCQkgICAgZWxzZQotLQkJICAgICAgewotLQkJCS8qIFRoZSByZXN1bHQgc3RyaW5nIGlzIEFTQ0lJLgotLQkJCSAgIFNpbXBsZSAxOjEgY29udmVyc2lvbi4gICovCi0tIyBpZiBVU0VfU05QUklOVEYKLS0JCQkvKiBJZiBzaXplb2YgKERDSEFSX1QpID09IHNpemVvZiAoVENIQVJfVCksIGl0J3MgYQotLQkJCSAgIG5vLW9wIGNvbnZlcnNpb24sIGluLXBsYWNlIG9uIHRoZSBhcnJheSBzdGFydGluZwotLQkJCSAgIGF0IChyZXN1bHQgKyBsZW5ndGgpLiAgKi8KLS0JCQlpZiAoc2l6ZW9mIChEQ0hBUl9UKSAhPSBzaXplb2YgKFRDSEFSX1QpKQotLSMgZW5kaWYKLS0JCQkgIHsKLS0JCQkgICAgY29uc3QgVENIQVJfVCAqdG1wc3JjOwotLQkJCSAgICBEQ0hBUl9UICp0bXBkc3Q7Ci0tCQkJICAgIHNpemVfdCBuOwotLQotLSMgaWYgVVNFX1NOUFJJTlRGCi0tCQkJICAgIGlmIChyZXN1bHQgPT0gcmVzdWx0YnVmKQotLQkJCSAgICAgIHsKLS0JCQkJdG1wc3JjID0gKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCk7Ci0tCQkJCS8qIEVOU1VSRV9BTExPQ0FUSU9OIHdpbGwgbm90IG1vdmUgdG1wc3JjCi0tCQkJCSAgIChiZWNhdXNlIGl0J3MgcGFydCBvZiByZXN1bHRidWYpLiAgKi8KLS0JCQkJRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgY291bnQpKTsKLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UKLS0JCQkgICAgICB7Ci0tCQkJCS8qIEVOU1VSRV9BTExPQ0FUSU9OIHdpbGwgbW92ZSB0aGUgYXJyYXkKLS0JCQkJICAgKGJlY2F1c2UgaXQgdXNlcyByZWFsbG9jKCkuICAqLwotLQkJCQlFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBjb3VudCkpOwotLQkJCQl0bXBzcmMgPSAoVENIQVJfVCAqKSAocmVzdWx0ICsgbGVuZ3RoKTsKLS0JCQkgICAgICB9Ci0tIyBlbHNlCi0tCQkJICAgIHRtcHNyYyA9IHRtcDsKLS0JCQkgICAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgY291bnQpKTsKLS0jIGVuZGlmCi0tCQkJICAgIHRtcGRzdCA9IHJlc3VsdCArIGxlbmd0aDsKLS0JCQkgICAgLyogQ29weSBiYWNrd2FyZHMsIGJlY2F1c2Ugb2Ygb3ZlcmxhcHBpbmcuICAqLwotLQkJCSAgICB0bXBzcmMgKz0gY291bnQ7Ci0tCQkJICAgIHRtcGRzdCArPSBjb3VudDsKLS0JCQkgICAgZm9yIChuID0gY291bnQ7IG4gPiAwOyBuLS0pCi0tCQkJICAgICAgKi0tdG1wZHN0ID0gKHVuc2lnbmVkIGNoYXIpICotLXRtcHNyYzsKLS0JCQkgIH0KLS0JCSAgICAgIH0KLS0jZW5kaWYKLS0KLS0jaWYgRENIQVJfSVNfVENIQVIgJiYgIVVTRV9TTlBSSU5URgotLQkJICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIHJlc3VsdC4gICovCi0tCQkgICAgaWYgKGNvdW50ID4gYWxsb2NhdGVkIC0gbGVuZ3RoKQotLQkJICAgICAgewotLQkJCS8qIE5lZWQgYXQgbGVhc3QgY291bnQgZWxlbWVudHMuICBCdXQgYWxsb2NhdGUKLS0JCQkgICBwcm9wb3J0aW9uYWxseS4gICovCi0tCQkJc2l6ZV90IG4gPQotLQkJCSAgeG1heCAoeHN1bSAobGVuZ3RoLCBjb3VudCksIHh0aW1lcyAoYWxsb2NhdGVkLCAyKSk7Ci0tCi0tCQkJRU5TVVJFX0FMTE9DQVRJT04gKG4pOwotLQkJICAgICAgfQotLSNlbmRpZgotLQotLQkJICAgIC8qIEhlcmUgY291bnQgPD0gYWxsb2NhdGVkIC0gbGVuZ3RoLiAgKi8KLS0KLS0JCSAgICAvKiBQZXJmb3JtIHBhZGRpbmcuICAqLwotLSNpZiAhRENIQVJfSVNfVENIQVIgfHwgRU5BQkxFX1VOSVNURElPIHx8IE5FRURfUFJJTlRGX0ZMQUdfWkVSTyB8fCBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0tCQkgICAgaWYgKHBhZF9vdXJzZWx2ZXMgJiYgaGFzX3dpZHRoKQotLQkJICAgICAgewotLQkJCXNpemVfdCB3OwotLSMgaWYgRU5BQkxFX1VOSVNURElPCi0tCQkJLyogT3V0c2lkZSBQT1NJWCwgaXQncyBwcmVmZXJyYWJsZSB0byBjb21wYXJlIHRoZSB3aWR0aAotLQkJCSAgIGFnYWluc3QgdGhlIG51bWJlciBvZiBfY2hhcmFjdGVyc18gb2YgdGhlIGNvbnZlcnRlZAotLQkJCSAgIHZhbHVlLiAgKi8KLS0JCQl3ID0gRENIQVJfTUJTTkxFTiAocmVzdWx0ICsgbGVuZ3RoLCBjb3VudCk7Ci0tIyBlbHNlCi0tCQkJLyogVGhlIHdpZHRoIGlzIGNvbXBhcmVkIGFnYWluc3QgdGhlIG51bWJlciBvZiBfYnl0ZXNfCi0tCQkJICAgb2YgdGhlIGNvbnZlcnRlZCB2YWx1ZSwgc2F5cyBQT1NJWC4gICovCi0tCQkJdyA9IGNvdW50OwotLSMgZW5kaWYKLS0JCQlpZiAodyA8IHdpZHRoKQotLQkJCSAgewotLQkJCSAgICBzaXplX3QgcGFkID0gd2lkdGggLSB3OwotLSMgaWYgVVNFX1NOUFJJTlRGCi0tCQkJICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIHJlc3VsdC4gICovCi0tCQkJICAgIGlmICh4c3VtIChjb3VudCwgcGFkKSA+IGFsbG9jYXRlZCAtIGxlbmd0aCkKLS0JCQkgICAgICB7Ci0tCQkJCS8qIE5lZWQgYXQgbGVhc3QgY291bnQgKyBwYWQgZWxlbWVudHMuICBCdXQKLS0JCQkJICAgYWxsb2NhdGUgcHJvcG9ydGlvbmFsbHkuICAqLwotLQkJCQlzaXplX3QgbiA9Ci0tCQkJCSAgeG1heCAoeHN1bTMgKGxlbmd0aCwgY291bnQsIHBhZCksCi0tCQkJCQl4dGltZXMgKGFsbG9jYXRlZCwgMikpOwotLQotLQkJCQlsZW5ndGggKz0gY291bnQ7Ci0tCQkJCUVOU1VSRV9BTExPQ0FUSU9OIChuKTsKLS0JCQkJbGVuZ3RoIC09IGNvdW50OwotLQkJCSAgICAgIH0KLS0JCQkgICAgLyogSGVyZSBjb3VudCArIHBhZCA8PSBhbGxvY2F0ZWQgLSBsZW5ndGguICAqLwotLSMgZW5kaWYKLS0JCQkgICAgewotLSMgaWYgIURDSEFSX0lTX1RDSEFSIHx8IFVTRV9TTlBSSU5URgotLQkJCSAgICAgIERDSEFSX1QgKiBjb25zdCBycCA9IHJlc3VsdCArIGxlbmd0aDsKLS0jIGVsc2UKLS0JCQkgICAgICBEQ0hBUl9UICogY29uc3QgcnAgPSB0bXA7Ci0tIyBlbmRpZgotLQkJCSAgICAgIERDSEFSX1QgKnAgPSBycCArIGNvdW50OwotLQkJCSAgICAgIERDSEFSX1QgKmVuZCA9IHAgKyBwYWQ7Ci0tIyBpZiBORUVEX1BSSU5URl9GTEFHX1pFUk8KLS0JCQkgICAgICBEQ0hBUl9UICpwYWRfcHRyOwotLSMgIGlmICFEQ0hBUl9JU19UQ0hBUgotLQkJCSAgICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnYycKLS0JCQkJICB8fCBkcC0+Y29udmVyc2lvbiA9PSAncycpCi0tCQkJCS8qIE5vIHplcm8tcGFkZGluZyBmb3Igc3RyaW5nIGRpcmVjdGl2ZXMuICAqLwotLQkJCQlwYWRfcHRyID0gTlVMTDsKLS0JCQkgICAgICBlbHNlCi0tIyAgZW5kaWYKLS0JCQkJewotLQkJCQkgIHBhZF9wdHIgPSAoKnJwID09ICctJyA/IHJwICsgMSA6IHJwKTsKLS0JCQkJICAvKiBObyB6ZXJvLXBhZGRpbmcgb2YgImluZiIgYW5kICJuYW4iLiAgKi8KLS0JCQkJICBpZiAoKCpwYWRfcHRyID49ICdBJyAmJiAqcGFkX3B0ciA8PSAnWicpCi0tCQkJCSAgICAgIHx8ICgqcGFkX3B0ciA+PSAnYScgJiYgKnBhZF9wdHIgPD0gJ3onKSkKLS0JCQkJICAgIHBhZF9wdHIgPSBOVUxMOwotLQkJCQl9Ci0tIyBlbmRpZgotLQkJCSAgICAgIC8qIFRoZSBnZW5lcmF0ZWQgc3RyaW5nIG5vdyBleHRlbmRzIGZyb20gcnAgdG8gcCwKLS0JCQkJIHdpdGggdGhlIHplcm8gcGFkZGluZyBpbnNlcnRpb24gcG9pbnQgYmVpbmcgYXQKLS0JCQkJIHBhZF9wdHIuICAqLwotLQotLQkJCSAgICAgIGNvdW50ID0gY291bnQgKyBwYWQ7IC8qID0gZW5kIC0gcnAgKi8KLS0KLS0JCQkgICAgICBpZiAoZmxhZ3MgJiBGTEFHX0xFRlQpCi0tCQkJCXsKLS0JCQkJICAvKiBQYWQgd2l0aCBzcGFjZXMgb24gdGhlIHJpZ2h0LiAgKi8KLS0JCQkJICBmb3IgKDsgcGFkID4gMDsgcGFkLS0pCi0tCQkJCSAgICAqcCsrID0gJyAnOwotLQkJCQl9Ci0tIyBpZiBORUVEX1BSSU5URl9GTEFHX1pFUk8KLS0JCQkgICAgICBlbHNlIGlmICgoZmxhZ3MgJiBGTEFHX1pFUk8pICYmIHBhZF9wdHIgIT0gTlVMTCkKLS0JCQkJewotLQkJCQkgIC8qIFBhZCB3aXRoIHplcm9lcy4gICovCi0tCQkJCSAgRENIQVJfVCAqcSA9IGVuZDsKLS0KLS0JCQkJICB3aGlsZSAocCA+IHBhZF9wdHIpCi0tCQkJCSAgICAqLS1xID0gKi0tcDsKLS0JCQkJICBmb3IgKDsgcGFkID4gMDsgcGFkLS0pCi0tCQkJCSAgICAqcCsrID0gJzAnOwotLQkJCQl9Ci0tIyBlbmRpZgotLQkJCSAgICAgIGVsc2UKLS0JCQkJewotLQkJCQkgIC8qIFBhZCB3aXRoIHNwYWNlcyBvbiB0aGUgbGVmdC4gICovCi0tCQkJCSAgRENIQVJfVCAqcSA9IGVuZDsKLS0KLS0JCQkJICB3aGlsZSAocCA+IHJwKQotLQkJCQkgICAgKi0tcSA9ICotLXA7Ci0tCQkJCSAgZm9yICg7IHBhZCA+IDA7IHBhZC0tKQotLQkJCQkgICAgKnArKyA9ICcgJzsKLS0JCQkJfQotLQkJCSAgICB9Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tI2VuZGlmCi0tCi0tI2lmIERDSEFSX0lTX1RDSEFSICYmICFVU0VfU05QUklOVEYKLS0JCSAgICBpZiAoY291bnQgPj0gdG1wX2xlbmd0aCkKLS0JCSAgICAgIC8qIHRtcF9sZW5ndGggd2FzIGluY29ycmVjdGx5IGNhbGN1bGF0ZWQgLSBmaXggdGhlCi0tCQkJIGNvZGUgYWJvdmUhICAqLwotLQkJICAgICAgYWJvcnQgKCk7Ci0tI2VuZGlmCi0tCi0tCQkgICAgLyogSGVyZSBzdGlsbCBjb3VudCA8PSBhbGxvY2F0ZWQgLSBsZW5ndGguICAqLwotLQotLSNpZiAhRENIQVJfSVNfVENIQVIgfHwgVVNFX1NOUFJJTlRGCi0tCQkgICAgLyogVGhlIHNucHJpbnRmKCkgcmVzdWx0IGRpZCBmaXQuICAqLwotLSNlbHNlCi0tCQkgICAgLyogQXBwZW5kIHRoZSBzcHJpbnRmKCkgcmVzdWx0LiAgKi8KLS0JCSAgICBtZW1jcHkgKHJlc3VsdCArIGxlbmd0aCwgdG1wLCBjb3VudCAqIHNpemVvZiAoRENIQVJfVCkpOwotLSNlbmRpZgotLSNpZiAhVVNFX1NOUFJJTlRGCi0tCQkgICAgaWYgKHRtcCAhPSB0bXBidWYpCi0tCQkgICAgICBmcmVlICh0bXApOwotLSNlbmRpZgotLQotLSNpZiBORUVEX1BSSU5URl9ESVJFQ1RJVkVfRgotLQkJICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnRicpCi0tCQkgICAgICB7Ci0tCQkJLyogQ29udmVydCB0aGUgJWYgcmVzdWx0IHRvIHVwcGVyIGNhc2UgZm9yICVGLiAgKi8KLS0JCQlEQ0hBUl9UICpycCA9IHJlc3VsdCArIGxlbmd0aDsKLS0JCQlzaXplX3QgcmM7Ci0tCQkJZm9yIChyYyA9IGNvdW50OyByYyA+IDA7IHJjLS0sIHJwKyspCi0tCQkJICBpZiAoKnJwID49ICdhJyAmJiAqcnAgPD0gJ3onKQotLQkJCSAgICAqcnAgPSAqcnAgLSAnYScgKyAnQSc7Ci0tCQkgICAgICB9Ci0tI2VuZGlmCi0tCi0tCQkgICAgbGVuZ3RoICs9IGNvdW50OwotLQkJICAgIGJyZWFrOwotLQkJICB9Ci0tCSAgICAgIH0KLS0JICB9Ci0tICAgICAgfQotLQotLSAgICAvKiBBZGQgdGhlIGZpbmFsIE5VTC4gICovCi0tICAgIEVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIDEpKTsKLS0gICAgcmVzdWx0W2xlbmd0aF0gPSAnXDAnOwotLQotLSAgICBpZiAocmVzdWx0ICE9IHJlc3VsdGJ1ZiAmJiBsZW5ndGggKyAxIDwgYWxsb2NhdGVkKQotLSAgICAgIHsKLS0JLyogU2hyaW5rIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGlmIHBvc3NpYmxlLiAgKi8KLS0JRENIQVJfVCAqbWVtb3J5OwotLQotLQltZW1vcnkgPSAoRENIQVJfVCAqKSByZWFsbG9jIChyZXN1bHQsIChsZW5ndGggKyAxKSAqIHNpemVvZiAoRENIQVJfVCkpOwotLQlpZiAobWVtb3J5ICE9IE5VTEwpCi0tCSAgcmVzdWx0ID0gbWVtb3J5OwotLSAgICAgIH0KLS0KLS0gICAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotLSAgICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0tICAgIENMRUFOVVAgKCk7Ci0tICAgICpsZW5ndGhwID0gbGVuZ3RoOwotLSAgICAvKiBOb3RlIHRoYXQgd2UgY2FuIHByb2R1Y2UgYSBiaWcgc3RyaW5nIG9mIGEgbGVuZ3RoID4gSU5UX01BWC4gIFBPU0lYCi0tICAgICAgIHNheXMgdGhhdCBzbnByaW50ZigpIGZhaWxzIHdpdGggZXJybm8gPSBFT1ZFUkZMT1cgaW4gdGhpcyBjYXNlLCBidXQKLS0gICAgICAgdGhhdCdzIG9ubHkgYmVjYXVzZSBzbnByaW50ZigpIHJldHVybnMgYW4gJ2ludCcuICBUaGlzIGZ1bmN0aW9uIGRvZXMKLS0gICAgICAgbm90IGhhdmUgdGhpcyBsaW1pdGF0aW9uLiAgKi8KLS0gICAgcmV0dXJuIHJlc3VsdDsKLS0KLS0gIG92ZXJmbG93OgotLSAgICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLS0gICAgICBmcmVlIChyZXN1bHQpOwotLSAgICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0tICAgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLS0gICAgQ0xFQU5VUCAoKTsKLS0gICAgZXJybm8gPSBFT1ZFUkZMT1c7Ci0tICAgIHJldHVybiBOVUxMOwotLQotLSAgb3V0X29mX21lbW9yeToKLS0gICAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0tICAgICAgZnJlZSAocmVzdWx0KTsKLS0gICAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotLSAgICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0tICBvdXRfb2ZfbWVtb3J5XzE6Ci0tICAgIENMRUFOVVAgKCk7Ci0tICAgIGVycm5vID0gRU5PTUVNOwotLSAgICByZXR1cm4gTlVMTDsKLS0gIH0KLS19Ci0tCi0tI3VuZGVmIFRDSEFSU19QRVJfRENIQVIKLS0jdW5kZWYgU05QUklOVEYKLS0jdW5kZWYgVVNFX1NOUFJJTlRGCi0tI3VuZGVmIERDSEFSX0NQWQotLSN1bmRlZiBQUklOVEZfUEFSU0UKLS0jdW5kZWYgRElSRUNUSVZFUwotLSN1bmRlZiBESVJFQ1RJVkUKLS0jdW5kZWYgRENIQVJfSVNfVENIQVIKLS0jdW5kZWYgVENIQVJfVAotLSN1bmRlZiBEQ0hBUl9UCi0tI3VuZGVmIEZDSEFSX1QKLS0jdW5kZWYgVkFTTlBSSU5URgotLS0tIGEvaW50bC92YXNucHJpbnRmLmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDc4ICswLDAgQEAKLS0vKiB2c3ByaW50ZiB3aXRoIGF1dG9tYXRpYyBtZW1vcnkgYWxsb2NhdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZm5kZWYgX1ZBU05QUklOVEZfSAotLSNkZWZpbmUgX1ZBU05QUklOVEZfSAotLQotLS8qIEdldCB2YV9saXN0LiAgKi8KLS0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0tCi0tLyogR2V0IHNpemVfdC4gICovCi0tI2luY2x1ZGUgPHN0ZGRlZi5oPgotLQotLSNpZm5kZWYgX19hdHRyaWJ1dGVfXwotLS8qIFRoaXMgZmVhdHVyZSBpcyBhdmFpbGFibGUgaW4gZ2NjIHZlcnNpb25zIDIuNSBhbmQgbGF0ZXIuICAqLwotLSMgaWYgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNSkgfHwgX19TVFJJQ1RfQU5TSV9fCi0tIyAgZGVmaW5lIF9fYXR0cmlidXRlX18oU3BlYykgLyogZW1wdHkgKi8KLS0jIGVuZGlmCi0tLyogVGhlIF9fLXByb3RlY3RlZCB2YXJpYW50cyBvZiBgZm9ybWF0JyBhbmQgYHByaW50ZicgYXR0cmlidXRlcwotLSAgIGFyZSBhY2NlcHRlZCBieSBnY2MgdmVyc2lvbnMgMi42LjQgKGVmZmVjdGl2ZWx5IDIuNykgYW5kIGxhdGVyLiAgKi8KLS0jIGlmIF9fR05VQ19fIDwgMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDcpCi0tIyAgZGVmaW5lIF9fZm9ybWF0X18gZm9ybWF0Ci0tIyAgZGVmaW5lIF9fcHJpbnRmX18gcHJpbnRmCi0tIyBlbmRpZgotLSNlbmRpZgotLQotLSNpZmRlZiBfX2NwbHVzcGx1cwotLWV4dGVybiAiQyIgewotLSNlbmRpZgotLQotLS8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYSBzdHJpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCi0tICAgWW91IGNhbiBwYXNzIGEgcHJlYWxsb2NhdGVkIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCBpbiBSRVNVTFRCVUYgYW5kIGl0cwotLSAgIHNpemUgaW4gKkxFTkdUSFA7IG90aGVyd2lzZSB5b3UgcGFzcyBSRVNVTFRCVUYgPSBOVUxMLgotLSAgIElmIHN1Y2Nlc3NmdWwsIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nICh0aGlzIG1heSBiZSA9IFJFU1VMVEJVRgotLSAgIGlmIG5vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gd2FzIG5lY2Vzc2FyeSkgYW5kIHNldCAqTEVOR1RIUCB0byB0aGUKLS0gICBudW1iZXIgb2YgcmVzdWx0aW5nIGJ5dGVzLCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gIFVwb24gZXJyb3IsIHNldAotLSAgIGVycm5vIGFuZCByZXR1cm4gTlVMTC4KLS0KLS0gICBXaGVuIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gb2NjdXJzLCB0aGUgcHJlYWxsb2NhdGVkIGJ1ZmZlciBpcyBsZWZ0Ci0tICAgYWxvbmUgKHdpdGggcG9zc2libHkgbW9kaWZpZWQgY29udGVudHMpLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UKLS0gICBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIG9yIHN0YWNrLWFsbG9jYXRlZCBidWZmZXIsIGxpa2UgdGhpczoKLS0KLS0gICAgICAgICAgY2hhciBidWZbMTAwXTsKLS0gICAgICAgICAgc2l6ZV90IGxlbiA9IHNpemVvZiAoYnVmKTsKLS0gICAgICAgICAgY2hhciAqb3V0cHV0ID0gdmFzbnByaW50ZiAoYnVmLCAmbGVuLCBmb3JtYXQsIGFyZ3MpOwotLSAgICAgICAgICBpZiAob3V0cHV0ID09IE5VTEwpCi0tICAgICAgICAgICAgLi4uIGVycm9yIGhhbmRsaW5nIC4uLjsKLS0gICAgICAgICAgZWxzZQotLSAgICAgICAgICAgIHsKLS0gICAgICAgICAgICAgIC4uLiB1c2UgdGhlIG91dHB1dCBzdHJpbmcgLi4uOwotLSAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBidWYpCi0tICAgICAgICAgICAgICAgIGZyZWUgKG91dHB1dCk7Ci0tICAgICAgICAgICAgfQotLSAgKi8KLS1leHRlcm4gY2hhciAqIGFzbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotLSAgICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKLS1leHRlcm4gY2hhciAqIHZhc25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLS0gICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDApKSk7Ci0tCi0tI2lmZGVmIF9fY3BsdXNwbHVzCi0tfQotLSNlbmRpZgotLQotLSNlbmRpZiAvKiBfVkFTTlBSSU5URl9IICovCi0tLS0gYS9pbnRsL3Zhc253cHJpbnRmLmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDQ2ICswLDAgQEAKLS0vKiB2c3dwcmludGYgd2l0aCBhdXRvbWF0aWMgbWVtb3J5IGFsbG9jYXRpb24uCi0tICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZuZGVmIF9WQVNOV1BSSU5URl9ICi0tI2RlZmluZSBfVkFTTldQUklOVEZfSAotLQotLS8qIEdldCB2YV9saXN0LiAgKi8KLS0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0tCi0tLyogR2V0IHdjaGFyX3QsIHNpemVfdC4gICovCi0tI2luY2x1ZGUgPHN0ZGRlZi5oPgotLQotLSNpZmRlZglfX2NwbHVzcGx1cwotLWV4dGVybiAiQyIgewotLSNlbmRpZgotLQotLS8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYSBzdHJpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCi0tICAgWW91IGNhbiBwYXNzIGEgcHJlYWxsb2NhdGVkIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCBpbiBSRVNVTFRCVUYgYW5kIGl0cwotLSAgIHNpemUgaW4gKkxFTkdUSFA7IG90aGVyd2lzZSB5b3UgcGFzcyBSRVNVTFRCVUYgPSBOVUxMLgotLSAgIElmIHN1Y2Nlc3NmdWwsIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nICh0aGlzIG1heSBiZSA9IFJFU1VMVEJVRgotLSAgIGlmIG5vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gd2FzIG5lY2Vzc2FyeSkgYW5kIHNldCAqTEVOR1RIUCB0byB0aGUKLS0gICBudW1iZXIgb2YgcmVzdWx0aW5nIGJ5dGVzLCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gIFVwb24gZXJyb3IsIHNldAotLSAgIGVycm5vIGFuZCByZXR1cm4gTlVMTC4gICovCi0tZXh0ZXJuIHdjaGFyX3QgKiBhc253cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCAuLi4pOwotLWV4dGVybiB3Y2hhcl90ICogdmFzbndwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncyk7Ci0tCi0tI2lmZGVmCV9fY3BsdXNwbHVzCi0tfQotLSNlbmRpZgotLQotLSNlbmRpZiAvKiBfVkFTTldQUklOVEZfSCAqLwotLS0tIGEvaW50bC92ZXJzaW9uLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDI2ICswLDAgQEAKLS0vKiBsaWJpbnRsIGxpYnJhcnkgdmVyc2lvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgImxpYmdudWludGwuaCIKLS0KLS0vKiBWZXJzaW9uIG51bWJlcjogKG1ham9yPDwxNikgKyAobWlub3I8PDgpICsgc3VibWlub3IgKi8KLS1pbnQgbGliaW50bF92ZXJzaW9uID0gTElCSU5UTF9WRVJTSU9OOwotLS0tIGEvaW50bC93cHJpbnRmLXBhcnNlLmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDc1ICswLDAgQEAKLS0vKiBQYXJzZSBwcmludGYgZm9ybWF0IHN0cmluZy4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZm5kZWYgX1dQUklOVEZfUEFSU0VfSAotLSNkZWZpbmUgX1dQUklOVEZfUEFSU0VfSAotLQotLSNpbmNsdWRlICJwcmludGYtYXJncy5oIgotLQotLQotLS8qIEZsYWdzICovCi0tI2RlZmluZSBGTEFHX0dST1VQCSAxCS8qICcgZmxhZyAqLwotLSNkZWZpbmUgRkxBR19MRUZUCSAyCS8qIC0gZmxhZyAqLwotLSNkZWZpbmUgRkxBR19TSE9XU0lHTgkgNAkvKiArIGZsYWcgKi8KLS0jZGVmaW5lIEZMQUdfU1BBQ0UJIDgJLyogc3BhY2UgZmxhZyAqLwotLSNkZWZpbmUgRkxBR19BTFQJMTYJLyogIyBmbGFnICovCi0tI2RlZmluZSBGTEFHX1pFUk8JMzIKLS0KLS0vKiBhcmdfaW5kZXggdmFsdWUgaW5kaWNhdGluZyB0aGF0IG5vIGFyZ3VtZW50IGlzIGNvbnN1bWVkLiAgKi8KLS0jZGVmaW5lIEFSR19OT05FCSh+KHNpemVfdCkwKQotLQotLS8qIEEgcGFyc2VkIGRpcmVjdGl2ZS4gICovCi0tdHlwZWRlZiBzdHJ1Y3QKLS17Ci0tICBjb25zdCB3Y2hhcl90KiBkaXJfc3RhcnQ7Ci0tICBjb25zdCB3Y2hhcl90KiBkaXJfZW5kOwotLSAgaW50IGZsYWdzOwotLSAgY29uc3Qgd2NoYXJfdCogd2lkdGhfc3RhcnQ7Ci0tICBjb25zdCB3Y2hhcl90KiB3aWR0aF9lbmQ7Ci0tICBzaXplX3Qgd2lkdGhfYXJnX2luZGV4OwotLSAgY29uc3Qgd2NoYXJfdCogcHJlY2lzaW9uX3N0YXJ0OwotLSAgY29uc3Qgd2NoYXJfdCogcHJlY2lzaW9uX2VuZDsKLS0gIHNpemVfdCBwcmVjaXNpb25fYXJnX2luZGV4OwotLSAgd2NoYXJfdCBjb252ZXJzaW9uOyAvKiBkIGkgbyB1IHggWCBmIGUgRSBnIEcgYyBzIHAgbiBVICUgYnV0IG5vdCBDIFMgKi8KLS0gIHNpemVfdCBhcmdfaW5kZXg7Ci0tfQotLXdjaGFyX3RfZGlyZWN0aXZlOwotLQotLS8qIEEgcGFyc2VkIGZvcm1hdCBzdHJpbmcuICAqLwotLXR5cGVkZWYgc3RydWN0Ci0tewotLSAgc2l6ZV90IGNvdW50OwotLSAgd2NoYXJfdF9kaXJlY3RpdmUgKmRpcjsKLS0gIHNpemVfdCBtYXhfd2lkdGhfbGVuZ3RoOwotLSAgc2l6ZV90IG1heF9wcmVjaXNpb25fbGVuZ3RoOwotLX0KLS13Y2hhcl90X2RpcmVjdGl2ZXM7Ci0tCi0tCi0tLyogUGFyc2VzIHRoZSBmb3JtYXQgc3RyaW5nLiAgRmlsbHMgaW4gdGhlIG51bWJlciBOIG9mIGRpcmVjdGl2ZXMsIGFuZCBmaWxscwotLSAgIGluIGRpcmVjdGl2ZXNbMF0sIC4uLiwgZGlyZWN0aXZlc1tOLTFdLCBhbmQgc2V0cyBkaXJlY3RpdmVzW05dLmRpcl9zdGFydAotLSAgIHRvIHRoZSBlbmQgb2YgdGhlIGZvcm1hdCBzdHJpbmcuICBBbHNvIGZpbGxzIGluIHRoZSBhcmdfdHlwZSBmaWVsZHMgb2YgdGhlCi0tICAgYXJndW1lbnRzIGFuZCB0aGUgbmVlZGVkIGNvdW50IG9mIGFyZ3VtZW50cy4gICovCi0tI2lmZGVmIFNUQVRJQwotLVNUQVRJQwotLSNlbHNlCi0tZXh0ZXJuCi0tI2VuZGlmCi0taW50IHdwcmludGZfcGFyc2UgKGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgd2NoYXJfdF9kaXJlY3RpdmVzICpkLCBhcmd1bWVudHMgKmEpOwotLQotLSNlbmRpZiAvKiBfV1BSSU5URl9QQVJTRV9IICovCi0tLS0gYS9pbnRsL3hzaXplLmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDEwOSArMCwwIEBACi0tLyogeHNpemUuaCAtLSBDaGVja2VkIHNpemVfdCBjb21wdXRhdGlvbnMuCi0tCi0tICAgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBfWFNJWkVfSAotLSNkZWZpbmUgX1hTSVpFX0gKLS0KLS0vKiBHZXQgc2l6ZV90LiAgKi8KLS0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0tCi0tLyogR2V0IFNJWkVfTUFYLiAgKi8KLS0jaW5jbHVkZSA8bGltaXRzLmg+Ci0tI2lmIEhBVkVfU1RESU5UX0gKLS0jIGluY2x1ZGUgPHN0ZGludC5oPgotLSNlbmRpZgotLQotLS8qIFRoZSBzaXplIG9mIG1lbW9yeSBvYmplY3RzIGlzIG9mdGVuIGNvbXB1dGVkIHRocm91Z2ggZXhwcmVzc2lvbnMgb2YKLS0gICB0eXBlIHNpemVfdC4gRXhhbXBsZToKLS0gICAgICB2b2lkKiBwID0gbWFsbG9jIChoZWFkZXJfc2l6ZSArIG4gKiBlbGVtZW50X3NpemUpLgotLSAgIFRoZXNlIGNvbXB1dGF0aW9ucyBjYW4gbGVhZCB0byBvdmVyZmxvdy4gIFdoZW4gdGhpcyBoYXBwZW5zLCBtYWxsb2MoKQotLSAgIHJldHVybnMgYSBwaWVjZSBvZiBtZW1vcnkgdGhhdCBpcyB3YXkgdG9vIHNtYWxsLCBhbmQgdGhlIHByb2dyYW0gdGhlbgotLSAgIGNyYXNoZXMgd2hpbGUgYXR0ZW1wdGluZyB0byBmaWxsIHRoZSBtZW1vcnkuCi0tICAgVG8gYXZvaWQgdGhpcywgdGhlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIGluIHRoaXMgZmlsZSBjaGVjayBmb3Igb3ZlcmZsb3cuCi0tICAgVGhlIGNvbnZlbnRpb24gaXMgdGhhdCBTSVpFX01BWCByZXByZXNlbnRzIG92ZXJmbG93LgotLSAgIG1hbGxvYyAoU0laRV9NQVgpIGlzIG5vdCBndWFyYW50ZWVkIHRvIGZhaWwgLS0gdGhpbmsgb2YgYSBtYWxsb2MKLS0gICBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgbW1hcCAtLSwgaXQncyByZWNvbW1lbmRlZCB0byB1c2Ugc2l6ZV9vdmVyZmxvd19wKCkKLS0gICBvciBzaXplX2luX2JvdW5kc19wKCkgYmVmb3JlIGludm9raW5nIG1hbGxvYygpLgotLSAgIFRoZSBleGFtcGxlIHRodXMgYmVjb21lczoKLS0gICAgICBzaXplX3Qgc2l6ZSA9IHhzdW0gKGhlYWRlcl9zaXplLCB4dGltZXMgKG4sIGVsZW1lbnRfc2l6ZSkpOwotLSAgICAgIHZvaWQgKnAgPSAoc2l6ZV9pbl9ib3VuZHNfcCAoc2l6ZSkgPyBtYWxsb2MgKHNpemUpIDogTlVMTCk7Ci0tKi8KLS0KLS0vKiBDb252ZXJ0IGFuIGFyYml0cmFyeSB2YWx1ZSA+PSAwIHRvIHR5cGUgc2l6ZV90LiAgKi8KLS0jZGVmaW5lIHhjYXN0X3NpemVfdChOKSBcCi0tICAoKE4pIDw9IFNJWkVfTUFYID8gKHNpemVfdCkgKE4pIDogU0laRV9NQVgpCi0tCi0tLyogU3VtIG9mIHR3byBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCi0tc3RhdGljIGlubGluZSBzaXplX3QKLS0jaWYgX19HTlVDX18gPj0gMwotLV9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCi0tI2VuZGlmCi0teHN1bSAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIpCi0tewotLSAgc2l6ZV90IHN1bSA9IHNpemUxICsgc2l6ZTI7Ci0tICByZXR1cm4gKHN1bSA+PSBzaXplMSA/IHN1bSA6IFNJWkVfTUFYKTsKLS19Ci0tCi0tLyogU3VtIG9mIHRocmVlIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KLS1zdGF0aWMgaW5saW5lIHNpemVfdAotLSNpZiBfX0dOVUNfXyA+PSAzCi0tX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKLS0jZW5kaWYKLS14c3VtMyAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIsIHNpemVfdCBzaXplMykKLS17Ci0tICByZXR1cm4geHN1bSAoeHN1bSAoc2l6ZTEsIHNpemUyKSwgc2l6ZTMpOwotLX0KLS0KLS0vKiBTdW0gb2YgZm91ciBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCi0tc3RhdGljIGlubGluZSBzaXplX3QKLS0jaWYgX19HTlVDX18gPj0gMwotLV9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCi0tI2VuZGlmCi0teHN1bTQgKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyLCBzaXplX3Qgc2l6ZTMsIHNpemVfdCBzaXplNCkKLS17Ci0tICByZXR1cm4geHN1bSAoeHN1bSAoeHN1bSAoc2l6ZTEsIHNpemUyKSwgc2l6ZTMpLCBzaXplNCk7Ci0tfQotLQotLS8qIE1heGltdW0gb2YgdHdvIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KLS1zdGF0aWMgaW5saW5lIHNpemVfdAotLSNpZiBfX0dOVUNfXyA+PSAzCi0tX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKLS0jZW5kaWYKLS14bWF4IChzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMikKLS17Ci0tICAvKiBObyBleHBsaWNpdCBjaGVjayBpcyBuZWVkZWQgaGVyZSwgYmVjYXVzZSBmb3IgYW55IG46Ci0tICAgICBtYXggKFNJWkVfTUFYLCBuKSA9PSBTSVpFX01BWCBhbmQgbWF4IChuLCBTSVpFX01BWCkgPT0gU0laRV9NQVguICAqLwotLSAgcmV0dXJuIChzaXplMSA+PSBzaXplMiA/IHNpemUxIDogc2l6ZTIpOwotLX0KLS0KLS0vKiBNdWx0aXBsaWNhdGlvbiBvZiBhIGNvdW50IHdpdGggYW4gZWxlbWVudCBzaXplLCB3aXRoIG92ZXJmbG93IGNoZWNrLgotLSAgIFRoZSBjb3VudCBtdXN0IGJlID49IDAgYW5kIHRoZSBlbGVtZW50IHNpemUgbXVzdCBiZSA+IDAuCi0tICAgVGhpcyBpcyBhIG1hY3JvLCBub3QgYW4gaW5saW5lIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IHdvcmtzIGNvcnJlY3RseSBldmVuCi0tICAgd2hlbiBOIGlzIG9mIGEgd2lkZXIgdHVwZSBhbmQgTiA+IFNJWkVfTUFYLiAgKi8KLS0jZGVmaW5lIHh0aW1lcyhOLCBFTFNJWkUpIFwKLS0gICgoTikgPD0gU0laRV9NQVggLyAoRUxTSVpFKSA/IChzaXplX3QpIChOKSAqIChFTFNJWkUpIDogU0laRV9NQVgpCi0tCi0tLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAgKi8KLS0jZGVmaW5lIHNpemVfb3ZlcmZsb3dfcChTSVpFKSBcCi0tICAoKFNJWkUpID09IFNJWkVfTUFYKQotLS8qIENoZWNrIGFnYWluc3Qgb3ZlcmZsb3cuICAqLwotLSNkZWZpbmUgc2l6ZV9pbl9ib3VuZHNfcChTSVpFKSBcCi0tICAoKFNJWkUpICE9IFNJWkVfTUFYKQotLQotLSNlbmRpZiAvKiBfWFNJWkVfSCAqLwotLS0tIGEvbTQvaW50bG1hY29zeC5tNAotKysrIGIvbTQvaW50bG1hY29zeC5tNAotQEAgLTEsNTAgKzEsNzEgQEAKLS0jIGludGxtYWNvc3gubTQgc2VyaWFsIDEgKGdldHRleHQtMC4xNykKLS1kbmwgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0rIyBpbnRsbWFjb3N4Lm00IHNlcmlhbCA2IChnZXR0ZXh0LTAuMjApCi0rZG5sIENvcHlyaWdodCAoQykgMjAwNC0yMDE0LCAyMDE2LCAyMDE5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIGRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIGRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIGRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0gZG5sCi0tZG5sIFRoaXMgZmlsZSBjYW4gY2FuIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIKLStkbmwgVGhpcyBmaWxlIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCi0gZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSBkbmwgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAotIGRubCBmdW5jdGlvbmFsaXR5LgotIGRubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCi0gZG5sIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIEdOVQotLWRubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLStkbmwgZ2V0dGV4dCBwYWNrYWdlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotIGRubCBUaGV5IGFyZSAqbm90KiBpbiB0aGUgcHVibGljIGRvbWFpbi4KLSAKLS1kbmwgQ2hlY2tzIGZvciBzcGVjaWFsIG9wdGlvbnMgbmVlZGVkIG9uIE1hY09TIFguCi0rZG5sIENoZWNrcyBmb3Igc3BlY2lhbCBvcHRpb25zIG5lZWRlZCBvbiBNYWMgT1MgWC4KLSBkbmwgRGVmaW5lcyBJTlRMX01BQ09TWF9MSUJTLgotIEFDX0RFRlVOKFtndF9JTlRMX01BQ09TWF0sCi0gWwotLSAgZG5sIENoZWNrIGZvciBBUEkgaW50cm9kdWNlZCBpbiBNYWNPUyBYIDEwLjIuCi0rICBkbmwgQ2hlY2sgZm9yIEFQSSBpbnRyb2R1Y2VkIGluIE1hYyBPUyBYIDEwLjQuCi0gICBBQ19DQUNIRV9DSEVDSyhbZm9yIENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWVdLAotLSAgICBndF9jdl9mdW5jX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUsCi0rICAgIFtndF9jdl9mdW5jX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWVdLAotICAgICBbZ3Rfc2F2ZV9MSUJTPSIkTElCUyIKLSAgICAgIExJQlM9IiRMSUJTIC1XbCwtZnJhbWV3b3JrIC1XbCxDb3JlRm91bmRhdGlvbiIKLS0gICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZQcmVmZXJlbmNlcy5oPl0sCi0tICAgICAgIFtDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlKE5VTEwsIE5VTEwpXSwKLSsgICAgIEFDX0xJTktfSUZFTFNFKAotKyAgICAgICBbQUNfTEFOR19QUk9HUkFNKAotKyAgICAgICAgICBbWyNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9DRlByZWZlcmVuY2VzLmg+XV0sCi0rICAgICAgICAgIFtbQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZShOVUxMLCBOVUxMKV1dKV0sCi0gICAgICAgIFtndF9jdl9mdW5jX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWU9eWVzXSwKLSAgICAgICAgW2d0X2N2X2Z1bmNfQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZT1ub10pCi0gICAgICBMSUJTPSIkZ3Rfc2F2ZV9MSUJTIl0pCi0gICBpZiB0ZXN0ICRndF9jdl9mdW5jX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUgPSB5ZXM7IHRoZW4KLS0gICAgQUNfREVGSU5FKFtIQVZFX0NGUFJFRkVSRU5DRVNDT1BZQVBQVkFMVUVdLCAxLAotLSAgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgTWFjT1MgWCBmdW5jdGlvbiBDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlIGluIHRoZSBDb3JlRm91bmRhdGlvbiBmcmFtZXdvcmsuXSkKLSsgICAgQUNfREVGSU5FKFtIQVZFX0NGUFJFRkVSRU5DRVNDT1BZQVBQVkFMVUVdLCBbMV0sCi0rICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBNYWMgT1MgWCBmdW5jdGlvbiBDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlIGluIHRoZSBDb3JlRm91bmRhdGlvbiBmcmFtZXdvcmsuXSkKLSAgIGZpCi0tICBkbmwgQ2hlY2sgZm9yIEFQSSBpbnRyb2R1Y2VkIGluIE1hY09TIFggMTAuMy4KLS0gIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQ0ZMb2NhbGVDb3B5Q3VycmVudF0sIGd0X2N2X2Z1bmNfQ0ZMb2NhbGVDb3B5Q3VycmVudCwKLSsgIGRubCBDaGVjayBmb3IgQVBJIGludHJvZHVjZWQgaW4gTWFjIE9TIFggMTAuNS4KLSsgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQ0ZMb2NhbGVDb3B5Q3VycmVudF0sIFtndF9jdl9mdW5jX0NGTG9jYWxlQ29weUN1cnJlbnRdLAotICAgICBbZ3Rfc2F2ZV9MSUJTPSIkTElCUyIKLSAgICAgIExJQlM9IiRMSUJTIC1XbCwtZnJhbWV3b3JrIC1XbCxDb3JlRm91bmRhdGlvbiIKLS0gICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZMb2NhbGUuaD5dLCBbQ0ZMb2NhbGVDb3B5Q3VycmVudCgpO10sCi0rICAgICBBQ19MSU5LX0lGRUxTRSgKLSsgICAgICAgW0FDX0xBTkdfUFJPR1JBTSgKLSsgICAgICAgICAgW1sjaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZMb2NhbGUuaD5dXSwKLSsgICAgICAgICAgW1tDRkxvY2FsZUNvcHlDdXJyZW50KCk7XV0pXSwKLSAgICAgICAgW2d0X2N2X2Z1bmNfQ0ZMb2NhbGVDb3B5Q3VycmVudD15ZXNdLAotICAgICAgICBbZ3RfY3ZfZnVuY19DRkxvY2FsZUNvcHlDdXJyZW50PW5vXSkKLSAgICAgIExJQlM9IiRndF9zYXZlX0xJQlMiXSkKLSAgIGlmIHRlc3QgJGd0X2N2X2Z1bmNfQ0ZMb2NhbGVDb3B5Q3VycmVudCA9IHllczsgdGhlbgotLSAgICBBQ19ERUZJTkUoW0hBVkVfQ0ZMT0NBTEVDT1BZQ1VSUkVOVF0sIDEsCi0tICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBNYWNPUyBYIGZ1bmN0aW9uIENGTG9jYWxlQ29weUN1cnJlbnQgaW4gdGhlIENvcmVGb3VuZGF0aW9uIGZyYW1ld29yay5dKQotKyAgICBBQ19ERUZJTkUoW0hBVkVfQ0ZMT0NBTEVDT1BZQ1VSUkVOVF0sIFsxXSwKLSsgICAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIE1hYyBPUyBYIGZ1bmN0aW9uIENGTG9jYWxlQ29weUN1cnJlbnQgaW4gdGhlIENvcmVGb3VuZGF0aW9uIGZyYW1ld29yay5dKQotKyAgZmkKLSsgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQ0ZMb2NhbGVDb3B5UHJlZmVycmVkTGFuZ3VhZ2VzXSwgW2d0X2N2X2Z1bmNfQ0ZMb2NhbGVDb3B5UHJlZmVycmVkTGFuZ3VhZ2VzXSwKLSsgICAgW2d0X3NhdmVfTElCUz0iJExJQlMiCi0rICAgICBMSUJTPSIkTElCUyAtV2wsLWZyYW1ld29yayAtV2wsQ29yZUZvdW5kYXRpb24iCi0rICAgICBBQ19MSU5LX0lGRUxTRSgKLSsgICAgICAgW0FDX0xBTkdfUFJPR1JBTSgKLSsgICAgICAgICAgW1sjaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZMb2NhbGUuaD5dXSwKLSsgICAgICAgICAgW1tDRkxvY2FsZUNvcHlQcmVmZXJyZWRMYW5ndWFnZXMoKTtdXSldLAotKyAgICAgICBbZ3RfY3ZfZnVuY19DRkxvY2FsZUNvcHlQcmVmZXJyZWRMYW5ndWFnZXM9eWVzXSwKLSsgICAgICAgW2d0X2N2X2Z1bmNfQ0ZMb2NhbGVDb3B5UHJlZmVycmVkTGFuZ3VhZ2VzPW5vXSkKLSsgICAgIExJQlM9IiRndF9zYXZlX0xJQlMiXSkKLSsgIGlmIHRlc3QgJGd0X2N2X2Z1bmNfQ0ZMb2NhbGVDb3B5UHJlZmVycmVkTGFuZ3VhZ2VzID0geWVzOyB0aGVuCi0rICAgIEFDX0RFRklORShbSEFWRV9DRkxPQ0FMRUNPUFlQUkVGRVJSRURMQU5HVUFHRVNdLCBbMV0sCi0rICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBNYWMgT1MgWCBmdW5jdGlvbiBDRkxvY2FsZUNvcHlQcmVmZXJyZWRMYW5ndWFnZXMgaW4gdGhlIENvcmVGb3VuZGF0aW9uIGZyYW1ld29yay5dKQotICAgZmkKLSAgIElOVExfTUFDT1NYX0xJQlM9Ci0tICBpZiB0ZXN0ICRndF9jdl9mdW5jX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUgPSB5ZXMgfHwgdGVzdCAkZ3RfY3ZfZnVuY19DRkxvY2FsZUNvcHlDdXJyZW50ID0geWVzOyB0aGVuCi0rICBpZiB0ZXN0ICRndF9jdl9mdW5jX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUgPSB5ZXMgXAotKyAgICAgfHwgdGVzdCAkZ3RfY3ZfZnVuY19DRkxvY2FsZUNvcHlDdXJyZW50ID0geWVzIFwKLSsgICAgIHx8IHRlc3QgJGd0X2N2X2Z1bmNfQ0ZMb2NhbGVDb3B5UHJlZmVycmVkTGFuZ3VhZ2VzID0geWVzOyB0aGVuCi0gICAgIElOVExfTUFDT1NYX0xJQlM9Ii1XbCwtZnJhbWV3b3JrIC1XbCxDb3JlRm91bmRhdGlvbiIKLSAgIGZpCi0gICBBQ19TVUJTVChbSU5UTF9NQUNPU1hfTElCU10pCi0tLS0gYS9wby9DaGFuZ2VMb2cKLSsrKyBiL3BvL0NoYW5nZUxvZwotQEAgLTEsMyArMSwxMSBAQAotKzIwMTktMTItMDcgIGdldHRleHRpemUgIDxidWctZ251LWdldHRleHRAZ251Lm9yZz4KLSsKLSsJKiBlbkBib2xkcXVvdC5oZWFkZXI6IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjIwLjEuCi0rCSogZW5AcXVvdC5oZWFkZXI6IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjIwLjEuCi0rCSogaW5zZXJ0LWhlYWRlci5zaW46IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjIwLjEuCi0rCSogcmVtb3ZlLXBvdGNkYXRlLnNpbjogVXBncmFkZSB0byBnZXR0ZXh0LTAuMjAuMS4KLSsJKiBSdWxlcy1xdW90OiBVcGdyYWRlIHRvIGdldHRleHQtMC4yMC4xLgotKwotIDIwMDktMDgtMTEgIFNjb3R0IEphbWVzIFJlbW5hbnQgIDxzY290dEBuZXRzcGxpdC5jb20+Ci0gCi0gCSogbGlibmloLnBvdDogRGlzdHJpYnV0ZSB0aGUgcG90IGZpbGUKLS0tLSBhL3BvL1J1bGVzLXF1b3QKLSsrKyBiL3BvL1J1bGVzLXF1b3QKLUBAIC0xLDQgKzEsOSBAQAotICMgU3BlY2lhbCBNYWtlZmlsZSBydWxlcyBmb3IgRW5nbGlzaCBtZXNzYWdlIGNhdGFsb2dzIHdpdGggcXVvdGF0aW9uIG1hcmtzLgotKyMKLSsjIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotKyMgVGhpcyBmaWxlLCBSdWxlcy1xdW90LCBhbmQgaXRzIGF1eGlsaWFyeSBmaWxlcyAobGlzdGVkIHVuZGVyCi0rIyBESVNURklMRVMuY29tbW9uLmV4dHJhMSkgYXJlIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSsjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgZGlzdHJpYnV0ZSwgYW5kIG1vZGlmeSB0aGVtLgotIAotIERJU1RGSUxFUy5jb21tb24uZXh0cmExID0gcXVvdC5zZWQgYm9sZHF1b3Quc2VkIGVuQHF1b3QuaGVhZGVyIGVuQGJvbGRxdW90LmhlYWRlciBpbnNlcnQtaGVhZGVyLnNpbiBSdWxlcy1xdW90Ci0gCi1AQCAtMTQsMTMgKzE5LDIzIEBAIGVuQGJvbGRxdW90LnBvLXVwZGF0ZTogZW5AYm9sZHF1b3QucG8tdXAKLSAKLSAuaW5zZXJ0LWhlYWRlci5wby11cGRhdGUtZW46Ci0gCUBsYW5nPWBlY2hvICRAIHwgc2VkIC1lICdzL1wucG8tdXBkYXRlLWVuJCQvLydgOyBcCi0tCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgR0VUVEVYVExJQkRJUj1gY2QgJCh0b3Bfc3JjZGlyKS9zcmMgJiYgcHdkYDsgZXhwb3J0IEdFVFRFWFRMSUJESVI7IGZpOyBcCi0rCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiICYmIHRlc3QgIiQoQ1JPU1NfQ09NUElMSU5HKSIgIT0gInllcyI7IHRoZW4gUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBHRVRURVhUTElCRElSPWBjZCAkKHRvcF9zcmNkaXIpL3NyYyAmJiBwd2RgOyBleHBvcnQgR0VUVEVYVExJQkRJUjsgZmk7IFwKLSAJdG1wZGlyPWBwd2RgOyBcCi0gCWVjaG8gIiQkbGFuZzoiOyBcCi0gCWxsPWBlY2hvICQkbGFuZyB8IHNlZCAtZSAncy9ALiovLydgOyBcCi0gCUxDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBcCi0gCWNkICQoc3JjZGlyKTsgXAotLQlpZiAkKE1TR0lOSVQpIC1pICQoRE9NQUlOKS5wb3QgLS1uby10cmFuc2xhdG9yIC1sICQkbGwgLW8gLSAyPi9kZXYvbnVsbCB8IHNlZCAtZiAkJHRtcGRpci8kJGxhbmcuaW5zZXJ0LWhlYWRlciB8ICQoTVNHQ09OVikgLXQgVVRGLTggfCAkKE1TR0ZJTFRFUikgc2VkIC1mIGBlY2hvICQkbGFuZyB8IHNlZCAtZSAncy8uKkAvLydgLnNlZCAyPi9kZXYvbnVsbCA+ICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IHRoZW4gXAotKwlpZiAkKE1TR0lOSVQpICQoTVNHSU5JVF9PUFRJT05TKSAtaSAkKERPTUFJTikucG90IC0tbm8tdHJhbnNsYXRvciAtbCAkJGxhbmcgLW8gLSAyPi9kZXYvbnVsbCBcCi0rCSAgIHwgJChTRUQpIC1mICQkdG1wZGlyLyQkbGFuZy5pbnNlcnQtaGVhZGVyIHwgJChNU0dDT05WKSAtdCBVVEYtOCB8IFwKLSsJICAgeyBjYXNlIGAkKE1TR0ZJTFRFUikgLS12ZXJzaW9uIHwgc2VkIDFxIHwgc2VkIC1lICdzLF5bXjAtOV0qLCwnYCBpbiBcCi0rCSAgICAgJycgfCAwLlswLTldIHwgMC5bMC05XS4qIHwgMC4xWzAtOF0gfCAwLjFbMC04XS4qKSBcCi0rCSAgICAgICAkKE1TR0ZJTFRFUikgJChTRUQpIC1mIGBlY2hvICQkbGFuZyB8IHNlZCAtZSAncy8uKkAvLydgLnNlZCBcCi0rCSAgICAgICA7OyBcCi0rCSAgICAgKikgXAotKwkgICAgICAgJChNU0dGSUxURVIpIGBlY2hvICQkbGFuZyB8IHNlZCAtZSAncy8uKkAvLydgIFwKLSsJICAgICAgIDs7IFwKLSsJICAgICBlc2FjIH0gMj4vZGV2L251bGwgPiAkJHRtcGRpci8kJGxhbmcubmV3LnBvIFwKLSsJICAgICA7IHRoZW4gXAotIAkgIGlmIGNtcCAkJGxhbmcucG8gJCR0bXBkaXIvJCRsYW5nLm5ldy5wbyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotIAkgICAgcm0gLWYgJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgXAotIAkgIGVsc2UgXAotLS0tIGEvcG8vZW5AYm9sZHF1b3QuaGVhZGVyCi0rKysgYi9wby9lbkBib2xkcXVvdC5oZWFkZXIKLUBAIC0yLDcgKzIsNyBAQAotICMgVGhlIG1zZ2lkcyBtdXN0IGJlIEFTQ0lJIGFuZCB0aGVyZWZvcmUgY2Fubm90IGNvbnRhaW4gcmVhbCBxdW90YXRpb24KLSAjIGNoYXJhY3RlcnMsIG9ubHkgc3Vic3RpdHV0ZXMgbGlrZSBncmF2ZSBhY2NlbnQgKDB4NjApLCBhcG9zdHJvcGhlICgweDI3KQotICMgYW5kIGRvdWJsZSBxdW90ZSAoMHgyMikuIFRoZXNlIHN1YnN0aXR1dGVzIGxvb2sgc3RyYW5nZTsgc2VlCi0tIyBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdWNzL3F1b3Rlcy5odG1sCi0rIyBodHRwczovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3Vjcy9xdW90ZXMuaHRtbAotICMKLSAjIFRoaXMgY2F0YWxvZyB0cmFuc2xhdGVzIGdyYXZlIGFjY2VudCAoMHg2MCkgYW5kIGFwb3N0cm9waGUgKDB4MjcpIHRvCi0gIyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE4KSBhbmQgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTkpLgotLS0tIGEvcG8vZW5AcXVvdC5oZWFkZXIKLSsrKyBiL3BvL2VuQHF1b3QuaGVhZGVyCi1AQCAtMiw3ICsyLDcgQEAKLSAjIFRoZSBtc2dpZHMgbXVzdCBiZSBBU0NJSSBhbmQgdGhlcmVmb3JlIGNhbm5vdCBjb250YWluIHJlYWwgcXVvdGF0aW9uCi0gIyBjaGFyYWN0ZXJzLCBvbmx5IHN1YnN0aXR1dGVzIGxpa2UgZ3JhdmUgYWNjZW50ICgweDYwKSwgYXBvc3Ryb3BoZSAoMHgyNykKLSAjIGFuZCBkb3VibGUgcXVvdGUgKDB4MjIpLiBUaGVzZSBzdWJzdGl0dXRlcyBsb29rIHN0cmFuZ2U7IHNlZQotLSMgaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3Vjcy9xdW90ZXMuaHRtbAotKyMgaHR0cHM6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91Y3MvcXVvdGVzLmh0bWwKLSAjCi0gIyBUaGlzIGNhdGFsb2cgdHJhbnNsYXRlcyBncmF2ZSBhY2NlbnQgKDB4NjApIGFuZCBhcG9zdHJvcGhlICgweDI3KSB0bwotICMgbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOCkgYW5kIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE5KS4KLS0tLSBhL3BvL2luc2VydC1oZWFkZXIuc2luCi0rKysgYi9wby9pbnNlcnQtaGVhZGVyLnNpbgotQEAgLTEsNSArMSwxMCBAQAotICMgU2VkIHNjcmlwdCB0aGF0IGluc2VydHMgdGhlIGZpbGUgY2FsbGVkIEhFQURFUiBiZWZvcmUgdGhlIGhlYWRlciBlbnRyeS4KLSAjCi0rIyBDb3B5cmlnaHQgKEMpIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0rIyBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwMS4KLSsjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCi0rIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIGRpc3RyaWJ1dGUsIGFuZCBtb2RpZnkgaXQuCi0rIwotICMgQXQgZWFjaCBvY2N1cnJlbmNlIG9mIGEgbGluZSBzdGFydGluZyB3aXRoICJtc2dpZCAiLCB3ZSBleGVjdXRlIHRoZSBmb2xsb3dpbmcKLSAjIGNvbW1hbmRzLiBBdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSwgaW5zZXJ0IHRoZSBmaWxlLiBBdCB0aGUgZm9sbG93aW5nCi0gIyBvY2N1cnJlbmNlcywgZG8gbm90aGluZy4gVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlIGZpcnN0IGFuZCB0aGUgZm9sbG93aW5nCi0tLS0gYS9wby9yZW1vdmUtcG90Y2RhdGUuc2luCi0rKysgYi9wby9yZW1vdmUtcG90Y2RhdGUuc2luCi1AQCAtMSw2ICsxLDEyIEBACi0tIyBTZWQgc2NyaXB0IHRoYXQgcmVtb3ZlIHRoZSBQT1QtQ3JlYXRpb24tRGF0ZSBsaW5lIGluIHRoZSBoZWFkZXIgZW50cnkKLSsjIFNlZCBzY3JpcHQgdGhhdCByZW1vdmVzIHRoZSBQT1QtQ3JlYXRpb24tRGF0ZSBsaW5lIGluIHRoZSBoZWFkZXIgZW50cnkKLSAjIGZyb20gYSBQT1QgZmlsZS4KLSAjCi0rIyBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0rIyBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAotKyMgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0Ci0rIyBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywKLSsjIHdpdGhvdXQgYW55IHdhcnJhbnR5LgotKyMKLSAjIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgdGhlIGZvbGxvd2luZyBvY2N1cnJlbmNlcyBvZiB0aGUKLSAjIHBhdHRlcm4gaXMgYWNoaWV2ZWQgYnkgbG9va2luZyBhdCB0aGUgaG9sZCBzcGFjZS4KLSAvXiJQT1QtQ3JlYXRpb24tRGF0ZTogLioiJC97CmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloLTEuMC4zLzAwMDEtc2lnbmFsLmMtU0lHQ0xELWFuZC1TSUdDSElMRC1hcmUtc2FtZS1vbi1zeXRlbS1WLXN5cy5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xpYm5paC9saWJuaWgtMS4wLjMvMDAwMS1zaWduYWwuYy1TSUdDTEQtYW5kLVNJR0NISUxELWFyZS1zYW1lLW9uLXN5dGVtLVYtc3lzLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDNiNGIxLi4wMDAwMDAwCi0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xpYm5paC9saWJuaWgtMS4wLjMvMDAwMS1zaWduYWwuYy1TSUdDTEQtYW5kLVNJR0NISUxELWFyZS1zYW1lLW9uLXN5dGVtLVYtc3lzLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotRnJvbSBmMWI5OTkyY2FmOTkxMGY5ZjdhZmFlNDAxMDQ1ZTQyNTcyY2M4NGZmIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQotRnJvbTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KLURhdGU6IFNhdCwgMSBBcHIgMjAxNyAwODo1MDozNSAtMDcwMAotU3ViamVjdDogW1BBVENIXSBzaWduYWwuYzogU0lHQ0xEIGFuZCBTSUdDSElMRCBhcmUgc2FtZSBvbiBzeXRlbSBWIHN5c3RlbXMKLQotTXVzbCBkcm9wcyB0aGUgU0lHQ0xEIGxlZ2FjeQotCi1TaWduZWQtb2ZmLWJ5OiBLaGVtIFJhaiA8cmFqLmtoZW1AZ21haWwuY29tPgotLS0tCi0gbmloL3NpZ25hbC5jIHwgMiArLQotIDEgZmlsZSBjaGFuZ2VkLCAxIGluc2VydGlvbigrKSwgMSBkZWxldGlvbigtKQotCi1kaWZmIC0tZ2l0IGEvbmloL3NpZ25hbC5jIGIvbmloL3NpZ25hbC5jCi1pbmRleCBhMjQxZGY5Li42OTFjOGU2IDEwMDY0NAotLS0tIGEvbmloL3NpZ25hbC5jCi0rKysgYi9uaWgvc2lnbmFsLmMKLUBAIC04Nyw3ICs4Nyw3IEBAIHN0YXRpYyBjb25zdCBTaWduYWxOYW1lIHNpZ25hbF9uYW1lc1tdID0gewotIAl7IFNJR1NUS0ZMVCwgIlNUS0ZMVCIgfSwKLSAjZW5kaWYKLSAJeyBTSUdDSExELCAgICJDSExEIiAgIH0sCi0tCXsgU0lHQ0xELCAgICAiQ0xEIiAgICB9LAotKwl7IFNJR0NITEQsICAgICJDTEQiICAgfSwKLSAJeyBTSUdDT05ULCAgICJDT05UIiAgIH0sCi0gCXsgU0lHU1RPUCwgICAiU1RPUCIgICB9LAotIAl7IFNJR1RTVFAsICAgIlRTVFAiICAgfSwKLS0tIAotMi4xMi4xCi0KZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xpYm5paC9saWJuaWgtMS4wLjMvbGlibmloXzEuMC4zLTR1YnVudHUxNi5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xpYm5paC9saWJuaWgtMS4wLjMvbGlibmloXzEuMC4zLTR1YnVudHUxNi5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxMjVjOC4uMDAwMDAwMAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloLTEuMC4zL2xpYm5paF8xLjAuMy00dWJ1bnR1MTYucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkzICswLDAgQEAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9DaGFuZ2VMb2cKLSsrKyBsaWJuaWgtMS4wLjMvQ2hhbmdlTG9nCi1AQCAtMSwzICsxLDg0IEBACi0rMjAxMy0wMy0xMyAgU3RldmUgTGFuZ2FzZWsgIDxzdGV2ZS5sYW5nYXNla0B1YnVudHUuY29tPgotKwotKwkqIG5paC93YXRjaC5jIChuaWhfd2F0Y2hfd2Fsa19maWx0ZXIpOiBOZXcgTmloRmlsZUZpbHRlciBmdW5jdGlvbgotKwlwYXNzZWQgdG8gbmloX2Rpcl93YWxrX3NjYW4oKSB0byBlbnN1cmUgdGhlIG5paF93YXRjaF9uZXcoKSBmaWx0ZXIKLSsJZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBOaWhXYXRjaCBkYXRhIHJhdGhlciB0aGFuIHRoZSBkYXRhIHBhc3NlZCB0bwotKwl0aGUgbmloX2Rpcl93YWxrKCkgTmloRmlsZVZpc2l0b3IgZnVuY3Rpb24gKExQOiAjNzc2NTMyKS4KLSsKLSsJKiBuaWgvdGVzdHMvdGVzdF93YXRjaC5jICh0ZXN0X25ldyk6IE5ldyB0ZXN0ICJ3aXRoIGZpbHRlciBhbmQgZGF0YSIKLSsJdG8gZW5zdXJlIGZpbHRlciBpcyBwYXNzZWQgY29ycmVjdCB2YWx1ZS4KLSsKLSsyMDEzLTAyLTI4ICBKYW1lcyBIdW50ICA8amFtZXMuaHVudEB1YnVudHUuY29tPgotKwotKwkqIFJlbW92YWwgb2YgZ2NjICdtYWxsb2MnIGZ1bmN0aW9uIGF0dHJpYnV0ZSByZXN1bHRpbmcgZnJvbQotKwkgIGEgY2xhcmlmaWNhdGlvbiBpbiBpdHMgZGVzY3JpcHRpb24gd2hpY2ggbWFrZXMgaXRzIHVzZSBpbnZhbGlkLgotKwkgIChMUDogIzExMjM1ODgpLgotKwotKzIwMTMtMDItMDUgIEphbWVzIEh1bnQgIDxqYW1lcy5odW50QHVidW50dS5jb20+Ci0rCi0rCSogbmloL2xvZ2dpbmcuYzogbmloX2xvZ19hYm9ydF9tZXNzYWdlKCk6IFJlbW92ZSBlcnJvbmVvdXMgY2hlY2sKLSsJICBsZWZ0IG92ZXIgZnJvbSB1c2Ugb2YgX19hYm9ydF9tc2cgd2VhayBzeW1ib2wuCi0rCSogbmloL3Rlc3RzL3Rlc3RfbG9nZ2luZy5jOiBSZW1vdmUgdW5lY2Vzc2FyeSBjaGVjayBvbiB3aGV0aGVyCi0rCSAgX19uaWhfYWJvcnRfbXNnIGhhcyBhbiBhZGRyZXNzLgotKwotKzIwMTItMTItMTMgIFN0w6lwaGFuZSBHcmFiZXIgIDxzdGdyYWJlckB1YnVudHUuY29tPgotKwotKwkqIG5paC1kYnVzLXRvb2wvdHlwZS5jLCBuaWgtZGJ1cy10b29sL21hcnNoYWwuYzogVXBkYXRlIGRidXMgY29kZQotKwlnZW5lcmF0b3IgdG8gYWxsb3cgZm9yIGVtcHR5IGxpc3RzIGZvciB0eXBlICdhcycuICBUaGlzIGRyb3BzIHRoZQotKwkhPSBOVUxMIGNoZWNrIGZvciBOVUxMIHRlcm1pbmF0ZWQgYXJyYXlzIGFuZCBtb3ZlcyB0aGUgaXRlcmF0aW9uCi0rCWxvb3AgaW5zaWRlIGFuICdpZicgc3RhdGVtZW50LgotKwotKzIwMTItMTItMTEgIERtaXRyaWpzIExlZGtvdnMgIDxkbWl0cmlqcy5sZWRrb3ZzQGNhbm9uaWNhbC5jb20+Ci0rCi0rCSogbmloL2ZpbGUuYyAobmloX2Rpcl93YWxrX3NjYW4pOiBGYWxsYmFjayB0byBsc3RhdCwgaWYgdGhlCi0rCW5vbi1wb3J0YWJsZSBkaXJlbnQuZF90eXBlIGlzIG5vdCBhdmFpbGFibGUgKExQOiAjNjcyNjQzKSAoQ2xvc2VzOgotKwkjNjk1NjA0KS4KLSsKLSsyMDEyLTEyLTEwICBQZXRyIExhdXRyYmFjaCAgPHBsYXV0cmJhQHJlZGhhdC5jb20+Ci0rCi0rCSogbmloL3Rlc3RzL3Rlc3RfZmlsZS5jOiBkb24ndCB1c2UgZGlyZW50LmRfdHlwZSAobm90IHBvcnRhYmxlKQotKwotKzIwMTItMTAtMjUgIEphbWVzIEh1bnQgIDxqYW1lcy5odW50QHVidW50dS5jb20+Ci0rCi0rCSogbmloL2xvZ2dpbmcuYzogVXNlIG91ciBvd24gX19uaWhfYWJvcnRfbXNnIHJhdGhlciB0aGFuIHRoZQotKwkoZSlnbGliYyBwcml2YXRlIHN5bWJvbCBfX2Fib3J0X21zZyB0byBhdm9pZCB1cGdyYWRlIGlzc3VlcyAoTFA6ICM5OTczNTkpLgotKwkqIG5paC90ZXN0cy90ZXN0X2xvZ2dpbmcuYzogVXBkYXRlIHRlc3RzIGZvciBfX25paF9hYm9ydF9tc2cuCi0rCi0rMjAxMS0wOC0zMSAgSmFtZXMgSHVudCAgPGphbWVzLmh1bnRAdWJ1bnR1LmNvbT4KLSsKLSsJKiBuaWgtZGJ1cy10b29sL3Rlc3RzL3Rlc3RfY29tLm5ldHNwbGl0Lk5paC5UZXN0X29iamVjdC5jCi0rCSh0ZXN0X3VuaXhfZmRfdG9fc3RyKTogU2FuaXR5IGNoZWNrIHZhbHVlIGJlZm9yZSBpbnZva2luZyBzdHJjaHIgaW4KLSsJY2FzZSBpdCByZXR1cm5zIGFkZHJlc3Mgb2YgbnVsbCAod2hpY2ggd291bGQgZ2l2ZSBhIG1pc2xlYWRpbmcgdGVzdAotKwlwYXNzKS4KLSsJKiBuaWgtZGJ1cy10b29sL3Rlc3RzL3Rlc3RfY29tLm5ldHNwbGl0Lk5paC5UZXN0X3Byb3h5LmMKLSsJKHRlc3RfdW5peF9mZF90b19zdHIsIHRlc3RfdW5peF9mZF90b19zdHJfc3luYyk6IFNhbml0eSBjaGVjayB2YWx1ZQotKwliZWZvcmUgaW52b2tpbmcgc3RyY2hyIGluIGNhc2UgaXQgcmV0dXJucyBhZGRyZXNzIG9mIG51bGwgKHdoaWNoIHdvdWxkCi0rCWdpdmUgYSBtaXNsZWFkaW5nIHRlc3QgcGFzcykuCi0rCSogbmloL2NvbmZpZy5jICgpOiBuaWhfY29uZmlnX2Jsb2NrX2VuZDogQWRkIGNoZWNrIHRvIGVuc3VyZSBzdHJjaHIoKQotKwlkb2Vzbid0IHJldHVybiBhZGRyZXNzIG9mIG51bGwgc2luY2UgdGhpcyB3b3VsZCByZXN1bHQgaW4gYSBtaXNsZWFkaW5nCi0rCXJldHVybiB2YWx1ZSBvZiBUUlVFLgotKwotKwkqIG5paC9zdHJpbmcuYyAobmloX3N0cl9zcGxpdCk6IEZpeGVzIHRvIGF2b2lkIG92ZXItcnVubmluZwotKwlpbnB1dCBzdHJpbmcgYW5kIGFsc28gcmV0dXJuaW5nIGFuIGVtcHR5IHN0cmluZyBhcnJheSBlbnRyeQotKwl3aGVuIHJlcGVhdCBpcyB0cnVlIChMUDogIzgzNDgxMykuCi0rCSogbmloL3Rlc3RzL3Rlc3Rfc3RyaW5nLmMgKHRlc3Rfc3RyX3NwbGl0KTogQWRkZWQgYSBsb3Qgb2YgbmV3Ci0rCXRlc3RzIGZvciBuaWhfc3RyX3NwbGl0KCkuCi0rCi0rMjAxMS0wOC0yNiAgSmFtZXMgSHVudCAgPGphbWVzLmh1bnRAdWJ1bnR1LmNvbT4KLSsKLSsJKiBuaWgvaW8uYyAobmloX2lvX3NlbGVjdF9mZHMpOiBFbnN1cmUgbnVtYmVyIG9mIGZkcyBiZWluZyBtYW5hZ2VkCi0rCWlzIHdpdGhpbiBsaW1pdHMuCi0rCi0rCSogbmloL2NvbmZpZy5jLCBuaWgvZXJyb3IuaCwgbmloL2lvLmMsIG5paC90ZXN0X2ZpbGVzLmg6IENvcnJlY3QKLSsJdHlwb3MgaW4gY29tbWVudHMuCi0rCi0rMjAxMS0wNi0yMCAgSmFtZXMgSHVudCAgPGphbWVzLmh1bnRAdWJ1bnR1LmNvbT4KLSsKLSsJKiBuaWgvd2F0Y2guYyAobmloX3dhdGNoX2hhbmRsZSk6IEhhbmRsZSBub24tZGlyZWN0b3J5IHdhdGNoZXM7Ci0rCXByZXZpb3VzbHkgYSBmaWxlIHdhdGNoIHJlc3VsdGVkIGluIGFuIGludmFsaWQgZmlsZSBwYXRoIGVuZGluZyBpbgotKwlhIHNpbmdsZSBzbGFzaCAoTFA6Izc3NzA5NykuCi0rCSogbmloL3Rlc3RzL3Rlc3Rfd2F0Y2guYzogQWRkZWQgZXhwbGljaXQgdGVzdCBmb3Igd2F0Y2ggb24gYSBmaWxlLgotKwotIDIwMTAtMTItMjMgIFNjb3R0IEphbWVzIFJlbW5hbnQgIDxzY290dEBuZXRzcGxpdC5jb20+Ci0gCi0gCSogTkVXUzogUmVsZWFzZSAxLjAuMwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC93YXRjaC5jCi0rKysgbGlibmloLTEuMC4zL25paC93YXRjaC5jCi1AQCAtMiw4ICsyLDggQEAKLSAgKgotICAqIHdhdGNoLmMgLSB3YXRjaGluZyBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2l0aCBpbm90aWZ5Ci0gICoKLS0gKiBDb3B5cmlnaHQgwqkgMjAwOSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+LgotLSAqIENvcHlyaWdodCDCqSAyMDA5IENhbm9uaWNhbCBMdGQuCi0rICogQ29weXJpZ2h0IMKpIDIwMTEgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KLSsgKiBDb3B5cmlnaHQgwqkgMjAxMSBDYW5vbmljYWwgTHRkLgotICAqCi0gICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgYXMKLUBAIC03MSw2ICs3MSw5IEBACi0gCQkJCQkgICAgICB1aW50MzJfdCBldmVudHMsIHVpbnQzMl90IGNvb2tpZSwKLSAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gCQkJCQkgICAgICBpbnQgKmNhdWdodF9mcmVlKTsKLStzdGF0aWMgaW50ICAgICAgICAgICAgIG5paF93YXRjaF93YWxrX2ZpbHRlciAodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqcGF0aCwKLSsJCQkJCSAgICAgIGludCBpc19kaXIpCi0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSAKLSAvKioKLUBAIC05MSw3ICs5NCw3IEBACi0gICogc3ViLWRpcmVjdG9yaWVzIHdpbGwgYmUgYXV0b21hdGljYWxseSB3YXRjaGVkLgotICAqCi0gICogQWRkaXRpb25hbGx5LCB0aGUgc2V0IG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoaW4gQHBhdGggY2FuIGJlCi0tICogbGltaXRlZCBieSBwYXNzaW5nIGEgQGZpbHRlciBmdW5jdGlvbiB3aGljaCB3aWxsIHJlY2lldmUgdGhlIHBhdGhzIGFuZAotKyAqIGxpbWl0ZWQgYnkgcGFzc2luZyBhIEBmaWx0ZXIgZnVuY3Rpb24gd2hpY2ggd2lsbCByZWNlaXZlIHRoZSBwYXRocyBhbmQKLSAgKiBtYXkgcmV0dXJuIFRSVUUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcGF0aCByZWNlaXZlZCBzaG91bGQgbm90IGJlIHdhdGNoZWQuCi0gICoKLSAgKiBXaGVuIGEgZmlsZSBpcyBjcmVhdGVkIHdpdGhpbiBAcGF0aCwgb3IgbW92ZWQgZnJvbSBvdXRzaWRlIHRoaXMgbG9jYXRpb24KLUBAIC0xMDQsNyArMTA3LDcgQEAKLSAgKiBmaWxlcyB0aGF0IGV4aXN0IHVuZGVyIEBwYXRoIHdoZW4gdGhlIHdhdGNoIGlzIGZpcnN0IGFkZGVkLiAgVGhpcyBvbmx5Ci0gICogb2NjdXJzIGlmIHRoZSB3YXRjaCBjYW4gYmUgYWRkZWQuCi0gICoKLS0gKiBUaGlzIGlzIGEgdmVyeSBoaWdoIGxldmVsIHdyYXBwZWQgYXJvdW5kIHRoZSBpbm90aWZ5IEFQSTsgbG93ZXIgbGV2ZWxzCi0rICogVGhpcyBpcyBhIHZlcnkgaGlnaCBsZXZlbCB3cmFwcGVyIGFyb3VuZCB0aGUgaW5vdGlmeSBBUEk7IGxvd2VyIGxldmVscwotICAqIGNhbiBiZSBvYnRhaW5lZCB1c2luZyB0aGUgaW5vdGlmeSBBUEkgaXRzZWxmIGFuZCBzb21lIG9mIHRoZSBoZWxwZXIKLSAgKiBmdW5jdGlvbnMgdXNlZCBieSB0aGlzIG9uZS4KLSAgKgotQEAgLTE4NSw2ICsxODgsMzUgQEAKLSB9Ci0gCi0gCi0rIC8qKgotKyAqIG5paF93YXRjaF93YWxrX2ZpbHRlcjoKLSsgKiBAZGF0YTogTmloV2F0Y2gsCi0rICogQHBhdGg6IHBhdGggdG8gZmlsZSwKLSsgKiBAaXNfZGlyOiBUUlVFIGlmIEBwYXRoIGlzIGEgZGlyZWN0b3J5LgotKyAqCi0rICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIG5paF9kaXJfd2FsaygpLCB1c2VkIGJ5IG5paF93YXRjaF9hZGQoKSB0byB3cmFwCi0rICogdGhlIHVzZXItc3BlY2lmaWVkIE5paEZpbGVGaWx0ZXIgKHdhdGNoLT5maWx0ZXIpIHdpdGggYSBmaWx0ZXIgdGhhdCBjYW4KLSsgKiB0YWtlIHdhdGNoIGl0c2VsZiBhcyBhbiBhcmd1bWVudC4KLSsgKgotKyAqIFJldHVybnM6IFRSVUUgaWYgdGhlIHBhdGggc2hvdWxkIGJlIGlnbm9yZWQsIEZBTFNFIG90aGVyd2lzZS4KLSsgKiovCi0rc3RhdGljIGludAotK25paF93YXRjaF93YWxrX2ZpbHRlciAodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqcGF0aCwgaW50IGlzX2RpcikKLSt7Ci0rICAgIE5paFdhdGNoICp3YXRjaDsKLSsKLSsgICAgd2F0Y2ggPSAoTmloV2F0Y2ggKilkYXRhOwotKwotKyAgICBuaWhfYXNzZXJ0ICh3YXRjaCk7Ci0rCi0rICAgIC8qIE5vIGZpbHRlciwgc28gYWNjZXB0IGFsbCBmaWxlcyAqLwotKyAgICBpZiAoISB3YXRjaC0+ZmlsdGVyKQotKyAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotKwotKyAgICByZXR1cm4gd2F0Y2gtPmZpbHRlciAod2F0Y2gtPmRhdGEsIHBhdGgsIGlzX2Rpcik7Ci0rfQotKwotKwotIC8qKgotICAqIG5paF93YXRjaF9oYW5kbGVfYnlfd2Q6Ci0gICogQHdhdGNoOiB3YXRjaCB0byBzZWFyY2gsCi1AQCAtMjk1LDcgKzMyNyw3IEBACi0gCSAqIG9uZTsgZXJyb3JzIHdpdGhpbiB0aGUgd2FsayBhcmUgd2FybmVkIGF1dG9tYXRpY2FsbHksIHNvIGlmIHRoaXMKLSAJICogZmFpbHMsIGl0IG1lYW5zIHdlIGxpdGVyYWxseSBjb3VsZG4ndCB3YXRjaCB0aGUgdG9wLWxldmVsLgotIAkgKi8KLS0JaWYgKHN1YmRpcnMgJiYgKG5paF9kaXJfd2FsayAocGF0aCwgd2F0Y2gtPmZpbHRlciwKLSsJaWYgKHN1YmRpcnMgJiYgKG5paF9kaXJfd2FsayAocGF0aCwgbmloX3dhdGNoX3dhbGtfZmlsdGVyLAotIAkJCQkgICAgICAoTmloRmlsZVZpc2l0b3IpbmloX3dhdGNoX2FkZF92aXNpdG9yLAotIAkJCQkgICAgICBOVUxMLCB3YXRjaCkgPCAwKSkgewotIAkJTmloRXJyb3IgKmVycjsKLUBAIC00OTQsMTIgKzUyNiwyMSBAQAotIAkJcmV0dXJuOwotIAl9Ci0gCi0rCS8qIEV2ZXJ5IG90aGVyIGV2ZW50IG11c3QgY29tZSB3aXRoIGEgbmFtZSAqLwotKwlpZiAobmFtZSAmJiAqbmFtZSkgewotIAotLQkvKiBFdmVyeSBvdGhlciBldmVudCBtdXN0IGNvbWUgd2l0aCBhIG5hbWUuICovCi0tCWlmICgoISBuYW1lKSB8fCBzdHJjaHIgKG5hbWUsICcvJykpCi0tCQlyZXR1cm47Ci0rCQkvKiBJZiBuYW1lIHJlZmVycyB0byBhIGRpcmVjdG9yeSwgdGhlcmUgc2hvdWxkIGJlIG5vIGFzc29jaWF0ZWQKLSsJCSAqIHBhdGggLSBqdXN0IHRoZSBuYW1lIG9mIHRoZSBwYXRoIGVsZW1lbnQuCi0rCQkgKi8KLSsJCWlmIChzdHJjaHIgKG5hbWUsICcvJykpCi0rCQkJcmV0dXJuOwotIAotLQlwYXRoID0gTklIX01VU1QgKG5paF9zcHJpbnRmIChOVUxMLCAiJXMvJXMiLCBoYW5kbGUtPnBhdGgsIG5hbWUpKTsKLSsJCS8qIEV2ZW50IG9jY3VyZWQgZm9yIGZpbGUgd2l0aGluIGEgd2F0Y2hlZCBkaXJlY3RvcnkgKi8KLSsJCXBhdGggPSBOSUhfTVVTVCAobmloX3NwcmludGYgKE5VTEwsICIlcy8lcyIsIGhhbmRsZS0+cGF0aCwgbmFtZSkpOwotKwl9IGVsc2UgewotKwkJLyogRmlsZSBldmVudCBvY2N1cmVkICovCi0rCQlwYXRoID0gTklIX01VU1QgKG5paF9zdHJkdXAgKE5VTEwsIGhhbmRsZS0+cGF0aCkpOwotKwl9Ci0gCi0gCS8qIENoZWNrIHRoZSBmaWx0ZXIgKi8KLSAJaWYgKHdhdGNoLT5maWx0ZXIgJiYgd2F0Y2gtPmZpbHRlciAod2F0Y2gtPmRhdGEsIHBhdGgsCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL2hhc2guaAotKysrIGxpYm5paC0xLjAuMy9uaWgvaGFzaC5oCi1AQCAtMTQxLDcgKzE0MSw3IEBACi0gICogQGhhc2g6IGhhc2ggdGFibGUgdG8gaXRlcmF0ZSwKLSAgKiBAaXRlcjogbmFtZSBvZiBpdGVyYXRvciB2YXJpYWJsZS4KLSAgKgotLSAqIEV4cGFucyB0byBuZXN0ZWQgZm9yIHN0YXRlbWVudHMgdGhhdCBpdGVyYXRlIG92ZXIgZWFjaCBlbnRyeSBpbiBlYWNoCi0rICogRXhwYW5kcyB0byBuZXN0ZWQgZm9yIHN0YXRlbWVudHMgdGhhdCBpdGVyYXRlIG92ZXIgZWFjaCBlbnRyeSBpbiBlYWNoCi0gICogYmluIG9mIEBoYXNoLCBleGNlcHQgZm9yIHRoZSBiaW4gaGVhZCBwb2ludGVyLCBzZXR0aW5nIEBpdGVyIHRvIGVhY2gKLSAgKiBlbnRyeSBmb3IgdGhlIGJsb2NrIHdpdGhpbiB0aGUgbG9vcC4gIEEgdmFyaWFibGUgbmFtZWQgX0BpdGVyX2kgaXMgdXNlZAotICAqIHRvIGl0ZXJhdGUgdGhlIGhhc2ggYmlucy4KLUBAIC0yMDMsNyArMjAzLDcgQEAKLSAJCQkJICAgTmloS2V5RnVuY3Rpb24ga2V5X2Z1bmN0aW9uLAotIAkJCQkgICBOaWhIYXNoRnVuY3Rpb24gaGFzaF9mdW5jdGlvbiwKLSAJCQkJICAgTmloQ21wRnVuY3Rpb24gY21wX2Z1bmN0aW9uKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5paExpc3QgKiAgIG5paF9oYXNoX2FkZCAgICAgICAgICAoTmloSGFzaCAqaGFzaCwgTmloTGlzdCAqZW50cnkpOwotIE5paExpc3QgKiAgIG5paF9oYXNoX2FkZF91bmlxdWUgICAoTmloSGFzaCAqaGFzaCwgTmloTGlzdCAqZW50cnkpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9tYWluLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL21haW4uaAotQEAgLTEzOCw3ICsxMzgsNyBAQAotIAotIE5paE1haW5Mb29wRnVuYyAqbmloX21haW5fbG9vcF9hZGRfZnVuYyAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCSAgTmloTWFpbkxvb3BDYiBjYWxsYmFjaywgdm9pZCAqZGF0YSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSB2b2lkICAgICAgICAgICAgIG5paF9tYWluX3Rlcm1fc2lnbmFsICAgICh2b2lkICpkYXRhLCBOaWhTaWduYWwgKnNpZ25hbCk7Ci0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL2NvbW1hbmQuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvY29tbWFuZC5oCi1AQCAtMTIzLDcgKzEyMyw3IEBACi0gCi0gTmloQ29tbWFuZCAqbmloX2NvbW1hbmRfam9pbiAgIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCWNvbnN0IE5paENvbW1hbmQgKmEsIGNvbnN0IE5paENvbW1hbmQgKmIpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvY29uZmlnLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2NvbmZpZy5oCi1AQCAtMTQwLDEwICsxNDAsMTAgQEAKLSBjaGFyICogICAgbmloX2NvbmZpZ19uZXh0X3Rva2VuICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqZmlsZSwKLSAJCQkJICAgICAgc2l6ZV90IGxlbiwgc2l6ZV90ICpwb3MsIHNpemVfdCAqbGluZW5vLAotIAkJCQkgICAgICBjb25zdCBjaGFyICpkZWxpbSwgaW50IGRlcXVvdGUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgIG5paF9jb25maWdfbmV4dF9hcmcgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKmZpbGUsCi0gCQkJCSAgICAgIHNpemVfdCBsZW4sIHNpemVfdCAqcG9zLCBzaXplX3QgKmxpbmVubykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSB2b2lkICAgICAgbmloX2NvbmZpZ19uZXh0X2xpbmUgICAgICAgKGNvbnN0IGNoYXIgKmZpbGUsIHNpemVfdCBsZW4sCi0gCQkJCSAgICAgIHNpemVfdCAqcG9zLCBzaXplX3QgKmxpbmVubyk7Ci0gCi1AQCAtMTU1LDE1ICsxNTUsMTUgQEAKLSAKLSBjaGFyICoqICAgbmloX2NvbmZpZ19wYXJzZV9hcmdzICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqZmlsZSwKLSAJCQkJICAgICAgc2l6ZV90IGxlbiwgc2l6ZV90ICpwb3MsIHNpemVfdCAqbGluZW5vKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKiAgICBuaWhfY29uZmlnX3BhcnNlX2NvbW1hbmQgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpmaWxlLAotIAkJCQkgICAgICBzaXplX3QgbGVuLCBzaXplX3QgKnBvcywgc2l6ZV90ICpsaW5lbm8pCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgIG5paF9jb25maWdfcGFyc2VfYmxvY2sgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKmZpbGUsCi0gCQkJCSAgICAgIHNpemVfdCBsZW4sIHNpemVfdCAqcG9zLCBzaXplX3QgKmxpbmVubywKLSAJCQkJICAgICAgY29uc3QgY2hhciAqdHlwZSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBpbnQgICAgICAgbmloX2NvbmZpZ19za2lwX2Jsb2NrICAgICAgKGNvbnN0IGNoYXIgKmZpbGUsIHNpemVfdCBsZW4sCi0gCQkJCSAgICAgIHNpemVfdCAqbGluZW5vLCBzaXplX3QgKnBvcywKLSAJCQkJICAgICAgY29uc3QgY2hhciAqdHlwZSwgc2l6ZV90ICplbmRwb3MpCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL2lvLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2lvLmMKLUBAIC0yLDggKzIsOCBAQAotICAqCi0gICogaW8uYyAtIGZpbGUgYW5kIHNvY2tldCBpbnB1dC9vdXRwdXQgaGFuZGxpbmcKLSAgKgotLSAqIENvcHlyaWdodCDCqSAyMDA5IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCi0tICogQ29weXJpZ2h0IMKpIDIwMDkgQ2Fub25pY2FsIEx0ZC4KLSsgKiBDb3B5cmlnaHQgwqkgMjAxMSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+LgotKyAqIENvcHlyaWdodCDCqSAyMDExIENhbm9uaWNhbCBMdGQuCi0gICoKLSAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLCBhcwotQEAgLTE2NSw2ICsxNjUsNyBAQAotIAluaWhfYXNzZXJ0IChyZWFkZmRzICE9IE5VTEwpOwotIAluaWhfYXNzZXJ0ICh3cml0ZWZkcyAhPSBOVUxMKTsKLSAJbmloX2Fzc2VydCAoZXhjZXB0ZmRzICE9IE5VTEwpOwotKwluaWhfYXNzZXJ0ICgqbmZkcyA8PSBGRF9TRVRTSVpFKTsKLSAKLSAJbmloX2lvX2luaXQgKCk7Ci0gCi1AQCAtMTg2LDYgKzE4Nyw5IEBACi0gCQkJKm5mZHMgPSBuaWhfbWF4ICgqbmZkcywgd2F0Y2gtPmZkICsgMSk7Ci0gCQl9Ci0gCX0KLSsKLSsJLyogUmUtY2hlY2sgaW4gY2FzZSB3ZSBleGNlZWRlZCB0aGUgbGltaXQgaW4gdGhlIGxvb3AgKi8KLSsJbmloX2Fzc2VydCAoKm5mZHMgPD0gRkRfU0VUU0laRSk7Ci0gfQotIAotIC8qKgotQEAgLTkwMSw3ICs5MDUsNyBAQAotICAqIHJlYWQgYW5kIHBsYWNlZCBpbnRvIHRoZSByZWNlaXZlIGJ1ZmZlciBvciBxdWV1ZSwgYW5kIHRoZSByZWFkZXIgZnVuY3Rpb24KLSAgKiBpcyBjYWxsZWQgaWYgc2V0LgotICAqCi0tICogQW55IGRhdGEgb3IgbWVzc2FhZ2VzIGluIHRoZSBzZW5kIGJ1ZmZlciBvciBxdWV1ZSBhcmUgd3JpdHRlbiBvdXQgaWYgdGhlCi0rICogQW55IGRhdGEgb3IgbWVzc2FnZXMgaW4gdGhlIHNlbmQgYnVmZmVyIG9yIHF1ZXVlIGFyZSB3cml0dGVuIG91dCBpZiB0aGUKLSAgKiBAZXZlbnRzIGluY2x1ZGVzIE5JSF9JT19XUklURS4KLSAgKgotICAqIEVycm9ycyBhcmUgaGFuZGxlZCB3aGVuIGRhdGEgaXMgcmVhZCwgYW5kIHJlc3VsdCBpbiB0aGUgZXJyb3IgaGFuZGxlZAotQEAgLTEyMTEsNyArMTIxNSw3IEBACi0gICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgbG9jYWwgZW5kIG9mIGEgZmlsZSBkZXNjcmlwdG9yIGJlaW5nCi0gICogbWFuYWdlZCBieSBOaWhJbyBzaG91bGQgYmUgY2xvc2VkLiAgVXN1YWxseSB0aGlzIGlzIGJlY2F1c2UgdGhlIHJlbW90ZQotICAqIGVuZCBoYXMgYmVlbiBjbG9zZWQgKHdpdGhvdXQgZXJyb3IpIGJ1dCBpdCBjYW4gYWxzbyBiZSBiZWNhdXNlIG5vCi0tICogZXJyb3IgaGFuZGxlciB3YXMgZ2l2ZW4KLSsgKiBlcnJvciBoYW5kbGVyIHdhcyBnaXZlbi4KLSAgKgotICAqIE5vcm1hbGx5IHRoaXMganVzdCBjYWxscyB0aGUgY2xvc2UgaGFuZGxlciwgb3IgaWYgbm90IGF2YWlsYWJsZSwgaXQKLSAgKiBjbG9zZXMgdGhlIGZpbGUgZGVzY3JpcHRvciBhbmQgZnJlZXMgdGhlIHN0cnVjdHVyZSAod2hpY2ggbWF5IGJlCi1AQCAtMTI5MSw3ICsxMjk1LDcgQEAKLSAgKiBAaW86IHN0cnVjdHVyZSB0byBiZSBkZXN0cm95ZWQuCi0gICoKLSAgKiBDbG9zZXMgdGhlIGZpbGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggYW4gTmloSW8gc3RydWN0dXJlIHNvIHRoYXQKLS0gKiB0aGUgc3RydWN0dXJlIGNhbiBiZSBmcmVlZC4gIElGIGFuIGVycm9yIGlzIGNhdWdodCBieSBjbG9zaW5nIHRoZQotKyAqIHRoZSBzdHJ1Y3R1cmUgY2FuIGJlIGZyZWVkLiAgSWYgYW4gZXJyb3IgaXMgY2F1Z2h0IGJ5IGNsb3NpbmcgdGhlCi0gICogZGVzY3JpcHRvciwgdGhlIGVycm9yIGhhbmRsZXIgaXMgY2FsbGVkIGluc3RlYWQgb2YgdGhlIGVycm9yIGJlaW5nIHJhaXNlZDsKLSAgKiB0aGlzIGFsbG93cyB5b3UgdG8gZ3JvdXAgeW91ciBlcnJvciBoYW5kbGluZyBpbiBvbmUgcGxhY2UgcmF0aGVyIHRoYW4KLSAgKiBzcGVjaWFsLWNhc2UgY2xvc2UuCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL3dhdGNoLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL3dhdGNoLmgKLUBAIC0xNTYsNyArMTU2LDcgQEAKLSAJCQkgICAgIE5paENyZWF0ZUhhbmRsZXIgY3JlYXRlX2hhbmRsZXIsCi0gCQkJICAgICBOaWhNb2RpZnlIYW5kbGVyIG1vZGlmeV9oYW5kbGVyLAotIAkJCSAgICAgTmloRGVsZXRlSGFuZGxlciBkZWxldGVfaGFuZGxlciwgdm9pZCAqZGF0YSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBpbnQgICAgICAgbmloX3dhdGNoX2FkZCAgICAgKE5paFdhdGNoICp3YXRjaCwgY29uc3QgY2hhciAqcGF0aCwgaW50IHN1YmRpcnMpCi0gCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvdHJlZS5oCi0rKysgbGlibmloLTEuMC4zL25paC90cmVlLmgKLUBAIC0zNDQsOSArMzQ0LDkgQEAKLSAKLSB2b2lkICAgICAgICAgIG5paF90cmVlX2luaXQgICAgICAgICAgIChOaWhUcmVlICp0cmVlKTsKLSBOaWhUcmVlICogICAgIG5paF90cmVlX25ldyAgICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gTmloVHJlZUVudHJ5ICpuaWhfdHJlZV9lbnRyeV9uZXcgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5paFRyZWUgKiAgICAgbmloX3RyZWVfYWRkICAgICAgICAgICAgKE5paFRyZWUgKnRyZWUsIE5paFRyZWUgKm5vZGUsCi0gCQkJCSAgICAgICBOaWhUcmVlV2hlcmUgd2hlcmUpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9maWxlLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2ZpbGUuYwotQEAgLTY1LDcgKzY1LDcgQEAKLSAvKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zICovCi0gc3RhdGljIGNoYXIgKipuaWhfZGlyX3dhbGtfc2NhbiAgKGNvbnN0IGNoYXIgKnBhdGgsIE5paEZpbGVGaWx0ZXIgZmlsdGVyLAotIAkJCQkgIHZvaWQgKmRhdGEpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gc3RhdGljIGludCAgICBuaWhfZGlyX3dhbGtfdmlzaXQgKGNvbnN0IGNoYXIgKmRpcm5hbWUsIE5paExpc3QgKmRpcnMsCi0gCQkJCSAgY29uc3QgY2hhciAqcGF0aCwgTmloRmlsZUZpbHRlciBmaWx0ZXIsCi0gCQkJCSAgTmloRmlsZVZpc2l0b3IgdmlzaXRvciwKLUBAIC02MTksNiArNjE5LDggQEAKLSAJc3RydWN0IGRpcmVudCAgKmVudDsKLSAJY2hhciAgICAgICAgICAqKnBhdGhzOwotIAlzaXplX3QgICAgICAgICAgbnBhdGhzOwotKwlpbnQgICAgICAgICAgICAgaXNkaXI7Ci0rCXN0cnVjdCBzdGF0ICAgICBzdGF0YnVmOwotIAotIAluaWhfYXNzZXJ0IChwYXRoICE9IE5VTEwpOwotIAotQEAgLTY0MCw3ICs2NDIsMTUgQEAKLSAJCXN1YnBhdGggPSBOSUhfTVVTVCAobmloX3NwcmludGYgKE5VTEwsICIlcy8lcyIsCi0gCQkJCQkJIHBhdGgsIGVudC0+ZF9uYW1lKSk7Ci0gCi0tCQlpZiAoZmlsdGVyICYmIGZpbHRlciAoZGF0YSwgc3VicGF0aCwgZW50LT5kX3R5cGUgPT0gRFRfRElSKSkKLSsJCWlmIChlbnQtPmRfdHlwZSA9PSBEVF9VTktOT1dOKSB7Ci0rCQkJaWYgKCBsc3RhdCAoc3VicGF0aCwgJnN0YXRidWYpKQotKwkJCQlpc2RpciA9IDA7Ci0rCQkJZWxzZQotKwkJCQlpc2RpciA9IFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKTsKLSsJCX0gZWxzZQotKwkJCWlzZGlyID0gZW50LT5kX3R5cGUgPT0gRFRfRElSOwotKwotKwkJaWYgKGZpbHRlciAmJiBmaWx0ZXIgKGRhdGEsIHN1YnBhdGgsIGlzZGlyKSkKLSAJCQljb250aW51ZTsKLSAKLSAJCU5JSF9NVVNUIChuaWhfc3RyX2FycmF5X2FkZHAgKCZwYXRocywgTlVMTCwgJm5wYXRocywgc3VicGF0aCkpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9hbGxvYy5jCi0rKysgbGlibmloLTEuMC4zL25paC9hbGxvYy5jCi1AQCAtMTE5LDggKzExOSw3IEBACi0gc3RhdGljIGlubGluZSBpbnQgICAgICAgICAgbmloX2FsbG9jX2NvbnRleHRfZnJlZSAgIChOaWhBbGxvY0N0eCAqY3R4KTsKLSAKLSBzdGF0aWMgaW5saW5lIE5paEFsbG9jUmVmICpuaWhfYWxsb2NfcmVmX25ldyAgICAgICAgKE5paEFsbG9jQ3R4ICpwYXJlbnQsCi0tCQkJCQkJICAgICBOaWhBbGxvY0N0eCAqY2hpbGQpCi0tCV9fYXR0cmlidXRlX18gKChtYWxsb2MpKTsKLSsJCQkJCQkgICAgIE5paEFsbG9jQ3R4ICpjaGlsZCk7Ci0gc3RhdGljIGlubGluZSB2b2lkICAgICAgICAgbmloX2FsbG9jX3JlZl9mcmVlICAgICAgIChOaWhBbGxvY1JlZiAqcmVmKTsKLSBzdGF0aWMgaW5saW5lIE5paEFsbG9jUmVmICpuaWhfYWxsb2NfcmVmX2xvb2t1cCAgICAgKE5paEFsbG9jQ3R4ICpwYXJlbnQsCi0gCQkJCQkJICAgICBOaWhBbGxvY0N0eCAqY2hpbGQpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC90aW1lci5oCi0rKysgbGlibmloLTEuMC4zL25paC90aW1lci5oCi1AQCAtNTksNyArNTksNyBAQAotICAqIEBtb250aHM6IG1vbnRocyAoMS0xMiksCi0gICogQHdkYXlzOiBkYXlzIG9mIHdlZWsgKDAtNykuCi0gICoKLS0gKiBJbmRpZGNhdGVzIHdoZW4gc2NoZWR1bGVkIHRpbWVycyBzaG91bGQgYmUgcnVuLCBlYWNoIG1lbWJlciBpcyBhIGJpdAotKyAqIEluZGljYXRlcyB3aGVuIHNjaGVkdWxlZCB0aW1lcnMgc2hvdWxkIGJlIHJ1biwgZWFjaCBtZW1iZXIgaXMgYSBiaXQKLSAgKiBmaWVsZCB3aGVyZSB0aGUgYml0IGlzIDEgaWYgdGhlIHRpbWVyIHNob3VsZCBiZSBydW4gZm9yIHRoYXQgdmFsdWUgYW5kCi0gICogMCBpZiBub3QuCi0gICoqLwotQEAgLTExNywxNCArMTE3LDE0IEBACi0gCi0gTmloVGltZXIgKm5paF90aW1lcl9hZGRfdGltZW91dCAgIChjb25zdCB2b2lkICpwYXJlbnQsIHRpbWVfdCB0aW1lb3V0LAotIAkJCQkgICBOaWhUaW1lckNiIGNhbGxiYWNrLCB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIE5paFRpbWVyICpuaWhfdGltZXJfYWRkX3BlcmlvZGljICAoY29uc3Qgdm9pZCAqcGFyZW50LCB0aW1lX3QgcGVyaW9kLAotIAkJCQkgICBOaWhUaW1lckNiIGNhbGxiYWNrLCB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIE5paFRpbWVyICpuaWhfdGltZXJfYWRkX3NjaGVkdWxlZCAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkgICBOaWhUaW1lclNjaGVkdWxlICpzY2hlZHVsZSwKLSAJCQkJICAgTmloVGltZXJDYiBjYWxsYmFjaywgdm9pZCAqZGF0YSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOaWhUaW1lciAqbmloX3RpbWVyX25leHRfZHVlICAgICAgICh2b2lkKTsKLSB2b2lkICAgICAgbmloX3RpbWVyX3BvbGwgICAgICAgICAgICh2b2lkKTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvY29uZmlnLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2NvbmZpZy5jCi1AQCAtMiw4ICsyLDggQEAKLSAgKgotICAqIGNvbmZpZy5jIC0gY29uZmlndXJhdGlvbiBmaWxlIHBhcnNpbmcKLSAgKgotLSAqIENvcHlyaWdodCDCqSAyMDA5IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCi0tICogQ29weXJpZ2h0IMKpIDIwMDkgQ2Fub25pY2FsIEx0ZC4KLSsgKiBDb3B5cmlnaHQgwqkgMjAxMSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+LgotKyAqIENvcHlyaWdodCDCqSAyMDExIENhbm9uaWNhbCBMdGQuCi0gICoKLSAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLCBhcwotQEAgLTY1Nyw3ICs2NTcsNyBAQAotICAqIG9mIHRoZSByZXR1cm5lZCBzdHJpbmcgYXJlIGZyZWVkLCB0aGUgcmV0dXJuZWQgc3RyaW5nIHdpbGwgYWxzbyBiZQotICAqIGZyZWVkLgotICAqCi0tICogUmV0dXJuczogdGhlIGNvbW1hbmQgZm91bmQgb3IgTlVMTCBvbiByYWlzZWQgZXJyb3IuCi0rICogUmV0dXJuczogdGhlIG5ld2x5IGFsbG9jYXRlZCBjb21tYW5kIGZvdW5kIG9yIE5VTEwgb24gcmFpc2VkIGVycm9yLgotICAqKi8KLSBjaGFyICoKLSBuaWhfY29uZmlnX3BhcnNlX2NvbW1hbmQgKGNvbnN0IHZvaWQgKnBhcmVudCwKLUBAIC03MTQsNyArNzE0LDcgQEAKLSAgKiBAbGluZW5vOiBsaW5lIG51bWJlciwKLSAgKiBAdHlwZTogYmxvY2sgaWRlbnRpZmllci4KLSAgKgotLSAqIEV4dHJhY3RzIGEgYmxvY2sgb2YgdGV4dCBmcm9tIEBsaW5lLCBzdG9wcGluZyB3aGVuIHRoZSBwaGFyc2UgImVuZCBAdHlwZSIKLSsgKiBFeHRyYWN0cyBhIGJsb2NrIG9mIHRleHQgZnJvbSBAbGluZSwgc3RvcHBpbmcgd2hlbiB0aGUgcGhyYXNlICJlbmQgQHR5cGUiCi0gICogaXMgZW5jb3VudGVyZWQgd2l0aG91dCBhbnkgcXVvdGVzIG9yIGJsYWNrc2xhc2ggZXNjYXBpbmcgd2l0aGluIGl0LgotICAqCi0gICogQGZpbGUgbWF5IGJlIGEgbWVtb3J5IG1hcHBlZCBmaWxlLCBpbiB3aGljaCBjYXNlIEBwb3Mgc2hvdWxkIGJlIGdpdmVuCi1AQCAtOTUwLDcgKzk1MCw3IEBACi0gCQlyZXR1cm4gRkFMU0U7Ci0gCi0gCS8qIE11c3QgYmUgd2hpdGVzcGFjZSBhZnRlciAqLwotLQlpZiAoISBzdHJjaHIgKE5JSF9DT05GSUdfV1MsIGZpbGVbcCArIDNdKSkKLSsJaWYgKGZpbGVbcCArIDNdICYmICEgc3RyY2hyIChOSUhfQ09ORklHX1dTLCBmaWxlW3AgKyAzXSkpCi0gCQlyZXR1cm4gRkFMU0U7Ci0gCi0gCS8qIEZpbmQgdGhlIHNlY29uZCB3b3JkICovCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL29wdGlvbi5oCi0rKysgbGlibmloLTEuMC4zL25paC9vcHRpb24uaAotQEAgLTEyNCwxMSArMTI0LDExIEBACi0gY2hhciAqKiAgICBuaWhfb3B0aW9uX3BhcnNlciAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCSAgICAgIGludCBhcmdjLCBjaGFyICphcmd2W10sCi0gCQkJCSAgICAgIE5paE9wdGlvbiAqb3B0aW9ucywgaW50IGJyZWFrX25vbm9wdCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOaWhPcHRpb24gKm5paF9vcHRpb25fam9pbiAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJICAgICAgY29uc3QgTmloT3B0aW9uICphLCBjb25zdCBOaWhPcHRpb24gKmIpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gaW50ICAgICAgICBuaWhfb3B0aW9uX2NvdW50ICAgICAgICAgIChOaWhPcHRpb24gKm9wdGlvbiwgY29uc3QgY2hhciAqYXJnKTsKLSBpbnQgICAgICAgIG5paF9vcHRpb25faW50ICAgICAgICAgICAgKE5paE9wdGlvbiAqb3B0aW9uLCBjb25zdCBjaGFyICphcmcpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9zaWduYWwuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvc2lnbmFsLmgKLUBAIC03Niw3ICs3Niw3IEBACi0gCi0gTmloU2lnbmFsICogbmloX3NpZ25hbF9hZGRfaGFuZGxlciAoY29uc3Qgdm9pZCAqcGFyZW50LCBpbnQgc2lnbnVtLAotIAkJCQkgICBOaWhTaWduYWxIYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmRhdGEpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gdm9pZCAgICAgICAgbmloX3NpZ25hbF9oYW5kbGVyICAgICAoaW50IHNpZ251bSk7Ci0gdm9pZCAgICAgICAgbmloX3NpZ25hbF9wb2xsICAgICAgICAodm9pZCk7Ci0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL2xpc3QuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvbGlzdC5oCi1AQCAtMzcsNyArMzcsNyBAQAotICAqIGFmdGVyIGEga25vd24gZW50cnksIGFuZCByZW1vdmUgYW4gZW50cnkgZnJvbSB0aGUgbGlzdC4KLSAgKgotICAqIExpc3QgZW50cmllcyBtYXkgYmUgY3JlYXRlZCBpbiBvbmUgb2YgdHdvIHdheXMuICBUaGUgbW9zdCBjb21tb24gaXMgdG8KLS0gKiBlbWJlZCB0aGUgTmloTGlzdCBzdHJ1Y3R1cmUgYXMgdGhlIGZyaXN0IG1lbWJlciBvZiB5b3VyIG93biBzdHJ1Y3R1cmUsCi0rICogZW1iZWQgdGhlIE5paExpc3Qgc3RydWN0dXJlIGFzIHRoZSBmaXJzdCBtZW1iZXIgb2YgeW91ciBvd24gc3RydWN0dXJlLAotICAqIGFuZCBpbml0aWFsaXNlIGl0IHdpdGggbmloX2xpc3RfaW5pdCgpIGFmdGVyIGFsbG9jYXRpbmcgdGhlIHN0cnVjdHVyZS4KLSAgKiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgY3JlYXRlIE5paExpc3RFbnRyeSBzdHJ1Y3R1cmVzIHdpdGgKLSAgKiBuaWhfbGlzdF9lbnRyeV9uZXcoKSBhbmQgcG9pbnQgYXQgeW91ciBvd24gZGF0YSBmcm9tIHRoZW0uCi1AQCAtMTk2LDEwICsxOTYsMTAgQEAKLSAKLSB2b2lkICAgICAgICAgIG5paF9saXN0X2luaXQgICAgICAoTmloTGlzdCAqZW50cnkpOwotIE5paExpc3QgKiAgICAgbmloX2xpc3RfbmV3ICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTmloTGlzdEVudHJ5ICpuaWhfbGlzdF9lbnRyeV9uZXcgKGNvbnN0IHZvaWQgKnBhcmVudCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSAKLSBOaWhMaXN0ICogICAgIG5paF9saXN0X2FkZCAgICAgICAoTmloTGlzdCAqbGlzdCwgTmloTGlzdCAqZW50cnkpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9sb2dnaW5nLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2xvZ2dpbmcuYwotQEAgLTM5LDExICszOSwxMSBAQAotIAotIAotIC8qKgotLSAqIF9fYWJvcnRfbXNnOgotKyAqIF9fbmloX2Fib3J0X21zZzoKLSAgKgotLSAqIEEgZ2xpYmMgdmFyaWFibGUgdGhhdCBrZWVwcyB0aGUgYXNzZXJ0aW9uIG1lc3NhZ2UgaW4gdGhlIGNvcmUgZHVtcC4KLSsgKiBBIHZhcmlhYmxlIHRoYXQga2VlcHMgdGhlIGFzc2VydGlvbiBtZXNzYWdlIGluIHRoZSBjb3JlIGR1bXAuCi0gICoqLwotLWV4dGVybiBjaGFyICpfX2Fib3J0X21zZyBfX2F0dHJpYnV0ZV9fICgod2VhaykpOwotK2NoYXIgKl9fbmloX2Fib3J0X21zZyA9IE5VTEw7Ci0gCi0gLyoqCi0gICogbG9nZ2VyOgotQEAgLTExNCwxOSArMTE0LDE2IEBACi0gICogbmloX2xvZ19hYm9ydF9tZXNzYWdlOgotICAqIEBtZXNzYWdlOiBtZXNzYWdlIHRvIGJlIGxvZ2dlZC4KLSAgKgotLSAqIFNhdmUgQG1lc3NhZ2UgaW4gdGhlIGdsaWJjIF9fYWJvcnRfbXNnIHZhcmlhYmxlIHNvIGl0IGNhbiBiZSByZXRyaWV2ZWQKLSsgKiBTYXZlIEBtZXNzYWdlIGluIHRoZSBfX25paF9hYm9ydF9tc2cgdmFyaWFibGUgc28gaXQgY2FuIGJlIHJldHJpZXZlZAotICAqIGJ5IGRlYnVnZ2VycyBpZiB3ZSBzaG91bGQgY3Jhc2ggYXQgdGhpcyBwb2ludC4KLSAgKiovCi0gc3RhdGljIHZvaWQKLSBuaWhfbG9nX2Fib3J0X21lc3NhZ2UgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCi0gewotLQlpZiAoISAmX19hYm9ydF9tc2cpCi0tCQlyZXR1cm47Ci0rCWlmIChfX25paF9hYm9ydF9tc2cpCi0rCQluaWhfZGlzY2FyZCAoX19uaWhfYWJvcnRfbXNnKTsKLSAKLS0JaWYgKF9fYWJvcnRfbXNnKQotLQkJbmloX2Rpc2NhcmQgKF9fYWJvcnRfbXNnKTsKLS0KLS0JX19hYm9ydF9tc2cgPSBOSUhfTVVTVCAobmloX3N0cmR1cCAoTlVMTCwgbWVzc2FnZSkpOwotKwlfX25paF9hYm9ydF9tc2cgPSBOSUhfTVVTVCAobmloX3N0cmR1cCAoTlVMTCwgbWVzc2FnZSkpOwotIH0KLSAKLSAvKioKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvdGVzdF9maWxlcy5oCi0rKysgbGlibmloLTEuMC4zL25paC90ZXN0X2ZpbGVzLmgKLUBAIC0xLDcgKzEsNyBAQAotIC8qIGxpYm5paAotICAqCi0tICogQ29weXJpZ2h0IMKpIDIwMDkgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KLS0gKiBDb3B5cmlnaHQgwqkgMjAwOSBDYW5vbmljYWwgTHRkLgotKyAqIENvcHlyaWdodCDCqSAyMDExIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCi0rICogQ29weXJpZ2h0IMKpIDIwMTEgQ2Fub25pY2FsIEx0ZC4KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGFzCi1AQCAtMzksNyArMzksNyBAQAotICAqIFRFU1RfRklMRU5BTUU6Ci0gICogQF92YXI6IHZhcmlhYmxlIHRvIHN0b3JlIGZpbGVuYW1lIGluLgotICAqCi0tICogR2VuZXJhdGUgYSBmaWxlbmFtZSB0aGF0IG1heSBiZSB1c2VkIGZvciB0ZXN0aW5nLCBpdCdzIHVubGlua2VkIGl0IGlmCi0rICogR2VuZXJhdGUgYSBmaWxlbmFtZSB0aGF0IG1heSBiZSB1c2VkIGZvciB0ZXN0aW5nLCBpdCdzIHVubGlua2VkIGlmIGl0Ci0gICogZXhpc3RzIGFuZCBpdCdzIHVwIHRvIHlvdSB0byB1bmxpbmsgaXQgd2hlbiBkb25lLiAgQF92YXIgc2hvdWxkIGJlIGF0Ci0gICogbGVhc3QgUEFUSF9NQVggbG9uZy4KLSAgKiovCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL3Rlc3RfcHJvY2Vzcy5oCi0rKysgbGlibmloLTEuMC4zL25paC90ZXN0X3Byb2Nlc3MuaAotQEAgLTM2LDcgKzM2LDcgQEAKLSAgKiBTcGF3biBhIGNoaWxkIGluIHdoaWNoIGEgdGVzdCBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZQotICAqIG1haW4gZmxvdyBvZiB0aGUgcHJvY2Vzcy4gIFRoZSBwaWQgb2YgdGhlIGNoaWxkIGlzIHN0b3JlZCBpbiBAX3BpZC4KLSAgKgotLSAqIFRoaXMgbWFjcm8gZW5zdXJlcyB0aGF0IHRoZSBjaGlsZCBoYXMgYmVndW4gZXhlY3R1dGlvbiBiZWZvcmUgdGhlCi0rICogVGhpcyBtYWNybyBlbnN1cmVzIHRoYXQgdGhlIGNoaWxkIGhhcyBiZWd1biBleGVjdXRpb24gYmVmb3JlIHRoZQotICAqIHBhcmVudCBpcyBhbGxvd2VkIHRvIGNvbnRpbnVlIHRocm91Z2ggdGhlIHVzdWFsIHVzZSBvZiBhIHBpcGUuCi0gICoKLSAgKiBBIGJsb2NrIG9mIGNvZGUgc2hvdWxkIGZvbGxvdyB0aGlzIG1hY3JvLCB3aGljaCBpcyB0aGUgY29kZSB0aGF0IHdpbGwKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvY2hpbGQuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvY2hpbGQuaAotQEAgLTk4LDcgKzk4LDcgQEAKLSBOaWhDaGlsZFdhdGNoICpuaWhfY2hpbGRfYWRkX3dhdGNoIChjb25zdCB2b2lkICpwYXJlbnQsIHBpZF90IHBpZCwKLSAJCQkJICAgIE5paENoaWxkRXZlbnRzIGV2ZW50cywKLSAJCQkJICAgIE5paENoaWxkSGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIHZvaWQgICAgICAgICAgIG5paF9jaGlsZF9wb2xsICAgICAgKHZvaWQpOwotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9hbGxvYy5oCi0rKysgbGlibmloLTEuMC4zL25paC9hbGxvYy5oCi1AQCAtMjk5LDcgKzI5OSw3IEBACi0gICogSXQgaXMgcGVybWlzc2libGUgdG8gdGFrZSByZWZlcmVuY2VzIHRvIGZvbyB3aXRoaW4gaXRzIHNjb3BlLCBvciBieQotICAqIGZ1bmN0aW9ucyBjYWxsZWQsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgZnJlZWQuICBBbHNvIGl0IGlzCi0gICogZ2VuZXJhbGx5IG5vbnNlbnNpY2FsIHRvIGFsbG9jYXRlIHdpdGggYSBwYXJlbnQsIHNpbmNlIHRoaXMgdG9vIHdpbGwKLS0gKiBwcmV2ZW50IGl0IGZyb20gYmVpZ24gZnJlZWQuCi0rICogcHJldmVudCBpdCBmcm9tIGJlaW5nIGZyZWVkLgotICAqKi8KLSAjZGVmaW5lIG5paF9sb2NhbCBfX2F0dHJpYnV0ZV9fICgoY2xlYW51cChfbmloX2Rpc2NhcmRfbG9jYWwpKSkKLSAKLUBAIC0zMDcsMTEgKzMwNywxMSBAQAotIE5JSF9CRUdJTl9FWFRFUk4KLSAKLSB2b2lkICogbmloX2FsbG9jICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgc2l6ZV90IHNpemUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gdm9pZCAqIG5paF9yZWFsbG9jICAgICAgICAgICAgICAgICAgICh2b2lkICpwdHIsIGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJICAgICAgc2l6ZV90IHNpemUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gaW50ICAgIG5paF9mcmVlICAgICAgICAgICAgICAgICAgICAgICh2b2lkICpwdHIpOwotIGludCAgICBuaWhfZGlzY2FyZCAgICAgICAgICAgICAgICAgICAodm9pZCAqcHRyKTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvaW8uaAotKysrIGxpYm5paC0xLjAuMy9uaWgvaW8uaAotQEAgLTI2OSw3ICsyNjksNyBAQAotIE5paElvV2F0Y2ggKiAgbmloX2lvX2FkZF93YXRjaCAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgaW50IGZkLAotIAkJCQkJICBOaWhJb0V2ZW50cyBldmVudHMsCi0gCQkJCQkgIE5paElvV2F0Y2hlciB3YXRjaGVyLCB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIHZvaWQgICAgICAgICAgbmloX2lvX3NlbGVjdF9mZHMgICAgICAgICAgKGludCAqbmZkcywgZmRfc2V0ICpyZWFkZmRzLAotIAkJCQkJICBmZF9zZXQgKndyaXRlZmRzLCBmZF9zZXQgKmV4Y2VwdGZkcyk7Ci1AQCAtMjc4LDEyICsyNzgsMTIgQEAKLSAKLSAKLSBOaWhJb0J1ZmZlciAqIG5paF9pb19idWZmZXJfbmV3ICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gaW50ICAgICAgICAgICBuaWhfaW9fYnVmZmVyX3Jlc2l6ZSAgICAgICAoTmloSW9CdWZmZXIgKmJ1ZmZlciwgc2l6ZV90IGdyb3cpOwotIGNoYXIgKiAgICAgICAgbmloX2lvX2J1ZmZlcl9wb3AgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCSAgTmloSW9CdWZmZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW4pCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gdm9pZCAgICAgICAgICBuaWhfaW9fYnVmZmVyX3NocmluayAgICAgICAoTmloSW9CdWZmZXIgKmJ1ZmZlciwgc2l6ZV90IGxlbik7Ci0gaW50ICAgICAgICAgICBuaWhfaW9fYnVmZmVyX3B1c2ggICAgICAgICAoTmloSW9CdWZmZXIgKmJ1ZmZlciwKLSAJCQkJCSAgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKQotQEAgLTI5MSw3ICsyOTEsNyBAQAotIAotIAotIE5paElvTWVzc2FnZSAqbmloX2lvX21lc3NhZ2VfbmV3ICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBpbnQgICAgICAgICAgIG5paF9pb19tZXNzYWdlX2FkZF9jb250cm9sIChOaWhJb01lc3NhZ2UgKm1lc3NhZ2UsIGludCBsZXZlbCwKLSAJCQkJCSAgaW50IHR5cGUsIHNvY2tsZW5fdCBsZW4sCi1AQCAtMzAwLDcgKzMwMCw3IEBACi0gCi0gTmloSW9NZXNzYWdlICpuaWhfaW9fbWVzc2FnZV9yZWN2ICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBpbnQgZmQsCi0gCQkJCQkgIHNpemVfdCAqbGVuKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIHNzaXplX3QgICAgICAgbmloX2lvX21lc3NhZ2Vfc2VuZCAgICAgICAgKE5paElvTWVzc2FnZSAqbWVzc2FnZSwgaW50IGZkKQotIAlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi1AQCAtMzEwLDcgKzMxMCw3IEBACi0gCQkJCQkgIE5paElvQ2xvc2VIYW5kbGVyIGNsb3NlX2hhbmRsZXIsCi0gCQkJCQkgIE5paElvRXJyb3JIYW5kbGVyIGVycm9yX2hhbmRsZXIsCi0gCQkJCQkgIHZvaWQgKmRhdGEpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gdm9pZCAgICAgICAgICBuaWhfaW9fc2h1dGRvd24gICAgICAgICAgICAoTmloSW8gKmlvKTsKLSBpbnQgICAgICAgICAgIG5paF9pb19kZXN0cm95ICAgICAgICAgICAgIChOaWhJbyAqaW8pOwotIAotQEAgLTMxOSwxNCArMzE5LDE0IEBACi0gCi0gY2hhciAqICAgICAgICBuaWhfaW9fcmVhZCAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBOaWhJbyAqaW8sCi0gCQkJCQkgIHNpemVfdCAqbGVuKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGludCAgICAgICAgICAgbmloX2lvX3dyaXRlICAgICAgICAgICAgICAgKE5paElvICppbywgY29uc3QgY2hhciAqc3RyLAotIAkJCQkJICBzaXplX3QgbGVuKQotIAlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgICAgICBuaWhfaW9fZ2V0ICAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBOaWhJbyAqaW8sCi0gCQkJCQkgIGNvbnN0IGNoYXIgKmRlbGltKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGludCAgICAgICAgICAgbmloX2lvX3ByaW50ZiAgICAgICAgICAgICAgKE5paElvICppbywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0gCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC90ZXN0X291dHB1dC5oCi0rKysgbGlibmloLTEuMC4zL25paC90ZXN0X291dHB1dC5oCi1AQCAtNjEsMTAgKzYxLDEwIEBACi0gCi0gLyoqCi0gICogVEVTVF9GRUFUVVJFOgotLSAqIEBfZmVhdDogbmFtZSBvZiBmdW5jdGlvbiBmZWF0dXJlIGJlaW5nIHRlc3RlZC4KLSsgKiBAX2ZlYXQ6IG5hbWUgb2YgZnVuY3Rpb24gb3IgZ3JvdXAgZmVhdHVyZSBiZWluZyB0ZXN0ZWQuCi0gICoKLS0gKiBPdXRwdXQgYSBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCBhIHN1Yi10ZXN0IG9mIGEgZnVuY3Rpb24gaXMgYmVpbmcKLS0gKiBwZXJmb3JtZWQsIHNwZWNpZmljYWxseSB0aGUgZmVhdHVyZSBuYW1lZCBfZmVhdC4KLSsgKiBPdXRwdXQgYSBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCBhIHN1Yi10ZXN0IG9mIGEgZnVuY3Rpb24gb3IKLSsgKiBncm91cCBpcyBiZWluZyBwZXJmb3JtZWQsIHNwZWNpZmljYWxseSB0aGUgZmVhdHVyZSBuYW1lZCBfZmVhdC4KLSAgKiovCi0gI2RlZmluZSBURVNUX0ZFQVRVUkUoX2ZlYXQpIFwKLSAJcHJpbnRmICgiLi4uJXNcbiIsIF9mZWF0KTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvZXJyb3IuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvZXJyb3IuaAotQEAgLTEsNyArMSw3IEBACi0gLyogbGlibmloCi0gICoKLS0gKiBDb3B5cmlnaHQgwqkgMjAwOSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+LgotLSAqIENvcHlyaWdodCDCqSAyMDA5IENhbm9uaWNhbCBMdGQuCi0rICogQ29weXJpZ2h0IMKpIDIwMTEgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KLSsgKiBDb3B5cmlnaHQgwqkgMjAxMSBDYW5vbmljYWwgTHRkLgotICAqCi0gICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgYXMKLUBAIC0xMTEsNyArMTExLDcgQEAKLSAgKiBAbWVzc2FnZTogaHVtYW4tcmVhZGFibGUgbWVzc2FnZS4KLSAgKgotICAqIFJhaXNlcyBhbiBlcnJvciB3aXRoIHRoZSBnaXZlbiBkZXRhaWxzIGluIHRoZSBjdXJyZW50IGVycm9yIGNvbnRleHQsCi0tICogaWYgYW4gdW5oYW5kbGVkIGVycm9yIGFscmVhZHkgZXhpc3RzIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBlbW1pdHRlZAotKyAqIGlmIGFuIHVuaGFuZGxlZCBlcnJvciBhbHJlYWR5IGV4aXN0cyB0aGVuIGFuIGVycm9yIG1lc3NhZ2UgaXMgZW1pdHRlZAotICAqIHRocm91Z2ggdGhlIGxvZ2dpbmcgc3lzdGVtOyB5b3Ugc2hvdWxkIHRyeSB0byBhdm9pZCB0aGlzLgotICAqCi0gICogQG1lc3NhZ2Ugc2hvdWxkIGJlIGEgc3RhdGljIHN0cmluZywgYXMgaXQgd2lsbCBub3QgYmUgZnJlZWQgd2hlbiB0aGUKLUBAIC0xMjYsNyArMTI2LDcgQEAKLSAgKiBAZm9ybWF0OiBmb3JtYXQgc3RyaW5nIGZvciBodW1hbi1yZWFkYWJsZSBtZXNzYWdlLgotICAqCi0gICogUmFpc2VzIGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIGRldGFpbHMgaW4gdGhlIGN1cnJlbnQgZXJyb3IgY29udGV4dCwKLS0gKiBpZiBhbiB1bmhhbmRsZWQgZXJyb3IgYWxyZWFkeSBleGlzdHMgdGhlbiBhbiBlcnJvciBtZXNzYWdlIGlzIGVtbWl0dGVkCi0rICogaWYgYW4gdW5oYW5kbGVkIGVycm9yIGFscmVhZHkgZXhpc3RzIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBlbWl0dGVkCi0gICogdGhyb3VnaCB0aGUgbG9nZ2luZyBzeXN0ZW07IHlvdSBzaG91bGQgdHJ5IHRvIGF2b2lkIHRoaXMuCi0gICoKLSAgKiBUaGUgaHVtYW4tcmVhZGFibGUgbWVzc2FnZSBmb3IgdGhlIGVycm9yIGlzIHBhcnNlZCBhY2NvcmRpbmcgdG8gQGZvcm1hdCwKLUBAIC0xNDAsNyArMTQwLDcgQEAKLSAgKiBuaWhfZXJyb3JfcmFpc2Vfc3lzdGVtOgotICAqCi0gICogUmFpc2VzIGFuIGVycm9yIHdpdGggZGV0YWlscyB0YWtlbiBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIG9mIGVycm5vLAotLSAqIGlmIGFuIHVuaGFuZGxlZCBlcnJvciBhbHJlYWR5IGV4aXN0cyB0aGVuIGFuIGVycm9yIG1lc3NhZ2UgaXMgZW1taXR0ZWQKLSsgKiBpZiBhbiB1bmhhbmRsZWQgZXJyb3IgYWxyZWFkeSBleGlzdHMgdGhlbiBhbiBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQKLSAgKiB0aHJvdWdoIHRoZSBsb2dnaW5nIHN5c3RlbTsgeW91IHNob3VsZCB0cnkgdG8gYXZvaWQgdGhpcy4KLSAgKiovCi0gI2RlZmluZSBuaWhfZXJyb3JfcmFpc2Vfc3lzdGVtKCkgXAotQEAgLTE2Miw3ICsxNjIsNyBAQAotICAqIEBlcnJvcjogZXhpc3Rpbmcgb2JqZWN0IHRvIHJhaXNlLgotICAqCi0gICogUmFpc2VzIHRoZSBleGlzdGluZyBlcnJvciBvYmplY3QgaW4gdGhlIGN1cnJlbnQgZXJyb3IgY29udGV4dCwKLS0gKiBpZiBhbiB1bmhhbmRsZWQgZXJyb3IgYWxyZWFkeSBleGlzdHMgdGhlbiBhbiBlcnJvciBtZXNzYWdlIGlzIGVtbWl0dGVkCi0rICogaWYgYW4gdW5oYW5kbGVkIGVycm9yIGFscmVhZHkgZXhpc3RzIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBlbWl0dGVkCi0gICogdGhyb3VnaCB0aGUgbG9nZ2luZyBzeXN0ZW07IHlvdSBzaG91bGQgdHJ5IHRvIGF2b2lkIHRoaXMuCi0gICoKLSAgKiBUaGlzIGlzIG5vcm1hbGx5IHVzZWQgdG8gcmFpc2UgYSB0YWtlbiBlcnJvciB0aGF0IGhhcyBub3QgYmVlbiBoYW5kbGVkLAotQEAgLTE4Miw3ICsxODIsNyBAQAotICAqIEBtZXNzYWdlOiBodW1hbi1yZWFkYWJsZSBtZXNzYWdlLgotICAqCi0gICogUmFpc2VzIGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIGRldGFpbHMgaW4gdGhlIGN1cnJlbnQgZXJyb3IgY29udGV4dCwKLS0gKiBpZiBhbiB1bmhhbmRsZWQgZXJyb3IgYWxyZWFkeSBleGlzdHMgdGhlbiBhbiBlcnJvciBtZXNzYWdlIGlzIGVtbWl0dGVkCi0rICogaWYgYW4gdW5oYW5kbGVkIGVycm9yIGFscmVhZHkgZXhpc3RzIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBlbWl0dGVkCi0gICogdGhyb3VnaCB0aGUgbG9nZ2luZyBzeXN0ZW07IHlvdSBzaG91bGQgdHJ5IHRvIGF2b2lkIHRoaXMuCi0gICoKLSAgKiBXaWxsIHJldHVybiBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHdpdGggQHJldHZhbCwgd2hpY2ggbWF5IGJlIGxlZnQKLUBAIC0xOTksNyArMTk5LDcgQEAKLSAgKiBAcmV0dmFsOiByZXR1cm4gdmFsdWUgZm9yIGZ1bmN0aW9uLgotICAqCi0gICogUmFpc2VzIGFuIGVycm9yIHdpdGggZGV0YWlscyB0YWtlbiBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIG9mIGVycm5vLAotLSAqIGlmIGFuIHVuaGFuZGxlZCBlcnJvciBhbHJlYWR5IGV4aXN0cyB0aGVuIGFuIGVycm9yIG1lc3NhZ2UgaXMgZW1taXR0ZWQKLSsgKiBpZiBhbiB1bmhhbmRsZWQgZXJyb3IgYWxyZWFkeSBleGlzdHMgdGhlbiBhbiBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQKLSAgKiB0aHJvdWdoIHRoZSBsb2dnaW5nIHN5c3RlbTsgeW91IHNob3VsZCB0cnkgdG8gYXZvaWQgdGhpcy4KLSAgKgotICAqIFdpbGwgcmV0dXJuIGZyb20gdGhlIGN1cnJlbnQgZnVuY3Rpb24gd2l0aCBAcmV0dmFsLCB3aGljaCBtYXkgYmUgbGVmdAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9zdHJpbmcuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvc3RyaW5nLmgKLUBAIC0zNSw2MCArMzUsNjAgQEAKLSBOSUhfQkVHSU5fRVhURVJOCi0gCi0gY2hhciAqIG5paF9zcHJpbnRmICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpLCB3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpLCB3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogbmloX3ZzcHJpbnRmICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqZm9ybWF0LAotIAkJCSAgICAgdmFfbGlzdCBhcmdzKQotLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDApLCB3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDApLCB3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogbmloX3N0cmR1cCAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqc3RyKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiBuaWhfc3RybmR1cCAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4pCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqIG5paF9zdHJjYXQgICAgICAgICAgIChjaGFyICoqc3RyLCBjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnNyYykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogbmloX3N0cm5jYXQgICAgICAgICAgKGNoYXIgKipzdHIsIGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqc3JjLAotIAkJCSAgICAgc2l6ZV90IGxlbikKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogbmloX3N0cmNhdF9zcHJpbnRmICAgKGNoYXIgKipzdHIsIGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpLCB3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpLCB3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogbmloX3N0cmNhdF92c3ByaW50ZiAgKGNoYXIgKipzdHIsIGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDApLCB3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDApLCB3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICoqbmloX3N0cl9zcGxpdCAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqc3RyLAotIAkJCSAgICAgY29uc3QgY2hhciAqZGVsaW0sIGludCByZXBlYXQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqKm5paF9zdHJfYXJyYXlfbmV3ICAgIChjb25zdCB2b2lkICpwYXJlbnQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqKm5paF9zdHJfYXJyYXlfYWRkICAgIChjaGFyICoqKmFycmF5LCBjb25zdCB2b2lkICpwYXJlbnQsIHNpemVfdCAqbGVuLAotIAkJCSAgICAgY29uc3QgY2hhciAqc3RyKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKipuaWhfc3RyX2FycmF5X2FkZG4gICAoY2hhciAqKiphcnJheSwgY29uc3Qgdm9pZCAqcGFyZW50LCBzaXplX3QgKmxlbiwKLSAJCQkgICAgIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IHN0cmxlbikKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICoqbmloX3N0cl9hcnJheV9hZGRwICAgKGNoYXIgKioqYXJyYXksIGNvbnN0IHZvaWQgKnBhcmVudCwgc2l6ZV90ICpsZW4sCi0gCQkJICAgICB2b2lkICpwdHIpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqKm5paF9zdHJfYXJyYXlfY29weSAgIChjb25zdCB2b2lkICpwYXJlbnQsIHNpemVfdCAqbGVuLAotIAkJCSAgICAgY2hhciAqIGNvbnN0ICphcnJheSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICoqbmloX3N0cl9hcnJheV9hcHBlbmQgKGNoYXIgKioqYXJyYXksIGNvbnN0IHZvaWQgKnBhcmVudCwgc2l6ZV90ICpsZW4sCi0gCQkJICAgICBjaGFyICogY29uc3QgKmFyZ3MpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqIG5paF9zdHJfd3JhcCAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwKLSAJCSAgICAgICAgICAgICBzaXplX3QgZmlyc3RfaW5kZW50LCBzaXplX3QgaW5kZW50KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIHNpemVfdCBuaWhfc3RyX3NjcmVlbl93aWR0aCAodm9pZCk7Ci0gY2hhciAqIG5paF9zdHJfc2NyZWVuX3dyYXAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnN0ciwKLSAJCQkgICAgIHNpemVfdCBmaXJzdF9pbmRlbnQsIHNpemVfdCBpbmRlbnQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvc3RyaW5nLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloL3N0cmluZy5jCi1AQCAtNDA1LDcgKzQwNSw3IEBACi0gCQljb25zdCBjaGFyICAqcHRyOwotIAotIAkJLyogU2tpcCBpbml0aWFsIGRlbGltaXRlcnMgKi8KLS0JCXdoaWxlIChyZXBlYXQgJiYgc3RyY2hyIChkZWxpbSwgKnN0cikpCi0rCQl3aGlsZSAocmVwZWF0ICYmICpzdHIgJiYgc3RyY2hyIChkZWxpbSwgKnN0cikpCi0gCQkJc3RyKys7Ci0gCi0gCQkvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIHRva2VuICovCi1AQCAtNDEzLDYgKzQxMywxMyBAQAotIAkJd2hpbGUgKCpzdHIgJiYgKCEgc3RyY2hyIChkZWxpbSwgKnN0cikpKQotIAkJCXN0cisrOwotIAotKwkJLyogRG9uJ3QgY3JlYXRlIGFuIGVtcHR5IHN0cmluZyBhcnJheSBlbGVtZW50IGluIHJlcGVhdAotKwkJICogbW9kZSBpZiB0aGVyZSBpcyBubyB0b2tlbiAoYXMgYSByZXN1bHQgb2YgYQotKwkJICogZHVwbGljYXRlZCBkZWxpbWl0ZXIgY2hhcmFjdGVyKS4KLSsJCSAqLwotKwkJaWYgKHJlcGVhdCAmJiAoc3RyID09IHB0cikpCi0rCQkJY29udGludWU7Ci0rCi0gCQlpZiAoISBuaWhfc3RyX2FycmF5X2FkZG4gKCZhcnJheSwgcGFyZW50LCAmbGVuLAotIAkJCQkJICBwdHIsIHN0ciAtIHB0cikpIHsKLSAJCQluaWhfZnJlZSAoYXJyYXkpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9maWxlLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2ZpbGUuaAotQEAgLTgyLDcgKzgyLDcgQEAKLSAKLSBjaGFyICpuaWhfZmlsZV9yZWFkICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcGF0aCwKLSAJCQkgICAgIHNpemVfdCAqbGVuZ3RoKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIHZvaWQgKm5paF9maWxlX21hcCAgICAgICAgICAoY29uc3QgY2hhciAqcGF0aCwgaW50IGZsYWdzLCBzaXplX3QgKmxlbmd0aCkKLSAJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC90ZXN0cy90ZXN0X29wdGlvbi5jCi0rKysgbGlibmloLTEuMC4zL25paC90ZXN0cy90ZXN0X29wdGlvbi5jCi1AQCAtMTU3NCw3ICsxNTc0LDcgQEAKLSAJCW91dHB1dCA9IHRtcGZpbGUgKCk7Ci0gCQlURVNUX0NISUxEIChwaWQpIHsKLSAJCQlURVNUX0RJVkVSVF9TVERPVVQgKG91dHB1dCkgewotLQkJCQljaGFyICoqYXJnczsKLSsJCQkJY2hhciAqKmFyZ3MgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7Ci0gCi0gCQkJCWFyZ3MgPSBuaWhfb3B0aW9uX3BhcnNlciAoTlVMTCwgYXJnYywgYXJndiwKLSAJCQkJCQkJICBvcHRpb25zLCBGQUxTRSk7Ci1AQCAtMTY1Miw3ICsxNjUyLDcgQEAKLSAJCQl1bnNldGVudiAoIkNPTFVNTlMiKTsKLSAKLSAJCQlURVNUX0RJVkVSVF9TVERPVVQgKG91dHB1dCkgewotLQkJCQljaGFyICoqYXJnczsKLSsJCQkJY2hhciAqKmFyZ3MgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7Ci0gCi0gCQkJCWFyZ3MgPSBuaWhfb3B0aW9uX3BhcnNlciAoTlVMTCwgYXJnYywgYXJndiwKLSAJCQkJCQkJICBvcHRpb25zLCBGQUxTRSk7Ci0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL3Rlc3RzL3Rlc3RfbG9nZ2luZy5jCi0rKysgbGlibmloLTEuMC4zL25paC90ZXN0cy90ZXN0X2xvZ2dpbmcuYwotQEAgLTMxLDcgKzMxLDcgQEAKLSAjaW5jbHVkZSA8bmloL21haW4uaD4KLSAKLSAKLS1leHRlcm4gY2hhciAqX19hYm9ydF9tc2cgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKLStleHRlcm4gY2hhciAqX19uaWhfYWJvcnRfbXNnOwotIAotIHN0YXRpYyBOaWhMb2dMZXZlbCBsYXN0X3ByaW9yaXR5ID0gTklIX0xPR19VTktOT1dOOwotIHN0YXRpYyBjaGFyICogICAgICBsYXN0X21lc3NhZ2UgPSBOVUxMOwotQEAgLTE1Niw2OCArMTU2LDYzIEBACi0gCX0KLSAKLSAKLS0JLyogQ2hlY2sgdGhhdCBhIGZhdGFsIG1lc3NhZ2UgaXMgYWxzbyBzdG9yZWQgaW4gdGhlIGdsaWJjIF9fYWJvcnRfbXNnCi0rCS8qIENoZWNrIHRoYXQgYSBmYXRhbCBtZXNzYWdlIGlzIGFsc28gc3RvcmVkIGluIHRoZSBfX25paF9hYm9ydF9tc2cKLSAJICogdmFyaWFibGUuCi0gCSAqLwotLQlpZiAoJl9fYWJvcnRfbXNnKSB7Ci0tCQlURVNUX0ZFQVRVUkUgKCJ3aXRoIGZhdGFsIG1lc3NhZ2UiKTsKLS0JCVRFU1RfQUxMT0NfRkFJTCB7Ci0tCQkJX19hYm9ydF9tc2cgPSBOVUxMOwotLQkJCWxhc3RfcHJpb3JpdHkgPSBOSUhfTE9HX1VOS05PV047Ci0tCQkJbGFzdF9tZXNzYWdlID0gTlVMTDsKLS0KLS0JCQlyZXQgPSBuaWhfbG9nX21lc3NhZ2UgKE5JSF9MT0dfRkFUQUwsCi0tCQkJCQkgICAgICAgIm1lc3NhZ2Ugd2l0aCAlcyAlZCBmb3JtYXR0aW5nIiwKLS0JCQkJCSAgICAgICAic29tZSIsIDIwKTsKLS0KLS0JCQlURVNUX0VRIChyZXQsIDApOwotLQkJCVRFU1RfRVEgKGxhc3RfcHJpb3JpdHksIE5JSF9MT0dfRkFUQUwpOwotLQkJCVRFU1RfRVFfU1RSIChsYXN0X21lc3NhZ2UsICJtZXNzYWdlIHdpdGggc29tZSAyMCBmb3JtYXR0aW5nIik7Ci0tCi0tCQkJVEVTVF9ORV9QIChfX2Fib3J0X21zZywgTlVMTCk7Ci0tCQkJVEVTVF9BTExPQ19QQVJFTlQgKF9fYWJvcnRfbXNnLCBOVUxMKTsKLS0JCQlURVNUX0VRX1NUUiAoX19hYm9ydF9tc2csICJtZXNzYWdlIHdpdGggc29tZSAyMCBmb3JtYXR0aW5nIik7Ci0rCVRFU1RfRkVBVFVSRSAoIndpdGggZmF0YWwgbWVzc2FnZSIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJX19uaWhfYWJvcnRfbXNnID0gTlVMTDsKLSsJCWxhc3RfcHJpb3JpdHkgPSBOSUhfTE9HX1VOS05PV047Ci0rCQlsYXN0X21lc3NhZ2UgPSBOVUxMOwotIAotLQkJCWZyZWUgKGxhc3RfbWVzc2FnZSk7Ci0tCQl9Ci0rCQlyZXQgPSBuaWhfbG9nX21lc3NhZ2UgKE5JSF9MT0dfRkFUQUwsCi0rCQkJCSJtZXNzYWdlIHdpdGggJXMgJWQgZm9ybWF0dGluZyIsCi0rCQkJCSJzb21lIiwgMjApOwotIAotKwkJVEVTVF9FUSAocmV0LCAwKTsKLSsJCVRFU1RfRVEgKGxhc3RfcHJpb3JpdHksIE5JSF9MT0dfRkFUQUwpOwotKwkJVEVTVF9FUV9TVFIgKGxhc3RfbWVzc2FnZSwgIm1lc3NhZ2Ugd2l0aCBzb21lIDIwIGZvcm1hdHRpbmciKTsKLSAKLS0JCS8qIENoZWNrIHRoYXQgYSBmYXRhbCBtZXNzYWdlIGNhbiBzYWZlbHkgb3ZlcndyaXRlIG9uZSBhbHJlYWR5IHN0b3JlZAotLQkJICogaW4gdGhlIGdsaWJjIF9fYWJvcnRfbXNnIHZhcmlhYmxlLgotLQkJICovCi0tCQlURVNUX0ZFQVRVUkUgKCJ3aXRoIHNlY29uZCBmYXRhbCBtZXNzYWdlIik7Ci0tCQlURVNUX0FMTE9DX0ZBSUwgewotLQkJCVRFU1RfQUxMT0NfU0FGRSB7Ci0tCQkJCW1zZyA9IG5paF9zdHJkdXAgKE5VTEwsICJ0ZXN0Iik7Ci0tCQkJfQotLQotLQkJCV9fYWJvcnRfbXNnID0gbXNnOwotLQkJCVRFU1RfRlJFRV9UQUcgKG1zZyk7Ci0tCi0tCQkJbGFzdF9wcmlvcml0eSA9IE5JSF9MT0dfVU5LTk9XTjsKLS0JCQlsYXN0X21lc3NhZ2UgPSBOVUxMOwotLQotLQkJCXJldCA9IG5paF9sb2dfbWVzc2FnZSAoTklIX0xPR19GQVRBTCwKLS0JCQkJCSAgICAgICAibWVzc2FnZSB3aXRoICVzICVkIGZvcm1hdHRpbmciLAotLQkJCQkJICAgICAgICJzb21lIiwgMjApOwotLQotLQkJCVRFU1RfRVEgKHJldCwgMCk7Ci0tCQkJVEVTVF9FUSAobGFzdF9wcmlvcml0eSwgTklIX0xPR19GQVRBTCk7Ci0tCQkJVEVTVF9FUV9TVFIgKGxhc3RfbWVzc2FnZSwgIm1lc3NhZ2Ugd2l0aCBzb21lIDIwIGZvcm1hdHRpbmciKTsKLS0KLS0JCQlURVNUX0ZSRUUgKG1zZyk7Ci0tCi0tCQkJVEVTVF9ORV9QIChfX2Fib3J0X21zZywgTlVMTCk7Ci0tCQkJVEVTVF9BTExPQ19QQVJFTlQgKF9fYWJvcnRfbXNnLCBOVUxMKTsKLS0JCQlURVNUX0VRX1NUUiAoX19hYm9ydF9tc2csICJtZXNzYWdlIHdpdGggc29tZSAyMCBmb3JtYXR0aW5nIik7Ci0rCQlURVNUX05FX1AgKF9fbmloX2Fib3J0X21zZywgTlVMTCk7Ci0rCQlURVNUX0FMTE9DX1BBUkVOVCAoX19uaWhfYWJvcnRfbXNnLCBOVUxMKTsKLSsJCVRFU1RfRVFfU1RSIChfX25paF9hYm9ydF9tc2csICJtZXNzYWdlIHdpdGggc29tZSAyMCBmb3JtYXR0aW5nIik7Ci0gCi0tCQkJZnJlZSAobGFzdF9tZXNzYWdlKTsKLS0JCX0KLS0JfSBlbHNlIHsKLS0JCXByaW50ZiAoIlNLSVA6IF9fYWJvcnRfbXNnIG5vdCBhdmFpbGFibGVcbiIpOwotKwkJZnJlZSAobGFzdF9tZXNzYWdlKTsKLSAJfQotIAotIAotKwkvKiBDaGVjayB0aGF0IGEgZmF0YWwgbWVzc2FnZSBjYW4gc2FmZWx5IG92ZXJ3cml0ZSBvbmUgYWxyZWFkeSBzdG9yZWQKLSsJICogaW4gdGhlIF9fbmloX2Fib3J0X21zZyB2YXJpYWJsZS4KLSsJICovCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggc2Vjb25kIGZhdGFsIG1lc3NhZ2UiKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCVRFU1RfQUxMT0NfU0FGRSB7Ci0rCQkJbXNnID0gbmloX3N0cmR1cCAoTlVMTCwgInRlc3QiKTsKLSsJCX0KLSsKLSsJCV9fbmloX2Fib3J0X21zZyA9IG1zZzsKLSsJCVRFU1RfRlJFRV9UQUcgKG1zZyk7Ci0rCi0rCQlsYXN0X3ByaW9yaXR5ID0gTklIX0xPR19VTktOT1dOOwotKwkJbGFzdF9tZXNzYWdlID0gTlVMTDsKLSsKLSsJCXJldCA9IG5paF9sb2dfbWVzc2FnZSAoTklIX0xPR19GQVRBTCwKLSsJCQkJIm1lc3NhZ2Ugd2l0aCAlcyAlZCBmb3JtYXR0aW5nIiwKLSsJCQkJInNvbWUiLCAyMCk7Ci0rCi0rCQlURVNUX0VRIChyZXQsIDApOwotKwkJVEVTVF9FUSAobGFzdF9wcmlvcml0eSwgTklIX0xPR19GQVRBTCk7Ci0rCQlURVNUX0VRX1NUUiAobGFzdF9tZXNzYWdlLCAibWVzc2FnZSB3aXRoIHNvbWUgMjAgZm9ybWF0dGluZyIpOwotKwotKwkJVEVTVF9GUkVFIChtc2cpOwotKwotKwkJVEVTVF9ORV9QIChfX25paF9hYm9ydF9tc2csIE5VTEwpOwotKwkJVEVTVF9BTExPQ19QQVJFTlQgKF9fbmloX2Fib3J0X21zZywgTlVMTCk7Ci0rCQlURVNUX0VRX1NUUiAoX19uaWhfYWJvcnRfbXNnLCAibWVzc2FnZSB3aXRoIHNvbWUgMjAgZm9ybWF0dGluZyIpOwotKwotKwkJZnJlZSAobGFzdF9tZXNzYWdlKTsKLSsJfQotKwotIAkvKiBDaGVjayB0aGF0IHRoZSBuaWhfZGVidWcgbWFjcm8gd3JhcHMgdGhlIGNhbGwgcHJvcGVybHkgYW5kCi0gCSAqIGluY2x1ZGVzIHRoZSBmdW5jdGlvbiBpbiB3aGljaCB0aGUgbWVzc2FnZSBvY2N1cnJlZC4KLSAJICovCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL3Rlc3RzL3Rlc3RfaGFzaC5jCi0rKysgbGlibmloLTEuMC4zL25paC90ZXN0cy90ZXN0X2hhc2guYwotQEAgLTQ3MCw3ICs0NzAsOCBAQAotIHRlc3RfbG9va3VwICh2b2lkKQotIHsKLSAJTmloSGFzaCAqaGFzaDsKLS0JTmloTGlzdCAqZW50cnkxLCAqZW50cnkyLCAqZW50cnkzLCAqcHRyOwotKwlOaWhMaXN0ICplbnRyeTEsICplbnRyeTIsICpwdHI7Ci0rCU5paExpc3QgKmVudHJ5MyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKLSAKLSAJVEVTVF9GVU5DVElPTiAoIm5paF9oYXNoX2xvb2t1cCIpOwotIAloYXNoID0gbmloX2hhc2hfc3RyaW5nX25ldyAoTlVMTCwgMCk7Ci0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL3Rlc3RzL3Rlc3RfbWFpbi5jCi0rKysgbGlibmloLTEuMC4zL25paC90ZXN0cy90ZXN0X21haW4uYwotQEAgLTQ1Nyw3ICs0NTcsNyBAQAotIHRlc3RfbWFpbl9sb29wICh2b2lkKQotIHsKLSAJTmloTWFpbkxvb3BGdW5jICpmdW5jOwotLQlOaWhUaW1lciAgICAgICAgKnRpbWVyOwotKwlOaWhUaW1lciAgICAgICAgKnRpbWVyIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOwotIAlpbnQgICAgICAgICAgICAgIHJldDsKLSAKLSAJLyogQ2hlY2sgdGhhdCB3ZSBjYW4gcnVuIHRocm91Z2ggdGhlIG1haW4gbG9vcCwgYW5kIHRoYXQgdGhlCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL3Rlc3RzL3Rlc3Rfd2F0Y2guYwotKysrIGxpYm5paC0xLjAuMy9uaWgvdGVzdHMvdGVzdF93YXRjaC5jCi1AQCAtMiw4ICsyLDggQEAKLSAgKgotICAqIHRlc3Rfd2F0Y2guYyAtIHRlc3Qgc3VpdGUgZm9yIG5paC93YXRjaC5jCi0gICoKLS0gKiBDb3B5cmlnaHQgwqkgMjAwOSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+LgotLSAqIENvcHlyaWdodCDCqSAyMDA5IENhbm9uaWNhbCBMdGQuCi0rICogQ29weXJpZ2h0IMKpIDIwMTEgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KLSsgKiBDb3B5cmlnaHQgwqkgMjAxMSBDYW5vbmljYWwgTHRkLgotICAqCi0gICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgYXMKLUBAIC0zOSw2ICszOSw4IEBACi0gI2luY2x1ZGUgPG5paC9lcnJvci5oPgotICNpbmNsdWRlIDxuaWgvbG9nZ2luZy5oPgotIAotKy8qIFJlYWQgIlRoZSBIaXRjaGhpa2VycyBHdWlkZSB0byB0aGUgR2FsYXh5IiAqLwotKyNkZWZpbmUgRklMVEVSX1ZBTFVFIDQyCi0gCi0gc3RhdGljIGludAotIG15X2ZpbHRlciAodm9pZCAgICAgICAqZGF0YSwKLUBAIC01NCw2ICs1NiwyNiBAQAotIAlyZXR1cm4gRkFMU0U7Ci0gfQotIAotKy8qIFNldCBieSBteV9maWx0ZXIyICgpIHNvIGl0IGtub3dzIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkICovCi0rc3RhdGljIGludCBteV9maWx0ZXIyX2NhbGxlZCA9IDA7Ci0rCi0rc3RhdGljIGludAotK215X2ZpbHRlcjIgKGludCAgICAgICAqdmFsdWUsCi0rCSAgIGNvbnN0IGNoYXIgKnBhdGgsCi0rCSAgIGludCAgICAgICAgIGlzX2RpcikKLSt7Ci0rCS8qIHdlIG9ubHkgd2FudCB0byB0b2dnbGUgdGhlIHZhbHVlIG9uY2UgKi8KLSsJaWYgKG15X2ZpbHRlcjJfY2FsbGVkKQotKwkJcmV0dXJuIFRSVUU7Ci0rCi0rCW15X2ZpbHRlcjJfY2FsbGVkID0gMTsKLSsKLSsJbmloX2Fzc2VydCAodmFsdWUgJiYgKnZhbHVlID09IEZJTFRFUl9WQUxVRSk7Ci0rCSp2YWx1ZSA9IDA7Ci0rCi0rCXJldHVybiBGQUxTRTsKLSt9Ci0rCi0gc3RhdGljIGludCBjcmVhdGVfY2FsbGVkID0gMDsKLSBzdGF0aWMgaW50IG1vZGlmeV9jYWxsZWQgPSAwOwotIHN0YXRpYyBpbnQgZGVsZXRlX2NhbGxlZCA9IDA7Ci1AQCAtNTUzLDYgKzU3NSw0NCBAQAotIAkJbmloX2ZyZWUgKHdhdGNoKTsKLSAJfQotIAotKwkvKiBFbnN1cmUgdGhlIGZpbGUgZmlsdGVyIGdldHMgcGFzc2VkIHRoZSBjb3JyZWN0IGRhdGEgcG9pbnRlci4KLSsJICovCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggZmlsdGVyIGFuZCBkYXRhIik7Ci0rCi0rCS8qIEVuc3VyZSB3ZSBoYXZlIGEgbmV3IGRpcmVjdG9yeSAqLwotKwlURVNUX0ZJTEVOQU1FIChkaXJuYW1lKTsKLSsJbWtkaXIgKGRpcm5hbWUsIDA3NTUpOwotKwotKwkvKiBDcmVhdGUgYSBzaW5nbGUgZmlsZSAqLwotKwlzdHJjcHkgKGZpbGVuYW1lLCBkaXJuYW1lKTsKLSsJc3RyY2F0IChmaWxlbmFtZSwgIi9mb28iKTsKLSsKLSsJZmQgPSBmb3BlbiAoZmlsZW5hbWUsICJ3Iik7Ci0rCWZwcmludGYgKGZkLCAidGVzdFxuIik7Ci0rCWZjbG9zZSAoZmQpOwotKwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJaW50IHdhdGNoX2RhdGEgPSBGSUxURVJfVkFMVUU7Ci0rCi0rCQkvKiBSZXNldCByZXF1aXJlZCB0byBhcHBlYXNlIFRFU1RfQUxMT0NfRkFJTCAqLwotKwkJbXlfZmlsdGVyMl9jYWxsZWQgPSAwOwotKwotKwkJd2F0Y2ggPSBuaWhfd2F0Y2hfbmV3IChOVUxMLCBkaXJuYW1lLAotKwkJCQlUUlVFLCBUUlVFLAotKwkJCQkoTmloRmlsZUZpbHRlcilteV9maWx0ZXIyLAotKwkJCQlOVUxMLCBOVUxMLCBOVUxMLAotKwkJCQkmd2F0Y2hfZGF0YSk7Ci0rCi0rCQlURVNUX05FX1AgKHdhdGNoLCBOVUxMKTsKLSsKLSsJCS8qIEVuc3VyZSB0aGUgZmlsdGVyIHdhcyBjYWxsZWQgYW5kIGNoYW5nZWQgdGhlIHZhbHVlICovCi0rCi0rCQlURVNUX05FIChteV9maWx0ZXIyX2NhbGxlZCwgMCk7Ci0rCQlURVNUX0VRICh3YXRjaF9kYXRhLCAwKTsKLSsKLSsJCW5paF9mcmVlICh3YXRjaCk7Ci0rCX0KLSsKLSAJc3RyY3B5IChmaWxlbmFtZSwgZGlybmFtZSk7Ci0gCXN0cmNhdCAoZmlsZW5hbWUsICIvYmFyIik7Ci0gCWNobW9kIChmaWxlbmFtZSwgMDc1NSk7Ci1AQCAtOTQ2LDEzICsxMDA2LDgyIEBACi0gCW5paF9lcnJvcl9pbml0ICgpOwotIAotIAlURVNUX0ZJTEVOQU1FIChkaXJuYW1lKTsKLS0JbWtkaXIgKGRpcm5hbWUsIDA3NTUpOwotKwlURVNUX0VRIChta2RpciAoZGlybmFtZSwgMDc1NSksIDApOwotIAotLQl3YXRjaCA9IG5paF93YXRjaF9uZXcgKE5VTEwsIGRpcm5hbWUsIFRSVUUsIFRSVUUsIG15X2ZpbHRlciwKLS0JCQkgICAgICAgbXlfY3JlYXRlX2hhbmRsZXIsIG15X21vZGlmeV9oYW5kbGVyLAotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIHdhdGNoZWQgZmlsZSIpOwotKwlzdHJjcHkgKGZpbGVuYW1lLCBkaXJuYW1lKTsKLSsJc3RyY2F0IChmaWxlbmFtZSwgIi9mb28iKTsKLSsKLSsJLyogQ3JlYXRlIGZpbGUgZmlyc3Qgc2luY2Ugd2UgZG9uJ3Qgc2V0IGEgY3JlYXRlIGhhbmRsZXIgb24gdGhlCi0rCSAqIHdhdGNoLgotKwkgKi8KLSsJZmQgPSBmb3BlbiAoZmlsZW5hbWUsICJ3Iik7Ci0rCWZwcmludGYgKGZkLCAiYmFyXG4iKTsKLSsJZmNsb3NlIChmZCk7Ci0rCi0rCWNyZWF0ZV9jYWxsZWQgPSAwOwotKwltb2RpZnlfY2FsbGVkID0gMDsKLSsJZGVsZXRlX2NhbGxlZCA9IDA7Ci0rCWxvZ2dlcl9jYWxsZWQgPSAwOwotKwlsYXN0X3BhdGggID0gTlVMTDsKLSsJbGFzdF93YXRjaCA9IE5VTEw7Ci0rCWxhc3RfZGF0YSAgPSBOVUxMOwotKwotKwl3YXRjaCA9IG5paF93YXRjaF9uZXcgKE5VTEwsIGZpbGVuYW1lLCBGQUxTRSwgRkFMU0UsIE5VTEwsCi0rCQkJICAgICAgIE5VTEwsIG15X21vZGlmeV9oYW5kbGVyLAotIAkJCSAgICAgICBteV9kZWxldGVfaGFuZGxlciwgJndhdGNoKTsKLSsJVEVTVF9ORV9QICh3YXRjaCwgTlVMTCk7Ci0rCi0rCS8qIE5vdywgbW9kaWZ5IHRoZSBleGlzdGluZyBmaWxlIHRvIHRyaWdnZXIgdGhlIG1vZGlmeSBoYW5kbGVyLiAqLwotKwlmZCA9IGZvcGVuIChmaWxlbmFtZSwgImErIik7Ci0rCWZwcmludGYgKGZkLCAiYmF6XG4iKTsKLSsJZmNsb3NlIChmZCk7Ci0rCi0rCW5mZHMgPSAwOwotKwlGRF9aRVJPICgmcmVhZGZkcyk7Ci0rCUZEX1pFUk8gKCZ3cml0ZWZkcyk7Ci0rCUZEX1pFUk8gKCZleGNlcHRmZHMpOwotKwotKwluaWhfaW9fc2VsZWN0X2ZkcyAoJm5mZHMsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMpOwotKwlzZWxlY3QgKG5mZHMsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMsIE5VTEwpOwotKwluaWhfaW9faGFuZGxlX2ZkcyAoJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcyk7Ci0rCi0rCVRFU1RfRVFfU1RSICh3YXRjaC0+cGF0aCwgZmlsZW5hbWUpOwotKwotKwkvKiBFbnN1cmUgbm8gcmVncmVzc2lvbiB0byBvbGQgYmVoYXZpb3VyIChMUDojNzc3MDk3KSAqLwotKwlURVNUX05FIChsYXN0X3BhdGhbIHN0cmxlbihsYXN0X3BhdGgpIC0gMSBdLCAnLycpOwotKwotKwlURVNUX0VRX1NUUiAobGFzdF9wYXRoLCBmaWxlbmFtZSk7Ci0rCVRFU1RfRVEgKG1vZGlmeV9jYWxsZWQsIDEpOwotKwotKwl1bmxpbmsgKGZpbGVuYW1lKTsKLSsKLSsJbmZkcyA9IDA7Ci0rCUZEX1pFUk8gKCZyZWFkZmRzKTsKLSsJRkRfWkVSTyAoJndyaXRlZmRzKTsKLSsJRkRfWkVSTyAoJmV4Y2VwdGZkcyk7Ci0rCi0rCW5paF9pb19zZWxlY3RfZmRzICgmbmZkcywgJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcyk7Ci0rCXNlbGVjdCAobmZkcywgJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcywgTlVMTCk7Ci0rCW5paF9pb19oYW5kbGVfZmRzICgmcmVhZGZkcywgJndyaXRlZmRzLCAmZXhjZXB0ZmRzKTsKLSAKLSsJVEVTVF9FUSAoZGVsZXRlX2NhbGxlZCwgMSk7Ci0gCi0rCXJtZGlyIChmaWxlbmFtZSk7Ci0rCW5paF9mcmVlIChsYXN0X3BhdGgpOwotKwotKwljcmVhdGVfY2FsbGVkID0gMDsKLSsJbW9kaWZ5X2NhbGxlZCA9IDA7Ci0rCWRlbGV0ZV9jYWxsZWQgPSAwOwotKwlsb2dnZXJfY2FsbGVkID0gMDsKLSsJbGFzdF9wYXRoICA9IE5VTEw7Ci0rCWxhc3Rfd2F0Y2ggPSBOVUxMOwotKwlsYXN0X2RhdGEgID0gTlVMTDsKLSsKLSsKLSsJd2F0Y2ggPSBuaWhfd2F0Y2hfbmV3IChOVUxMLCBkaXJuYW1lLCBUUlVFLCBUUlVFLCBteV9maWx0ZXIsCi0rCQkJICAgICAgIG15X2NyZWF0ZV9oYW5kbGVyLCBteV9tb2RpZnlfaGFuZGxlciwKLSsJCQkgICAgICAgbXlfZGVsZXRlX2hhbmRsZXIsICZ3YXRjaCk7Ci0gCS8qIENoZWNrIHRoYXQgY3JlYXRpbmcgYSBmaWxlIHdpdGhpbiB0aGUgZGlyZWN0b3J5IGJlaW5nIHdhdGNoZWQKLSAJICogcmVzdWx0cyBpbiB0aGUgY3JlYXRlIGhhbmRsZXIgYmVpbmcgY2FsbGVkLCBhbmQgcGFzc2VkIHRoZSBmdWxsCi0gCSAqIHBhdGggb2YgdGhlIGNyZWF0ZWQgZmlsZSB0byBpdC4KLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvdGVzdHMvdGVzdF9zdHJpbmcuYwotKysrIGxpYm5paC0xLjAuMy9uaWgvdGVzdHMvdGVzdF9zdHJpbmcuYwotQEAgLTYxOSw2ICs2MTksMjE1IEBACi0gCQluaWhfZnJlZSAoYXJyYXkpOwotIAl9Ci0gCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggbm8gcmVwZWF0IGFuZCBtdWx0aXBsZSBpZGVudGljYWwgZGVsaW1pdGVyICIKLSsJCQkiY2hhcmFjdGVycyBhdCBzdHJpbmcgc3RhcnQiKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCWFycmF5ID0gbmloX3N0cl9zcGxpdCAoTlVMTCwgIlx0XHR0aGlzIGlzIGEgdGVzdCIsICIgXHQiLCBGQUxTRSk7Ci0rCi0rCQlpZiAodGVzdF9hbGxvY19mYWlsZWQpIHsKLSsJCQlURVNUX0VRX1AgKGFycmF5LCBOVUxMKTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsKLSsJCVRFU1RfQUxMT0NfU0laRSAoYXJyYXksIHNpemVvZiAoY2hhciAqKSAqIDcpOwotKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSsJCQlURVNUX0FMTE9DX1BBUkVOVCAoYXJyYXlbaV0sIGFycmF5KTsKLSsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVswXSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzFdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMl0sICJ0aGlzIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbM10sICJpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzRdLCAiYSIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzVdLCAidGVzdCIpOwotKwkJVEVTVF9FUV9QIChhcnJheVs2XSwgTlVMTCk7Ci0rCi0rCQluaWhfZnJlZSAoYXJyYXkpOwotKwl9Ci0rCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggbm8gcmVwZWF0IGFuZCBtdWx0aXBsZSBkaWZmZXJlbnQgZGVsaW1pdGVyICIKLSsJCQkiY2hhcmFjdGVycyBhdCBzdHJpbmcgc3RhcnQiKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCWFycmF5ID0gbmloX3N0cl9zcGxpdCAoTlVMTCwgIiBcdHRoaXMgaXMgYSB0ZXN0IiwgIiBcdCIsIEZBTFNFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogNyk7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMV0sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsyXSwgInRoaXMiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVszXSwgImlzIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNF0sICJhIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNV0sICJ0ZXN0Iik7Ci0rCQlURVNUX0VRX1AgKGFycmF5WzZdLCBOVUxMKTsKLSsKLSsJCW5paF9mcmVlIChhcnJheSk7Ci0rCX0KLSsKLSsJVEVTVF9GRUFUVVJFICgid2l0aCBubyByZXBlYXQgYW5kIG11bHRpcGxlIGlkZW50aWNhbCBkZWxpbWl0ZXIgIgotKwkJCSJjaGFyYWN0ZXJzIHdpdGhpbiBzdHJpbmciKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCWFycmF5ID0gbmloX3N0cl9zcGxpdCAoTlVMTCwgInRoaXMgaXMgICBhXHRcdHRlc3QiLCAiIFx0IiwgRkFMU0UpOwotKwotKwkJaWYgKHRlc3RfYWxsb2NfZmFpbGVkKSB7Ci0rCQkJVEVTVF9FUV9QIChhcnJheSwgTlVMTCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlURVNUX0FMTE9DX1NJWkUgKGFycmF5LCBzaXplb2YgKGNoYXIgKikgKiA4KTsKLSsJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICJ0aGlzIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMV0sICJpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzJdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbM10sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs0XSwgImEiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs1XSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzZdLCAidGVzdCIpOwotKwkJVEVTVF9FUV9QIChhcnJheVs3XSwgTlVMTCk7Ci0rCi0rCQluaWhfZnJlZSAoYXJyYXkpOwotKwl9Ci0rCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggbm8gcmVwZWF0IGFuZCBtdWx0aXBsZSBkaWZmZXJlbnQgZGVsaW1pdGVyICIKLSsJCQkiY2hhcmFjdGVycyB3aXRoaW4gc3RyaW5nIik7Ci0rCVRFU1RfQUxMT0NfRkFJTCB7Ci0rCQlhcnJheSA9IG5paF9zdHJfc3BsaXQgKE5VTEwsICJ0aGlzIGlzIFxuXHRhXHR0ZXN0IiwgIiBcdFxuIiwgRkFMU0UpOwotKwotKwkJaWYgKHRlc3RfYWxsb2NfZmFpbGVkKSB7Ci0rCQkJVEVTVF9FUV9QIChhcnJheSwgTlVMTCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlURVNUX0FMTE9DX1NJWkUgKGFycmF5LCBzaXplb2YgKGNoYXIgKikgKiA3KTsKLSsJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICJ0aGlzIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMV0sICJpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzJdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbM10sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs0XSwgImEiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs1XSwgInRlc3QiKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbNl0sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotKwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIG5vIHJlcGVhdCBhbmQgbXVsdGlwbGUgaWRlbnRpY2FsIGRlbGltaXRlciAiCi0rCQkJImNoYXJhY3RlcnMgYXQgc3RyaW5nIGVuZCIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLCAidGhpcyBpcyBhIHRlc3QgICIsICIgXHQiLCBGQUxTRSk7Ci0rCi0rCQlpZiAodGVzdF9hbGxvY19mYWlsZWQpIHsKLSsJCQlURVNUX0VRX1AgKGFycmF5LCBOVUxMKTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsKLSsJCVRFU1RfQUxMT0NfU0laRSAoYXJyYXksIHNpemVvZiAoY2hhciAqKSAqIDYpOwotKwkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLSsJCQlURVNUX0FMTE9DX1BBUkVOVCAoYXJyYXlbaV0sIGFycmF5KTsKLSsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVswXSwgInRoaXMiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsxXSwgImlzIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMl0sICJhIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbM10sICJ0ZXN0Iik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNF0sICIiKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbNV0sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotKwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIG5vIHJlcGVhdCBhbmQgbXVsdGlwbGUgZGlmZmVyZW50IGRlbGltaXRlciAiCi0rCQkJImNoYXJhY3RlcnMgYXQgc3RyaW5nIGVuZCIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLCAidGhpcyBpcyBhIHRlc3QgXHQiLCAiIFx0IiwgRkFMU0UpOwotKwotKwkJaWYgKHRlc3RfYWxsb2NfZmFpbGVkKSB7Ci0rCQkJVEVTVF9FUV9QIChhcnJheSwgTlVMTCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlURVNUX0FMTE9DX1NJWkUgKGFycmF5LCBzaXplb2YgKGNoYXIgKikgKiA2KTsKLSsJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICJ0aGlzIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMV0sICJpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzJdLCAiYSIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzNdLCAidGVzdCIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzRdLCAiIik7Ci0rCQlURVNUX0VRX1AgKGFycmF5WzVdLCBOVUxMKTsKLSsKLSsJCW5paF9mcmVlIChhcnJheSk7Ci0rCX0KLSsKLSsJVEVTVF9GRUFUVVJFICgid2l0aCBubyByZXBlYXQgYW5kIG11bHRpcGxlIGlkZW50aWNhbCBkZWxpbWl0ZXIgIgotKwkJCSJjaGFyYWN0ZXJzIGF0IGJlZ2lubmluZywgbWlkZGxlIGFuZCBlbmQgb2Ygc3RyaW5nIik7Ci0rCVRFU1RfQUxMT0NfRkFJTCB7Ci0rCQlhcnJheSA9IG5paF9zdHJfc3BsaXQgKE5VTEwsICIgICB0aGlzIGlzXG5cblxuYSB0ZXN0XHRcdFx0IiwgIiBcdFxuIiwgRkFMU0UpOwotKwotKwkJaWYgKHRlc3RfYWxsb2NfZmFpbGVkKSB7Ci0rCQkJVEVTVF9FUV9QIChhcnJheSwgTlVMTCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlURVNUX0FMTE9DX1NJWkUgKGFycmF5LCBzaXplb2YgKGNoYXIgKikgKiAxMik7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykKLSsJCQlURVNUX0FMTE9DX1BBUkVOVCAoYXJyYXlbaV0sIGFycmF5KTsKLSsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVswXSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzFdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMl0sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVszXSwgInRoaXMiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs0XSwgImlzIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNV0sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs2XSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzddLCAiYSIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzhdLCAidGVzdCIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzldLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMTBdLCAiIik7Ci0rCQlURVNUX0VRX1AgKGFycmF5WzExXSwgTlVMTCk7Ci0rCi0rCQluaWhfZnJlZSAoYXJyYXkpOwotKwl9Ci0rCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggbm8gcmVwZWF0IGFuZCBtdWx0aXBsZSBkaWZmZXJlbnQgZGVsaW1pdGVyICIKLSsJCQkiY2hhcmFjdGVycyBhdCBiZWdpbm5pbmcsIG1pZGRsZSBhbmQgZW5kIG9mIHN0cmluZyIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLCAiOiBcbnRoaXMgaXNcdCBcbjphIHRlc3Q6XG4gIiwgIlxuIDpcdCIsIEZBTFNFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogMTMpOwotKwkJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsxXSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzJdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbM10sICJ0aGlzIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNF0sICJpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzVdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNl0sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs3XSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzhdLCAiYSIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzldLCAidGVzdCIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzEwXSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzExXSwgIiIpOwotKwkJVEVTVF9FUV9QIChhcnJheVsxMl0sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotIAotIAkvKiBDaGVjayB0aGF0IHdlIGNhbiBzcGxpdCBhIHN0cmluZyB0cmVhdGluZyBtdWx0aXBsZSBjb25zZWN1dGl2ZQotIAkgKiBtYXRjaGluZyBjaGFyYWN0ZXJzIGFzIGEgc2luZ2xlIHNlcGFyYXRvciB0byBiZSBza2lwcGVkLgotQEAgLTY0NSw2ICs4NTQsMTc3IEBACi0gCQluaWhfZnJlZSAoYXJyYXkpOwotIAl9Ci0gCi0rCS8qIENoZWNrIHRoYXQgd2UgY2FuIHNwbGl0IGEgc3RyaW5nIGNvbnRhaW5pbmcgbXVsdGlwbGUKLSsJICogb2NjdXJlbmNlcyBvZiBvbmUgb2YgdGhlIGRlbGltaXRlciBjaGFyYWN0ZXJzIGF0IHRoZQotKwkgKiBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4KLSsJICovCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggcmVwZWF0IGFuZCBtdWx0aXBsZSBpZGVudGljYWwgYWRqYWNlbnQgZGVsaW1pdGVyIGNoYXJhY3RlcnMgYXQgc3RyaW5nIHN0YXJ0Iik7Ci0rCVRFU1RfQUxMT0NfRkFJTCB7Ci0rCQlhcnJheSA9IG5paF9zdHJfc3BsaXQgKE5VTEwsICJcblxuaGVsbG8iLCAiIFx0XHJcbiIsIFRSVUUpOwotKwotKwkJaWYgKHRlc3RfYWxsb2NfZmFpbGVkKSB7Ci0rCQkJVEVTVF9FUV9QIChhcnJheSwgTlVMTCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlURVNUX0FMTE9DX1NJWkUgKGFycmF5LCBzaXplb2YgKGNoYXIgKikgKiAyKTsKLSsJCWZvciAoaSA9IDA7IGkgPCAxOyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICJoZWxsbyIpOwotKwkJVEVTVF9FUV9QIChhcnJheVsxXSwgTlVMTCk7Ci0rCi0rCQluaWhfZnJlZSAoYXJyYXkpOwotKwl9Ci0rCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggcmVwZWF0IGFuZCBtdWx0aXBsZSBkaWZmZXJlbnQgYWRqYWNlbnQgZGVsaW1pdGVyIGNoYXJhY3RlcnMgYXQgc3RyaW5nIHN0YXJ0Iik7Ci0rCVRFU1RfQUxMT0NfRkFJTCB7Ci0rCQlhcnJheSA9IG5paF9zdHJfc3BsaXQgKE5VTEwsICJcblxyIGhlbGxvIiwgIiBcdFxyXG4iLCBUUlVFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogMik7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAiaGVsbG8iKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbMV0sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotKwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIHJlcGVhdCBhbmQgbXVsdGlwbGUgaWRlbnRpY2FsIGFkamFjZW50IGRlbGltaXRlciAiCi0rCQkJImNoYXJhY3RlcnMgd2l0aGluIHN0cmluZyIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLCAiaGVsbG9cblxyd29ybGQiLCAiIFx0XG5cciIsIFRSVUUpOwotKwotKwkJaWYgKHRlc3RfYWxsb2NfZmFpbGVkKSB7Ci0rCQkJVEVTVF9FUV9QIChhcnJheSwgTlVMTCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlURVNUX0FMTE9DX1NJWkUgKGFycmF5LCBzaXplb2YgKGNoYXIgKikgKiAzKTsKLSsJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICJoZWxsbyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzFdLCAid29ybGQiKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbMl0sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotKwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIHJlcGVhdCBhbmQgbXVsdGlwbGUgZGlmZmVyZW50IGFkamFjZW50IGRlbGltaXRlciAiCi0rCQkJImNoYXJhY3RlcnMgd2l0aGluIHN0cmluZyIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLCAiaGVsbG9cblxyXHR3b3JsZCIsICIgXHRcblxyIiwgVFJVRSk7Ci0rCi0rCQlpZiAodGVzdF9hbGxvY19mYWlsZWQpIHsKLSsJCQlURVNUX0VRX1AgKGFycmF5LCBOVUxMKTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsKLSsJCVRFU1RfQUxMT0NfU0laRSAoYXJyYXksIHNpemVvZiAoY2hhciAqKSAqIDMpOwotKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSsJCQlURVNUX0FMTE9DX1BBUkVOVCAoYXJyYXlbaV0sIGFycmF5KTsKLSsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVswXSwgImhlbGxvIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMV0sICJ3b3JsZCIpOwotKwkJVEVTVF9FUV9QIChhcnJheVsyXSwgTlVMTCk7Ci0rCi0rCQluaWhfZnJlZSAoYXJyYXkpOwotKwl9Ci0rCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggcmVwZWF0IGFuZCBtdWx0aXBsZSBpZGVudGljYWwgYWRqYWNlbnQgZGVsaW1pdGVyICIKLSsJCQkiY2hhcmFjdGVycyBhdCBzdHJpbmcgZW5kIik7Ci0rCVRFU1RfQUxMT0NfRkFJTCB7Ci0rCQlhcnJheSA9IG5paF9zdHJfc3BsaXQgKE5VTEwsICJoZWxsb1xuXG5cblxuXG5cblxuIiwgIiBcdFxyXG4iLCBUUlVFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogMik7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAiaGVsbG8iKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbMV0sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotKwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIHJlcGVhdCBhbmQgbXVsdGlwbGUgZGlmZmVyZW50IGFkamFjZW50IGRlbGltaXRlciAiCi0rCQkJImNoYXJhY3RlcnMgYXQgc3RyaW5nIGVuZCIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLCAiaGVsbG8gXHJcdFxyXHRcbiAiLCAiIFx0XHJcbiIsIFRSVUUpOwotKwotKwkJaWYgKHRlc3RfYWxsb2NfZmFpbGVkKSB7Ci0rCQkJVEVTVF9FUV9QIChhcnJheSwgTlVMTCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlURVNUX0FMTE9DX1NJWkUgKGFycmF5LCBzaXplb2YgKGNoYXIgKikgKiAyKTsKLSsJCWZvciAoaSA9IDA7IGkgPCAxOyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICJoZWxsbyIpOwotKwkJVEVTVF9FUV9QIChhcnJheVsxXSwgTlVMTCk7Ci0rCi0rCQluaWhfZnJlZSAoYXJyYXkpOwotKwl9Ci0rCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggcmVwZWF0IGFuZCBtdWx0aXBsZSBpZGVudGljYWwgYWRqYWNlbnQgZGVsaW1pdGVyICIKLSsJCQkiY2hhcmFjdGVycyBhdCBiZWdpbm5pbmcsIG1pZGRsZSBhbmQgZW5kIG9mIHN0cmluZyIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLAotKwkJCQkiICAgICAgICBoZWxsb1xuXG5cbiwgIHdvcmxkXG5cblxuIiwKLSsJCQkJIlxyXHRcbiAiLCBUUlVFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogNCk7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAiaGVsbG8iKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsxXSwgIiwiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsyXSwgIndvcmxkIik7Ci0rCQlURVNUX0VRX1AgKGFycmF5WzNdLCBOVUxMKTsKLSsKLSsJCW5paF9mcmVlIChhcnJheSk7Ci0rCX0KLSsKLSsJVEVTVF9GRUFUVVJFICgid2l0aCByZXBlYXQgYW5kIG11bHRpcGxlIGRpZmZlcmVudCBhZGphY2VudCBkZWxpbWl0ZXIgIgotKwkJCSJjaGFyYWN0ZXJzIGF0IGJlZ2lubmluZywgbWlkZGxlIGFuZCBlbmQgb2Ygc3RyaW5nIik7Ci0rCVRFU1RfQUxMT0NfRkFJTCB7Ci0rCQlhcnJheSA9IG5paF9zdHJfc3BsaXQgKE5VTEwsCi0rCQkJCSJcbiAgICBcclx0aGVsbG9cblxuXHIgLCBcblx0XHJ3b3JsZFx0IFxyXG4gXG4iLAotKwkJCQkiIFx0XG5cciIsIFRSVUUpOwotKwotKwkJaWYgKHRlc3RfYWxsb2NfZmFpbGVkKSB7Ci0rCQkJVEVTVF9FUV9QIChhcnJheSwgTlVMTCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlURVNUX0FMTE9DX1NJWkUgKGFycmF5LCBzaXplb2YgKGNoYXIgKikgKiA0KTsKLSsJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICJoZWxsbyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzFdLCAiLCIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzJdLCAid29ybGQiKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbM10sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotIAotIAkvKiBDaGVjayB0aGF0IHdlIGNhbiBnaXZlIGFuIGVtcHR5IHN0cmluZywgYW5kIGVuZCB1cCB3aXRoIGEKLSAJICogb25lLWVsZW1lbnQgYXJyYXkgdGhhdCBvbmx5IGNvbnRhaW5zIGEgTlVMTCBwb2ludGVyLgotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC90ZXN0cy90ZXN0X2ZpbGUuYwotKysrIGxpYm5paC0xLjAuMy9uaWgvdGVzdHMvdGVzdF9maWxlLmMKLUBAIC03MjQsNiArNzI0LDI1IEBACi0gCXJldHVybiBGQUxTRTsKLSB9Ci0gCi0rLyogZmluZCBvbmx5IGZyb2RvIGZpbGVzICovCi0rc3RhdGljIGludAotK215X2ZpbHRlcl9mcm9kb19maWxlICh2b2lkICAgICAgICpkYXRhLAotKwkgICBjb25zdCBjaGFyICpwYXRoLAotKwkgICBpbnQgICAgICAgICBpc19kaXIpCi0rewotKwljaGFyICpzbGFzaDsKLSsKLSsJaWYgKGlzX2RpcikKLSsJCXJldHVybiBGQUxTRTsKLSsKLSsJc2xhc2ggPSBzdHJyY2hyIChwYXRoLCAnLycpOwotKwlpZiAoc3RyY21wIChzbGFzaCwgIi9mcm9kbyIpKQotKwkJcmV0dXJuIFRSVUU7Ci0rCi0rCXJldHVybiBGQUxTRTsKLSt9Ci0rCi0rCi0gc3RhdGljIGludCBsb2dnZXJfY2FsbGVkID0gMDsKLSAKLSBzdGF0aWMgaW50Ci1AQCAtOTA1LDYgKzkyNCw0OCBAQAotIAkJVEVTVF9FUV9TVFIgKHYtPnBhdGgsIGZpbGVuYW1lKTsKLSAKLSAJCW5paF9mcmVlICh2aXNpdGVkKTsKLSsKLSsJCQkJLyogVHJ5IGFsc28gaW52ZXJzZSBmaWx0ZXIgKi8KLSsJCVRFU1RfQUxMT0NfU0FGRSB7Ci0rCQkJdmlzaXRvcl9jYWxsZWQgPSAwOwotKwkJCXZpc2l0ZWQgPSBuaWhfbGlzdF9uZXcgKE5VTEwpOwotKwkJfQotKwotKwkJcmV0ID0gbmloX2Rpcl93YWxrIChkaXJuYW1lLCBteV9maWx0ZXJfZnJvZG9fZmlsZSwKLSsJCQkJICAgIG15X3Zpc2l0b3IsIE5VTEwsICZyZXQpOwotKwotKwkJVEVTVF9FUSAocmV0LCAwKTsKLSsJCVRFU1RfRVEgKHZpc2l0b3JfY2FsbGVkLCA0KTsKLSsKLSsJCXYgPSAoVmlzaXRlZCAqKXZpc2l0ZWQtPm5leHQ7Ci0rCQlURVNUX0VRICh2LT5kYXRhLCAmcmV0KTsKLSsJCVRFU1RfRVFfU1RSICh2LT5kaXJuYW1lLCBkaXJuYW1lKTsKLSsJCXN0cmNweSAoZmlsZW5hbWUsIGRpcm5hbWUpOwotKwkJc3RyY2F0IChmaWxlbmFtZSwgIi9iYXIiKTsKLSsJCVRFU1RfRVFfU1RSICh2LT5wYXRoLCBmaWxlbmFtZSk7Ci0rCi0rCQl2ID0gKFZpc2l0ZWQgKil2LT5lbnRyeS5uZXh0OwotKwkJVEVTVF9FUSAodi0+ZGF0YSwgJnJldCk7Ci0rCQlURVNUX0VRX1NUUiAodi0+ZGlybmFtZSwgZGlybmFtZSk7Ci0rCQlzdHJjcHkgKGZpbGVuYW1lLCBkaXJuYW1lKTsKLSsJCXN0cmNhdCAoZmlsZW5hbWUsICIvYmFyL2Zyb2RvIik7Ci0rCQlURVNUX0VRX1NUUiAodi0+cGF0aCwgZmlsZW5hbWUpOwotKwotKwkJdiA9IChWaXNpdGVkICopdi0+ZW50cnkubmV4dDsKLSsJCVRFU1RfRVEgKHYtPmRhdGEsICZyZXQpOwotKwkJVEVTVF9FUV9TVFIgKHYtPmRpcm5hbWUsIGRpcm5hbWUpOwotKwkJc3RyY3B5IChmaWxlbmFtZSwgZGlybmFtZSk7Ci0rCQlzdHJjYXQgKGZpbGVuYW1lLCAiL2JheiIpOwotKwkJVEVTVF9FUV9TVFIgKHYtPnBhdGgsIGZpbGVuYW1lKTsKLSsKLSsJCXYgPSAoVmlzaXRlZCAqKXYtPmVudHJ5Lm5leHQ7Ci0rCQlURVNUX0VRICh2LT5kYXRhLCAmcmV0KTsKLSsJCVRFU1RfRVFfU1RSICh2LT5kaXJuYW1lLCBkaXJuYW1lKTsKLSsJCXN0cmNweSAoZmlsZW5hbWUsIGRpcm5hbWUpOwotKwkJc3RyY2F0IChmaWxlbmFtZSwgIi9mcm9kbyIpOwotKwkJVEVTVF9FUV9TVFIgKHYtPnBhdGgsIGZpbGVuYW1lKTsKLSsKLSsJCW5paF9mcmVlICh2aXNpdGVkKTsKLSAJfQotIAotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL2RlYmlhbi9jb250cm9sCi0rKysgbGlibmloLTEuMC4zL2RlYmlhbi9jb250cm9sCi1AQCAtMCwwICsxLDgxIEBACi0rU291cmNlOiBsaWJuaWgKLStTZWN0aW9uOiBsaWJzCi0rUHJpb3JpdHk6IHJlcXVpcmVkCi0rTWFpbnRhaW5lcjogVWJ1bnR1IERldmVsb3BlcnMgPHVidW50dS1kZXZlbC1kaXNjdXNzQGxpc3RzLnVidW50dS5jb20+Ci0rWFNCQy1PcmlnaW5hbC1NYWludGFpbmVyOiBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+Ci0rU3RhbmRhcmRzLVZlcnNpb246IDMuOS40Ci0rQnVpbGQtRGVwZW5kczogZGViaGVscGVyICg+PSA5KSwgcGtnLWNvbmZpZyAoPj0gMC4yMiksIGxpYmRidXMtMS1kZXYgKD49IDEuNCksIGxpYmV4cGF0MS1kZXYgKD49IDIuMC4wKSwgZGJ1cyAoPj0gMS40KSwgbGliYzYtZGV2ICg+PSAyLjE1fikgfCBsaWJjNi4xLWRldiAoPj0gMi4xNX4pLAotKyAgICAgICAgICAgICAgIGRoLWF1dG9yZWNvbmYsIGF1dG9wb2ludCwgZHBrZy1kZXYgKD49IDEuMTYuMX4pCi0rIyBUbyBjcm9zcyBidWlsZCB0aGlzIHBhY2thZ2UgYWxzbyBuZWVkczogbGliZGJ1cy0xLWRldjpuYXRpdmUgKD49IDEuNCksIGxpYmV4cGF0MS1kZXY6bmF0aXZlICg+PSAyLjAuMCkKLSsjIEJ1dCA6bmF0aXZlIGJ1aWxkLWRlcHMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LCBzbyBpbnN0ZWFkIG9uZSBjYW4gZG8KLSsjICQgYXB0LWdldCBidWlsZC1kZXAgbGlibmloCi0rIyAkIGFwdC1nZXQgYnVpbGQtZGVwIGxpYm5paCAtYWFybWhmCi0rIyBpbnN0ZWFkIHRvIGdldCBhbGwgcmVxdWlyZWQgYnVpbGQtZGVwcwotK1Zjcy1CenI6IGxwOnVidW50dS9saWJuaWgKLStYU0MtRGViaWFuLVZjcy1HaXQ6IGdpdDovL2dpdC5kZWJpYW4ub3JnL2dpdC9jb2xsYWItbWFpbnQvbGlibmloLmdpdAotK1hTQy1EZWJpYW4tVmNzLUJyb3dzZXI6IGh0dHA6Ly9naXQuZGViaWFuLm9yZy8/cD1jb2xsYWItbWFpbnQvbGlibmloLmdpdDthPXN1bW1hcnkKLStIb21lcGFnZTogaHR0cHM6Ly9sYXVuY2hwYWQubmV0L2xpYm5paAotKwotK1BhY2thZ2U6IGxpYm5paDEKLStBcmNoaXRlY3R1cmU6IGFueQotK1ByZS1EZXBlbmRzOiAke21pc2M6UHJlLURlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9Ci0rTXVsdGktQXJjaDogc2FtZQotK0Rlc2NyaXB0aW9uOiBOSUggVXRpbGl0eSBMaWJyYXJ5Ci0rIGxpYm5paCBpcyBhIGxpZ2h0LXdlaWdodCAic3RhbmRhcmQgbGlicmFyeSIgb2YgQyBmdW5jdGlvbnMgdG8gZWFzZSB0aGUKLSsgZGV2ZWxvcG1lbnQgb2Ygb3RoZXIgbGlicmFyaWVzIGFuZCBhcHBsaWNhdGlvbnMsIGVzcGVjaWFsbHkgdGhvc2UKLSsgbm9ybWFsbHkgZm91bmQgaW4gL2xpYi4KLSsgLgotKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIHNoYXJlZCBsaWJyYXJ5LgotKwotK1BhY2thZ2U6IGxpYm5paC1kZXYKLStQcmlvcml0eTogb3B0aW9uYWwKLStTZWN0aW9uOiBsaWJkZXZlbAotK0FyY2hpdGVjdHVyZTogYW55Ci0rTXVsdGktQXJjaDogc2FtZQotK0RlcGVuZHM6IGxpYm5paDEgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9Ci0rRGVzY3JpcHRpb246IE5JSCBVdGlsaXR5IExpYnJhcnkgKGRldmVsb3BtZW50IGZpbGVzKQotKyBsaWJuaWggaXMgYSBsaWdodC13ZWlnaHQgInN0YW5kYXJkIGxpYnJhcnkiIG9mIEMgZnVuY3Rpb25zIHRvIGVhc2UgdGhlCi0rIGRldmVsb3BtZW50IG9mIG90aGVyIGxpYnJhcmllcyBhbmQgYXBwbGljYXRpb25zLCBlc3BlY2lhbGx5IHRob3NlCi0rIG5vcm1hbGx5IGZvdW5kIGluIC9saWIuCi0rIC4KLSsgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBzdGF0aWMgbGlicmFyeSBhbmQgQyBoZWFkZXIgZmlsZXMgd2hpY2ggYXJlCi0rIG5lZWRlZCBmb3IgZGV2ZWxvcGluZyBzb2Z0d2FyZSB1c2luZyBsaWJuaWguCi0rCi0rUGFja2FnZTogbGlibmloLWRidXMxCi0rQXJjaGl0ZWN0dXJlOiBhbnkKLStQcmUtRGVwZW5kczogJHttaXNjOlByZS1EZXBlbmRzfQotK0RlcGVuZHM6IGxpYm5paDEgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9Ci0rTXVsdGktQXJjaDogc2FtZQotK0Rlc2NyaXB0aW9uOiBOSUggRC1CdXMgQmluZGluZ3MgTGlicmFyeQotKyBsaWJuaWgtZGJ1cyBpcyBhIEQtQnVzIGJpbmRpbmdzIGxpYnJhcnkgdGhhdCBpbnRlZ3JhdGVzIHdpdGggdGhlIG1haW4KLSsgbG9vcCBwcm92aWRlZCBieSBsaWJuaWguCi0rIC4KLSsgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBzaGFyZWQgbGlicmFyeS4KLSsKLStQYWNrYWdlOiBsaWJuaWgtZGJ1cy1kZXYKLStQcmlvcml0eTogb3B0aW9uYWwKLStTZWN0aW9uOiBsaWJkZXZlbAotK0FyY2hpdGVjdHVyZTogYW55Ci0rTXVsdGktQXJjaDogc2FtZQotK0RlcGVuZHM6IGxpYm5paC1kYnVzMSAoPSAke2JpbmFyeTpWZXJzaW9ufSksIGxpYm5paC1kZXYgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9Ci0rUmVjb21tZW5kczogbmloLWRidXMtdG9vbCAoPSAke2JpbmFyeTpWZXJzaW9ufSkKLStEZXNjcmlwdGlvbjogTklIIEQtQnVzIEJpbmRpbmdzIExpYnJhcnkgKGRldmVsb3BtZW50IGZpbGVzKQotKyBsaWJuaWgtZGJ1cyBpcyBhIEQtQnVzIGJpbmRpbmdzIGxpYnJhcnkgdGhhdCBpbnRlZ3JhdGVzIHdpdGggdGhlIG1haW4KLSsgbG9vcCBwcm92aWRlZCBieSBsaWJuaWguCi0rIC4KLSsgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBzdGF0aWMgbGlicmFyeSBhbmQgQyBoZWFkZXIgZmlsZXMgd2hpY2ggYXJlCi0rIG5lZWRlZCBmb3IgZGV2ZWxvcGluZyBzb2Z0d2FyZSB1c2luZyBsaWJuaWgtZGJ1cy4KLSsKLStQYWNrYWdlOiBuaWgtZGJ1cy10b29sCi0rU2VjdGlvbjogZGV2ZWwKLStBcmNoaXRlY3R1cmU6IGFueQotK011bHRpLUFyY2g6IGZvcmVpZ24KLStEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9Ci0rUmVjb21tZW5kczogbGlibmloLWRidXMtZGV2ICg9ICR7YmluYXJ5OlZlcnNpb259KQotK0Rlc2NyaXB0aW9uOiBOSUggRC1CdXMgQmluZGluZyBUb29sCi0rIG5paC1kYnVzLXRvb2wgZ2VuZXJhdGVzIEMgc291cmNlIGNvZGUgZnJvbSB0aGUgRC1CdXMgSW50cm9zcGVjdGlvbiBYTUwKLSsgZGF0YSBwcm92aWRlZCBieSBtb3N0IHNlcnZpY2VzOyBlaXRoZXIgdG8gbWFrZSBpbXBsZW1lbnRpbmcgdGhlCi0rIGRlc2NyaWJlZCBvYmplY3RzIGluIEMgcHJvZ3JhbXMgb3IgdG8gbWFrZSBwcm94eWluZyB0byB0aGUgZGVzY3JpYmVkCi0rIHJlbW90ZSBvYmplY3RzIGVhc2llci4KLSsgLgotKyBUaGUgZ2VuZXJhdGVkIGNvZGUgcmVxdWlyZXMgbGlibmloLWRidXMtZGV2IHRvIGJlIGNvbXBpbGVkLgotLS0tIGxpYm5paC0xLjAuMy5vcmlnL2RlYmlhbi9saWJuaWgtZGV2Lmluc3RhbGwKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2xpYm5paC1kZXYuaW5zdGFsbAotQEAgLTAsMCArMSw2IEBACi0rbGliLyovbGlibmloLmEKLStsaWIvKi9saWJuaWguc28KLSt1c3IvaW5jbHVkZS9saWJuaWguaAotK3Vzci9pbmNsdWRlL25paAotK3Vzci9saWIvKi9wa2djb25maWcvbGlibmloLnBjCi0rdXNyL3NoYXJlL2FjbG9jYWwvbGlibmloLm00Ci0tLS0gbGlibmloLTEuMC4zLm9yaWcvZGViaWFuL2xpYm5paDEuZG9jcwotKysrIGxpYm5paC0xLjAuMy9kZWJpYW4vbGlibmloMS5kb2NzCi1AQCAtMCwwICsxLDMgQEAKLStBVVRIT1JTCi0rTkVXUwotK1JFQURNRQotLS0tIGxpYm5paC0xLjAuMy5vcmlnL2RlYmlhbi9saWJuaWgtZGJ1czEuaW5zdGFsbAotKysrIGxpYm5paC0xLjAuMy9kZWJpYW4vbGlibmloLWRidXMxLmluc3RhbGwKLUBAIC0wLDAgKzEgQEAKLStsaWIvKi9saWJuaWgtZGJ1cy5zby4qCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvZGViaWFuL2xpYm5paDEuaW5zdGFsbAotKysrIGxpYm5paC0xLjAuMy9kZWJpYW4vbGlibmloMS5pbnN0YWxsCi1AQCAtMCwwICsxIEBACi0rbGliLyovbGlibmloLnNvLioKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vcnVsZXMKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL3J1bGVzCi1AQCAtMCwwICsxLDU0IEBACi0rIyEvdXNyL2Jpbi9tYWtlIC1mCi0rCi0raW5jbHVkZSAvdXNyL3NoYXJlL2Rwa2cvYXJjaGl0ZWN0dXJlLm1rCi0rCi0rJToKLSsJZGggJEAgLS13aXRoIGF1dG9yZWNvbmYKLSsKLSsKLStDRkxBR1MgOj0gLVdhbGwgLWZzdGFjay1wcm90ZWN0b3IgLWZQSUUgJChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgQ0ZMQUdTKQotK0xERkxBR1MgOj0gLVdsLC0tYXMtbmVlZGVkIC1XbCwteixyZWxybyAtV2wsLXosbm93IC1waWUgJChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgTERGTEFHUykKLSsKLStvdmVycmlkZV9kaF9hdXRvX2NvbmZpZ3VyZToKLStpZmVxICgkKERFQl9CVUlMRF9HTlVfVFlQRSksICQoREVCX0hPU1RfR05VX1RZUEUpKQotKwlkaF9hdXRvX2NvbmZpZ3VyZSAtLSBDRkxBR1M9IiQoQ0ZMQUdTKSIgTERGTEFHUz0iJChMREZMQUdTKSIgXAotKwkJLS1saWJkaXI9L2xpYi8kKERFQl9IT1NUX01VTFRJQVJDSCkKLStlbHNlCi0rCWRoX2F1dG9fY29uZmlndXJlIC1CIGJ1aWxkLWRidXMtdG9vbC8gLS0gQ0ZMQUdTPSIkKENGTEFHUykiIExERkxBR1M9IiQoTERGTEFHUykiIFwKLSsJCS0tbGliZGlyPS9saWIvJChERUJfQlVJTERfTVVMVElBUkNIKSBcCi0rCQktLWhvc3Q9JChERUJfQlVJTERfR05VX1RZUEUpCi0rCWRoX2F1dG9fYnVpbGQgLUIgYnVpbGQtZGJ1cy10b29sLyAtLXBhcmFsbGVsCi0rCWRoX2F1dG9fY29uZmlndXJlIC0tIENGTEFHUz0iJChDRkxBR1MpIiBMREZMQUdTPSIkKExERkxBR1MpIiBcCi0rCQlOSUhfREJVU19UT09MPSQoQ1VSRElSKS9idWlsZC1kYnVzLXRvb2wvbmloLWRidXMtdG9vbC9uaWgtZGJ1cy10b29sIFwKLSsJCS0tbGliZGlyPS9saWIvJChERUJfSE9TVF9NVUxUSUFSQ0gpCi0rZW5kaWYKLSsKLStvdmVycmlkZV9kaF9hdXRvX2J1aWxkOgotKwlkaF9hdXRvX2J1aWxkIC0tcGFyYWxsZWwKLSsKLStvdmVycmlkZV9kaF9hdXRvX3Rlc3Q6Ci0raWZlcSAoJChERUJfQlVJTERfR05VX1RZUEUpLCAkKERFQl9IT1NUX0dOVV9UWVBFKSkKLSsJZGhfYXV0b190ZXN0IC0tcGFyYWxsZWwKLStlbmRpZgotKwotK292ZXJyaWRlX2RoX2F1dG9faW5zdGFsbDoKLSsJZGhfYXV0b19pbnN0YWxsIC0tIHBrZ2NvbmZpZ2Rpcj1cJCR7cHJlZml4fS9saWIvJChERUJfSE9TVF9NVUxUSUFSQ0gpL3BrZ2NvbmZpZwotKwotK292ZXJyaWRlX2RoX21ha2VzaGxpYnM6Ci0rCWRoX21ha2VzaGxpYnMgLXBsaWJuaWgxIC1WICdsaWJuaWgxICg+PSAxLjAuMCknCi0rCWRoX21ha2VzaGxpYnMgLXBsaWJuaWgtZGJ1czEgLVYgJ2xpYm5paC1kYnVzMSAoPj0gMS4wLjApJwotKwlkaF9tYWtlc2hsaWJzIC1ObGlibmloMSAtTmxpYm5paC1kYnVzMQotKwotK292ZXJyaWRlX2RoX3NobGliZGVwczoKLSsJZGhfc2hsaWJkZXBzCi0rCXNlZCAtaSAncy8yXC4xNC8yLjE1LycgZGViaWFuLyouc3Vic3R2YXJzCi0rCXNlZCAtaSAncy8+PSAyLjE1KS8+PSAyLjE1fikvZycgZGViaWFuLyouc3Vic3R2YXJzCi0rCi0rCi0rIyBTeW1saW5rIC91c3Ivc2hhcmUvZG9jIGRpcmVjdG9yaWVzIHRvZ2V0aGVyCi0rb3ZlcnJpZGVfZGhfaW5zdGFsbGRvY3M6Ci0rCWRoX2luc3RhbGxkb2NzIC0tbGluay1kb2M9bGlibmloMQotKwotK292ZXJyaWRlX2RoX2NsZWFuOgotKwlybSAtcmYgYnVpbGQtZGJ1cy10b29sLwotKwlkaF9jbGVhbgotLS0tIGxpYm5paC0xLjAuMy5vcmlnL2RlYmlhbi9jb21wYXQKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2NvbXBhdAotQEAgLTAsMCArMSBAQAotKzkKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vbmloLWRidXMtdG9vbC5pbnN0YWxsCi0rKysgbGlibmloLTEuMC4zL2RlYmlhbi9uaWgtZGJ1cy10b29sLmluc3RhbGwKLUBAIC0wLDAgKzEsMiBAQAotK3Vzci9iaW4vbmloLWRidXMtdG9vbAotK3Vzci9zaGFyZS9tYW4vbWFuMS9uaWgtZGJ1cy10b29sLjEKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vY29weXJpZ2h0Ci0rKysgbGlibmloLTEuMC4zL2RlYmlhbi9jb3B5cmlnaHQKLUBAIC0wLDAgKzEsMTggQEAKLStUaGlzIGlzIHRoZSBVYnVudHUgcGFja2FnZSBvZiBsaWJuaWgsIHRoZSBOSUggVXRpbGl0eSBMaWJyYXJ5LgotKwotK0NvcHlyaWdodCDCqSAyMDA5IENhbm9uaWNhbCBMdGQuCi0rQ29weXJpZ2h0IMKpIDIwMDkgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPgotKwotK0xpY2VuY2U6Ci0rCi0rVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLStpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgYXMKLStwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSsKLStUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0rV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0rR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKwotK09uIFVidW50dSBzeXN0ZW1zLCB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLStjYW4gYmUgZm91bmQgaW4g4oCYL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvR1BMLTLigJkuCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvZGViaWFuL2xpYm5paC1kYnVzMS5wb3N0aW5zdAotKysrIGxpYm5paC0xLjAuMy9kZWJpYW4vbGlibmloLWRidXMxLnBvc3RpbnN0Ci1AQCAtMCwwICsxLDUzIEBACi0rIyEvYmluL3NoCi0rCi0rc2V0IC1lCi0rCi0raWYgWyAiJDEiID0gY29uZmlndXJlIF07IHRoZW4KLSsgICAgIyBBIGRlcGVuZGVudCBsaWJyYXJ5IG9mIFVwc3RhcnQgaGFzIGNoYW5nZWQsIHNvIHJlc3RhcnQgVXBzdGFydAotKyAgICAjIHN1Y2ggdGhhdCBpdCBjYW4gc2FmZWx5IHVubW91bnQgdGhlIHJvb3QgZmlsZXN5c3RlbSAoTFA6ICM3NDAzOTApCi0rCi0rICAgICMgUXVlcnkgcnVubmluZyB2ZXJzaW9uIG9mIFVwc3RhcnQsIGJ1dCBvbmx5IHdoZW4gd2Uga25vdwotKyAgICAjIHRoYXQgaW5pdGN0bCB3aWxsIHdvcmsuCi0rICAgICMKLSsgICAgIyBUaGUgY2FsY3VsYXRlZCB2ZXJzaW9uIHN0cmluZyBtYXkgYmUgdGhlIG51bGwgc3RyaW5nIGlmCi0rICAgICMgVXBzdGFydCBpcyBub3QgcnVubmluZyAod2hlcmUgZm9yIGV4YW1wbGUgYW4gYWx0ZXJuYXRpdmUKLSsgICAgIyBpbml0IGlzIHJ1bm5pbmcgb3V0c2lkZSBhIGNocm9vdCBlbnZpcm9ubWVudCkgb3IgaWYgdGhlCi0rICAgICMgcXVlcnkgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gSG93ZXZlciwgdGhlIHZlcnNpb24gY2hlY2sKLSsgICAgIyBiZWxvdyBoYW5kbGVzIGEgbnVsbCB2ZXJzaW9uIHN0cmluZyBjb3JyZWN0bHkuCi0rICAgIFVQU1RBUlRfVkVSU0lPTl9SVU5OSU5HPSQoaW5pdGN0bCB2ZXJzaW9uIDI+L2Rldi9udWxsIHxcCi0rICAgICAgICBhd2sgJ3twcmludCAkM30nfHRyIC1kICcpJyB8fCA6KQotKwotKyAgICBpZiBpc2Nocm9vdDsgdGhlbgotKyAgICAgICAgIyBEbyBub3QgaG9ub3VyIHJlLWV4ZWMgd2hlbiByZXF1ZXN0ZWQgZnJvbSB3aXRoaW4gYQotKyAgICAgICAgIyBjaHJvb3Qgc2luY2U6Ci0rICAgICAgICAjCi0rICAgICAgICAjIChhKSBUaGUgdmVyc2lvbiBvZiBVcHN0YXJ0IG91dHNpZGUgbWlnaHQgbm90IHN1cHBvcnQgaXQuCi0rICAgICAgICAjIChiKSBBbiBpc29sYXRlZCBlbnZpcm9ubWVudCBzdWNoIGFzIGEgY2hyb290IHNob3VsZAotKyAgICAgICAgIyAgICAgbm90IGJlIGFibGUgdG8gbW9kaWZ5IGl0cyBjb250YWluaW5nIGVudmlyb25tZW50LgotKyAgICAgICAgIwotKyAgICAgICAgIyBBIHN1ZmZpY2llbnRseSBuZXcgVXBzdGFydCB3aWxsIGFjdHVhbGx5IGhhbmRsZSBhIHJlLWV4ZWMKLSsgICAgICAgICMgcmVxdWVzdCBjb21pbmcgZnJvbSB0ZWxpbml0IHdpdGhpbiBhIGNocm9vdCBjb3JyZWN0bHkgKGJ5Ci0rICAgICAgICAjIGRvaW5nIG5vdGhpbmcpIGJ1dCBpdCdzIHNpbXBsZSBlbm91Z2ggdG8gcGVyZm9ybSB0aGUgY2hlY2sKLSsgICAgICAgICMgaGVyZSBhbmQgc2F2ZSBVcHN0YXJ0IHRoZSBlZmZvcnQuCi0rICAgICAgICA6Ci0rICAgIGVsaWYgZHBrZyAtLWNvbXBhcmUtdmVyc2lvbnMgIiRVUFNUQVJUX1ZFUlNJT05fUlVOTklORyIgZ2UgMS42LjE7IHRoZW4KLSsgICAgICAgICMgV2UgYXJlIG5vdCBydW5uaW5nIGluc2lkZSBhIGNocm9vdCBhbmQgdGhlIHJ1bm5pbmcgdmVyc2lvbgotKyAgICAgICAgIyBvZiBVcHN0YXJ0IHN1cHBvcnRzIHN0YXRlZnVsIHJlLWV4ZWMsIHNvIHdlIGNhbgotKyAgICAgICAgIyByZXN0YXJ0IGltbWVkaWF0ZWx5LgotKyAgICAgICAgIwotKyAgICAgICAgIyBYWFg6IE5vdGUgdGhhdCB0aGUgY2hlY2sgb24gdGhlIHJ1bm5pbmcgdmVyc2lvbiBtdXN0Ci0rICAgICAgICAjIHJlbWFpbiAqaW5kZWZpbml0ZWx5KiBzaW5jZSBpdCdzIHRoZSBvbmx5IHNhZmUgd2F5IHRvCi0rICAgICAgICAjIGtub3cgaWYgc3RhdGVmdWwgcmUtZXhlYyBpcyBzdXBwb3J0ZWQ6IHNpbXBseSBjaGVja2luZwotKyAgICAgICAgIyBwYWNrYWdlZCB2ZXJzaW9uIG51bWJlcnMgaXMgbm90IHN1ZmZpY2llbnQgc2luY2UKLSsgICAgICAgICMgdGhlIHBhY2thZ2UgY291bGQgYmUgdXBncmFkZWQgbXVsdGlwbGUgdGltZXMgd2l0aG91dCBhCi0rICAgICAgICAjIHJlYm9vdC4KLSsgICAgICAgIHRlbGluaXQgdSB8fCA6Ci0rICAgIGVsc2UKLSsgICAgICAgICMgQmVmb3JlIHdlIHNodXRkb3duIG9yIHJlYm9vdCwgd2UgbmVlZCB0byByZS1leGVjIHNvIHRoYXQgd2UKLSsgICAgICAgICMgY2FuIHNhZmVseSByZW1vdW50IHRoZSByb290IGZpbGVzeXN0ZW07IHdlIGNhbid0IGp1c3QgZG8gdGhhdAotKyAgICAgICAgIyBoZXJlIGJlY2F1c2Ugd2UgbG9zZSBzdGF0ZS4KLSsgICAgICAgIHRvdWNoIC92YXIvcnVuL2luaXQudXBncmFkZWQgfHwgOgotKyAgICBmaQotK2ZpCi0rCi0rI0RFQkhFTFBFUiMKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vY2hhbmdlbG9nLkRFQklBTgotKysrIGxpYm5paC0xLjAuMy9kZWJpYW4vY2hhbmdlbG9nLkRFQklBTgotQEAgLTAsMCArMSwxMTggQEAKLStsaWJuaWggKDEuMC4zLTQpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwotKwotKyAgKiBSZWJ1aWxkIGZvciBuZXcgbGliYyB0byB1cGRhdGUgdmVyc2lvbmVkIGRlcGVuZGVuY3k7IHRoaXMgY29tZXMgZnJvbQotKyAgICB0aGUgX19hYm9ydF9tc2cgZGVwZW5kZW5jeSwgZHBrZy1zaGxpYnMgbmVlZHMgb3ZlcnJpZGluZyBzaW5jZSB0aGlzIGlzCi0rICAgIGFjdHVhbGx5IGEgd2VhayBsaW5rLCBidXQgdGhpcyByZWJ1aWxkIGZpeGVzIHRoaW5ncyBmb3Igbm93LgotKyAgICBDbG9zZXM6ICM2MjUyNTcuCi0rCi0rIC0tIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4gIE1vbiwgMDIgTWF5IDIwMTEgMTU6MDg6MzMgLTA3MDAKLSsKLStsaWJuaWggKDEuMC4zLTMpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwotKwotKyAgKiBOZXcgbWFpbnRhaW5lci4gIENsb3NlczogIzYyNDQ0Mi4KLSsKLSsgLS0gU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPiAgVGh1LCAyOCBBcHIgMjAxMSAxNDoyNjowNSAtMDcwMAotKwotK2xpYm5paCAoMS4wLjMtMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIEJ1bXAgYnVpbGQgZGVwZW5kZW5jeSBvbiBsaWJkYnVzLTEtZGV2IGFuZCBkYnVzIHRvICg+PSAxLjQpIGZvciBVbml4IGZpbGUKLSsgICAgZGVzY3JpcHRvciBwYXNzaW5nIHN1cHBvcnQuCi0rCi0rIC0tIE1pY2hhZWwgQmllYmwgPGJpZWJsQGRlYmlhbi5vcmc+ICBUaHUsIDEwIEZlYiAyMDExIDIwOjI1OjE4ICswMTAwCi0rCi0rbGlibmloICgxLjAuMy0xdWJ1bnR1MSkgbmF0dHk7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIFJlYnVpbGQgd2l0aCBsaWJjNi1kZXYgKD49IDIuMTN+KS4KLSsKLSsgLS0gTWF0dGhpYXMgS2xvc2UgPGRva29AdWJ1bnR1LmNvbT4gIEZyaSwgMTggRmViIDIwMTEgMTI6MDk6MjkgKzAxMDAKLSsKLStsaWJuaWggKDEuMC4zLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwotKwotKyAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZS4KLSsgICogQnVtcCBkZWJoZWxwZXIgY29tcGF0aWJpbGl0eSBsZXZlbCB0byA4IGFuZCB1cGRhdGUgYnVpbGQgZGVwZW5kZW5jeQotKyAgICBhY2NvcmRpbmdseS4KLSsKLSsgLS0gTWljaGFlbCBCaWVibCA8YmllYmxAZGViaWFuLm9yZz4gIE1vbiwgMDcgRmViIDIwMTEgMjI6MTk6MTMgKzAxMDAKLSsKLStsaWJuaWggKDEuMC4yLTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwotKwotKyAgKiBJbnN0YWxsIGxpYnJhcnkgZGV2ZWxvcG1lbnQgZmlsZXMgdG8gL3Vzci9saWIgYW5kIG5vdCAvbGliLgotKyAgKiBSZW1vdmUgbGlidG9vbCAqLmxhIGZpbGVzIGFzIHRoZXJlIGFyZSBubyByZXZlcnNlIGRlcGVuZGVuY2llcyByZWZlcmVuY2luZwotKyAgICB0aGVtLgotKyAgKiBCdW1wIFN0YW5kYXJkcy1WZXJzaW9uIHRvIDMuOS4xLiBObyBmdXJ0aGVyIGNoYW5nZXMuCi0rCi0rIC0tIE1pY2hhZWwgQmllYmwgPGJpZWJsQGRlYmlhbi5vcmc+ICBTdW4sIDAyIEphbiAyMDExIDIxOjA5OjQwICswMTAwCi0rCi0rbGlibmloICgxLjAuMi0xdWJ1bnR1MykgbmF0dHk7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIERpc2FibGUgc29tZSB0ZXN0cyBvbiBwcGM2NCB0byBidWlsZCBhbiBpbml0aWFsIHBhY2thZ2UuCi0rCi0rIC0tIE1hdHRoaWFzIEtsb3NlIDxkb2tvQHVidW50dS5jb20+ICBUaHUsIDE4IE5vdiAyMDEwIDEwOjU5OjM4ICswMTAwCi0rCi0rbGlibmloICgxLjAuMi0xdWJ1bnR1MikgbWF2ZXJpY2s7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIFJlLWFkZCAtZlBJRSB0byB0aGUgdGVzdHN1aXRlIG9uIGFybWVsLCByZW1vdmluZyBhbGwgYXJtZWwtc3BlY2lmaWMgdGVzdHM7Ci0rICAgIGN1cnJlbnQgZ2NjLTQuNCBkb24ndCBzZWVtIGFmZmVjdGVkIGJ5IHRoZSBJQ0UgYW55bW9yZSAoc2VlIExQICMzOTg0MDMpLgotKwotKyAtLSBMb8OvYyBNaW5pZXIgPGxvaWMubWluaWVyQGxpbmFyby5vcmc+ICBNb24sIDIzIEF1ZyAyMDEwIDEwOjI1OjMxICswMjAwCi0rCi0rbGlibmloICgxLjAuMi0xdWJ1bnR1MSkgbWF2ZXJpY2s7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIFJlYnVpbGQgd2l0aCBsaWJjNi1kZXYgKD49IDIuMTJ+KSwgYWZ0ZXIgY2hlY2tpbmcgdGhhdAotKyAgICBfX2Fib3J0X21zZyBpcyBhdmFpbGFibGUgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgaW4gZWdsaWJjIDIuMTIuCi0rICAqIERvbid0IGJ1aWxkIHRoZSB0ZXN0c3VpdGUgd2l0aCAtZlBJRSBvbiBhcm1lbDsgTFA6ICMzOTg0MDMuCi0rCi0rIC0tIE1hdHRoaWFzIEtsb3NlIDxkb2tvQHVidW50dS5jb20+ICBTdW4sIDMwIE1heSAyMDEwIDAyOjU0OjU2ICswMjAwCi0rCi0rbGlibmloICgxLjAuMi0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKLSsKLSsgICogSW5pdGlhbCB1cGxvYWQgdG8gRGViaWFuLiBDbG9zZXM6ICM1ODUwNzEKLSsgICogQmFzZWQgb24gdGhlIFVidW50dSBwYWNrYWdlIGZvciBMdWNpZCBkb25lIGJ5IFNjb3R0IEphbWVzIFJlbW5hbnQgd2l0aCB0aGUKLSsgICAgZm9sbG93aW5nIGNoYW5nZXM6Ci0rICAgIC0gU3dpdGNoIHBhY2thZ2VzIHRvIHByaW9yaXR5IG9wdGlvbmFsLgotKyAgICAtIFVzZSBiaW5hcnk6VmVyc2lvbiBpbnN0ZWFkIG9mIFNvdXJjZS1WZXJzaW9uLgotKyAgICAtIEJ1bXAgU3RhbmRhcmRzLVZlcnNpb24gdG8gMy44LjQuCi0rICAgIC0gQWRkIEhvbWVwYWdlIGFuZCBWY3MtKiBmaWVsZHMuCi0rICAgIC0gRG9uJ3Qgc3ltbGluayAvdXNyL3NoYXJlL2RvYyBkaXJlY3Rvcmllcy4KLSsgICAgLSBSZWZlciB0byB2ZXJzaW9uZWQgL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvR1BMLTIgZmlsZSBpbgotKyAgICAgIGRlYmlhbi9jb3B5cmlnaHQuCi0rICAgIC0gTGlzdCBhbGwgc3ltYm9scyBleHBsaWNpdGx5IGluc3RlYWQgb2YgdXNpbmcgYSB3aWxkY2FyZCBhbmQgYWRkIHN5bWJvbHMKLSsgICAgICBpbnRyb2R1Y2VkIGluIDEuMC4xLgotKyAgICAtIFVzZSB0aGUgc3ltYm9scyBmaWxlcyB0byBjcmVhdGUgdGhlIGNvcnJlY3QgdmVyc2lvbiBpbmZvIGluc3RlYWQgb2YKLSsgICAgICBzcGVjaWZ5aW5nIGl0IG1hbnVhbGx5IHZpYSBzaGxpYnMuCi0rICAgIC0gU3dpdGNoIHRvIHNvdXJjZSBmb3JtYXQgMy4wIChxdWlsdCkuCi0rICAgIC0gQWRkIHdhdGNoIGZpbGUgdG8gdHJhY2sgbmV3IHVwc3RyZWFtIHJlbGVhc2VzLgotKwotKyAtLSBNaWNoYWVsIEJpZWJsIDxiaWVibEBkZWJpYW4ub3JnPiAgU3VuLCAxMyBKdW4gMjAxMCAyMzozNjo1MiArMDIwMAotKwotK2xpYm5paCAoMS4wLjEtMSkgbHVjaWQ7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIE5ldyB1cHN0cmVhbSByZWxlYXNlOgotKyAgICAtIEFkZCBtaXNzaW5nIF9fbmloXyogc3ltYm9scyB0byBsaW5rZXIgdmVyc2lvbiBzY3JpcHQgc28gdGhhdCB3ZQotKyAgICAgIGNhbiBsaW5rIFVwc3RhcnQncyB0ZXN0IHN1aXRlLgotKyAgICAtIEdsaWJjIF9fYWJvcnRfbXNnIHN5bWJvbCBub3cgb25seSBsaW5rZWQgYXMgYSB3ZWFrIHN5bWJvbC4KLSsKLSsgLS0gU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAdWJ1bnR1LmNvbT4gIFRodSwgMDQgRmViIDIwMTAgMTQ6NTM6MjYgLTA4MDAKLSsKLStsaWJuaWggKDEuMC4wLTJidWlsZDEpIGx1Y2lkOyB1cmdlbmN5PWxvdwotKwotKyAgKiBSZWJ1aWxkIHRvIHBpY2sgdXAgcmVsYXhlZCBkZXBlbmRlbmN5IG9uIGxpYmM2LCBhZnRlciBjaGVja2luZyB0aGF0Ci0rICAgIF9fYWJvcnRfbXNnIGlzIGF2YWlsYWJsZSB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBpbiBlZ2xpYmMgMi4xMS4KLSsgICAgTFA6ICM1MDg3MDIuCi0rCi0rIC0tIE1hdHRoaWFzIEtsb3NlIDxkb2tvQHVidW50dS5jb20+ICBNb24sIDE4IEphbiAyMDEwIDE2OjA5OjEzICswMTAwCi0rCi0rbGlibmloICgxLjAuMC0yKSBsdWNpZDsgdXJnZW5jeT1sb3cKLSsKLSsgICogZGViaWFuL2NvbnRyb2w6IEFkZCBidWlsZC1kZXBlbmRlbmN5IG9uIGRidXMgc28gdGhlIHRlc3Qgc3VpdGUgY2FuCi0rICAgIHBhc3Mgb24gdGhlIGJ1aWxkZHMuCi0rCi0rIC0tIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+ICBTYXQsIDI4IE5vdiAyMDA5IDIzOjI4OjI3ICswMDAwCi0rCi0rbGlibmloICgxLjAuMC0xKSBsdWNpZDsgdXJnZW5jeT1sb3cKLSsKLSsgICogRmlyc3QgdXBzdHJlYW0gcmVsZWFzZS4gIFByZXZpb3VzbHkgdGhpcyBjb2RlIHdhcyBpbmNsdWRlZCBpbiB0aGUKLSsgICAgdXBzdGFydCwgbW91bnRhbGwgYW5kIHVyZWFkYWhlYWQgc291cmNlIHBhY2thZ2VzLgotKwotKyAtLSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEB1YnVudHUuY29tPiAgU2F0LCAyOCBOb3YgMjAwOSAyMToxNDowMCArMDAwMAotKwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL2RlYmlhbi9saWJuaWgxLnN5bWJvbHMKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2xpYm5paDEuc3ltYm9scwotQEAgLTAsMCArMSwyIEBACi0rbGlibmloLnNvLjEgbGlibmloMSAjTUlOVkVSIwotKyAqQExJQk5JSF8xXzAgMS4wLjAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vbGlibmloLWRidXMtZGV2Lmluc3RhbGwKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2xpYm5paC1kYnVzLWRldi5pbnN0YWxsCi1AQCAtMCwwICsxLDUgQEAKLStsaWIvKi9saWJuaWgtZGJ1cy5hCi0rbGliLyovbGlibmloLWRidXMuc28KLSt1c3IvaW5jbHVkZS9saWJuaWgtZGJ1cy5oCi0rdXNyL2luY2x1ZGUvbmloLWRidXMKLSt1c3IvbGliLyovcGtnY29uZmlnL2xpYm5paC1kYnVzLnBjCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvZGViaWFuL2xpYm5paDEucG9zdGluc3QKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2xpYm5paDEucG9zdGluc3QKLUBAIC0wLDAgKzEsNTMgQEAKLSsjIS9iaW4vc2gKLSsKLStzZXQgLWUKLSsKLStpZiBbICIkMSIgPSBjb25maWd1cmUgXTsgdGhlbgotKyAgICAjIEEgZGVwZW5kZW50IGxpYnJhcnkgb2YgVXBzdGFydCBoYXMgY2hhbmdlZCwgc28gcmVzdGFydCBVcHN0YXJ0Ci0rICAgICMgc3VjaCB0aGF0IGl0IGNhbiBzYWZlbHkgdW5tb3VudCB0aGUgcm9vdCBmaWxlc3lzdGVtIChMUDogIzc0MDM5MCkKLSsKLSsgICAgIyBRdWVyeSBydW5uaW5nIHZlcnNpb24gb2YgVXBzdGFydCwgYnV0IG9ubHkgd2hlbiB3ZSBrbm93Ci0rICAgICMgdGhhdCBpbml0Y3RsIHdpbGwgd29yay4KLSsgICAgIwotKyAgICAjIFRoZSBjYWxjdWxhdGVkIHZlcnNpb24gc3RyaW5nIG1heSBiZSB0aGUgbnVsbCBzdHJpbmcgaWYKLSsgICAgIyBVcHN0YXJ0IGlzIG5vdCBydW5uaW5nICh3aGVyZSBmb3IgZXhhbXBsZSBhbiBhbHRlcm5hdGl2ZQotKyAgICAjIGluaXQgaXMgcnVubmluZyBvdXRzaWRlIGEgY2hyb290IGVudmlyb25tZW50KSBvciBpZiB0aGUKLSsgICAgIyBxdWVyeSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLiBIb3dldmVyLCB0aGUgdmVyc2lvbiBjaGVjawotKyAgICAjIGJlbG93IGhhbmRsZXMgYSBudWxsIHZlcnNpb24gc3RyaW5nIGNvcnJlY3RseS4KLSsgICAgVVBTVEFSVF9WRVJTSU9OX1JVTk5JTkc9JChpbml0Y3RsIHZlcnNpb24gMj4vZGV2L251bGwgfFwKLSsgICAgICAgIGF3ayAne3ByaW50ICQzfSd8dHIgLWQgJyknIHx8IDopCi0rCi0rICAgIGlmIGlzY2hyb290OyB0aGVuCi0rICAgICAgICAjIERvIG5vdCBob25vdXIgcmUtZXhlYyB3aGVuIHJlcXVlc3RlZCBmcm9tIHdpdGhpbiBhCi0rICAgICAgICAjIGNocm9vdCBzaW5jZToKLSsgICAgICAgICMKLSsgICAgICAgICMgKGEpIFRoZSB2ZXJzaW9uIG9mIFVwc3RhcnQgb3V0c2lkZSBtaWdodCBub3Qgc3VwcG9ydCBpdC4KLSsgICAgICAgICMgKGIpIEFuIGlzb2xhdGVkIGVudmlyb25tZW50IHN1Y2ggYXMgYSBjaHJvb3Qgc2hvdWxkCi0rICAgICAgICAjICAgICBub3QgYmUgYWJsZSB0byBtb2RpZnkgaXRzIGNvbnRhaW5pbmcgZW52aXJvbm1lbnQuCi0rICAgICAgICAjCi0rICAgICAgICAjIEEgc3VmZmljaWVudGx5IG5ldyBVcHN0YXJ0IHdpbGwgYWN0dWFsbHkgaGFuZGxlIGEgcmUtZXhlYwotKyAgICAgICAgIyByZXF1ZXN0IGNvbWluZyBmcm9tIHRlbGluaXQgd2l0aGluIGEgY2hyb290IGNvcnJlY3RseSAoYnkKLSsgICAgICAgICMgZG9pbmcgbm90aGluZykgYnV0IGl0J3Mgc2ltcGxlIGVub3VnaCB0byBwZXJmb3JtIHRoZSBjaGVjawotKyAgICAgICAgIyBoZXJlIGFuZCBzYXZlIFVwc3RhcnQgdGhlIGVmZm9ydC4KLSsgICAgICAgIDoKLSsgICAgZWxpZiBkcGtnIC0tY29tcGFyZS12ZXJzaW9ucyAiJFVQU1RBUlRfVkVSU0lPTl9SVU5OSU5HIiBnZSAxLjYuMTsgdGhlbgotKyAgICAgICAgIyBXZSBhcmUgbm90IHJ1bm5pbmcgaW5zaWRlIGEgY2hyb290IGFuZCB0aGUgcnVubmluZyB2ZXJzaW9uCi0rICAgICAgICAjIG9mIFVwc3RhcnQgc3VwcG9ydHMgc3RhdGVmdWwgcmUtZXhlYywgc28gd2UgY2FuCi0rICAgICAgICAjIHJlc3RhcnQgaW1tZWRpYXRlbHkuCi0rICAgICAgICAjCi0rICAgICAgICAjIFhYWDogTm90ZSB0aGF0IHRoZSBjaGVjayBvbiB0aGUgcnVubmluZyB2ZXJzaW9uIG11c3QKLSsgICAgICAgICMgcmVtYWluICppbmRlZmluaXRlbHkqIHNpbmNlIGl0J3MgdGhlIG9ubHkgc2FmZSB3YXkgdG8KLSsgICAgICAgICMga25vdyBpZiBzdGF0ZWZ1bCByZS1leGVjIGlzIHN1cHBvcnRlZDogc2ltcGx5IGNoZWNraW5nCi0rICAgICAgICAjIHBhY2thZ2VkIHZlcnNpb24gbnVtYmVycyBpcyBub3Qgc3VmZmljaWVudCBzaW5jZQotKyAgICAgICAgIyB0aGUgcGFja2FnZSBjb3VsZCBiZSB1cGdyYWRlZCBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGEKLSsgICAgICAgICMgcmVib290LgotKyAgICAgICAgdGVsaW5pdCB1IHx8IDoKLSsgICAgZWxzZQotKyAgICAgICAgIyBCZWZvcmUgd2Ugc2h1dGRvd24gb3IgcmVib290LCB3ZSBuZWVkIHRvIHJlLWV4ZWMgc28gdGhhdCB3ZQotKyAgICAgICAgIyBjYW4gc2FmZWx5IHJlbW91bnQgdGhlIHJvb3QgZmlsZXN5c3RlbTsgd2UgY2FuJ3QganVzdCBkbyB0aGF0Ci0rICAgICAgICAjIGhlcmUgYmVjYXVzZSB3ZSBsb3NlIHN0YXRlLgotKyAgICAgICAgdG91Y2ggL3Zhci9ydW4vaW5pdC51cGdyYWRlZCB8fCA6Ci0rICAgIGZpCi0rZmkKLSsKLSsjREVCSEVMUEVSIwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL2RlYmlhbi9saWJuaWgtZGJ1czEuc3ltYm9scwotKysrIGxpYm5paC0xLjAuMy9kZWJpYW4vbGlibmloLWRidXMxLnN5bWJvbHMKLUBAIC0wLDAgKzEsMiBAQAotK2xpYm5paC1kYnVzLnNvLjEgbGlibmloLWRidXMxICNNSU5WRVIjCi0rICpATElCTklIX0RCVVNfMV8wIDEuMC4wCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvZGViaWFuL2NoYW5nZWxvZwotKysrIGxpYm5paC0xLjAuMy9kZWJpYW4vY2hhbmdlbG9nCi1AQCAtMCwwICsxLDIxMyBAQAotK2xpYm5paCAoMS4wLjMtNHVidW50dTE2KSByYXJpbmc7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIGRlYmlhbi97bGlibmloMS5wb3N0aW5zdCxsaWJuaWgtZGJ1czEucG9zdGluc3R9OiBGb3JjZSBhbiB1cGdyYWRlIHRvCi0rICAgIHJlc3RhcnQgVXBzdGFydCAodG8gcGljayB1cCBuZXcgcGFja2FnZSB2ZXJzaW9uKSBpZiB0aGUgcnVubmluZwotKyAgICBpbnN0YW5jZSBzdXBwb3J0cyBpdC4KLSsgICogTWVyZ2Ugb2YgaW1wb3J0YW50IGZpeGVzIGZyb20gbHA6fnVwc3RhcnQtZGV2ZWwvbGlibmloL25paAotKyAgICAoTFA6ICM3NzY1MzIsIExQOiAjNzc3MDk3LCBMUDogIzgzNDgxMywgTFA6ICMxMTIzNTg4KS4KLSsKLSsgLS0gSmFtZXMgSHVudCA8amFtZXMuaHVudEB1YnVudHUuY29tPiAgVGh1LCAxNCBNYXIgMjAxMyAwOToxNDoyMiArMDAwMAotKwotK2xpYm5paCAoMS4wLjMtNHVidW50dTE1KSByYXJpbmc7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIEVuYWJsZSBjcm9zcy1idWlsZGluZywgc2FucyBhZGRpbmcgOm5hdGl2ZSBidWlsZC1kZXBlbmRlbmNpZXMuCi0rICAgIFNlZSBjb21tZW50cyBpbiBkZWJpYW4vY29udHJvbC4KLSsgICogTGludGlhbiBmaXhlcy4KLSsKLSsgLS0gRG1pdHJpanMgTGVka292cyA8ZG1pdHJpai5sZWRrb3ZAdWJ1bnR1LmNvbT4gIFR1ZSwgMDggSmFuIDIwMTMgMTU6Mzg6NTggKzAwMDAKLSsKLStsaWJuaWggKDEuMC4zLTR1YnVudHUxNCkgcmFyaW5nOyB1cmdlbmN5PWxvdwotKwotKyAgKiBVcGRhdGUgZGJ1cyBjb2RlIGdlbmVyYXRvciB0byBhbGxvdyBmb3IgZW1wdHkgbGlzdHMgZm9yIHR5cGUgJ2FzJy4KLSsgICAgVGhpcyBkcm9wcyB0aGUgIT0gTlVMTCBjaGVjayBmb3IgTlVMTCB0ZXJtaW5hdGVkIGFycmF5cyBhbmQgbW92ZXMgdGhlCi0rICAgIGl0ZXJhdGlvbiBsb29wIGluc2lkZSBhbiAnaWYnIHN0YXRlbWVudC4KLSsKLSsgLS0gU3TDqXBoYW5lIEdyYWJlciA8c3RncmFiZXJAdWJ1bnR1LmNvbT4gIFRodSwgMTMgRGVjIDIwMTIgMTA6MDA6MjcgLTA1MDAKLSsKLStsaWJuaWggKDEuMC4zLTR1YnVudHUxMykgcmFyaW5nOyB1cmdlbmN5PWxvdwotKwotKyAgWyBQZXRyIExhdXRyYmFjaCA8cGxhdXRyYmFAcmVkaGF0LmNvbT4sIERtaXRyaWpzIExlZGtvdnMgXQotKyAgKiBGYWxsYmFjayB0byBsc3RhdCwgaWYgZGlyZW50LmRfdHlwZSBpcyBub3QgYXZhaWxhYmxlIChub3QgcG9ydGFibGUpCi0rICAgIChMUDogIzY3MjY0MykgKENsb3NlczogIzY5NTYwNCkKLSsKLSsgLS0gRG1pdHJpanMgTGVka292cyA8ZG1pdHJpai5sZWRrb3ZAdWJ1bnR1LmNvbT4gIFR1ZSwgMTEgRGVjIDIwMTIgMTc6MjY6NTIgKzAwMDAKLSsKLStsaWJuaWggKDEuMC4zLTR1YnVudHUxMikgcmFyaW5nOyB1cmdlbmN5PWxvdwotKwotKyAgKiBuaWgvbG9nZ2luZy5jOiBVc2Ugb3VyIG93biBfX25paF9hYm9ydF9tc2cgcmF0aGVyIHRoYW4gdGhlIChlKWdsaWJjCi0rICAgIHByaXZhdGUgc3ltYm9sIF9fYWJvcnRfbXNnIHRvIGF2b2lkIHVwZ3JhZGUgaXNzdWVzIChMUDogIzk5NzM1OSkuCi0rICAqIG5paC90ZXN0cy90ZXN0X2xvZ2dpbmcuYzogVXBkYXRlIHRlc3RzIGZvciBfX25paF9hYm9ydF9tc2cuCi0rCi0rIC0tIEphbWVzIEh1bnQgPGphbWVzLmh1bnRAdWJ1bnR1LmNvbT4gIFRodSwgMjUgT2N0IDIwMTIgMTA6NTc6MzAgKzAxMDAKLSsKLStsaWJuaWggKDEuMC4zLTR1YnVudHUxMSkgcXVhbnRhbDsgdXJnZW5jeT1sb3cKLSsKLSsgICogQWRkaXRpb24gb2YgZGViaWFuL2xpYm5paC1kYnVzMS5wb3N0aW5zdCBhbmQKLSsgICAgZGViaWFuL2xpYm5paDEucG9zdGluc3QgdG8gZm9yY2UgVXBzdGFydCByZS1leGVjIG9uIHNodXRkb3duCi0rICAgIHRvIGF2b2lkIHVubW91bnRpbmcgZGlza3MgdW5jbGVhbmx5IChMUDogIzc0MDM5MCkuCi0rCi0rIC0tIEphbWVzIEh1bnQgPGphbWVzLmh1bnRAdWJ1bnR1LmNvbT4gIFdlZCwgMDMgT2N0IDIwMTIgMTY6NDk6NDAgKzAxMDAKLSsKLStsaWJuaWggKDEuMC4zLTR1YnVudHUxMCkgcXVhbnRhbDsgdXJnZW5jeT1sb3cKLSsKLSsgICogVXBkYXRlIGNvbmZpZy5ndWVzcyxzdWIgZm9yIGFhcmNoNjQKLSsKLSsgLS0gV29va2V5IDx3b29rZXlAd29va3dhcmUub3JnPiAgTW9uLCAwMSBPY3QgMjAxMiAxMjo1NzowNSArMDEwMAotKwotK2xpYm5paCAoMS4wLjMtNHVidW50dTkpIHByZWNpc2U7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIE1hcmsgdGhlIG5paC1kYnVzLXRvb2wgcGFja2FnZSBNdWx0aS1BcmNoOiBmb3JlaWduIHNvIGl0IGNhbiBiZSB1c2VkIGFzCi0rICAgIGEgYnVpbGQtZGVwZW5kZW5jeSBvZiB1cHN0YXJ0IHdoZW4gY3Jvc3MtYnVpbGRpbmcuCi0rCi0rIC0tIFN0ZXZlIExhbmdhc2VrIDxzdGV2ZS5sYW5nYXNla0B1YnVudHUuY29tPiAgV2VkLCAxNSBGZWIgMjAxMiAyMjo1Nzo1MCAtMDgwMAotKwotK2xpYm5paCAoMS4wLjMtNHVidW50dTgpIHByZWNpc2U7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIGxpYm5paDEgbmVlZHMgYSB2ZXJzaW9uZWQgUHJlLURlcGVuZCBvbiBsaWJjNiBpbnN0ZWFkIG9mIGp1c3QgYSBEZXBlbmQsCi0rICAgIGJlY2F1c2UgbGliYzYgaXRzZWxmIHVzZXMgcnVubGV2ZWwgZnJvbSB0aGUgdXBzdGFydCBwYWNrYWdlIGluIGl0cwotKyAgICBwcmVpbnN0LCB3aGljaCBpbiB0dXJuIHVzZXMgbGlibmloMSwgd2hpY2ggbmVlZHMgdG8gYmUgbG9hZGFibGUgKGkuZS4sCi0rICAgIGl0cyBzeW1ib2wgcmVmZXJlbmNlcyByZXNvbHZlKS4gIFdlIHRoZXJlZm9yZSBuZWVkIHRvIGVuc3VyZSB0aGF0Ci0rICAgIGxpYm5paDEncyBkZXBlbmRlbmNpZXMgYXJlIGFsd2F5cyB1bnBhY2tlZCBiZWZvcmUgbGlibmloMSBpdHNlbGYgaXMKLSsgICAgdW5wYWNrZWQuICBXaGlsZSBoYXZpbmcgc29tZXRoaW5nIGZ1cnRoZXIgdXAgdGhlIHN0YWNrIChzdWNoIGFzIHVwc3RhcnQsCi0rICAgIG9yIHNvbWV0aGluZyBvbiB0b3Agb2YgdXBzdGFydCkgYmVpbmcgbWFya2VkIEVzc2VudGlhbDogeWVzIGFuZCB3aXRoIHRoZQotKyAgICBuZWNlc3NhcnkgcHJlLWRlcGVuZHMgd291bGQgbGV0IGFwdCBoYW5kbGUgdGhpcyBmb3IgdXMgd2l0aCBpdHMKLSsgICAgImltbWVkaWF0ZSBjb25maWd1cmF0aW9uIiBzdXBwb3J0LCBidXQgZm9yIHZhcmlvdXMgcmVhc29ucyB3ZSBkb24ndCB3YW50Ci0rICAgIHRvIG1ha2UgdXBzdGFydCBlc3NlbnRpYWwuICBMUDogIzUwODA4My4KLSsKLSsgLS0gU3RldmUgTGFuZ2FzZWsgPHN0ZXZlLmxhbmdhc2VrQHVidW50dS5jb20+ICBGcmksIDEwIEZlYiAyMDEyIDEyOjEzOjI1IC0wODAwCi0rCi0rbGlibmloICgxLjAuMy00dWJ1bnR1NykgcHJlY2lzZTsgdXJnZW5jeT1sb3cKLSsKLSsgICogUmVsYXggZGVwZW5kZW5jeSBvbiBsaWJjNi4KLSsKLSsgLS0gTWF0dGhpYXMgS2xvc2UgPGRva29AdWJ1bnR1LmNvbT4gIFdlZCwgMDggRmViIDIwMTIgMjM6NDM6MjEgKzAxMDAKLSsKLStsaWJuaWggKDEuMC4zLTR1YnVudHU2KSBwcmVjaXNlOyB1cmdlbmN5PWxvdwotKwotKyAgKiBSZWJ1aWxkIHdpdGggbGliYzYtZGV2ICg+PSAyLjE1fikuCi0rCi0rIC0tIE1hdHRoaWFzIEtsb3NlIDxkb2tvQHVidW50dS5jb20+ICBXZWQsIDA4IEZlYiAyMDEyIDIxOjQ4OjU3ICswMTAwCi0rCi0rbGlibmloICgxLjAuMy00dWJ1bnR1NSkgcHJlY2lzZTsgdXJnZW5jeT1sb3cKLSsKLSsgICogTWFyayBsaWJuaWgtZGV2IGFuZCBsaWJuaWgtZGJ1cy1kZXYgTXVsdGktQXJjaDogc2FtZSBhcyB3ZWxsLgotKwotKyAtLSBTdGV2ZSBMYW5nYXNlayA8c3RldmUubGFuZ2FzZWtAdWJ1bnR1LmNvbT4gIFN1biwgMDYgTm92IDIwMTEgMTQ6NDU6MDcgLTA4MDAKLSsKLStsaWJuaWggKDEuMC4zLTR1YnVudHU0KSBwcmVjaXNlOyB1cmdlbmN5PWxvdwotKwotKyAgKiBNYWtlIGxpYm5paDEgYW5kIGxpYm5paC1kYnVzMSBpbnN0YWxsYWJsZSB1c2luZyBtdWx0aS1hcmNoLgotKwotKyAtLSBKYW1lcyBIdW50IDxqYW1lcy5odW50QHVidW50dS5jb20+ICBUdWUsIDAxIE5vdiAyMDExIDE0OjI1OjA5IC0wNDAwCi0rCi0rbGlibmloICgxLjAuMy00dWJ1bnR1MykgcHJlY2lzZTsgdXJnZW5jeT1sb3cKLSsKLSsgICogQnVpbGQgdG8gaW5zdGFsbCB3aXRoIGVnbGliYy0yLjE1LgotKwotKyAtLSBNYXR0aGlhcyBLbG9zZSA8ZG9rb0B1YnVudHUuY29tPiAgRnJpLCAxNCBPY3QgMjAxMSAxNDowNTowMyArMDIwMAotKwotK2xpYm5paCAoMS4wLjMtNHVidW50dTIpIG9uZWlyaWM7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIFVzZSBkcGtnLWJ1aWxkZmxhZ3MgdG8gZ2V0IHRoZSBidWlsZCBmbGFncy4KLSsgICogQnVpbGQgd2l0aCB0aGUgZGVmYXVsdCBidWlsZCBmbGFncywgZG9uJ3QgaGFyZC1jb2RlIC1Pcy4gTFA6ICM3OTEzMTUuCi0rCi0rIC0tIE1hdHRoaWFzIEtsb3NlIDxkb2tvQHVidW50dS5jb20+ICBXZWQsIDE1IEp1biAyMDExIDE2OjQ1OjQyICswMjAwCi0rCi0rbGlibmloICgxLjAuMy00dWJ1bnR1MSkgb25laXJpYzsgdXJnZW5jeT1sb3cKLSsKLSsgICogTWVyZ2UgZnJvbSBkZWJpYW4gdW5zdGFibGUuIFJldGFpbmVkIFVidW50dSBCdWlsZC1EZXBlbmRzIGFuZCBQcmlvcml0eS4KLSsKLSsgLS0gSmFtZXMgSHVudCA8amFtZXMuaHVudEB1YnVudHUuY29tPiAgTW9uLCAyMyBNYXkgMjAxMSAxOToyODoxOSArMDEwMAotKwotK2xpYm5paCAoMS4wLjMtMXVidW50dTEpIG5hdHR5OyB1cmdlbmN5PWxvdwotKwotKyAgKiBSZWJ1aWxkIHdpdGggbGliYzYtZGV2ICg+PSAyLjEzfikuCi0rCi0rIC0tIE1hdHRoaWFzIEtsb3NlIDxkb2tvQHVidW50dS5jb20+ICBGcmksIDE4IEZlYiAyMDExIDEyOjA5OjI5ICswMTAwCi0rCi0rbGlibmloICgxLjAuMy0xKSBuYXR0eTsgdXJnZW5jeT1sb3cKLSsKLSsgICogTmV3IHVwc3RyZWFtIHJlbGVhc2U6Ci0rICAgIC0gQWRkZWQgc3VwcG9ydCBmb3IgcGFzc2luZyBmaWxlIGRlc2NyaXB0b3JzIG92ZXIgRC1CdXMgdG8gbmloLWRidXMtdG9vbAotKwotKyAtLSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEB1YnVudHUuY29tPiAgVGh1LCAyMyBEZWMgMjAxMCAyMjoyODoyNCArMDAwMAotKwotK2xpYm5paCAoMS4wLjItMikgbmF0dHk7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIFJldmVydCB0aGUgcHJldmlvdXMgdXBsb2FkLiAgSXQgaXMgbmV2ZXIgYWNjZXB0YWJsZSB0byBzaW1wbHkgZGlzYWJsZQotKyAgICB0ZXN0cywgZXNwZWNpYWxseSB3aGVuIGl0IHR1cm5zIG91dCB0aGF0IHRoZSB0ZXN0IHRoYXQgd2FzIGRpc2FibGVkCi0rICAgIHdhcyBmYWlsaW5nIGJlY2F1c2UgdGhlcmUgd2FzIGEgc2VyaW91cyBidWcgdGhhdCBjb3VsZCBjYXVzZSBrZXJuZWwKLSsgICAgcGFuaWNzIGZvciBwZW9wbGUgb24gYm9vdC4KLSsKLSsgICAgVGVzdCBzdWl0ZXMgYXJlIGhlcmUgZm9yIGEgcmVhc29uLgotKwotKyAgKiBCdW1wZWQgbGliZGJ1cyBCdWlsZC1EZXBlbmRlbmN5IHRvIHRoZSB2ZXJzaW9uIHdpdGggdGhlIGJ1ZyBmaXggdGhhdAotKyAgICBjYXVzZWQgdGhlIHRlc3Qgc3VpdGUgdG8gZmFpbC4KLSsKLSsgLS0gU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAdWJ1bnR1LmNvbT4gIFdlZCwgMDggRGVjIDIwMTAgMTk6NDA6MTUgKzAwMDAKLSsKLStsaWJuaWggKDEuMC4yLTF1YnVudHUzKSBuYXR0eTsgdXJnZW5jeT1sb3cKLSsKLSsgICogRGlzYWJsZSBzb21lIHRlc3RzIG9uIHBwYzY0IHRvIGJ1aWxkIGFuIGluaXRpYWwgcGFja2FnZS4KLSsKLSsgLS0gTWF0dGhpYXMgS2xvc2UgPGRva29AdWJ1bnR1LmNvbT4gIFRodSwgMTggTm92IDIwMTAgMTA6NTk6MzggKzAxMDAKLSsKLStsaWJuaWggKDEuMC4yLTF1YnVudHUyKSBtYXZlcmljazsgdXJnZW5jeT1sb3cKLSsKLSsgICogUmUtYWRkIC1mUElFIHRvIHRoZSB0ZXN0c3VpdGUgb24gYXJtZWwsIHJlbW92aW5nIGFsbCBhcm1lbC1zcGVjaWZpYyB0ZXN0czsKLSsgICAgY3VycmVudCBnY2MtNC40IGRvbid0IHNlZW0gYWZmZWN0ZWQgYnkgdGhlIElDRSBhbnltb3JlIChzZWUgTFAgIzM5ODQwMykuCi0rCi0rIC0tIExvw69jIE1pbmllciA8bG9pYy5taW5pZXJAbGluYXJvLm9yZz4gIE1vbiwgMjMgQXVnIDIwMTAgMTA6MjU6MzEgKzAyMDAKLSsKLStsaWJuaWggKDEuMC4yLTF1YnVudHUxKSBtYXZlcmljazsgdXJnZW5jeT1sb3cKLSsKLSsgICogUmVidWlsZCB3aXRoIGxpYmM2LWRldiAoPj0gMi4xMn4pLCBhZnRlciBjaGVja2luZyB0aGF0Ci0rICAgIF9fYWJvcnRfbXNnIGlzIGF2YWlsYWJsZSB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBpbiBlZ2xpYmMgMi4xMi4KLSsgICogRG9uJ3QgYnVpbGQgdGhlIHRlc3RzdWl0ZSB3aXRoIC1mUElFIG9uIGFybWVsOyBMUDogIzM5ODQwMy4KLSsKLSsgLS0gTWF0dGhpYXMgS2xvc2UgPGRva29AdWJ1bnR1LmNvbT4gIFN1biwgMzAgTWF5IDIwMTAgMDI6NTQ6NTYgKzAyMDAKLSsKLStsaWJuaWggKDEuMC4yLTEpIG1hdmVyaWNrOyB1cmdlbmN5PWxvdwotKwotKyAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZToKLSsgICAgLSBSZW5hbWUgQUNfQ09QWVJJR0hUIHRvIE5JSF9DT1BZUklHSFQgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBvdGhlcgotKyAgICAgIHBhY2thZ2VzLgotKyAgICAtIEFkZCBzZXJpYWwgdG8gbGlibmloLm00Ci0rICAgIC0gQWRkIE5JSF9XSVRIX0xPQ0FMX0xJQk5JSCBtYWNyby4KLSsKLSsgICogRml4IHVzZSBvZiAke1NvdXJjZS1WZXJzaW9ufSB0byBiZSAke2JpbmFyeTpWZXJzaW9ufQotKyAgKiBBZGQgZGViaWFuL3NvdXJjZS9mb3JtYXQgd2l0aCAiMS4wIiB0byBiZSBmdXR1cmUgY29tcGF0aWJsZS4KLSsgICogQnVtcCBzdGFuZGFyZHMgdmVyc2lvbi4KLSsKLSsgLS0gU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAdWJ1bnR1LmNvbT4gIFR1ZSwgMjcgQXByIDIwMTAgMTA6NDk6NTUgLTA3MDAKLSsKLStsaWJuaWggKDEuMC4xLTEpIGx1Y2lkOyB1cmdlbmN5PWxvdwotKwotKyAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZToKLSsgICAgLSBBZGQgbWlzc2luZyBfX25paF8qIHN5bWJvbHMgdG8gbGlua2VyIHZlcnNpb24gc2NyaXB0IHNvIHRoYXQgd2UKLSsgICAgICBjYW4gbGluayBVcHN0YXJ0J3MgdGVzdCBzdWl0ZS4KLSsgICAgLSBHbGliYyBfX2Fib3J0X21zZyBzeW1ib2wgbm93IG9ubHkgbGlua2VkIGFzIGEgd2VhayBzeW1ib2wuCi0rCi0rIC0tIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+ICBUaHUsIDA0IEZlYiAyMDEwIDE0OjUzOjI2IC0wODAwCi0rCi0rbGlibmloICgxLjAuMC0yYnVpbGQxKSBsdWNpZDsgdXJnZW5jeT1sb3cKLSsKLSsgICogUmVidWlsZCB0byBwaWNrIHVwIHJlbGF4ZWQgZGVwZW5kZW5jeSBvbiBsaWJjNiwgYWZ0ZXIgY2hlY2tpbmcgdGhhdAotKyAgICBfX2Fib3J0X21zZyBpcyBhdmFpbGFibGUgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgaW4gZWdsaWJjIDIuMTEuCi0rICAgIExQOiAjNTA4NzAyLgotKwotKyAtLSBNYXR0aGlhcyBLbG9zZSA8ZG9rb0B1YnVudHUuY29tPiAgTW9uLCAxOCBKYW4gMjAxMCAxNjowOToxMyArMDEwMAotKwotK2xpYm5paCAoMS4wLjAtMikgbHVjaWQ7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIGRlYmlhbi9jb250cm9sOiBBZGQgYnVpbGQtZGVwZW5kZW5jeSBvbiBkYnVzIHNvIHRoZSB0ZXN0IHN1aXRlIGNhbgotKyAgICBwYXNzIG9uIHRoZSBidWlsZGRzLgotKwotKyAtLSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEB1YnVudHUuY29tPiAgU2F0LCAyOCBOb3YgMjAwOSAyMzoyODoyNyArMDAwMAotKwotK2xpYm5paCAoMS4wLjAtMSkgbHVjaWQ7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIEZpcnN0IHVwc3RyZWFtIHJlbGVhc2UuICBQcmV2aW91c2x5IHRoaXMgY29kZSB3YXMgaW5jbHVkZWQgaW4gdGhlCi0rICAgIHVwc3RhcnQsIG1vdW50YWxsIGFuZCB1cmVhZGFoZWFkIHNvdXJjZSBwYWNrYWdlcy4KLSsKLSsgLS0gU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAdWJ1bnR1LmNvbT4gIFNhdCwgMjggTm92IDIwMDkgMjE6MTQ6MDAgKzAwMDAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vc291cmNlL2Zvcm1hdAotKysrIGxpYm5paC0xLjAuMy9kZWJpYW4vc291cmNlL2Zvcm1hdAotQEAgLTAsMCArMSBAQAotKzEuMAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzL2RidXNfcHJveHkuaAotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy9kYnVzX3Byb3h5LmgKLUBAIC0xNDYsMTQgKzE0NiwxNCBAQAotIAkJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnBhdGgsCi0gCQkJCQkgICAgTmloREJ1c0xvc3RIYW5kbGVyIGxvc3RfaGFuZGxlciwKLSAJCQkJCSAgICB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5paERCdXNQcm94eVNpZ25hbCAqbmloX2RidXNfcHJveHlfY29ubmVjdCAoTmloREJ1c1Byb3h5ICpwcm94eSwKLSAJCQkJCSAgICBjb25zdCBOaWhEQnVzSW50ZXJmYWNlICppbnRlcmZhY2UsCi0gCQkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKLSAJCQkJCSAgICBOaWhEQnVzU2lnbmFsSGFuZGxlciBoYW5kbGVyLAotIAkJCQkJICAgIHZvaWQgKmRhdGEpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy9kYnVzX29iamVjdC5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzL2RidXNfb2JqZWN0LmgKLUBAIC02MSw4ICs2MSw3IEBACi0gCQkJCSAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKLSAJCQkJICAgIGNvbnN0IGNoYXIgKnBhdGgsCi0gCQkJCSAgICBjb25zdCBOaWhEQnVzSW50ZXJmYWNlICoqaW50ZXJmYWNlcywKLS0JCQkJICAgIHZvaWQgKmRhdGEpCi0tCV9fYXR0cmlidXRlX18gKChtYWxsb2MpKTsKLSsJCQkJICAgIHZvaWQgKmRhdGEpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMvZGJ1c191dGlsLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMvZGJ1c191dGlsLmgKLUBAIC0yNiw3ICsyNiw3IEBACi0gTklIX0JFR0lOX0VYVEVSTgotIAotIGNoYXIgKm5paF9kYnVzX3BhdGggKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcm9vdCwgLi4uKQotLQlfX2F0dHJpYnV0ZV9fICgoc2VudGluZWwsIHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKChzZW50aW5lbCwgd2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy9kYnVzX3BlbmRpbmdfZGF0YS5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzL2RidXNfcGVuZGluZ19kYXRhLmgKLUBAIC0xMDQsNyArMTA0LDcgQEAKLSAJCQkJCSAgICAgICBOaWhEQnVzUmVwbHlIYW5kbGVyIGhhbmRsZXIsCi0gCQkJCQkgICAgICAgTmloREJ1c0Vycm9ySGFuZGxlciBlcnJvcl9oYW5kbGVyLAotIAkJCQkJICAgICAgIHZvaWQgKmRhdGEpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy9kYnVzX3Byb3h5LmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMvZGJ1c19wcm94eS5jCi1AQCAtNDYsMTEgKzQ2LDExIEBACi0gCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBzdGF0aWMgY2hhciAqbmloX2RidXNfcHJveHlfbmFtZV9ydWxlICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCSAgICAgICBOaWhEQnVzUHJveHkgKnByb3h5KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIHN0YXRpYyBpbnQgICBuaWhfZGJ1c19wcm94eV9zaWduYWxfZGVzdHJveSAgICAoTmloREJ1c1Byb3h5U2lnbmFsICpwcm94aWVkKTsKLSBzdGF0aWMgY2hhciAqbmloX2RidXNfcHJveHlfc2lnbmFsX3J1bGUgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCSAgICAgICBOaWhEQnVzUHJveHlTaWduYWwgKnByb3hpZWQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gLyogUHJvdG90eXBlcyBmb3IgaGFuZGxlciBmdW5jdGlvbnMgKi8KLSBzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQgbmloX2RidXNfcHJveHlfbmFtZV9vd25lcl9jaGFuZ2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL3N5bWJvbC5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvc3ltYm9sLmMKLUBAIC00MCwxMCArNDAsMTAgQEAKLSAvKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zICovCi0gc3RhdGljIGNoYXIgKnN5bWJvbF9zdHJjYXRfaW50ZXJmYWNlIChjaGFyICoqc3RyLCBjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCSAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpLCB3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpLCB3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBzdGF0aWMgY2hhciAqc3ltYm9sX3N0cmNhdF90aXRsZSAgICAgKGNoYXIgKipzdHIsIGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0tCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCksIHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCksIHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIAotIC8qKgotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvZGVtYXJzaGFsLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9kZW1hcnNoYWwuaAotQEAgLTM3LDcgKzM3LDcgQEAKLSAJCSBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmludGVyZmFjZV9zeW1ib2wsCi0gCQkgY29uc3QgY2hhciAqbWVtYmVyX3N5bWJvbCwgY29uc3QgY2hhciAqc3ltYm9sLAotIAkJIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL3N5bWJvbC5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvc3ltYm9sLmgKLUBAIC0yOCwyMiArMjgsMjIgQEAKLSBpbnQgICBzeW1ib2xfdmFsaWQgICAgIChjb25zdCBjaGFyICpzeW1ib2wpOwotIAotIGNoYXIgKnN5bWJvbF9mcm9tX25hbWUgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICpzeW1ib2xfaW1wbCAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQljb25zdCBjaGFyICppbnRlcmZhY2VfbmFtZSwgY29uc3QgY2hhciAqbmFtZSwKLSAJCQljb25zdCBjaGFyICpwb3N0Zml4KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKnN5bWJvbF9leHRlcm4gICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCWNvbnN0IGNoYXIgKmludGVyZmFjZV9zeW1ib2wsIGNvbnN0IGNoYXIgKm1pZGZpeCwKLSAJCQljb25zdCBjaGFyICpzeW1ib2wsIGNvbnN0IGNoYXIgKnBvc3RmaXgpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqc3ltYm9sX3R5cGVkZWYgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJY29uc3QgY2hhciAqaW50ZXJmYWNlX3N5bWJvbCwgY29uc3QgY2hhciAqbWlkZml4LAotIAkJCWNvbnN0IGNoYXIgKnN5bWJvbCwgY29uc3QgY2hhciAqcG9zdGZpeCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOSUhfRU5EX0VYVEVSTgotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvb3V0cHV0LmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9vdXRwdXQuaAotQEAgLTM1LDkgKzM1LDkgQEAKLSAJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKm91dHB1dF9wcmVhbWJsZSAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpwYXRoKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKm91dHB1dF9zZW50aW5lbCAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpwYXRoKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC9wYXJzZS5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvcGFyc2UuaAotQEAgLTk1LDcgKzk1LDcgQEAKLSAKLSBQYXJzZVN0YWNrICpwYXJzZV9zdGFja19wdXNoIChjb25zdCB2b2lkICpwYXJlbnQsIE5paExpc3QgKnN0YWNrLAotIAkJCSAgICAgIFBhcnNlU3RhY2tUeXBlIHR5cGUsIHZvaWQgKmRhdGEpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gUGFyc2VTdGFjayAqcGFyc2Vfc3RhY2tfdG9wICAoTmloTGlzdCAqc3RhY2spOwotIAotIHZvaWQgICAgICAgIHBhcnNlX3N0YXJ0X3RhZyAgKFhNTF9QYXJzZXIgeG1scCwgY29uc3QgY2hhciAqdGFnLAotQEAgLTEwMyw3ICsxMDMsNyBAQAotIHZvaWQgICAgICAgIHBhcnNlX2VuZF90YWcgICAgKFhNTF9QYXJzZXIgeG1scCwgY29uc3QgY2hhciAqdGFnKTsKLSAKLSBOb2RlICogICAgICBwYXJzZV94bWwgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGludCBmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL3R5cGUuaAotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL3R5cGUuaAotQEAgLTk0LDQzICs5NCw0MyBAQAotIAotIGNoYXIgKiAgICAgIHR5cGVfb2YgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqIHBhcmVudCwKLSAJCQkJICAgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gVHlwZVZhciAqICAgdHlwZV92YXJfbmV3ICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnR5cGUsCi0gCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgICAgdHlwZV92YXJfdG9fc3RyaW5nICAgIChjb25zdCB2b2lkICpwYXJlbnQsIFR5cGVWYXIgKnZhcikKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogICAgICB0eXBlX3Zhcl9sYXlvdXQgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgTmloTGlzdCAqdmFycykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBUeXBlRnVuYyAqICB0eXBlX2Z1bmNfbmV3ICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqdHlwZSwKLSAJCQkJICAgY29uc3QgY2hhciAqbmFtZSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogICAgICB0eXBlX2Z1bmNfdG9fc3RyaW5nICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgVHlwZUZ1bmMgKmZ1bmMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgICAgdHlwZV9mdW5jX3RvX3R5cGVkZWYgIChjb25zdCB2b2lkICpwYXJlbnQsIFR5cGVGdW5jICpmdW5jKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKiAgICAgIHR5cGVfZnVuY19sYXlvdXQgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBOaWhMaXN0ICpmdW5jcykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBUeXBlU3RydWN0ICp0eXBlX3N0cnVjdF9uZXcgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogICAgICB0eXBlX3N0cnVjdF90b19zdHJpbmcgKGNvbnN0IHZvaWQgKnBhcmVudCwgVHlwZVN0cnVjdCAqc3RydWN0dXJlKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiAgICAgIHR5cGVfdG9fY29uc3QgICAgICAgICAoY2hhciAqKnR5cGUsIGNvbnN0IHZvaWQgKnBhcmVudCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogICAgICB0eXBlX3RvX3BvaW50ZXIgICAgICAgKGNoYXIgKip0eXBlLCBjb25zdCB2b2lkICpwYXJlbnQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgICAgdHlwZV90b19zdGF0aWMgICAgICAgIChjaGFyICoqdHlwZSwgY29uc3Qgdm9pZCAqcGFyZW50KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKiAgICAgIHR5cGVfdG9fZXh0ZXJuICAgICAgICAoY2hhciAqKnR5cGUsIGNvbnN0IHZvaWQgKnBhcmVudCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgICB0eXBlX3N0cmNhdF9hc3NlcnQgICAgKGNoYXIgKipibG9jaywgY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkgICBUeXBlVmFyICp2YXIsIFR5cGVWYXIgKnByZXYsIFR5cGVWYXIgKm5leHQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL2FyZ3VtZW50LmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9hcmd1bWVudC5oCi1AQCAtNjEsNyArNjEsNyBAQAotIAotIEFyZ3VtZW50ICphcmd1bWVudF9uZXcgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsCi0gCQkJICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIE5paERCdXNBcmdEaXIgZGlyZWN0aW9uKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGludCAgICAgICBhcmd1bWVudF9zdGFydF90YWcgIChYTUxfUGFyc2VyIHhtbHAsIGNvbnN0IGNoYXIgKnRhZywKLSAJCQkgICAgICAgY2hhciAqIGNvbnN0ICphdHRyKQotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvaW5kZW50LmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9pbmRlbnQuaAotQEAgLTI2LDkgKzI2LDkgQEAKLSBOSUhfQkVHSU5fRVhURVJOCi0gCi0gY2hhciAqaW5kZW50ICAoY2hhciAqKnN0ciwgY29uc3Qgdm9pZCAqcGFyZW50LCBpbnQgbGV2ZWwpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqY29tbWVudCAoY2hhciAqKnN0ciwgY29uc3Qgdm9pZCAqcGFyZW50KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC9tYWluLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9tYWluLmMKLUBAIC01MiwxMCArNTIsMTAgQEAKLSAvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KLSBjaGFyICpzb3VyY2VfZmlsZV9wYXRoIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKm91dHB1dF9wYXRoLAotIAkJCWNvbnN0IGNoYXIgKmZpbGVuYW1lKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKmhlYWRlcl9maWxlX3BhdGggKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqb3V0cHV0X3BhdGgsCi0gCQkJY29uc3QgY2hhciAqZmlsZW5hbWUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gCi0gLyoqCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC9zaWduYWwuaAotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL3NpZ25hbC5oCi1AQCAtNTgsNyArNTgsNyBAQAotIGludCAgICAgICBzaWduYWxfbmFtZV92YWxpZCAgICAgIChjb25zdCBjaGFyICpuYW1lKTsKLSAKLSBTaWduYWwgKiAgc2lnbmFsX25ldyAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGludCAgICAgICBzaWduYWxfc3RhcnRfdGFnICAgICAgIChYTUxfUGFyc2VyIHhtbHAsIGNvbnN0IGNoYXIgKnRhZywKLSAJCQkJICBjaGFyICogY29uc3QgKmF0dHIpCi1AQCAtNzYsMTggKzc2LDE4IEBACi0gY2hhciAqICAgIHNpZ25hbF9vYmplY3RfZnVuY3Rpb24gKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkgIEludGVyZmFjZSAqaW50ZXJmYWNlLCBTaWduYWwgKnNpZ25hbCwKLSAJCQkJICBOaWhMaXN0ICpwcm90b3R5cGVzLCBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiAgICBzaWduYWxfcHJveHlfZnVuY3Rpb24gIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJICBJbnRlcmZhY2UgKmludGVyZmFjZSwgU2lnbmFsICpzaWduYWwsCi0gCQkJCSAgTmloTGlzdCAqcHJvdG90eXBlcywgTmloTGlzdCAqdHlwZWRlZnMsCi0gCQkJCSAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgc2lnbmFsX2FyZ3NfYXJyYXkgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJCSAgSW50ZXJmYWNlICppbnRlcmZhY2UsIFNpZ25hbCAqc2lnbmFsLAotIAkJCQkgIE5paExpc3QgKnByb3RvdHlwZXMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL21hcnNoYWwuYwotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL21hcnNoYWwuYwotQEAgLTQ5LDcgKzQ5LDcgQEAKLSAJCQkgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqaW50ZXJmYWNlX3N5bWJvbCwKLSAJCQkgICAgIGNvbnN0IGNoYXIgKm1lbWJlcl9zeW1ib2wsIGNvbnN0IGNoYXIgKnN5bWJvbCwKLSAJCQkgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gc3RhdGljIGNoYXIgKm1hcnNoYWxfYXJyYXkgIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJICAgICBEQnVzU2lnbmF0dXJlSXRlciAqaXRlciwKLSAJCQkgICAgIGNvbnN0IGNoYXIgKml0ZXJfbmFtZSwgY29uc3QgY2hhciAqbmFtZSwKLUBAIC01OCw3ICs1OCw3IEBACi0gCQkJICAgICBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmludGVyZmFjZV9zeW1ib2wsCi0gCQkJICAgICBjb25zdCBjaGFyICptZW1iZXJfc3ltYm9sLCBjb25zdCBjaGFyICpzeW1ib2wsCi0gCQkJICAgICBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIHN0YXRpYyBjaGFyICptYXJzaGFsX3N0cnVjdCAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCSAgICAgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIsCi0gCQkJICAgICBjb25zdCBjaGFyICppdGVyX25hbWUsIGNvbnN0IGNoYXIgKm5hbWUsCi1AQCAtNjcsNyArNjcsNyBAQAotIAkJCSAgICAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICppbnRlcmZhY2Vfc3ltYm9sLAotIAkJCSAgICAgY29uc3QgY2hhciAqbWVtYmVyX3N5bWJvbCwgY29uc3QgY2hhciAqc3ltYm9sLAotIAkJCSAgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSAKLSAvKioKLUBAIC0zNjQsNiArMzY0LDcgQEAKLSAJbmloX2xvY2FsIFR5cGVWYXIgKmVsZW1lbnRfbGVuX3ZhciA9IE5VTEw7Ci0gCW5paF9sb2NhbCBjaGFyICogICBibG9jayA9IE5VTEw7Ci0gCW5paF9sb2NhbCBjaGFyICogICB2YXJzX2Jsb2NrID0gTlVMTDsKLSsJbmloX2xvY2FsIGNoYXIgKiAgIGxvb3BfYmxvY2sgPSBOVUxMOwotIAotIAluaWhfYXNzZXJ0IChpdGVyICE9IE5VTEwpOwotIAluaWhfYXNzZXJ0IChpdGVyX25hbWUgIT0gTlVMTCk7Ci1AQCAtNDQ4LDcgKzQ0OSw3IEBACi0gCW5paF9saXN0X2FkZCAobG9jYWxzLCAmYXJyYXlfaXRlcl92YXItPmVudHJ5KTsKLSAKLSAJaWYgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbWVudF90eXBlKSkgewotLQkJaWYgKCEgbmloX3N0cmNhdF9zcHJpbnRmICgmY29kZSwgcGFyZW50LAotKwkJaWYgKCEgbmloX3N0cmNhdF9zcHJpbnRmICgmbG9vcF9ibG9jaywgcGFyZW50LAotIAkJCQkJICAiZm9yIChzaXplX3QgJXMgPSAwOyAlcyA8ICVzOyAlcysrKSB7XG4iLAotIAkJCQkJICBsb29wX25hbWUsIGxvb3BfbmFtZSwgbGVuX25hbWUsIGxvb3BfbmFtZSkpIHsKLSAJCQluaWhfZnJlZSAoY29kZSk7Ci1AQCAtNDU2LDYgKzQ1NywxMiBAQAotIAkJfQotIAl9IGVsc2UgewotIAkJaWYgKCEgbmloX3N0cmNhdF9zcHJpbnRmICgmY29kZSwgcGFyZW50LAotKwkJCQkJICAiaWYgKCVzKSB7XG4iLAotKwkJCQkJICBuYW1lKSkgewotKwkJCW5paF9mcmVlIChjb2RlKTsKLSsJCQlyZXR1cm4gTlVMTDsKLSsJCX0KLSsJCWlmICghIG5paF9zdHJjYXRfc3ByaW50ZiAoJmxvb3BfYmxvY2ssIHBhcmVudCwKLSAJCQkJCSAgImZvciAoc2l6ZV90ICVzID0gMDsgJXNbJXNdOyAlcysrKSB7XG4iLAotIAkJCQkJICBsb29wX25hbWUsIG5hbWUsIGxvb3BfbmFtZSwgbG9vcF9uYW1lKSkgewotIAkJCW5paF9mcmVlIChjb2RlKTsKLUBAIC01NzYsNyArNTgzLDcgQEAKLSAJfQotIAotIAotLQlpZiAoISBuaWhfc3RyY2F0X3NwcmludGYgKCZjb2RlLCBwYXJlbnQsCi0rCWlmICghIG5paF9zdHJjYXRfc3ByaW50ZiAoJmxvb3BfYmxvY2ssIHBhcmVudCwKLSAJCQkgICAiJXMiCi0gCQkJICAgIlxuIgotIAkJCSAgICIlcyIKLUBAIC01OTAsOSArNTk3LDM0IEBACi0gCX0KLSAKLSAJLyogQ2xvc2UgdGhlIGNvbnRhaW5lciBhZ2FpbiAqLwotKwlpZiAoISBuaWhfc3RyY2F0X3NwcmludGYgKCZsb29wX2Jsb2NrLCBwYXJlbnQsCi0rCQkJCSAgIn1cbiIpKSB7Ci0rCQluaWhfZnJlZSAoY29kZSk7Ci0rCQlyZXR1cm4gTlVMTDsKLSsJfQotKwotKwlpZiAoZGJ1c190eXBlX2lzX2ZpeGVkIChlbGVtZW50X3R5cGUpKSB7Ci0rCQlpZiAoISBuaWhfc3RyY2F0X3NwcmludGYgKCZjb2RlLCBwYXJlbnQsCi0rCQkJCSAiJXNcbiIsIGxvb3BfYmxvY2spKSB7Ci0rCQkJbmloX2ZyZWUgKGNvZGUpOwotKwkJCXJldHVybiBOVUxMOwotKwkJfQotKwl9Ci0rCWVsc2UgewotKwkJaWYgKCEgaW5kZW50ICgmbG9vcF9ibG9jaywgTlVMTCwgMSkpIHsKLSsJCQluaWhfZnJlZSAoY29kZSk7Ci0rCQkJcmV0dXJuIE5VTEw7Ci0rCQl9Ci0rCi0rCQlpZiAoISBuaWhfc3RyY2F0X3NwcmludGYgKCZjb2RlLCBwYXJlbnQsCi0rCQkJCSAiJXMiCi0rCQkJCSAifVxuXG4iLCBsb29wX2Jsb2NrKSkgewotKwkJCW5paF9mcmVlIChjb2RlKTsKLSsJCQlyZXR1cm4gTlVMTDsKLSsJCX0KLSsJfQotKwotIAlpZiAoISBuaWhfc3RyY2F0X3NwcmludGYgKCZjb2RlLCBwYXJlbnQsCi0tCQkJCSAgIn1cbiIKLS0JCQkJICAiXG4iCi0gCQkJCSAgImlmICghIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJiVzLCAmJXMpKSB7XG4iCi0gCQkJCSAgIiVzIgotIAkJCQkgICJ9XG4iLAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvZGVtYXJzaGFsLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9kZW1hcnNoYWwuYwotQEAgLTUxLDcgKzUxLDcgQEAKLSAJCQkgICAgICAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICppbnRlcmZhY2Vfc3ltYm9sLAotIAkJCSAgICAgICBjb25zdCBjaGFyICptZW1iZXJfc3ltYm9sLCBjb25zdCBjaGFyICpzeW1ib2wsCi0gCQkJICAgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gc3RhdGljIGNoYXIgKmRlbWFyc2hhbF9hcnJheSAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkgICAgICAgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIsCi0gCQkJICAgICAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLAotQEAgLTYyLDcgKzYyLDcgQEAKLSAJCQkgICAgICAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICppbnRlcmZhY2Vfc3ltYm9sLAotIAkJCSAgICAgICBjb25zdCBjaGFyICptZW1iZXJfc3ltYm9sLCBjb25zdCBjaGFyICpzeW1ib2wsCi0gCQkJICAgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gc3RhdGljIGNoYXIgKmRlbWFyc2hhbF9zdHJ1Y3QgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkgICAgICAgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIsCi0gCQkJICAgICAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLAotQEAgLTczLDcgKzczLDcgQEAKLSAJCQkgICAgICAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICppbnRlcmZhY2Vfc3ltYm9sLAotIAkJCSAgICAgICBjb25zdCBjaGFyICptZW1iZXJfc3ltYm9sLCBjb25zdCBjaGFyICpzeW1ib2wsCi0gCQkJICAgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gCi0gLyoqCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC9pbnRlcmZhY2UuaAotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL2ludGVyZmFjZS5oCi1AQCAtNjEsNyArNjEsNyBAQAotIAotIEludGVyZmFjZSAqaW50ZXJmYWNlX25ldyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gaW50ICAgICAgICBpbnRlcmZhY2Vfc3RhcnRfdGFnICAgICAgICAgICAgICAgICAgICAgKFhNTF9QYXJzZXIgeG1scCwKLSAJCQkJCQkgICAgY29uc3QgY2hhciAqdGFnLAotQEAgLTgxLDI2ICs4MSwyNiBAQAotIAkJCQkJCSAgICBJbnRlcmZhY2UgKmludGVyZmFjZSwKLSAJCQkJCQkgICAgaW50IHdpdGhfaGFuZGxlcnMsCi0gCQkJCQkJICAgIE5paExpc3QgKnByb3RvdHlwZXMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgICBpbnRlcmZhY2Vfc2lnbmFsc19hcnJheSAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCQkgICAgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkJCSAgICBJbnRlcmZhY2UgKmludGVyZmFjZSwKLSAJCQkJCQkgICAgaW50IHdpdGhfZmlsdGVycywKLSAJCQkJCQkgICAgTmloTGlzdCAqcHJvdG90eXBlcykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogICAgIGludGVyZmFjZV9wcm9wZXJ0aWVzX2FycmF5ICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkJCSAgICBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJCQkJICAgIEludGVyZmFjZSAqaW50ZXJmYWNlLAotIAkJCQkJCSAgICBpbnQgd2l0aF9oYW5kbGVycywKLSAJCQkJCQkgICAgTmloTGlzdCAqcHJvdG90eXBlcykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgIGludGVyZmFjZV9zdHJ1Y3QgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkJCSAgICBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJCQkJICAgIEludGVyZmFjZSAqaW50ZXJmYWNlLAotIAkJCQkJCSAgICBpbnQgb2JqZWN0LAotIAkJCQkJCSAgICBOaWhMaXN0ICpwcm90b3R5cGVzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIAotIGNoYXIgKiAgICAgaW50ZXJmYWNlX3Byb3h5X2dldF9hbGxfZnVuY3Rpb24gICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsCi1AQCAtMTA4LDcgKzEwOCw3IEBACi0gCQkJCQkJICAgIEludGVyZmFjZSAqaW50ZXJmYWNlLAotIAkJCQkJCSAgICBOaWhMaXN0ICpwcm90b3R5cGVzLAotIAkJCQkJCSAgICBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiAgICAgaW50ZXJmYWNlX3Byb3h5X2dldF9hbGxfbm90aWZ5X2Z1bmN0aW9uIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCQkJICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKLUBAIC0xMTYsMTQgKzExNiwxNCBAQAotIAkJCQkJCSAgICBOaWhMaXN0ICpwcm90b3R5cGVzLAotIAkJCQkJCSAgICBOaWhMaXN0ICp0eXBlZGVmcywKLSAJCQkJCQkgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgIGludGVyZmFjZV9wcm94eV9nZXRfYWxsX3N5bmNfZnVuY3Rpb24gICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkJCSAgICBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJCQkJICAgIEludGVyZmFjZSAqaW50ZXJmYWNlLAotIAkJCQkJCSAgICBOaWhMaXN0ICpwcm90b3R5cGVzLAotIAkJCQkJCSAgICBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC9tZXRob2QuaAotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL21ldGhvZC5oCi1AQCAtNjIsNyArNjIsNyBAQAotIGludCAgICAgICBtZXRob2RfbmFtZV92YWxpZCAgICAgICAgICAgIChjb25zdCBjaGFyICpuYW1lKTsKLSAKLSBNZXRob2QgKiAgbWV0aG9kX25ldyAgICAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGludCAgICAgICBtZXRob2Rfc3RhcnRfdGFnICAgICAgICAgICAgIChYTUxfUGFyc2VyIHhtbHAsIGNvbnN0IGNoYXIgKnRhZywKLSAJCQkJCWNoYXIgKiBjb25zdCAqYXR0cikKLUBAIC04MiwzMyArODIsMzMgQEAKLSAJCQkJCUludGVyZmFjZSAqaW50ZXJmYWNlLCBNZXRob2QgKm1ldGhvZCwKLSAJCQkJCU5paExpc3QgKnByb3RvdHlwZXMsIE5paExpc3QgKmhhbmRsZXJzLAotIAkJCQkJTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgbWV0aG9kX3JlcGx5X2Z1bmN0aW9uICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJCQlJbnRlcmZhY2UgKmludGVyZmFjZSwgTWV0aG9kICptZXRob2QsCi0gCQkJCQlOaWhMaXN0ICpwcm90b3R5cGVzLCBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiAgICBtZXRob2RfcHJveHlfZnVuY3Rpb24gICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJCUludGVyZmFjZSAqaW50ZXJmYWNlLCBNZXRob2QgKm1ldGhvZCwKLSAJCQkJCU5paExpc3QgKnByb3RvdHlwZXMsIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgIG1ldGhvZF9wcm94eV9ub3RpZnlfZnVuY3Rpb24gKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkJSW50ZXJmYWNlICppbnRlcmZhY2UsIE1ldGhvZCAqbWV0aG9kLAotIAkJCQkJTmloTGlzdCAqcHJvdG90eXBlcywgTmloTGlzdCAqdHlwZWRlZnMsCi0gCQkJCQlOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiAgICBtZXRob2RfcHJveHlfc3luY19mdW5jdGlvbiAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJCUludGVyZmFjZSAqaW50ZXJmYWNlLCBNZXRob2QgKm1ldGhvZCwKLSAJCQkJCU5paExpc3QgKnByb3RvdHlwZXMsIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgIG1ldGhvZF9hcmdzX2FycmF5ICAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkJSW50ZXJmYWNlICppbnRlcmZhY2UsIE1ldGhvZCAqbWV0aG9kLAotIAkJCQkJTmloTGlzdCAqcHJvdG90eXBlcykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOSUhfRU5EX0VYVEVSTgotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvbm9kZS5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvbm9kZS5oCi1AQCAtNDcsNyArNDcsNyBAQAotIGludCAgICAgICAgbm9kZV9wYXRoX3ZhbGlkICAgICAgIChjb25zdCBjaGFyICpuYW1lKTsKLSAKLSBOb2RlICogICAgIG5vZGVfbmV3ICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpwYXRoKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGludCAgICAgICAgbm9kZV9zdGFydF90YWcgICAgICAgIChYTUxfUGFyc2VyIHhtbHAsIGNvbnN0IGNoYXIgKnRhZywKLSAJCQkJICBjaGFyICogY29uc3QgKmF0dHIpCi1AQCAtNTksMTggKzU5LDE4IEBACi0gCi0gY2hhciAqICAgICBub2RlX2ludGVyZmFjZXNfYXJyYXkgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkgIE5vZGUgKm5vZGUsIGludCBvYmplY3QsIE5paExpc3QgKnByb3RvdHlwZXMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgICBub2RlX29iamVjdF9mdW5jdGlvbnMgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkgIE5vZGUgKm5vZGUsCi0gCQkJCSAgTmloTGlzdCAqcHJvdG90eXBlcywgTmloTGlzdCAqaGFuZGxlcnMsCi0gCQkJCSAgTmloTGlzdCAqc3RydWN0cywgTmloTGlzdCAqZXh0ZXJucykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogICAgIG5vZGVfcHJveHlfZnVuY3Rpb25zICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJCSAgTm9kZSAqbm9kZSwKLSAJCQkJICBOaWhMaXN0ICpwcm90b3R5cGVzLCBOaWhMaXN0ICpzdHJ1Y3RzLAotIAkJCQkgIE5paExpc3QgKnR5cGVkZWZzLCBOaWhMaXN0ICpleHRlcm5zKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC9tYXJzaGFsLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9tYXJzaGFsLmgKLUBAIC0zNSw3ICszNSw3IEBACi0gCSAgICAgICBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmludGVyZmFjZV9zeW1ib2wsCi0gCSAgICAgICBjb25zdCBjaGFyICptZW1iZXJfc3ltYm9sLCBjb25zdCBjaGFyICpzeW1ib2wsCi0gCSAgICAgICBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC90eXBlLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC90eXBlLmMKLUBAIC0xMTAxLDcgKzExMDEsNyBAQAotIAluaWhfYXNzZXJ0IChibG9jayAhPSBOVUxMKTsKLSAJbmloX2Fzc2VydCAodmFyICE9IE5VTEwpOwotIAotLQlpZiAoISBzdHJjaHIgKHZhci0+dHlwZSwgJyonKSkKLSsJaWYgKCEgc3RyY2hyICh2YXItPnR5cGUsICcqJykgfHwgISBzdHJjbXAgKHZhci0+dHlwZSwgImNoYXIgKiBjb25zdCAqIikpCi0gCQlyZXR1cm4gKmJsb2NrOwotIAotIAlpZiAobmV4dCAmJiAoISBzdHJjbXAgKG5leHQtPnR5cGUsICJzaXplX3QiKSkpIHsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL3Byb3BlcnR5LmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9wcm9wZXJ0eS5oCi1AQCAtNjUsNyArNjUsNyBAQAotIAkJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKnR5cGUsCi0gCQkJCQkgICAgICBOaWhEQnVzQWNjZXNzIGFjY2VzcykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBpbnQgICAgICAgcHJvcGVydHlfc3RhcnRfdGFnICAgICAgICAgICAgICAgICAoWE1MX1BhcnNlciB4bWxwLCBjb25zdCBjaGFyICp0YWcsCi0gCQkJCQkgICAgICBjaGFyICogY29uc3QgKmF0dHIpCi1AQCAtODgsNyArODgsNyBAQAotIAkJCQkJICAgICAgTmloTGlzdCAqcHJvdG90eXBlcywKLSAJCQkJCSAgICAgIE5paExpc3QgKmhhbmRsZXJzLAotIAkJCQkJICAgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogICAgcHJvcGVydHlfb2JqZWN0X3NldF9mdW5jdGlvbiAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkJICAgICAgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkJICAgICAgSW50ZXJmYWNlICppbnRlcmZhY2UsCi1AQCAtOTYsNyArOTYsNyBAQAotIAkJCQkJICAgICAgTmloTGlzdCAqcHJvdG90eXBlcywKLSAJCQkJCSAgICAgIE5paExpc3QgKmhhbmRsZXJzLAotIAkJCQkJICAgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgcHJvcGVydHlfcHJveHlfZ2V0X2Z1bmN0aW9uICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkJICAgICAgY29uc3QgY2hhciAqcHJlZml4LAotQEAgLTEwNCw3ICsxMDQsNyBAQAotIAkJCQkJICAgICAgUHJvcGVydHkgKnByb3BlcnR5LAotIAkJCQkJICAgICAgTmloTGlzdCAqcHJvdG90eXBlcywKLSAJCQkJCSAgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgIHByb3BlcnR5X3Byb3h5X2dldF9ub3RpZnlfZnVuY3Rpb24gKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJCSAgICAgIEludGVyZmFjZSAqaW50ZXJmYWNlLAotQEAgLTExMiw3ICsxMTIsNyBAQAotIAkJCQkJICAgICAgTmloTGlzdCAqcHJvdG90eXBlcywKLSAJCQkJCSAgICAgIE5paExpc3QgKnR5cGVkZWZzLAotIAkJCQkJICAgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgcHJvcGVydHlfcHJveHlfc2V0X2Z1bmN0aW9uICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkJICAgICAgY29uc3QgY2hhciAqcHJlZml4LAotQEAgLTEyMCw3ICsxMjAsNyBAQAotIAkJCQkJICAgICAgUHJvcGVydHkgKnByb3BlcnR5LAotIAkJCQkJICAgICAgTmloTGlzdCAqcHJvdG90eXBlcywKLSAJCQkJCSAgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgIHByb3BlcnR5X3Byb3h5X3NldF9ub3RpZnlfZnVuY3Rpb24gKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJCSAgICAgIEludGVyZmFjZSAqaW50ZXJmYWNlLAotQEAgLTEyOCw3ICsxMjgsNyBAQAotIAkJCQkJICAgICAgTmloTGlzdCAqcHJvdG90eXBlcywKLSAJCQkJCSAgICAgIE5paExpc3QgKnR5cGVkZWZzLAotIAkJCQkJICAgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgcHJvcGVydHlfcHJveHlfZ2V0X3N5bmNfZnVuY3Rpb24gICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkJICAgICAgY29uc3QgY2hhciAqcHJlZml4LAotQEAgLTEzNiwxNCArMTM2LDE0IEBACi0gCQkJCQkgICAgICBQcm9wZXJ0eSAqcHJvcGVydHksCi0gCQkJCQkgICAgICBOaWhMaXN0ICpwcm90b3R5cGVzLAotIAkJCQkJICAgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogICAgcHJvcGVydHlfcHJveHlfc2V0X3N5bmNfZnVuY3Rpb24gICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkJICAgICAgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkJICAgICAgSW50ZXJmYWNlICppbnRlcmZhY2UsCi0gCQkJCQkgICAgICBQcm9wZXJ0eSAqcHJvcGVydHksCi0gCQkJCQkgICAgICBOaWhMaXN0ICpwcm90b3R5cGVzLAotIAkJCQkJICAgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOSUhfRU5EX0VYVEVSTgotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvdGVzdHMvdGVzdF9tYWluLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC90ZXN0cy90ZXN0X21haW4uYwotQEAgLTEwMCwxMCArMTAwLDEwIEBACi0gCi0gZXh0ZXJuIGNoYXIgKnNvdXJjZV9maWxlX3BhdGggKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqb3V0cHV0X3BhdGgsCi0gCQkJICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGV4dGVybiBjaGFyICpoZWFkZXJfZmlsZV9wYXRoIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKm91dHB1dF9wYXRoLAotIAkJCSAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSB2b2lkCi0gdGVzdF9zb3VyY2VfZmlsZV9wYXRoICh2b2lkKQotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvdGVzdHMvdGVzdF9jb20ubmV0c3BsaXQuTmloLlRlc3Rfb2JqZWN0LmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC90ZXN0cy90ZXN0X2NvbS5uZXRzcGxpdC5OaWguVGVzdF9vYmplY3QuYwotQEAgLTEyNTI0LDYgKzEyNTI0LDcgQEAKLSAJCWRidXNfbWVzc2FnZV9pdGVyX2luaXQgKHJlcGx5LCAmaXRlcik7Ci0gCi0gCQlkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZpdGVyLCAmc3RyX3ZhbHVlKTsKLSsJCVRFU1RfTkUgKHN0cl92YWx1ZVswXSwgJ1wwJyk7Ci0gCQlURVNUX1RSVUUgKHN0cmNociAoIjAxMjM0NTY3ODkiLCBzdHJfdmFsdWVbMF0pKTsKLSAKLSAJCWRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvdGVzdHMvdGVzdF9tYXJzaGFsLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC90ZXN0cy90ZXN0X21hcnNoYWwuYwotQEAgLTE0NzksMzkgKzE0NzksNDEgQEAKLSAJCQkJICAgIlx0cmV0dXJuIC0xO1xuIgotIAkJCQkgICAifVxuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJmb3IgKHNpemVfdCB2YWx1ZV9pID0gMDsgdmFsdWVbdmFsdWVfaV07IHZhbHVlX2krKykge1xuIgotLQkJCQkgICAiXHREQnVzTWVzc2FnZUl0ZXIgdmFsdWVfZWxlbWVudF9pdGVyO1xuIgotLQkJCQkgICAiXHRjb25zdCBpbnQxNl90ICogdmFsdWVfZWxlbWVudDtcbiIKLS0JCQkJICAgIlx0c2l6ZV90ICAgICAgICAgIHZhbHVlX2VsZW1lbnRfbGVuO1xuIgotKwkJCQkgICAiaWYgKHZhbHVlKSB7XG4iCi0rCQkJCSAgICJcdGZvciAoc2l6ZV90IHZhbHVlX2kgPSAwOyB2YWx1ZVt2YWx1ZV9pXTsgdmFsdWVfaSsrKSB7XG4iCi0rCQkJCSAgICJcdFx0REJ1c01lc3NhZ2VJdGVyIHZhbHVlX2VsZW1lbnRfaXRlcjtcbiIKLSsJCQkJICAgIlx0XHRjb25zdCBpbnQxNl90ICogdmFsdWVfZWxlbWVudDtcbiIKLSsJCQkJICAgIlx0XHRzaXplX3QgICAgICAgICAgdmFsdWVfZWxlbWVudF9sZW47XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0dmFsdWVfZWxlbWVudCA9IHZhbHVlW3ZhbHVlX2ldO1xuIgotLQkJCQkgICAiXHR2YWx1ZV9lbGVtZW50X2xlbiA9IHZhbHVlX2xlblt2YWx1ZV9pXTtcbiIKLSsJCQkJICAgIlx0XHR2YWx1ZV9lbGVtZW50ID0gdmFsdWVbdmFsdWVfaV07XG4iCi0rCQkJCSAgICJcdFx0dmFsdWVfZWxlbWVudF9sZW4gPSB2YWx1ZV9sZW5bdmFsdWVfaV07XG4iCi0gCQkJCSAgICJcbiIKLSAKLS0JCQkJICAgIlx0LyogTWFyc2hhbCBhbiBhcnJheSBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0tCQkJCSAgICJcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmdmFsdWVfaXRlciwgREJVU19UWVBFX0FSUkFZLCBcIm5cIiwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLS0JCQkJICAgIlx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLS0JCQkJICAgIlx0XHRyZXR1cm4gLTE7XG4iCi0tCQkJCSAgICJcdH1cbiIKLSsJCQkJICAgIlx0XHQvKiBNYXJzaGFsIGFuIGFycmF5IG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLSsJCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwgXCJuXCIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpKSB7XG4iCi0rCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHR9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0Zm9yIChzaXplX3QgdmFsdWVfZWxlbWVudF9pID0gMDsgdmFsdWVfZWxlbWVudF9pIDwgdmFsdWVfZWxlbWVudF9sZW47IHZhbHVlX2VsZW1lbnRfaSsrKSB7XG4iCi0tCQkJCSAgICJcdFx0aW50MTZfdCB2YWx1ZV9lbGVtZW50X2VsZW1lbnQ7XG4iCi0rCQkJCSAgICJcdFx0Zm9yIChzaXplX3QgdmFsdWVfZWxlbWVudF9pID0gMDsgdmFsdWVfZWxlbWVudF9pIDwgdmFsdWVfZWxlbWVudF9sZW47IHZhbHVlX2VsZW1lbnRfaSsrKSB7XG4iCi0rCQkJCSAgICJcdFx0XHRpbnQxNl90IHZhbHVlX2VsZW1lbnRfZWxlbWVudDtcbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHRcdHZhbHVlX2VsZW1lbnRfZWxlbWVudCA9IHZhbHVlX2VsZW1lbnRbdmFsdWVfZWxlbWVudF9pXTtcbiIKLSsJCQkJICAgIlx0XHRcdHZhbHVlX2VsZW1lbnRfZWxlbWVudCA9IHZhbHVlX2VsZW1lbnRbdmFsdWVfZWxlbWVudF9pXTtcbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHRcdC8qIE1hcnNoYWwgYSBpbnQxNl90IG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLS0JCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9lbGVtZW50X2l0ZXIsIERCVVNfVFlQRV9JTlQxNiwgJnZhbHVlX2VsZW1lbnRfZWxlbWVudCkpIHtcbiIKLS0JCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHQvKiBNYXJzaGFsIGEgaW50MTZfdCBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0rCQkJCSAgICJcdFx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9lbGVtZW50X2l0ZXIsIERCVVNfVFlQRV9JTlQxNiwgJnZhbHVlX2VsZW1lbnRfZWxlbWVudCkpIHtcbiIKLSsJCQkJICAgIlx0XHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHRcdH1cbiIKLSsJCQkJICAgIlx0XHR9XG4iCi0rCQkJCSAgICJcbiIKLSsJCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKSkge1xuIgotIAkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0gCQkJCSAgICJcdFx0XHRyZXR1cm4gLTE7XG4iCi0gCQkJCSAgICJcdFx0fVxuIgotLQkJCQkgICAiXHR9XG4iCi0tCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLS0JCQkJICAgIlx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLS0JCQkJICAgIlx0XHRyZXR1cm4gLTE7XG4iCi0tCQkJCSAgICJcdH1cbiIKLSAKLSsJCQkJICAgIlx0fVxuIgotIAkJCQkgICAifVxuIgotIAkJCQkgICAiXG4iCi0gCQkJCSAgICJpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcikpIHtcbiIKLUBAIC0xNzY2LDE1ICsxNzY4LDE3IEBACi0gCQkJCSAgICJcdHJldHVybiAtMTtcbiIKLSAJCQkJICAgIn1cbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiZm9yIChzaXplX3QgdmFsdWVfaSA9IDA7IHZhbHVlW3ZhbHVlX2ldOyB2YWx1ZV9pKyspIHtcbiIKLS0JCQkJICAgIlx0Y29uc3QgY2hhciAqdmFsdWVfZWxlbWVudDtcbiIKLSsJCQkJICAgImlmICh2YWx1ZSkge1xuIgotKwkJCQkgICAiXHRmb3IgKHNpemVfdCB2YWx1ZV9pID0gMDsgdmFsdWVbdmFsdWVfaV07IHZhbHVlX2krKykge1xuIgotKwkJCQkgICAiXHRcdGNvbnN0IGNoYXIgKnZhbHVlX2VsZW1lbnQ7XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0dmFsdWVfZWxlbWVudCA9IHZhbHVlW3ZhbHVlX2ldO1xuIgotKwkJCQkgICAiXHRcdHZhbHVlX2VsZW1lbnQgPSB2YWx1ZVt2YWx1ZV9pXTtcbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHQvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLS0JCQkJICAgIlx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfaXRlciwgREJVU19UWVBFX1NUUklORywgJnZhbHVlX2VsZW1lbnQpKSB7XG4iCi0tCQkJCSAgICJcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0cmV0dXJuIC0xO1xuIgotKwkJCQkgICAiXHRcdC8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqL1xuIgotKwkJCQkgICAiXHRcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnZhbHVlX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZ2YWx1ZV9lbGVtZW50KSkge1xuIgotKwkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRyZXR1cm4gLTE7XG4iCi0rCQkJCSAgICJcdFx0fVxuIgotIAkJCQkgICAiXHR9XG4iCi0gCQkJCSAgICJ9XG4iCi0gCQkJCSAgICJcbiIKLUBAIC0xOTMzLDM1ICsxOTM3LDM5IEBACi0gCQkJCSAgICJcdHJldHVybiAtMTtcbiIKLSAJCQkJICAgIn1cbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiZm9yIChzaXplX3QgdmFsdWVfaSA9IDA7IHZhbHVlW3ZhbHVlX2ldOyB2YWx1ZV9pKyspIHtcbiIKLS0JCQkJICAgIlx0REJ1c01lc3NhZ2VJdGVyIHZhbHVlX2VsZW1lbnRfaXRlcjtcbiIKLS0JCQkJICAgIlx0Y2hhciAqIGNvbnN0ICogIHZhbHVlX2VsZW1lbnQ7XG4iCi0rCQkJCSAgICJpZiAodmFsdWUpIHtcbiIKLSsJCQkJICAgIlx0Zm9yIChzaXplX3QgdmFsdWVfaSA9IDA7IHZhbHVlW3ZhbHVlX2ldOyB2YWx1ZV9pKyspIHtcbiIKLSsJCQkJICAgIlx0XHREQnVzTWVzc2FnZUl0ZXIgdmFsdWVfZWxlbWVudF9pdGVyO1xuIgotKwkJCQkgICAiXHRcdGNoYXIgKiBjb25zdCAqICB2YWx1ZV9lbGVtZW50O1xuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdHZhbHVlX2VsZW1lbnQgPSB2YWx1ZVt2YWx1ZV9pXTtcbiIKLSsJCQkJICAgIlx0XHR2YWx1ZV9lbGVtZW50ID0gdmFsdWVbdmFsdWVfaV07XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0LyogTWFyc2hhbCBhbiBhcnJheSBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0tCQkJCSAgICJcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmdmFsdWVfaXRlciwgREJVU19UWVBFX0FSUkFZLCBcInNcIiwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLS0JCQkJICAgIlx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLS0JCQkJICAgIlx0XHRyZXR1cm4gLTE7XG4iCi0tCQkJCSAgICJcdH1cbiIKLS0JCQkJICAgIlxuIgotLQkJCQkgICAiXHRmb3IgKHNpemVfdCB2YWx1ZV9lbGVtZW50X2kgPSAwOyB2YWx1ZV9lbGVtZW50W3ZhbHVlX2VsZW1lbnRfaV07IHZhbHVlX2VsZW1lbnRfaSsrKSB7XG4iCi0tCQkJCSAgICJcdFx0Y29uc3QgY2hhciAqdmFsdWVfZWxlbWVudF9lbGVtZW50O1xuIgotKwkJCQkgICAiXHRcdC8qIE1hcnNoYWwgYW4gYXJyYXkgb250byB0aGUgbWVzc2FnZSAqL1xuIgotKwkJCQkgICAiXHRcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmdmFsdWVfaXRlciwgREJVU19UWVBFX0FSUkFZLCBcInNcIiwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0cmV0dXJuIC0xO1xuIgotKwkJCQkgICAiXHRcdH1cbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHRcdHZhbHVlX2VsZW1lbnRfZWxlbWVudCA9IHZhbHVlX2VsZW1lbnRbdmFsdWVfZWxlbWVudF9pXTtcbiIKLSsJCQkJICAgIlx0XHRpZiAodmFsdWVfZWxlbWVudCkge1xuIgotKwkJCQkgICAiXHRcdFx0Zm9yIChzaXplX3QgdmFsdWVfZWxlbWVudF9pID0gMDsgdmFsdWVfZWxlbWVudFt2YWx1ZV9lbGVtZW50X2ldOyB2YWx1ZV9lbGVtZW50X2krKykge1xuIgotKwkJCQkgICAiXHRcdFx0XHRjb25zdCBjaGFyICp2YWx1ZV9lbGVtZW50X2VsZW1lbnQ7XG4iCi0rCQkJCSAgICJcbiIKLSsJCQkJICAgIlx0XHRcdFx0dmFsdWVfZWxlbWVudF9lbGVtZW50ID0gdmFsdWVfZWxlbWVudFt2YWx1ZV9lbGVtZW50X2ldO1xuIgotKwkJCQkgICAiXG4iCi0rCQkJCSAgICJcdFx0XHRcdC8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqL1xuIgotKwkJCQkgICAiXHRcdFx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9lbGVtZW50X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZ2YWx1ZV9lbGVtZW50X2VsZW1lbnQpKSB7XG4iCi0rCQkJCSAgICJcdFx0XHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdFx0XHRyZXR1cm4gLTE7XG4iCi0rCQkJCSAgICJcdFx0XHRcdH1cbiIKLSsJCQkJICAgIlx0XHRcdH1cbiIKLSsJCQkJICAgIlx0XHR9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0XHQvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLS0JCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9lbGVtZW50X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZ2YWx1ZV9lbGVtZW50X2VsZW1lbnQpKSB7XG4iCi0tCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpKSB7XG4iCi0gCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLSAJCQkJICAgIlx0XHRcdHJldHVybiAtMTtcbiIKLSAJCQkJICAgIlx0XHR9XG4iCi0gCQkJCSAgICJcdH1cbiIKLS0JCQkJICAgIlxuIgotLQkJCQkgICAiXHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKSkge1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdHJldHVybiAtMTtcbiIKLS0JCQkJICAgIlx0fVxuIgotIAkJCQkgICAifVxuIgotIAkJCQkgICAiXG4iCi0gCQkJCSAgICJpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcikpIHtcbiIKLUBAIC0yMTk0LDE2ICsyMjAyLDE4IEBACi0gCQkJCSAgICJcdHJldHVybiAtMTtcbiIKLSAJCQkJICAgIn1cbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiZm9yIChzaXplX3QgdmFsdWVfaXRlbTJfaSA9IDA7IHZhbHVlX2l0ZW0yW3ZhbHVlX2l0ZW0yX2ldOyB2YWx1ZV9pdGVtMl9pKyspIHtcbiIKLS0JCQkJICAgIlx0Y29uc3QgY2hhciAqdmFsdWVfaXRlbTJfZWxlbWVudDtcbiIKLSsJCQkJICAgImlmICh2YWx1ZV9pdGVtMikge1xuIgotKwkJCQkgICAiXHRmb3IgKHNpemVfdCB2YWx1ZV9pdGVtMl9pID0gMDsgdmFsdWVfaXRlbTJbdmFsdWVfaXRlbTJfaV07IHZhbHVlX2l0ZW0yX2krKykge1xuIgotKwkJCQkgICAiXHRcdGNvbnN0IGNoYXIgKnZhbHVlX2l0ZW0yX2VsZW1lbnQ7XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0dmFsdWVfaXRlbTJfZWxlbWVudCA9IHZhbHVlX2l0ZW0yW3ZhbHVlX2l0ZW0yX2ldO1xuIgotKwkJCQkgICAiXHRcdHZhbHVlX2l0ZW0yX2VsZW1lbnQgPSB2YWx1ZV9pdGVtMlt2YWx1ZV9pdGVtMl9pXTtcbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHQvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLS0JCQkJICAgIlx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfaXRlbTJfaXRlciwgREJVU19UWVBFX1NUUklORywgJnZhbHVlX2l0ZW0yX2VsZW1lbnQpKSB7XG4iCi0tCQkJCSAgICJcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfaXRlbTJfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0cmV0dXJuIC0xO1xuIgotKwkJCQkgICAiXHRcdC8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqL1xuIgotKwkJCQkgICAiXHRcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnZhbHVlX2l0ZW0yX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZ2YWx1ZV9pdGVtMl9lbGVtZW50KSkge1xuIgotKwkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfaXRlbTJfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHR9XG4iCi0gCQkJCSAgICJcdH1cbiIKLSAJCQkJICAgIn1cbiIKLSAJCQkJICAgIlxuIgotQEAgLTI2NDIsNDEgKzI2NTIsNDMgQEAKLSAJCQkJICAgIlx0cmV0dXJuIC0xO1xuIgotIAkJCQkgICAifVxuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJmb3IgKHNpemVfdCB2YWx1ZV9pID0gMDsgdmFsdWVbdmFsdWVfaV07IHZhbHVlX2krKykge1xuIgotLQkJCQkgICAiXHREQnVzTWVzc2FnZUl0ZXIgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtZW50X2l0ZXI7XG4iCi0tCQkJCSAgICJcdGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1lbnRfaXRlbTA7XG4iCi0tCQkJCSAgICJcdHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1lbnRfaXRlbTE7XG4iCi0tCQkJCSAgICJcdGNvbnN0IE15U3RydWN0QXJyYXlWYWx1ZUVsZW1lbnQgKnZhbHVlX2VsZW1lbnQ7XG4iCi0rCQkJCSAgICJpZiAodmFsdWUpIHtcbiIKLSsJCQkJICAgIlx0Zm9yIChzaXplX3QgdmFsdWVfaSA9IDA7IHZhbHVlW3ZhbHVlX2ldOyB2YWx1ZV9pKyspIHtcbiIKLSsJCQkJICAgIlx0XHREQnVzTWVzc2FnZUl0ZXIgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtZW50X2l0ZXI7XG4iCi0rCQkJCSAgICJcdFx0Y29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbWVudF9pdGVtMDtcbiIKLSsJCQkJICAgIlx0XHR1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtZW50X2l0ZW0xO1xuIgotKwkJCQkgICAiXHRcdGNvbnN0IE15U3RydWN0QXJyYXlWYWx1ZUVsZW1lbnQgKnZhbHVlX2VsZW1lbnQ7XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0dmFsdWVfZWxlbWVudCA9IHZhbHVlW3ZhbHVlX2ldO1xuIgotKwkJCQkgICAiXHRcdHZhbHVlX2VsZW1lbnQgPSB2YWx1ZVt2YWx1ZV9pXTtcbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHQvKiBNYXJzaGFsIGEgc3RydWN0dXJlIG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLS0JCQkJICAgIlx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCBEQlVTX1RZUEVfU1RSVUNULCBOVUxMLCAmdmFsdWVfZWxlbWVudF9pdGVyKSkge1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdHJldHVybiAtMTtcbiIKLS0JCQkJICAgIlx0fVxuIgotKwkJCQkgICAiXHRcdC8qIE1hcnNoYWwgYSBzdHJ1Y3R1cmUgb250byB0aGUgbWVzc2FnZSAqL1xuIgotKwkJCQkgICAiXHRcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmdmFsdWVfaXRlciwgREJVU19UWVBFX1NUUlVDVCwgTlVMTCwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0cmV0dXJuIC0xO1xuIgotKwkJCQkgICAiXHRcdH1cbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHR2YWx1ZV9lbGVtZW50X2l0ZW0wID0gdmFsdWVfZWxlbWVudC0+aXRlbTA7XG4iCi0rCQkJCSAgICJcdFx0dmFsdWVfZWxlbWVudF9pdGVtMCA9IHZhbHVlX2VsZW1lbnQtPml0ZW0wO1xuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdC8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqL1xuIgotLQkJCQkgICAiXHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9lbGVtZW50X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZ2YWx1ZV9lbGVtZW50X2l0ZW0wKSkge1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0cmV0dXJuIC0xO1xuIgotLQkJCQkgICAiXHR9XG4iCi0rCQkJCSAgICJcdFx0LyogTWFyc2hhbCBhIGNoYXIgKiBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0rCQkJCSAgICJcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmdmFsdWVfZWxlbWVudF9pdGVtMCkpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHR9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0dmFsdWVfZWxlbWVudF9pdGVtMSA9IHZhbHVlX2VsZW1lbnQtPml0ZW0xO1xuIgotKwkJCQkgICAiXHRcdHZhbHVlX2VsZW1lbnRfaXRlbTEgPSB2YWx1ZV9lbGVtZW50LT5pdGVtMTtcbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHQvKiBNYXJzaGFsIGEgdWludDMyX3Qgb250byB0aGUgbWVzc2FnZSAqL1xuIgotLQkJCQkgICAiXHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9lbGVtZW50X2l0ZXIsIERCVVNfVFlQRV9VSU5UMzIsICZ2YWx1ZV9lbGVtZW50X2l0ZW0xKSkge1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0cmV0dXJuIC0xO1xuIgotLQkJCQkgICAiXHR9XG4iCi0rCQkJCSAgICJcdFx0LyogTWFyc2hhbCBhIHVpbnQzMl90IG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLSsJCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9lbGVtZW50X2l0ZXIsIERCVVNfVFlQRV9VSU5UMzIsICZ2YWx1ZV9lbGVtZW50X2l0ZW0xKSkge1xuIgotKwkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0cmV0dXJuIC0xO1xuIgotKwkJCQkgICAiXHRcdH1cbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKSkge1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKSkge1xuIgotKwkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRyZXR1cm4gLTE7XG4iCi0rCQkJCSAgICJcdFx0fVxuIgotIAkJCQkgICAiXHR9XG4iCi0gCQkJCSAgICJ9XG4iCi0gCQkJCSAgICJcbiIKLUBAIC0yOTEyLDQxICsyOTI0LDQzIEBACi0gCQkJCSAgICJcdHJldHVybiAtMTtcbiIKLSAJCQkJICAgIn1cbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiZm9yIChzaXplX3QgdmFsdWVfaSA9IDA7IHZhbHVlW3ZhbHVlX2ldOyB2YWx1ZV9pKyspIHtcbiIKLS0JCQkJICAgIlx0REJ1c01lc3NhZ2VJdGVyICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbWVudF9pdGVyO1xuIgotLQkJCQkgICAiXHRjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtZW50X2l0ZW0wO1xuIgotLQkJCQkgICAiXHR1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtZW50X2l0ZW0xO1xuIgotLQkJCQkgICAiXHRjb25zdCBNeURpY3RFbnRyeUFycmF5VmFsdWVFbGVtZW50ICp2YWx1ZV9lbGVtZW50O1xuIgotKwkJCQkgICAiaWYgKHZhbHVlKSB7XG4iCi0rCQkJCSAgICJcdGZvciAoc2l6ZV90IHZhbHVlX2kgPSAwOyB2YWx1ZVt2YWx1ZV9pXTsgdmFsdWVfaSsrKSB7XG4iCi0rCQkJCSAgICJcdFx0REJ1c01lc3NhZ2VJdGVyICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbWVudF9pdGVyO1xuIgotKwkJCQkgICAiXHRcdGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1lbnRfaXRlbTA7XG4iCi0rCQkJCSAgICJcdFx0dWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbWVudF9pdGVtMTtcbiIKLSsJCQkJICAgIlx0XHRjb25zdCBNeURpY3RFbnRyeUFycmF5VmFsdWVFbGVtZW50ICp2YWx1ZV9lbGVtZW50O1xuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdHZhbHVlX2VsZW1lbnQgPSB2YWx1ZVt2YWx1ZV9pXTtcbiIKLSsJCQkJICAgIlx0XHR2YWx1ZV9lbGVtZW50ID0gdmFsdWVbdmFsdWVfaV07XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0LyogTWFyc2hhbCBhIHN0cnVjdHVyZSBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0tCQkJCSAgICJcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmdmFsdWVfaXRlciwgREJVU19UWVBFX0RJQ1RfRU5UUlksIE5VTEwsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpKSB7XG4iCi0tCQkJCSAgICJcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0cmV0dXJuIC0xO1xuIgotLQkJCQkgICAiXHR9XG4iCi0rCQkJCSAgICJcdFx0LyogTWFyc2hhbCBhIHN0cnVjdHVyZSBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0rCQkJCSAgICJcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCBEQlVTX1RZUEVfRElDVF9FTlRSWSwgTlVMTCwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0cmV0dXJuIC0xO1xuIgotKwkJCQkgICAiXHRcdH1cbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHR2YWx1ZV9lbGVtZW50X2l0ZW0wID0gdmFsdWVfZWxlbWVudC0+aXRlbTA7XG4iCi0rCQkJCSAgICJcdFx0dmFsdWVfZWxlbWVudF9pdGVtMCA9IHZhbHVlX2VsZW1lbnQtPml0ZW0wO1xuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdC8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqL1xuIgotLQkJCQkgICAiXHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9lbGVtZW50X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZ2YWx1ZV9lbGVtZW50X2l0ZW0wKSkge1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0cmV0dXJuIC0xO1xuIgotLQkJCQkgICAiXHR9XG4iCi0rCQkJCSAgICJcdFx0LyogTWFyc2hhbCBhIGNoYXIgKiBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0rCQkJCSAgICJcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmdmFsdWVfZWxlbWVudF9pdGVtMCkpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHR9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0dmFsdWVfZWxlbWVudF9pdGVtMSA9IHZhbHVlX2VsZW1lbnQtPml0ZW0xO1xuIgotKwkJCQkgICAiXHRcdHZhbHVlX2VsZW1lbnRfaXRlbTEgPSB2YWx1ZV9lbGVtZW50LT5pdGVtMTtcbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHQvKiBNYXJzaGFsIGEgdWludDMyX3Qgb250byB0aGUgbWVzc2FnZSAqL1xuIgotLQkJCQkgICAiXHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9lbGVtZW50X2l0ZXIsIERCVVNfVFlQRV9VSU5UMzIsICZ2YWx1ZV9lbGVtZW50X2l0ZW0xKSkge1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0cmV0dXJuIC0xO1xuIgotLQkJCQkgICAiXHR9XG4iCi0rCQkJCSAgICJcdFx0LyogTWFyc2hhbCBhIHVpbnQzMl90IG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLSsJCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9lbGVtZW50X2l0ZXIsIERCVVNfVFlQRV9VSU5UMzIsICZ2YWx1ZV9lbGVtZW50X2l0ZW0xKSkge1xuIgotKwkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0cmV0dXJuIC0xO1xuIgotKwkJCQkgICAiXHRcdH1cbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKSkge1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKSkge1xuIgotKwkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRyZXR1cm4gLTE7XG4iCi0rCQkJCSAgICJcdFx0fVxuIgotIAkJCQkgICAiXHR9XG4iCi0gCQkJCSAgICJ9XG4iCi0gCQkJCSAgICJcbiIKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL3Rlc3RzL3Rlc3RfY29tLm5ldHNwbGl0Lk5paC5UZXN0X3Byb3h5LmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC90ZXN0cy90ZXN0X2NvbS5uZXRzcGxpdC5OaWguVGVzdF9wcm94eS5jCi1AQCAtMjczNTksNiArMjczNTksNyBAQAotIAkJVEVTVF9UUlVFICh1bml4X2ZkX3RvX3N0cl9yZXBsaWVkKTsKLSAKLSAJCVRFU1RfRVFfUCAobGFzdF9kYXRhLCBwYXJlbnQpOwotKwkJVEVTVF9ORSAobGFzdF9zdHJfdmFsdWVbMF0sICdcMCcpOwotIAkJVEVTVF9UUlVFIChzdHJjaHIgKCIwMTIzNDU2Nzg5IiwgbGFzdF9zdHJfdmFsdWVbMF0pKTsKLSAJCVRFU1RfQUxMT0NfUEFSRU5UIChsYXN0X3N0cl92YWx1ZSwgcGFyZW50KTsKLSAKLUBAIC0yNzY3Myw2ICsyNzY3NCw3IEBACi0gCi0gCQlURVNUX0VRIChyZXQsIDApOwotIAotKwkJVEVTVF9ORSAoc3RyX3ZhbHVlWzBdLCAnXDAnKTsKLSAJCVRFU1RfVFJVRSAoc3RyY2hyICgiMDEyMzQ1Njc4OSIsIHN0cl92YWx1ZVswXSkpOwotIAkJVEVTVF9BTExPQ19QQVJFTlQgKHN0cl92YWx1ZSwgcGFyZW50KTsKLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL3Rlc3RzL3Rlc3RfcHJvcGVydHkuYwotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL3Rlc3RzL3Rlc3RfcHJvcGVydHkuYwotQEAgLTg3MzMsNyArODczMyw3IEBACi0gCVR5cGVWYXIgKiAgICAgICB2YXI7Ci0gCU5paExpc3RFbnRyeSAqICBhdHRyaWI7Ci0gCU5paERCdXNQcm94eSAqICBwcm94eSA9IE5VTEw7Ci0tCXZvaWQgKiAgICAgICAgICBwYXJlbnQgPSBOVUxMOwotKwl2b2lkICogICAgICAgICAgcGFyZW50IF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gTlVMTDsKLSAJcGlkX3QgICAgICAgICAgIHBpZCA9IC0xOwotIAlpbnQgICAgICAgICAgICAgc3RhdHVzOwotIAlEQnVzTWVzc2FnZSAqICAgbWV0aG9kX2NhbGw7Ci0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC90ZXN0cy9leHBlY3RlZC90ZXN0X21ldGhvZF9vYmplY3RfZnVuY3Rpb25fc3RhbmRhcmQuYwotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL3Rlc3RzL2V4cGVjdGVkL3Rlc3RfbWV0aG9kX29iamVjdF9mdW5jdGlvbl9zdGFuZGFyZC5jCi1AQCAtMTM2LDE3ICsxMzYsMTkgQEAKLSAJCQlnb3RvIGVub21lbTsKLSAJCX0KLSAKLS0JCWZvciAoc2l6ZV90IG91dHB1dF9pID0gMDsgb3V0cHV0W291dHB1dF9pXTsgb3V0cHV0X2krKykgewotLQkJCWNvbnN0IGNoYXIgKm91dHB1dF9lbGVtZW50OwotKwkJaWYgKG91dHB1dCkgewotKwkJCWZvciAoc2l6ZV90IG91dHB1dF9pID0gMDsgb3V0cHV0W291dHB1dF9pXTsgb3V0cHV0X2krKykgewotKwkJCQljb25zdCBjaGFyICpvdXRwdXRfZWxlbWVudDsKLSAKLS0JCQlvdXRwdXRfZWxlbWVudCA9IG91dHB1dFtvdXRwdXRfaV07Ci0rCQkJCW91dHB1dF9lbGVtZW50ID0gb3V0cHV0W291dHB1dF9pXTsKLSAKLS0JCQkvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi8KLS0JCQlpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZvdXRwdXRfaXRlciwgREJVU19UWVBFX1NUUklORywgJm91dHB1dF9lbGVtZW50KSkgewotLQkJCQlkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZvdXRwdXRfaXRlcik7Ci0tCQkJCWRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOwotLQkJCQlyZXBseSA9IE5VTEw7Ci0tCQkJCWdvdG8gZW5vbWVtOwotKwkJCQkvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi8KLSsJCQkJaWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmb3V0cHV0X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZvdXRwdXRfZWxlbWVudCkpIHsKLSsJCQkJCWRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJm91dHB1dF9pdGVyKTsKLSsJCQkJCWRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOwotKwkJCQkJcmVwbHkgPSBOVUxMOwotKwkJCQkJZ290byBlbm9tZW07Ci0rCQkJCX0KLSAJCQl9Ci0gCQl9Ci0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC90ZXN0cy9leHBlY3RlZC90ZXN0X21ldGhvZF9yZXBseV9mdW5jdGlvbl9zdGFuZGFyZC5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvdGVzdHMvZXhwZWN0ZWQvdGVzdF9tZXRob2RfcmVwbHlfZnVuY3Rpb25fc3RhbmRhcmQuYwotQEAgLTcsNyArNyw2IEBACi0gCURCdXNNZXNzYWdlSXRlciBvdXRwdXRfaXRlcjsKLSAKLSAJbmloX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKLS0JbmloX2Fzc2VydCAob3V0cHV0ICE9IE5VTEwpOwotIAotIAkvKiBJZiB0aGUgc2VuZGVyIGRvZXNuJ3QgY2FyZSBhYm91dCBhIHJlcGx5LCBkb24ndCBib3RoZXIgd2FzdGluZwotIAkgKiBlZmZvcnQgY29uc3RydWN0aW5nIGFuZCBzZW5kaW5nIG9uZS4KLUBAIC0yOCwxNiArMjcsMTggQEAKLSAJCXJldHVybiAtMTsKLSAJfQotIAotLQlmb3IgKHNpemVfdCBvdXRwdXRfaSA9IDA7IG91dHB1dFtvdXRwdXRfaV07IG91dHB1dF9pKyspIHsKLS0JCWNvbnN0IGNoYXIgKm91dHB1dF9lbGVtZW50OwotLQotLQkJb3V0cHV0X2VsZW1lbnQgPSBvdXRwdXRbb3V0cHV0X2ldOwotLQotLQkJLyogTWFyc2hhbCBhIGNoYXIgKiBvbnRvIHRoZSBtZXNzYWdlICovCi0tCQlpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZvdXRwdXRfaXRlciwgREJVU19UWVBFX1NUUklORywgJm91dHB1dF9lbGVtZW50KSkgewotLQkJCWRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJm91dHB1dF9pdGVyKTsKLS0JCQlkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKLS0JCQlyZXR1cm4gLTE7Ci0rCWlmIChvdXRwdXQpIHsKLSsJCWZvciAoc2l6ZV90IG91dHB1dF9pID0gMDsgb3V0cHV0W291dHB1dF9pXTsgb3V0cHV0X2krKykgewotKwkJCWNvbnN0IGNoYXIgKm91dHB1dF9lbGVtZW50OwotKwotKwkJCW91dHB1dF9lbGVtZW50ID0gb3V0cHV0W291dHB1dF9pXTsKLSsKLSsJCQkvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi8KLSsJCQlpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZvdXRwdXRfaXRlciwgREJVU19UWVBFX1NUUklORywgJm91dHB1dF9lbGVtZW50KSkgewotKwkJCQlkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZvdXRwdXRfaXRlcik7Ci0rCQkJCWRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOwotKwkJCQlyZXR1cm4gLTE7Ci0rCQkJfQotIAkJfQotIAl9Ci0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC90ZXN0cy9leHBlY3RlZC90ZXN0X21ldGhvZF9yZXBseV9mdW5jdGlvbl9kZXByZWNhdGVkLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC90ZXN0cy9leHBlY3RlZC90ZXN0X21ldGhvZF9yZXBseV9mdW5jdGlvbl9kZXByZWNhdGVkLmMKLUBAIC03LDcgKzcsNiBAQAotIAlEQnVzTWVzc2FnZUl0ZXIgb3V0cHV0X2l0ZXI7Ci0gCi0gCW5paF9hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7Ci0tCW5paF9hc3NlcnQgKG91dHB1dCAhPSBOVUxMKTsKLSAKLSAJLyogSWYgdGhlIHNlbmRlciBkb2Vzbid0IGNhcmUgYWJvdXQgYSByZXBseSwgZG9uJ3QgYm90aGVyIHdhc3RpbmcKLSAJICogZWZmb3J0IGNvbnN0cnVjdGluZyBhbmQgc2VuZGluZyBvbmUuCi1AQCAtMjgsMTYgKzI3LDE4IEBACi0gCQlyZXR1cm4gLTE7Ci0gCX0KLSAKLS0JZm9yIChzaXplX3Qgb3V0cHV0X2kgPSAwOyBvdXRwdXRbb3V0cHV0X2ldOyBvdXRwdXRfaSsrKSB7Ci0tCQljb25zdCBjaGFyICpvdXRwdXRfZWxlbWVudDsKLS0KLS0JCW91dHB1dF9lbGVtZW50ID0gb3V0cHV0W291dHB1dF9pXTsKLS0KLS0JCS8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqLwotLQkJaWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmb3V0cHV0X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZvdXRwdXRfZWxlbWVudCkpIHsKLS0JCQlkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZvdXRwdXRfaXRlcik7Ci0tCQkJZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7Ci0tCQkJcmV0dXJuIC0xOwotKwlpZiAob3V0cHV0KSB7Ci0rCQlmb3IgKHNpemVfdCBvdXRwdXRfaSA9IDA7IG91dHB1dFtvdXRwdXRfaV07IG91dHB1dF9pKyspIHsKLSsJCQljb25zdCBjaGFyICpvdXRwdXRfZWxlbWVudDsKLSsKLSsJCQlvdXRwdXRfZWxlbWVudCA9IG91dHB1dFtvdXRwdXRfaV07Ci0rCi0rCQkJLyogTWFyc2hhbCBhIGNoYXIgKiBvbnRvIHRoZSBtZXNzYWdlICovCi0rCQkJaWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmb3V0cHV0X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZvdXRwdXRfZWxlbWVudCkpIHsKLSsJCQkJZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmb3V0cHV0X2l0ZXIpOwotKwkJCQlkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKLSsJCQkJcmV0dXJuIC0xOwotKwkJCX0KLSAJCX0KLSAJfQotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvdGVzdHMvZXhwZWN0ZWQvdGVzdF9tZXRob2Rfb2JqZWN0X2Z1bmN0aW9uX25vX2lucHV0LmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC90ZXN0cy9leHBlY3RlZC90ZXN0X21ldGhvZF9vYmplY3RfZnVuY3Rpb25fbm9faW5wdXQuYwotQEAgLTg4LDE3ICs4OCwxOSBAQAotIAkJCWdvdG8gZW5vbWVtOwotIAkJfQotIAotLQkJZm9yIChzaXplX3Qgb3V0cHV0X2kgPSAwOyBvdXRwdXRbb3V0cHV0X2ldOyBvdXRwdXRfaSsrKSB7Ci0tCQkJY29uc3QgY2hhciAqb3V0cHV0X2VsZW1lbnQ7Ci0rCQlpZiAob3V0cHV0KSB7Ci0rCQkJZm9yIChzaXplX3Qgb3V0cHV0X2kgPSAwOyBvdXRwdXRbb3V0cHV0X2ldOyBvdXRwdXRfaSsrKSB7Ci0rCQkJCWNvbnN0IGNoYXIgKm91dHB1dF9lbGVtZW50OwotIAotLQkJCW91dHB1dF9lbGVtZW50ID0gb3V0cHV0W291dHB1dF9pXTsKLSsJCQkJb3V0cHV0X2VsZW1lbnQgPSBvdXRwdXRbb3V0cHV0X2ldOwotIAotLQkJCS8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqLwotLQkJCWlmICghIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJm91dHB1dF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmb3V0cHV0X2VsZW1lbnQpKSB7Ci0tCQkJCWRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJm91dHB1dF9pdGVyKTsKLS0JCQkJZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7Ci0tCQkJCXJlcGx5ID0gTlVMTDsKLS0JCQkJZ290byBlbm9tZW07Ci0rCQkJCS8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqLwotKwkJCQlpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZvdXRwdXRfaXRlciwgREJVU19UWVBFX1NUUklORywgJm91dHB1dF9lbGVtZW50KSkgewotKwkJCQkJZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmb3V0cHV0X2l0ZXIpOwotKwkJCQkJZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7Ci0rCQkJCQlyZXBseSA9IE5VTEw7Ci0rCQkJCQlnb3RvIGVub21lbTsKLSsJCQkJfQotIAkJCX0KLSAJCX0KLSAKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xpYm5paC9saWJuaWhfMS4wLjMuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloXzEuMC4zLmJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdhNGVkMS4uMDAwMDAwMAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloXzEuMC4zLmJiCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMTMgIExHIEVsZWN0cm9uaWNzLCBJbmMuCi0KLVNVTU1BUlkgPSAibGlibmloIGxpYnJhcnkiCi1IT01FUEFHRSA9ICJodHRwczovL2xhdW5jaHBhZC5uZXQvbGlibmloIgotREVTQ1JJUFRJT04gPSAibGlibmloIGlzIGEgc21hbGwgbGlicmFyeSBmb3IgQyBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCBcCi0gICAgY29udGFpbmluZyBmdW5jdGlvbnMgdGhhdCwgZGVzcGl0ZSBpdHMgbmFtZSwgYXJlIG5vdCBpbXBsZW1lbnRlZCBcCi0gICAgZWxzZXdoZXJlIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHNldC4gXAotICAgIFwKLSAgICBsaWJuaWggaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIG90aGVyIEMgbGlicmFyaWVzIHN1Y2ggYXMgZ2xpYiwgXAotICAgIGV4Y2VwdCB0aGF0IGl0cyBmb2N1cyBpcyBvbiBhIHNtYWxsIHNpemUgYW5kIGludGVuZGVkIGZvciBcCi0gICAgYXBwbGljYXRpb25zIHRoYXQgc2l0IHZlcnkgbG93IGluIHRoZSBzb2Z0d2FyZSBzdGFjaywgZXNwZWNpYWxseSBcCi0gICAgb3V0c2lkZSBvZiAvdXNyLiBcCi0gICAgXAotICAgIEl0IGV4cHJlc3NseSBkb2VzIG5vdCByZWltcGxlbWVudCBmdW5jdGlvbnMgdGhhdCBhbHJlYWR5IGV4aXN0IGluIFwKLSAgICBsaWJyYXJpZXMgb3JkaW5hcmlseSBzaGlwcGVkIGluIC9saWIgc3VjaCBsaWJjNiwgYW5kIGRvZXMgbm90IGRvIFwKLSAgICBmb29saXNoIHRoaW5ncyBsaWtlIGludmVudCBhcmJpdHJhcnkgdHlwZWRlZnMgZm9yIHBlcmZlY3RseSBnb29kIEMgdHlwZXMuIgotCi1TRUNUSU9OID0gImxpYnMiCi0KLUxJQ0VOU0UgPSAiR1BMLTIuMCIKLUxJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovL0NPUFlJTkc7bWQ1PTc1MTQxOTI2MGFhOTU0NDk5ZjdhYmFhYmFhODgyYmJlIgotCi1ERVBFTkRTID0gImRidXMgZXhwYXQiCi1ERVBFTkRTX2FwcGVuZF9jbGFzcy10YXJnZXQgPSAiIGxpYm5paC1uYXRpdmUiCi0KLVNSQ19VUkkgPSAiaHR0cHM6Ly9sYXVuY2hwYWQubmV0LyR7QlBOfS8xLjAvJHtQVn0vK2Rvd25sb2FkLyR7QlB9LnRhci5neiBcCi0gICAgICAgICAgIGZpbGU6Ly9saWJuaWhfMS4wLjMtNHVidW50dTE2LnBhdGNoIFwKLSAgICAgICAgICAgZmlsZTovLzAwMDEtc2lnbmFsLmMtU0lHQ0xELWFuZC1TSUdDSElMRC1hcmUtc2FtZS1vbi1zeXRlbS1WLXN5cy5wYXRjaCBcCi0gICAgICAgICAgIGZpbGU6Ly8wMDAxLVVwZGF0ZS1hdXRvdG9vbC1maWxlcy1hbHNvLW1ha2UtaXQtd29yay13aXRoLWxhdGVzdC0ucGF0Y2ggXAotICAgICAgICAgICAiCi0KLVNSQ19VUklbbWQ1c3VtXSA9ICJkYjc5OTBjZTU1ZTAxZGFmZmUxOTAwNjUyNGExY2NiMCIKLVNSQ19VUklbc2hhMjU2c3VtXSA9ICI4OTc1NzJkZjc1NjVjMGE5MGE4MTUzMjY3MWUyM2M2M2Y5OWI0ZWZkZTJlZWNiYmYxMWU3ODU3ZmJjNjFmNDA1IgotCi1pbmhlcml0IGF1dG90b29scyBnZXR0ZXh0Ci0KLWRvX2NvbmZpZ3VyZV9hcHBlbmQgKCkgewotICAgICAgICBzZWQgLWkgLWUgJ3MsbGliL3BrZ2NvbmZpZywke2Jhc2VsaWJ9L3BrZ2NvbmZpZyxnJyAke1N9L25paC9NYWtlZmlsZS5pbiAke1N9L25paC1kYnVzL01ha2VmaWxlLmluCi19Ci0KLUZJTEVTXyR7UE59LWRldiArPSAiJHtsaWJkaXJ9L3BrZ2NvbmZpZy8qIFwKLSAgICAgICAgJHtpbmNsdWRlZGlyfS8qIFwKLSAgICAgICAgJHtsaWJkaXJ9Lyouc28gXAotICAgICAgICAke2RhdGFkaXJ9LyogXAotICAgICAgICAiCi0KLSMgdGFyZ2V0IGxpYm5paCByZXF1aXJlcyBuYXRpdmUgbmloLWRidXMtdG9vbAotQkJDTEFTU0VYVEVORCA9ICJuYXRpdmUiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9tdWx0aXBhdGgtdG9vbHMvbXVsdGlwYXRoLXRvb2xzXzAuOC4zLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbXVsdGlwYXRoLXRvb2xzL211bHRpcGF0aC10b29sc18wLjguMy5iYgppbmRleCAzNThmMGNiLi45ZTJkODZiIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9tdWx0aXBhdGgtdG9vbHMvbXVsdGlwYXRoLXRvb2xzXzAuOC4zLmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L211bHRpcGF0aC10b29scy9tdWx0aXBhdGgtdG9vbHNfMC44LjMuYmIKQEAgLTczLDYgKzczLDcgQEAKICAgICAgICAgICAgICAgICBiaW5kaXI9JHtiYXNlX3NiaW5kaXJ9IFwKICAgICAgICAgICAgICAgICBMSUI9JHtiYXNlX2xpYmRpcn0gbGliZGlyPSR7YmFzZV9saWJkaXJ9L211bHRpcGF0aCBcCiAgICAgICAgICAgICAgICAgdW5pdGRpcj0ke3N5c3RlbWRfc3lzdGVtX3VuaXRkaXJ9IFwKKyAgICAgICAgICAgICAgICBsaWJ1ZGV2ZGlyPSR7bm9uYXJjaF9iYXNlX2xpYmRpcn0vdWRldiBcCiAgICAgICAgICAgICAgICAgJHtAYmIudXRpbHMuY29udGFpbnMoIkRJU1RST19GRUFUVVJFUyIsICJzeXN0ZW1kIiwgIlNZU1RFTUQ9MjE2IiwgIiIsIGQpfSBcCiAgICAgICAgICAgICAgICAnCiAKQEAgLTg2LDYgKzg3LDkgQEAKICAgICAgICAgY3AgJHtXT1JLRElSfS9tdWx0aXBhdGhkLm9lICR7RH0ke3N5c2NvbmZkaXJ9L2luaXQuZC9tdWx0aXBhdGhkCiAgICAgZmkKIAorICAgIHNlZCAtaSAiczovdXNyL2xpYi91ZGV2L2twYXJ0eF9pZDoke25vbmFyY2hfYmFzZV9saWJkaXJ9L3VkZXYva3BhcnR4X2lkOmciIFwKKyAgICAgICAgJHtEfSR7bm9uYXJjaF9iYXNlX2xpYmRpcn0vdWRldi9ydWxlcy5kLzExLWRtLW1wYXRoLnJ1bGVzCisKICAgICBpbnN0YWxsIC1kICR7RH0ke3N5c2NvbmZkaXJ9CiAgICAgaW5zdGFsbCAtbSAwNjQ0ICR7V09SS0RJUn0vbXVsdGlwYXRoLmNvbmYuZXhhbXBsZSBcCiAgICAgJHtEfSR7c3lzY29uZmRpcn0vbXVsdGlwYXRoLmNvbmYuZXhhbXBsZQpAQCAtMTA2LDcgKzExMCw3IEBACiAKIFBBQ0tBR0VTID0rICJrcGFydHgiCiBGSUxFU19rcGFydHggPSAiJHtiYXNlX3NiaW5kaXJ9L2twYXJ0eCBcCi0gICAgICAgICAgICAgICAgJHtub25hcmNoX2xpYmRpcn0vdWRldi9rcGFydHhfaWQgXAorICAgICAgICAgICAgICAgICR7bm9uYXJjaF9iYXNlX2xpYmRpcn0vdWRldi9rcGFydHhfaWQgXAogICAgICAgICAgICAgICAgIgogCiBSREVQRU5EU18ke1BOfSArPSAia3BhcnR4IgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3Blbi12bS10b29scy9vcGVuLXZtLXRvb2xzLzAwMDEtaGdmc21vdW50ZXItTWFrZWZpbGUuYW0tc3VwcG9ydC11c3JtZXJnZS5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW4tdm0tdG9vbHMvb3Blbi12bS10b29scy8wMDAxLWhnZnNtb3VudGVyLU1ha2VmaWxlLmFtLXN1cHBvcnQtdXNybWVyZ2UucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0NDNlZQotLS0gL2Rldi9udWxsCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW4tdm0tdG9vbHMvb3Blbi12bS10b29scy8wMDAxLWhnZnNtb3VudGVyLU1ha2VmaWxlLmFtLXN1cHBvcnQtdXNybWVyZ2UucGF0Y2gKQEAgLTAsMCArMSwzMyBAQAorRnJvbSAzMzc5OGYzZTQ4NGViZDM0NzBlOWRhNzkxYjczYjRiOTBiYTEyYmMzIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogWWkgWmhhbyA8eWkuemhhb0B3aW5kcml2ZXIuY29tPgorRGF0ZTogVHVlLCAxNCBKYW4gMjAyMCAxNTowNDowMyArMDgwMAorU3ViamVjdDogW1BBVENIXSBoZ2ZzbW91bnRlci9NYWtlZmlsZS5hbTogc3VwcG9ydCB1c3JtZXJnZQorCitUaGVyZSBpcyBhIGRvX3BhY2thZ2UgZXJyb3Igd2hlbiBlbmFibGUgdXNybWVyZ2UgZmVhdHVyZSBkdWUgdG8gdGhlCitoYXJkY29kZWQgc2JpbiBkaXJlY3RvcnkuIFJlbW92ZSB0aGlzIHBpZWNlIG9mIGNvZGUgYmVjYXVzZSB3ZSBhbHJlYWR5CitjcmVhdGUgdGhlIHN5bWJvbGljIGxpbmsgaW4gZG9faW5zdGFsbC4KKworVXBzdHJlYW0tU3RhdHVzOiBJbmFwcHJvcHJpYXRlIFtvZS1zcGVjaWZpY10KKworU2lnbmVkLW9mZi1ieTogWWkgWmhhbyA8eWkuemhhb0B3aW5kcml2ZXIuY29tPgorLS0tCisgb3Blbi12bS10b29scy9oZ2ZzbW91bnRlci9NYWtlZmlsZS5hbSB8IDMgLS0tCisgMSBmaWxlIGNoYW5nZWQsIDMgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9vcGVuLXZtLXRvb2xzL2hnZnNtb3VudGVyL01ha2VmaWxlLmFtIGIvb3Blbi12bS10b29scy9oZ2ZzbW91bnRlci9NYWtlZmlsZS5hbQoraW5kZXggN2MxYmExYS4uNThiZDNmOCAxMDA2NDQKKy0tLSBhL29wZW4tdm0tdG9vbHMvaGdmc21vdW50ZXIvTWFrZWZpbGUuYW0KKysrKyBiL29wZW4tdm0tdG9vbHMvaGdmc21vdW50ZXIvTWFrZWZpbGUuYW0KK0BAIC0zOSw5ICszOSw2IEBAIHVuaW5zdGFsbC1ob29rOgorIAlybSAtZiAkKERFU1RESVIpJChzYmluZGlyKS9tb3VudF92bWhnZnMKKyBlbHNlCisgaW5zdGFsbC1leGVjLWhvb2s6CistCS0kKE1LRElSX1ApICQoREVTVERJUikvc2JpbgorLQktJChMTl9TKSAkKERFU1RESVIpJChzYmluZGlyKS9tb3VudC52bWhnZnMgXAorLQkJJChERVNURElSKS9zYmluL21vdW50LnZtaGdmcyAmPiAvZGV2L251bGwKKyB1bmluc3RhbGwtaG9vazoKKyAJcm0gLWYgJChERVNURElSKS9zYmluL21vdW50LnZtaGdmcworIGVuZGlmICFGUkVFQlNECistLSAKKzIuNy40CisKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW4tdm0tdG9vbHMvb3Blbi12bS10b29sc18xMS4wLjEuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuLXZtLXRvb2xzL29wZW4tdm0tdG9vbHNfMTEuMC4xLmJiCmluZGV4IGVkYTc3YzIuLjM0YTgxZDIgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW4tdm0tdG9vbHMvb3Blbi12bS10b29sc18xMS4wLjEuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3Blbi12bS10b29scy9vcGVuLXZtLXRvb2xzXzExLjAuMS5iYgpAQCAtNDIsNiArNDIsNyBAQAogICAgIGZpbGU6Ly8wMDAxLU1ha2UtSGdmc0NvbnZlcnRGcm9tTnRUaW1lTnNlYy1hd2FyZS1vZi02NC1iaXQtdGltZV8ucGF0Y2g7cGF0Y2hkaXI9Li4gXAogICAgIGZpbGU6Ly8wMDAyLWhnZnNTZXJ2ZXJMaW51eC1Db25zaWRlci02NGJpdC10aW1lX3QtcG9zc2liaWxpdHkucGF0Y2g7cGF0Y2hkaXI9Li4gXAogICAgIGZpbGU6Ly8wMDAxLXV0aWxCYWNrdHJhY2UtSWdub3JlLVdhcnJheS1ib3VuZHMucGF0Y2g7cGF0Y2hkaXI9Li4gXAorICAgIGZpbGU6Ly8wMDAxLWhnZnNtb3VudGVyLU1ha2VmaWxlLmFtLXN1cHBvcnQtdXNybWVyZ2UucGF0Y2g7cGF0Y2hkaXI9Li4gXAogIgogCiBTUkNSRVYgPSAiZDNlZGZkMTQyYTgxMDk2ZjlmNThhZmYxN2Q4NDIxOWI0NTdmNDk4NyIKQEAgLTYwLDcgKzYxLDggQEAKIEVYVFJBX09FQ09ORiA9ICItLXdpdGhvdXQtaWN1IC0tZGlzYWJsZS1tdWx0aW1vbiAtLWRpc2FibGUtZG9jcyBcCiAgICAgICAgICAtLWRpc2FibGUtdGVzdHMgLS13aXRob3V0LWd0a21tIC0td2l0aG91dC14ZXJjZXMgLS13aXRob3V0LXBhbSBcCiAgICAgICAgICAtLWRpc2FibGUtdmdhdXRoIC0tZGlzYWJsZS1kZXBsb3lwa2cgXAotICAgICAgICAgLS13aXRob3V0LXJvb3QtcHJpdmlsZWdlcyAtLXdpdGhvdXQta2VybmVsLW1vZHVsZXMgLS13aXRoLXRpcnBjIgorICAgICAgICAgLS13aXRob3V0LXJvb3QtcHJpdmlsZWdlcyAtLXdpdGhvdXQta2VybmVsLW1vZHVsZXMgLS13aXRoLXRpcnBjIFwKKyAgICAgICAgIC0td2l0aC11ZGV2LXJ1bGVzLWRpcj0ke25vbmFyY2hfYmFzZV9saWJkaXJ9L3VkZXYvcnVsZXMuZCIKIAogTk9fWDExX0ZMQUdTID0gIi0td2l0aG91dC14IC0td2l0aG91dC1ndGsyIC0td2l0aG91dC1ndGszIgogWDExX0RFUEVORFMgPSAibGlieGV4dCBsaWJ4aSBsaWJ4cmVuZGVyIGxpYnhyYW5kciBsaWJ4dHN0IGd0aysgZ2RrLXBpeGJ1ZiIKQEAgLTgzLDcgKzg1LDEwIEBACiBSREVQRU5EU18ke1BOfSA9ICJ1dGlsLWxpbnV4IGxpYmRuZXQgZnVzZSIKIAogZG9faW5zdGFsbF9hcHBlbmQoKSB7Ci0gICAgbG4gLXNmICR7c2JpbmRpcn0vbW91bnQudm1oZ2ZzICR7RH0vc2Jpbi9tb3VudC52bWhnZnMKKyAgICBpZiAhICR7QGJiLnV0aWxzLmNvbnRhaW5zKCdESVNUUk9fRkVBVFVSRVMnLCd1c3JtZXJnZScsJ3RydWUnLCdmYWxzZScsZCl9OyB0aGVuCisgICAgICAgIGluc3RhbGwgLWQgJHtEfS9zYmluCisgICAgICAgIGxuIC1zZiAke3NiaW5kaXJ9L21vdW50LnZtaGdmcyAke0R9L3NiaW4vbW91bnQudm1oZ2ZzCisgICAgZmkKICAgICBpbnN0YWxsIC1kICR7RH0ke3N5c2NvbmZkaXJ9L3Ztd2FyZS10b29scwogICAgIGlmICR7QGJiLnV0aWxzLmNvbnRhaW5zKCdESVNUUk9fRkVBVFVSRVMnLCAnc3lzdGVtZCcsICd0cnVlJywgJ2ZhbHNlJywgZCl9OyB0aGVuCiAgICAgICAgIGluc3RhbGwgLWQgJHtEfSR7c3lzdGVtZF91bml0ZGlyfS9zeXN0ZW0KZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5jdi9vcGVuY3YvMDAwMS1jYXJvdGVuZS1SZXBsYWNlLWlwY3AtdW5pdC1ncm93dGgtd2l0aC1pcGEtY3AtdW5pdC1nLnBhdGNoIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3BlbmN2L29wZW5jdi8wMDAxLWNhcm90ZW5lLVJlcGxhY2UtaXBjcC11bml0LWdyb3d0aC13aXRoLWlwYS1jcC11bml0LWcucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkMzJmYgotLS0gL2Rldi9udWxsCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5jdi9vcGVuY3YvMDAwMS1jYXJvdGVuZS1SZXBsYWNlLWlwY3AtdW5pdC1ncm93dGgtd2l0aC1pcGEtY3AtdW5pdC1nLnBhdGNoCkBAIC0wLDAgKzEsNTUgQEAKK0Zyb20gMWVkYzkyNWVjZDdmYjU0ZDJkYzc4NDUyMDY5MDg0NDc1ZmJlMmE3MCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CitEYXRlOiBUaHUsIDE2IEphbiAyMDIwIDA4OjUyOjAwIC0wODAwCitTdWJqZWN0OiBbUEFUQ0hdIGNhcm90ZW5lOiBSZXBsYWNlIGlwY3AtdW5pdC1ncm93dGggd2l0aCBpcGEtY3AtdW5pdC1ncm93dGggb24gZ2NjID49IDEwCisKK2djYyAxMCsgaGFzIHJlbmFtZWQgdGhpcyBvcHRpb24sIHRoZXJlZm9yZSBjaGVjayBmb3IgZ2NjIHZlcnNpb24gYmVmb3JlCitkZWNpZGluZyB3aGljaCBuYW1lIHRvIHVzZSBmb3Igb3B0IHBhcmFtZXRlcgorCitVcHN0cmVhbS1TdGF0dXM6IFN1Ym1pdHRlZCBbaHR0cHM6Ly9naXRodWIuY29tL29wZW5jdi9vcGVuY3YvcHVsbC8xNjM2OV0KK1NpZ25lZC1vZmYtYnk6IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CistLS0KKyAzcmRwYXJ0eS9jYXJvdGVuZS9DTWFrZUxpc3RzLnR4dCAgICAgfCA4ICsrKysrKy0tCisgM3JkcGFydHkvY2Fyb3RlbmUvaGFsL0NNYWtlTGlzdHMudHh0IHwgNyArKysrKystCisgMiBmaWxlcyBjaGFuZ2VkLCAxMiBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvM3JkcGFydHkvY2Fyb3RlbmUvQ01ha2VMaXN0cy50eHQgYi8zcmRwYXJ0eS9jYXJvdGVuZS9DTWFrZUxpc3RzLnR4dAoraW5kZXggYmZhOTM2OGQ3OS4uMWM0M2I4NWIyOCAxMDA2NDQKKy0tLSBhLzNyZHBhcnR5L2Nhcm90ZW5lL0NNYWtlTGlzdHMudHh0CisrKysgYi8zcmRwYXJ0eS9jYXJvdGVuZS9DTWFrZUxpc3RzLnR4dAorQEAgLTIwLDggKzIwLDEyIEBAIGlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDKQorICAgICAjIC0gbWF0Y2hUZW1wbGF0ZSBhYm91dCA1LTEwJQorICAgICAjIC0gZ29vZEZlYXR1cmVzVG9UcmFjayAxMC0yMCUKKyAgICAgIyAtIGNvcm5lckhhcnJpcyAzMCUgZm9yIHNvbWUgY2FzZXMKKy0KKy0gICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7Y2Fyb3RlbmVfc291cmNlc30gQ09NUElMRV9GTEFHUyAiLS1wYXJhbSBpcGNwLXVuaXQtZ3Jvd3RoPTEwMDAwMCAtLXBhcmFtIGlubGluZS11bml0LWdyb3d0aD0xMDAwMDAgLS1wYXJhbSBsYXJnZS1zdGFjay1mcmFtZS1ncm93dGg9NTAwMCIpCisrICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke2Nhcm90ZW5lX3NvdXJjZXN9IENPTVBJTEVfRkxBR1MgIi0tcGFyYW0gaW5saW5lLXVuaXQtZ3Jvd3RoPTEwMDAwMCAtLXBhcmFtIGxhcmdlLXN0YWNrLWZyYW1lLWdyb3d0aD01MDAwIikKKysgICAgaWYoQ01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT04gVkVSU0lPTl9MRVNTICIxMC4wLjAiKQorKwkgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7Y2Fyb3RlbmVfc291cmNlc30gQ09NUElMRV9GTEFHUyAiLS1wYXJhbSBpcGNwLXVuaXQtZ3Jvd3RoPTEwMDAwMCAke0NPTVBJTEVfRkxBR1N9IikKKysgICAgZWxzZSgpCisrCSAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtjYXJvdGVuZV9zb3VyY2VzfSBDT01QSUxFX0ZMQUdTICItLXBhcmFtIGlwYS1jcC11bml0LWdyb3d0aD0xMDAwMDAgJHtDT01QSUxFX0ZMQUdTfSIpCisrICAgIGVuZGlmKCkKKyBlbmRpZigpCisgCisgYWRkX2xpYnJhcnkoY2Fyb3RlbmVfb2JqcyBPQkpFQ1QKK2RpZmYgLS1naXQgYS8zcmRwYXJ0eS9jYXJvdGVuZS9oYWwvQ01ha2VMaXN0cy50eHQgYi8zcmRwYXJ0eS9jYXJvdGVuZS9oYWwvQ01ha2VMaXN0cy50eHQKK2luZGV4IGM0YjlhY2FlZGQuLmJiYzViMTFhODAgMTAwNjQ0CistLS0gYS8zcmRwYXJ0eS9jYXJvdGVuZS9oYWwvQ01ha2VMaXN0cy50eHQKKysrKyBiLzNyZHBhcnR5L2Nhcm90ZW5lL2hhbC9DTWFrZUxpc3RzLnR4dAorQEAgLTkwLDcgKzkwLDEyIEBAIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5EIFBST1BFUlRZIENPTVBJTEVfREVGSU5JVElPTlMgJHtjYXJvdGVuZV9kZWZzfSkKKyAgICAgIyAgIG1hdGNoVGVtcGxhdGUgYWJvdXQgNS0xMCUKKyAgICAgIyAgIGdvb2RGZWF0dXJlc1RvVHJhY2sgMTAtMjAlCisgICAgICMgICBjb3JuZXJIYXJyaXMgMzAlIGZvciBzb21lIGNhc2VzCistICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhpbXBsLmNwcCAkPFRBUkdFVF9PQkpFQ1RTOmNhcm90ZW5lX29ianM+IENPTVBJTEVfRkxBR1MgIi0tcGFyYW0gaXBjcC11bml0LWdyb3d0aD0xMDAwMDAgLS1wYXJhbSBpbmxpbmUtdW5pdC1ncm93dGg9MTAwMDAwIC0tcGFyYW0gbGFyZ2Utc3RhY2stZnJhbWUtZ3Jvd3RoPTUwMDAiKQorKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoaW1wbC5jcHAgJDxUQVJHRVRfT0JKRUNUUzpjYXJvdGVuZV9vYmpzPiBDT01QSUxFX0ZMQUdTICItLXBhcmFtIGlubGluZS11bml0LWdyb3d0aD0xMDAwMDAgLS1wYXJhbSBsYXJnZS1zdGFjay1mcmFtZS1ncm93dGg9NTAwMCIpCisrICAgIGlmKENNQUtFX0NYWF9DT01QSUxFUl9WRVJTSU9OIFZFUlNJT05fTEVTUyAiMTAuMC4wIikKKysgICAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoaW1wbC5jcHAgJDxUQVJHRVRfT0JKRUNUUzpjYXJvdGVuZV9vYmpzPiBDT01QSUxFX0ZMQUdTICItLXBhcmFtIGlwY3AtdW5pdC1ncm93dGg9MTAwMDAwICR7Q09NUElMRV9GTEFHU30iKQorKyAgICBlbHNlKCkKKysgICAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoaW1wbC5jcHAgJDxUQVJHRVRfT0JKRUNUUzpjYXJvdGVuZV9vYmpzPiBDT01QSUxFX0ZMQUdTICItLXBhcmFtIGlwYS1jcC11bml0LWdyb3d0aD0xMDAwMDAgJHtDT01QSUxFX0ZMQUdTfSIpCisrICAgIGVuZGlmKCkKKyAjICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhpbXBsLmNwcCAkPFRBUkdFVF9PQkpFQ1RTOmNhcm90ZW5lX29ianM+IENPTVBJTEVfRkxBR1MgIi0tcGFyYW0gaXBjcC11bml0LWdyb3d0aD0xMDAwMDAgLS1wYXJhbSBpbmxpbmUtdW5pdC1ncm93dGg9MTAwMDAwIC0tcGFyYW0gbGFyZ2Utc3RhY2stZnJhbWUtZ3Jvd3RoPTUwMDAiKQorICAgZW5kaWYoKQorIAorLS0gCisyLjI1LjAKKwpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3BlbmN2L29wZW5jdl80LjEuMC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5jdi9vcGVuY3ZfNC4xLjAuYmIKaW5kZXggZjY3OWNjYi4uZDc4MWRhNiAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3BlbmN2L29wZW5jdl80LjEuMC5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuY3Yvb3BlbmN2XzQuMS4wLmJiCkBAIC00OCw2ICs0OCw3IEBACiAgICAgICAgICAgIGZpbGU6Ly8wMDAzLVRvLWZpeC1lcnJvcnMtYXMtZm9sbG93aW5nLnBhdGNoIFwKICAgICAgICAgICAgZmlsZTovLzAwMDEtVGVtcG9yYXJsaXktd29yay1hcm91bmQtZGVwcmVjYXRlZC1mZm1wZWctUkFXLWZ1bmN0aS5wYXRjaCBcCiAgICAgICAgICAgIGZpbGU6Ly8wMDAxLURvbnQtdXNlLWlzeXN0ZW0ucGF0Y2ggXAorICAgICAgICAgICBmaWxlOi8vMDAwMS1jYXJvdGVuZS1SZXBsYWNlLWlwY3AtdW5pdC1ncm93dGgtd2l0aC1pcGEtY3AtdW5pdC1nLnBhdGNoIFwKICAgICAgICAgICAgZmlsZTovL2Rvd25sb2FkLnBhdGNoIFwKICAgICAgICAgICAgIgogUFYgPSAiNC4xLjAiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuc2Mvb3BlbnNjLzAwMDEtRml4LW1pc2xlYWRpbmctY29kZS1pbmRlbnRhdGlvbi5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5zYy9vcGVuc2MvMDAwMS1GaXgtbWlzbGVhZGluZy1jb2RlLWluZGVudGF0aW9uLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjcxYjlkLi4wMDAwMDAwCi0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5zYy9vcGVuc2MvMDAwMS1GaXgtbWlzbGVhZGluZy1jb2RlLWluZGVudGF0aW9uLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotRnJvbSAyODM1Nzg1MTllYzgzYTg3OTJiMDI2YzEwMzIyNzg5Nzg0ZDYyOWRlIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQotRnJvbTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KLURhdGU6IEZyaSwgMjcgRGVjIDIwMTkgMTE6MzM6NTcgLTA4MDAKLVN1YmplY3Q6IFtQQVRDSF0gRml4IG1pc2xlYWRpbmcgY29kZSBpbmRlbnRhdGlvbgotCi1GaXhlcwotZXJyb3I6IG1pc2xlYWRpbmcgaW5kZW50YXRpb247IHN0YXRlbWVudCBpcyBub3QgcGFydCBvZiB0aGUgcHJldmlvdXMgJ2lmJyBbLVdlcnJvciwtV21pc2xlYWRpbmctaW5kZW50YXRpb25dCi0gICAgICAgICBpZihjaXBoZXIpCi0gICAgICAgICBeCi0uLi8uLi8uLi9naXQvc3JjL2xpYm9wZW5zYy9jYXJkLWVudGVyc2FmZS5jOjM2OToyOiBub3RlOiBwcmV2aW91cyBzdGF0ZW1lbnQgaXMgaGVyZQotICAgICAgICBpZihzYnVmKQotICAgICAgICBeCi1VcHN0cmVhbS1TdGF0dXM6IFN1Ym1pdHRlZCBbaHR0cHM6Ly9naXRodWIuY29tL09wZW5TQy9PcGVuU0MvcHVsbC8xODk0XQotU2lnbmVkLW9mZi1ieTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KLS0tLQotIHNyYy9saWJvcGVuc2MvY2FyZC1lbnRlcnNhZmUuYyB8IDEyICsrKysrKy0tLS0tLQotIHNyYy90b29scy9wa2NzMTUtaW5pdC5jICAgICAgICB8ICA0ICsrLS0KLSAyIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKLQotZGlmZiAtLWdpdCBhL3NyYy9saWJvcGVuc2MvY2FyZC1lbnRlcnNhZmUuYyBiL3NyYy9saWJvcGVuc2MvY2FyZC1lbnRlcnNhZmUuYwotaW5kZXggM2U0MmMxMWYuLmFiYjlmZDgxIDEwMDY0NAotLS0tIGEvc3JjL2xpYm9wZW5zYy9jYXJkLWVudGVyc2FmZS5jCi0rKysgYi9zcmMvbGlib3BlbnNjL2NhcmQtZW50ZXJzYWZlLmMKLUBAIC0zNTIsMTAgKzM1MiwxMCBAQCBzdGF0aWMgaW50IGVudGVyc2FmZV90cmFuc21pdF9hcGR1KHNjX2NhcmRfdCAqY2FyZCwgc2NfYXBkdV90ICphcGR1LAotIAkgc2l6ZV90IGNpcGhlcl9kYXRhX3NpemUsbWFjX2RhdGFfc2l6ZTsKLSAJIGludCBibG9ja3M7Ci0gCSBpbnQgcj1TQ19TVUNDRVNTOwotLQl1OCAqc2J1Zj1OVUxMOwotLQlzaXplX3Qgc3NpemU9MDsKLSsJIHU4ICpzYnVmPU5VTEw7Ci0rCSBzaXplX3Qgc3NpemU9MDsKLSAKLS0JU0NfRlVOQ19DQUxMRUQoY2FyZC0+Y3R4LCBTQ19MT0dfREVCVUdfVkVSQk9TRSk7Ci0rCSBTQ19GVU5DX0NBTExFRChjYXJkLT5jdHgsIFNDX0xPR19ERUJVR19WRVJCT1NFKTsKLSAKLSAJIGFzc2VydChjYXJkKTsKLSAJIGFzc2VydChhcGR1KTsKLUBAIC0zNjMsMTAgKzM2MywxMCBAQCBzdGF0aWMgaW50IGVudGVyc2FmZV90cmFuc21pdF9hcGR1KHNjX2NhcmRfdCAqY2FyZCwgc2NfYXBkdV90ICphcGR1LAotIAkgaWYoKGNpcGhlcnx8bWFjKSAmJiAoIWtleXx8KGtleWxlbiE9OCAmJiBrZXlsZW4hPTE2KSkpCi0gCQkgIFNDX0ZVTkNfUkVUVVJOKGNhcmQtPmN0eCwgU0NfTE9HX0RFQlVHX1ZFUkJPU0UsIFNDX0VSUk9SX0lOVkFMSURfQVJHVU1FTlRTKTsKLSAKLS0JciA9IHNjX2FwZHVfZ2V0X29jdGV0cyhjYXJkLT5jdHgsIGFwZHUsICZzYnVmLCAmc3NpemUsIFNDX1BST1RPX1JBVyk7Ci0tCWlmIChyID09IFNDX1NVQ0NFU1MpCi0rCSByID0gc2NfYXBkdV9nZXRfb2N0ZXRzKGNhcmQtPmN0eCwgYXBkdSwgJnNidWYsICZzc2l6ZSwgU0NfUFJPVE9fUkFXKTsKLSsJIGlmIChyID09IFNDX1NVQ0NFU1MpCi0gCQlzY19hcGR1X2xvZyhjYXJkLT5jdHgsIFNDX0xPR19ERUJVR19WRVJCT1NFLCBzYnVmLCBzc2l6ZSwgMSk7Ci0tCWlmKHNidWYpCi0rCSBpZihzYnVmKQotIAkJZnJlZShzYnVmKTsKLSAKLSAJIGlmKGNpcGhlcikKLWRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGtjczE1LWluaXQuYyBiL3NyYy90b29scy9wa2NzMTUtaW5pdC5jCi1pbmRleCAxY2U3OWY0NS4uOWE3MzEyMWMgMTAwNjQ0Ci0tLS0gYS9zcmMvdG9vbHMvcGtjczE1LWluaXQuYwotKysrIGIvc3JjL3Rvb2xzL3BrY3MxNS1pbml0LmMKLUBAIC0yMzExLDggKzIzMTEsOCBAQCBkb19yZWFkX3ByaXZhdGVfa2V5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpmb3JtYXQsCi0gCQkJciA9IHV0aWxfZ2V0cGFzcygmcGFzc3BocmFzZSwgJmxlbiwgc3RkaW4pOwotIAkJCWlmIChyIDwgMCB8fCAhcGFzc3BocmFzZSkKLSAJCQkJcmV0dXJuIFNDX0VSUk9SX0lOVEVSTkFMOwotLSAJCQlyID0gZG9fcmVhZF9wa2NzMTJfcHJpdmF0ZV9rZXkoZmlsZW5hbWUsCi0tIAkJCQkJcGFzc3BocmFzZSwgcGssIGNlcnRzLCBtYXhfY2VydHMpOwotKwkJCXIgPSBkb19yZWFkX3BrY3MxMl9wcml2YXRlX2tleShmaWxlbmFtZSwKLSsJCQkJCXBhc3NwaHJhc2UsIHBrLCBjZXJ0cywgbWF4X2NlcnRzKTsKLSAJCX0KLSAJfSBlbHNlIHsKLSAJCXV0aWxfZXJyb3IoIkVycm9yIHdoZW4gcmVhZGluZyBwcml2YXRlIGtleS4gIgotLS0gCi0yLjI0LjEKLQpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3BlbnNjL29wZW5zYy8wMDAxLVJlbW92ZS1yZWR1bmRhbnQtbG9nZ2luZy5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5zYy9vcGVuc2MvMDAwMS1SZW1vdmUtcmVkdW5kYW50LWxvZ2dpbmcucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MWYxYTIuLjAwMDAwMDAKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3BlbnNjL29wZW5zYy8wMDAxLVJlbW92ZS1yZWR1bmRhbnQtbG9nZ2luZy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUZyb20gYzAxMmY0Njk2NWIzZmUyNGUzMTM2Nzc5NmU1MmMyZDBiMTRjYTVkOSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+Ci1EYXRlOiBNb24sIDE3IERlYyAyMDE4IDE4OjQ0OjIzIC0wODAwCi1TdWJqZWN0OiBbUEFUQ0hdIFJlbW92ZSByZWR1bmRhbnQgbG9nZ2luZwotCi1TYW1lIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgYSBmZXcgbGluZSBiZWxvdyBpbiBzYW1lIGZ1bmN0aW9uLCB0aGUgb25seQotZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXJlIGl0IHRha2VzIGNhcmUgb2YgY2FzZSB3aGVuIGxhYmVsIGlzIE5VTEwgcG9pbnRlcgotdW5saWtlIHRoaXMgbGluZQotCi1zZWNvbmRseSwgZXZlcnkgZnVuY3Rpb24gY2FsbCB0byBjb3NtX3dyaXRlX3Rva2VuaW5mbygpIGluIHRoaXMgZmlsZQotcGFzc2VzIGxhYmVsPU5VTEwsIGFuZCB0aGVuIGl0IHRyaWVzIHRvIHByaW50IGEgbnVsbCBwb2ludGVyCi0KLUZpeGVzIGVycm9ycyBsaWtlCi1zcmMvbGlib3BlbnNjL2xvZy5oOjQ4OjQ3OiBlcnJvcjogJyVzJyBkaXJlY3RpdmUgYXJndW1lbnQgaXMgbnVsbAotWy1XZXJyb3I9Zm9ybWF0LW92ZXJmbG93PV0KLQotVXBzdHJlYW0tU3RhdHVzOiBTdWJtaXR0ZWQgW2h0dHBzOi8vZ2l0aHViLmNvbS9PcGVuU0MvT3BlblNDL3B1bGwvMTU1N10KLVNpZ25lZC1vZmYtYnk6IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+Ci0tLS0KLSBzcmMvcGtjczE1aW5pdC9wa2NzMTUtb2JlcnRodXIuYyB8IDEgLQotIDEgZmlsZSBjaGFuZ2VkLCAxIGRlbGV0aW9uKC0pCi0KLUluZGV4OiBnaXQvc3JjL3BrY3MxNWluaXQvcGtjczE1LW9iZXJ0aHVyLmMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLSBnaXQub3JpZy9zcmMvcGtjczE1aW5pdC9wa2NzMTUtb2JlcnRodXIuYwotKysrIGdpdC9zcmMvcGtjczE1aW5pdC9wa2NzMTUtb2JlcnRodXIuYwotQEAgLTcwLDcgKzcwLDYgQEAgY29zbV93cml0ZV90b2tlbmluZm8gKHN0cnVjdCBzY19wa2NzMTVfYwotIAljdHggPSBwMTVjYXJkLT5jYXJkLT5jdHg7Ci0gCi0gCVNDX0ZVTkNfQ0FMTEVEKGN0eCwgU0NfTE9HX0RFQlVHX1ZFUkJPU0UpOwotLQlzY19kZWJ1ZyhjdHgsIFNDX0xPR19ERUJVR19OT1JNQUwsICJjb3NtX3dyaXRlX3Rva2VuaW5mbygpIGxhYmVsICclcyc7IGZsYWdzIDB4JVgiLCBsYWJlbCwgZmxhZ3MpOwotIAlpZiAoc2NfcHJvZmlsZV9nZXRfZmlsZShwcm9maWxlLCBDT1NNX1RJVExFIi10b2tlbi1pbmZvIiwgJmZpbGUpKSB7Ci0gCQlydiA9IFNDX0VSUk9SX0lOQ09OU0lTVEVOVF9QUk9GSUxFOwotIAkJU0NfVEVTVF9HT1RPX0VSUihjdHgsIFNDX0xPR19ERUJVR19OT1JNQUwsIHJ2LCAiQ2Fubm90IGZpbmQgIkNPU01fVElUTEUiLXRva2VuLWluZm8iKTsKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5zYy9vcGVuc2NfMC4xOS4wLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3BlbnNjL29wZW5zY18wLjIwLjAuYmIKc2ltaWxhcml0eSBpbmRleCA4OCUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3BlbnNjL29wZW5zY18wLjE5LjAuYmIKcmVuYW1lIHRvIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5zYy9vcGVuc2NfMC4yMC4wLmJiCmluZGV4IDBkNzQ0ZTIuLmE4MTU5ODAgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5zYy9vcGVuc2NfMC4xOS4wLmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5zYy9vcGVuc2NfMC4yMC4wLmJiCkBAIC0xMiwxMCArMTIsOCBAQAogTElDX0ZJTEVTX0NIS1NVTSA9ICJmaWxlOi8vQ09QWUlORzttZDU9N2ZiYzMzODMwOWFjMzhmZWZjZDY0YjA0YmI5MDNlMzQiCiAKICN2MC4xOS4wCi1TUkNSRVYgPSAiZjE2OTFmYzkxZmMxMTMxOTFjM2E4YWFmNWZhY2Q2OTgzMzM0ZWM0NyIKK1NSQ1JFViA9ICI0NWUyOTA1NmNjZGU0MjJlNzBlZDM1ODUwODRhN2YxNTBjNjMyNTE1IgogU1JDX1VSSSA9ICJnaXQ6Ly9naXRodWIuY29tL09wZW5TQy9PcGVuU0MgXAotICAgICAgICAgICBmaWxlOi8vMDAwMS1SZW1vdmUtcmVkdW5kYW50LWxvZ2dpbmcucGF0Y2ggXAotICAgICAgICAgICBmaWxlOi8vMDAwMS1GaXgtbWlzbGVhZGluZy1jb2RlLWluZGVudGF0aW9uLnBhdGNoIFwKICAgICAgICAgICAiCiBERVBFTkRTID0gInZpcnR1YWwvbGliaWNvbnYgb3BlbnNzbCIKIApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvcGNzYy1saXRlL3Bjc2MtbGl0ZV8xLjguMjUuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9wY3NjLWxpdGUvcGNzYy1saXRlXzEuOC4yNi5iYgpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9wY3NjLWxpdGUvcGNzYy1saXRlXzEuOC4yNS5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvcGNzYy1saXRlL3Bjc2MtbGl0ZV8xLjguMjYuYmIKaW5kZXggNjg2OWUyYy4uNWU2MDg0NiAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvcGNzYy1saXRlL3Bjc2MtbGl0ZV8xLjguMjUuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvcGNzYy1saXRlL3Bjc2MtbGl0ZV8xLjguMjYuYmIKQEAgLTExLDggKzExLDggQEAKIExJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovL0NPUFlJTkc7bWQ1PTYyOGMwMWJhOTg1ZWNmYTIxNjc3ZjVlZTJkNTIwMmY2IgogCiBTUkNfVVJJID0gImh0dHBzOi8vcGNzY2xpdGUuYXBkdS5mci9maWxlcy8ke0JQfS50YXIuYnoyIgotU1JDX1VSSVttZDVzdW1dID0gImMyMDY1MGEzNjA2MmFiMTY4OWYzN2YzMzAyYzk4OGYyIgotU1JDX1VSSVtzaGEyNTZzdW1dID0gImQ3NmQ3OWVkYzMxY2Y3NmU3ODJiOWY2OTc0MjBkM2RlZmJjYzkxNzc4YzNjNjUwNjU4MDg2YTFiNzQ4ZTg3OTIiCitTUkNfVVJJW21kNXN1bV0gPSAiOWQzNjg4Mjk5ODQ0OWRhY2VlYzI2N2M2OGEyMWZmMGQiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiM2ViN2JlN2Q2ZWY2MThjMGE0NDQzMTZjZjVjMWYyZjlkNzIyN2FlZGJhN2ExOTJmMzg5ZmUzZTdjMGRmYmJkOSIKIAogaW5oZXJpdCBhdXRvdG9vbHMgc3lzdGVtZCBwa2djb25maWcKIApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvc2Fzcy9saWJzYXNzXzMuNi4xLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvc2Fzcy9saWJzYXNzXzMuNi4zLmJiCnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Nhc3MvbGlic2Fzc18zLjYuMS5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvc2Fzcy9saWJzYXNzXzMuNi4zLmJiCmluZGV4IDQ4MGU5ODQuLmQ4OTNiZTIgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Nhc3MvbGlic2Fzc18zLjYuMS5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9zYXNzL2xpYnNhc3NfMy42LjMuYmIKQEAgLTYsNyArNiw3IEBACiBpbmhlcml0IGF1dG90b29scwogCiBTUkNfVVJJID0gImdpdDovL2dpdGh1Yi5jb20vc2Fzcy9saWJzYXNzLmdpdDticmFuY2g9bWFzdGVyIgotU1JDUkVWID0gIjRkMjI5YWY1NTAwYmUxMDIzODgzYzM4YzRhNjc1ZjBlZDkxOTgzOWQiCitTUkNSRVYgPSAiZTFjMTZlMDliNGE5NTM3NTdhMTUxNDlkZWFhZjI4YTNmZDgxZGM5NyIKIAogUyA9ICIke1dPUktESVJ9L2dpdCIKIApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvc3NpYXBpL3NzaWFwaV8xLjMuMC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3NzaWFwaS9zc2lhcGlfMS4zLjAuYmIKaW5kZXggZWIwODY4MS4uY2U0NmNmNSAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvc3NpYXBpL3NzaWFwaV8xLjMuMC5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9zc2lhcGkvc3NpYXBpXzEuMy4wLmJiCkBAIC0zNCwzICszNCw1IEBACiB9CiAKIFJERVBFTkRTXyR7UE59ICs9ICJtZGFkbSIKKworQ09NUEFUSUJMRV9IT1NUX3Bvd2VycGMgPSAnbnVsbCcKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Zib3hndWVzdGRyaXZlcnMvdmJveGd1ZXN0ZHJpdmVycy9leHBvcnQucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC92Ym94Z3Vlc3Rkcml2ZXJzL3Zib3hndWVzdGRyaXZlcnMvZXhwb3J0LnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmJhMzMzLi4wMDAwMDAwCi0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Zib3hndWVzdGRyaXZlcnMvdmJveGd1ZXN0ZHJpdmVycy9leHBvcnQucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1JbmRleDogc3JjL1ZCb3gvQWRkaXRpb25zL2xpbnV4L2V4cG9ydF9tb2R1bGVzLnNoCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0gYS9zcmMvVkJveC9BZGRpdGlvbnMvbGludXgvZXhwb3J0X21vZHVsZXMuc2gKLSsrKyBiL3NyYy9WQm94L0FkZGl0aW9ucy9saW51eC9leHBvcnRfbW9kdWxlcy5zaAotQEAgLTQ2LDcgKzQ2LDEzIEBACi0gVkJPWF9WRVJTSU9OX01BSk9SPWBzZWQgLWUgInMvXiAqVkJPWF9WRVJTSU9OX01BSk9SICo9IFwrXChbMC05XVwrXCkvXDEvO3Q7ZCIgJFBBVEhfUk9PVC9WZXJzaW9uLmtta2AKLSBWQk9YX1ZFUlNJT05fTUlOT1I9YHNlZCAtZSAicy9eICpWQk9YX1ZFUlNJT05fTUlOT1IgKj0gXCtcKFswLTldXCtcKS9cMS87dDtkIiAkUEFUSF9ST09UL1ZlcnNpb24ua21rYAotIFZCT1hfVkVSU0lPTl9CVUlMRD1gc2VkIC1lICJzL14gKlZCT1hfVkVSU0lPTl9CVUlMRCAqPSBcK1woWzAtOV1cK1wpL1wxLzt0O2QiICRQQVRIX1JPT1QvVmVyc2lvbi5rbWtgCi0tVkJPWF9TVk5fUkVWPWBzZWQgLWUgJ3MvXiAqVkJPWF9TVk5fUkVWX0ZBTExCQUNLICo6PSBcK1wkKHBhdHN1YnN0IColOiwsICpcJFJldjogKlwoWzAtOV1cK1wpICpcJCAqKSAqL1wxLzt0O2QnICRQQVRIX1JPT1QvQ29uZmlnLmtta2AKLStWQk9YX1NWTl9DT05GSUdfUkVWPWBzZWQgLWUgJ3MvXiAqVkJPWF9TVk5fUkVWX0NPTkZJR19GQUxMQkFDSyAqOj0gXCtcJChwYXRzdWJzdCAqJTosLCAqXCRSZXY6ICpcKFswLTldXCtcKSAqXCQgKikgKi9cMS87dDtkJyAkUEFUSF9ST09UL0NvbmZpZy5rbWtgCi0rVkJPWF9TVk5fVkVSU0lPTl9SRVY9YHNlZCAtZSAncy9eICpWQk9YX1NWTl9SRVZfVkVSU0lPTl9GQUxMQkFDSyAqOj0gXCtcJChwYXRzdWJzdCAqJTosLCAqXCRSZXY6ICpcKFswLTldXCtcKSAqXCQgKikgKi9cMS87dDtkJyAkUEFUSF9ST09UL1ZlcnNpb24ua21rYAotK2lmIFsgIiRWQk9YX1NWTl9DT05GSUdfUkVWIiAtZ3QgIiRWQk9YX1NWTl9WRVJTSU9OX1JFViIgXTsgdGhlbgotKyAgICBWQk9YX1NWTl9SRVY9JFZCT1hfU1ZOX0NPTkZJR19SRVYKLStlbHNlCi0rICAgIFZCT1hfU1ZOX1JFVj0kVkJPWF9TVk5fVkVSU0lPTl9SRVYKLStmaQotIFZCT1hfVkVORE9SPWBzZWQgLWUgJ3MvXiAqVkJPWF9WRU5ET1IgKj0gXCtcKC5cK1wpL1wxLzt0O2QnICRQQVRIX1JPT1QvQ29uZmlnLmtta2AKLSBWQk9YX1ZFTkRPUl9TSE9SVD1gc2VkIC1lICdzL14gKlZCT1hfVkVORE9SX1NIT1JUICo9IFwrXCguXCtcKS9cMS87dDtkJyAkUEFUSF9ST09UL0NvbmZpZy5rbWtgCi0gVkJPWF9QUk9EVUNUPWBzZWQgLWUgJ3MvXiAqVkJPWF9QUk9EVUNUICo9IFwrXCguXCtcKS9cMS87dDtkJyAkUEFUSF9ST09UL0NvbmZpZy5rbWtgCi1JbmRleDogc3JjL1ZCb3gvSG9zdERyaXZlcnMvbGludXgvZXhwb3J0X21vZHVsZXMuc2gKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLSBhL3NyYy9WQm94L0hvc3REcml2ZXJzL2xpbnV4L2V4cG9ydF9tb2R1bGVzLnNoCi0rKysgYi9zcmMvVkJveC9Ib3N0RHJpdmVycy9saW51eC9leHBvcnRfbW9kdWxlcy5zaAotQEAgLTEwMCwxMiArMTAwLDI2IEBACi0gVkJPWF9WRVJTSU9OX01JTk9SPWBzZWQgLWUgInMvXiAqVkJPWF9WRVJTSU9OX01JTk9SICo9IFwrXChbMC05XVwrXCkvXDEvO3Q7ZCIgJFBBVEhfUk9PVC9WZXJzaW9uLmtta2AKLSBWQk9YX1ZFUlNJT05fQlVJTEQ9YHNlZCAtZSAicy9eICpWQk9YX1ZFUlNJT05fQlVJTEQgKj0gXCtcKFswLTldXCtcKS9cMS87dDtkIiAkUEFUSF9ST09UL1ZlcnNpb24ua21rYAotIFZCT1hfVkVSU0lPTl9TVFJJTkc9JFZCT1hfVkVSU0lPTl9NQUpPUi4kVkJPWF9WRVJTSU9OX01JTk9SLiRWQk9YX1ZFUlNJT05fQlVJTEQKLS1WQk9YX1NWTl9SRVY9YHNlZCAtZSAncy9eICpWQk9YX1NWTl9SRVZfRkFMTEJBQ0sgKjo9IFwrXCQocGF0c3Vic3QgKiU6LCwgKlwkUmV2OiAqXChbMC05XVwrXCkgKlwkICopICovXDEvO3Q7ZCcgJFBBVEhfUk9PVC9Db25maWcua21rYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkJPWF9WRU5ET1I9YHNlZCAtZSAncy9eICpWQk9YX1ZFTkRPUiAqPSBcK1woLlwrXCkvXDEvO3Q7ZCcgJFBBVEhfUk9PVC9Db25maWcua21rYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQk9YX1ZFTkRPUl9TSE9SVD1gc2VkIC1lICdzL14gKlZCT1hfVkVORE9SX1NIT1JUICo9IFwrXCguXCtcKS9cMS87dDtkJyAkUEFUSF9ST09UL0NvbmZpZy5rbWtgICAgICAgICAgICAgICAgICAgICAgICAgIFZCT1hfUFJPRFVDVD1gc2VkIC1lICdzL14gKlZCT1hfUFJPRFVDVCAqPSBcK1woLlwrXCkvXDEvO3Q7ZCcgJFBBVEhfUk9PVC9Db25maWcua21rYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkJPWF9DX1lFQVI9YGRhdGUgKyVZYAotK1ZCT1hfVkVSU0lPTl9CVUlMRD1gc2VkIC1lICJzL14gKlZCT1hfVkVSU0lPTl9CVUlMRCAqPSBcK1woWzAtOV1cK1wpL1wxLzt0O2QiICRQQVRIX1JPT1QvVmVyc2lvbi5rbWtgCi0rVkJPWF9TVk5fQ09ORklHX1JFVj1gc2VkIC1lICdzL14gKlZCT1hfU1ZOX1JFVl9DT05GSUdfRkFMTEJBQ0sgKjo9IFwrXCQocGF0c3Vic3QgKiU6LCwgKlwkUmV2OiAqXChbMC05XVwrXCkgKlwkICopICovXDEvO3Q7ZCcgJFBBVEhfUk9PVC9Db25maWcua21rYAotK1ZCT1hfU1ZOX1ZFUlNJT05fUkVWPWBzZWQgLWUgJ3MvXiAqVkJPWF9TVk5fUkVWX1ZFUlNJT05fRkFMTEJBQ0sgKjo9IFwrXCQocGF0c3Vic3QgKiU6LCwgKlwkUmV2OiAqXChbMC05XVwrXCkgKlwkICopICovXDEvO3Q7ZCcgJFBBVEhfUk9PVC9WZXJzaW9uLmtta2AKLStpZiBbICIkVkJPWF9TVk5fQ09ORklHX1JFViIgLWd0ICIkVkJPWF9TVk5fVkVSU0lPTl9SRVYiIF07IHRoZW4KLSsgICAgVkJPWF9TVk5fUkVWPSRWQk9YX1NWTl9DT05GSUdfUkVWCi0rZWxzZQotKyAgICBWQk9YX1NWTl9SRVY9JFZCT1hfU1ZOX1ZFUlNJT05fUkVWCi0rZmkKLStWQk9YX1ZFTkRPUj1gc2VkIC1lICdzL14gKlZCT1hfVkVORE9SICo9IFwrXCguXCtcKS9cMS87dDtkJyAkUEFUSF9ST09UL0NvbmZpZy5rbWtgCi0rVkJPWF9WRU5ET1JfU0hPUlQ9YHNlZCAtZSAncy9eICpWQk9YX1ZFTkRPUl9TSE9SVCAqPSBcK1woLlwrXCkvXDEvO3Q7ZCcgJFBBVEhfUk9PVC9Db25maWcua21rYAotK1ZCT1hfUFJPRFVDVD1gc2VkIC1lICdzL14gKlZCT1hfUFJPRFVDVCAqPSBcK1woLlwrXCkvXDEvO3Q7ZCcgJFBBVEhfUk9PVC9Db25maWcua21rYAotK1ZCT1hfQ19ZRUFSPWBkYXRlICslWWAKLStWQk9YX1dJVEhfUENJX1BBU1NUSFJPVUdIPWBzZWQgLWUgInMvXiAqVkJPWF9XSVRIX1BDSV9QQVNTVEhST1VHSCAqPSAqXCgxXD9cKS9cMS87dDtkIiAkUEFUSF9ST09UL0NvbmZpZy5rbWtgCi0gCi0gLiAkUEFUSF9WQk9YRFJWL2xpbnV4L2ZpbGVzX3Zib3hkcnYKLSAuICRQQVRIX1ZCT1hORVQvbGludXgvZmlsZXNfdmJveG5ldGZsdAotIC4gJFBBVEhfVkJPWEFEUC9saW51eC9maWxlc192Ym94bmV0YWRwCi0tLiAkUEFUSF9WQk9YUENJL2xpbnV4L2ZpbGVzX3Zib3hwY2kKLStpZiBbICIkVkJPWF9XSVRIX1BDSV9QQVNTVEhST1VHSCIgLWVxICIxIiBdOyB0aGVuCi0rICAgIC4gJFBBVEhfVkJPWFBDSS9saW51eC9maWxlc192Ym94cGNpCi0rZmkKLSAKLSAjIFRlbXBvcmFyeSBwYXRoIGZvciBjcmVhdGluZyB0aGUgbW9kdWxlcywgd2lsbCBiZSByZW1vdmVkIGxhdGVyCi0gcm0gLXJmICIkUEFUSF9UTVAiCi1AQCAtMTg3LDE0ICsyMDEsMTYgQEAKLSBmaQotIAotICMgdmJveHBjaSAoVmlydHVhbEJveCBob3N0IFBDSSBhY2Nlc3Mga2VybmVsIG1vZHVsZSkKLS1ta2RpciAkUEFUSF9UTVAvdmJveHBjaSB8fCBleGl0IDEKLS1mb3IgZiBpbiAkVkJPWF9WQk9YUENJX1NPVVJDRVM7IGRvCi0tICAgIGluc3RhbGwgLUQgLW0gMDY0NCBgZWNobyAkZnxjdXQgLWQnPScgLWYxYCAiJFBBVEhfVE1QL3Zib3hwY2kvYGVjaG8gJGZ8Y3V0IC1kJz4nIC1mMmAiCi0tZG9uZQotLWlmIFsgLW4gIiRWQk9YX1dJVEhfSEFSREVOSU5HIiBdOyB0aGVuCi0tICAgIGNhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBBVEhfVkJPWFBDSS9saW51eC9NYWtlZmlsZSA+ICRQQVRIX1RNUC92Ym94cGNpL01ha2VmaWxlCi0tZWxzZQotLSAgICBzZWQgLWUgInM7VkJPWF9XSVRIX0hBUkRFTklORzs7ZyIgPCAkUEFUSF9WQk9YUENJL2xpbnV4L01ha2VmaWxlID4gJFBBVEhfVE1QL3Zib3hwY2kvTWFrZWZpbGUKLStpZiBbICIkVkJPWF9XSVRIX1BDSV9QQVNTVEhST1VHSCIgLWVxICIxIiBdOyB0aGVuCi0rICAgIG1rZGlyICRQQVRIX1RNUC92Ym94cGNpIHx8IGV4aXQgMQotKyAgICBmb3IgZiBpbiAkVkJPWF9WQk9YUENJX1NPVVJDRVM7IGRvCi0rICAgICAgICBpbnN0YWxsIC1EIC1tIDA2NDQgYGVjaG8gJGZ8Y3V0IC1kJz0nIC1mMWAgIiRQQVRIX1RNUC92Ym94cGNpL2BlY2hvICRmfGN1dCAtZCc+JyAtZjJgIgotKyAgICBkb25lCi0rICAgIGlmIFsgLW4gIiRWQk9YX1dJVEhfSEFSREVOSU5HIiBdOyB0aGVuCi0rICAgICAgICBjYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQQVRIX1ZCT1hQQ0kvbGludXgvTWFrZWZpbGUgPiAkUEFUSF9UTVAvdmJveHBjaS9NYWtlZmlsZQotKyAgICBlbHNlCi0rICAgICAgICBzZWQgLWUgInM7VkJPWF9XSVRIX0hBUkRFTklORzs7ZyIgPCAkUEFUSF9WQk9YUENJL2xpbnV4L01ha2VmaWxlID4gJFBBVEhfVE1QL3Zib3hwY2kvTWFrZWZpbGUKLSsgICAgZmkKLSBmaQotIAotIGluc3RhbGwgLUQgLW0gMDY0NCAkUEFUSF9MSU5VWC9NYWtlZmlsZSAkUEFUSF9UTVAvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Zib3hndWVzdGRyaXZlcnMvdmJveGd1ZXN0ZHJpdmVyc182LjEuMC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Zib3hndWVzdGRyaXZlcnMvdmJveGd1ZXN0ZHJpdmVyc182LjEuMi5iYgpzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC92Ym94Z3Vlc3Rkcml2ZXJzL3Zib3hndWVzdGRyaXZlcnNfNi4xLjAuYmIKcmVuYW1lIHRvIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Zib3hndWVzdGRyaXZlcnMvdmJveGd1ZXN0ZHJpdmVyc182LjEuMi5iYgppbmRleCBiZTE4YjEwLi42MmMyYjUwIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC92Ym94Z3Vlc3Rkcml2ZXJzL3Zib3hndWVzdGRyaXZlcnNfNi4xLjAuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvdmJveGd1ZXN0ZHJpdmVycy92Ym94Z3Vlc3Rkcml2ZXJzXzYuMS4yLmJiCkBAIC0xMywxMCArMTMsOSBAQAogCiBTUkNfVVJJID0gImh0dHA6Ly9kb3dubG9hZC52aXJ0dWFsYm94Lm9yZy92aXJ0dWFsYm94LyR7UFZ9LyR7VkJPWF9OQU1FfS50YXIuYnoyIFwKICAgICBmaWxlOi8vTWFrZWZpbGUudXRpbHMgXAotICAgIGZpbGU6Ly9leHBvcnQucGF0Y2g7cGF0Y2hkaXI9JHtXT1JLRElSfS8ke1ZCT1hfTkFNRX0gXAogIgotU1JDX1VSSVttZDVzdW1dID0gIjQ4NGI1NTBmNDY5MmM5ZDYxODk2YjA4YmIwYTFiZTdmIgotU1JDX1VSSVtzaGEyNTZzdW1dID0gIjQ5MDA1ZWQ5NDQ1NGY4OTNmYzM5NTVlMWUyYjk2MDdlODVjMzAwMjM1Y2I5ODNiMzlkMWRmMmNmY2YyOWYwMzkiCitTUkNfVVJJW21kNXN1bV0gPSAiZjRmNDJmZDA5ODU3NTU2YjA0YjgwM2ZiOTljYzY5MDUiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiNDMyNjU3NmU4NDI4ZWEzNjI2MTk0ZmM4MjY0NjM0NzU3NmU5NGM2MWYxMWQ0MTJhNjY5ZmM4YTEwYzJhMWU2NyIKIAogUyA9ICIke1dPUktESVJ9L3Zib3hfbW9kdWxlIgogCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC93ZWJzb2NrZXRwcC93ZWJzb2NrZXRwcC0wLjguMS8wMDAxLUNvcnJlY3QtY2xhbmctY29tcGlsZXItZmxhZ3MucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC93ZWJzb2NrZXRwcC93ZWJzb2NrZXRwcC0wLjguMS8wMDAxLUNvcnJlY3QtY2xhbmctY29tcGlsZXItZmxhZ3MucGF0Y2gKaW5kZXggNDIxNzg5Ny4uZjFkMDM3ZiAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvd2Vic29ja2V0cHAvd2Vic29ja2V0cHAtMC44LjEvMDAwMS1Db3JyZWN0LWNsYW5nLWNvbXBpbGVyLWZsYWdzLnBhdGNoCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3dlYnNvY2tldHBwL3dlYnNvY2tldHBwLTAuOC4xLzAwMDEtQ29ycmVjdC1jbGFuZy1jb21waWxlci1mbGFncy5wYXRjaApAQCAtMTgsNyArMTgsNyBAQAogaW5kZXggMmQxMzExNy4uYzE3MzU0YSAxMDA2NDQKIC0tLSBhL0NNYWtlTGlzdHMudHh0CiArKysgYi9DTWFrZUxpc3RzLnR4dAotQEAgLTE0OCw3ICsxNDgsNyBAQCBpZiAoQlVJTERfVEVTVFMgT1IgQlVJTERfRVhBTVBMRVMpCitAQCAtMTUwLDcgKzE1MCw3IEBAIGlmIChCVUlMRF9URVNUUyBPUiBCVUlMRF9FWEFNUExFUykKICAgICAgICAgIGVuZGlmKCkKICAgICAgICAgIHNldCAoV0VCU09DS0VUUFBfUExBVEZPUk1fVExTX0xJQlMgc3NsIGNyeXB0bykKICAgICAgICAgIHNldCAoV0VCU09DS0VUUFBfQk9PU1RfTElCUyBzeXN0ZW0gdGhyZWFkKQo=