ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDE0NzFkYjEuLmRhMDZiOWEgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtNzMsNiArNzMsMTEgQEAKICAgI0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGlic2VsaW51eAogICAjTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9TRUxJTlVYIC1nCiBlbmRpZiAjIEhBVkVfU0VMSU5VWAoraWZuZXEgKCQod2lsZGNhcmQgZXh0ZXJuYWwvbGlic2VsaW51eC9BbmRyb2lkLm1rKSwpCisgICAgTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC9saWJzZWxpbnV4L2luY2x1ZGUKKyAgICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYnNlbGludXgKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURIQVZFX1NFTElOVVggLWcKK2VuZGlmCiAKICMgVGhpcyBiaW5hcnkgaXMgaW4gdGhlIHJlY292ZXJ5IHJhbWRpc2ssIHdoaWNoIGlzIG90aGVyd2lzZSBhIGNvcHkgb2Ygcm9vdC4KICMgSXQgZ2V0cyBjb3BpZWQgdGhlcmUgaW4gY29uZmlnL01ha2VmaWxlLiAgTE9DQUxfTU9EVUxFX1RBR1Mgc3VwcHJlc3NlcwpAQCAtMjkzLDggKzI5OCw3IEBACiAgICAgJChMT0NBTF9QQVRIKS9hcHBseXBhdGNoL0FuZHJvaWQubWsKIAogI2luY2x1ZGVzIGZvciBUV1JQCi1pbmNsdWRlICQoY29tbWFuZHNfcmVjb3ZlcnlfbG9jYWxfcGF0aCkvbGlianBlZ3R3cnAvQW5kcm9pZC5tayBcCi0gICAgJChjb21tYW5kc19yZWNvdmVyeV9sb2NhbF9wYXRoKS9pbmplY3R0d3JwL0FuZHJvaWQubWsgXAoraW5jbHVkZSAkKGNvbW1hbmRzX3JlY292ZXJ5X2xvY2FsX3BhdGgpL2luamVjdHR3cnAvQW5kcm9pZC5tayBcCiAgICAgJChjb21tYW5kc19yZWNvdmVyeV9sb2NhbF9wYXRoKS9odGNkdW1sb2NrL0FuZHJvaWQubWsgXAogICAgICQoY29tbWFuZHNfcmVjb3ZlcnlfbG9jYWxfcGF0aCkvZ3VpL0FuZHJvaWQubWsgXAogICAgICQoY29tbWFuZHNfcmVjb3ZlcnlfbG9jYWxfcGF0aCkvbW1jdXRpbHMvQW5kcm9pZC5tayBcCmRpZmYgLS1naXQgYS9jcnlwdG8vZnNfbWdyL2ZzX21nci5jIGIvY3J5cHRvL2ZzX21nci9mc19tZ3IuYwppbmRleCBiZWJiMjUyLi4wMmYzYWM1IDEwMDY0NAotLS0gYS9jcnlwdG8vZnNfbWdyL2ZzX21nci5jCisrKyBiL2NyeXB0by9mc19tZ3IvZnNfbWdyLmMKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICogdGhlbiByZXR1cm4gYW4gZW1wdHkgYnVmZmVyLiAgVGhpcyBlZmZlY3RpdmVseSBpZ25vcmVzIGxpbmVzIHRoYXQgYXJlIHRvbyBsb25nLgogICogT24gRU9GLCByZXR1cm4gbnVsbC4KICAqLwotc3RhdGljIGNoYXIgKmdldGxpbmUoY2hhciAqYnVmLCBpbnQgc2l6ZSwgRklMRSAqZmlsZSkKK3N0YXRpYyBjaGFyICpmc19tZ3JfZ2V0bGluZShjaGFyICpidWYsIGludCBzaXplLCBGSUxFICpmaWxlKQogewogICAgIGludCBjbnQgPSAwOwogICAgIGludCBlb2YgPSAwOwpAQCAtMjQxLDcgKzI0MSw3IEBACiAgICAgfQogCiAgICAgZW50cmllcyA9IDA7Ci0gICAgd2hpbGUgKGdldGxpbmUobGluZSwgc2l6ZW9mKGxpbmUpLCBmc3RhYl9maWxlKSkgeworICAgIHdoaWxlIChmc19tZ3JfZ2V0bGluZShsaW5lLCBzaXplb2YobGluZSksIGZzdGFiX2ZpbGUpKSB7CiAgICAgICAgIC8qIGlmIHRoZSBsYXN0IGNoYXJhY3RlciBpcyBhIG5ld2xpbmUsIHNob3J0ZW4gdGhlIHN0cmluZyBieSAxIGJ5dGUgKi8KICAgICAgICAgbGVuID0gc3RybGVuKGxpbmUpOwogICAgICAgICBpZiAobGluZVtsZW4gLSAxXSA9PSAnXG4nKSB7CkBAIC0yNjgsNyArMjY4LDcgQEAKICAgICBmc2Vlayhmc3RhYl9maWxlLCAwLCBTRUVLX1NFVCk7CiAKICAgICBjbnQgPSAwOwotICAgIHdoaWxlIChnZXRsaW5lKGxpbmUsIHNpemVvZihsaW5lKSwgZnN0YWJfZmlsZSkpIHsKKyAgICB3aGlsZSAoZnNfbWdyX2dldGxpbmUobGluZSwgc2l6ZW9mKGxpbmUpLCBmc3RhYl9maWxlKSkgewogICAgICAgICAvKiBpZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgYSBuZXdsaW5lLCBzaG9ydGVuIHRoZSBzdHJpbmcgYnkgMSBieXRlICovCiAgICAgICAgIGxlbiA9IHN0cmxlbihsaW5lKTsKICAgICAgICAgaWYgKGxpbmVbbGVuIC0gMV0gPT0gJ1xuJykgewpkaWZmIC0tZ2l0IGEvZGF0YS5jcHAgYi9kYXRhLmNwcAppbmRleCA1ZmE2ODE0Li42NWY3MDZlIDEwMDY0NAotLS0gYS9kYXRhLmNwcAorKysgYi9kYXRhLmNwcApAQCAtMTA0NCw2ICsxMDQ0LDggQEAKIAlzdHJjcHkodmVyc2lvbiwgVFdfVkVSU0lPTl9TVFIpOwogCWZ3cml0ZSh2ZXJzaW9uLCBzaXplb2YodmVyc2lvblswXSksIHN0cmxlbih2ZXJzaW9uKSAvIHNpemVvZih2ZXJzaW9uWzBdKSwgZnApOwogCWZjbG9zZShmcCk7CisJVFdGdW5jOjpjb3B5X2ZpbGUoIi9ldGMvcmVjb3ZlcnkuZnN0YWIiLCAiL2NhY2hlL3JlY292ZXJ5L3JlY292ZXJ5LmZzdGFiIiwgMDY0NCk7CisJUGFydGl0aW9uTWFuYWdlci5PdXRwdXRfU3RvcmFnZV9Gc3RhYigpOwogCXN5bmMoKTsKIAlMT0dJTkZPKCJWZXJzaW9uIG51bWJlciBzYXZlZCB0byAnJXMnXG4iLCBQYXRoLmNfc3RyKCkpOwogfQpkaWZmIC0tZ2l0IGEvZXhmYXQvZHVtcC9kdW1wZXhmYXQuOCBiL2V4ZmF0L2R1bXAvZHVtcGV4ZmF0LjgKaW5kZXggMzZmYjI4YS4uN2ZlYTA2NSAxMDA2NDQKLS0tIGEvZXhmYXQvZHVtcC9kdW1wZXhmYXQuOAorKysgYi9leGZhdC9kdW1wL2R1bXBleGZhdC44CkBAIC0xMyw3ICsxMyw3IEBACiAuQiBcLXUKIF0KIFsKLS5CIFwtdgorLkIgXC1WCiBdCiAuSSBkZXZpY2UKIApAQCAtMzMsNyArMzMsNyBAQAogRHVtcCByYW5nZXMgb2YgdXNlZCBzZWN0b3JzIHN0YXJ0aW5nIGZyb20gMCBhbmQgc2VwYXJhdGVkIHdpdGggc3BhY2VzLiBNYXkgYmUKIHVzZWZ1bCBmb3IgYmFja3VwIHRvb2xzLgogLlRQCi0uQkkgXC12CisuQkkgXC1WCiBQcmludCB2ZXJzaW9uIGFuZCBjb3B5cmlnaHQuCiAKIC5TSCBFWElUIENPREVTCmRpZmYgLS1naXQgYS9leGZhdC9kdW1wL21haW4uYyBiL2V4ZmF0L2R1bXAvbWFpbi5jCmluZGV4IGZhODA5MDMuLjg2NTBkNTEgMTAwNjQ0Ci0tLSBhL2V4ZmF0L2R1bXAvbWFpbi5jCisrKyBiL2V4ZmF0L2R1bXAvbWFpbi5jCkBAIC0xNDAsMTMgKzE0MCwxMyBAQAogCiBzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyKiBwcm9nKQogewotCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstc10gWy11XSBbLXZdIDxkZXZpY2U+XG4iLCBwcm9nKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLXNdIFstdV0gWy1WXSA8ZGV2aWNlPlxuIiwgcHJvZyk7CiAJZXhpdCgxKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKIHsKLQljaGFyKiogcHA7CisJaW50IG9wdDsKIAljb25zdCBjaGFyKiBzcGVjID0gTlVMTDsKIAlib29sIHNiX29ubHkgPSBmYWxzZTsKIAlib29sIHVzZWRfc2VjdG9ycyA9IGZhbHNlOwpAQCAtMTU0LDI0ICsxNTQsMjYgQEAKIAlwcmludGYoImR1bXBleGZhdCAldS4ldS4ldVxuIiwKIAkJCUVYRkFUX1ZFUlNJT05fTUFKT1IsIEVYRkFUX1ZFUlNJT05fTUlOT1IsIEVYRkFUX1ZFUlNJT05fUEFUQ0gpOwogCi0JZm9yIChwcCA9IGFyZ3YgKyAxOyAqcHA7IHBwKyspCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgInN1ViIpKSAhPSAtMSkKIAl7Ci0JCWlmIChzdHJjbXAoKnBwLCAiLXMiKSA9PSAwKQotCQkJc2Jfb25seSA9IHRydWU7Ci0JCWVsc2UgaWYgKHN0cmNtcCgqcHAsICItdSIpID09IDApCi0JCQl1c2VkX3NlY3RvcnMgPSB0cnVlOwotCQllbHNlIGlmIChzdHJjbXAoKnBwLCAiLXYiKSA9PSAwKQorCQlzd2l0Y2ggKG9wdCkKIAkJeworCQljYXNlICdzJzoKKwkJCXNiX29ubHkgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorCQkJdXNlZF9zZWN0b3JzID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKIAkJCXB1dHMoIkNvcHlyaWdodCAoQykgMjAxMS0yMDEzICBBbmRyZXcgTmF5ZW5rbyIpOwogCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSBpZiAoc3BlYyA9PSBOVUxMKQotCQkJc3BlYyA9ICpwcDsKLQkJZWxzZQorCQlkZWZhdWx0OgogCQkJdXNhZ2UoYXJndlswXSk7CisJCX0KIAl9Ci0JaWYgKHNwZWMgPT0gTlVMTCkKKwlpZiAoYXJnYyAtIG9wdGluZCAhPSAxKQogCQl1c2FnZShhcmd2WzBdKTsKKwlzcGVjID0gYXJndltvcHRpbmRdOwogCiAJaWYgKHNiX29ubHkpCiAJCXJldHVybiBkdW1wX3NiKHNwZWMpOwpkaWZmIC0tZ2l0IGEvZXhmYXQvZXhmYXQtZnVzZS9BbmRyb2lkLm1rIGIvZXhmYXQvZXhmYXQtZnVzZS9BbmRyb2lkLm1rCmluZGV4IDk2Mjc4MzUuLmY2ZWMyMGEgMTAwNjQ0Ci0tLSBhL2V4ZmF0L2V4ZmF0LWZ1c2UvQW5kcm9pZC5taworKysgYi9leGZhdC9leGZhdC1mdXNlL0FuZHJvaWQubWsKQEAgLTEyLDcgKzEyLDcgQEAKIAkJCQkJYm9vdGFibGUvcmVjb3ZlcnkvZXhmYXQvbGliZXhmYXQgXAogCQkJCQlib290YWJsZS9yZWNvdmVyeS9mdXNlL2luY2x1ZGUKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlieiBsaWJjIGxpYmV4ZmF0IGxpYmRsIAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJmdXNlCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmZ1c2V0d3JwCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCmRpZmYgLS1naXQgYS9leGZhdC9leGZhdC1mdXNlL21haW4uYyBiL2V4ZmF0L2V4ZmF0LWZ1c2UvbWFpbi5jCmluZGV4IDAwMjNiOWQuLjUzY2UyZmUgMTAwNjQ0Ci0tLSBhL2V4ZmF0L2V4ZmF0LWZ1c2UvbWFpbi5jCisrKyBiL2V4ZmF0L2V4ZmF0LWZ1c2UvbWFpbi5jCkBAIC05Miw3ICs5Miw3IEBACiAJc3RydWN0IGV4ZmF0X25vZGUqIG5vZGU7CiAJc3RydWN0IGV4ZmF0X2l0ZXJhdG9yIGl0OwogCWludCByYzsKLQljaGFyIG5hbWVbRVhGQVRfTkFNRV9NQVggKyAxXTsKKwljaGFyIG5hbWVbVVRGOF9CWVRFUyhFWEZBVF9OQU1FX01BWCkgKyAxXTsKIAogCWV4ZmF0X2RlYnVnKCJbJXNdICVzIiwgX19mdW5jX18sIHBhdGgpOwogCkBAIC0xMTgsNyArMTE4LDcgQEAKIAl9CiAJd2hpbGUgKChub2RlID0gZXhmYXRfcmVhZGRpcigmZWYsICZpdCkpKQogCXsKLQkJZXhmYXRfZ2V0X25hbWUobm9kZSwgbmFtZSwgRVhGQVRfTkFNRV9NQVgpOworCQlleGZhdF9nZXRfbmFtZShub2RlLCBuYW1lLCBzaXplb2YobmFtZSkgLSAxKTsKIAkJZXhmYXRfZGVidWcoIlslc10gJXM6ICVzLCAlIlBSSWQ2NCIgYnl0ZXMsIGNsdXN0ZXIgMHgleCIsIF9fZnVuY19fLAogCQkJCW5hbWUsIElTX0NPTlRJR1VPVVMoKm5vZGUpID8gImNvbnRpZ3VvdXMiIDogImZyYWdtZW50ZWQiLAogCQkJCW5vZGUtPnNpemUsIG5vZGUtPnN0YXJ0X2NsdXN0ZXIpOwpAQCAtMjQyLDE0ICsyNDIsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIF9fQVBQTEVfXwogc3RhdGljIGludCBmdXNlX2V4ZmF0X2NobW9kKGNvbnN0IGNoYXIqIHBhdGgsIG1vZGVfdCBtb2RlKQogeworCWNvbnN0IG1vZGVfdCBWQUxJRF9NT0RFX01BU0sgPSBTX0lGUkVHIHwgU19JRkRJUiB8CisJCQlTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE87CisKIAlleGZhdF9kZWJ1ZygiWyVzXSAlcyAwJWhvIiwgX19mdW5jX18sIHBhdGgsIG1vZGUpOwotCS8qIG1ha2UgT1MgWCB1dGlsaXRpZXMgaGFwcHkgKi8KKwlpZiAobW9kZSAmIH5WQUxJRF9NT0RFX01BU0spCisJCXJldHVybiAtRVBFUk07CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKKworc3RhdGljIGludCBmdXNlX2V4ZmF0X2Nob3duKGNvbnN0IGNoYXIqIHBhdGgsIHVpZF90IHVpZCwgZ2lkX3QgZ2lkKQoreworCWV4ZmF0X2RlYnVnKCJbJXNdICVzICV1OiV1IiwgX19mdW5jX18sIHBhdGgsIHVpZCwgZ2lkKTsKKwlpZiAodWlkICE9IGVmLnVpZCB8fCBnaWQgIT0gZWYuZ2lkKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50IGZ1c2VfZXhmYXRfc3RhdGZzKGNvbnN0IGNoYXIqIHBhdGgsIHN0cnVjdCBzdGF0dmZzKiBzZnMpCiB7CkBAIC0yOTIsNyArMzAyLDcgQEAKIAogc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciogcHJvZykKIHsKLQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLWRdIFstbyBvcHRpb25zXSBbLXZdIDxkZXZpY2U+IDxkaXI+XG4iLCBwcm9nKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLWRdIFstbyBvcHRpb25zXSBbLVZdIDxkZXZpY2U+IDxkaXI+XG4iLCBwcm9nKTsKIAlleGl0KDEpOwogfQogCkBAIC0zMTEsOSArMzIxLDggQEAKIAkubWtkaXIJCT0gZnVzZV9leGZhdF9ta2RpciwKIAkucmVuYW1lCQk9IGZ1c2VfZXhmYXRfcmVuYW1lLAogCS51dGltZW5zCT0gZnVzZV9leGZhdF91dGltZW5zLAotI2lmZGVmIF9fQVBQTEVfXwogCS5jaG1vZAkJPSBmdXNlX2V4ZmF0X2NobW9kLAotI2VuZGlmCisJLmNob3duCQk9IGZ1c2VfZXhmYXRfY2hvd24sCiAJLnN0YXRmcwkJPSBmdXNlX2V4ZmF0X3N0YXRmcywKIAkuaW5pdAkJPSBmdXNlX2V4ZmF0X2luaXQsCiAJLmRlc3Ryb3kJPSBmdXNlX2V4ZmF0X2Rlc3Ryb3ksCkBAIC0zOTgsNyArNDA3LDcgQEAKIAlpbnQgZGVidWcgPSAwOwogCXN0cnVjdCBmdXNlX2NoYW4qIGZjID0gTlVMTDsKIAlzdHJ1Y3QgZnVzZSogZmggPSBOVUxMOwotCWNoYXIqKiBwcDsKKwlpbnQgb3B0OwogCiAJcHJpbnRmKCJGVVNFIGV4ZmF0ICV1LiV1LiV1XG4iLAogCQkJRVhGQVRfVkVSU0lPTl9NQUpPUiwgRVhGQVRfVkVSU0lPTl9NSU5PUiwgRVhGQVRfVkVSU0lPTl9QQVRDSCk7CkBAIC00MTAsNDAgKzQxOSwzOSBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlmb3IgKHBwID0gYXJndiArIDE7ICpwcDsgcHArKykKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZG5vOlZ2IikpICE9IC0xKQogCXsKLQkJaWYgKHN0cmNtcCgqcHAsICItbyIpID09IDApCisJCXN3aXRjaCAob3B0KQogCQl7Ci0JCQlwcCsrOwotCQkJaWYgKCpwcCA9PSBOVUxMKQotCQkJCXVzYWdlKGFyZ3ZbMF0pOwotCQkJbW91bnRfb3B0aW9ucyA9IGFkZF9vcHRpb24obW91bnRfb3B0aW9ucywgKnBwLCBOVUxMKTsKKwkJY2FzZSAnZCc6CisJCQlkZWJ1ZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQltb3VudF9vcHRpb25zID0gYWRkX29wdGlvbihtb3VudF9vcHRpb25zLCBvcHRhcmcsIE5VTEwpOwogCQkJaWYgKG1vdW50X29wdGlvbnMgPT0gTlVMTCkKIAkJCQlyZXR1cm4gMTsKLQkJfQotCQllbHNlIGlmIChzdHJjbXAoKnBwLCAiLWQiKSA9PSAwKQotCQkJZGVidWcgPSAxOwotCQllbHNlIGlmIChzdHJjbXAoKnBwLCAiLXYiKSA9PSAwKQotCQl7CisJCQlicmVhazsKKwkJY2FzZSAnVic6CiAJCQlmcmVlKG1vdW50X29wdGlvbnMpOwogCQkJcHV0cygiQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgIEFuZHJldyBOYXllbmtvIik7CiAJCQlyZXR1cm4gMDsKLQkJfQotCQllbHNlIGlmIChzcGVjID09IE5VTEwpCi0JCQlzcGVjID0gKnBwOwotCQllbHNlIGlmIChtb3VudF9wb2ludCA9PSBOVUxMKQotCQkJbW91bnRfcG9pbnQgPSAqcHA7Ci0JCWVsc2UKLQkJeworCQljYXNlICd2JzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJZnJlZShtb3VudF9vcHRpb25zKTsKIAkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYgKHNwZWMgPT0gTlVMTCB8fCBtb3VudF9wb2ludCA9PSBOVUxMKQorCWlmIChhcmdjIC0gb3B0aW5kICE9IDIpCiAJewogCQlmcmVlKG1vdW50X29wdGlvbnMpOwogCQl1c2FnZShhcmd2WzBdKTsKIAl9CisJc3BlYyA9IGFyZ3Zbb3B0aW5kXTsKKwltb3VudF9wb2ludCA9IGFyZ3Zbb3B0aW5kICsgMV07CiAKIAlpZiAoZXhmYXRfbW91bnQoJmVmLCBzcGVjLCBtb3VudF9vcHRpb25zKSAhPSAwKQogCXsKZGlmZiAtLWdpdCBhL2V4ZmF0L2V4ZmF0LWZ1c2UvbW91bnQuZXhmYXQtZnVzZS44IGIvZXhmYXQvZXhmYXQtZnVzZS9tb3VudC5leGZhdC1mdXNlLjgKaW5kZXggODNkMmU2My4uYjdlOWQ1NiAxMDA2NDQKLS0tIGEvZXhmYXQvZXhmYXQtZnVzZS9tb3VudC5leGZhdC1mdXNlLjgKKysrIGIvZXhmYXQvZXhmYXQtZnVzZS9tb3VudC5leGZhdC1mdXNlLjgKQEAgLTksMTAgKzksMTYgQEAKIC5CIFwtZAogXQogWworLkIgXC1uCitdCitbCiAuQiBcLW8KIC5JIG9wdGlvbnMKIF0KIFsKKy5CIFwtVgorXQorWwogLkIgXC12CiBdCiAuSSBkZXZpY2UgZGlyCkBAIC0yMSw3ICsyNyw3IEBACiAuQiBtb3VudC5leGZhdC1mdXNlCiBpcyBhIGZyZWUgZXhGQVQgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb24gd2l0aCB3cml0ZSBzdXBwb3J0LiBleEZBVCBpcyBhCiBzaW1wbGUgZmlsZSBzeXN0ZW0gY3JlYXRlZCBieSBNaWNyb3NvZnQuIEl0IGlzIGludGVuZGVkIHRvIHJlcGxhY2UgRkFUMzIKLXJlbW92aW5nIHNvbWUgb2YgaXQncyBsaW1pdGF0aW9ucy4gZXhGQVQgaXMgYSBzdGFuZGFyZCBGUyBmb3IgU0RYQyBtZW1vcnkKK3JlbW92aW5nIHNvbWUgb2YgaXRzIGxpbWl0YXRpb25zLiBleEZBVCBpcyBhIHN0YW5kYXJkIEZTIGZvciBTRFhDIG1lbW9yeQogY2FyZHMuCiAKIC5TSCBDT01NQU5EIExJTkUgT1BUSU9OUwpAQCAtMzAsMTMgKzM2LDE5IEBACiAuQkkgXC1kCiBFbmFibGUgZGVidWcgbG9nZ2luZyBhbmQgZG8gbm90IGRldGFjaCBmcm9tIHNoZWxsLgogLlRQCisuQkkgXC1uCitJZ25vcmVkLgorLlRQCiAuQkkgXC1vICIgb3B0aW9ucyIKIEZpbGUgc3lzdGVtIHNwZWNpZmljIG9wdGlvbnMuIEZvciBtb3JlIGRldGFpbHMgc2VlCiAuQiBGSUxFIFNZU1RFTSBPUFRJT05TCiBzZWN0aW9uIGJlbG93LgogLlRQCi0uQkkgXC12CisuQkkgXC1WCiBQcmludCB2ZXJzaW9uIGFuZCBjb3B5cmlnaHQuCisuVFAKKy5CSSBcLXYKK0lnbm9yZWQuCiAKIC5TSCBGSUxFIFNZU1RFTSBPUFRJT05TCiAuVFAKZGlmZiAtLWdpdCBhL2V4ZmF0L2ZzY2svZXhmYXRmc2NrLjggYi9leGZhdC9mc2NrL2V4ZmF0ZnNjay44CmluZGV4IDk4NTUwMGMuLjQwZDdjODUgMTAwNjQ0Ci0tLSBhL2V4ZmF0L2ZzY2svZXhmYXRmc2NrLjgKKysrIGIvZXhmYXQvZnNjay9leGZhdGZzY2suOApAQCAtNyw3ICs3LDcgQEAKIC5TSCBTWU5PUFNJUwogLkIgZXhmYXRmc2NrCiBbCi0uQiBcLXYKKy5CIFwtVgogXQogLkkgZGV2aWNlCiAKQEAgLTE5LDcgKzE5LDcgQEAKIC5TSCBDT01NQU5EIExJTkUgT1BUSU9OUwogQ29tbWFuZCBsaW5lIG9wdGlvbnMgYXZhaWxhYmxlOgogLlRQCi0uQkkgXC12CisuQkkgXC1WCiBQcmludCB2ZXJzaW9uIGFuZCBjb3B5cmlnaHQuCiAKIC5TSCBFWElUIENPREVTCmRpZmYgLS1naXQgYS9leGZhdC9mc2NrL21haW4uYyBiL2V4ZmF0L2ZzY2svbWFpbi5jCmluZGV4IDllZWZkNzQuLmU4NjU2NDEgMTAwNjQ0Ci0tLSBhL2V4ZmF0L2ZzY2svbWFpbi5jCisrKyBiL2V4ZmF0L2ZzY2svbWFpbi5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8ZXhmYXQuaD4KICNpbmNsdWRlIDxleGZhdGZzLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2RlZmluZSBleGZhdF9kZWJ1Zyhmb3JtYXQsIC4uLikKIApAQCAtMzksMTggKzQwLDE4IEBACiAJewogCQlpZiAoQ0xVU1RFUl9JTlZBTElEKGMpKQogCQl7Ci0JCQljaGFyIG5hbWVbRVhGQVRfTkFNRV9NQVggKyAxXTsKKwkJCWNoYXIgbmFtZVtVVEY4X0JZVEVTKEVYRkFUX05BTUVfTUFYKSArIDFdOwogCi0JCQlleGZhdF9nZXRfbmFtZShub2RlLCBuYW1lLCBFWEZBVF9OQU1FX01BWCk7CisJCQlleGZhdF9nZXRfbmFtZShub2RlLCBuYW1lLCBzaXplb2YobmFtZSkgLSAxKTsKIAkJCWV4ZmF0X2Vycm9yKCJmaWxlIGAlcycgaGFzIGludmFsaWQgY2x1c3RlciAweCV4IiwgbmFtZSwgYyk7CiAJCQlyYyA9IDE7CiAJCQlicmVhazsKIAkJfQogCQlpZiAoQk1BUF9HRVQoZWYtPmNtYXAuY2h1bmssIGMgLSBFWEZBVF9GSVJTVF9EQVRBX0NMVVNURVIpID09IDApCiAJCXsKLQkJCWNoYXIgbmFtZVtFWEZBVF9OQU1FX01BWCArIDFdOworCQkJY2hhciBuYW1lW1VURjhfQllURVMoRVhGQVRfTkFNRV9NQVgpICsgMV07CiAKLQkJCWV4ZmF0X2dldF9uYW1lKG5vZGUsIG5hbWUsIEVYRkFUX05BTUVfTUFYKTsKKwkJCWV4ZmF0X2dldF9uYW1lKG5vZGUsIG5hbWUsIHNpemVvZihuYW1lKSAtIDEpOwogCQkJZXhmYXRfZXJyb3IoImNsdXN0ZXIgMHgleCBvZiBmaWxlIGAlcycgaXMgbm90IGFsbG9jYXRlZCIsIGMsIG5hbWUpOwogCQkJcmMgPSAxOwogCQl9CkBAIC03Niw3ICs3Nyw3IEBACiAJCXJldHVybjsKIAogCXBhdGhfbGVuZ3RoID0gc3RybGVuKHBhdGgpOwotCWVudHJ5X3BhdGggPSBtYWxsb2MocGF0aF9sZW5ndGggKyAxICsgRVhGQVRfTkFNRV9NQVgpOworCWVudHJ5X3BhdGggPSBtYWxsb2MocGF0aF9sZW5ndGggKyAxICsgVVRGOF9CWVRFUyhFWEZBVF9OQU1FX01BWCkgKyAxKTsKIAlpZiAoZW50cnlfcGF0aCA9PSBOVUxMKQogCXsKIAkJZXhmYXRfZXJyb3IoIm91dCBvZiBtZW1vcnkiKTsKQEAgLTk1LDcgKzk2LDggQEAKIAl9CiAJd2hpbGUgKChub2RlID0gZXhmYXRfcmVhZGRpcihlZiwgJml0KSkpCiAJewotCQlleGZhdF9nZXRfbmFtZShub2RlLCBlbnRyeV9wYXRoICsgcGF0aF9sZW5ndGggKyAxLCBFWEZBVF9OQU1FX01BWCk7CisJCWV4ZmF0X2dldF9uYW1lKG5vZGUsIGVudHJ5X3BhdGggKyBwYXRoX2xlbmd0aCArIDEsCisJCQkJVVRGOF9CWVRFUyhFWEZBVF9OQU1FX01BWCkpOwogCQlleGZhdF9kZWJ1ZygiJXM6ICVzLCAlIlBSSXU2NCIgYnl0ZXMsIGNsdXN0ZXIgJXUiLCBlbnRyeV9wYXRoLAogCQkJCUlTX0NPTlRJR1VPVVMoKm5vZGUpID8gImNvbnRpZ3VvdXMiIDogImZyYWdtZW50ZWQiLAogCQkJCW5vZGUtPnNpemUsIG5vZGUtPnN0YXJ0X2NsdXN0ZXIpOwpAQCAtMTI0LDMzICsxMjYsMzQgQEAKIAogc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciogcHJvZykKIHsKLQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLXZdIDxkZXZpY2U+XG4iLCBwcm9nKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLVZdIDxkZXZpY2U+XG4iLCBwcm9nKTsKIAlleGl0KDEpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQogewotCWNoYXIqKiBwcDsKKwlpbnQgb3B0OwogCWNvbnN0IGNoYXIqIHNwZWMgPSBOVUxMOwogCXN0cnVjdCBleGZhdCBlZjsKIAogCXByaW50ZigiZXhmYXRmc2NrICV1LiV1LiV1XG4iLAogCQkJRVhGQVRfVkVSU0lPTl9NQUpPUiwgRVhGQVRfVkVSU0lPTl9NSU5PUiwgRVhGQVRfVkVSU0lPTl9QQVRDSCk7CiAKLQlmb3IgKHBwID0gYXJndiArIDE7ICpwcDsgcHArKykKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiViIpKSAhPSAtMSkKIAl7Ci0JCWlmIChzdHJjbXAoKnBwLCAiLXYiKSA9PSAwKQorCQlzd2l0Y2ggKG9wdCkKIAkJeworCQljYXNlICdWJzoKIAkJCXB1dHMoIkNvcHlyaWdodCAoQykgMjAxMS0yMDEzICBBbmRyZXcgTmF5ZW5rbyIpOwogCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSBpZiAoc3BlYyA9PSBOVUxMKQotCQkJc3BlYyA9ICpwcDsKLQkJZWxzZQorCQlkZWZhdWx0OgogCQkJdXNhZ2UoYXJndlswXSk7CisJCQlicmVhazsKKwkJfQogCX0KLQlpZiAoc3BlYyA9PSBOVUxMKQorCWlmIChhcmdjIC0gb3B0aW5kICE9IDEpCiAJCXVzYWdlKGFyZ3ZbMF0pOworCXNwZWMgPSBhcmd2W29wdGluZF07CiAKIAlpZiAoZXhmYXRfbW91bnQoJmVmLCBzcGVjLCAicm8iKSAhPSAwKQogCQlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2V4ZmF0L2xhYmVsL2V4ZmF0bGFiZWwuOCBiL2V4ZmF0L2xhYmVsL2V4ZmF0bGFiZWwuOAppbmRleCA0MjlmM2NjLi5kZDJlZjFjIDEwMDY0NAotLS0gYS9leGZhdC9sYWJlbC9leGZhdGxhYmVsLjgKKysrIGIvZXhmYXQvbGFiZWwvZXhmYXRsYWJlbC44CkBAIC03LDcgKzcsNyBAQAogLlNIIFNZTk9QU0lTCiAuQiBleGZhdGxhYmVsCiBbCi0uQiBcLXYKKy5CIFwtVgogXQogLkkgZGV2aWNlCiBbCkBAIC0zNSw3ICszNSw3IEBACiAuU0ggQ09NTUFORCBMSU5FIE9QVElPTlMKIENvbW1hbmQgbGluZSBvcHRpb25zIGF2YWlsYWJsZToKIC5UUAotLkJJIFwtdgorLkJJIFwtVgogUHJpbnQgdmVyc2lvbiBhbmQgY29weXJpZ2h0LgogCiAuU0ggRVhJVCBDT0RFUwpkaWZmIC0tZ2l0IGEvZXhmYXQvbGFiZWwvbWFpbi5jIGIvZXhmYXQvbGFiZWwvbWFpbi5jCmluZGV4IDhhNDI5ZDUuLjU1OTUwMzUgMTAwNjQ0Ci0tLSBhL2V4ZmF0L2xhYmVsL21haW4uYworKysgYi9leGZhdC9sYWJlbC9tYWluLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAlpbnQgcmMgPSAwOwogCiAJZm9yIChwcCA9IGFyZ3YgKyAxOyAqcHA7IHBwKyspCi0JCWlmIChzdHJjbXAoKnBwLCAiLXYiKSA9PSAwKQorCQlpZiAoc3RyY21wKCpwcCwgIi1WIikgPT0gMCkKIAkJewogCQkJcHJpbnRmKCJleGZhdGxhYmVsICV1LiV1LiV1XG4iLCBFWEZBVF9WRVJTSU9OX01BSk9SLAogCQkJCQlFWEZBVF9WRVJTSU9OX01JTk9SLCBFWEZBVF9WRVJTSU9OX1BBVENIKTsKQEAgLTM5LDcgKzM5LDcgQEAKIAogCWlmIChhcmdjICE9IDIgJiYgYXJnYyAhPSAzKQogCXsKLQkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy12XSA8ZGV2aWNlPiBbbGFiZWxdXG4iLCBhcmd2WzBdKTsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1WXSA8ZGV2aWNlPiBbbGFiZWxdXG4iLCBhcmd2WzBdKTsKIAkJcmV0dXJuIDE7CiAJfQogCmRpZmYgLS1naXQgYS9leGZhdC9saWJleGZhdC9leGZhdC5oIGIvZXhmYXQvbGliZXhmYXQvZXhmYXQuaAppbmRleCAzZTQyMjNlLi5hNmE5ZjcwIDEwMDY0NAotLS0gYS9leGZhdC9saWJleGZhdC9leGZhdC5oCisrKyBiL2V4ZmF0L2xpYmV4ZmF0L2V4ZmF0LmgKQEAgLTQ2LDYgKzQ2LDcgQEAKICNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCiAjZGVmaW5lIERJVl9ST1VORF9VUCh4LCBkKSAoKCh4KSArIChkKSAtIDEpIC8gKGQpKQogI2RlZmluZSBST1VORF9VUCh4LCBkKSAoRElWX1JPVU5EX1VQKHgsIGQpICogKGQpKQorI2RlZmluZSBVVEY4X0JZVEVTKGMpICgoYykgKiA2KSAvKiBVVEYtOCBjaGFyYWN0ZXIgY2FuIG9jY3VweSB1cCB0byA2IGJ5dGVzICovCiAKICNkZWZpbmUgQk1BUF9HRVQoYml0bWFwLCBpbmRleCkgXAogCSgoKHVpbnQ4X3QqKSBiaXRtYXApWyhpbmRleCkgLyA4XSAmICgxdSA8PCAoKGluZGV4KSAlIDgpKSkKQEAgLTk4LDggKzk5LDcgQEAKIAkJYm9vbCBkaXJ0eTsKIAl9CiAJY21hcDsKLQljaGFyIGxhYmVsW0VYRkFUX0VOQU1FX01BWCAqIDYgKyAxXTsgLyogYSBjaGFyYWN0ZXIgY2FuIG9jY3VweSB1cCB0bwotCQkJCQkJCQkJCQk2IGJ5dGVzIGluIFVURi04ICovCisJY2hhciBsYWJlbFtVVEY4X0JZVEVTKEVYRkFUX0VOQU1FX01BWCkgKyAxXTsKIAl2b2lkKiB6ZXJvX2NsdXN0ZXI7CiAJaW50IGRtYXNrLCBmbWFzazsKIAl1aWRfdCB1aWQ7CmRpZmYgLS1naXQgYS9leGZhdC9saWJleGZhdC9ub2RlLmMgYi9leGZhdC9saWJleGZhdC9ub2RlLmMKaW5kZXggYzJlZTBkYS4uZjg5YjU3MyAxMDA2NDQKLS0tIGEvZXhmYXQvbGliZXhmYXQvbm9kZS5jCisrKyBiL2V4ZmF0L2xpYmV4ZmF0L25vZGUuYwpAQCAtNDQsOCArNDQsOCBAQAogewogCWlmICgtLW5vZGUtPnJlZmVyZW5jZXMgPCAwKQogCXsKLQkJY2hhciBidWZmZXJbRVhGQVRfTkFNRV9NQVggKyAxXTsKLQkJZXhmYXRfZ2V0X25hbWUobm9kZSwgYnVmZmVyLCBFWEZBVF9OQU1FX01BWCk7CisJCWNoYXIgYnVmZmVyW1VURjhfQllURVMoRVhGQVRfTkFNRV9NQVgpICsgMV07CisJCWV4ZmF0X2dldF9uYW1lKG5vZGUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgLSAxKTsKIAkJZXhmYXRfYnVnKCJyZWZlcmVuY2UgY291bnRlciBvZiBgJXMnIGlzIGJlbG93IHplcm8iLCBidWZmZXIpOwogCX0KIApAQCAtMjkzLDkgKzI5Myw5IEBACiAJCQkJKi8KIAkJCQlpZiAocmVhbF9zaXplICE9ICgqbm9kZSktPnNpemUpCiAJCQkJewotCQkJCQljaGFyIGJ1ZmZlcltFWEZBVF9OQU1FX01BWCArIDFdOworCQkJCQljaGFyIGJ1ZmZlcltVVEY4X0JZVEVTKEVYRkFUX05BTUVfTUFYKSArIDFdOwogCi0JCQkJCWV4ZmF0X2dldF9uYW1lKCpub2RlLCBidWZmZXIsIEVYRkFUX05BTUVfTUFYKTsKKwkJCQkJZXhmYXRfZ2V0X25hbWUoKm5vZGUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgLSAxKTsKIAkJCQkJZXhmYXRfZXJyb3IoImAlcycgcmVhbCBzaXplIGRvZXMgbm90IGVxdWFsIHRvIHNpemUgIgogCQkJCQkJCSIoJSJQUkl1NjQiICE9ICUiUFJJdTY0IikiLCBidWZmZXIsCiAJCQkJCQkJcmVhbF9zaXplLCAoKm5vZGUpLT5zaXplKTsKQEAgLTMwMyw5ICszMDMsOSBAQAogCQkJCX0KIAkJCQlpZiAoYWN0dWFsX2NoZWNrc3VtICE9IHJlZmVyZW5jZV9jaGVja3N1bSkKIAkJCQl7Ci0JCQkJCWNoYXIgYnVmZmVyW0VYRkFUX05BTUVfTUFYICsgMV07CisJCQkJCWNoYXIgYnVmZmVyW1VURjhfQllURVMoRVhGQVRfTkFNRV9NQVgpICsgMV07CiAKLQkJCQkJZXhmYXRfZ2V0X25hbWUoKm5vZGUsIGJ1ZmZlciwgRVhGQVRfTkFNRV9NQVgpOworCQkJCQlleGZhdF9nZXRfbmFtZSgqbm9kZSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAtIDEpOwogCQkJCQlleGZhdF9lcnJvcigiYCVzJyBoYXMgaW52YWxpZCBjaGVja3N1bSAoMHglaHggIT0gMHglaHgpIiwKIAkJCQkJCQlidWZmZXIsIGFjdHVhbF9jaGVja3N1bSwgcmVmZXJlbmNlX2NoZWNrc3VtKTsKIAkJCQkJZ290byBlcnJvcjsKQEAgLTM4OSw3ICszODksNyBAQAogCQkJCWdvdG8gZXJyb3I7CiAJCQl9CiAJCQlpZiAodXRmMTZfdG9fdXRmOChlZi0+bGFiZWwsIGxhYmVsLT5uYW1lLAotCQkJCQkJc2l6ZW9mKGVmLT5sYWJlbCksIEVYRkFUX0VOQU1FX01BWCkgIT0gMCkKKwkJCQkJCXNpemVvZihlZi0+bGFiZWwpIC0gMSwgRVhGQVRfRU5BTUVfTUFYKSAhPSAwKQogCQkJCWdvdG8gZXJyb3I7CiAJCQlicmVhazsKIApAQCAtNDkzLDggKzQ5Myw4IEBACiAJbm9kZS0+ZmxhZ3MgJj0gfkVYRkFUX0FUVFJJQl9DQUNIRUQ7CiAJaWYgKG5vZGUtPnJlZmVyZW5jZXMgIT0gMCkKIAl7Ci0JCWNoYXIgYnVmZmVyW0VYRkFUX05BTUVfTUFYICsgMV07Ci0JCWV4ZmF0X2dldF9uYW1lKG5vZGUsIGJ1ZmZlciwgRVhGQVRfTkFNRV9NQVgpOworCQljaGFyIGJ1ZmZlcltVVEY4X0JZVEVTKEVYRkFUX05BTUVfTUFYKSArIDFdOworCQlleGZhdF9nZXRfbmFtZShub2RlLCBidWZmZXIsIHNpemVvZihidWZmZXIpIC0gMSk7CiAJCWV4ZmF0X3dhcm4oIm5vbi16ZXJvIHJlZmVyZW5jZSBjb3VudGVyICglZCkgZm9yIGAlcyciLAogCQkJCW5vZGUtPnJlZmVyZW5jZXMsIGJ1ZmZlcik7CiAJfQpAQCAtMTA1MSw1ICsxMDUxLDYgQEAKIAogCWV4ZmF0X3B3cml0ZShlZi0+ZGV2LCAmZW50cnksIHNpemVvZihzdHJ1Y3QgZXhmYXRfZW50cnlfbGFiZWwpLAogCQkJY28ybyhlZiwgY2x1c3Rlciwgb2Zmc2V0KSk7CisJc3RyY3B5KGVmLT5sYWJlbCwgbGFiZWwpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZXhmYXQvbWtmcy9BbmRyb2lkLm1rIGIvZXhmYXQvbWtmcy9BbmRyb2lkLm1rCmluZGV4IGJjY2Q3YzkuLjhjNDhjNzcgMTAwNjQ0Ci0tLSBhL2V4ZmF0L21rZnMvQW5kcm9pZC5taworKysgYi9leGZhdC9ta2ZzL0FuZHJvaWQubWsKQEAgLTExLDcgKzExLDcgQEAKIAkJCQkJYm9vdGFibGUvcmVjb3ZlcnkvZXhmYXQvbGliZXhmYXQgXAogCQkJCQlib290YWJsZS9yZWNvdmVyeS9mdXNlL2luY2x1ZGUKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlieiBsaWJjIGxpYmV4ZmF0IGxpYmRsIAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJmdXNlCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmZ1c2V0d3JwCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCmRpZmYgLS1naXQgYS9leGZhdC9ta2ZzL21haW4uYyBiL2V4ZmF0L21rZnMvbWFpbi5jCmluZGV4IDk3ZTQ2NWEuLjEyYmI4MzggMTAwNjQ0Ci0tLSBhL2V4ZmF0L21rZnMvbWFpbi5jCisrKyBiL2V4ZmF0L21rZnMvbWFpbi5jCkBAIC0xODgsMTQgKzE4OCwxNCBAQAogewogCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstaSB2b2x1bWUtaWRdIFstbiBsYWJlbF0gIgogCQkJIlstcCBwYXJ0aXRpb24tZmlyc3Qtc2VjdG9yXSAiCi0JCQkiWy1zIHNlY3RvcnMtcGVyLWNsdXN0ZXJdIFstdl0gPGRldmljZT5cbiIsIHByb2cpOworCQkJIlstcyBzZWN0b3JzLXBlci1jbHVzdGVyXSBbLVZdIDxkZXZpY2U+XG4iLCBwcm9nKTsKIAlleGl0KDEpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQogewogCWNvbnN0IGNoYXIqIHNwZWMgPSBOVUxMOwotCWNoYXIqKiBwcDsKKwlpbnQgb3B0OwogCWludCBzcGNfYml0cyA9IC0xOwogCWNvbnN0IGNoYXIqIHZvbHVtZV9sYWJlbCA9IE5VTEw7CiAJdWludDMyX3Qgdm9sdW1lX3NlcmlhbCA9IDA7CkBAIC0yMDUsNTMgKzIwNSwzOCBAQAogCXByaW50ZigibWtleGZhdGZzICV1LiV1LiV1XG4iLAogCQkJRVhGQVRfVkVSU0lPTl9NQUpPUiwgRVhGQVRfVkVSU0lPTl9NSU5PUiwgRVhGQVRfVkVSU0lPTl9QQVRDSCk7CiAKLQlmb3IgKHBwID0gYXJndiArIDE7ICpwcDsgcHArKykKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaTpuOnA6czpWIikpICE9IC0xKQogCXsKLQkJaWYgKHN0cmNtcCgqcHAsICItcyIpID09IDApCisJCXN3aXRjaCAob3B0KQogCQl7Ci0JCQlwcCsrOwotCQkJaWYgKCpwcCA9PSBOVUxMKQotCQkJCXVzYWdlKGFyZ3ZbMF0pOwotCQkJc3BjX2JpdHMgPSBsb2dhcml0aG0yKGF0b2koKnBwKSk7CisJCWNhc2UgJ2knOgorCQkJdm9sdW1lX3NlcmlhbCA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDE2KTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCXZvbHVtZV9sYWJlbCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCWZpcnN0X3NlY3RvciA9IHN0cnRvbGwob3B0YXJnLCBOVUxMLCAxMCk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzcGNfYml0cyA9IGxvZ2FyaXRobTIoYXRvaShvcHRhcmcpKTsKIAkJCWlmIChzcGNfYml0cyA8IDApCiAJCQl7Ci0JCQkJZXhmYXRfZXJyb3IoImludmFsaWQgb3B0aW9uIHZhbHVlOiBgJXMnIiwgKnBwKTsKKwkJCQlleGZhdF9lcnJvcigiaW52YWxpZCBvcHRpb24gdmFsdWU6IGAlcyciLCBvcHRhcmcpOwogCQkJCXJldHVybiAxOwogCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0cmNtcCgqcHAsICItbiIpID09IDApCi0JCXsKLQkJCXBwKys7Ci0JCQlpZiAoKnBwID09IE5VTEwpCi0JCQkJdXNhZ2UoYXJndlswXSk7Ci0JCQl2b2x1bWVfbGFiZWwgPSAqcHA7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKCpwcCwgIi1pIikgPT0gMCkKLQkJewotCQkJcHArKzsKLQkJCWlmICgqcHAgPT0gTlVMTCkKLQkJCQl1c2FnZShhcmd2WzBdKTsKLQkJCXZvbHVtZV9zZXJpYWwgPSBzdHJ0b2woKnBwLCBOVUxMLCAxNik7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKCpwcCwgIi1wIikgPT0gMCkKLQkJewotCQkJcHArKzsKLQkJCWlmICgqcHAgPT0gTlVMTCkKLQkJCQl1c2FnZShhcmd2WzBdKTsKLQkJCWZpcnN0X3NlY3RvciA9IHN0cnRvbGwoKnBwLCBOVUxMLCAxMCk7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKCpwcCwgIi12IikgPT0gMCkKLQkJeworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgogCQkJcHV0cygiQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgIEFuZHJldyBOYXllbmtvIik7CiAJCQlyZXR1cm4gMDsKLQkJfQotCQllbHNlIGlmIChzcGVjID09IE5VTEwpCi0JCQlzcGVjID0gKnBwOwotCQllbHNlCisJCWRlZmF1bHQ6CiAJCQl1c2FnZShhcmd2WzBdKTsKKwkJCWJyZWFrOworCQl9CiAJfQotCWlmIChzcGVjID09IE5VTEwpCisJaWYgKGFyZ2MgLSBvcHRpbmQgIT0gMSkKIAkJdXNhZ2UoYXJndlswXSk7CisJc3BlYyA9IGFyZ3Zbb3B0aW5kXTsKIAogCWRldiA9IGV4ZmF0X29wZW4oc3BlYywgRVhGQVRfTU9ERV9SVyk7CiAJaWYgKGRldiA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZXhmYXQvbWtmcy9ta2V4ZmF0ZnMuOCBiL2V4ZmF0L21rZnMvbWtleGZhdGZzLjgKaW5kZXggN2QzZmZlYy4uNWY2YmEzZCAxMDA2NDQKLS0tIGEvZXhmYXQvbWtmcy9ta2V4ZmF0ZnMuOAorKysgYi9leGZhdC9ta2ZzL21rZXhmYXRmcy44CkBAIC0yMyw3ICsyMyw3IEBACiAuSSBzZWN0b3JzLXBlci1jbHVzdGVyCiBdCiBbCi0uQiBcLXYKKy5CIFwtVgogXQogLkkgZGV2aWNlCiAKQEAgLTU1LDcgKzU1LDcgQEAKIDMyIEtCIGlmIHZvbHVtZSBzaXplIGlzIGZyb20gMjU2IE1CIHRvIDMyIEdCLAogMTI4IEtCIGlmIHZvbHVtZSBzaXplIGlzIDMyIEdCIG9yIGxhcmdlci4KIC5UUAotLkJJIFwtdgorLkJJIFwtVgogUHJpbnQgdmVyc2lvbiBhbmQgY29weXJpZ2h0LgogCiAuU0ggRVhJVCBDT0RFUwpkaWZmIC0tZ2l0IGEvZml4UGVybWlzc2lvbnMuY3BwIGIvZml4UGVybWlzc2lvbnMuY3BwCmluZGV4IDVkNGIwZDIuLjJmYTFiNjYgMTAwNjQ0Ci0tLSBhL2ZpeFBlcm1pc3Npb25zLmNwcAorKysgYi9maXhQZXJtaXNzaW9ucy5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWd1aV9wcmludCgiRml4aW5nIC9kYXRhL2FwcCBwZXJtaXNpb25zLi4uXG4iKTsKKwlndWlfcHJpbnQoIkZpeGluZyAvZGF0YS9hcHAgcGVybWlzc2lvbnMuLi5cbiIpOwogCWlmICgoZml4RGF0YUFwcHMoKSkgIT0gMCkgewogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTExLDcgKzExMSw3IEBACiAJCQljbG9zZWRpcihkKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWd1aV9wcmludCgiRml4aW5nIC9kYXRhL2RhdGEgcGVybWlzaW9ucy4uLlxuIik7CisJCWd1aV9wcmludCgiRml4aW5nIC9kYXRhL2RhdGEgcGVybWlzc2lvbnMuLi5cbiIpOwogCQlpZiAoKGZpeERhdGFEYXRhKCIvZGF0YS9kYXRhLyIpKSAhPSAwKSB7CiAJCQlyZXR1cm4gLTE7CiAJCX0KZGlmZiAtLWdpdCBhL2Z1c2UvQW5kcm9pZC5tayBiL2Z1c2UvQW5kcm9pZC5tawppbmRleCA1OWNkOWIzLi4zYmQxNjE2IDEwMDY0NAotLS0gYS9mdXNlL0FuZHJvaWQubWsKKysrIGIvZnVzZS9BbmRyb2lkLm1rCkBAIC00Miw3ICs0Miw3IEBACiAJLURfRklMRV9PRkZTRVRfQklUUz02NCBcCiAJLURGVVNFX1VTRV9WRVJTSU9OPTI2CiAKLUxPQ0FMX01PRFVMRSA6PSBsaWJmdXNlCitMT0NBTF9NT0RVTEUgOj0gbGliZnVzZXR3cnAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKQEAgLTYxLDYgKzYxLDYgQEAKIExPQ0FMX01PRFVMRSA6PSBmdXNleG1wCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmZ1c2UKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZnVzZXR3cnAKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9ndWkvQW5kcm9pZC5tayBiL2d1aS9BbmRyb2lkLm1rCmluZGV4IDM1ZDg3N2IuLjdhYzRiYWMgMTAwNjQ0Ci0tLSBhL2d1aS9BbmRyb2lkLm1rCisrKyBiL2d1aS9BbmRyb2lkLm1rCkBAIC0yMiw4ICsyMiw3IEBACiAgICAga2V5Ym9hcmQuY3BwIFwKICAgICBpbnB1dC5jcHAgXAogICAgIGJsYW5rdGltZXIuY3BwIFwKLSAgICBwYXJ0aXRpb25saXN0LmNwcCBcCi0gICAgLi4vbWludWl0d3JwL2dyYXBoaWNzLmMKKyAgICBwYXJ0aXRpb25saXN0LmNwcAogCiBpZm5lcSAoJChUV1JQX0NVU1RPTV9LRVlCT0FSRCksKQogICBMT0NBTF9TUkNfRklMRVMgKz0gJChUV1JQX0NVU1RPTV9LRVlCT0FSRCkKQEAgLTMxLDYgKzMwLDcgQEAKICAgTE9DQUxfU1JDX0ZJTEVTICs9IGhhcmR3YXJla2V5Ym9hcmQuY3BwCiBlbmRpZgogCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1pbnVpdHdycCBsaWJjIGxpYnN0ZGMrKwogTE9DQUxfTU9EVUxFIDo9IGxpYmd1aXR3cnAKIAogIyBVc2UgdGhpcyBmbGFnIHRvIGNyZWF0ZSBhIGJ1aWxkIHRoYXQgc2ltdWxhdGVzIHRocmVhZGVkIGFjdGlvbnMgbGlrZSBpbnN0YWxsaW5nIHppcHMsIGJhY2t1cHMsIHJlc3RvcmVzLCBhbmQgd2lwZXMgZm9yIHRoZW1lIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzEwMjR4NjAwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZC5qcGcgYi9ndWkvZGV2aWNlcy8xMDI0eDYwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmQuanBnCmluZGV4IDZmZjhkNGQuLjJhYzQ4ZTAgMTAwNjQ0Ci0tLSBhL2d1aS9kZXZpY2VzLzEwMjR4NjAwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZC5qcGcKKysrIGIvZ3VpL2RldmljZXMvMTAyNHg2MDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8xMDI0eDYwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmRib3R0b20uanBnIGIvZ3VpL2RldmljZXMvMTAyNHg2MDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kYm90dG9tLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0ODY4MC4uMDAwMDAwMAotLS0gYS9ndWkvZGV2aWNlcy8xMDI0eDYwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmRib3R0b20uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvMTAyNHg2MDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kc2lkZS5qcGcgYi9ndWkvZGV2aWNlcy8xMDI0eDYwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmRzaWRlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlZGUxZS4uMDAwMDAwMAotLS0gYS9ndWkvZGV2aWNlcy8xMDI0eDYwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmRzaWRlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzEwMjR4NjAwL3Jlcy9pbWFnZXMvbGFyZ2VfYmxhY2sucG5nIGIvZ3VpL2RldmljZXMvMTAyNHg2MDAvcmVzL2ltYWdlcy9sYXJnZV9ibGFjay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZjRmYTEuLjAwMDAwMDAKLS0tIGEvZ3VpL2RldmljZXMvMTAyNHg2MDAvcmVzL2ltYWdlcy9sYXJnZV9ibGFjay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8xMDI0eDYwMC9yZXMvdWkueG1sIGIvZ3VpL2RldmljZXMvMTAyNHg2MDAvcmVzL3VpLnhtbAppbmRleCA0ODM1ZDgyLi41OTc5YzUwIDEwMDc1NQotLS0gYS9ndWkvZGV2aWNlcy8xMDI0eDYwMC9yZXMvdWkueG1sCisrKyBiL2d1aS9kZXZpY2VzLzEwMjR4NjAwL3Jlcy91aS54bWwKQEAgLTEyLDkgKzEyLDYgQEAKIAk8cmVzb3VyY2VzPgogCQk8cmVzb3VyY2UgbmFtZT0iZm9udCIgdHlwZT0iZm9udCIgZmlsZW5hbWU9IlJvYm90by1SZWd1bGFyLTIwIiAvPgogCQk8cmVzb3VyY2UgbmFtZT0iYmFzZSIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJiYWNrZ3JvdW5kLmpwZyIgLz4KLQkJPHJlc291cmNlIG5hbWU9InNpZGUiIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iYmFja2dyb3VuZHNpZGUuanBnIiAvPgotCQk8cmVzb3VyY2UgbmFtZT0iYm90dG9tIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImJhY2tncm91bmRib3R0b20uanBnIiAvPgotCQk8cmVzb3VyY2UgbmFtZT0ibGFyZ2VfYmxhY2siIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0ibGFyZ2VfYmxhY2siIC8+CiAJCTxyZXNvdXJjZSBuYW1lPSJtYWluX2J1dHRvbiIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJidXR0b24iIC8+CiAJCTxyZXNvdXJjZSBuYW1lPSJmaWxlX2ljb24iIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iZmlsZSIgLz4KIAkJPHJlc291cmNlIG5hbWU9ImZvbGRlcl9pY29uIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImZvbGRlciIgLz4KQEAgLTIxMywzNCArMjEwLDE0IEBACiAJCQk8YmFja2dyb3VuZCBjb2xvcj0iIzAwMDAwMEZGIiAvPgogCiAJCQk8b2JqZWN0IHR5cGU9ImltYWdlIj4KLQkJCQk8aW1hZ2UgcmVzb3VyY2U9InNpZGUiIC8+Ci0JCQkJPHBsYWNlbWVudCB4PSIwIiB5PSIwIiAvPgotCQkJPC9vYmplY3Q+Ci0KLQkJCTxvYmplY3QgdHlwZT0iaW1hZ2UiPgotCQkJCTxpbWFnZSByZXNvdXJjZT0ic2lkZSIgLz4KLQkJCQk8cGxhY2VtZW50IHg9Ijk5NCIgeT0iMCIgLz4KLQkJCTwvb2JqZWN0PgotCi0JCQk8b2JqZWN0IHR5cGU9ImltYWdlIj4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImJhc2UiIC8+CiAJCQkJPHBsYWNlbWVudCB4PSIwIiB5PSIwIiAvPgogCQkJPC9vYmplY3Q+CiAKLQkJCTxvYmplY3QgdHlwZT0iaW1hZ2UiPgotCQkJCTxpbWFnZSByZXNvdXJjZT0iYm90dG9tIiAvPgotCQkJCTxwbGFjZW1lbnQgeD0iMSIgeT0iNTcwIiAvPgotCQkJPC9vYmplY3Q+Ci0KLQkJCTxvYmplY3QgdHlwZT0iaW1hZ2UiPgotCQkJCTxpbWFnZSByZXNvdXJjZT0ibGFyZ2VfYmxhY2siIC8+Ci0JCQkJPHBsYWNlbWVudCB4PSIwIiB5PSIwIiAvPgotCQkJPC9vYmplY3Q+Ci0KIAkJCTxvYmplY3QgdHlwZT0idGV4dCIgY29sb3I9IiV0ZXh0X2NvbG9yJSI+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIC8+CiAJCQkJPHBsYWNlbWVudCB4PSIyNTAiIHk9IjUiIC8+Ci0JCQkJPHRleHQ+VGVhbSBXaW4gUmVjb3ZlcnkgUHJvamVjdCAodHdycCkgIHYldHdfdmVyc2lvbiU8L3RleHQ+CisJCQkJPHRleHQ+VGVhbSBXaW4gUmVjb3ZlcnkgUHJvamVjdCAgdiV0d192ZXJzaW9uJTwvdGV4dD4KIAkJCTwvb2JqZWN0PgogCiAJCQk8b2JqZWN0IHR5cGU9InRleHQiIGNvbG9yPSIldGV4dF9jb2xvciUiPgpAQCAtMTI1OSw2ICsxMjM2LDE4IEBACiAJCQkJPGxpc3R0eXBlIG5hbWU9InN0b3JhZ2UiIC8+CiAJCQk8L29iamVjdD4KIAorCQkJPG9iamVjdCB0eXBlPSJidXR0b24iPgorCQkJCTxoaWdobGlnaHQgY29sb3I9IiVoaWdobGlnaHRfY29sb3IlIiAvPgorCQkJCTxwbGFjZW1lbnQgeD0iJWZpbGVtYW5hZ2VyX3NlbGVjdF94JSIgeT0iJXJvdzJfeSUiIC8+CisJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIlYnV0dG9uX3RleHRfY29sb3IlIiAvPgorCQkJCTx0ZXh0Pk9LPC90ZXh0PgorCQkJCTxpbWFnZSByZXNvdXJjZT0ibWFpbl9idXR0b24iIC8+CisJCQkJPGFjdGlvbnM+CisJCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfY2xlYXJfZGVzdGluYXRpb249JXR3X2JhY2slPC9hY3Rpb24+CisJCQkJCTxhY3Rpb24gZnVuY3Rpb249InBhZ2UiPmNsZWFyX3ZhcnM8L2FjdGlvbj4KKwkJCQk8L2FjdGlvbnM+CisJCQk8L29iamVjdD4KKwogCQkJPG9iamVjdCB0eXBlPSJhY3Rpb24iPgogCQkJCTx0b3VjaCBrZXk9ImhvbWUiIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0icGFnZSI+bWFpbjwvYWN0aW9uPgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvMTAyNHg3NjgvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kLmpwZyBiL2d1aS9kZXZpY2VzLzEwMjR4NzY4L3Jlcy9pbWFnZXMvYmFja2dyb3VuZC5qcGcKaW5kZXggNmZmOGQ0ZC4uMmFjNDhlMCAxMDA2NDQKLS0tIGEvZ3VpL2RldmljZXMvMTAyNHg3NjgvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kLmpwZworKysgYi9ndWkvZGV2aWNlcy8xMDI0eDc2OC9yZXMvaW1hZ2VzL2JhY2tncm91bmQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzEwMjR4NzY4L3Jlcy9pbWFnZXMvYmFja2dyb3VuZGJvdHRvbS5qcGcgYi9ndWkvZGV2aWNlcy8xMDI0eDc2OC9yZXMvaW1hZ2VzL2JhY2tncm91bmRib3R0b20uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGFlZGUwLi4wMDAwMDAwCi0tLSBhL2d1aS9kZXZpY2VzLzEwMjR4NzY4L3Jlcy9pbWFnZXMvYmFja2dyb3VuZGJvdHRvbS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8xMDI0eDc2OC9yZXMvaW1hZ2VzL2JhY2tncm91bmRzaWRlLmpwZyBiL2d1aS9kZXZpY2VzLzEwMjR4NzY4L3Jlcy9pbWFnZXMvYmFja2dyb3VuZHNpZGUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2ViYTI4Li4wMDAwMDAwCi0tLSBhL2d1aS9kZXZpY2VzLzEwMjR4NzY4L3Jlcy9pbWFnZXMvYmFja2dyb3VuZHNpZGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvMTAyNHg3NjgvcmVzL2ltYWdlcy9sYXJnZV9ibGFjay5wbmcgYi9ndWkvZGV2aWNlcy8xMDI0eDc2OC9yZXMvaW1hZ2VzL2xhcmdlX2JsYWNrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmOGQzYi4uMDAwMDAwMAotLS0gYS9ndWkvZGV2aWNlcy8xMDI0eDc2OC9yZXMvaW1hZ2VzL2xhcmdlX2JsYWNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzEwMjR4NzY4L3Jlcy91aS54bWwgYi9ndWkvZGV2aWNlcy8xMDI0eDc2OC9yZXMvdWkueG1sCmluZGV4IGRkNTNkYTQuLjg2Y2ZkZGEgMTAwNjQ0Ci0tLSBhL2d1aS9kZXZpY2VzLzEwMjR4NzY4L3Jlcy91aS54bWwKKysrIGIvZ3VpL2RldmljZXMvMTAyNHg3NjgvcmVzL3VpLnhtbApAQCAtMTIsOSArMTIsNiBAQAogCTxyZXNvdXJjZXM+CiAJCTxyZXNvdXJjZSBuYW1lPSJmb250IiB0eXBlPSJmb250IiBmaWxlbmFtZT0iUm9ib3RvLVJlZ3VsYXItMjAiIC8+CiAJCTxyZXNvdXJjZSBuYW1lPSJiYXNlIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImJhY2tncm91bmQuanBnIiAvPgotCQk8cmVzb3VyY2UgbmFtZT0ic2lkZSIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJiYWNrZ3JvdW5kc2lkZS5qcGciIC8+Ci0JCTxyZXNvdXJjZSBuYW1lPSJib3R0b20iIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iYmFja2dyb3VuZGJvdHRvbS5qcGciIC8+Ci0JCTxyZXNvdXJjZSBuYW1lPSJsYXJnZV9ibGFjayIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJsYXJnZV9ibGFjayIgLz4KIAkJPHJlc291cmNlIG5hbWU9Im1haW5fYnV0dG9uIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImJ1dHRvbiIgLz4KIAkJPHJlc291cmNlIG5hbWU9ImZpbGVfaWNvbiIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJmaWxlIiAvPgogCQk8cmVzb3VyY2UgbmFtZT0iZm9sZGVyX2ljb24iIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iZm9sZGVyIiAvPgpAQCAtMjEzLDM0ICsyMTAsMTQgQEAKIAkJCTxiYWNrZ3JvdW5kIGNvbG9yPSIjMDAwMDAwRkYiIC8+CiAKIAkJCTxvYmplY3QgdHlwZT0iaW1hZ2UiPgotCQkJCTxpbWFnZSByZXNvdXJjZT0ic2lkZSIgLz4KLQkJCQk8cGxhY2VtZW50IHg9IjAiIHk9IjAiIC8+Ci0JCQk8L29iamVjdD4KLQotCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+Ci0JCQkJPGltYWdlIHJlc291cmNlPSJzaWRlIiAvPgotCQkJCTxwbGFjZW1lbnQgeD0iOTk0IiB5PSIwIiAvPgotCQkJPC9vYmplY3Q+Ci0KLQkJCTxvYmplY3QgdHlwZT0iaW1hZ2UiPgogCQkJCTxpbWFnZSByZXNvdXJjZT0iYmFzZSIgLz4KIAkJCQk8cGxhY2VtZW50IHg9IjAiIHk9IjAiIC8+CiAJCQk8L29iamVjdD4KIAotCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+Ci0JCQkJPGltYWdlIHJlc291cmNlPSJib3R0b20iIC8+Ci0JCQkJPHBsYWNlbWVudCB4PSIxIiB5PSI3MzgiIC8+Ci0JCQk8L29iamVjdD4KLQotCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+Ci0JCQkJPGltYWdlIHJlc291cmNlPSJsYXJnZV9ibGFjayIgLz4KLQkJCQk8cGxhY2VtZW50IHg9IjAiIHk9IjAiIC8+Ci0JCQk8L29iamVjdD4KLQogCQkJPG9iamVjdCB0eXBlPSJ0ZXh0IiBjb2xvcj0iJXRleHRfY29sb3IlIj4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgLz4KIAkJCQk8cGxhY2VtZW50IHg9IjI1MCIgeT0iNSIgLz4KLQkJCQk8dGV4dD5UZWFtIFdpbiBSZWNvdmVyeSBQcm9qZWN0ICh0d3JwKSAgdiV0d192ZXJzaW9uJTwvdGV4dD4KKwkJCQk8dGV4dD5UZWFtIFdpbiBSZWNvdmVyeSBQcm9qZWN0ICB2JXR3X3ZlcnNpb24lPC90ZXh0PgogCQkJPC9vYmplY3Q+CiAKIAkJCTxvYmplY3QgdHlwZT0idGV4dCIgY29sb3I9IiV0ZXh0X2NvbG9yJSI+CkBAIC0xMjU5LDYgKzEyMzYsMTggQEAKIAkJCQk8bGlzdHR5cGUgbmFtZT0ic3RvcmFnZSIgLz4KIAkJCTwvb2JqZWN0PgogCisJCQk8b2JqZWN0IHR5cGU9ImJ1dHRvbiI+CisJCQkJPGhpZ2hsaWdodCBjb2xvcj0iJWhpZ2hsaWdodF9jb2xvciUiIC8+CisJCQkJPHBsYWNlbWVudCB4PSIlZmlsZW1hbmFnZXJfc2VsZWN0X3glIiB5PSIlcm93Ml95JSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPHRleHQ+T0s8L3RleHQ+CisJCQkJPGltYWdlIHJlc291cmNlPSJtYWluX2J1dHRvbiIgLz4KKwkJCQk8YWN0aW9ucz4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19jbGVhcl9kZXN0aW5hdGlvbj0ldHdfYmFjayU8L2FjdGlvbj4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0icGFnZSI+Y2xlYXJfdmFyczwvYWN0aW9uPgorCQkJCTwvYWN0aW9ucz4KKwkJCTwvb2JqZWN0PgorCiAJCQk8b2JqZWN0IHR5cGU9ImFjdGlvbiI+CiAJCQkJPHRvdWNoIGtleT0iaG9tZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJwYWdlIj5tYWluPC9hY3Rpb24+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8xMDgweDE5MjAvcmVzL2ltYWdlcy90b3AtYmFyLmpwZyBiL2d1aS9kZXZpY2VzLzEwODB4MTkyMC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnCmluZGV4IDUyNzdmNTkuLjUxMjFhMDMgMTAwNjQ0Ci0tLSBhL2d1aS9kZXZpY2VzLzEwODB4MTkyMC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnCisrKyBiL2d1aS9kZXZpY2VzLzEwODB4MTkyMC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzEwODB4MTkyMC9yZXMvdWkueG1sIGIvZ3VpL2RldmljZXMvMTA4MHgxOTIwL3Jlcy91aS54bWwKaW5kZXggMWM3NTdmYS4uZTIzMDg2YSAxMDA2NDQKLS0tIGEvZ3VpL2RldmljZXMvMTA4MHgxOTIwL3Jlcy91aS54bWwKKysrIGIvZ3VpL2RldmljZXMvMTA4MHgxOTIwL3Jlcy91aS54bWwKQEAgLTE3OSw3ICsxNzksNyBAQAogCQk8dmFyaWFibGUgbmFtZT0iYmFja3VwX2J1dHRvbl9yb3cyIiB2YWx1ZT0iMTIyMCIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9Im1vdW50X2xpc3RfaGVpZ2h0IiB2YWx1ZT0iMTAzNSIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9Im1vdW50X3N0b3JhZ2Vfcm93IiB2YWx1ZT0iMTI0MCIgLz4KLQkJPHZhcmlhYmxlIG5hbWU9InN0b3JhZ2VfbGlzdF9oZWlnaHQiIHZhbHVlPSIxMzEzIiAvPgorCQk8dmFyaWFibGUgbmFtZT0ic3RvcmFnZV9saXN0X2hlaWdodCIgdmFsdWU9IjEwMDAiIC8+CiAJCTx2YXJpYWJsZSBuYW1lPSJ3aXBlX2xpc3RfaGVpZ2h0IiB2YWx1ZT0iMTMwNSIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9IndpcGVfYnV0dG9uX3kiIHZhbHVlPSI5NzUiIC8+CiAJCTx2YXJpYWJsZSBuYW1lPSJzbGlkZXJ2YWx1ZV93IiB2YWx1ZT0iMTA2MCIgLz4KQEAgLTIwOTcsNiArMjA5NywxOCBAQAogCQkJCTxsaXN0dHlwZSBuYW1lPSJzdG9yYWdlIiAvPgogCQkJPC9vYmplY3Q+CiAKKwkJCTxvYmplY3QgdHlwZT0iYnV0dG9uIj4KKwkJCQk8aGlnaGxpZ2h0IGNvbG9yPSIlaGlnaGxpZ2h0X2NvbG9yJSIgLz4KKwkJCQk8cGxhY2VtZW50IHg9IiVjb2xfY2VudGVyX3glIiB5PSIlcm93NF95JSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPHRleHQ+T0s8L3RleHQ+CisJCQkJPGltYWdlIHJlc291cmNlPSJtYWluX2J1dHRvbiIgLz4KKwkJCQk8YWN0aW9ucz4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19jbGVhcl9kZXN0aW5hdGlvbj0ldHdfYmFjayU8L2FjdGlvbj4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0icGFnZSI+Y2xlYXJfdmFyczwvYWN0aW9uPgorCQkJCTwvYWN0aW9ucz4KKwkJCTwvb2JqZWN0PgorCiAJCQk8b2JqZWN0IHR5cGU9ImFjdGlvbiI+CiAJCQkJPHRvdWNoIGtleT0iaG9tZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJwYWdlIj5tYWluPC9hY3Rpb24+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8xMjgweDgwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmQuanBnIGIvZ3VpL2RldmljZXMvMTI4MHg4MDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kLmpwZwppbmRleCAzZjkyNTdkLi5kOTY4MWM2IDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy8xMjgweDgwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmQuanBnCisrKyBiL2d1aS9kZXZpY2VzLzEyODB4ODAwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvMTI4MHg4MDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kYm90dG9tLmpwZyBiL2d1aS9kZXZpY2VzLzEyODB4ODAwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZGJvdHRvbS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmNhNGQuLjAwMDAwMDAKLS0tIGEvZ3VpL2RldmljZXMvMTI4MHg4MDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kYm90dG9tLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzEyODB4ODAwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZHNpZGUuanBnIGIvZ3VpL2RldmljZXMvMTI4MHg4MDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kc2lkZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjM2M4YWIuLjAwMDAwMDAKLS0tIGEvZ3VpL2RldmljZXMvMTI4MHg4MDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kc2lkZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8xMjgweDgwMC9yZXMvaW1hZ2VzL2xhcmdlX2JsYWNrLnBuZyBiL2d1aS9kZXZpY2VzLzEyODB4ODAwL3Jlcy9pbWFnZXMvbGFyZ2VfYmxhY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2UwY2M3Li4wMDAwMDAwCi0tLSBhL2d1aS9kZXZpY2VzLzEyODB4ODAwL3Jlcy9pbWFnZXMvbGFyZ2VfYmxhY2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvMTI4MHg4MDAvcmVzL3VpLnhtbCBiL2d1aS9kZXZpY2VzLzEyODB4ODAwL3Jlcy91aS54bWwKaW5kZXggOGJhYmRhMS4uNGEwNjZhMyAxMDA2NDQKLS0tIGEvZ3VpL2RldmljZXMvMTI4MHg4MDAvcmVzL3VpLnhtbAorKysgYi9ndWkvZGV2aWNlcy8xMjgweDgwMC9yZXMvdWkueG1sCkBAIC0xMiw5ICsxMiw2IEBACiAJPHJlc291cmNlcz4KIAkJPHJlc291cmNlIG5hbWU9ImZvbnQiIHR5cGU9ImZvbnQiIGZpbGVuYW1lPSJSb2JvdG8tUmVndWxhci0yMCIgLz4KIAkJPHJlc291cmNlIG5hbWU9ImJhc2UiIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iYmFja2dyb3VuZC5qcGciIC8+Ci0JCTxyZXNvdXJjZSBuYW1lPSJzaWRlIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImJhY2tncm91bmRzaWRlLmpwZyIgLz4KLQkJPHJlc291cmNlIG5hbWU9ImJvdHRvbSIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJiYWNrZ3JvdW5kYm90dG9tLmpwZyIgLz4KLQkJPHJlc291cmNlIG5hbWU9ImxhcmdlX2JsYWNrIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImxhcmdlX2JsYWNrIiAvPgogCQk8cmVzb3VyY2UgbmFtZT0ibWFpbl9idXR0b24iIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iYnV0dG9uIiAvPgogCQk8cmVzb3VyY2UgbmFtZT0iZmlsZV9pY29uIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImZpbGUiIC8+CiAJCTxyZXNvdXJjZSBuYW1lPSJmb2xkZXJfaWNvbiIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJmb2xkZXIiIC8+CkBAIC0yMTMsMzQgKzIxMCwxNCBAQAogCQkJPGJhY2tncm91bmQgY29sb3I9IiMwMDAwMDBGRiIgLz4KIAogCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+Ci0JCQkJPGltYWdlIHJlc291cmNlPSJzaWRlIiAvPgotCQkJCTxwbGFjZW1lbnQgeD0iMCIgeT0iMCIgLz4KLQkJCTwvb2JqZWN0PgotCi0JCQk8b2JqZWN0IHR5cGU9ImltYWdlIj4KLQkJCQk8aW1hZ2UgcmVzb3VyY2U9InNpZGUiIC8+Ci0JCQkJPHBsYWNlbWVudCB4PSIxMjUwIiB5PSIwIiAvPgotCQkJPC9vYmplY3Q+Ci0KLQkJCTxvYmplY3QgdHlwZT0iaW1hZ2UiPgogCQkJCTxpbWFnZSByZXNvdXJjZT0iYmFzZSIgLz4KIAkJCQk8cGxhY2VtZW50IHg9IjAiIHk9IjAiIC8+CiAJCQk8L29iamVjdD4KIAotCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+Ci0JCQkJPGltYWdlIHJlc291cmNlPSJib3R0b20iIC8+Ci0JCQkJPHBsYWNlbWVudCB4PSIxIiB5PSI3NzAiIC8+Ci0JCQk8L29iamVjdD4KLQotCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+Ci0JCQkJPGltYWdlIHJlc291cmNlPSJsYXJnZV9ibGFjayIgLz4KLQkJCQk8cGxhY2VtZW50IHg9IjAiIHk9IjAiIC8+Ci0JCQk8L29iamVjdD4KLQogCQkJPG9iamVjdCB0eXBlPSJ0ZXh0IiBjb2xvcj0iJXRleHRfY29sb3IlIj4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgLz4KIAkJCQk8cGxhY2VtZW50IHg9IjI1MCIgeT0iNSIgLz4KLQkJCQk8dGV4dD5UZWFtIFdpbiBSZWNvdmVyeSBQcm9qZWN0ICh0d3JwKSAgdiV0d192ZXJzaW9uJTwvdGV4dD4KKwkJCQk8dGV4dD5UZWFtIFdpbiBSZWNvdmVyeSBQcm9qZWN0ICB2JXR3X3ZlcnNpb24lPC90ZXh0PgogCQkJPC9vYmplY3Q+CiAKIAkJCTxvYmplY3QgdHlwZT0idGV4dCIgY29sb3I9IiV0ZXh0X2NvbG9yJSI+CkBAIC0xMjU5LDYgKzEyMzYsMTggQEAKIAkJCQk8bGlzdHR5cGUgbmFtZT0ic3RvcmFnZSIgLz4KIAkJCTwvb2JqZWN0PgogCisJCQk8b2JqZWN0IHR5cGU9ImJ1dHRvbiI+CisJCQkJPGhpZ2hsaWdodCBjb2xvcj0iJWhpZ2hsaWdodF9jb2xvciUiIC8+CisJCQkJPHBsYWNlbWVudCB4PSIlZmlsZW1hbmFnZXJfc2VsZWN0X3glIiB5PSIlcm93Ml95JSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPHRleHQ+T0s8L3RleHQ+CisJCQkJPGltYWdlIHJlc291cmNlPSJtYWluX2J1dHRvbiIgLz4KKwkJCQk8YWN0aW9ucz4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19jbGVhcl9kZXN0aW5hdGlvbj0ldHdfYmFjayU8L2FjdGlvbj4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0icGFnZSI+Y2xlYXJfdmFyczwvYWN0aW9uPgorCQkJCTwvYWN0aW9ucz4KKwkJCTwvb2JqZWN0PgorCiAJCQk8b2JqZWN0IHR5cGU9ImFjdGlvbiI+CiAJCQkJPHRvdWNoIGtleT0iaG9tZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJwYWdlIj5tYWluPC9hY3Rpb24+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8xOTIweDEyMDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kLmpwZyBiL2d1aS9kZXZpY2VzLzE5MjB4MTIwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmQuanBnCmluZGV4IGY3ZmFhYmEuLjllNjFmOWUgMTAwNjQ0Ci0tLSBhL2d1aS9kZXZpY2VzLzE5MjB4MTIwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmQuanBnCisrKyBiL2d1aS9kZXZpY2VzLzE5MjB4MTIwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzE5MjB4MTIwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmRib3R0b20uanBnIGIvZ3VpL2RldmljZXMvMTkyMHgxMjAwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZGJvdHRvbS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZjY0ZGEuLjAwMDAwMDAKLS0tIGEvZ3VpL2RldmljZXMvMTkyMHgxMjAwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZGJvdHRvbS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8xOTIweDEyMDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kc2lkZS5qcGcgYi9ndWkvZGV2aWNlcy8xOTIweDEyMDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kc2lkZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YTEwNjAuLjAwMDAwMDAKLS0tIGEvZ3VpL2RldmljZXMvMTkyMHgxMjAwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZHNpZGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvMTkyMHgxMjAwL3Jlcy9pbWFnZXMvbGFyZ2VfYmxhY2sucG5nIGIvZ3VpL2RldmljZXMvMTkyMHgxMjAwL3Jlcy9pbWFnZXMvbGFyZ2VfYmxhY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTk0OGVlLi4wMDAwMDAwCi0tLSBhL2d1aS9kZXZpY2VzLzE5MjB4MTIwMC9yZXMvaW1hZ2VzL2xhcmdlX2JsYWNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzE5MjB4MTIwMC9yZXMvdWkueG1sIGIvZ3VpL2RldmljZXMvMTkyMHgxMjAwL3Jlcy91aS54bWwKaW5kZXggMGNjNGQ3ZS4uNDU4YTcyMyAxMDA2NDQKLS0tIGEvZ3VpL2RldmljZXMvMTkyMHgxMjAwL3Jlcy91aS54bWwKKysrIGIvZ3VpL2RldmljZXMvMTkyMHgxMjAwL3Jlcy91aS54bWwKQEAgLTEyLDkgKzEyLDYgQEAKIAk8cmVzb3VyY2VzPgogCQk8cmVzb3VyY2UgbmFtZT0iZm9udCIgdHlwZT0iZm9udCIgZmlsZW5hbWU9IlJvYm90by1SZWd1bGFyLTMwIiAvPgogCQk8cmVzb3VyY2UgbmFtZT0iYmFzZSIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJiYWNrZ3JvdW5kLmpwZyIgLz4KLQkJPHJlc291cmNlIG5hbWU9InNpZGUiIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iYmFja2dyb3VuZHNpZGUuanBnIiAvPgotCQk8cmVzb3VyY2UgbmFtZT0iYm90dG9tIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImJhY2tncm91bmRib3R0b20uanBnIiAvPgotCQk8cmVzb3VyY2UgbmFtZT0ibGFyZ2VfYmxhY2siIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0ibGFyZ2VfYmxhY2siIC8+CiAJCTxyZXNvdXJjZSBuYW1lPSJtYWluX2J1dHRvbiIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJidXR0b24iIC8+CiAJCTxyZXNvdXJjZSBuYW1lPSJmaWxlX2ljb24iIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iZmlsZSIgLz4KIAkJPHJlc291cmNlIG5hbWU9ImZvbGRlcl9pY29uIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImZvbGRlciIgLz4KQEAgLTIxMywzNCArMjEwLDE0IEBACiAJCQk8YmFja2dyb3VuZCBjb2xvcj0iIzAwMDAwMEZGIiAvPgogCiAJCQk8b2JqZWN0IHR5cGU9ImltYWdlIj4KLQkJCQk8aW1hZ2UgcmVzb3VyY2U9InNpZGUiIC8+Ci0JCQkJPHBsYWNlbWVudCB4PSIwIiB5PSIwIiAvPgotCQkJPC9vYmplY3Q+Ci0KLQkJCTxvYmplY3QgdHlwZT0iaW1hZ2UiPgotCQkJCTxpbWFnZSByZXNvdXJjZT0ic2lkZSIgLz4KLQkJCQk8cGxhY2VtZW50IHg9IjE4NzUiIHk9IjAiIC8+Ci0JCQk8L29iamVjdD4KLQotCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+CiAJCQkJPGltYWdlIHJlc291cmNlPSJiYXNlIiAvPgogCQkJCTxwbGFjZW1lbnQgeD0iMCIgeT0iMCIgLz4KIAkJCTwvb2JqZWN0PgogCi0JCQk8b2JqZWN0IHR5cGU9ImltYWdlIj4KLQkJCQk8aW1hZ2UgcmVzb3VyY2U9ImJvdHRvbSIgLz4KLQkJCQk8cGxhY2VtZW50IHg9IjEiIHk9IjExNTUiIC8+Ci0JCQk8L29iamVjdD4KLQotCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+Ci0JCQkJPGltYWdlIHJlc291cmNlPSJsYXJnZV9ibGFjayIgLz4KLQkJCQk8cGxhY2VtZW50IHg9IjAiIHk9IjAiIC8+Ci0JCQk8L29iamVjdD4KLQogCQkJPG9iamVjdCB0eXBlPSJ0ZXh0IiBjb2xvcj0iJXRleHRfY29sb3IlIj4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgLz4KIAkJCQk8cGxhY2VtZW50IHg9IjI1MCIgeT0iNSIgLz4KLQkJCQk8dGV4dD5UZWFtIFdpbiBSZWNvdmVyeSBQcm9qZWN0ICh0d3JwKSAgdiV0d192ZXJzaW9uJTwvdGV4dD4KKwkJCQk8dGV4dD5UZWFtIFdpbiBSZWNvdmVyeSBQcm9qZWN0ICB2JXR3X3ZlcnNpb24lPC90ZXh0PgogCQkJPC9vYmplY3Q+CiAKIAkJCTxvYmplY3QgdHlwZT0idGV4dCIgY29sb3I9IiV0ZXh0X2NvbG9yJSI+CkBAIC0xMjU5LDYgKzEyMzYsMTggQEAKIAkJCQk8bGlzdHR5cGUgbmFtZT0ic3RvcmFnZSIgLz4KIAkJCTwvb2JqZWN0PgogCisJCQk8b2JqZWN0IHR5cGU9ImJ1dHRvbiI+CisJCQkJPGhpZ2hsaWdodCBjb2xvcj0iJWhpZ2hsaWdodF9jb2xvciUiIC8+CisJCQkJPHBsYWNlbWVudCB4PSIlZmlsZW1hbmFnZXJfc2VsZWN0X3glIiB5PSIlcm93Ml95JSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPHRleHQ+T0s8L3RleHQ+CisJCQkJPGltYWdlIHJlc291cmNlPSJtYWluX2J1dHRvbiIgLz4KKwkJCQk8YWN0aW9ucz4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19jbGVhcl9kZXN0aW5hdGlvbj0ldHdfYmFjayU8L2FjdGlvbj4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0icGFnZSI+Y2xlYXJfdmFyczwvYWN0aW9uPgorCQkJCTwvYWN0aW9ucz4KKwkJCTwvb2JqZWN0PgorCiAJCQk8b2JqZWN0IHR5cGU9ImFjdGlvbiI+CiAJCQkJPHRvdWNoIGtleT0iaG9tZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJwYWdlIj5tYWluPC9hY3Rpb24+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8yNTYweDE2MDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kLmpwZyBiL2d1aS9kZXZpY2VzLzI1NjB4MTYwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmQuanBnCmluZGV4IDlkNDA5MDkuLjNiOGE3MWEgMTAwNjQ0Ci0tLSBhL2d1aS9kZXZpY2VzLzI1NjB4MTYwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmQuanBnCisrKyBiL2d1aS9kZXZpY2VzLzI1NjB4MTYwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzI1NjB4MTYwMC9yZXMvaW1hZ2VzL2JhY2tncm91bmRib3R0b20uanBnIGIvZ3VpL2RldmljZXMvMjU2MHgxNjAwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZGJvdHRvbS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3MjQuLjAwMDAwMDAKLS0tIGEvZ3VpL2RldmljZXMvMjU2MHgxNjAwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZGJvdHRvbS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8yNTYweDE2MDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kc2lkZS5qcGcgYi9ndWkvZGV2aWNlcy8yNTYweDE2MDAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kc2lkZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NTgwNmQuLjAwMDAwMDAKLS0tIGEvZ3VpL2RldmljZXMvMjU2MHgxNjAwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZHNpZGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvMjU2MHgxNjAwL3Jlcy9pbWFnZXMvbGFyZ2VfYmxhY2sucG5nIGIvZ3VpL2RldmljZXMvMjU2MHgxNjAwL3Jlcy9pbWFnZXMvbGFyZ2VfYmxhY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjkzZTJiLi4wMDAwMDAwCi0tLSBhL2d1aS9kZXZpY2VzLzI1NjB4MTYwMC9yZXMvaW1hZ2VzL2xhcmdlX2JsYWNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzI1NjB4MTYwMC9yZXMvdWkueG1sIGIvZ3VpL2RldmljZXMvMjU2MHgxNjAwL3Jlcy91aS54bWwKaW5kZXggYzllNmM2OS4uNmE3N2E0ZiAxMDA2NDQKLS0tIGEvZ3VpL2RldmljZXMvMjU2MHgxNjAwL3Jlcy91aS54bWwKKysrIGIvZ3VpL2RldmljZXMvMjU2MHgxNjAwL3Jlcy91aS54bWwKQEAgLTEyLDkgKzEyLDYgQEAKIAk8cmVzb3VyY2VzPgogCQk8cmVzb3VyY2UgbmFtZT0iZm9udCIgdHlwZT0iZm9udCIgZmlsZW5hbWU9IlJvYm90by1SZWd1bGFyLTQwIiAvPgogCQk8cmVzb3VyY2UgbmFtZT0iYmFzZSIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJiYWNrZ3JvdW5kLmpwZyIgLz4KLQkJPHJlc291cmNlIG5hbWU9InNpZGUiIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iYmFja2dyb3VuZHNpZGUuanBnIiAvPgotCQk8cmVzb3VyY2UgbmFtZT0iYm90dG9tIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImJhY2tncm91bmRib3R0b20uanBnIiAvPgotCQk8cmVzb3VyY2UgbmFtZT0ibGFyZ2VfYmxhY2siIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0ibGFyZ2VfYmxhY2siIC8+CiAJCTxyZXNvdXJjZSBuYW1lPSJtYWluX2J1dHRvbiIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJidXR0b24iIC8+CiAJCTxyZXNvdXJjZSBuYW1lPSJmaWxlX2ljb24iIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iZmlsZSIgLz4KIAkJPHJlc291cmNlIG5hbWU9ImZvbGRlcl9pY29uIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImZvbGRlciIgLz4KQEAgLTIxMywzNCArMjEwLDE0IEBACiAJCQk8YmFja2dyb3VuZCBjb2xvcj0iIzAwMDAwMEZGIiAvPgogCiAJCQk8b2JqZWN0IHR5cGU9ImltYWdlIj4KLQkJCQk8aW1hZ2UgcmVzb3VyY2U9InNpZGUiIC8+Ci0JCQkJPHBsYWNlbWVudCB4PSIwIiB5PSIwIiAvPgotCQkJPC9vYmplY3Q+Ci0KLQkJCTxvYmplY3QgdHlwZT0iaW1hZ2UiPgotCQkJCTxpbWFnZSByZXNvdXJjZT0ic2lkZSIgLz4KLQkJCQk8cGxhY2VtZW50IHg9IjI1MDAiIHk9IjAiIC8+Ci0JCQk8L29iamVjdD4KLQotCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+CiAJCQkJPGltYWdlIHJlc291cmNlPSJiYXNlIiAvPgogCQkJCTxwbGFjZW1lbnQgeD0iMCIgeT0iMCIgLz4KIAkJCTwvb2JqZWN0PgogCi0JCQk8b2JqZWN0IHR5cGU9ImltYWdlIj4KLQkJCQk8aW1hZ2UgcmVzb3VyY2U9ImJvdHRvbSIgLz4KLQkJCQk8cGxhY2VtZW50IHg9IjEiIHk9IjE1NDAiIC8+Ci0JCQk8L29iamVjdD4KLQotCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+Ci0JCQkJPGltYWdlIHJlc291cmNlPSJsYXJnZV9ibGFjayIgLz4KLQkJCQk8cGxhY2VtZW50IHg9IjAiIHk9IjAiIC8+Ci0JCQk8L29iamVjdD4KLQogCQkJPG9iamVjdCB0eXBlPSJ0ZXh0IiBjb2xvcj0iJXRleHRfY29sb3IlIj4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgLz4KIAkJCQk8cGxhY2VtZW50IHg9IjQwMCIgeT0iOCIgLz4KLQkJCQk8dGV4dD5UZWFtIFdpbiBSZWNvdmVyeSBQcm9qZWN0ICh0d3JwKSAgdiV0d192ZXJzaW9uJTwvdGV4dD4KKwkJCQk8dGV4dD5UZWFtIFdpbiBSZWNvdmVyeSBQcm9qZWN0ICB2JXR3X3ZlcnNpb24lPC90ZXh0PgogCQkJPC9vYmplY3Q+CiAKIAkJCTxvYmplY3QgdHlwZT0idGV4dCIgY29sb3I9IiV0ZXh0X2NvbG9yJSI+CkBAIC0xMjU5LDYgKzEyMzYsMTggQEAKIAkJCQk8bGlzdHR5cGUgbmFtZT0ic3RvcmFnZSIgLz4KIAkJCTwvb2JqZWN0PgogCisJCQk8b2JqZWN0IHR5cGU9ImJ1dHRvbiI+CisJCQkJPGhpZ2hsaWdodCBjb2xvcj0iJWhpZ2hsaWdodF9jb2xvciUiIC8+CisJCQkJPHBsYWNlbWVudCB4PSIlZmlsZW1hbmFnZXJfc2VsZWN0X3glIiB5PSIlcm93Ml95JSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPHRleHQ+T0s8L3RleHQ+CisJCQkJPGltYWdlIHJlc291cmNlPSJtYWluX2J1dHRvbiIgLz4KKwkJCQk8YWN0aW9ucz4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19jbGVhcl9kZXN0aW5hdGlvbj0ldHdfYmFjayU8L2FjdGlvbj4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0icGFnZSI+Y2xlYXJfdmFyczwvYWN0aW9uPgorCQkJCTwvYWN0aW9ucz4KKwkJCTwvb2JqZWN0PgorCiAJCQk8b2JqZWN0IHR5cGU9ImFjdGlvbiI+CiAJCQkJPHRvdWNoIGtleT0iaG9tZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJwYWdlIj5tYWluPC9hY3Rpb24+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8zMjB4NDgwL3Jlcy9pbWFnZXMvdG9wLWJhci5qcGcgYi9ndWkvZGV2aWNlcy8zMjB4NDgwL3Jlcy9pbWFnZXMvdG9wLWJhci5qcGcKaW5kZXggMzUxZjU4Yi4uYTBkNTA2OCAxMDA2NDQKLS0tIGEvZ3VpL2RldmljZXMvMzIweDQ4MC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnCisrKyBiL2d1aS9kZXZpY2VzLzMyMHg0ODAvcmVzL2ltYWdlcy90b3AtYmFyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8zMjB4NDgwL3Jlcy91aS54bWwgYi9ndWkvZGV2aWNlcy8zMjB4NDgwL3Jlcy91aS54bWwKaW5kZXggNmQyNThiMC4uMDQxYTEzNSAxMDA2NDQKLS0tIGEvZ3VpL2RldmljZXMvMzIweDQ4MC9yZXMvdWkueG1sCisrKyBiL2d1aS9kZXZpY2VzLzMyMHg0ODAvcmVzL3VpLnhtbApAQCAtMTc0LDcgKzE3NCw3IEBACiAJCTx2YXJpYWJsZSBuYW1lPSJiYWNrdXBfYnV0dG9uX3JvdzIiIHZhbHVlPSIzMjYiIC8+CiAJCTx2YXJpYWJsZSBuYW1lPSJtb3VudF9saXN0X2hlaWdodCIgdmFsdWU9IjI3MCIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9Im1vdW50X3N0b3JhZ2Vfcm93IiB2YWx1ZT0iMzQwIiAvPgotCQk8dmFyaWFibGUgbmFtZT0ic3RvcmFnZV9saXN0X2hlaWdodCIgdmFsdWU9IjM0MCIgLz4KKwkJPHZhcmlhYmxlIG5hbWU9InN0b3JhZ2VfbGlzdF9oZWlnaHQiIHZhbHVlPSIyOTAiIC8+CiAJCTx2YXJpYWJsZSBuYW1lPSJ3aXBlX2xpc3RfaGVpZ2h0IiB2YWx1ZT0iMzMwIiAvPgogCQk8dmFyaWFibGUgbmFtZT0id2lwZV9idXR0b25feSIgdmFsdWU9IjI3MCIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9InNsaWRlcnZhbHVlX3ciIHZhbHVlPSIzMDQiIC8+CkBAIC0yMDg0LDYgKzIwODQsMTggQEAKIAkJCQk8bGlzdHR5cGUgbmFtZT0ic3RvcmFnZSIgLz4KIAkJCTwvb2JqZWN0PgogCisJCQk8b2JqZWN0IHR5cGU9ImJ1dHRvbiI+CisJCQkJPGhpZ2hsaWdodCBjb2xvcj0iJWhpZ2hsaWdodF9jb2xvciUiIC8+CisJCQkJPHBsYWNlbWVudCB4PSIlY29sX2NlbnRlcl94JSIgeT0iJXJvdzRfeSUiIC8+CisJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIlYnV0dG9uX3RleHRfY29sb3IlIiAvPgorCQkJCTx0ZXh0Pk9LPC90ZXh0PgorCQkJCTxpbWFnZSByZXNvdXJjZT0ibWFpbl9idXR0b24iIC8+CisJCQkJPGFjdGlvbnM+CisJCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfY2xlYXJfZGVzdGluYXRpb249JXR3X2JhY2slPC9hY3Rpb24+CisJCQkJCTxhY3Rpb24gZnVuY3Rpb249InBhZ2UiPmNsZWFyX3ZhcnM8L2FjdGlvbj4KKwkJCQk8L2FjdGlvbnM+CisJCQk8L29iamVjdD4KKwogCQkJPG9iamVjdCB0eXBlPSJhY3Rpb24iPgogCQkJCTx0b3VjaCBrZXk9ImhvbWUiIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0icGFnZSI+bWFpbjwvYWN0aW9uPgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvNDgweDgwMC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnIGIvZ3VpL2RldmljZXMvNDgweDgwMC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnCmluZGV4IDk3YTBiNWYuLmQ4YWI5MzMgMTAwNjQ0Ci0tLSBhL2d1aS9kZXZpY2VzLzQ4MHg4MDAvcmVzL2ltYWdlcy90b3AtYmFyLmpwZworKysgYi9ndWkvZGV2aWNlcy80ODB4ODAwL3Jlcy9pbWFnZXMvdG9wLWJhci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvNDgweDgwMC9yZXMvdWkueG1sIGIvZ3VpL2RldmljZXMvNDgweDgwMC9yZXMvdWkueG1sCmluZGV4IGZkZWJmMTUuLjJiNDI4YjQgMTAwNjQ0Ci0tLSBhL2d1aS9kZXZpY2VzLzQ4MHg4MDAvcmVzL3VpLnhtbAorKysgYi9ndWkvZGV2aWNlcy80ODB4ODAwL3Jlcy91aS54bWwKQEAgLTI4MSw3ICsyODEsNyBAQAogCiAJCQk8b2JqZWN0IHR5cGU9ImJ1dHRvbiI+CiAJCQkJPHBsYWNlbWVudCB4PSIlc29ydF9jb2wxX2J1dHRvbl94JSIgeT0iJXNvcnRfYXNjX2J1dHRvbl95JSIgLz4KLQkJCQk8Zm9udCByZXNvdXJjZT0iVUl0ZXh0IiBjb2xvcj0iJWJ1dHRvbl90ZXh0X2NvbG9yJSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CiAJCQkJPHRleHQ+TmFtZTwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9InNvcnRfYnV0dG9uIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfZ3VpX3NvcnRfb3JkZXI9MTwvYWN0aW9uPgpAQCAtMjg5LDcgKzI4OSw3IEBACiAKIAkJCTxvYmplY3QgdHlwZT0iYnV0dG9uIj4KIAkJCQk8cGxhY2VtZW50IHg9IiVzb3J0X2NvbDJfYnV0dG9uX3glIiB5PSIlc29ydF9hc2NfYnV0dG9uX3klIiAvPgotCQkJCTxmb250IHJlc291cmNlPSJVSXRleHQiIGNvbG9yPSIlYnV0dG9uX3RleHRfY29sb3IlIiAvPgorCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJWJ1dHRvbl90ZXh0X2NvbG9yJSIgLz4KIAkJCQk8dGV4dD5EYXRlPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0ic29ydF9idXR0b24iIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19ndWlfc29ydF9vcmRlcj0yPC9hY3Rpb24+CkBAIC0yOTcsNyArMjk3LDcgQEAKIAogCQkJPG9iamVjdCB0eXBlPSJidXR0b24iPgogCQkJCTxwbGFjZW1lbnQgeD0iJXNvcnRfY29sM19idXR0b25feCUiIHk9IiVzb3J0X2FzY19idXR0b25feSUiIC8+Ci0JCQkJPGZvbnQgcmVzb3VyY2U9IlVJdGV4dCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIlYnV0dG9uX3RleHRfY29sb3IlIiAvPgogCQkJCTx0ZXh0PlNpemU8L3RleHQ+CiAJCQkJPGltYWdlIHJlc291cmNlPSJzb3J0X2J1dHRvbiIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X2d1aV9zb3J0X29yZGVyPTM8L2FjdGlvbj4KQEAgLTMxMSw3ICszMTEsNyBAQAogCiAJCQk8b2JqZWN0IHR5cGU9ImJ1dHRvbiI+CiAJCQkJPHBsYWNlbWVudCB4PSIlc29ydF9jb2wxX2J1dHRvbl94JSIgeT0iJXNvcnRfZGVzY19idXR0b25feSUiIC8+Ci0JCQkJPGZvbnQgcmVzb3VyY2U9IlVJdGV4dCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIlYnV0dG9uX3RleHRfY29sb3IlIiAvPgogCQkJCTx0ZXh0Pk5hbWU8L3RleHQ+CiAJCQkJPGltYWdlIHJlc291cmNlPSJzb3J0X2J1dHRvbiIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X2d1aV9zb3J0X29yZGVyPS0xPC9hY3Rpb24+CkBAIC0zMTksNyArMzE5LDcgQEAKIAogCQkJPG9iamVjdCB0eXBlPSJidXR0b24iPgogCQkJCTxwbGFjZW1lbnQgeD0iJXNvcnRfY29sMl9idXR0b25feCUiIHk9IiVzb3J0X2Rlc2NfYnV0dG9uX3klIiAvPgotCQkJCTxmb250IHJlc291cmNlPSJVSXRleHQiIGNvbG9yPSIlYnV0dG9uX3RleHRfY29sb3IlIiAvPgorCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJWJ1dHRvbl90ZXh0X2NvbG9yJSIgLz4KIAkJCQk8dGV4dD5EYXRlPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0ic29ydF9idXR0b24iIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19ndWlfc29ydF9vcmRlcj0tMjwvYWN0aW9uPgpAQCAtMzI3LDcgKzMyNyw3IEBACiAKIAkJCTxvYmplY3QgdHlwZT0iYnV0dG9uIj4KIAkJCQk8cGxhY2VtZW50IHg9IiVzb3J0X2NvbDNfYnV0dG9uX3glIiB5PSIlc29ydF9kZXNjX2J1dHRvbl95JSIgLz4KLQkJCQk8Zm9udCByZXNvdXJjZT0iVUl0ZXh0IiBjb2xvcj0iJWJ1dHRvbl90ZXh0X2NvbG9yJSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CiAJCQkJPHRleHQ+U2l6ZTwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9InNvcnRfYnV0dG9uIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfZ3VpX3NvcnRfb3JkZXI9LTM8L2FjdGlvbj4KQEAgLTIwODQsNiArMjA4NCwxOCBAQAogCQkJCTxsaXN0dHlwZSBuYW1lPSJzdG9yYWdlIiAvPgogCQkJPC9vYmplY3Q+CiAKKwkJCTxvYmplY3QgdHlwZT0iYnV0dG9uIj4KKwkJCQk8aGlnaGxpZ2h0IGNvbG9yPSIlaGlnaGxpZ2h0X2NvbG9yJSIgLz4KKwkJCQk8cGxhY2VtZW50IHg9IiVjb2xfY2VudGVyX3glIiB5PSIlcm93NF95JSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPHRleHQ+T0s8L3RleHQ+CisJCQkJPGltYWdlIHJlc291cmNlPSJtYWluX2J1dHRvbiIgLz4KKwkJCQk8YWN0aW9ucz4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19jbGVhcl9kZXN0aW5hdGlvbj0ldHdfYmFjayU8L2FjdGlvbj4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0icGFnZSI+Y2xlYXJfdmFyczwvYWN0aW9uPgorCQkJCTwvYWN0aW9ucz4KKwkJCTwvb2JqZWN0PgorCiAJCQk8b2JqZWN0IHR5cGU9ImFjdGlvbiI+CiAJCQkJPHRvdWNoIGtleT0iaG9tZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJwYWdlIj5tYWluPC9hY3Rpb24+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy80ODB4ODU0L3Jlcy9pbWFnZXMvdG9wLWJhci5qcGcgYi9ndWkvZGV2aWNlcy80ODB4ODU0L3Jlcy9pbWFnZXMvdG9wLWJhci5qcGcKaW5kZXggOTdhMGI1Zi4uZDhhYjkzMyAxMDA2NDQKLS0tIGEvZ3VpL2RldmljZXMvNDgweDg1NC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnCisrKyBiL2d1aS9kZXZpY2VzLzQ4MHg4NTQvcmVzL2ltYWdlcy90b3AtYmFyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy80ODB4ODU0L3Jlcy91aS54bWwgYi9ndWkvZGV2aWNlcy80ODB4ODU0L3Jlcy91aS54bWwKaW5kZXggYjJhNWY0Yy4uZjhkNmRhMSAxMDA2NDQKLS0tIGEvZ3VpL2RldmljZXMvNDgweDg1NC9yZXMvdWkueG1sCisrKyBiL2d1aS9kZXZpY2VzLzQ4MHg4NTQvcmVzL3VpLnhtbApAQCAtMjgwLDcgKzI4MCw3IEBACiAKIAkJCTxvYmplY3QgdHlwZT0iYnV0dG9uIj4KIAkJCQk8cGxhY2VtZW50IHg9IiVzb3J0X2NvbDFfYnV0dG9uX3glIiB5PSIlc29ydF9hc2NfYnV0dG9uX3klIiAvPgotCQkJCTxmb250IHJlc291cmNlPSJVSXRleHQiIGNvbG9yPSIlYnV0dG9uX3RleHRfY29sb3IlIiAvPgorCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJWJ1dHRvbl90ZXh0X2NvbG9yJSIgLz4KIAkJCQk8dGV4dD5OYW1lPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0ic29ydF9idXR0b24iIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19ndWlfc29ydF9vcmRlcj0xPC9hY3Rpb24+CkBAIC0yODgsNyArMjg4LDcgQEAKIAogCQkJPG9iamVjdCB0eXBlPSJidXR0b24iPgogCQkJCTxwbGFjZW1lbnQgeD0iJXNvcnRfY29sMl9idXR0b25feCUiIHk9IiVzb3J0X2FzY19idXR0b25feSUiIC8+Ci0JCQkJPGZvbnQgcmVzb3VyY2U9IlVJdGV4dCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIlYnV0dG9uX3RleHRfY29sb3IlIiAvPgogCQkJCTx0ZXh0PkRhdGU8L3RleHQ+CiAJCQkJPGltYWdlIHJlc291cmNlPSJzb3J0X2J1dHRvbiIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X2d1aV9zb3J0X29yZGVyPTI8L2FjdGlvbj4KQEAgLTI5Niw3ICsyOTYsNyBAQAogCiAJCQk8b2JqZWN0IHR5cGU9ImJ1dHRvbiI+CiAJCQkJPHBsYWNlbWVudCB4PSIlc29ydF9jb2wzX2J1dHRvbl94JSIgeT0iJXNvcnRfYXNjX2J1dHRvbl95JSIgLz4KLQkJCQk8Zm9udCByZXNvdXJjZT0iVUl0ZXh0IiBjb2xvcj0iJWJ1dHRvbl90ZXh0X2NvbG9yJSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CiAJCQkJPHRleHQ+U2l6ZTwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9InNvcnRfYnV0dG9uIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfZ3VpX3NvcnRfb3JkZXI9MzwvYWN0aW9uPgpAQCAtMzEwLDcgKzMxMCw3IEBACiAKIAkJCTxvYmplY3QgdHlwZT0iYnV0dG9uIj4KIAkJCQk8cGxhY2VtZW50IHg9IiVzb3J0X2NvbDFfYnV0dG9uX3glIiB5PSIlc29ydF9kZXNjX2J1dHRvbl95JSIgLz4KLQkJCQk8Zm9udCByZXNvdXJjZT0iVUl0ZXh0IiBjb2xvcj0iJWJ1dHRvbl90ZXh0X2NvbG9yJSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CiAJCQkJPHRleHQ+TmFtZTwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9InNvcnRfYnV0dG9uIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfZ3VpX3NvcnRfb3JkZXI9LTE8L2FjdGlvbj4KQEAgLTMxOCw3ICszMTgsNyBAQAogCiAJCQk8b2JqZWN0IHR5cGU9ImJ1dHRvbiI+CiAJCQkJPHBsYWNlbWVudCB4PSIlc29ydF9jb2wyX2J1dHRvbl94JSIgeT0iJXNvcnRfZGVzY19idXR0b25feSUiIC8+Ci0JCQkJPGZvbnQgcmVzb3VyY2U9IlVJdGV4dCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIlYnV0dG9uX3RleHRfY29sb3IlIiAvPgogCQkJCTx0ZXh0PkRhdGU8L3RleHQ+CiAJCQkJPGltYWdlIHJlc291cmNlPSJzb3J0X2J1dHRvbiIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X2d1aV9zb3J0X29yZGVyPS0yPC9hY3Rpb24+CkBAIC0zMjYsNyArMzI2LDcgQEAKIAogCQkJPG9iamVjdCB0eXBlPSJidXR0b24iPgogCQkJCTxwbGFjZW1lbnQgeD0iJXNvcnRfY29sM19idXR0b25feCUiIHk9IiVzb3J0X2Rlc2NfYnV0dG9uX3klIiAvPgotCQkJCTxmb250IHJlc291cmNlPSJVSXRleHQiIGNvbG9yPSIlYnV0dG9uX3RleHRfY29sb3IlIiAvPgorCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJWJ1dHRvbl90ZXh0X2NvbG9yJSIgLz4KIAkJCQk8dGV4dD5TaXplPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0ic29ydF9idXR0b24iIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19ndWlfc29ydF9vcmRlcj0tMzwvYWN0aW9uPgpAQCAtMjA4Myw2ICsyMDgzLDE4IEBACiAJCQkJPGxpc3R0eXBlIG5hbWU9InN0b3JhZ2UiIC8+CiAJCQk8L29iamVjdD4KIAorCQkJPG9iamVjdCB0eXBlPSJidXR0b24iPgorCQkJCTxoaWdobGlnaHQgY29sb3I9IiVoaWdobGlnaHRfY29sb3IlIiAvPgorCQkJCTxwbGFjZW1lbnQgeD0iJWNvbF9jZW50ZXJfeCUiIHk9IiVyb3c0X3klIiAvPgorCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJWJ1dHRvbl90ZXh0X2NvbG9yJSIgLz4KKwkJCQk8dGV4dD5PSzwvdGV4dD4KKwkJCQk8aW1hZ2UgcmVzb3VyY2U9Im1haW5fYnV0dG9uIiAvPgorCQkJCTxhY3Rpb25zPgorCQkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X2NsZWFyX2Rlc3RpbmF0aW9uPSV0d19iYWNrJTwvYWN0aW9uPgorCQkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJwYWdlIj5jbGVhcl92YXJzPC9hY3Rpb24+CisJCQkJPC9hY3Rpb25zPgorCQkJPC9vYmplY3Q+CisKIAkJCTxvYmplY3QgdHlwZT0iYWN0aW9uIj4KIAkJCQk8dG91Y2gga2V5PSJob21lIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InBhZ2UiPm1haW48L2FjdGlvbj4KZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzU0MHg5NjAvcmVzL2ltYWdlcy90b3AtYmFyLmpwZyBiL2d1aS9kZXZpY2VzLzU0MHg5NjAvcmVzL2ltYWdlcy90b3AtYmFyLmpwZwppbmRleCA0NWY0MjA4Li5mYmU3MjMwIDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy81NDB4OTYwL3Jlcy9pbWFnZXMvdG9wLWJhci5qcGcKKysrIGIvZ3VpL2RldmljZXMvNTQweDk2MC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzU0MHg5NjAvcmVzL3VpLnhtbCBiL2d1aS9kZXZpY2VzLzU0MHg5NjAvcmVzL3VpLnhtbAppbmRleCBjNmIwYzkyLi43NDQ4ZGRmIDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy81NDB4OTYwL3Jlcy91aS54bWwKKysrIGIvZ3VpL2RldmljZXMvNTQweDk2MC9yZXMvdWkueG1sCkBAIC0xNzQsNyArMTc0LDcgQEAKIAkJPHZhcmlhYmxlIG5hbWU9ImJhY2t1cF9idXR0b25fcm93MiIgdmFsdWU9IjY0NSIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9Im1vdW50X2xpc3RfaGVpZ2h0IiB2YWx1ZT0iNTAwIiAvPgogCQk8dmFyaWFibGUgbmFtZT0ibW91bnRfc3RvcmFnZV9yb3ciIHZhbHVlPSI2MzAiIC8+Ci0JCTx2YXJpYWJsZSBuYW1lPSJzdG9yYWdlX2xpc3RfaGVpZ2h0IiB2YWx1ZT0iNjc1IiAvPgorCQk8dmFyaWFibGUgbmFtZT0ic3RvcmFnZV9saXN0X2hlaWdodCIgdmFsdWU9IjU3NSIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9IndpcGVfbGlzdF9oZWlnaHQiIHZhbHVlPSI2NzAiIC8+CiAJCTx2YXJpYWJsZSBuYW1lPSJ3aXBlX2J1dHRvbl95IiB2YWx1ZT0iNDc1IiAvPgogCQk8dmFyaWFibGUgbmFtZT0ic2xpZGVydmFsdWVfdyIgdmFsdWU9IjUyMCIgLz4KQEAgLTIwODQsNiArMjA4NCwxOCBAQAogCQkJCTxsaXN0dHlwZSBuYW1lPSJzdG9yYWdlIiAvPgogCQkJPC9vYmplY3Q+CiAKKwkJCTxvYmplY3QgdHlwZT0iYnV0dG9uIj4KKwkJCQk8aGlnaGxpZ2h0IGNvbG9yPSIlaGlnaGxpZ2h0X2NvbG9yJSIgLz4KKwkJCQk8cGxhY2VtZW50IHg9IiVjb2xfY2VudGVyX3glIiB5PSIlcm93NF95JSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPHRleHQ+T0s8L3RleHQ+CisJCQkJPGltYWdlIHJlc291cmNlPSJtYWluX2J1dHRvbiIgLz4KKwkJCQk8YWN0aW9ucz4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19jbGVhcl9kZXN0aW5hdGlvbj0ldHdfYmFjayU8L2FjdGlvbj4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0icGFnZSI+Y2xlYXJfdmFyczwvYWN0aW9uPgorCQkJCTwvYWN0aW9ucz4KKwkJCTwvb2JqZWN0PgorCiAJCQk8b2JqZWN0IHR5cGU9ImFjdGlvbiI+CiAJCQkJPHRvdWNoIGtleT0iaG9tZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJwYWdlIj5tYWluPC9hY3Rpb24+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy83MjB4MTI4MC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnIGIvZ3VpL2RldmljZXMvNzIweDEyODAvcmVzL2ltYWdlcy90b3AtYmFyLmpwZwppbmRleCBhMDkwOWQ1Li4wMmM4MDUxIDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy83MjB4MTI4MC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnCisrKyBiL2d1aS9kZXZpY2VzLzcyMHgxMjgwL3Jlcy9pbWFnZXMvdG9wLWJhci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvNzIweDEyODAvcmVzL3VpLnhtbCBiL2d1aS9kZXZpY2VzLzcyMHgxMjgwL3Jlcy91aS54bWwKaW5kZXggNTQ4MTExNC4uMjMxOWM1NSAxMDA2NDQKLS0tIGEvZ3VpL2RldmljZXMvNzIweDEyODAvcmVzL3VpLnhtbAorKysgYi9ndWkvZGV2aWNlcy83MjB4MTI4MC9yZXMvdWkueG1sCkBAIC0xNzksNyArMTc5LDcgQEAKIAkJPHZhcmlhYmxlIG5hbWU9ImJhY2t1cF9idXR0b25fcm93MiIgdmFsdWU9IjgxMCIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9Im1vdW50X2xpc3RfaGVpZ2h0IiB2YWx1ZT0iNjkwIiAvPgogCQk8dmFyaWFibGUgbmFtZT0ibW91bnRfc3RvcmFnZV9yb3ciIHZhbHVlPSI4MjAiIC8+Ci0JCTx2YXJpYWJsZSBuYW1lPSJzdG9yYWdlX2xpc3RfaGVpZ2h0IiB2YWx1ZT0iODc1IiAvPgorCQk8dmFyaWFibGUgbmFtZT0ic3RvcmFnZV9saXN0X2hlaWdodCIgdmFsdWU9Ijc3NSIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9IndpcGVfbGlzdF9oZWlnaHQiIHZhbHVlPSI4NzAiIC8+CiAJCTx2YXJpYWJsZSBuYW1lPSJ3aXBlX2J1dHRvbl95IiB2YWx1ZT0iNjUwIiAvPgogCQk8dmFyaWFibGUgbmFtZT0ic2xpZGVydmFsdWVfdyIgdmFsdWU9IjcwMCIgLz4KQEAgLTIwOTcsNiArMjA5NywxOCBAQAogCQkJCTxsaXN0dHlwZSBuYW1lPSJzdG9yYWdlIiAvPgogCQkJPC9vYmplY3Q+CiAKKwkJCTxvYmplY3QgdHlwZT0iYnV0dG9uIj4KKwkJCQk8aGlnaGxpZ2h0IGNvbG9yPSIlaGlnaGxpZ2h0X2NvbG9yJSIgLz4KKwkJCQk8cGxhY2VtZW50IHg9IiVjb2xfY2VudGVyX3glIiB5PSIlcm93NF95JSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPHRleHQ+T0s8L3RleHQ+CisJCQkJPGltYWdlIHJlc291cmNlPSJtYWluX2J1dHRvbiIgLz4KKwkJCQk8YWN0aW9ucz4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19jbGVhcl9kZXN0aW5hdGlvbj0ldHdfYmFjayU8L2FjdGlvbj4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0icGFnZSI+Y2xlYXJfdmFyczwvYWN0aW9uPgorCQkJCTwvYWN0aW9ucz4KKwkJCTwvb2JqZWN0PgorCiAJCQk8b2JqZWN0IHR5cGU9ImFjdGlvbiI+CiAJCQkJPHRvdWNoIGtleT0iaG9tZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJwYWdlIj5tYWluPC9hY3Rpb24+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy84MDB4MTI4MC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnIGIvZ3VpL2RldmljZXMvODAweDEyODAvcmVzL2ltYWdlcy90b3AtYmFyLmpwZwppbmRleCAwYTkxYWM3Li4yNjViNzE3IDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy84MDB4MTI4MC9yZXMvaW1hZ2VzL3RvcC1iYXIuanBnCisrKyBiL2d1aS9kZXZpY2VzLzgwMHgxMjgwL3Jlcy9pbWFnZXMvdG9wLWJhci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvODAweDEyODAvcmVzL3VpLnhtbCBiL2d1aS9kZXZpY2VzLzgwMHgxMjgwL3Jlcy91aS54bWwKaW5kZXggYTY5MzFiMi4uNjkyYzczNiAxMDA3NTUKLS0tIGEvZ3VpL2RldmljZXMvODAweDEyODAvcmVzL3VpLnhtbAorKysgYi9ndWkvZGV2aWNlcy84MDB4MTI4MC9yZXMvdWkueG1sCkBAIC0xNzUsNyArMTc1LDcgQEAKIAkJPHZhcmlhYmxlIG5hbWU9ImJhY2t1cF9idXR0b25fcm93MiIgdmFsdWU9IjgxMCIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9Im1vdW50X2xpc3RfaGVpZ2h0IiB2YWx1ZT0iNjkwIiAvPgogCQk8dmFyaWFibGUgbmFtZT0ibW91bnRfc3RvcmFnZV9yb3ciIHZhbHVlPSI4MzAiIC8+Ci0JCTx2YXJpYWJsZSBuYW1lPSJzdG9yYWdlX2xpc3RfaGVpZ2h0IiB2YWx1ZT0iODc1IiAvPgorCQk8dmFyaWFibGUgbmFtZT0ic3RvcmFnZV9saXN0X2hlaWdodCIgdmFsdWU9Ijc3NSIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9IndpcGVfbGlzdF9oZWlnaHQiIHZhbHVlPSI4NzAiIC8+CiAJCTx2YXJpYWJsZSBuYW1lPSJ3aXBlX2J1dHRvbl95IiB2YWx1ZT0iNjUwIiAvPgogCQk8dmFyaWFibGUgbmFtZT0ic2xpZGVydmFsdWVfdyIgdmFsdWU9Ijc4MCIgLz4KQEAgLTIwODUsNiArMjA4NSwxOCBAQAogCQkJCTxsaXN0dHlwZSBuYW1lPSJzdG9yYWdlIiAvPgogCQkJPC9vYmplY3Q+CiAKKwkJCTxvYmplY3QgdHlwZT0iYnV0dG9uIj4KKwkJCQk8aGlnaGxpZ2h0IGNvbG9yPSIlaGlnaGxpZ2h0X2NvbG9yJSIgLz4KKwkJCQk8cGxhY2VtZW50IHg9IiVjb2xfY2VudGVyX3glIiB5PSIlcm93NF95JSIgLz4KKwkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiVidXR0b25fdGV4dF9jb2xvciUiIC8+CisJCQkJPHRleHQ+T0s8L3RleHQ+CisJCQkJPGltYWdlIHJlc291cmNlPSJtYWluX2J1dHRvbiIgLz4KKwkJCQk8YWN0aW9ucz4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19jbGVhcl9kZXN0aW5hdGlvbj0ldHdfYmFjayU8L2FjdGlvbj4KKwkJCQkJPGFjdGlvbiBmdW5jdGlvbj0icGFnZSI+Y2xlYXJfdmFyczwvYWN0aW9uPgorCQkJCTwvYWN0aW9ucz4KKwkJCTwvb2JqZWN0PgorCiAJCQk8b2JqZWN0IHR5cGU9ImFjdGlvbiI+CiAJCQkJPHRvdWNoIGtleT0iaG9tZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJwYWdlIj5tYWluPC9hY3Rpb24+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy84MDB4NDgwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZC5qcGcgYi9ndWkvZGV2aWNlcy84MDB4NDgwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZC5qcGcKaW5kZXggYjEzZTFiOC4uYWY4MjUzMSAxMDA2NDQKLS0tIGEvZ3VpL2RldmljZXMvODAweDQ4MC9yZXMvaW1hZ2VzL2JhY2tncm91bmQuanBnCisrKyBiL2d1aS9kZXZpY2VzLzgwMHg0ODAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy84MDB4NDgwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZGJvdHRvbS5qcGcgYi9ndWkvZGV2aWNlcy84MDB4NDgwL3Jlcy9pbWFnZXMvYmFja2dyb3VuZGJvdHRvbS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMDkxODYuLjAwMDAwMDAKLS0tIGEvZ3VpL2RldmljZXMvODAweDQ4MC9yZXMvaW1hZ2VzL2JhY2tncm91bmRib3R0b20uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvODAweDQ4MC9yZXMvaW1hZ2VzL2JhY2tncm91bmRzaWRlLmpwZyBiL2d1aS9kZXZpY2VzLzgwMHg0ODAvcmVzL2ltYWdlcy9iYWNrZ3JvdW5kc2lkZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOWQ5Y2QuLjAwMDAwMDAKLS0tIGEvZ3VpL2RldmljZXMvODAweDQ4MC9yZXMvaW1hZ2VzL2JhY2tncm91bmRzaWRlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzgwMHg0ODAvcmVzL2ltYWdlcy9sYXJnZV9ibGFjay5wbmcgYi9ndWkvZGV2aWNlcy84MDB4NDgwL3Jlcy9pbWFnZXMvbGFyZ2VfYmxhY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmIyZGZjLi4wMDAwMDAwCi0tLSBhL2d1aS9kZXZpY2VzLzgwMHg0ODAvcmVzL2ltYWdlcy9sYXJnZV9ibGFjay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy84MDB4NDgwL3Jlcy91aS54bWwgYi9ndWkvZGV2aWNlcy84MDB4NDgwL3Jlcy91aS54bWwKaW5kZXggNTYyY2IxNi4uNzY4ZjI0NiAxMDA3NTUKLS0tIGEvZ3VpL2RldmljZXMvODAweDQ4MC9yZXMvdWkueG1sCisrKyBiL2d1aS9kZXZpY2VzLzgwMHg0ODAvcmVzL3VpLnhtbApAQCAtMTIsOSArMTIsNiBAQAogCTxyZXNvdXJjZXM+CiAJCTxyZXNvdXJjZSBuYW1lPSJmb250IiB0eXBlPSJmb250IiBmaWxlbmFtZT0iUm9ib3RvLUNvbmRlbnNlZC0xNiIgLz4KIAkJPHJlc291cmNlIG5hbWU9ImJhc2UiIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iYmFja2dyb3VuZC5qcGciIC8+Ci0JCTxyZXNvdXJjZSBuYW1lPSJzaWRlIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImJhY2tncm91bmRzaWRlLmpwZyIgLz4KLQkJPHJlc291cmNlIG5hbWU9ImJvdHRvbSIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJiYWNrZ3JvdW5kYm90dG9tLmpwZyIgLz4KLQkJPHJlc291cmNlIG5hbWU9ImxhcmdlX2JsYWNrIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImxhcmdlX2JsYWNrIiAvPgogCQk8cmVzb3VyY2UgbmFtZT0ibWFpbl9idXR0b24iIHR5cGU9ImltYWdlIiBmaWxlbmFtZT0iYnV0dG9uIiAvPgogCQk8cmVzb3VyY2UgbmFtZT0iZmlsZV9pY29uIiB0eXBlPSJpbWFnZSIgZmlsZW5hbWU9ImZpbGUiIC8+CiAJCTxyZXNvdXJjZSBuYW1lPSJmb2xkZXJfaWNvbiIgdHlwZT0iaW1hZ2UiIGZpbGVuYW1lPSJmb2xkZXIiIC8+CkBAIC0xMzcsNyArMTM0LDcgQEAKIAkJPHZhcmlhYmxlIG5hbWU9ImNvbnNvbGVfaW5zdGFsbGRvbmVfaGVpZ2h0IiB2YWx1ZT0iMjYwIiAvPgogCQk8dmFyaWFibGUgbmFtZT0iZmlsZXNlbGVjdG9yX2ZvbGRlcl94IiB2YWx1ZT0iMjgiIC8+CiAJCTx2YXJpYWJsZSBuYW1lPSJmaWxlc2VsZWN0b3JfZm9sZGVyX3dpZHRoIiB2YWx1ZT0iMjQ4IiAvPgotCQk8dmFyaWFibGUgbmFtZT0iZmlsZXNlbGVjdG9yX2ZvbGRlcm9ubHlfd2lkdGgiIHZhbHVlPSI0NjAiIC8+CisJCTx2YXJpYWJsZSBuYW1lPSJmaWxlc2VsZWN0b3JfZm9sZGVyb25seV93aWR0aCIgdmFsdWU9IjQwMCIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9ImZpbGVzZWxlY3Rvcl9maWxlX3giIHZhbHVlPSIyNzgiIC8+CiAJCTx2YXJpYWJsZSBuYW1lPSJmaWxlc2VsZWN0b3JfZmlsZV93aWR0aCIgdmFsdWU9IjUwNiIgLz4KIAkJPHZhcmlhYmxlIG5hbWU9ImZpbGVzZWxlY3Rvcl9pbnN0YWxsX3kiIHZhbHVlPSIxMjAiIC8+CkBAIC0yMTMsMzQgKzIxMCwxNCBAQAogCQkJPGJhY2tncm91bmQgY29sb3I9IiMwMDAwMDBGRiIgLz4KIAogCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+Ci0JCQkJPGltYWdlIHJlc291cmNlPSJzaWRlIiAvPgotCQkJCTxwbGFjZW1lbnQgeD0iMCIgeT0iMCIgLz4KLQkJCTwvb2JqZWN0PgotCi0JCQk8b2JqZWN0IHR5cGU9ImltYWdlIj4KLQkJCQk8aW1hZ2UgcmVzb3VyY2U9InNpZGUiIC8+Ci0JCQkJPHBsYWNlbWVudCB4PSI3NzAiIHk9IjAiIC8+Ci0JCQk8L29iamVjdD4KLQotCQkJPG9iamVjdCB0eXBlPSJpbWFnZSI+CiAJCQkJPGltYWdlIHJlc291cmNlPSJiYXNlIiAvPgogCQkJCTxwbGFjZW1lbnQgeD0iMCIgeT0iMCIgLz4KIAkJCTwvb2JqZWN0PgogCi0JCQk8b2JqZWN0IHR5cGU9ImltYWdlIj4KLQkJCQk8aW1hZ2UgcmVzb3VyY2U9ImJvdHRvbSIgLz4KLQkJCQk8cGxhY2VtZW50IHg9IjEiIHk9IjQ1MCIgLz4KLQkJCTwvb2JqZWN0PgotCi0JCQk8b2JqZWN0IHR5cGU9ImltYWdlIj4KLQkJCQk8aW1hZ2UgcmVzb3VyY2U9ImxhcmdlX2JsYWNrIiAvPgotCQkJCTxwbGFjZW1lbnQgeD0iMCIgeT0iMCIgLz4KLQkJCTwvb2JqZWN0PgotCiAJCQk8b2JqZWN0IHR5cGU9InRleHQiIGNvbG9yPSIldGV4dF9jb2xvciUiPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiAvPgogCQkJCTxwbGFjZW1lbnQgeD0iMjUwIiB5PSIyIiAvPgotCQkJCTx0ZXh0PlRlYW0gV2luIFJlY292ZXJ5IFByb2plY3QgKHR3cnApICB2JXR3X3ZlcnNpb24lPC90ZXh0PgorCQkJCTx0ZXh0PlRlYW0gV2luIFJlY292ZXJ5IFByb2plY3QgIHYldHdfdmVyc2lvbiU8L3RleHQ+CiAJCQk8L29iamVjdD4KIAogCQkJPG9iamVjdCB0eXBlPSJ0ZXh0IiBjb2xvcj0iJXRleHRfY29sb3IlIj4KQEAgLTEyNjcsNiArMTI0NCwxOCBAQAogCQkJCTxsaXN0dHlwZSBuYW1lPSJzdG9yYWdlIiAvPgogCQkJPC9vYmplY3Q+CiAKKwkJCTxvYmplY3QgdHlwZT0iYnV0dG9uIj4KKwkJCQk8aGlnaGxpZ2h0IGNvbG9yPSIlaGlnaGxpZ2h0X2NvbG9yJSIgLz4KKwkJCQk8cGxhY2VtZW50IHg9IiVmaWxlbWFuYWdlcl9zZWxlY3RfeCUiIHk9IiVyb3cyX3klIiAvPgorCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJWJ1dHRvbl90ZXh0X2NvbG9yJSIgLz4KKwkJCQk8dGV4dD5PSzwvdGV4dD4KKwkJCQk8aW1hZ2UgcmVzb3VyY2U9Im1haW5fYnV0dG9uIiAvPgorCQkJCTxhY3Rpb25zPgorCQkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X2NsZWFyX2Rlc3RpbmF0aW9uPSV0d19iYWNrJTwvYWN0aW9uPgorCQkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJwYWdlIj5jbGVhcl92YXJzPC9hY3Rpb24+CisJCQkJPC9hY3Rpb25zPgorCQkJPC9vYmplY3Q+CisKIAkJCTxvYmplY3QgdHlwZT0iYWN0aW9uIj4KIAkJCQk8dG91Y2gga2V5PSJob21lIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InBhZ2UiPm1haW48L2FjdGlvbj4KZGlmZiAtLWdpdCBhL2d1aS9ndWkuY3BwIGIvZ3VpL2d1aS5jcHAKaW5kZXggODc1NTY4OS4uOWYyMjEzOCAxMDA2NDQKLS0tIGEvZ3VpL2d1aS5jcHAKKysrIGIvZ3VpL2d1aS5jcHAKQEAgLTE4NSw2ICsxODUsOCBAQAogICBzdGF0aWMgc3RydWN0IHRpbWV2YWwgdG91Y2hTdGFydDsKICAgSGFyZHdhcmVLZXlib2FyZCBrYjsKICAgc3RyaW5nIHNlY29uZHM7CisgIGludCBzY3JlZW5fd2lkdGggPSBncl9mYl93aWR0aCgpOworICBpbnQgc2NyZWVuX2hlaWdodCA9IGdyX2ZiX2hlaWdodCgpOwogCiAgIC8vc3RhcnQgc2NyZWVuIHRpbWVvdXQgdGhyZWFkcwogICBibGFua1RpbWVyLnNldFRpbWVyVGhyZWFkKCk7CkBAIC0xOTgsNyArMjAwLDcgQEAKIAkgIHN0cnVjdCBpbnB1dF9ldmVudCBldjsKIAkgIGludCBzdGF0ZSA9IDAsIHJldCA9IDA7CiAKLQkgIHJldCA9IGV2X2dldCAoJmV2LCBkb250d2FpdCk7CisJICByZXQgPSBldl9nZXQgKCZldiwgZG9udHdhaXQsICZzY3JlZW5fd2lkdGgsICZzY3JlZW5faGVpZ2h0KTsKIAogCSAgaWYgKHJldCA8IDApCiAJCXsKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL0FuZHJvaWQubWsgYi9saWJqcGVndHdycC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OGIyNTM5Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9BUk1fTU9ERSA6PSBhcm0KLQotIyBTZXQgQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSB0byB0cnVlIHRvIGVuYWJsZSBWZU51bSBvcHRpbWl6YXRpb25zCi1BTkRST0lEX0pQRUdfVVNFX1ZFTlVNIDo9IHRydWUKLQotIyBEaXNhYmxlIFZlTnVtIG9wdGltaXphdGlvbnMgaWYgdGhleSBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGUgYnVpbGQgdGFyZ2V0Ci1pZm5lcSAoJChBUkNIX0FSTV9IQVZFX1ZGUCksdHJ1ZSkKLUFORFJPSURfSlBFR19VU0VfVkVOVU0gOj0gZmFsc2UKLWVsc2UKLWlmbmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKLUFORFJPSURfSlBFR19VU0VfVkVOVU0gOj0gZmFsc2UKLWVuZGlmCi1lbmRpZgotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCWpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLQlqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLQlqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotCWpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLQlqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0JamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotCWpmZGN0aW50LmMgamlkY3RmbHQuYyBqcXVhbnQxLmMgXAotCWpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMgXAotCi0jIHVzZSBhc2htZW0gYXMgbGlianBlZyBkZWNvZGVyJ3MgYmFja2luZyBzdG9yZQotTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0FORFJPSURfQVNITUVNCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotCWptZW0tYXNobWVtLmMKLQotIyB0aGUgb3JpZ2luYWwgYW5kcm9pZCBtZW1vcnkgbWFuYWdlci4KLSMgdXNlIHNkY2FyZCBhcyBsaWJqcGVnIGRlY29kZXIncyBiYWNraW5nIHN0b3JlCi0jTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSMJam1lbS1hbmRyb2lkLmMKLQotCi0jIHRoZSBhc3NlbWJsZXIgaXMgb25seSBmb3IgdGhlIEFSTSB2ZXJzaW9uLCBkb24ndCBicmVhayB0aGUgTGludXggc2ltCi1pZm5lcSAoJChUQVJHRVRfQVJDSCksYXJtKQotQU5EUk9JRF9KUEVHX05PX0FTU0VNQkxFUiA6PSB0cnVlCi1lbmRpZgotCi1pZmVxICgkKHN0cmlwICQoQU5EUk9JRF9KUEVHX05PX0FTU0VNQkxFUikpLHRydWUpCi1MT0NBTF9TUkNfRklMRVMgKz0gamlkY3RpbnQuYyBqaWRjdGZzdC5jIGppZGN0cmVkLmMKLWVsc2UKLWlmZXEgKCQoQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSksdHJ1ZSkKLUxPQ0FMX1NSQ19GSUxFUyArPSBqaWRjdHZlbnVtLmMKLUxPQ0FMX1NSQ19GSUxFUyArPSBhc20vYXJtdjcvamRjb2xvci1hcm12Ny5TCi1MT0NBTF9TUkNfRklMRVMgKz0gYXNtL2FybXY3L2pkY29sb3ItYW5kcm9pZC1hcm12Ny5TCi1MT0NBTF9TUkNfRklMRVMgKz0gYXNtL2FybXY3L2pkaWRjdC1hcm12Ny5TCi1MT0NBTF9DRkxBR1MgICAgKz0gLURBTkRST0lEX0pQRUdfVVNFX1ZFTlVNCi1lbHNlICMgQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSwgZmFsc2UKLUxPQ0FMX1NSQ19GSUxFUyArPSBqaWRjdGludC5jIGppZGN0cmVkLmMgamlkY3Rmc3QuYyBhcm12Nl9pZGN0LlMKLUxPQ0FMX0NGTEFHUyAgICArPSAtREFORFJPSURfQVJNVjZfSURDVAotZW5kaWYgIyBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNCi1lbmRpZgotCi1MT0NBTF9DRkxBR1MgKz0gLURBVk9JRF9UQUJMRVMKLUxPQ0FMX0NGTEFHUyArPSAtTzMgLWZzdHJpY3QtYWxpYXNpbmcgLWZwcmVmZXRjaC1sb29wLWFycmF5cwotCi0jIGVuYWJsZSB0aWxlIGJhc2VkIGRlY29kZQotTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQotCi1pZmRlZiBORUVEU19BUk1fRVJSQVRBXzc1NDMxOV83NTQzMjAKLWFzbV9mbGFncyA6PSBcCi0JLS1kZWZzeW0gTkVFRFNfQVJNX0VSUkFUQV83NTQzMTlfNzU0MzIwX0FTTT0xCi0KLUxPQ0FMX0NGTEFHUys9IFwKLQkkKGZvcmVhY2ggZiwkKGFzbV9mbGFncyksLVdhLCIkKGYpIikKLWVuZGlmCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBlbmcKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3V0aWxzCi1MT0NBTF9NT0RVTEU6PSBsaWJqcGVndHdycAotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL0NsZWFuU3BlYy5tayBiL2xpYmpwZWd0d3JwL0NsZWFuU3BlYy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg0ZTFiNi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9DbGVhblNwZWMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIElmIHlvdSBkb24ndCBuZWVkIHRvIGRvIGEgZnVsbCBjbGVhbiBidWlsZCBidXQgd291bGQgbGlrZSB0byB0b3VjaAotIyBhIGZpbGUgb3IgZGVsZXRlIHNvbWUgaW50ZXJtZWRpYXRlIGZpbGVzLCBhZGQgYSBjbGVhbiBzdGVwIHRvIHRoZSBlbmQKLSMgb2YgdGhlIGxpc3QuICBUaGVzZSBzdGVwcyB3aWxsIG9ubHkgYmUgcnVuIG9uY2UsIGlmIHRoZXkgaGF2ZW4ndCBiZWVuCi0jIHJ1biBiZWZvcmUuCi0jCi0jIEUuZy46Ci0jICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHRvdWNoIC1jIGV4dGVybmFsL3NxbGl0ZS9zcWxpdGUzLmgpCi0jICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU1RBVElDX0xJQlJBUklFUy9saWJ6X2ludGVybWVkaWF0ZXMpCi0jCi0jIEFsd2F5cyB1c2UgInRvdWNoIC1jIiBhbmQgInJtIC1mIiBvciAicm0gLXJmIiB0byBncmFjZWZ1bGx5IGRlYWwgd2l0aAotIyBmaWxlcyB0aGF0IGFyZSBtaXNzaW5nIG9yIGhhdmUgYmVlbiBtb3ZlZC4KLSMKLSMgVXNlICQoUFJPRFVDVF9PVVQpIHRvIGdldCB0byB0aGUgIm91dC90YXJnZXQvcHJvZHVjdC9ibGFoLyIgZGlyZWN0b3J5LgotIyBVc2UgJChPVVRfRElSKSB0byByZWZlciB0byB0aGUgIm91dCIgZGlyZWN0b3J5LgotIwotIyBJZiB5b3UgbmVlZCB0byByZS1kbyBzb21ldGhpbmcgdGhhdCdzIGFscmVhZHkgbWVudGlvbmVkLCBqdXN0IGNvcHkKLSMgdGhlIGNvbW1hbmQgYW5kIGFkZCBpdCB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LiAgRS5nLiwgaWYgYSBjaGFuZ2UKLSMgdGhhdCB5b3UgbWFkZSBsYXN0IHdlZWsgcmVxdWlyZWQgdG91Y2hpbmcgYSBmaWxlIGFuZCBhIGNoYW5nZSB5b3UKLSMgbWFkZSB0b2RheSByZXF1aXJlcyB0b3VjaGluZyB0aGUgc2FtZSBmaWxlLCBqdXN0IGNvcHkgdGhlIG9sZAotIyB0b3VjaCBzdGVwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSMKLSMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAotIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIyBGb3IgZXhhbXBsZToKLSMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0FQUFMvQW5kcm9pZFRlc3RzX2ludGVybWVkaWF0ZXMpCi0jJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9jb3JlX2ludGVybWVkaWF0ZXMpCi0jJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLXR5cGUgZiAtbmFtZSAiSUdUYWxrU2Vzc2lvbioiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZikKLSMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9kYXRhLyopCi0KLSMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAotIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFIGIvbGlianBlZ3R3cnAvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvTk9USUNFIGIvbGlianBlZ3R3cnAvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDc2MjVmLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLVRoaXMgc29mdHdhcmUgaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgd29yayBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgYXV0aG9ycyBtYWtlIE5PIFdBUlJBTlRZIG9yIHJlcHJlc2VudGF0aW9uLCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLAotd2l0aCByZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUsIGl0cyBxdWFsaXR5LCBhY2N1cmFjeSwgbWVyY2hhbnRhYmlsaXR5LCBvcgotZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJBUyBJUyIsIGFuZCB5b3UsCi1pdHMgdXNlciwgYXNzdW1lIHRoZSBlbnRpcmUgcmlzayBhcyB0byBpdHMgcXVhbGl0eSBhbmQgYWNjdXJhY3kuCi0KLVRoaXMgc29mdHdhcmUgaXMgY29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotQWxsIFJpZ2h0cyBSZXNlcnZlZCBleGNlcHQgYXMgc3BlY2lmaWVkIGJlbG93LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCi1zb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgc3ViamVjdCB0byB0aGVzZQotY29uZGl0aW9uczoKLSgxKSBJZiBhbnkgcGFydCBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4gdGhpcwotUkVBRE1FIGZpbGUgbXVzdCBiZSBpbmNsdWRlZCwgd2l0aCB0aGlzIGNvcHlyaWdodCBhbmQgbm8td2FycmFudHkgbm90aWNlCi11bmFsdGVyZWQ7IGFuZCBhbnkgYWRkaXRpb25zLCBkZWxldGlvbnMsIG9yIGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIGZpbGVzCi1tdXN0IGJlIGNsZWFybHkgaW5kaWNhdGVkIGluIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uLgotKDIpIElmIG9ubHkgZXhlY3V0YWJsZSBjb2RlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoZSBhY2NvbXBhbnlpbmcKLWRvY3VtZW50YXRpb24gbXVzdCBzdGF0ZSB0aGF0ICJ0aGlzIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIHdvcmsgb2YKLXRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwIi4KLSgzKSBQZXJtaXNzaW9uIGZvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIG9ubHkgaWYgdGhlIHVzZXIgYWNjZXB0cwotZnVsbCByZXNwb25zaWJpbGl0eSBmb3IgYW55IHVuZGVzaXJhYmxlIGNvbnNlcXVlbmNlczsgdGhlIGF1dGhvcnMgYWNjZXB0Ci1OTyBMSUFCSUxJVFkgZm9yIGRhbWFnZXMgb2YgYW55IGtpbmQuCi0KLVRoZXNlIGNvbmRpdGlvbnMgYXBwbHkgdG8gYW55IHNvZnR3YXJlIGRlcml2ZWQgZnJvbSBvciBiYXNlZCBvbiB0aGUgSUpHIGNvZGUsCi1ub3QganVzdCB0byB0aGUgdW5tb2RpZmllZCBsaWJyYXJ5LiAgSWYgeW91IHVzZSBvdXIgd29yaywgeW91IG91Z2h0IHRvCi1hY2tub3dsZWRnZSB1cy4KLQotUGVybWlzc2lvbiBpcyBOT1QgZ3JhbnRlZCBmb3IgdGhlIHVzZSBvZiBhbnkgSUpHIGF1dGhvcidzIG5hbWUgb3IgY29tcGFueSBuYW1lCi1pbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhpcyBzb2Z0d2FyZSBvciBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLWl0LiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgcmVmZXJyZWQgdG8gb25seSBhcyAidGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncwotc29mdHdhcmUiLgotCi1XZSBzcGVjaWZpY2FsbHkgcGVybWl0IGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFzIHRoZSBiYXNpcyBvZgotY29tbWVyY2lhbCBwcm9kdWN0cywgcHJvdmlkZWQgdGhhdCBhbGwgd2FycmFudHkgb3IgbGlhYmlsaXR5IGNsYWltcyBhcmUKLWFzc3VtZWQgYnkgdGhlIHByb2R1Y3QgdmVuZG9yLgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvUkVBRE1FIGIvbGlianBlZ3R3cnAvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmNjMjA2Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi1UaGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1SRUFETUUgZm9yIHJlbGVhc2UgNmIgb2YgMjctTWFyLTE5OTgKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIGRpc3RyaWJ1dGlvbiBjb250YWlucyB0aGUgc2l4dGggcHVibGljIHJlbGVhc2Ugb2YgdGhlIEluZGVwZW5kZW50IEpQRUcKLUdyb3VwJ3MgZnJlZSBKUEVHIHNvZnR3YXJlLiAgWW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAotdG8gdXNlIGl0IGZvciBhbnkgcHVycG9zZSwgc3ViamVjdCB0byB0aGUgY29uZGl0aW9ucyB1bmRlciBMRUdBTCBJU1NVRVMsIGJlbG93LgotCi1TZXJpb3VzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgKHBhcnRpY3VsYXJseSB0aG9zZSBpbmNvcnBvcmF0aW5nIGl0IGludG8KLWxhcmdlciBwcm9ncmFtcykgc2hvdWxkIGNvbnRhY3QgSUpHIGF0IGpwZWctaW5mb0B1dW5ldC51dS5uZXQgdG8gYmUgYWRkZWQgdG8KLW91ciBlbGVjdHJvbmljIG1haWxpbmcgbGlzdC4gIE1haWxpbmcgbGlzdCBtZW1iZXJzIGFyZSBub3RpZmllZCBvZiB1cGRhdGVzCi1hbmQgaGF2ZSBhIGNoYW5jZSB0byBwYXJ0aWNpcGF0ZSBpbiB0ZWNobmljYWwgZGlzY3Vzc2lvbnMsIGV0Yy4KLQotVGhpcyBzb2Z0d2FyZSBpcyB0aGUgd29yayBvZiBUb20gTGFuZSwgUGhpbGlwIEdsYWRzdG9uZSwgSmltIEJvdWNoZXIsCi1MZWUgQ3JvY2tlciwgSnVsaWFuIE1pbmd1aWxsb24sIEx1aXMgT3J0aXosIEdlb3JnZSBQaGlsbGlwcywgRGF2aWRlIFJvc3NpLAotR3VpZG8gVm9sbGJlZGluZywgR2UnIFdlaWplcnMsIGFuZCBvdGhlciBtZW1iZXJzIG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHCi1Hcm91cC4KLQotSUpHIGlzIG5vdCBhZmZpbGlhdGVkIHdpdGggdGhlIG9mZmljaWFsIElTTyBKUEVHIHN0YW5kYXJkcyBjb21taXR0ZWUuCi0KLQotRE9DVU1FTlRBVElPTiBST0FETUFQCi09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6Ci0KLU9WRVJWSUVXICAgICAgICAgICAgR2VuZXJhbCBkZXNjcmlwdGlvbiBvZiBKUEVHIGFuZCB0aGUgSUpHIHNvZnR3YXJlLgotTEVHQUwgSVNTVUVTICAgICAgICBDb3B5cmlnaHQsIGxhY2sgb2Ygd2FycmFudHksIHRlcm1zIG9mIGRpc3RyaWJ1dGlvbi4KLVJFRkVSRU5DRVMgICAgICAgICAgV2hlcmUgdG8gbGVhcm4gbW9yZSBhYm91dCBKUEVHLgotQVJDSElWRSBMT0NBVElPTlMgICBXaGVyZSB0byBmaW5kIG5ld2VyIHZlcnNpb25zIG9mIHRoaXMgc29mdHdhcmUuCi1SRUxBVEVEIFNPRlRXQVJFICAgIE90aGVyIHN0dWZmIHlvdSBzaG91bGQgZ2V0LgotRklMRSBGT1JNQVQgV0FSUyAgICBTb2Z0d2FyZSAqbm90KiB0byBnZXQuCi1UTyBETyAgICAgICAgICAgICAgIFBsYW5zIGZvciBmdXR1cmUgSUpHIHJlbGVhc2VzLgotCi1PdGhlciBkb2N1bWVudGF0aW9uIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24gYXJlOgotCi1Vc2VyIGRvY3VtZW50YXRpb246Ci0gIGluc3RhbGwuZG9jICAgICAgIEhvdyB0byBjb25maWd1cmUgYW5kIGluc3RhbGwgdGhlIElKRyBzb2Z0d2FyZS4KLSAgdXNhZ2UuZG9jICAgICAgICAgVXNhZ2UgaW5zdHJ1Y3Rpb25zIGZvciBjanBlZywgZGpwZWcsIGpwZWd0cmFuLAotICAgICAgICAgICAgICAgICAgICByZGpwZ2NvbSwgYW5kIHdyanBnY29tLgotICAqLjEgICAgICAgICAgICAgICBVbml4LXN0eWxlIG1hbiBwYWdlcyBmb3IgcHJvZ3JhbXMgKHNhbWUgaW5mbyBhcyB1c2FnZS5kb2MpLgotICB3aXphcmQuZG9jICAgICAgICBBZHZhbmNlZCB1c2FnZSBpbnN0cnVjdGlvbnMgZm9yIEpQRUcgd2l6YXJkcyBvbmx5LgotICBjaGFuZ2UubG9nICAgICAgICBWZXJzaW9uLXRvLXZlcnNpb24gY2hhbmdlIGhpZ2hsaWdodHMuCi1Qcm9ncmFtbWVyIGFuZCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uOgotICBsaWJqcGVnLmRvYyAgICAgICBIb3cgdG8gdXNlIHRoZSBKUEVHIGxpYnJhcnkgaW4geW91ciBvd24gcHJvZ3JhbXMuCi0gIGV4YW1wbGUuYyAgICAgICAgIFNhbXBsZSBjb2RlIGZvciBjYWxsaW5nIHRoZSBKUEVHIGxpYnJhcnkuCi0gIHN0cnVjdHVyZS5kb2MgICAgIE92ZXJ2aWV3IG9mIHRoZSBKUEVHIGxpYnJhcnkncyBpbnRlcm5hbCBzdHJ1Y3R1cmUuCi0gIGZpbGVsaXN0LmRvYyAgICAgIFJvYWQgbWFwIG9mIElKRyBmaWxlcy4KLSAgY29kZXJ1bGVzLmRvYyAgICAgQ29kaW5nIHN0eWxlIHJ1bGVzIC0tLSBwbGVhc2UgcmVhZCBpZiB5b3UgY29udHJpYnV0ZSBjb2RlLgotCi1QbGVhc2UgcmVhZCBhdCBsZWFzdCB0aGUgZmlsZXMgaW5zdGFsbC5kb2MgYW5kIHVzYWdlLmRvYy4gIFVzZWZ1bCBpbmZvcm1hdGlvbgotY2FuIGFsc28gYmUgZm91bmQgaW4gdGhlIEpQRUcgRkFRIChGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucykgYXJ0aWNsZS4gIFNlZQotQVJDSElWRSBMT0NBVElPTlMgYmVsb3cgdG8gZmluZCBvdXQgd2hlcmUgdG8gb2J0YWluIHRoZSBGQVEgYXJ0aWNsZS4KLQotSWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIEpQRUcgY29kZSB3b3Jrcywgd2Ugc3VnZ2VzdCByZWFkaW5nIG9uZSBvcgotbW9yZSBvZiB0aGUgUkVGRVJFTkNFUywgdGhlbiBsb29raW5nIGF0IHRoZSBkb2N1bWVudGF0aW9uIGZpbGVzIChpbiByb3VnaGx5Ci10aGUgb3JkZXIgbGlzdGVkKSBiZWZvcmUgZGl2aW5nIGludG8gdGhlIGNvZGUuCi0KLQotT1ZFUlZJRVcKLT09PT09PT09Ci0KLVRoaXMgcGFja2FnZSBjb250YWlucyBDIHNvZnR3YXJlIHRvIGltcGxlbWVudCBKUEVHIGltYWdlIGNvbXByZXNzaW9uIGFuZAotZGVjb21wcmVzc2lvbi4gIEpQRUcgKHByb25vdW5jZWQgImpheS1wZWciKSBpcyBhIHN0YW5kYXJkaXplZCBjb21wcmVzc2lvbgotbWV0aG9kIGZvciBmdWxsLWNvbG9yIGFuZCBncmF5LXNjYWxlIGltYWdlcy4gIEpQRUcgaXMgaW50ZW5kZWQgZm9yIGNvbXByZXNzaW5nCi0icmVhbC13b3JsZCIgc2NlbmVzOyBsaW5lIGRyYXdpbmdzLCBjYXJ0b29ucyBhbmQgb3RoZXIgbm9uLXJlYWxpc3RpYyBpbWFnZXMKLWFyZSBub3QgaXRzIHN0cm9uZyBzdWl0LiAgSlBFRyBpcyBsb3NzeSwgbWVhbmluZyB0aGF0IHRoZSBvdXRwdXQgaW1hZ2UgaXMgbm90Ci1leGFjdGx5IGlkZW50aWNhbCB0byB0aGUgaW5wdXQgaW1hZ2UuICBIZW5jZSB5b3UgbXVzdCBub3QgdXNlIEpQRUcgaWYgeW91Ci1oYXZlIHRvIGhhdmUgaWRlbnRpY2FsIG91dHB1dCBiaXRzLiAgSG93ZXZlciwgb24gdHlwaWNhbCBwaG90b2dyYXBoaWMgaW1hZ2VzLAotdmVyeSBnb29kIGNvbXByZXNzaW9uIGxldmVscyBjYW4gYmUgb2J0YWluZWQgd2l0aCBubyB2aXNpYmxlIGNoYW5nZSwgYW5kCi1yZW1hcmthYmx5IGhpZ2ggY29tcHJlc3Npb24gbGV2ZWxzIGFyZSBwb3NzaWJsZSBpZiB5b3UgY2FuIHRvbGVyYXRlIGEKLWxvdy1xdWFsaXR5IGltYWdlLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZWZlcmVuY2VzLCBvciBqdXN0IGV4cGVyaW1lbnQKLXdpdGggdmFyaW91cyBjb21wcmVzc2lvbiBzZXR0aW5ncy4KLQotVGhpcyBzb2Z0d2FyZSBpbXBsZW1lbnRzIEpQRUcgYmFzZWxpbmUsIGV4dGVuZGVkLXNlcXVlbnRpYWwsIGFuZCBwcm9ncmVzc2l2ZQotY29tcHJlc3Npb24gcHJvY2Vzc2VzLiAgUHJvdmlzaW9uIGlzIG1hZGUgZm9yIHN1cHBvcnRpbmcgYWxsIHZhcmlhbnRzIG9mIHRoZXNlCi1wcm9jZXNzZXMsIGFsdGhvdWdoIHNvbWUgdW5jb21tb24gcGFyYW1ldGVyIHNldHRpbmdzIGFyZW4ndCBpbXBsZW1lbnRlZCB5ZXQuCi1Gb3IgbGVnYWwgcmVhc29ucywgd2UgYXJlIG5vdCBkaXN0cmlidXRpbmcgY29kZSBmb3IgdGhlIGFyaXRobWV0aWMtY29kaW5nCi12YXJpYW50cyBvZiBKUEVHOyBzZWUgTEVHQUwgSVNTVUVTLiAgV2UgaGF2ZSBtYWRlIG5vIHByb3Zpc2lvbiBmb3Igc3VwcG9ydGluZwotdGhlIGhpZXJhcmNoaWNhbCBvciBsb3NzbGVzcyBwcm9jZXNzZXMgZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQuCi0KLVdlIHByb3ZpZGUgYSBzZXQgb2YgbGlicmFyeSByb3V0aW5lcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBKUEVHIGltYWdlIGZpbGVzLAotcGx1cyB0d28gc2FtcGxlIGFwcGxpY2F0aW9ucyAiY2pwZWciIGFuZCAiZGpwZWciLCB3aGljaCB1c2UgdGhlIGxpYnJhcnkgdG8KLXBlcmZvcm0gY29udmVyc2lvbiBiZXR3ZWVuIEpQRUcgYW5kIHNvbWUgb3RoZXIgcG9wdWxhciBpbWFnZSBmaWxlIGZvcm1hdHMuCi1UaGUgbGlicmFyeSBpcyBpbnRlbmRlZCB0byBiZSByZXVzZWQgaW4gb3RoZXIgYXBwbGljYXRpb25zLgotCi1JbiBvcmRlciB0byBzdXBwb3J0IGZpbGUgY29udmVyc2lvbiBhbmQgdmlld2luZyBzb2Z0d2FyZSwgd2UgaGF2ZSBpbmNsdWRlZAotY29uc2lkZXJhYmxlIGZ1bmN0aW9uYWxpdHkgYmV5b25kIHRoZSBiYXJlIEpQRUcgY29kaW5nL2RlY29kaW5nIGNhcGFiaWxpdHk7Ci1mb3IgZXhhbXBsZSwgdGhlIGNvbG9yIHF1YW50aXphdGlvbiBtb2R1bGVzIGFyZSBub3Qgc3RyaWN0bHkgcGFydCBvZiBKUEVHCi1kZWNvZGluZywgYnV0IHRoZXkgYXJlIGVzc2VudGlhbCBmb3Igb3V0cHV0IHRvIGNvbG9ybWFwcGVkIGZpbGUgZm9ybWF0cyBvcgotY29sb3JtYXBwZWQgZGlzcGxheXMuICBUaGVzZSBleHRyYSBmdW5jdGlvbnMgY2FuIGJlIGNvbXBpbGVkIG91dCBvZiB0aGUKLWxpYnJhcnkgaWYgbm90IHJlcXVpcmVkIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24uICBXZSBoYXZlIGFsc28gaW5jbHVkZWQKLSJqcGVndHJhbiIsIGEgdXRpbGl0eSBmb3IgbG9zc2xlc3MgdHJhbnNjb2RpbmcgYmV0d2VlbiBkaWZmZXJlbnQgSlBFRwotcHJvY2Vzc2VzLCBhbmQgInJkanBnY29tIiBhbmQgIndyanBnY29tIiwgdHdvIHNpbXBsZSBhcHBsaWNhdGlvbnMgZm9yCi1pbnNlcnRpbmcgYW5kIGV4dHJhY3RpbmcgdGV4dHVhbCBjb21tZW50cyBpbiBKRklGIGZpbGVzLgotCi1UaGUgZW1waGFzaXMgaW4gZGVzaWduaW5nIHRoaXMgc29mdHdhcmUgaGFzIGJlZW4gb24gYWNoaWV2aW5nIHBvcnRhYmlsaXR5IGFuZAotZmxleGliaWxpdHksIHdoaWxlIGFsc28gbWFraW5nIGl0IGZhc3QgZW5vdWdoIHRvIGJlIHVzZWZ1bC4gIEluIHBhcnRpY3VsYXIsCi10aGUgc29mdHdhcmUgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlYWQgYXMgYSB0dXRvcmlhbCBvbiBKUEVHLiAgKFNlZSB0aGUKLVJFRkVSRU5DRVMgc2VjdGlvbiBmb3IgaW50cm9kdWN0b3J5IG1hdGVyaWFsLikgIFJhdGhlciwgaXQgaXMgaW50ZW5kZWQgdG8KLWJlIHJlbGlhYmxlLCBwb3J0YWJsZSwgaW5kdXN0cmlhbC1zdHJlbmd0aCBjb2RlLiAgV2UgZG8gbm90IGNsYWltIHRvIGhhdmUKLWFjaGlldmVkIHRoYXQgZ29hbCBpbiBldmVyeSBhc3BlY3Qgb2YgdGhlIHNvZnR3YXJlLCBidXQgd2Ugc3RyaXZlIGZvciBpdC4KLQotV2Ugd2VsY29tZSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgYXMgYSBjb21wb25lbnQgb2YgY29tbWVyY2lhbCBwcm9kdWN0cy4KLU5vIHJveWFsdHkgaXMgcmVxdWlyZWQsIGJ1dCB3ZSBkbyBhc2sgZm9yIGFuIGFja25vd2xlZGdlbWVudCBpbiBwcm9kdWN0Ci1kb2N1bWVudGF0aW9uLCBhcyBkZXNjcmliZWQgdW5kZXIgTEVHQUwgSVNTVUVTLgotCi0KLUxFR0FMIElTU1VFUwotPT09PT09PT09PT09Ci0KLUluIHBsYWluIEVuZ2xpc2g6Ci0KLTEuIFdlIGRvbid0IHByb21pc2UgdGhhdCB0aGlzIHNvZnR3YXJlIHdvcmtzLiAgKEJ1dCBpZiB5b3UgZmluZCBhbnkgYnVncywKLSAgIHBsZWFzZSBsZXQgdXMga25vdyEpCi0yLiBZb3UgY2FuIHVzZSB0aGlzIHNvZnR3YXJlIGZvciB3aGF0ZXZlciB5b3Ugd2FudC4gIFlvdSBkb24ndCBoYXZlIHRvIHBheSB1cy4KLTMuIFlvdSBtYXkgbm90IHByZXRlbmQgdGhhdCB5b3Ugd3JvdGUgdGhpcyBzb2Z0d2FyZS4gIElmIHlvdSB1c2UgaXQgaW4gYQotICAgcHJvZ3JhbSwgeW91IG11c3QgYWNrbm93bGVkZ2Ugc29tZXdoZXJlIGluIHlvdXIgZG9jdW1lbnRhdGlvbiB0aGF0Ci0gICB5b3UndmUgdXNlZCB0aGUgSUpHIGNvZGUuCi0KLUluIGxlZ2FsZXNlOgotCi1UaGUgYXV0aG9ycyBtYWtlIE5PIFdBUlJBTlRZIG9yIHJlcHJlc2VudGF0aW9uLCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLAotd2l0aCByZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUsIGl0cyBxdWFsaXR5LCBhY2N1cmFjeSwgbWVyY2hhbnRhYmlsaXR5LCBvcgotZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJBUyBJUyIsIGFuZCB5b3UsCi1pdHMgdXNlciwgYXNzdW1lIHRoZSBlbnRpcmUgcmlzayBhcyB0byBpdHMgcXVhbGl0eSBhbmQgYWNjdXJhY3kuCi0KLVRoaXMgc29mdHdhcmUgaXMgY29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotQWxsIFJpZ2h0cyBSZXNlcnZlZCBleGNlcHQgYXMgc3BlY2lmaWVkIGJlbG93LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCi1zb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgc3ViamVjdCB0byB0aGVzZQotY29uZGl0aW9uczoKLSgxKSBJZiBhbnkgcGFydCBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4gdGhpcwotUkVBRE1FIGZpbGUgbXVzdCBiZSBpbmNsdWRlZCwgd2l0aCB0aGlzIGNvcHlyaWdodCBhbmQgbm8td2FycmFudHkgbm90aWNlCi11bmFsdGVyZWQ7IGFuZCBhbnkgYWRkaXRpb25zLCBkZWxldGlvbnMsIG9yIGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIGZpbGVzCi1tdXN0IGJlIGNsZWFybHkgaW5kaWNhdGVkIGluIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uLgotKDIpIElmIG9ubHkgZXhlY3V0YWJsZSBjb2RlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoZSBhY2NvbXBhbnlpbmcKLWRvY3VtZW50YXRpb24gbXVzdCBzdGF0ZSB0aGF0ICJ0aGlzIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIHdvcmsgb2YKLXRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwIi4KLSgzKSBQZXJtaXNzaW9uIGZvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIG9ubHkgaWYgdGhlIHVzZXIgYWNjZXB0cwotZnVsbCByZXNwb25zaWJpbGl0eSBmb3IgYW55IHVuZGVzaXJhYmxlIGNvbnNlcXVlbmNlczsgdGhlIGF1dGhvcnMgYWNjZXB0Ci1OTyBMSUFCSUxJVFkgZm9yIGRhbWFnZXMgb2YgYW55IGtpbmQuCi0KLVRoZXNlIGNvbmRpdGlvbnMgYXBwbHkgdG8gYW55IHNvZnR3YXJlIGRlcml2ZWQgZnJvbSBvciBiYXNlZCBvbiB0aGUgSUpHIGNvZGUsCi1ub3QganVzdCB0byB0aGUgdW5tb2RpZmllZCBsaWJyYXJ5LiAgSWYgeW91IHVzZSBvdXIgd29yaywgeW91IG91Z2h0IHRvCi1hY2tub3dsZWRnZSB1cy4KLQotUGVybWlzc2lvbiBpcyBOT1QgZ3JhbnRlZCBmb3IgdGhlIHVzZSBvZiBhbnkgSUpHIGF1dGhvcidzIG5hbWUgb3IgY29tcGFueSBuYW1lCi1pbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhpcyBzb2Z0d2FyZSBvciBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLWl0LiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgcmVmZXJyZWQgdG8gb25seSBhcyAidGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncwotc29mdHdhcmUiLgotCi1XZSBzcGVjaWZpY2FsbHkgcGVybWl0IGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFzIHRoZSBiYXNpcyBvZgotY29tbWVyY2lhbCBwcm9kdWN0cywgcHJvdmlkZWQgdGhhdCBhbGwgd2FycmFudHkgb3IgbGlhYmlsaXR5IGNsYWltcyBhcmUKLWFzc3VtZWQgYnkgdGhlIHByb2R1Y3QgdmVuZG9yLgotCi0KLWFuc2kya25yLmMgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gYnkgcGVybWlzc2lvbiBvZiBMLiBQZXRlciBEZXV0c2NoLAotc29sZSBwcm9wcmlldG9yIG9mIGl0cyBjb3B5cmlnaHQgaG9sZGVyLCBBbGFkZGluIEVudGVycHJpc2VzIG9mIE1lbmxvIFBhcmssIENBLgotYW5zaTJrbnIuYyBpcyBOT1QgY292ZXJlZCBieSB0aGUgYWJvdmUgY29weXJpZ2h0IGFuZCBjb25kaXRpb25zLCBidXQgaW5zdGVhZAotYnkgdGhlIHVzdWFsIGRpc3RyaWJ1dGlvbiB0ZXJtcyBvZiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBwcmluY2lwYWxseSwKLXRoYXQgeW91IG11c3QgaW5jbHVkZSBzb3VyY2UgY29kZSBpZiB5b3UgcmVkaXN0cmlidXRlIGl0LiAgKFNlZSB0aGUgZmlsZQotYW5zaTJrbnIuYyBmb3IgZnVsbCBkZXRhaWxzLikgIEhvd2V2ZXIsIHNpbmNlIGFuc2kya25yLmMgaXMgbm90IG5lZWRlZCBhcyBwYXJ0Ci1vZiBhbnkgcHJvZ3JhbSBnZW5lcmF0ZWQgZnJvbSB0aGUgSUpHIGNvZGUsIHRoaXMgZG9lcyBub3QgbGltaXQgeW91IG1vcmUgdGhhbgotdGhlIGZvcmVnb2luZyBwYXJhZ3JhcGhzIGRvLgotCi1UaGUgVW5peCBjb25maWd1cmF0aW9uIHNjcmlwdCAiY29uZmlndXJlIiB3YXMgcHJvZHVjZWQgd2l0aCBHTlUgQXV0b2NvbmYuCi1JdCBpcyBjb3B5cmlnaHQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBidXQgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUuCi1UaGUgc2FtZSBob2xkcyBmb3IgaXRzIHN1cHBvcnRpbmcgc2NyaXB0cyAoY29uZmlnLmd1ZXNzLCBjb25maWcuc3ViLAotbHRjb25maWcsIGx0bWFpbi5zaCkuICBBbm90aGVyIHN1cHBvcnQgc2NyaXB0LCBpbnN0YWxsLXNoLCBpcyBjb3B5cmlnaHQKLWJ5IE0uSS5ULiBidXQgaXMgYWxzbyBmcmVlbHkgZGlzdHJpYnV0YWJsZS4KLQotSXQgYXBwZWFycyB0aGF0IHRoZSBhcml0aG1ldGljIGNvZGluZyBvcHRpb24gb2YgdGhlIEpQRUcgc3BlYyBpcyBjb3ZlcmVkIGJ5Ci1wYXRlbnRzIG93bmVkIGJ5IElCTSwgQVQmVCwgYW5kIE1pdHN1YmlzaGkuICBIZW5jZSBhcml0aG1ldGljIGNvZGluZyBjYW5ub3QKLWxlZ2FsbHkgYmUgdXNlZCB3aXRob3V0IG9idGFpbmluZyBvbmUgb3IgbW9yZSBsaWNlbnNlcy4gIEZvciB0aGlzIHJlYXNvbiwKLXN1cHBvcnQgZm9yIGFyaXRobWV0aWMgY29kaW5nIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZnJlZSBKUEVHIHNvZnR3YXJlLgotKFNpbmNlIGFyaXRobWV0aWMgY29kaW5nIHByb3ZpZGVzIG9ubHkgYSBtYXJnaW5hbCBnYWluIG92ZXIgdGhlIHVucGF0ZW50ZWQKLUh1ZmZtYW4gbW9kZSwgaXQgaXMgdW5saWtlbHkgdGhhdCB2ZXJ5IG1hbnkgaW1wbGVtZW50YXRpb25zIHdpbGwgc3VwcG9ydCBpdC4pCi1TbyBmYXIgYXMgd2UgYXJlIGF3YXJlLCB0aGVyZSBhcmUgbm8gcGF0ZW50IHJlc3RyaWN0aW9ucyBvbiB0aGUgcmVtYWluaW5nCi1jb2RlLgotCi1UaGUgSUpHIGRpc3RyaWJ1dGlvbiBmb3JtZXJseSBpbmNsdWRlZCBjb2RlIHRvIHJlYWQgYW5kIHdyaXRlIEdJRiBmaWxlcy4KLVRvIGF2b2lkIGVudGFuZ2xlbWVudCB3aXRoIHRoZSBVbmlzeXMgTFpXIHBhdGVudCwgR0lGIHJlYWRpbmcgc3VwcG9ydCBoYXMKLWJlZW4gcmVtb3ZlZCBhbHRvZ2V0aGVyLCBhbmQgdGhlIEdJRiB3cml0ZXIgaGFzIGJlZW4gc2ltcGxpZmllZCB0byBwcm9kdWNlCi0idW5jb21wcmVzc2VkIEdJRnMiLiAgVGhpcyB0ZWNobmlxdWUgZG9lcyBub3QgdXNlIHRoZSBMWlcgYWxnb3JpdGhtOyB0aGUKLXJlc3VsdGluZyBHSUYgZmlsZXMgYXJlIGxhcmdlciB0aGFuIHVzdWFsLCBidXQgYXJlIHJlYWRhYmxlIGJ5IGFsbCBzdGFuZGFyZAotR0lGIGRlY29kZXJzLgotCi1XZSBhcmUgcmVxdWlyZWQgdG8gc3RhdGUgdGhhdAotICAgICJUaGUgR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0KGMpIGlzIHRoZSBDb3B5cmlnaHQgcHJvcGVydHkgb2YKLSAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4gIEdJRihzbSkgaXMgYSBTZXJ2aWNlIE1hcmsgcHJvcGVydHkgb2YKLSAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4iCi0KLQotUkVGRVJFTkNFUwotPT09PT09PT09PQotCi1XZSBoaWdobHkgcmVjb21tZW5kIHJlYWRpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgcmVmZXJlbmNlcyBiZWZvcmUgdHJ5aW5nIHRvCi11bmRlcnN0YW5kIHRoZSBpbm5hcmRzIG9mIHRoZSBKUEVHIHNvZnR3YXJlLgotCi1UaGUgYmVzdCBzaG9ydCB0ZWNobmljYWwgaW50cm9kdWN0aW9uIHRvIHRoZSBKUEVHIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcwotCVdhbGxhY2UsIEdyZWdvcnkgSy4gICJUaGUgSlBFRyBTdGlsbCBQaWN0dXJlIENvbXByZXNzaW9uIFN0YW5kYXJkIiwKLQlDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCBBcHJpbCAxOTkxICh2b2wuIDM0IG5vLiA0KSwgcHAuIDMwLTQ0LgotKEFkamFjZW50IGFydGljbGVzIGluIHRoYXQgaXNzdWUgZGlzY3VzcyBNUEVHIG1vdGlvbiBwaWN0dXJlIGNvbXByZXNzaW9uLAotYXBwbGljYXRpb25zIG9mIEpQRUcsIGFuZCByZWxhdGVkIHRvcGljcy4pICBJZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgQ0FDTSBpc3N1ZQotaGFuZHksIGEgUG9zdFNjcmlwdCBmaWxlIGNvbnRhaW5pbmcgYSByZXZpc2VkIHZlcnNpb24gb2YgV2FsbGFjZSdzIGFydGljbGUgaXMKLWF2YWlsYWJsZSBhdCBmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL2pwZWcvd2FsbGFjZS5wcy5nei4gIFRoZSBmaWxlIChhY3R1YWxseQotYSBwcmVwcmludCBmb3IgYW4gYXJ0aWNsZSB0aGF0IGFwcGVhcmVkIGluIElFRUUgVHJhbnMuIENvbnN1bWVyIEVsZWN0cm9uaWNzKQotb21pdHMgdGhlIHNhbXBsZSBpbWFnZXMgdGhhdCBhcHBlYXJlZCBpbiBDQUNNLCBidXQgaXQgaW5jbHVkZXMgY29ycmVjdGlvbnMKLWFuZCBzb21lIGFkZGVkIG1hdGVyaWFsLiAgTm90ZTogdGhlIFdhbGxhY2UgYXJ0aWNsZSBpcyBjb3B5cmlnaHQgQUNNIGFuZCBJRUVFLAotYW5kIGl0IG1heSBub3QgYmUgdXNlZCBmb3IgY29tbWVyY2lhbCBwdXJwb3Nlcy4KLQotQSBzb21ld2hhdCBsZXNzIHRlY2huaWNhbCwgbW9yZSBsZWlzdXJlbHkgaW50cm9kdWN0aW9uIHRvIEpQRUcgY2FuIGJlIGZvdW5kIGluCi0iVGhlIERhdGEgQ29tcHJlc3Npb24gQm9vayIgYnkgTWFyayBOZWxzb24gYW5kIEplYW4tbG91cCBHYWlsbHksIHB1Ymxpc2hlZCBieQotTSZUIEJvb2tzIChOZXcgWW9yayksIDJuZCBlZC4gMTk5NiwgSVNCTiAxLTU1ODUxLTQzNC0xLiAgVGhpcyBib29rIHByb3ZpZGVzCi1nb29kIGV4cGxhbmF0aW9ucyBhbmQgZXhhbXBsZSBDIGNvZGUgZm9yIGEgbXVsdGl0dWRlIG9mIGNvbXByZXNzaW9uIG1ldGhvZHMKLWluY2x1ZGluZyBKUEVHLiAgSXQgaXMgYW4gZXhjZWxsZW50IHNvdXJjZSBpZiB5b3UgYXJlIGNvbWZvcnRhYmxlIHJlYWRpbmcgQwotY29kZSBidXQgZG9uJ3Qga25vdyBtdWNoIGFib3V0IGRhdGEgY29tcHJlc3Npb24gaW4gZ2VuZXJhbC4gIFRoZSBib29rJ3MgSlBFRwotc2FtcGxlIGNvZGUgaXMgZmFyIGZyb20gaW5kdXN0cmlhbC1zdHJlbmd0aCwgYnV0IHdoZW4geW91IGFyZSByZWFkeSB0byBsb29rCi1hdCBhIGZ1bGwgaW1wbGVtZW50YXRpb24sIHlvdSd2ZSBnb3Qgb25lIGhlcmUuLi4KLQotVGhlIGJlc3QgZnVsbCBkZXNjcmlwdGlvbiBvZiBKUEVHIGlzIHRoZSB0ZXh0Ym9vayAiSlBFRyBTdGlsbCBJbWFnZSBEYXRhCi1Db21wcmVzc2lvbiBTdGFuZGFyZCIgYnkgV2lsbGlhbSBCLiBQZW5uZWJha2VyIGFuZCBKb2FuIEwuIE1pdGNoZWxsLCBwdWJsaXNoZWQKLWJ5IFZhbiBOb3N0cmFuZCBSZWluaG9sZCwgMTk5MywgSVNCTiAwLTQ0Mi0wMTI3Mi0xLiAgUHJpY2UgVVMkNTkuOTUsIDYzOCBwcC4KLVRoZSBib29rIGluY2x1ZGVzIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoZSBJU08gSlBFRyBzdGFuZGFyZHMgKERJUyAxMDkxOC0xCi1hbmQgZHJhZnQgRElTIDEwOTE4LTIpLiAgVGhpcyBpcyBieSBmYXIgdGhlIG1vc3QgY29tcGxldGUgZXhwb3NpdGlvbiBvZiBKUEVHCi1pbiBleGlzdGVuY2UsIGFuZCB3ZSBoaWdobHkgcmVjb21tZW5kIGl0LgotCi1UaGUgSlBFRyBzdGFuZGFyZCBpdHNlbGYgaXMgbm90IGF2YWlsYWJsZSBlbGVjdHJvbmljYWxseTsgeW91IG11c3Qgb3JkZXIgYQotcGFwZXIgY29weSB0aHJvdWdoIElTTyBvciBJVFUuICAoVW5sZXNzIHlvdSBmZWVsIGEgbmVlZCB0byBvd24gYSBjZXJ0aWZpZWQKLW9mZmljaWFsIGNvcHksIHdlIHJlY29tbWVuZCBidXlpbmcgdGhlIFBlbm5lYmFrZXIgYW5kIE1pdGNoZWxsIGJvb2sgaW5zdGVhZDsKLWl0J3MgbXVjaCBjaGVhcGVyIGFuZCBpbmNsdWRlcyBhIGdyZWF0IGRlYWwgb2YgdXNlZnVsIGV4cGxhbmF0b3J5IG1hdGVyaWFsLikKLUluIHRoZSBVU0EsIGNvcGllcyBvZiB0aGUgc3RhbmRhcmQgbWF5IGJlIG9yZGVyZWQgZnJvbSBBTlNJIFNhbGVzIGF0ICgyMTIpCi02NDItNDkwMCwgb3IgZnJvbSBHbG9iYWwgRW5naW5lZXJpbmcgRG9jdW1lbnRzIGF0ICg4MDApIDg1NC03MTc5LiAgKEFOU0kKLWRvZXNuJ3QgdGFrZSBjcmVkaXQgY2FyZCBvcmRlcnMsIGJ1dCBHbG9iYWwgZG9lcy4pICBJdCdzIG5vdCBjaGVhcDogYXMgb2YKLTE5OTIsIEFOU0kgd2FzIGNoYXJnaW5nICQ5NSBmb3IgUGFydCAxIGFuZCAkNDcgZm9yIFBhcnQgMiwgcGx1cyA3JQotc2hpcHBpbmcvaGFuZGxpbmcuICBUaGUgc3RhbmRhcmQgaXMgZGl2aWRlZCBpbnRvIHR3byBwYXJ0cywgUGFydCAxIGJlaW5nIHRoZQotYWN0dWFsIHNwZWNpZmljYXRpb24sIHdoaWxlIFBhcnQgMiBjb3ZlcnMgY29tcGxpYW5jZSB0ZXN0aW5nIG1ldGhvZHMuICBQYXJ0IDEKLWlzIHRpdGxlZCAiRGlnaXRhbCBDb21wcmVzc2lvbiBhbmQgQ29kaW5nIG9mIENvbnRpbnVvdXMtdG9uZSBTdGlsbCBJbWFnZXMsCi1QYXJ0IDE6IFJlcXVpcmVtZW50cyBhbmQgZ3VpZGVsaW5lcyIgYW5kIGhhcyBkb2N1bWVudCBudW1iZXJzIElTTy9JRUMgSVMKLTEwOTE4LTEsIElUVS1UIFQuODEuICBQYXJ0IDIgaXMgdGl0bGVkICJEaWdpdGFsIENvbXByZXNzaW9uIGFuZCBDb2Rpbmcgb2YKLUNvbnRpbnVvdXMtdG9uZSBTdGlsbCBJbWFnZXMsIFBhcnQgMjogQ29tcGxpYW5jZSB0ZXN0aW5nIiBhbmQgaGFzIGRvY3VtZW50Ci1udW1iZXJzIElTTy9JRUMgSVMgMTA5MTgtMiwgSVRVLVQgVC44My4KLQotU29tZSBleHRlbnNpb25zIHRvIHRoZSBvcmlnaW5hbCBKUEVHIHN0YW5kYXJkIGFyZSBkZWZpbmVkIGluIEpQRUcgUGFydCAzLAotYSBuZXdlciBJU08gc3RhbmRhcmQgbnVtYmVyZWQgSVNPL0lFQyBJUyAxMDkxOC0zIGFuZCBJVFUtVCBULjg0LiAgSUpHCi1jdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBhbnkgUGFydCAzIGV4dGVuc2lvbnMuCi0KLVRoZSBKUEVHIHN0YW5kYXJkIGRvZXMgbm90IHNwZWNpZnkgYWxsIGRldGFpbHMgb2YgYW4gaW50ZXJjaGFuZ2VhYmxlIGZpbGUKLWZvcm1hdC4gIEZvciB0aGUgb21pdHRlZCBkZXRhaWxzIHdlIGZvbGxvdyB0aGUgIkpGSUYiIGNvbnZlbnRpb25zLCByZXZpc2lvbgotMS4wMi4gIEEgY29weSBvZiB0aGUgSkZJRiBzcGVjIGlzIGF2YWlsYWJsZSBmcm9tOgotCUxpdGVyYXR1cmUgRGVwYXJ0bWVudAotCUMtQ3ViZSBNaWNyb3N5c3RlbXMsIEluYy4KLQkxNzc4IE1jQ2FydGh5IEJsdmQuCi0JTWlscGl0YXMsIENBIDk1MDM1Ci0JcGhvbmUgKDQwOCkgOTQ0LTYzMDAsICBmYXggKDQwOCkgOTQ0LTYzMTQKLUEgUG9zdFNjcmlwdCB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGJ5IEZUUCBhdAotZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL2pmaWYucHMuZ3ouICBUaGVyZSBpcyBhbHNvIGEgcGxhaW4gdGV4dAotdmVyc2lvbiBhdCBmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL2pwZWcvamZpZi50eHQuZ3osIGJ1dCBpdCBpcyBtaXNzaW5nCi10aGUgZmlndXJlcy4KLQotVGhlIFRJRkYgNi4wIGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb24gY2FuIGJlIG9idGFpbmVkIGJ5IEZUUCBmcm9tCi1mdHA6Ly9mdHAuc2dpLmNvbS9ncmFwaGljcy90aWZmL1RJRkY2LnBzLmd6LiAgVGhlIEpQRUcgaW5jb3Jwb3JhdGlvbiBzY2hlbWUKLWZvdW5kIGluIHRoZSBUSUZGIDYuMCBzcGVjIG9mIDMtSnVuZS05MiBoYXMgYSBudW1iZXIgb2Ygc2VyaW91cyBwcm9ibGVtcy4KLUlKRyBkb2VzIG5vdCByZWNvbW1lbmQgdXNlIG9mIHRoZSBUSUZGIDYuMCBkZXNpZ24gKFRJRkYgQ29tcHJlc3Npb24gdGFnIDYpLgotSW5zdGVhZCwgd2UgcmVjb21tZW5kIHRoZSBKUEVHIGRlc2lnbiBwcm9wb3NlZCBieSBUSUZGIFRlY2huaWNhbCBOb3RlICMyCi0oQ29tcHJlc3Npb24gdGFnIDcpLiAgQ29waWVzIG9mIHRoaXMgTm90ZSBjYW4gYmUgb2J0YWluZWQgZnJvbSBmdHAuc2dpLmNvbSBvcgotZnJvbSBmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL2pwZWcvLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgbmV4dCByZXZpc2lvbgotb2YgdGhlIFRJRkYgc3BlYyB3aWxsIHJlcGxhY2UgdGhlIDYuMCBKUEVHIGRlc2lnbiB3aXRoIHRoZSBOb3RlJ3MgZGVzaWduLgotQWx0aG91Z2ggSUpHJ3Mgb3duIGNvZGUgZG9lcyBub3Qgc3VwcG9ydCBUSUZGL0pQRUcsIHRoZSBmcmVlIGxpYnRpZmYgbGlicmFyeQotdXNlcyBvdXIgbGlicmFyeSB0byBpbXBsZW1lbnQgVElGRi9KUEVHIHBlciB0aGUgTm90ZS4gIGxpYnRpZmYgaXMgYXZhaWxhYmxlCi1mcm9tIGZ0cDovL2Z0cC5zZ2kuY29tL2dyYXBoaWNzL3RpZmYvLgotCi0KLUFSQ0hJVkUgTE9DQVRJT05TCi09PT09PT09PT09PT09PT09PQotCi1UaGUgIm9mZmljaWFsIiBhcmNoaXZlIHNpdGUgZm9yIHRoaXMgc29mdHdhcmUgaXMgZnRwLnV1Lm5ldCAoSW50ZXJuZXQKLWFkZHJlc3MgMTkyLjQ4Ljk2LjkpLiAgVGhlIG1vc3QgcmVjZW50IHJlbGVhc2VkIHZlcnNpb24gY2FuIGFsd2F5cyBiZSBmb3VuZAotdGhlcmUgaW4gZGlyZWN0b3J5IGdyYXBoaWNzL2pwZWcuICBUaGlzIHBhcnRpY3VsYXIgdmVyc2lvbiB3aWxsIGJlIGFyY2hpdmVkCi1hcyBmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL2pwZWcvanBlZ3NyYy52NmIudGFyLmd6LiAgSWYgeW91IGRvbid0IGhhdmUKLWRpcmVjdCBJbnRlcm5ldCBhY2Nlc3MsIFVVTkVUJ3MgYXJjaGl2ZXMgYXJlIGFsc28gYXZhaWxhYmxlIHZpYSBVVUNQOyBjb250YWN0Ci1oZWxwQHV1bmV0LnV1Lm5ldCBmb3IgaW5mb3JtYXRpb24gb24gcmV0cmlldmluZyBmaWxlcyB0aGF0IHdheS4KLQotTnVtZXJvdXMgSW50ZXJuZXQgc2l0ZXMgbWFpbnRhaW4gY29waWVzIG9mIHRoZSBVVU5FVCBmaWxlcy4gIEhvd2V2ZXIsIG9ubHkKLWZ0cC51dS5uZXQgaXMgZ3VhcmFudGVlZCB0byBoYXZlIHRoZSBsYXRlc3Qgb2ZmaWNpYWwgdmVyc2lvbi4KLQotWW91IGNhbiBhbHNvIG9idGFpbiB0aGlzIHNvZnR3YXJlIGluIERPUy1jb21wYXRpYmxlICJ6aXAiIGFyY2hpdmUgZm9ybWF0IGZyb20KLXRoZSBTaW1UZWwgYXJjaGl2ZXMgKGZ0cDovL2Z0cC5zaW10ZWwubmV0L3B1Yi9zaW10ZWxuZXQvbXNkb3MvZ3JhcGhpY3MvKSwgb3IKLW9uIENvbXB1U2VydmUgaW4gdGhlIEdyYXBoaWNzIFN1cHBvcnQgZm9ydW0gKEdPIENJUzpHUkFQSFNVUCksIGxpYnJhcnkgMTIKLSJKUEVHIFRvb2xzIi4gIEFnYWluLCB0aGVzZSB2ZXJzaW9ucyBtYXkgc29tZXRpbWVzIGxhZyBiZWhpbmQgdGhlIGZ0cC51dS5uZXQKLXJlbGVhc2UuCi0KLVRoZSBKUEVHIEZBUSAoRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMpIGFydGljbGUgaXMgYSB1c2VmdWwgc291cmNlIG9mCi1nZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IEpQRUcuICBJdCBpcyB1cGRhdGVkIGNvbnN0YW50bHkgYW5kIHRoZXJlZm9yZSBpcwotbm90IGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIEZBUSBpcyBwb3N0ZWQgZXZlcnkgdHdvIHdlZWtzIHRvCi1Vc2VuZXQgbmV3c2dyb3VwcyBjb21wLmdyYXBoaWNzLm1pc2MsIG5ld3MuYW5zd2VycywgYW5kIG90aGVyIGdyb3Vwcy4KLUl0IGlzIGF2YWlsYWJsZSBvbiB0aGUgV29ybGQgV2lkZSBXZWIgYXQgaHR0cDovL3d3dy5mYXFzLm9yZy9mYXFzL2pwZWctZmFxLwotYW5kIG90aGVyIG5ld3MuYW5zd2VycyBhcmNoaXZlIHNpdGVzLCBpbmNsdWRpbmcgdGhlIG9mZmljaWFsIG5ld3MuYW5zd2VycwotYXJjaGl2ZSBhdCBydGZtLm1pdC5lZHU6IGZ0cDovL3J0Zm0ubWl0LmVkdS9wdWIvdXNlbmV0L25ld3MuYW5zd2Vycy9qcGVnLWZhcS8uCi1JZiB5b3UgZG9uJ3QgaGF2ZSBXZWIgb3IgRlRQIGFjY2Vzcywgc2VuZCBlLW1haWwgdG8gbWFpbC1zZXJ2ZXJAcnRmbS5taXQuZWR1Ci13aXRoIGJvZHkKLQlzZW5kIHVzZW5ldC9uZXdzLmFuc3dlcnMvanBlZy1mYXEvcGFydDEKLQlzZW5kIHVzZW5ldC9uZXdzLmFuc3dlcnMvanBlZy1mYXEvcGFydDIKLQotCi1SRUxBVEVEIFNPRlRXQVJFCi09PT09PT09PT09PT09PT09Ci0KLU51bWVyb3VzIHZpZXdpbmcgYW5kIGltYWdlIG1hbmlwdWxhdGlvbiBwcm9ncmFtcyBub3cgc3VwcG9ydCBKUEVHLiAgKFF1aXRlIGEKLWZldyBvZiB0aGVtIHVzZSB0aGlzIGxpYnJhcnkgdG8gZG8gc28uKSAgVGhlIEpQRUcgRkFRIGRlc2NyaWJlZCBhYm92ZSBsaXN0cwotc29tZSBvZiB0aGUgbW9yZSBwb3B1bGFyIGZyZWUgYW5kIHNoYXJld2FyZSB2aWV3ZXJzLCBhbmQgdGVsbHMgd2hlcmUgdG8KLW9idGFpbiB0aGVtIG9uIEludGVybmV0LgotCi1JZiB5b3UgYXJlIG9uIGEgVW5peCBtYWNoaW5lLCB3ZSBoaWdobHkgcmVjb21tZW5kIEplZiBQb3NrYW56ZXIncyBmcmVlCi1QQk1QTFVTIHNvZnR3YXJlLCB3aGljaCBwcm92aWRlcyBtYW55IHVzZWZ1bCBvcGVyYXRpb25zIG9uIFBQTS1mb3JtYXQgaW1hZ2UKLWZpbGVzLiAgSW4gcGFydGljdWxhciwgaXQgY2FuIGNvbnZlcnQgUFBNIGltYWdlcyB0byBhbmQgZnJvbSBhIHdpZGUgcmFuZ2Ugb2YKLW90aGVyIGZvcm1hdHMsIHRodXMgbWFraW5nIGNqcGVnL2RqcGVnIGNvbnNpZGVyYWJseSBtb3JlIHVzZWZ1bC4gIFRoZSBsYXRlc3QKLXZlcnNpb24gaXMgZGlzdHJpYnV0ZWQgYnkgdGhlIE5ldFBCTSBncm91cCwgYW5kIGlzIGF2YWlsYWJsZSBmcm9tIG51bWVyb3VzCi1zaXRlcywgbm90YWJseSBmdHA6Ly93dWFyY2hpdmUud3VzdGwuZWR1L2dyYXBoaWNzL2dyYXBoaWNzL3BhY2thZ2VzL05ldFBCTS8uCi1VbmZvcnR1bmF0ZWx5IFBCTVBMVVMvTkVUUEJNIGlzIG5vdCBuZWFybHkgYXMgcG9ydGFibGUgYXMgdGhlIElKRyBzb2Z0d2FyZSBpczsKLXlvdSBhcmUgbGlrZWx5IHRvIGhhdmUgZGlmZmljdWx0eSBtYWtpbmcgaXQgd29yayBvbiBhbnkgbm9uLVVuaXggbWFjaGluZS4KLQotQSBkaWZmZXJlbnQgZnJlZSBKUEVHIGltcGxlbWVudGF0aW9uLCB3cml0dGVuIGJ5IHRoZSBQVlJHIGdyb3VwIGF0IFN0YW5mb3JkLAotaXMgYXZhaWxhYmxlIGZyb20gZnRwOi8vaGF2ZWZ1bi5zdGFuZm9yZC5lZHUvcHViL2pwZWcvLiAgVGhpcyBwcm9ncmFtCi1pcyBkZXNpZ25lZCBmb3IgcmVzZWFyY2ggYW5kIGV4cGVyaW1lbnRhdGlvbiByYXRoZXIgdGhhbiBwcm9kdWN0aW9uIHVzZTsKLWl0IGlzIHNsb3dlciwgaGFyZGVyIHRvIHVzZSwgYW5kIGxlc3MgcG9ydGFibGUgdGhhbiB0aGUgSUpHIGNvZGUsIGJ1dCBpdAotaXMgZWFzaWVyIHRvIHJlYWQgYW5kIG1vZGlmeS4gIEFsc28sIHRoZSBQVlJHIGNvZGUgc3VwcG9ydHMgbG9zc2xlc3MgSlBFRywKLXdoaWNoIHdlIGRvIG5vdC4gIChPbiB0aGUgb3RoZXIgaGFuZCwgaXQgZG9lc24ndCBkbyBwcm9ncmVzc2l2ZSBKUEVHLikKLQotCi1GSUxFIEZPUk1BVCBXQVJTCi09PT09PT09PT09PT09PT09Ci0KLVNvbWUgSlBFRyBwcm9ncmFtcyBwcm9kdWNlIGZpbGVzIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggb3VyIGxpYnJhcnkuCi1UaGUgcm9vdCBvZiB0aGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBJU08gSlBFRyBjb21taXR0ZWUgZmFpbGVkIHRvIHNwZWNpZnkgYQotY29uY3JldGUgZmlsZSBmb3JtYXQuICBTb21lIHZlbmRvcnMgImZpbGxlZCBpbiB0aGUgYmxhbmtzIiBvbiB0aGVpciBvd24sCi1jcmVhdGluZyBwcm9wcmlldGFyeSBmb3JtYXRzIHRoYXQgbm8gb25lIGVsc2UgY291bGQgcmVhZC4gIChGb3IgZXhhbXBsZSwgbm9uZQotb2YgdGhlIGVhcmx5IGNvbW1lcmNpYWwgSlBFRyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBNYWNpbnRvc2ggd2VyZSBhYmxlIHRvCi1leGNoYW5nZSBjb21wcmVzc2VkIGZpbGVzLikKLQotVGhlIGZpbGUgZm9ybWF0IHdlIGhhdmUgYWRvcHRlZCBpcyBjYWxsZWQgSkZJRiAoc2VlIFJFRkVSRU5DRVMpLiAgVGhpcyBmb3JtYXQKLWhhcyBiZWVuIGFncmVlZCB0byBieSBhIG51bWJlciBvZiBtYWpvciBjb21tZXJjaWFsIEpQRUcgdmVuZG9ycywgYW5kIGl0IGhhcwotYmVjb21lIHRoZSBkZSBmYWN0byBzdGFuZGFyZC4gIEpGSUYgaXMgYSBtaW5pbWFsIG9yICJsb3cgZW5kIiByZXByZXNlbnRhdGlvbi4KLVdlIHJlY29tbWVuZCB0aGUgdXNlIG9mIFRJRkYvSlBFRyAoVElGRiByZXZpc2lvbiA2LjAgYXMgbW9kaWZpZWQgYnkgVElGRgotVGVjaG5pY2FsIE5vdGUgIzIpIGZvciAiaGlnaCBlbmQiIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gcmVjb3JkIGEgbG90IG9mCi1hZGRpdGlvbmFsIGRhdGEgYWJvdXQgYW4gaW1hZ2UuICBUSUZGL0pQRUcgaXMgZmFpcmx5IG5ldyBhbmQgbm90IHlldCB3aWRlbHkKLXN1cHBvcnRlZCwgdW5mb3J0dW5hdGVseS4KLQotVGhlIHVwY29taW5nIEpQRUcgUGFydCAzIHN0YW5kYXJkIGRlZmluZXMgYSBmaWxlIGZvcm1hdCBjYWxsZWQgU1BJRkYuCi1TUElGRiBpcyBpbnRlcm9wZXJhYmxlIHdpdGggSkZJRiwgaW4gdGhlIHNlbnNlIHRoYXQgbW9zdCBKRklGIGRlY29kZXJzIHNob3VsZAotYmUgYWJsZSB0byByZWFkIHRoZSBtb3N0IGNvbW1vbiB2YXJpYW50IG9mIFNQSUZGLiAgU1BJRkYgaGFzIHNvbWUgdGVjaG5pY2FsCi1hZHZhbnRhZ2VzIG92ZXIgSkZJRiwgYnV0IGl0cyBtYWpvciBjbGFpbSB0byBmYW1lIGlzIHNpbXBseSB0aGF0IGl0IGlzIGFuCi1vZmZpY2lhbCBzdGFuZGFyZCByYXRoZXIgdGhhbiBhbiBpbmZvcm1hbCBvbmUuICBBdCB0aGlzIHBvaW50IGl0IGlzIHVuY2xlYXIKLXdoZXRoZXIgU1BJRkYgd2lsbCBzdXBlcnNlZGUgSkZJRiBvciB3aGV0aGVyIEpGSUYgd2lsbCByZW1haW4gdGhlIGRlLWZhY3RvCi1zdGFuZGFyZC4gIElKRyBpbnRlbmRzIHRvIHN1cHBvcnQgU1BJRkYgb25jZSB0aGUgc3RhbmRhcmQgaXMgZnJvemVuLCBidXQgd2UKLWhhdmUgbm90IGRlY2lkZWQgd2hldGhlciBpdCBzaG91bGQgYmVjb21lIG91ciBkZWZhdWx0IG91dHB1dCBmb3JtYXQgb3Igbm90LgotKEluIGFueSBjYXNlLCBvdXIgZGVjb2RlciB3aWxsIHJlbWFpbiBjYXBhYmxlIG9mIHJlYWRpbmcgSkZJRiBpbmRlZmluaXRlbHkuKQotCi1WYXJpb3VzIHByb3ByaWV0YXJ5IGZpbGUgZm9ybWF0cyBpbmNvcnBvcmF0aW5nIEpQRUcgY29tcHJlc3Npb24gYWxzbyBleGlzdC4KLVdlIGhhdmUgbGl0dGxlIG9yIG5vIHN5bXBhdGh5IGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZXNlIGZvcm1hdHMuICBJbmRlZWQsCi1vbmUgb2YgdGhlIG9yaWdpbmFsIHJlYXNvbnMgZm9yIGRldmVsb3BpbmcgdGhpcyBmcmVlIHNvZnR3YXJlIHdhcyB0byBoZWxwCi1mb3JjZSBjb252ZXJnZW5jZSBvbiBjb21tb24sIG9wZW4gZm9ybWF0IHN0YW5kYXJkcyBmb3IgSlBFRyBmaWxlcy4gIERvbid0Ci11c2UgYSBwcm9wcmlldGFyeSBmaWxlIGZvcm1hdCEKLQotCi1UTyBETwotPT09PT0KLQotVGhlIG1ham9yIHRocnVzdCBmb3Igdjcgd2lsbCBwcm9iYWJseSBiZSBpbXByb3ZlbWVudCBvZiB2aXN1YWwgcXVhbGl0eS4KLVRoZSBjdXJyZW50IG1ldGhvZCBmb3Igc2NhbGluZyB0aGUgcXVhbnRpemF0aW9uIHRhYmxlcyBpcyBrbm93biBub3QgdG8gYmUKLXZlcnkgZ29vZCBhdCBsb3cgUSB2YWx1ZXMuICBXZSBhbHNvIGludGVuZCB0byBpbnZlc3RpZ2F0ZSBibG9jayBib3VuZGFyeQotc21vb3RoaW5nLCAicG9vciBtYW4ncyB2YXJpYWJsZSBxdWFudGl6YXRpb24iLCBhbmQgb3RoZXIgbWVhbnMgb2YgaW1wcm92aW5nCi1xdWFsaXR5LXZzLWZpbGUtc2l6ZSBwZXJmb3JtYW5jZSB3aXRob3V0IHNhY3JpZmljaW5nIGNvbXBhdGliaWxpdHkuCi0KLUluIGZ1dHVyZSB2ZXJzaW9ucywgd2UgYXJlIGNvbnNpZGVyaW5nIHN1cHBvcnRpbmcgc29tZSBvZiB0aGUgdXBjb21pbmcgSlBFRwotUGFydCAzIGV4dGVuc2lvbnMgLS0tIHByaW5jaXBhbGx5LCB2YXJpYWJsZSBxdWFudGl6YXRpb24gYW5kIHRoZSBTUElGRiBmaWxlCi1mb3JtYXQuCi0KLUFzIGFsd2F5cywgc3BlZWRpbmcgdGhpbmdzIHVwIGlzIG9mIGdyZWF0IGludGVyZXN0LgotCi1QbGVhc2Ugc2VuZCBidWcgcmVwb3J0cywgb2ZmZXJzIG9mIGhlbHAsIGV0Yy4gdG8ganBlZy1pbmZvQHV1bmV0LnV1Lm5ldC4KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL1JFQURNRS1WZU51bSBiL2xpYmpwZWd0d3JwL1JFQURNRS1WZU51bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU1MTQ0OS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9SRUFETUUtVmVOdW0KKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1SRUFETUUtVmVOdW0KLVF1YWxjb21tIElubm92YXRpb24gQ2VudGVyLCBJbmMuIGlzIGEgbWVtYmVyIG9mIENvZGUgQXVyb3JhIEZvcnVtCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Db25zdW1lcnMgYXJlIGluY3JlYXNpbmdseSBicm93c2luZyBXZWIgYmFzZWQgcGhvdG8gZ2FsbGVyaWVzIGluY29ycG9yYXRpbmcKLWhpZ2gtcmVzb2x1dGlvbiBKUEVHIGltYWdlcyB3aXRoIHRoZWlyIG1vYmlsZSBkZXZpY2VzLiBUaGVzZSBpbWFnZXMgYXJlCi1kZWNvZGVkIGJ5IHRoZSBtb2JpbGUgZGV2aWNlLCBhbmQgdHlwaWNhbGx5IGFsc28gc2NhbGVkIGRvd24gdG8gZml0IHRoZSB1c2VyJ3MKLXpvb20gc2VsZWN0aW9uIG9uIHRoZSBkZXZpY2UncyBicm93c2VyLgotCi1JbiBvcmRlciB0byBpbXByb3ZlIGJvdGggZGVjb2RlIGFuZCBkb3dubG9hZCB0aW1lcywgUXVhbGNvbW0gSW5ub3ZhdGlvbiBDZW50ZXIKLWhhcyBvcHRpbWl6ZWQgdGhlIEpQRUcgbGlicmFyeSBmb3VuZCBvbiBtYW55IGNvbW1vbiBPUyBwbGF0Zm9ybXMgc3VjaCBhcyBXZWIKLU9TLCBBbmRyb2lkLCBhbmQgQ2hyb21lIE9TLiBPdXIgdGVhbSByZS1pbXBsZW1lbnRlZCBzZXZlcmFsIHJvdXRpbmVzIHRvIHV0aWxpemUgdGhlCi1EU1AtbGlrZSBTSU1EIGNhcGFiaWxpdGllcyBvZiB0aGUgQVJNIE5FT04gaW5zdHJ1Y3Rpb24gc2V0LiBUaGVzZSB3ZXJlIHRoZW4KLXR1bmVkIGFuZCB0ZXN0ZWQgb24gUXVhbGNvbW0ncyBTbmFwZHJhZ29uIHBsYXRmb3JtIHdoaWNoIGltcGxlbWVudHMgdGhlIFZlTnVtCi1pbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBzYW1lIGluc3RydWN0aW9ucy4KLQotVGhlIHNwZWNpZmljIGFyZWFzIG9mIGZvY3VzIGNvdmVyIFZlTnVtL05FT04gYWNjZWxlcmF0aW9uIG9mIEludmVyc2UgRGlzY3JldGUKLUNvc2luZSBUcmFuc2Zvcm0gKGlEQ1QpIGZvciA4eDgsIDR4NCwgMngyLCBhbmQgMXgxIGJsb2NrIHNpemVzIGFuZCBZVVYgdG8gUkdCCi1jb2xvciBzcGFjZSBjb252ZXJzaW9uLiBUaGlzIHJlc3VsdGVkIGluIGEgcmFuZ2Ugb2YgMTgtMzIlIGltcHJvdmVtZW50IGluIEpQRUcKLWRlY29kZSBhbmQgZG93bnNjYWxlIHRpbWVzIGZvciBpbWFnZXMgZ3JlYXRlciB0aGFuIDJNcGl4ZWxzLgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvVGhpcmRQYXJ0eVByb2plY3QucHJvcCBiL2xpYmpwZWd0d3JwL1RoaXJkUGFydHlQcm9qZWN0LnByb3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OGNjNjMuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvVGhpcmRQYXJ0eVByb2plY3QucHJvcAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotI0ZyaSBKdWwgMTYgMTA6MDM6MDkgUERUIDIwMTAKLWN1cnJlbnRWZXJzaW9uPThhCi12ZXJzaW9uPTZiCi1pc05hdGl2ZT10cnVlCi1uYW1lPWpwZWcKLWtleXdvcmRzPWpwZWcKLW9uRGV2aWNlPXRydWUKLWhvbWVwYWdlPWh0dHBcOi8vd3d3LmlqZy5vcmcvCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9hbnNpMmtuci4xIGIvbGlianBlZ3R3cnAvYW5zaTJrbnIuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllZTVhNi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9hbnNpMmtuci4xCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLlRIIEFOU0kyS05SIDEgIjE5IEphbiAxOTk2IgotLlNIIE5BTUUKLWFuc2kya25yIFwtIGNvbnZlcnQgQU5TSSBDIHRvIEtlcm5pZ2hhbiAmIFJpdGNoaWUgQwotLlNIIFNZTk9QU0lTCi0uSSBhbnNpMmtucgotWy0tdmFyYXJnc10gaW5wdXRfZmlsZSBbb3V0cHV0X2ZpbGVdCi0uU0ggREVTQ1JJUFRJT04KLUlmIG5vIG91dHB1dF9maWxlIGlzIHN1cHBsaWVkLCBvdXRwdXQgZ29lcyB0byBzdGRvdXQuCi0uYnIKLVRoZXJlIGFyZSBubyBlcnJvciBtZXNzYWdlcy4KLS5zcAotLkkgYW5zaTJrbnIKLXJlY29nbml6ZXMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYnkgc2VlaW5nIGEgbm9uLWtleXdvcmQgaWRlbnRpZmllciBhdCB0aGUgbGVmdAotbWFyZ2luLCBmb2xsb3dlZCBieSBhIGxlZnQgcGFyZW50aGVzaXMsIHdpdGggYSByaWdodCBwYXJlbnRoZXNpcyBhcyB0aGUgbGFzdAotY2hhcmFjdGVyIG9uIHRoZSBsaW5lLCBhbmQgd2l0aCBhIGxlZnQgYnJhY2UgYXMgdGhlIGZpcnN0IHRva2VuIG9uIHRoZQotZm9sbG93aW5nIGxpbmUgKGlnbm9yaW5nIHBvc3NpYmxlIGludGVydmVuaW5nIGNvbW1lbnRzKS4gIEl0IHdpbGwgcmVjb2duaXplIGEKLW11bHRpLWxpbmUgaGVhZGVyIHByb3ZpZGVkIHRoYXQgbm8gaW50ZXJ2ZW5pbmcgbGluZSBlbmRzIHdpdGggYSBsZWZ0IG9yIHJpZ2h0Ci1icmFjZSBvciBhIHNlbWljb2xvbi4gIFRoZXNlIGFsZ29yaXRobXMgaWdub3JlIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzLCBleGNlcHQKLXRoYXQgdGhlIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSB0aGUgZmlyc3QgdGhpbmcgb24gdGhlIGxpbmUuCi0uc3AKLVRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyB3aWxsIGNvbmZ1c2UgaXQ6Ci0uYnIKLSAgICAgLSBBbnkgb3RoZXIgY29uc3RydWN0IHRoYXQgc3RhcnRzIGF0IHRoZSBsZWZ0IG1hcmdpbiBhbmQgZm9sbG93cyB0aGUKLWFib3ZlIHN5bnRheCAoc3VjaCBhcyBhIG1hY3JvIG9yIGZ1bmN0aW9uIGNhbGwpLgotLmJyCi0gICAgIC0gU29tZSBtYWNyb3MgdGhhdCB0aW5rZXIgd2l0aCB0aGUgc3ludGF4IG9mIHRoZSBmdW5jdGlvbiBoZWFkZXIuCi0uc3AKLVRoZSAtLXZhcmFyZ3Mgc3dpdGNoIGlzIG9ic29sZXRlLCBhbmQgaXMgcmVjb2duaXplZCBvbmx5IGZvcgotYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBUaGUgcHJlc2VudCB2ZXJzaW9uIG9mCi0uSSBhbnNpMmtucgotd2lsbCBhbHdheXMgYXR0ZW1wdCB0byBjb252ZXJ0IGEgLi4uIGFyZ3VtZW50IHRvIHZhX2FsaXN0IGFuZCB2YV9kY2wuCi0uU0ggQVVUSE9SCi1MLiBQZXRlciBEZXV0c2NoIDxnaG9zdEBhbGFkZGluLmNvbT4gd3JvdGUgdGhlIG9yaWdpbmFsIGFuc2kya25yIGFuZAotY29udGludWVzIHRvIG1haW50YWluIHRoZSBjdXJyZW50IHZlcnNpb247IG1vc3Qgb2YgdGhlIGNvZGUgaW4gdGhlIGN1cnJlbnQKLXZlcnNpb24gaXMgaGlzIHdvcmsuICBhbnNpMmtuciBhbHNvIGluY2x1ZGVzIGNvbnRyaWJ1dGlvbnMgYnkgRnJhbmNvaXMKLVBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+IGFuZCBKaW0gQXZlcmEgPGppbWFAbmV0Y29tLmNvbT4uCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9hbnNpMmtuci5jIGIvbGlianBlZ3R3cnAvYW5zaTJrbnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwNWZjMi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9hbnNpMmtuci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8qIGFuc2kya25yLmMgKi8KLS8qIENvbnZlcnQgQU5TSSBDIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIEsmUiAoInRyYWRpdGlvbmFsIEMiKSBzeW50YXggKi8KLQotLyoKLWFuc2kya25yIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotV0FSUkFOVFkuICBObyBhdXRob3Igb3IgZGlzdHJpYnV0b3IgYWNjZXB0cyByZXNwb25zaWJpbGl0eSB0byBhbnlvbmUgZm9yIHRoZQotY29uc2VxdWVuY2VzIG9mIHVzaW5nIGl0IG9yIGZvciB3aGV0aGVyIGl0IHNlcnZlcyBhbnkgcGFydGljdWxhciBwdXJwb3NlIG9yCi13b3JrcyBhdCBhbGwsIHVubGVzcyBoZSBzYXlzIHNvIGluIHdyaXRpbmcuICBSZWZlciB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlICh0aGUgIkdQTCIpIGZvciBmdWxsIGRldGFpbHMuCi0KLUV2ZXJ5b25lIGlzIGdyYW50ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSBhbnNpMmtuciwKLWJ1dCBvbmx5IHVuZGVyIHRoZSBjb25kaXRpb25zIGRlc2NyaWJlZCBpbiB0aGUgR1BMLiAgQSBjb3B5IG9mIHRoaXMgbGljZW5zZQotaXMgc3VwcG9zZWQgdG8gaGF2ZSBiZWVuIGdpdmVuIHRvIHlvdSBhbG9uZyB3aXRoIGFuc2kya25yIHNvIHlvdSBjYW4ga25vdwoteW91ciByaWdodHMgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBJdCBzaG91bGQgYmUgaW4gYSBmaWxlIG5hbWVkIENPUFlMRUZULgotW0luIHRoZSBJSkcgZGlzdHJpYnV0aW9uLCB0aGUgR1BMIGFwcGVhcnMgYmVsb3csIG5vdCBpbiBhIHNlcGFyYXRlIGZpbGUuXQotQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQKLW9uIGFsbCBjb3BpZXMuCi0KLVdlIGV4cGxpY2l0bHkgc3RhdGUgaGVyZSB3aGF0IHdlIGJlbGlldmUgaXMgYWxyZWFkeSBpbXBsaWVkIGJ5IHRoZSBHUEw6IGlmCi10aGUgYW5zaTJrbnIgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBhcyBhIHNlcGFyYXRlIHNldCBvZiBzb3VyY2VzIGFuZCBhCi1zZXBhcmF0ZSBleGVjdXRhYmxlIGZpbGUgd2hpY2ggYXJlIGFnZ3JlZ2F0ZWQgb24gYSBzdG9yYWdlIG1lZGl1bSB0b2dldGhlcgotd2l0aCBhbm90aGVyIHByb2dyYW0sIHRoaXMgaW4gaXRzZWxmIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciBwcm9ncmFtIHVuZGVyCi10aGUgR1BMLCBub3IgZG9lcyB0aGUgbWVyZSBmYWN0IHRoYXQgc3VjaCBhIHByb2dyYW0gb3IgdGhlIHByb2NlZHVyZXMgZm9yCi1jb25zdHJ1Y3RpbmcgaXQgaW52b2tlIHRoZSBhbnNpMmtuciBleGVjdXRhYmxlIGJyaW5nIGFueSBvdGhlciBwYXJ0IG9mIHRoZQotcHJvZ3JhbSB1bmRlciB0aGUgR1BMLgotKi8KLQotLyoKLS0tLS0tLS0tLS0gSGVyZSBpcyB0aGUgR05VIEdQTCBmaWxlIENPUFlMRUZULCByZWZlcnJlZCB0byBhYm92ZSAtLS0tLS0tLS0tCi0tLS0tLSBUaGVzZSB0ZXJtcyBkbyBOT1QgYXBwbHkgdG8gdGhlIEpQRUcgc29mdHdhcmUgaXRzZWxmOyBzZWUgUkVBRE1FIC0tLS0tLQotCi0JCSAgICBHSE9TVFNDUklQVCBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAoQ2xhcmlmaWVkIDExIEZlYiAxOTg4KQotCi0gQ29weXJpZ2h0IChDKSAxOTg4IFJpY2hhcmQgTS4gU3RhbGxtYW4KLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcwotIGxpY2Vuc2UsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4gIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyB3b3JkaW5nCi0gdG8gbWFrZSB0aGUgdGVybXMgZm9yIG90aGVyIHByb2dyYW1zLgotCi0gIFRoZSBsaWNlbnNlIGFncmVlbWVudHMgb2YgbW9zdCBzb2Z0d2FyZSBjb21wYW5pZXMga2VlcCB5b3UgYXQgdGhlCi1tZXJjeSBvZiB0aG9zZSBjb21wYW5pZXMuICBCeSBjb250cmFzdCwgb3VyIGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgaXMKLWludGVuZGVkIHRvIGdpdmUgZXZlcnlvbmUgdGhlIHJpZ2h0IHRvIHNoYXJlIEdob3N0c2NyaXB0LiAgVG8gbWFrZSBzdXJlCi10aGF0IHlvdSBnZXQgdGhlIHJpZ2h0cyB3ZSB3YW50IHlvdSB0byBoYXZlLCB3ZSBuZWVkIHRvIG1ha2UKLXJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZCBhbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UKLXRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiAgSGVuY2UgdGhpcyBsaWNlbnNlIGFncmVlbWVudC4KLQotICBTcGVjaWZpY2FsbHksIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlIHJpZ2h0IHRvIGdpdmUKLWF3YXkgY29waWVzIG9mIEdob3N0c2NyaXB0LCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGVsc2UgY2FuIGdldAotaXQgaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgR2hvc3RzY3JpcHQgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIG1ha2Ugc3VyZSB0aGF0IGV2ZXJ5b25lIGhhcyBzdWNoIHJpZ2h0cywgd2UgaGF2ZSB0byBmb3JiaWQgeW91IHRvCi1kZXByaXZlIGFueW9uZSBlbHNlIG9mIHRoZXNlIHJpZ2h0cy4gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZQotY29waWVzIG9mIEdob3N0c2NyaXB0LCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCB0ZWxsIHRoZW0gdGhlaXIgcmlnaHRzLgotCi0gIEFsc28sIGZvciBvdXIgb3duIHByb3RlY3Rpb24sIHdlIG11c3QgbWFrZSBjZXJ0YWluIHRoYXQgZXZlcnlvbmUgZmluZHMKLW91dCB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciBHaG9zdHNjcmlwdC4gIElmIEdob3N0c2NyaXB0IGlzCi1tb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2Ugd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93Ci10aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB3aGF0IHdlIGRpc3RyaWJ1dGVkLCBzbyB0aGF0IGFueSBwcm9ibGVtcwotaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiBvdXIgcmVwdXRhdGlvbi4KLQotICBUaGVyZWZvcmUgd2UgKFJpY2hhcmQgTS4gU3RhbGxtYW4gYW5kIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi1JbmMuKSBtYWtlIHRoZSBmb2xsb3dpbmcgdGVybXMgd2hpY2ggc2F5IHdoYXQgeW91IG11c3QgZG8gdG8gYmUgYWxsb3dlZAotdG8gZGlzdHJpYnV0ZSBvciBjaGFuZ2UgR2hvc3RzY3JpcHQuCi0KLQotCQkJQ09QWUlORyBQT0xJQ0lFUwotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgR2hvc3RzY3JpcHQgc291cmNlCi1jb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5Ci1hbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhIHZhbGlkIGNvcHlyaWdodCBhbmQgbGljZW5zZQotbm90aWNlICJDb3B5cmlnaHQgKEMpIDE5ODkgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1EaXN0cmlidXRlZCBieSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4iIChvciB3aXRoIHdoYXRldmVyIHllYXIgaXMKLWFwcHJvcHJpYXRlKTsga2VlcCBpbnRhY3QgdGhlIG5vdGljZXMgb24gYWxsIGZpbGVzIHRoYXQgcmVmZXIgdG8gdGhpcwotTGljZW5zZSBBZ3JlZW1lbnQgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55IG90aGVyCi1yZWNpcGllbnRzIG9mIHRoZSBHaG9zdHNjcmlwdCBwcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50Ci1hbG9uZyB3aXRoIHRoZSBwcm9ncmFtLiAgWW91IG1heSBjaGFyZ2UgYSBkaXN0cmlidXRpb24gZmVlIGZvciB0aGUKLXBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgR2hvc3RzY3JpcHQgb3IgYW55IHBvcnRpb24gb2YKLWl0LCBhbmQgY29weSBhbmQgZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIG9mCi1QYXJhZ3JhcGggMSBhYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKLSAgICB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZTsgYW5kCi0KLSAgICBiKSBjYXVzZSB0aGUgd2hvbGUgb2YgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLAotICAgIHRoYXQgaW4gd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBhIGRlcml2YXRpdmUgb2YgR2hvc3RzY3JpcHQKLSAgICBvciBhbnkgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyBvbiB0ZXJtcyBpZGVudGljYWwgdG8gdGhvc2UgY29udGFpbmVkIGluIHRoaXMgTGljZW5zZQotICAgIEFncmVlbWVudCAoZXhjZXB0IHRoYXQgeW91IG1heSBjaG9vc2UgdG8gZ3JhbnQgbW9yZSBleHRlbnNpdmUKLSAgICB3YXJyYW50eSBwcm90ZWN0aW9uIHRvIHNvbWUgb3IgYWxsIHRoaXJkIHBhcnRpZXMsIGF0IHlvdXIgb3B0aW9uKS4KLQotICAgIGMpIFlvdSBtYXkgY2hhcmdlIGEgZGlzdHJpYnV0aW9uIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZgotICAgIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5Ci0gICAgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLU1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB1bnJlbGF0ZWQgcHJvZ3JhbSB3aXRoIHRoaXMgcHJvZ3JhbSAob3IgaXRzCi1kZXJpdmF0aXZlKSBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZwotdGhlIG90aGVyIHByb2dyYW0gdW5kZXIgdGhlIHNjb3BlIG9mIHRoZXNlIHRlcm1zLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSBHaG9zdHNjcmlwdCAob3IgYSBwb3J0aW9uIG9yIGRlcml2YXRpdmUKLW9mIGl0LCB1bmRlciBQYXJhZ3JhcGggMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZQotdGVybXMgb2YgUGFyYWdyYXBocyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZQotZm9sbG93aW5nOgotCi0gICAgYSkgYWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgotICAgIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZTsgb3IsCi0KLSAgICBiKSBhY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSBmcmVlIChleGNlcHQgZm9yIGEgbm9taW5hbAotICAgIHNoaXBwaW5nIGNoYXJnZSkgYSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlCi0gICAgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCi0gICAgUGFyYWdyYXBocyAxIGFuZCAyIGFib3ZlOyBvciwKLQotICAgIGMpIGFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gd2hlcmUgdGhlCi0gICAgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIGFsb25lLikKLQotRm9yIGFuIGV4ZWN1dGFibGUgZmlsZSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IKLWFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zOyBidXQsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGl0IG5lZWQgbm90IGluY2x1ZGUKLXNvdXJjZSBjb2RlIGZvciBtb2R1bGVzIHdoaWNoIGFyZSBzdGFuZGFyZCBsaWJyYXJpZXMgdGhhdCBhY2NvbXBhbnkgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIGZpbGUgcnVucy4KLQotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBzdWJsaWNlbnNlLCBkaXN0cmlidXRlIG9yIHRyYW5zZmVyIEdob3N0c2NyaXB0Ci1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZSBBZ3JlZW1lbnQuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIHN1YmxpY2Vuc2UsIGRpc3RyaWJ1dGUgb3IgdHJhbnNmZXIgR2hvc3RzY3JpcHQgaXMKLXZvaWQgYW5kIHlvdXIgcmlnaHRzIHRvIHVzZSB0aGUgcHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UgYWdyZWVtZW50Ci1zaGFsbCBiZSBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkCi1jb21wdXRlciBzb2Z0d2FyZSBwcm9ncmFtcyBmcm9tIHlvdSB3aXRoIHRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgd2lsbCBub3QKLWhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbAotY29tcGxpYW5jZS4KLQotICA1LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiBHaG9zdHNjcmlwdCBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uIGF0IDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOS4gIFdlIGhhdmUgbm90Ci15ZXQgd29ya2VkIG91dCBhIHNpbXBsZSBydWxlIHRoYXQgY2FuIGJlIHN0YXRlZCBoZXJlLCBidXQgd2Ugd2lsbCBvZnRlbgotcGVybWl0IHRoaXMuICBXZSB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUKLXN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUKLXNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlLgotCi1Zb3VyIGNvbW1lbnRzIGFuZCBzdWdnZXN0aW9ucyBhYm91dCBvdXIgbGljZW5zaW5nIHBvbGljaWVzIGFuZCBvdXIKLXNvZnR3YXJlIGFyZSB3ZWxjb21lISAgUGxlYXNlIGNvbnRhY3QgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLUluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgb3IgY2FsbCAoNjE3KSA4NzYtMzI5Ni4KLQotCQkgICAgICAgTk8gV0FSUkFOVFkKLQotICBCRUNBVVNFIEdIT1NUU0NSSVBUIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBXRSBQUk9WSURFIEFCU09MVVRFTFkKLU5PIFdBUlJBTlRZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIFNUQVRFIExBVy4gIEVYQ0VQVAotV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcsIEZSRUUgU09GVFdBUkUgRk9VTkRBVElPTiwgSU5DLCBSSUNIQVJECi1NLiBTVEFMTE1BTiwgQUxBRERJTiBFTlRFUlBSSVNFUywgTC4gUEVURVIgREVVVFNDSCwgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgR0hPU1RTQ1JJUFQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIKLUVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLVdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRQotRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIEdIT1NUU0NSSVBUIElTIFdJVEgKLVlPVS4gIFNIT1VMRCBHSE9TVFNDUklQVCBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMCi1ORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgV0lMTCBSSUNIQVJEIE0uCi1TVEFMTE1BTiwgVEhFIEZSRUUgU09GVFdBUkUgRk9VTkRBVElPTiwgSU5DLiwgTC4gUEVURVIgREVVVFNDSCwgQUxBRERJTgotRU5URVJQUklTRVMsIEFORC9PUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EIFJFRElTVFJJQlVURQotR0hPU1RTQ1JJUFQgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLCBJTkNMVURJTkcKLUFOWSBMT1NUIFBST0ZJVFMsIExPU1QgTU9OSUVTLCBPUiBPVEhFUiBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFCi0oSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRAotSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRQotUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSBHSE9TVFNDUklQVCwgRVZFTiBJRiBZT1UKLUhBVkUgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMsIE9SIEZPUiBBTlkgQ0xBSU0KLUJZIEFOWSBPVEhFUiBQQVJUWS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9mIGZpbGUgQ09QWUxFRlQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0vKgotICogVXNhZ2U6Ci0JYW5zaTJrbnIgaW5wdXRfZmlsZSBbb3V0cHV0X2ZpbGVdCi0gKiBJZiBubyBvdXRwdXRfZmlsZSBpcyBzdXBwbGllZCwgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0LgotICogVGhlcmUgYXJlIG5vIGVycm9yIG1lc3NhZ2VzLgotICoKLSAqIGFuc2kya25yIHJlY29nbml6ZXMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYnkgc2VlaW5nIGEgbm9uLWtleXdvcmQKLSAqIGlkZW50aWZpZXIgYXQgdGhlIGxlZnQgbWFyZ2luLCBmb2xsb3dlZCBieSBhIGxlZnQgcGFyZW50aGVzaXMsCi0gKiB3aXRoIGEgcmlnaHQgcGFyZW50aGVzaXMgYXMgdGhlIGxhc3QgY2hhcmFjdGVyIG9uIHRoZSBsaW5lLAotICogYW5kIHdpdGggYSBsZWZ0IGJyYWNlIGFzIHRoZSBmaXJzdCB0b2tlbiBvbiB0aGUgZm9sbG93aW5nIGxpbmUKLSAqIChpZ25vcmluZyBwb3NzaWJsZSBpbnRlcnZlbmluZyBjb21tZW50cykuCi0gKiBJdCB3aWxsIHJlY29nbml6ZSBhIG11bHRpLWxpbmUgaGVhZGVyIHByb3ZpZGVkIHRoYXQgbm8gaW50ZXJ2ZW5pbmcKLSAqIGxpbmUgZW5kcyB3aXRoIGEgbGVmdCBvciByaWdodCBicmFjZSBvciBhIHNlbWljb2xvbi4KLSAqIFRoZXNlIGFsZ29yaXRobXMgaWdub3JlIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzLCBleGNlcHQgdGhhdAotICogdGhlIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSB0aGUgZmlyc3QgdGhpbmcgb24gdGhlIGxpbmUuCi0gKiBUaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgd2lsbCBjb25mdXNlIGl0OgotICoJLSBBbnkgb3RoZXIgY29uc3RydWN0IHRoYXQgc3RhcnRzIGF0IHRoZSBsZWZ0IG1hcmdpbiBhbmQKLSAqCSAgICBmb2xsb3dzIHRoZSBhYm92ZSBzeW50YXggKHN1Y2ggYXMgYSBtYWNybyBvciBmdW5jdGlvbiBjYWxsKS4KLSAqCS0gU29tZSBtYWNyb3MgdGhhdCB0aW5rZXIgd2l0aCB0aGUgc3ludGF4IG9mIHRoZSBmdW5jdGlvbiBoZWFkZXIuCi0gKi8KLQotLyoKLSAqIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBhbnNpMmtuciBpcyBMLiBQZXRlciBEZXV0c2NoCi0gKiA8Z2hvc3RAYWxhZGRpbi5jb20+LiAgT3RoZXIgYXV0aG9ycyBhcmUgbm90ZWQgaW4gdGhlIGNoYW5nZSBoaXN0b3J5Ci0gKiB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6Ci0JbHBkIDk2LTAxLTIxIGFkZGVkIGNvZGUgdG8gY29wZSB3aXRoIG5vdCBIQVZFX0NPTkZJR19IIGFuZCB3aXRoCi0JCWNvbXBpbGVycyB0aGF0IGRvbid0IHVuZGVyc3RhbmQgdm9pZCwgYXMgc3VnZ2VzdGVkIGJ5Ci0JCVRvbSBMYW5lCi0JbHBkIDk2LTAxLTE1IGNoYW5nZWQgdG8gcmVxdWlyZSB0aGF0IHRoZSBmaXJzdCBub24tY29tbWVudCB0b2tlbgotCQlvbiB0aGUgbGluZSBmb2xsb3dpbmcgYSBmdW5jdGlvbiBoZWFkZXIgYmUgYSBsZWZ0IGJyYWNlLAotCQl0byByZWR1Y2Ugc2Vuc2l0aXZpdHkgdG8gbWFjcm9zLCBhcyBzdWdnZXN0ZWQgYnkgVG9tIExhbmUKLQkJPHRnbEBzc3MucGdoLnBhLnVzPgotCWxwZCA5NS0wNi0yMiByZW1vdmVkICNpZm5kZWZzIHdob3NlIHNvbGUgcHVycG9zZSB3YXMgdG8gZGVmaW5lCi0JCXVuZGVmaW5lZCBwcmVwcm9jZXNzb3Igc3ltYm9scyBhcyAwOyBjaGFuZ2VkIGFsbCAjaWZkZWZzCi0JCWZvciBjb25maWd1cmF0aW9uIHN5bWJvbHMgdG8gI2lmcwotCWxwZCA5NS0wNC0wNSBjaGFuZ2VkIGNvcHlyaWdodCBub3RpY2UgdG8gbWFrZSBpdCBjbGVhciB0aGF0Ci0JCWluY2x1ZGluZyBhbnNpMmtuciBpbiBhIHByb2dyYW0gZG9lcyBub3QgYnJpbmcgdGhlIGVudGlyZQotCQlwcm9ncmFtIHVuZGVyIHRoZSBHUEwKLQlscGQgOTQtMTItMTggYWRkZWQgY29uZGl0aW9uYWxzIGZvciBzeXN0ZW1zIHdoZXJlIGN0eXBlIG1hY3JvcwotCQlkb24ndCBoYW5kbGUgOC1iaXQgY2hhcmFjdGVycyBwcm9wZXJseSwgc3VnZ2VzdGVkIGJ5Ci0JCUZyYW5jb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+OwotCQlyZW1vdmVkIC0tdmFyYXJncyBzd2l0Y2ggKHRoaXMgaXMgbm93IHRoZSBkZWZhdWx0KQotCWxwZCA5NC0xMC0xMCByZW1vdmVkIENPTkZJR19CUk9LRVRTIGNvbmRpdGlvbmFsCi0JbHBkIDk0LTA3LTE2IGFkZGVkIHNvbWUgY29uZGl0aW9uYWxzIHRvIGhlbHAgR05VIGBjb25maWd1cmUnLAotCQlzdWdnZXN0ZWQgYnkgRnJhbmNvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT47Ci0JCXByb3Blcmx5IGVyYXNlIHByb3RvdHlwZSBhcmdzIGluIGZ1bmN0aW9uIHBhcmFtZXRlcnMsCi0JCWNvbnRyaWJ1dGVkIGJ5IEppbSBBdmVyYSA8amltYUBuZXRjb20uY29tPjsKLQkJY29ycmVjdCBlcnJvciBpbiB3cml0ZWJsYW5rcyAoaXQgc2hvdWxkbid0IGVyYXNlIEVPTHMpCi0JbHBkIDg5LXh4LXh4IG9yaWdpbmFsIHZlcnNpb24KLSAqLwotCi0vKiBNb3N0IG9mIHRoZSBjb25kaXRpb25hbHMgaGVyZSBhcmUgdG8gbWFrZSBhbnNpMmtuciB3b3JrIHdpdGggKi8KLS8qIG9yIHdpdGhvdXQgdGhlIEdOVSBjb25maWd1cmUgbWFjaGluZXJ5LiAqLwotCi0jaWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWYgSEFWRV9DT05GSUdfSAotCi0vKgotICAgRm9yIHByb3Blcmx5IGF1dG9jb25maWd1cmluZyBhbnNpMmtuciwgdXNlIEFDX0NPTkZJR19IRUFERVIoY29uZmlnLmgpLgotICAgVGhpcyB3aWxsIGRlZmluZSBIQVZFX0NPTkZJR19IIGFuZCBzbywgYWN0aXZhdGUgdGhlIGZvbGxvd2luZyBsaW5lcy4KLSAqLwotCi0jIGlmIFNURENfSEVBREVSUyB8fCBIQVZFX1NUUklOR19ICi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgZWxzZQotIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBlbmRpZgotCi0jZWxzZSAvKiBub3QgSEFWRV9DT05GSUdfSCAqLwotCi0vKiBPdGhlcndpc2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCi0KLSMgaWZkZWYgQlNECi0jICBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIFZNUwotICAgIGV4dGVybiBpbnQgc3RybGVuKCksIHN0cm5jbXAoKTsKLSMgIGVsc2UKLSMgICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgIGVuZGlmCi0jIGVuZGlmCi0KLSNlbmRpZiAvKiBub3QgSEFWRV9DT05GSUdfSCAqLwotCi0jaWYgU1REQ19IRUFERVJTCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLS8qCi0gICBtYWxsb2MgYW5kIGZyZWUgc2hvdWxkIGJlIGRlY2xhcmVkIGluIHN0ZGxpYi5oLAotICAgYnV0IGlmIHlvdSd2ZSBnb3QgYSBLJlIgY29tcGlsZXIsIHRoZXkgcHJvYmFibHkgYXJlbid0LgotICovCi0jIGlmZGVmIE1TRE9TCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZWxzZQotIyAgaWZkZWYgVk1TCi0gICAgIGV4dGVybiBjaGFyICptYWxsb2MoKTsKLSAgICAgZXh0ZXJuIHZvaWQgZnJlZSgpOwotIyAgZWxzZQotICAgICBleHRlcm4gY2hhciAqbWFsbG9jKCk7Ci0gICAgIGV4dGVybiBpbnQgZnJlZSgpOwotIyAgZW5kaWYKLSMgZW5kaWYKLQotI2VuZGlmCi0KLS8qCi0gKiBUaGUgY3R5cGUgbWFjcm9zIGRvbid0IGFsd2F5cyBoYW5kbGUgOC1iaXQgY2hhcmFjdGVycyBjb3JyZWN0bHkuCi0gKiBDb21wZW5zYXRlIGZvciB0aGlzIGhlcmUuCi0gKi8KLSNpZmRlZiBpc2FzY2lpCi0jICB1bmRlZiBIQVZFX0lTQVNDSUkJCS8qIGp1c3QgaW4gY2FzZSAqLwotIyAgZGVmaW5lIEhBVkVfSVNBU0NJSSAxCi0jZWxzZQotI2VuZGlmCi0jaWYgU1REQ19IRUFERVJTIHx8ICFIQVZFX0lTQVNDSUkKLSMgIGRlZmluZSBpc19hc2NpaShjKSAxCi0jZWxzZQotIyAgZGVmaW5lIGlzX2FzY2lpKGMpIGlzYXNjaWkoYykKLSNlbmRpZgotCi0jZGVmaW5lIGlzX3NwYWNlKGMpIChpc19hc2NpaShjKSAmJiBpc3NwYWNlKGMpKQotI2RlZmluZSBpc19hbHBoYShjKSAoaXNfYXNjaWkoYykgJiYgaXNhbHBoYShjKSkKLSNkZWZpbmUgaXNfYWxudW0oYykgKGlzX2FzY2lpKGMpICYmIGlzYWxudW0oYykpCi0KLS8qIFNjYW5uaW5nIG1hY3JvcyAqLwotI2RlZmluZSBpc2lkY2hhcihjaCkgKGlzX2FsbnVtKGNoKSB8fCAoY2gpID09ICdfJykKLSNkZWZpbmUgaXNpZGZpcnN0Y2hhcihjaCkgKGlzX2FscGhhKGNoKSB8fCAoY2gpID09ICdfJykKLQotLyogRm9yd2FyZCByZWZlcmVuY2VzICovCi1jaGFyICpza2lwc3BhY2UoKTsKLWludCB3cml0ZWJsYW5rcygpOwotaW50IHRlc3QxKCk7Ci1pbnQgY29udmVydDEoKTsKLQotLyogVGhlIG1haW4gcHJvZ3JhbSAqLwotaW50Ci1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgaW50IGFyZ2M7Ci0gICAgY2hhciAqYXJndltdOwotewlGSUxFICppbiwgKm91dDsKLSNkZWZpbmUgYnVmc2l6ZSA1MDAwCQkJLyogYXJiaXRyYXJ5IHNpemUgKi8KLQljaGFyICpidWY7Ci0JY2hhciAqbGluZTsKLQljaGFyICptb3JlOwotCS8qCi0JICogSW4gcHJldmlvdXMgdmVyc2lvbnMsIGFuc2kya25yIHJlY29nbml6ZWQgYSAtLXZhcmFyZ3Mgc3dpdGNoLgotCSAqIElmIHRoaXMgc3dpdGNoIHdhcyBzdXBwbGllZCwgYW5zaTJrbnIgd291bGQgYXR0ZW1wdCB0byBjb252ZXJ0Ci0JICogYSAuLi4gYXJndW1lbnQgdG8gdmFfYWxpc3QgYW5kIHZhX2RjbDsgaWYgdGhpcyBzd2l0Y2ggd2FzIG5vdAotCSAqIHN1cHBsaWVkLCBhbnNpMmtuciB3b3VsZCBzaW1wbHkgZHJvcCBhbnkgc3VjaCBhcmd1bWVudHMuCi0JICogTm93LCBhbnNpMmtuciBhbHdheXMgZG9lcyB0aGlzIGNvbnZlcnNpb24sIGFuZCB3ZSBvbmx5Ci0JICogY2hlY2sgZm9yIHRoaXMgc3dpdGNoIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCSAqLwotCWludCBjb252ZXJ0X3ZhcmFyZ3MgPSAxOwotCi0JaWYgKCBhcmdjID4gMSAmJiBhcmd2WzFdWzBdID09ICctJyApCi0JICB7CWlmICggIXN0cmNtcChhcmd2WzFdLCAiLS12YXJhcmdzIikgKQotCQkgIHsJY29udmVydF92YXJhcmdzID0gMTsKLQkJCWFyZ2MtLTsKLQkJCWFyZ3YrKzsKLQkJICB9Ci0JCWVsc2UKLQkJICB7CWZwcmludGYoc3RkZXJyLCAiVW5yZWNvZ25pemVkIHN3aXRjaDogJXNcbiIsIGFyZ3ZbMV0pOwotCQkJZXhpdCgxKTsKLQkJICB9Ci0JICB9Ci0Jc3dpdGNoICggYXJnYyApCi0JICAgewotCWRlZmF1bHQ6Ci0JCXByaW50ZigiVXNhZ2U6IGFuc2kya25yIGlucHV0X2ZpbGUgW291dHB1dF9maWxlXVxuIik7Ci0JCWV4aXQoMCk7Ci0JY2FzZSAyOgotCQlvdXQgPSBzdGRvdXQ7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJb3V0ID0gZm9wZW4oYXJndlsyXSwgInciKTsKLQkJaWYgKCBvdXQgPT0gTlVMTCApCi0JCSAgIHsJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgYXJndlsyXSk7Ci0JCQlleGl0KDEpOwotCQkgICB9Ci0JICAgfQotCWluID0gZm9wZW4oYXJndlsxXSwgInIiKTsKLQlpZiAoIGluID09IE5VTEwgKQotCSAgIHsJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iLCBhcmd2WzFdKTsKLQkJZXhpdCgxKTsKLQkgICB9Ci0JZnByaW50ZihvdXQsICIjbGluZSAxIFwiJXNcIlxuIiwgYXJndlsxXSk7Ci0JYnVmID0gbWFsbG9jKGJ1ZnNpemUpOwotCWxpbmUgPSBidWY7Ci0Jd2hpbGUgKCBmZ2V0cyhsaW5lLCAodW5zaWduZWQpKGJ1ZiArIGJ1ZnNpemUgLSBsaW5lKSwgaW4pICE9IE5VTEwgKQotCSAgIHsKLXRlc3Q6CQlsaW5lICs9IHN0cmxlbihsaW5lKTsKLQkJc3dpdGNoICggdGVzdDEoYnVmKSApCi0JCSAgIHsKLQkJY2FzZSAyOgkJCS8qIGEgZnVuY3Rpb24gaGVhZGVyICovCi0JCQljb252ZXJ0MShidWYsIG91dCwgMSwgY29udmVydF92YXJhcmdzKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6CQkJLyogYSBmdW5jdGlvbiAqLwotCQkJLyogQ2hlY2sgZm9yIGEgeyBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbGluZS4gKi8KLQkJCW1vcmUgPSArK2xpbmU7Ci1mOgkJCWlmICggbGluZSA+PSBidWYgKyAoYnVmc2l6ZSAtIDEpICkgLyogb3ZlcmZsb3cgY2hlY2sgKi8KLQkJCSAgZ290byB3bDsKLQkJCWlmICggZmdldHMobGluZSwgKHVuc2lnbmVkKShidWYgKyBidWZzaXplIC0gbGluZSksIGluKSA9PSBOVUxMICkKLQkJCSAgZ290byB3bDsKLQkJCXN3aXRjaCAoICpza2lwc3BhY2UobW9yZSwgMSkgKQotCQkJICB7Ci0JCQkgIGNhc2UgJ3snOgotCQkJICAgIC8qIERlZmluaXRlbHkgYSBmdW5jdGlvbiBoZWFkZXIuICovCi0JCQkgICAgY29udmVydDEoYnVmLCBvdXQsIDAsIGNvbnZlcnRfdmFyYXJncyk7Ci0JCQkgICAgZnB1dHMobW9yZSwgb3V0KTsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAwOgotCQkJICAgIC8qIFRoZSBuZXh0IGxpbmUgd2FzIGJsYW5rIG9yIGEgY29tbWVudDogKi8KLQkJCSAgICAvKiBrZWVwIHNjYW5uaW5nIGZvciBhIG5vbi1jb21tZW50LiAqLwotCQkJICAgIGxpbmUgKz0gc3RybGVuKGxpbmUpOwotCQkJICAgIGdvdG8gZjsKLQkJCSAgZGVmYXVsdDoKLQkJCSAgICAvKiBidWYgaXNuJ3QgYSBmdW5jdGlvbiBoZWFkZXIsIGJ1dCAqLwotCQkJICAgIC8qIG1vcmUgbWlnaHQgYmUuICovCi0JCQkgICAgZnB1dHMoYnVmLCBvdXQpOwotCQkJICAgIHN0cmNweShidWYsIG1vcmUpOwotCQkJICAgIGxpbmUgPSBidWY7Ci0JCQkgICAgZ290byB0ZXN0OwotCQkJICB9Ci0JCQlicmVhazsKLQkJY2FzZSAtMToJCS8qIG1heWJlIHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uICovCi0JCQlpZiAoIGxpbmUgIT0gYnVmICsgKGJ1ZnNpemUgLSAxKSApIC8qIG92ZXJmbG93IGNoZWNrICovCi0JCQkgIGNvbnRpbnVlOwotCQkJLyogZmFsbHMgdGhyb3VnaCAqLwotCQlkZWZhdWx0OgkJLyogbm90IGEgZnVuY3Rpb24gKi8KLXdsOgkJCWZwdXRzKGJ1Ziwgb3V0KTsKLQkJCWJyZWFrOwotCQkgICB9Ci0JCWxpbmUgPSBidWY7Ci0JICAgfQotCWlmICggbGluZSAhPSBidWYgKQotCSAgZnB1dHMoYnVmLCBvdXQpOwotCWZyZWUoYnVmKTsKLQlmY2xvc2Uob3V0KTsKLQlmY2xvc2UoaW4pOwotCXJldHVybiAwOwotfQotCi0vKiBTa2lwIG92ZXIgc3BhY2UgYW5kIGNvbW1lbnRzLCBpbiBlaXRoZXIgZGlyZWN0aW9uLiAqLwotY2hhciAqCi1za2lwc3BhY2UocCwgZGlyKQotICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gICAgcmVnaXN0ZXIgaW50IGRpcjsJCQkvKiAxIGZvciBmb3J3YXJkLCAtMSBmb3IgYmFja3dhcmQgKi8KLXsJZm9yICggOyA7ICkKLQkgICB7CXdoaWxlICggaXNfc3BhY2UoKnApICkKLQkJICBwICs9IGRpcjsKLQkJaWYgKCAhKCpwID09ICcvJyAmJiBwW2Rpcl0gPT0gJyonKSApCi0JCSAgYnJlYWs7Ci0JCXAgKz0gZGlyOyAgcCArPSBkaXI7Ci0JCXdoaWxlICggISgqcCA9PSAnKicgJiYgcFtkaXJdID09ICcvJykgKQotCQkgICB7CWlmICggKnAgPT0gMCApCi0JCQkgIHJldHVybiBwOwkvKiBtdWx0aS1saW5lIGNvbW1lbnQ/PyAqLwotCQkJcCArPSBkaXI7Ci0JCSAgIH0KLQkJcCArPSBkaXI7ICBwICs9IGRpcjsKLQkgICB9Ci0JcmV0dXJuIHA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBibGFua3Mgb3ZlciBwYXJ0IG9mIGEgc3RyaW5nLgotICogRG9uJ3Qgb3ZlcndyaXRlIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMuCi0gKi8KLWludAotd3JpdGVibGFua3Moc3RhcnQsIGVuZCkKLSAgICBjaGFyICpzdGFydDsKLSAgICBjaGFyICplbmQ7Ci17CWNoYXIgKnA7Ci0JZm9yICggcCA9IHN0YXJ0OyBwIDwgZW5kOyBwKysgKQotCSAgaWYgKCAqcCAhPSAnXHInICYmICpwICE9ICdcbicgKQotCSAgICAqcCA9ICcgJzsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRlc3Qgd2hldGhlciB0aGUgc3RyaW5nIGluIGJ1ZiBpcyBhIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKiBUaGUgc3RyaW5nIG1heSBjb250YWluIGFuZC9vciBlbmQgd2l0aCBhIG5ld2xpbmUuCi0gKiBSZXR1cm4gYXMgZm9sbG93czoKLSAqCTAgLSBkZWZpbml0ZWx5IG5vdCBhIGZ1bmN0aW9uIGRlZmluaXRpb247Ci0gKgkxIC0gZGVmaW5pdGVseSBhIGZ1bmN0aW9uIGRlZmluaXRpb247Ci0gKgkyIC0gZGVmaW5pdGVseSBhIGZ1bmN0aW9uIHByb3RvdHlwZSAoTk9UIFVTRUQpOwotICoJLTEgLSBtYXkgYmUgdGhlIGJlZ2lubmluZyBvZiBhIGZ1bmN0aW9uIGRlZmluaXRpb24sCi0gKgkJYXBwZW5kIGFub3RoZXIgbGluZSBhbmQgbG9vayBhZ2Fpbi4KLSAqIFRoZSByZWFzb24gd2UgZG9uJ3QgYXR0ZW1wdCB0byBjb252ZXJ0IGZ1bmN0aW9uIHByb3RvdHlwZXMgaXMgdGhhdAotICogR2hvc3RzY3JpcHQncyBkZWNsYXJhdGlvbi1nZW5lcmF0aW5nIG1hY3JvcyBsb29rIHRvbyBtdWNoIGxpa2UKLSAqIHByb3RvdHlwZXMsIGFuZCBjb25mdXNlIHRoZSBhbGdvcml0aG1zLgotICovCi1pbnQKLXRlc3QxKGJ1ZikKLSAgICBjaGFyICpidWY7Ci17CXJlZ2lzdGVyIGNoYXIgKnAgPSBidWY7Ci0JY2hhciAqYmVuZDsKLQljaGFyICplbmRmbjsKLQlpbnQgY29udGluOwotCi0JaWYgKCAhaXNpZGZpcnN0Y2hhcigqcCkgKQotCSAgcmV0dXJuIDA7CQkvKiBubyBuYW1lIGF0IGxlZnQgbWFyZ2luICovCi0JYmVuZCA9IHNraXBzcGFjZShidWYgKyBzdHJsZW4oYnVmKSAtIDEsIC0xKTsKLQlzd2l0Y2ggKCAqYmVuZCApCi0JICAgewotCSAgIGNhc2UgJzsnOiBjb250aW4gPSAwIC8qMiovOyBicmVhazsKLQkgICBjYXNlICcpJzogY29udGluID0gMTsgYnJlYWs7Ci0JICAgY2FzZSAneyc6IHJldHVybiAwOwkJLyogbm90IGEgZnVuY3Rpb24gKi8KLQkgICBjYXNlICd9JzogcmV0dXJuIDA7CQkvKiBub3QgYSBmdW5jdGlvbiAqLwotCSAgIGRlZmF1bHQ6IGNvbnRpbiA9IC0xOwotCSAgIH0KLQl3aGlsZSAoIGlzaWRjaGFyKCpwKSApCi0JICBwKys7Ci0JZW5kZm4gPSBwOwotCXAgPSBza2lwc3BhY2UocCwgMSk7Ci0JaWYgKCAqcCsrICE9ICcoJyApCi0JICByZXR1cm4gMDsJCS8qIG5vdCBhIGZ1bmN0aW9uICovCi0JcCA9IHNraXBzcGFjZShwLCAxKTsKLQlpZiAoICpwID09ICcpJyApCi0JICByZXR1cm4gMDsJCS8qIG5vIHBhcmFtZXRlcnMgKi8KLQkvKiBDaGVjayB0aGF0IHRoZSBhcHBhcmVudCBmdW5jdGlvbiBuYW1lIGlzbid0IGEga2V5d29yZC4gKi8KLQkvKiBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgZm9yIGtleXdvcmRzIHRoYXQgY291bGQgYmUgZm9sbG93ZWQgKi8KLQkvKiBieSBhIGxlZnQgcGFyZW50aGVzaXMgKHdoaWNoLCB1bmZvcnR1bmF0ZWx5LCBpcyBtb3N0IG9mIHRoZW0pLiAqLwotCSAgIHsJc3RhdGljIGNoYXIgKndvcmRzW10gPQotCQkgICB7CSJhc20iLCAiYXV0byIsICJjYXNlIiwgImNoYXIiLCAiY29uc3QiLCAiZG91YmxlIiwKLQkJCSJleHRlcm4iLCAiZmxvYXQiLCAiZm9yIiwgImlmIiwgImludCIsICJsb25nIiwKLQkJCSJyZWdpc3RlciIsICJyZXR1cm4iLCAic2hvcnQiLCAic2lnbmVkIiwgInNpemVvZiIsCi0JCQkic3RhdGljIiwgInN3aXRjaCIsICJ0eXBlZGVmIiwgInVuc2lnbmVkIiwKLQkJCSJ2b2lkIiwgInZvbGF0aWxlIiwgIndoaWxlIiwgMAotCQkgICB9OwotCQljaGFyICoqa2V5ID0gd29yZHM7Ci0JCWNoYXIgKmtwOwotCQlpbnQgbGVuID0gZW5kZm4gLSBidWY7Ci0KLQkJd2hpbGUgKCAoa3AgPSAqa2V5KSAhPSAwICkKLQkJICAgewlpZiAoIHN0cmxlbihrcCkgPT0gbGVuICYmICFzdHJuY21wKGtwLCBidWYsIGxlbikgKQotCQkJICByZXR1cm4gMDsJLyogbmFtZSBpcyBhIGtleXdvcmQgKi8KLQkJCWtleSsrOwotCQkgICB9Ci0JICAgfQotCXJldHVybiBjb250aW47Ci19Ci0KLS8qIENvbnZlcnQgYSByZWNvZ25pemVkIGZ1bmN0aW9uIGRlZmluaXRpb24gb3IgaGVhZGVyIHRvIEsmUiBzeW50YXguICovCi1pbnQKLWNvbnZlcnQxKGJ1Ziwgb3V0LCBoZWFkZXIsIGNvbnZlcnRfdmFyYXJncykKLSAgICBjaGFyICpidWY7Ci0gICAgRklMRSAqb3V0OwotICAgIGludCBoZWFkZXI7CQkJLyogQm9vbGVhbiAqLwotICAgIGludCBjb252ZXJ0X3ZhcmFyZ3M7CS8qIEJvb2xlYW4gKi8KLXsJY2hhciAqZW5kZm47Ci0JcmVnaXN0ZXIgY2hhciAqcDsKLQljaGFyICoqYnJlYWtzOwotCXVuc2lnbmVkIG51bV9icmVha3MgPSAyOwkvKiBmb3IgdGVzdGluZyAqLwotCWNoYXIgKipidG9wOwotCWNoYXIgKipicDsKLQljaGFyICoqYXA7Ci0JY2hhciAqdmFyYXJnID0gMDsKLQotCS8qIFByZS1BTlNJIGltcGxlbWVudGF0aW9ucyBkb24ndCBhZ3JlZSBvbiB3aGV0aGVyIHN0cmNociAqLwotCS8qIGlzIGNhbGxlZCBzdHJjaHIgb3IgaW5kZXgsIHNvIHdlIG9wZW4tY29kZSBpdCBoZXJlLiAqLwotCWZvciAoIGVuZGZuID0gYnVmOyAqKGVuZGZuKyspICE9ICcoJzsgKQotCSAgOwotdG9wOglwID0gZW5kZm47Ci0JYnJlYWtzID0gKGNoYXIgKiopbWFsbG9jKHNpemVvZihjaGFyICopICogbnVtX2JyZWFrcyAqIDIpOwotCWlmICggYnJlYWtzID09IDAgKQotCSAgIHsJLyogQ291bGRuJ3QgYWxsb2NhdGUgYnJlYWsgdGFibGUsIGdpdmUgdXAgKi8KLQkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gYWxsb2NhdGUgYnJlYWsgdGFibGUhXG4iKTsKLQkJZnB1dHMoYnVmLCBvdXQpOwotCQlyZXR1cm4gLTE7Ci0JICAgfQotCWJ0b3AgPSBicmVha3MgKyBudW1fYnJlYWtzICogMiAtIDI7Ci0JYnAgPSBicmVha3M7Ci0JLyogUGFyc2UgdGhlIGFyZ3VtZW50IGxpc3QgKi8KLQlkbwotCSAgIHsJaW50IGxldmVsID0gMDsKLQkJY2hhciAqbHAgPSBOVUxMOwotCQljaGFyICpycDsKLQkJY2hhciAqZW5kID0gTlVMTDsKLQotCQlpZiAoIGJwID49IGJ0b3AgKQotCQkgICB7CS8qIEZpbGxlZCB1cCBicmVhayB0YWJsZS4gKi8KLQkJCS8qIEFsbG9jYXRlIGEgYmlnZ2VyIG9uZSBhbmQgc3RhcnQgb3Zlci4gKi8KLQkJCWZyZWUoKGNoYXIgKilicmVha3MpOwotCQkJbnVtX2JyZWFrcyA8PD0gMTsKLQkJCWdvdG8gdG9wOwotCQkgICB9Ci0JCSpicCsrID0gcDsKLQkJLyogRmluZCB0aGUgZW5kIG9mIHRoZSBhcmd1bWVudCAqLwotCQlmb3IgKCA7IGVuZCA9PSBOVUxMOyBwKysgKQotCQkgICB7CXN3aXRjaCgqcCkKLQkJCSAgIHsKLQkJCSAgIGNhc2UgJywnOgotCQkJCWlmICggIWxldmVsICkgZW5kID0gcDsKLQkJCQlicmVhazsKLQkJCSAgIGNhc2UgJygnOgotCQkJCWlmICggIWxldmVsICkgbHAgPSBwOwotCQkJCWxldmVsKys7Ci0JCQkJYnJlYWs7Ci0JCQkgICBjYXNlICcpJzoKLQkJCQlpZiAoIC0tbGV2ZWwgPCAwICkgZW5kID0gcDsKLQkJCQllbHNlIHJwID0gcDsKLQkJCQlicmVhazsKLQkJCSAgIGNhc2UgJy8nOgotCQkJCXAgPSBza2lwc3BhY2UocCwgMSkgLSAxOwotCQkJCWJyZWFrOwotCQkJICAgZGVmYXVsdDoKLQkJCQk7Ci0JCQkgICB9Ci0JCSAgIH0KLQkJLyogRXJhc2UgYW55IGVtYmVkZGVkIHByb3RvdHlwZSBwYXJhbWV0ZXJzLiAqLwotCQlpZiAoIGxwICkKLQkJICB3cml0ZWJsYW5rcyhscCArIDEsIHJwKTsKLQkJcC0tOwkJCS8qIGJhY2sgdXAgb3ZlciB0ZXJtaW5hdG9yICovCi0JCS8qIEZpbmQgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQuICovCi0JCS8qIFRoaXMgaXMgY29tcGxpY2F0ZWQgYmVjYXVzZSBvZiBwcm9jZWR1cmUgYW5kICovCi0JCS8qIGFycmF5IG1vZGlmaWVycy4gKi8KLQkJZm9yICggOyA7ICkKLQkJICAgewlwID0gc2tpcHNwYWNlKHAgLSAxLCAtMSk7Ci0JCQlzd2l0Y2ggKCAqcCApCi0JCQkgICB7Ci0JCQkgICBjYXNlICddJzoJLyogc2tpcCBhcnJheSBkaW1lbnNpb24ocykgKi8KLQkJCSAgIGNhc2UgJyknOgkvKiBza2lwIHByb2NlZHVyZSBhcmdzIE9SIG5hbWUgKi8KLQkJCSAgIHsJaW50IGxldmVsID0gMTsKLQkJCQl3aGlsZSAoIGxldmVsICkKLQkJCQkgc3dpdGNoICggKi0tcCApCi0JCQkJICAgewotCQkJCSAgIGNhc2UgJ10nOiBjYXNlICcpJzogbGV2ZWwrKzsgYnJlYWs7Ci0JCQkJICAgY2FzZSAnWyc6IGNhc2UgJygnOiBsZXZlbC0tOyBicmVhazsKLQkJCQkgICBjYXNlICcvJzogcCA9IHNraXBzcGFjZShwLCAtMSkgKyAxOyBicmVhazsKLQkJCQkgICBkZWZhdWx0OiA7Ci0JCQkJICAgfQotCQkJICAgfQotCQkJCWlmICggKnAgPT0gJygnICYmICpza2lwc3BhY2UocCArIDEsIDEpID09ICcqJyApCi0JCQkJICAgewkvKiBXZSBmb3VuZCB0aGUgbmFtZSBiZWluZyBkZWNsYXJlZCAqLwotCQkJCQl3aGlsZSAoICFpc2lkZmlyc3RjaGFyKCpwKSApCi0JCQkJCSAgcCA9IHNraXBzcGFjZShwLCAxKSArIDE7Ci0JCQkJCWdvdG8gZm91bmQ7Ci0JCQkJICAgfQotCQkJCWJyZWFrOwotCQkJICAgZGVmYXVsdDoKLQkJCQlnb3RvIGZvdW5kOwotCQkJICAgfQotCQkgICB9Ci1mb3VuZDoJCWlmICggKnAgPT0gJy4nICYmIHBbLTFdID09ICcuJyAmJiBwWy0yXSA9PSAnLicgKQotCQkgIHsJaWYgKCBjb252ZXJ0X3ZhcmFyZ3MgKQotCQkJICB7CSpicCsrID0gInZhX2FsaXN0IjsKLQkJCQl2YXJhcmcgPSBwLTI7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewlwKys7Ci0JCQkJaWYgKCBicCA9PSBicmVha3MgKyAxICkJLyogc29sZSBhcmd1bWVudCAqLwotCQkJCSAgd3JpdGVibGFua3MoYnJlYWtzWzBdLCBwKTsKLQkJCQllbHNlCi0JCQkJICB3cml0ZWJsYW5rcyhicFstMV0gLSAxLCBwKTsKLQkJCQlicC0tOwotCQkJICB9Ci0JCSAgIH0KLQkJZWxzZQotCQkgICB7CXdoaWxlICggaXNpZGNoYXIoKnApICkgcC0tOwotCQkJKmJwKysgPSBwKzE7Ci0JCSAgIH0KLQkJcCA9IGVuZDsKLQkgICB9Ci0Jd2hpbGUgKCAqcCsrID09ICcsJyApOwotCSpicCA9IHA7Ci0JLyogTWFrZSBhIHNwZWNpYWwgY2hlY2sgZm9yICd2b2lkJyBhcmdsaXN0ICovCi0JaWYgKCBicCA9PSBicmVha3MrMiApCi0JICAgewlwID0gc2tpcHNwYWNlKGJyZWFrc1swXSwgMSk7Ci0JCWlmICggIXN0cm5jbXAocCwgInZvaWQiLCA0KSApCi0JCSAgIHsJcCA9IHNraXBzcGFjZShwKzQsIDEpOwotCQkJaWYgKCBwID09IGJyZWFrc1syXSAtIDEgKQotCQkJICAgewlicCA9IGJyZWFrczsJLyogeXVwLCBwcmV0ZW5kIGFyZ2xpc3QgaXMgZW1wdHkgKi8KLQkJCQl3cml0ZWJsYW5rcyhicmVha3NbMF0sIHAgKyAxKTsKLQkJCSAgIH0KLQkJICAgfQotCSAgIH0KLQkvKiBQdXQgb3V0IHRoZSBmdW5jdGlvbiBuYW1lIGFuZCBsZWZ0IHBhcmVudGhlc2lzLiAqLwotCXAgPSBidWY7Ci0Jd2hpbGUgKCBwICE9IGVuZGZuICkgcHV0YygqcCwgb3V0KSwgcCsrOwotCS8qIFB1dCBvdXQgdGhlIGRlY2xhcmF0aW9uLiAqLwotCWlmICggaGVhZGVyICkKLQkgIHsJZnB1dHMoIik7Iiwgb3V0KTsKLQkJZm9yICggcCA9IGJyZWFrc1swXTsgKnA7IHArKyApCi0JCSAgaWYgKCAqcCA9PSAnXHInIHx8ICpwID09ICdcbicgKQotCQkgICAgcHV0YygqcCwgb3V0KTsKLQkgIH0KLQllbHNlCi0JICB7CWZvciAoIGFwID0gYnJlYWtzKzE7IGFwIDwgYnA7IGFwICs9IDIgKQotCQkgIHsJcCA9ICphcDsKLQkJCXdoaWxlICggaXNpZGNoYXIoKnApICkKLQkJCSAgcHV0YygqcCwgb3V0KSwgcCsrOwotCQkJaWYgKCBhcCA8IGJwIC0gMSApCi0JCQkgIGZwdXRzKCIsICIsIG91dCk7Ci0JCSAgfQotCQlmcHV0cygiKSAgIiwgb3V0KTsKLQkJLyogUHV0IG91dCB0aGUgYXJndW1lbnQgZGVjbGFyYXRpb25zICovCi0JCWZvciAoIGFwID0gYnJlYWtzKzI7IGFwIDw9IGJwOyBhcCArPSAyICkKLQkJICAoKmFwKVstMV0gPSAnOyc7Ci0JCWlmICggdmFyYXJnICE9IDAgKQotCQkgIHsJKnZhcmFyZyA9IDA7Ci0JCQlmcHV0cyhicmVha3NbMF0sIG91dCk7CQkvKiBhbnkgcHJpb3IgYXJncyAqLwotCQkJZnB1dHMoInZhX2RjbCIsIG91dCk7CQkvKiB0aGUgZmluYWwgYXJnICovCi0JCQlmcHV0cyhicFswXSwgb3V0KTsKLQkJICB9Ci0JCWVsc2UKLQkJICBmcHV0cyhicmVha3NbMF0sIG91dCk7Ci0JICB9Ci0JZnJlZSgoY2hhciAqKWJyZWFrcyk7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9hcm12Nl9pZGN0LlMgYi9saWJqcGVndHdycC9hcm12Nl9pZGN0LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTRlOGEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvYXJtdjZfaWRjdC5TCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogVGhpcyBpcyBhIGZhc3QtYW5kLWFjY3VyYXRlIGltcGxlbWVudGF0aW9uIG9mIGludmVyc2UgRGlzY3JldGUgQ29zaW5lCi0gKiBUcmFuc2Zvcm0gKElEQ1QpIGZvciBBUk12NisuIEl0IGFsc28gcGVyZm9ybXMgZGVxdWFudGl6YXRpb24gb2YgdGhlIGlucHV0Ci0gKiBjb2VmZmljaWVudHMganVzdCBsaWtlIG90aGVyIG1ldGhvZHMuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgc2NhbGVkIDEtRCBEQ1QgYWxnb3JpdGhtIHByb3Bvc2VkIGJ5Ci0gKiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEuIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBiYXNlZCBvbiB0aGUgZmlndXJlIDQtOAotICogb24gcGFnZSA1MiBvZiB0aGUgSlBFRyB0ZXh0Ym9vayBieSBQZW5uZWJha2VyIGFuZCBNaXRjaGVsbC4gQ29lZmZpY2llbnRzCi0gKiBhcmUgKGFsbW9zdCkgZGlyZWN0bHkgbWFwcGVkIGludG8gcmVnaXN0ZXJzLgotICoKLSAqIFRoZSBhY2N1cmFjeSBpcyBhY2hpZXZlZCBieSB1c2luZyBTTVVMV3kgYW5kIFNNTEFXeSBpbnN0cnVjdGlvbnMuIEJvdGgKLSAqIG11bHRpcGx5IDMyIGJpdHMgYnkgMTYgYml0cyBhbmQgc3RvcmUgdGhlIHRvcCAzMiBiaXRzIG9mIHRoZSByZXN1bHQuIEl0Ci0gKiBtYWtlcyAzMi1iaXQgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYyBwb3NzaWJsZSB3aXRob3V0IG92ZXJmbG93LiBUaGF0IGlzCi0gKiB3aHkganBlZ19pZGN0X2lmYXN0KCksIHdoaWNoIGlzIHdyaXR0ZW4gaW4gQywgY2Fubm90IGJlIGltcHJvdmVkLgotICoKLSAqIE1vcmUgdHJpY2tzIGFyZSB1c2VkIHRvIGdhaW4gbW9yZSBzcGVlZC4gRmlyc3Qgb2YgYWxsLCB3ZSB1c2UgYXMgbWFueQotICogcmVnaXN0ZXJzIGFzIHBvc3NpYmxlLiBBUk0gcHJvY2Vzc29yIGhhcyAxNiByZWdpc3RlcnMgaW5jbHVkaW5nIHNwIChyMTMpCi0gKiBhbmQgcGMgKHIxNSksIHNvIG9ubHkgMTQgcmVnaXN0ZXJzIGNhbiBiZSB1c2VkIHdpdGhvdXQgbGltaXRhdGlvbnMuIEluCi0gKiBnZW5lcmFsLCB3ZSBsZXQgcjAgdG8gcjcgaG9sZCB0aGUgY29lZmZpY2llbnRzOyByMTAgYW5kIHIxMSBob2xkIGZvdXIKLSAqIDE2LWJpdCBjb25zdGFudHM7IHIxMiBhbmQgcjE0IGhvbGQgdHdvIG9mIHRoZSBmb3VyIGFyZ3VtZW50czsgYW5kIHI4IGhvbGQKLSAqIGludGVybWVkaWF0ZSB2YWx1ZS4gSW4gdGhlIHNlY29uZCBwYXNzLCByOSBpcyB0aGUgbG9vcCBjb3VudGVyLiBJbiB0aGUKLSAqIGZpcnN0IHBhc3MsIHI4IHRvIHIxMSBhcmUgdXNlZCB0byBob2xkIHF1YW50aXphdGlvbiB2YWx1ZXMsIHNvIHRoZSBsb29wCi0gKiBjb3VudGVyIGlzIGhlbGQgYnkgc3AuIFllcywgdGhlIHN0YWNrIHBvaW50ZXIuIFNpbmNlIGl0IG11c3QgYmUgYWxpZ25lZAotICogdG8gNC1ieXRlIGJvdW5kYXJ5IGFsbCB0aGUgdGltZSwgd2UgYWxpZ24gaXQgdG8gMzItYnl0ZSBib3VuZGFyeSBhbmQgdXNlCi0gKiBiaXQgMyB0byBiaXQgNS4gQXMgdGhlIHJlc3VsdCwgd2UgYWN0dWFsbHkgdXNlIDE0LjEgcmVnaXN0ZXJzLiA6LSkKLSAqCi0gKiBTZWNvbmQsIHdlIHJlYXJyYW5nZSBxdWFudGl6YXRpb24gdmFsdWVzIHRvIGFjY2VzcyB0aGVtIHNlcXVlbnRpYWxseS4gVGhlCi0gKiB0YWJsZSBpcyBmaXJzdCB0cmFuc3Bvc2VkLCBhbmQgdGhlIG5ldyBjb2x1bW5zIGFyZSBwbGFjZWQgaW4gdGhlIG9yZGVyIG9mCi0gKiA3LCA1LCAxLCAzLCAwLCAyLCA0LCA2LiBUaHVzIHdlIGNhbiB1c2UgTERNREIgdG8gbG9hZCBmb3VyIHZhbHVlcyBhdCBhCi0gKiB0aW1lLiBSZWFycmFuZ2luZyBjb2VmZmljaWVudHMgYWxzbyBoZWxwcywgYnV0IHRoYXQgcmVxdWlyZXMgdG8gY2hhbmdlIGEKLSAqIGRvemVuIG9mIGZpbGVzLCB3aGljaCBzZWVtcyBub3Qgd29ydGggaXQuIEluIGFkZGl0aW9uLCB3ZSBjaG9vc2UgdG8gc2NhbGUKLSAqIHVwIHF1YW50aXphdGlvbiB2YWx1ZXMgYnkgMTMgYml0cywgc28gdGhlIGNvZWZmaWNpZW50cyBhcmUgc2NhbGVkIHVwIGJ5Ci0gKiAxNiBiaXRzIGFmdGVyIGJvdGggcGFzc2VzLiBUaGVuIHdlIGNhbiBwYWNrIGFuZCBzYXR1cmF0ZSB0aGVtIHR3byBhdCBhCi0gKiB0aW1lIHVzaW5nIFBLSFRCIGFuZCBVU0FUMTYgaW5zdHJ1Y3Rpb25zLgotICoKLSAqIFRoaXJkLCB3ZSByZW9yZGVyIHRoZSBpbnN0cnVjdGlvbnMgdG8gYXZvaWQgYnViYmxlcyBpbiB0aGUgcGlwZWxpbmUuIFRoaXMKLSAqIGlzIGRvbmUgYnkgaGFuZCBhY2Nyb2RpbmcgdG8gdGhlIGN5Y2xlIHRpbWluZ3MgYW5kIHRoZSBpbnRlcmxvY2sgYmVoYXZpb3IKLSAqIGRlc2NyaWJlZCBpbiB0aGUgdGVjaG5pY2FsIHJlZmVyZW5jZSBtYW51YWwgb2YgQVJNMTEzNkpGLVMuIFdlIGFsc28gdGFrZQotICogYWR2YW50YWdlIG9mIGR1YWwgaXNzdWUgcHJvY2Vzc29ycyBieSBpbnRlcmxlYXZpbmcgaW5zdHJ1Y3Rpb25zIHdpdGgKLSAqIGRlcGVuZGVuY2llcy4gSXQgaGFzIGJlZW4gYmVuY2htYXJrZWQgb24gZm91ciBkZXZpY2VzIGFuZCBhbGwgdGhlIHJlc3VsdHMKLSAqIHNob3dlZCBkaXN0aW5ndWlzaGFibGUgaW1wcm92ZW1lbnRzLiBOb3RlIHRoYXQgUExEIGluc3RydWN0aW9ucyBhY3R1YWxseQotICogc2xvdyB0aGluZ3MgZG93biwgc28gdGhleSBhcmUgcmVtb3ZlZCBhdCB0aGUgbGFzdCBtaW51dGUuIEluIHRoZSBmdXR1cmUsCi0gKiB0aGlzIG1pZ2h0IGJlIGZ1dGhlciBpbXByb3ZlZCB1c2luZyBhIHN5c3RlbSBwcm9maWxlci4KLSAqLwotCi0jaWZkZWYgX19hcm1fXwotI2luY2x1ZGUgPG1hY2hpbmUvY3B1LWZlYXR1cmVzLmg+Ci0jZW5kaWYKLQotI2lmIF9fQVJNX0FSQ0hfXyA+PSA2Ci0KLS8vIHZvaWQgYXJtdjZfaWRjdChzaG9ydCAqY29lZnMsIGludCAqcXVhbnMsIHVuc2lnbmVkIGNoYXIgKnJvd3MsIGludCBjb2wpCi0gICAgLmFybQotICAgIC50ZXh0Ci0gICAgLmFsaWduCi0gICAgLmdsb2JhbCBhcm12Nl9pZGN0Ci0gICAgLmZ1bmMgICBhcm12Nl9pZGN0Ci0KLWFybXY2X2lkY3Q6Ci0gICAgLy8gUHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBzcCAocjEzKSBhbmQgcGMgKHIxNSkuCi0gICAgc3RtZGIgICBzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMSwgcjEyLCByMTR9Ci0KLSAgICAvLyByMTIgPSBxdWFucywgcjE0ID0gY29lZnMuCi0gICAgc3ViICAgICByNCwgc3AsICMyMzYKLSAgICBiaWMgICAgIHNwLCByNCwgIzMxCi0gICAgYWRkICAgICByNSwgc3AsICMyMjQKLSAgICBhZGQgICAgIHIxMiwgcjEsICMyNTYKLSAgICBzdG0gICAgIHI1LCB7cjIsIHIzLCByNH0KLSAgICBhZGQgICAgIHIxNCwgcjAsICMxNgotCi1wYXNzMV9oZWFkOgotICAgIC8vIExvYWQgcXVhbnRpemF0aW9uIHZhbHVlcy4gKHFbMCwgMiwgNCwgNl0pCi0gICAgbGRtZGIgICByMTIhLCB7cjgsIHI5LCByMTAsIHIxMX0KLQotICAgIC8vIExvYWQgY29lZmZpY2llbnRzLiAoY1s0LCAxLCAyLCAzLCAwLCA1LCA2LCA3XSkKLSAgICBsZHJzaCAgIHI0LCBbcjE0LCAjLTJdICEKLSAgICBsZHJzaCAgIHIxLCBbcjE0LCAjMTZdCi0gICAgbGRyc2ggICByMiwgW3IxNCwgIzMyXQotICAgIGxkcnNoICAgcjMsIFtyMTQsICM0OF0KLSAgICBsZHJzaCAgIHIwLCBbcjE0LCAjNjRdCi0gICAgbGRyc2ggICByNSwgW3IxNCwgIzgwXQotICAgIGxkcnNoICAgcjYsIFtyMTQsICM5Nl0KLSAgICBsZHJzaCAgIHI3LCBbcjE0LCAjMTEyXQotCi0gICAgLy8gcjQgPSBxWzBdICogY1swXTsKLSAgICBtdWwgICAgIHI0LCByOCwgcjQKLQotICAgIC8vIENoZWNrIGlmIEFDcyBhcmUgYWxsIHplcm8uCi0gICAgY21wICAgICByMCwgIzAKLSAgICBvcnJlcXMgIHI4LCByMSwgcjIKLSAgICBvcnJlcXMgIHI4LCByMywgcjUKLSAgICBvcnJlcXMgIHI4LCByNiwgcjcKLSAgICBiZXEgICAgIHBhc3MxX3plcm8KLQotICAgIC8vIFN0ZXAgMTogRGVxdWFudGl6YXRpb25zLgotCi0gICAgLy8gcjIgPSBxWzJdICogY1syXTsKLSAgICAvLyByMCA9IHFbNF0gKiBjWzRdICsgcjQ7Ci0gICAgLy8gcjYgPSBxWzZdICogY1s2XSArIHIyOwotICAgIG11bCAgICAgcjIsIHI5LCByMgotICAgIG1sYSAgICAgcjAsIHIxMCwgcjAsIHI0Ci0gICAgbWxhICAgICByNiwgcjExLCByNiwgcjIKLQotICAgIC8vIExvYWQgcXVhbnRpemF0aW9uIHZhbHVlcy4gKHFbNywgNSwgMSwgM10pCi0gICAgbGRtZGIgICByMTIhLCB7cjgsIHI5LCByMTAsIHIxMX0KLQotICAgIC8vIHI0ID0gcjQgKiAyIC0gcjAgPSAtKHIwIC0gcjQgKiAyKTsKLSAgICAvLyByMiA9IHIyICogMiAtIHI2ID0gLShyNiAtIHIyICogMik7Ci0gICAgcnNiICAgICByNCwgcjAsIHI0LCBsc2wgIzEKLSAgICByc2IgICAgIHIyLCByNiwgcjIsIGxzbCAjMQotCi0gICAgLy8gcjcgPSBxWzddICogY1s3XTsKLSAgICAvLyByNSA9IHFbNV0gKiBjWzVdOwotICAgIC8vIHIxID0gcVsxXSAqIGNbMV0gKyByNzsKLSAgICAvLyByMyA9IHFbM10gKiBjWzNdICsgcjU7Ci0gICAgbXVsICAgICByNywgcjgsIHI3Ci0gICAgbXVsICAgICByNSwgcjksIHI1Ci0gICAgbWxhICAgICByMSwgcjEwLCByMSwgcjcKLSAgICBtbGEgICAgIHIzLCByMTEsIHIzLCByNQotCi0gICAgLy8gTG9hZCBjb25zdGFudHMuCi0gICAgbGRyZCAgICByMTAsIGNvbnN0YW50cwotCi0gICAgLy8gU3RlcCAyOiBSb3RhdGlvbnMgYW5kIEJ1dHRlcmZsaWVzLgotCi0gICAgLy8gcjcgPSByMSAtIHI3ICogMjsKLSAgICAvLyByMSA9IHIxIC0gcjM7Ci0gICAgLy8gcjUgPSByNSAqIDIgLSByMyA9IC0ocjMgLSByNSAqIDIpOwotICAgIC8vIHIzID0gcjEgKyByMyAqIDI7Ci0gICAgLy8gcjggPSByNSArIHI3OwotICAgIHN1YiAgICAgcjcsIHIxLCByNywgbHNsICMxCi0gICAgc3ViICAgICByMSwgcjEsIHIzCi0gICAgcnNiICAgICByNSwgcjMsIHI1LCBsc2wgIzEKLSAgICBhZGQgICAgIHIzLCByMSwgcjMsIGxzbCAjMQotICAgIGFkZCAgICAgcjgsIHI1LCByNwotCi0gICAgLy8gcjIgPSByMiAqIDEuNDE0MjEgPSByMiAqIDI3MTQ2IC8gNjU1MzYgKyByMjsKLSAgICAvLyByOCA9IHI4ICogMS44NDc3NiAvIDggPSByOCAqIDE1MTM3IC8gNjU1MzY7Ci0gICAgLy8gcjEgPSByMSAqIDEuNDE0MjEgPSByMSAqIDI3MTQ2IC8gNjU1MzYgKyByMTsKLSAgICBzbWxhd3QgIHIyLCByMiwgcjEwLCByMgotICAgIHNtdWx3YiAgcjgsIHI4LCByMTAKLSAgICBzbWxhd3QgIHIxLCByMSwgcjEwLCByMQotCi0gICAgLy8gcjAgPSByMCArIHI2OwotICAgIC8vIHIyID0gcjIgLSByNjsKLSAgICAvLyByNiA9IHIwIC0gcjYgKiAyOwotICAgIGFkZCAgICAgcjAsIHIwLCByNgotICAgIHN1YiAgICAgcjIsIHIyLCByNgotICAgIHN1YiAgICAgcjYsIHIwLCByNiwgbHNsICMxCi0KLSAgICAvLyByNSA9IHI1ICogLTIuNjEzMTMgLyA4ICsgcjggPSByNSAqIC0yMTQwNyAvIDY1NTM2ICsgcjg7Ci0gICAgLy8gcjggPSByNyAqIC0xLjA4MjM5IC8gOCArIHI4ID0gcjcgKiAtODg2NyAvIDY1NTM2ICsgcjg7Ci0gICAgc21sYXd0ICByNSwgcjUsIHIxMSwgcjgKLSAgICBzbWxhd2IgIHI4LCByNywgcjExLCByOAotCi0gICAgLy8gcjQgPSByNCArIHIyOwotICAgIC8vIHIwID0gcjAgKyByMzsKLSAgICAvLyByMiA9IHI0IC0gcjIgKiAyOwotICAgIGFkZCAgICAgcjQsIHI0LCByMgotICAgIGFkZCAgICAgcjAsIHIwLCByMwotICAgIHN1YiAgICAgcjIsIHI0LCByMiwgbHNsICMxCi0KLSAgICAvLyByNyA9IHI1ICogOCAtIHIzID0gLShyMyAtIHI1ICogOCk7Ci0gICAgLy8gcjMgPSByMCAtIHIzICogMjsKLSAgICAvLyByMSA9IHIxIC0gcjc7Ci0gICAgLy8gcjQgPSByNCArIHI3OwotICAgIC8vIHI1ID0gcjggKiA4IC0gcjEgPSAtKHIxIC0gcjggKiA4KTsKLSAgICAvLyByNyA9IHI0IC0gcjcgKiAyOwotICAgIHJzYiAgICAgcjcsIHIzLCByNSwgbHNsICMzCi0gICAgc3ViICAgICByMywgcjAsIHIzLCBsc2wgIzEKLSAgICBzdWIgICAgIHIxLCByMSwgcjcKLSAgICBhZGQgICAgIHI0LCByNCwgcjcKLSAgICByc2IgICAgIHI1LCByMSwgcjgsIGxzbCAjMwotICAgIHN1YiAgICAgcjcsIHI0LCByNywgbHNsICMxCi0KLSAgICAvLyByMiA9IHIyICsgcjE7Ci0gICAgLy8gcjYgPSByNiArIHI1OwotICAgIC8vIHIxID0gcjIgLSByMSAqIDI7Ci0gICAgLy8gcjUgPSByNiAtIHI1ICogMjsKLSAgICBhZGQgICAgIHIyLCByMiwgcjEKLSAgICBhZGQgICAgIHI2LCByNiwgcjUKLSAgICBzdWIgICAgIHIxLCByMiwgcjEsIGxzbCAjMQotICAgIHN1YiAgICAgcjUsIHI2LCByNSwgbHNsICMxCi0KLSAgICAvLyBTdGVwIDM6IFJlb3JkZXIgYW5kIFNhdmUuCi0KLSAgICBzdHIgICAgIHIwLCBbc3AsICMtNF0gIQotICAgIHN0ciAgICAgcjQsIFtzcCwgIzMyXQotICAgIHN0ciAgICAgcjIsIFtzcCwgIzY0XQotICAgIHN0ciAgICAgcjYsIFtzcCwgIzk2XQotICAgIHN0ciAgICAgcjUsIFtzcCwgIzEyOF0KLSAgICBzdHIgICAgIHIxLCBbc3AsICMxNjBdCi0gICAgc3RyICAgICByNywgW3NwLCAjMTkyXQotICAgIHN0ciAgICAgcjMsIFtzcCwgIzIyNF0KLSAgICBiICAgICAgIHBhc3MxX3RhaWwKLQotICAgIC8vIFByZWNvbXB1dGVkIDE2LWJpdCBjb25zdGFudHM6IDI3MTQ2LCAxNTEzNywgLTIxNDA3LCAtODg2Ny4KLSAgICAvLyBQdXQgdGhlbSBpbiB0aGUgbWlkZGxlIHNpbmNlIExEUkQgb25seSBhY2NlcHRzIG9mZnNldHMgZnJvbSAtMjU1IHRvIDI1NS4KLSAgICAuYWxpZ24gIDMKLWNvbnN0YW50czoKLSAgICAud29yZCAgIDB4NmEwYTNiMjEKLSAgICAud29yZCAgIDB4YWM2MWRkNWQKLQotcGFzczFfemVybzoKLSAgICBzdHIgICAgIHI0LCBbc3AsICMtNF0gIQotICAgIHN0ciAgICAgcjQsIFtzcCwgIzMyXQotICAgIHN0ciAgICAgcjQsIFtzcCwgIzY0XQotICAgIHN0ciAgICAgcjQsIFtzcCwgIzk2XQotICAgIHN0ciAgICAgcjQsIFtzcCwgIzEyOF0KLSAgICBzdHIgICAgIHI0LCBbc3AsICMxNjBdCi0gICAgc3RyICAgICByNCwgW3NwLCAjMTkyXQotICAgIHN0ciAgICAgcjQsIFtzcCwgIzIyNF0KLSAgICBzdWIgICAgIHIxMiwgcjEyLCAjMTYKLQotcGFzczFfdGFpbDoKLSAgICBhbmRzICAgIHI5LCBzcCwgIzMxCi0gICAgYm5lICAgICBwYXNzMV9oZWFkCi0KLSAgICAvLyByMTIgPSByb3dzLCByMTQgPSBjb2wuCi0gICAgbGRyICAgICByMTIsIFtzcCwgIzI1Nl0KLSAgICBsZHIgICAgIHIxNCwgW3NwLCAjMjYwXQotCi0gICAgLy8gTG9hZCBjb25zdGFudHMuCi0gICAgbGRyZCAgICByMTAsIGNvbnN0YW50cwotCi1wYXNzMl9oZWFkOgotICAgIC8vIExvYWQgY29lZmZpY2llbnRzLiAoY1swLCAxLCAyLCAzLCA0LCA1LCA2LCA3XSkKLSAgICBsZG1pYSAgIHNwISwge3IwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByN30KLQotICAgIC8vIHIwID0gcjAgKyAweDAwODA4MDAwOwotICAgIGFkZCAgICAgcjAsIHIwLCAjMHgwMDgwMDAwMAotICAgIGFkZCAgICAgcjAsIHIwLCAjMHgwMDAwODAwMAotCi0gICAgLy8gU3RlcCAxOiBBbmFsb2cgdG8gdGhlIGZpcnN0IHBhc3MuCi0KLSAgICAvLyByMCA9IHIwICsgcjQ7Ci0gICAgLy8gcjYgPSByNiArIHIyOwotICAgIGFkZCAgICAgcjAsIHIwLCByNAotICAgIGFkZCAgICAgcjYsIHI2LCByMgotCi0gICAgLy8gcjQgPSByMCAtIHI0ICogMjsKLSAgICAvLyByMiA9IHIyICogMiAtIHI2ID0gLShyNiAtIHIyICogMik7Ci0gICAgc3ViICAgICByNCwgcjAsIHI0LCBsc2wgIzEKLSAgICByc2IgICAgIHIyLCByNiwgcjIsIGxzbCAjMQotCi0gICAgLy8gcjEgPSByMSArIHI3OwotICAgIC8vIHIzID0gcjMgKyByNTsKLSAgICBhZGQgICAgIHIxLCByMSwgcjcKLSAgICBhZGQgICAgIHIzLCByMywgcjUKLQotICAgIC8vIFN0ZXAgMjogUm90YXRpb25zIGFuZCBCdXR0ZXJmbGllcy4KLQotICAgIC8vIHI3ID0gcjEgLSByNyAqIDI7Ci0gICAgLy8gcjEgPSByMSAtIHIzOwotICAgIC8vIHI1ID0gcjUgKiAyIC0gcjMgPSAtKHIzIC0gcjUgKiAyKTsKLSAgICAvLyByMyA9IHIxICsgcjMgKiAyOwotICAgIC8vIHI4ID0gcjUgKyByNzsKLSAgICBzdWIgICAgIHI3LCByMSwgcjcsIGxzbCAjMQotICAgIHN1YiAgICAgcjEsIHIxLCByMwotICAgIHJzYiAgICAgcjUsIHIzLCByNSwgbHNsICMxCi0gICAgYWRkICAgICByMywgcjEsIHIzLCBsc2wgIzEKLSAgICBhZGQgICAgIHI4LCByNSwgcjcKLQotICAgIC8vIHIyID0gcjIgKiAxLjQxNDIxID0gcjIgKiAyNzE0NiAvIDY1NTM2ICsgcjI7Ci0gICAgLy8gcjggPSByOCAqIDEuODQ3NzYgLyA4ID0gcjggKiAxNTEzNyAvIDY1NTM2OwotICAgIC8vIHIxID0gcjEgKiAxLjQxNDIxID0gcjEgKiAyNzE0NiAvIDY1NTM2ICsgcjE7Ci0gICAgc21sYXd0ICByMiwgcjIsIHIxMCwgcjIKLSAgICBzbXVsd2IgIHI4LCByOCwgcjEwCi0gICAgc21sYXd0ICByMSwgcjEsIHIxMCwgcjEKLQotICAgIC8vIHIwID0gcjAgKyByNjsKLSAgICAvLyByMiA9IHIyIC0gcjY7Ci0gICAgLy8gcjYgPSByMCAtIHI2ICogMjsKLSAgICBhZGQgICAgIHIwLCByMCwgcjYKLSAgICBzdWIgICAgIHIyLCByMiwgcjYKLSAgICBzdWIgICAgIHI2LCByMCwgcjYsIGxzbCAjMQotCi0gICAgLy8gcjUgPSByNSAqIC0yLjYxMzEzIC8gOCArIHI4ID0gcjUgKiAtMjE0MDcgLyA2NTUzNiArIHI4OwotICAgIC8vIHI4ID0gcjcgKiAtMS4wODIzOSAvIDggKyByOCA9IHI3ICogLTg4NjcgLyA2NTUzNiArIHI4OwotICAgIHNtbGF3dCAgcjUsIHI1LCByMTEsIHI4Ci0gICAgc21sYXdiICByOCwgcjcsIHIxMSwgcjgKLQotICAgIC8vIHI0ID0gcjQgKyByMjsKLSAgICAvLyByMCA9IHIwICsgcjM7Ci0gICAgLy8gcjIgPSByNCAtIHIyICogMjsKLSAgICBhZGQgICAgIHI0LCByNCwgcjIKLSAgICBhZGQgICAgIHIwLCByMCwgcjMKLSAgICBzdWIgICAgIHIyLCByNCwgcjIsIGxzbCAjMQotCi0gICAgLy8gcjcgPSByNSAqIDggLSByMyA9IC0ocjMgLSByNSAqIDgpOwotICAgIC8vIHIzID0gcjAgLSByMyAqIDI7Ci0gICAgLy8gcjEgPSByMSAtIHI3OwotICAgIC8vIHI0ID0gcjQgKyByNzsKLSAgICAvLyByNSA9IHI4ICogOCAtIHIxID0gLShyMSAtIHI4ICogOCk7Ci0gICAgLy8gcjcgPSByNCAtIHI3ICogMjsKLSAgICByc2IgICAgIHI3LCByMywgcjUsIGxzbCAjMwotICAgIHN1YiAgICAgcjMsIHIwLCByMywgbHNsICMxCi0gICAgc3ViICAgICByMSwgcjEsIHI3Ci0gICAgYWRkICAgICByNCwgcjQsIHI3Ci0gICAgcnNiICAgICByNSwgcjEsIHI4LCBsc2wgIzMKLSAgICBzdWIgICAgIHI3LCByNCwgcjcsIGxzbCAjMQotCi0gICAgLy8gcjIgPSByMiArIHIxOwotICAgIC8vIHI2ID0gcjYgKyByNTsKLSAgICAvLyByMSA9IHIyIC0gcjEgKiAyOwotICAgIC8vIHI1ID0gcjYgLSByNSAqIDI7Ci0gICAgYWRkICAgICByMiwgcjIsIHIxCi0gICAgYWRkICAgICByNiwgcjYsIHI1Ci0gICAgc3ViICAgICByMSwgcjIsIHIxLCBsc2wgIzEKLSAgICBzdWIgICAgIHI1LCByNiwgcjUsIGxzbCAjMQotCi0gICAgLy8gU3RlcCAzOiBSZW9yZGVyIGFuZCBTYXZlLgotCi0gICAgLy8gTG9hZCBvdXRwdXQgcG9pbnRlci4KLSAgICBsZHIgICAgIHI4LCBbcjEyXSwgIzQKLQotICAgIC8vIEZvciBsaXR0bGUgZW5kaWFuOiByNiwgcjIsIHI0LCByMCwgcjMsIHI3LCByMSwgcjUuCi0gICAgcGtodGIgICByNiwgcjYsIHI0LCBhc3IgIzE2Ci0gICAgcGtodGIgICByMiwgcjIsIHIwLCBhc3IgIzE2Ci0gICAgcGtodGIgICByMywgcjMsIHIxLCBhc3IgIzE2Ci0gICAgcGtodGIgICByNywgcjcsIHI1LCBhc3IgIzE2Ci0gICAgdXNhdDE2ICByNiwgIzgsIHI2Ci0gICAgdXNhdDE2ICByMiwgIzgsIHIyCi0gICAgdXNhdDE2ICByMywgIzgsIHIzCi0gICAgdXNhdDE2ICByNywgIzgsIHI3Ci0gICAgb3JyICAgICByMCwgcjIsIHI2LCBsc2wgIzgKLSAgICBvcnIgICAgIHIxLCByNywgcjMsIGxzbCAjOAotCi0jaWZkZWYgX19BUk1FQl9fCi0gICAgLy8gUmV2ZXJzZSBieXRlcyBmb3IgYmlnIGVuZGlhbi4KLSAgICByZXYgICAgIHIwLCByMAotICAgIHJldiAgICAgcjEsIHIxCi0jZW5kaWYKLQotICAgIC8vIFVzZSBTVFIgaW5zdGVhZCBvZiBTVFJEIHRvIHN1cHBvcnQgdW5hbGlnbmVkIGFjY2Vzcy4KLSAgICBzdHIgICAgIHIwLCBbcjgsIHIxNF0gIQotICAgIHN0ciAgICAgcjEsIFtyOCwgIzRdCi0KLXBhc3MyX3RhaWw6Ci0gICAgYWRkcyAgICByOSwgcjksICMweDEwMDAwMDAwCi0gICAgYnBsICAgICBwYXNzMl9oZWFkCi0KLSAgICBsZHIgICAgIHNwLCBbc3AsICM4XQotICAgIGFkZCAgICAgc3AsIHNwLCAjMjM2Ci0KLSAgICBsZG1pYSAgIHNwISwge3I0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExLCByMTIsIHIxNH0KLSAgICBieCAgICAgIGxyCi0gICAgLmVuZGZ1bmMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9hc20vYXJtdjcvamRjb2xvci1hbmRyb2lkLWFybXY3LlMgYi9saWJqcGVndHdycC9hc20vYXJtdjcvamRjb2xvci1hbmRyb2lkLWFybXY3LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YmQ0YmYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvYXNtL2FybXY3L2pkY29sb3ItYW5kcm9pZC1hcm12Ny5TCisrKyAvZGV2L251bGwKQEAgLTEsMTIyMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBqZGNvbG9yLWFuZHJvaWQtYXJtdjcuUwotKgotKiAgQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotKiAgbWV0OgotKiAgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSogICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0qICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSogICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSogICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZSBBdXJvcmEgRm9ydW0sIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSogICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotKiAgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotKgotKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0qICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotKiAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotKiAgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotKiAgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0qICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotKiAgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotKiAgSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qICAgICAgICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OIExJU1QKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiAtIHl2dXAycmdiNTY1X3ZlbnVtCi0qIC0geXl2dXAycmdiNTY1X3ZlbnVtCi0qIC0geXZ1cDJhYmdyODg4OF92ZW51bQotKiAtIHl5dnVwMmFiZ3I4ODg4X3ZlbnVtCi0qCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSAgICAuc2VjdGlvbiB5dnVfcGxhaW5fdG9fcmdiX2FuZHJvaWQsICJ4IiAgQCBBUkVBCi0gICAgLnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHwudGV4dHwsIENPREUsIFJFQURPTkxZCi0gICAgLmFsaWduIDIKLSAgICAuY29kZSAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ09ERTMyCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgQVJNIFJlZ2lzdGVycwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotcF95ICAgICAgIC5yZXEgcjAKLXBfY3IgICAgICAucmVxIHIxCi1wX2NiICAgICAgLnJlcSByMgotcF9yZ2IgICAgIC5yZXEgcjMKLXBfYmdyICAgICAucmVxIHIzCi1sZW5ndGggICAgLnJlcSByMTIKLQotICAgIC5nbG9iYWwgeXZ1cDJyZ2I1NjVfdmVudW0KLSAgICAuZ2xvYmFsIHl5dnVwMnJnYjU2NV92ZW51bQotICAgIC5nbG9iYWwgeXZ1cDJhYmdyODg4OF92ZW51bQotICAgIC5nbG9iYWwgeXl2dXAyYWJncjg4ODhfdmVudW0KLQotQCBjb2VmZmljaWVudHMgaW4gY29sb3IgY29udmVyc2lvbiBtYXRyaXggbXVsdGlwbGljYXRpb24KLS5lcXUgQ09FRkZfWSwgICAgICAgICAgMjU2ICAgICAgICAgICAgIEAgY29udHJpYnV0aW9uIG9mIFkKLS5lcXUgQ09FRkZfVl9SRUQsICAgICAgMzU5ICAgICAgICAgICAgIEAgY29udHJpYnV0aW9uIG9mIFYgZm9yIHJlZAotLmVxdSBDT0VGRl9VX0dSRUVOLCAgICAtODggICAgICAgICAgICAgQCBjb250cmlidXRpb24gb2YgVSBmb3IgZ3JlZW4KLS5lcXUgQ09FRkZfVl9HUkVFTiwgICAtMTgzICAgICAgICAgICAgIEAgY29udHJpYnV0aW9uIG9mIFYgZm9yIGdyZWVuCi0uZXF1IENPRUZGX1VfQkxVRSwgICAgIDQ1NCAgICAgICAgICAgICBAIGNvbnRyaWJ1dGlvbiBvZiBVIGZvciBibHVlCi0KLUAgQ2xhbXBpbmcgY29uc3RhbnRzIDB4MCBhbmQgMHhGRgotLmVxdSBDT0VGRl8wLCAgICAgICAgICAwCi0uZXF1IENPRUZGXzI1NSwgICAgICAgIDI1NQotCi1AIEJpYXMgY29lZmZpY2llbnRzIGZvciByZWQsIGdyZWVuIGFuZCBibHVlCi0uZXF1IENPRUZGX0JJQVNfUiwgICAtNDU4MjQgICAgICAgICAgICBAIFJlZCAgIGJpYXMgPSAgICAgLTM1OSoxMjggKyAxMjgKLS5lcXUgQ09FRkZfQklBU19HLCAgICAzNDgxNiAgICAgICAgICAgIEAgR3JlZW4gYmlhcyA9ICg4OCsxODMpKjEyOCArIDEyOAotLmVxdSBDT0VGRl9CSUFTX0IsICAgLTU3OTg0ICAgICAgICAgICAgQCBCbHVlICBiaWFzID0gICAgIC00NTQqMTI4ICsgMTI4Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBGVU5DVElPTiAgICAgOiB5dnVwMnJnYjU2NV92ZW51bQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIERFU0NSSVBUSU9OICA6IFBlcmZvcm0gWVZVIHBsYW5hciB0byBSR0I1NjUgY29udmVyc2lvbi4KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBDIFBST1RPVFlQRSAgOiB2b2lkIHl2dXAycmdiNTY1X3ZlbnVtKHVpbnQ4X3QgICpwX3ksCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfY3IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfY2IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfcmdiNTY1LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICBsZW5ndGgpCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIElOUFVUICAgIDogUjA6IHVpbnQ4X3QgICpwX3kKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgWSBMaW5lCi0qICAgICAgICAgICAgICAgIFIxOiB1aW50OF90ICAqcF9jcgotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBDciBMaW5lCi0qICAgICAgICAgICAgICAgIFIyOiB1aW50OF90ICAqcF9jYgotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBDYiBMaW5lCi0qICAgICAgICAgICAgICAgIFIzOiB1aW50OF90ICAqcF9yZ2I1NjUKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IFJHQiBMaW5lCi0qICAgICAgICAgICAgICAgIFIxMjogdWludDMyX3QgIGxlbmd0aAotKiAgICAgICAgICAgICAgICAgICAgICB3aWR0aCBvZiBMaW5lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogU1RBQ0sgQVJHICAgIDogTm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBPVVRQVVQgICA6IE5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBNRU0gSU5QVVQgICAgOiBwX3kgICAgICAtIGEgbGluZSBvZiBZIHBpeGVscwotKiAgICAgICAgICAgICAgICBwX2NyICAgICAtIGEgbGluZSBvZiBDciBwaXhlbHMKLSogICAgICAgICAgICAgICAgcF9jYiAgICAgLSBhIGxpbmUgb2YgQ2IgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIGxlbmd0aCAgIC0gdGhlIHdpZHRoIG9mIHRoZSBpbnB1dCBsaW5lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTUVNIE9VVFBVVCAgIDogcF9yZ2I1NjUgLSB0aGUgY29udmVydGVkIHJnYiBwaXhlbHMKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgQUZGRUNURUQgOiBBUk06ICBSMC1SNCwgUjEyCi0qICAgICAgICAgICAgICAgIE5FT046IFEwLVExNQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFNUQUNLIFVTQUdFICA6IG5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBDWUNMRVMgICAgICAgOiBub25lCi0qCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTk9URVMgICAgICAgIDoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLS50eXBlIHl2dXAycmdiNTY1X3ZlbnVtLCAlZnVuY3Rpb24KLXl2dXAycmdiNTY1X3ZlbnVtOgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBTdG9yZSBzdGFjayByZWdpc3RlcnMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBTVE1GRCBTUCEsIHtMUn0KLQotICAgIFZQVVNIIHtEOC1EMTV9Ci0KLSAgICBQTEQgW1IwLCBSM10gICAgICAgICAgICAgICAgICAgICAgIEAgcHJlbG9hZCBsdW1hIGxpbmUKLQotICAgIEFEUiAgIFIxMiwgY29uc3RhbnRzCi0KLSAgICBWTEQxLlMxNiAge0Q2LCBEN30sIFtSMTJdISAgICAgICAgIEAgRDYsIEQ3OiAzNTkgfCAgLTg4IHwgLTE4MyB8IDQ1NCB8IDI1NiB8IDAgfCAyNTUgfCAwCi0gICAgVkxEMS5TMzIgIHtEMzAsIEQzMX0sIFtSMTJdICAgICAgICBAIFExNSAgIDogIC00NTgyNCAgICB8ICAgIDM0ODE2ICAgfCAgLTU3OTg0IHwgICAgIFgKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIHRoZSA1dGggcGFyYW1ldGVyIHZpYSBzdGFjawotICAgICAqICBSMCB+IFIzIGFyZSB1c2VkIHRvIHBhc3MgdGhlIGZpcnN0IDQgcGFyYW1ldGVycywgdGhlIDV0aCBhbmQgYWJvdmUKLSAgICAgKiAgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHZpYSBzdGFjawotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIExEUiBSMTIsIFtTUCwgIzY4XSAgICAgICAgICAgICAgICAgQCBMUiBpcyBwdXNoZWQgaW50byB0aGUgc3RhY2sgc28gU1AgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZGVjcmVhc2VkIGJ5IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEQ4LUQxNSBhcmUgYWxzbyBwdXNoZWQgaW50byB0aGUgc3RhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc28gU1AgaXMgZGVjcmVhc2VkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDgtYnl0ZS9ELVJlZ2lzdGVyICogOCBELVJlZ2lzdGVycyA9IDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzbyBTUCBuZWVkcyB0byBiZSBpbmNyZWFzZWQgYnkgNjQrND02OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0byBnZXQgdGhlIHZhbHVlIHRoYXQgd2FzIGZpcnN0IHB1c2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbnRvIHN0YWNrICh0aGUgNXRoIHBhcmFtZXRlciBwYXNzZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdGhyb3VnaHQgc3RhY2spCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCBjbGFtcGluZyBwYXJhbWV0ZXJzIHRvIGR1cGxpY2F0ZSB2ZWN0b3IgZWxlbWVudHMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWRFVQLlMxNiAgUTQsICBEN1sxXSAgICAgICAgICAgICAgIEAgUTQ6ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwCi0gICAgVkRVUC5TMTYgIFE1LCAgRDdbMl0gICAgICAgICAgICAgICBAIFE1OiAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBSZWFkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWRFVQLlMzMiAgUTAsICAgRDMwWzBdICAgICAgICAgICAgIEAgUTA6ICAtNDU4MjQgfCAtNDU4MjQgfCAtNDU4MjQgfCAtNDU4MjQKLSAgICBWRFVQLlMzMiAgUTEsICAgRDMwWzFdICAgICAgICAgICAgIEAgUTE6ICAgMzQ4MTYgfCAgMzQ4MTYgfCAgMzQ4MTYgfCAgMzQ4MTYKLSAgICBWRFVQLlMzMiAgUTIsICAgRDMxWzBdICAgICAgICAgICAgIEAgUTI6ICAtNzA2ODggfCAtNzA2ODggfCAtNzA2ODggfCAtNzA2ODgKLQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFRoZSBtYWluIGxvb3AKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWxvb3BfeXZ1cDJyZ2I1NjU6Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCBpbnB1dCBmcm9tIFksIFYgYW5kIFUKLSAgICAgKiAgRDEyICA6IFkwICBZMSAgWTIgIFkzICBZNCAgWTUgIFk2ICBZNwotICAgICAqICBEMTQgIDogVjAgIFYxICBWMiAgVjMgIFY0ICBWNSAgVjYgIFY3Ci0gICAgICogIEQxNSAgOiBVMCAgVTEgIFUyICBVMyAgVTQgIFU1ICBVNiAgVTcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTEQxLlU4ICB7RDEyfSwgIFtwX3ldISAgICAgICAgICAgIEAgTG9hZCA4IFkgIGVsZW1lbnRzICh1aW50OCkgdG8gRDEyCi0gICAgVkxEMS5VOCAge0QxNH0sICBbcF9jcl0hICAgICAgICAgICBAIExvYWQgOCBDciBlbGVtZW50cyAodWludDgpIHRvIEQxNAotICAgIFZMRDEuVTggIHtEMTV9LCAgW3BfY2JdISAgICAgICAgICAgQCBMb2FkIDggQ2IgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBFeHBhbmQgdWludDggdmFsdWUgdG8gdWludDE2Ci0gICAgICogIEQxOCwgRDE5OiBZMCBZMSBZMiBZMyBZNCBZNSBZNiBZNwotICAgICAqICBEMjAsIEQyMTogVjAgVjEgVjIgVjMgVjQgVjUgVjYgVjcKLSAgICAgKiAgRDIyLCBEMjM6IFUwIFUxIFUyIFUzIFU0IFU1IFU2IFU3Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1PVkwuVTggUTksICBEMTIKLSAgICBWTU9WTC5VOCBRMTAsIEQxNAotICAgIFZNT1ZMLlU4IFExMSwgRDE1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTXVsdGlwbHkgY29udHJpYnV0aW9uIGZyb20gY2hyb21pbmFuY2UsIHJlc3VsdHMgYXJlIGluIDMyLWJpdAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNVUxMLlMxNiAgUTEyLCBEMjAsIEQ2WzBdICAgICAgICAgQCBRMTI6ICAzNTkqKFYwLFYxLFYyLFYzKSAgICAgUmVkCi0gICAgVk1VTEwuUzE2ICBRMTMsIEQyMiwgRDZbMV0gICAgICAgICBAIFExMzogIC04OCooVTAsVTEsVTIsVTMpICAgICBHcmVlbgotICAgIFZNTEFMLlMxNiAgUTEzLCBEMjAsIEQ2WzJdICAgICAgICAgQCBRMTM6ICAtODgqKFUwLFUxLFUyLFUzKSAtIDE4MyooVjAsVjEsVjIsVjMpCi0gICAgVk1VTEwuUzE2ICBRMTQsIEQyMiwgRDZbM10gICAgICAgICBAIFExNDogIDQ1NCooVTAsVTEsVTIsVTMpICAgICBCbHVlCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQWRkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWQURELlMzMiAgUTEyLCBRMCAgICAgICAgICAgICAgICAgIEAgUTEyIGFkZCBSZWQgICBiaWFzIC00NTgyNAotICAgIFZBREQuUzMyICBRMTMsIFExICAgICAgICAgICAgICAgICAgQCBRMTMgYWRkIEdyZWVuIGJpYXMgIDM0ODE2Ci0gICAgVkFERC5TMzIgIFExNCwgUTIgICAgICAgICAgICAgICAgICBAIFExNCBhZGQgQmx1ZSAgYmlhcyAtNTc5ODQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDYWxjdWxhdGUgUmVkLCBHcmVlbiwgQmx1ZQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNTEFMLlMxNiAgUTEyLCBEMTgsIEQ3WzBdICAgICAgICAgQCBRMTI6IFIwLCBSMSwgUjIsIFIzIGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExMywgRDE4LCBEN1swXSAgICAgICAgIEAgUTEzOiBHMCwgRzEsIEcyLCBHMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTQsIEQxOCwgRDdbMF0gICAgICAgICBAIFExNDogQjAsIEIxLCBCMiwgQjMgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFJpZ2h0IHNoaWZ0IGVpZ2h0IGJpdHMgd2l0aCByb3VuZGluZwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZTSFJOLlMzMiAgIEQxOCAsIFExMiwgIzggICAgICAgICAgQCBEMTg6IFIwLCBSMSwgUjIsIFIzIGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMjAgLCBRMTMsICM4ICAgICAgICAgIEAgRDIwOiBHMCwgRzEsIEcyLCBHMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIyLCAgUTE0LCAjOCAgICAgICAgICBAIEQyMjogQjAsIEIxLCBCMiwgQjMgaW4gMTYtYml0IFEwIGZvcm1hdAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIERvbmUgd2l0aCB0aGUgZmlyc3QgNCBlbGVtZW50cywgY29udGludWUgb24gdGhlIG5leHQgNCBlbGVtZW50cwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIE11bHRpcGx5IGNvbnRyaWJ1dGlvbiBmcm9tIGNocm9taW5hbmNlLCByZXN1bHRzIGFyZSBpbiAzMi1iaXQKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTVVMTC5TMTYgIFExMiwgRDIxLCBENlswXSAgICAgICAgIEAgUTEyOiAgMzU5KihWMCxWMSxWMixWMykgICAgIFJlZAotICAgIFZNVUxMLlMxNiAgUTEzLCBEMjMsIEQ2WzFdICAgICAgICAgQCBRMTM6ICAtODgqKFUwLFUxLFUyLFUzKSAgICAgR3JlZW4KLSAgICBWTUxBTC5TMTYgIFExMywgRDIxLCBENlsyXSAgICAgICAgIEAgUTEzOiAgLTg4KihVMCxVMSxVMixVMykgLSAxODMqKFYwLFYxLFYyLFYzKQotICAgIFZNVUxMLlMxNiAgUTE0LCBEMjMsIEQ2WzNdICAgICAgICAgQCBRMTQ6ICA0NTQqKFUwLFUxLFUyLFUzKSAgICAgQmx1ZQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEFkZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkFERC5TMzIgIFExMiwgUTAgICAgICAgICAgICAgICAgICBAIFExMiBhZGQgUmVkICAgYmlhcyAtNDU4MjQKLSAgICBWQURELlMzMiAgUTEzLCBRMSAgICAgICAgICAgICAgICAgIEAgUTEzIGFkZCBHcmVlbiBiaWFzICAzNDgxNgotICAgIFZBREQuUzMyICBRMTQsIFEyICAgICAgICAgICAgICAgICAgQCBRMTQgYWRkIEJsdWUgIGJpYXMgLTU3OTg0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2FsY3VsYXRlIFJlZCwgR3JlZW4sIEJsdWUKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTUxBTC5TMTYgIFExMiwgRDE5LCBEN1swXSAgICAgICAgIEAgUTEyOiBSMCwgUjEsIFIyLCBSMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTMsIEQxOSwgRDdbMF0gICAgICAgICBAIFExMzogRzAsIEcxLCBHMiwgRzMgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTE0LCBEMTksIEQ3WzBdICAgICAgICAgQCBRMTQ6IEIwLCBCMSwgQjIsIEIzIGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBSaWdodCBzaGlmdCBlaWdodCBiaXRzIHdpdGggcm91bmRpbmcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWU0hSTi5TMzIgICBEMTkgLCBRMTIsICM4ICAgICAgICAgIEAgRDE4OiBSMCwgUjEsIFIyLCBSMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIxICwgUTEzLCAjOCAgICAgICAgICBAIEQyMDogRzAsIEcxLCBHMiwgRzMgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMywgIFExNCwgIzggICAgICAgICAgQCBEMjI6IEIwLCBCMSwgQjIsIEIzIGluIDE2LWJpdCBRMCBmb3JtYXQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDbGFtcCB0aGUgdmFsdWUgdG8gYmUgd2l0aGluIFswfjI1NV0KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTUFYLlMxNiAgUTksIFE5LCBRNCAgICAgICAgICAgICAgIEAgaWYgUTkgPCAgIDAsIFE5ID0gICAwCi0gICAgVk1JTi5TMTYgIFE5LCBROSwgUTUgICAgICAgICAgICAgICBAIGlmIFE5ID4gMjU1LCBROSA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICBEMjgsIFE5ICAgICAgICAgICAgICAgQCBzdG9yZSBSZWQgdG8gRDI4LCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgVk1BWC5TMTYgIFExMCwgUTEwLCBRNCAgICAgICAgICAgICBAIGlmIFExMCA8ICAgMCwgUTEwID0gICAwCi0gICAgVk1JTi5TMTYgIFExMCwgUTEwLCBRNSAgICAgICAgICAgICBAIGlmIFExMCA+IDI1NSwgUTEwID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgICBEMjcsIFExMCAgICAgICAgICAgICBAIHN0b3JlIEdyZWVuIHRvIEQyNywgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICBRMTEsIFExMSwgUTQgICAgICAgICAgICAgQCBpZiBRMTEgPCAgIDAsIFExMSA9ICAgMAotICAgIFZNSU4uUzE2ICBRMTEsIFExMSwgUTUgICAgICAgICAgICAgQCBpZiBRMTEgPiAyNTUsIFExMSA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICAgRDI2LCBRMTEgICAgICAgICAgICAgQCBzdG9yZSBCbHVlIHRvIEQyNiwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDguCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgRDI3OiAgMyBiaXRzIG9mIEdyZWVuICsgNSBiaXRzIG9mIEJsdWUKLSAgICAgKiAgRDI4OiAgNSBiaXRzIG9mIFJlZCAgICsgMyBiaXRzIG9mIEdyZWVuCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNSSS44ICAgRDI4LCBEMjcsICM1ICAgICAgICAgICAgICBAIHJpZ2h0IHNoaWZ0IEcgYnkgNSBhbmQgaW5zZXJ0IHRvIFIKLSAgICBWU0hMLlU4ICBEMjcsIEQyNywgIzMgICAgICAgICAgICAgIEAgbGVmdCAgc2hpZnQgRyBieSAzCi0gICAgVlNSSS44ICAgRDI3LCBEMjYsICMzICAgICAgICAgICAgICBAIHJpZ2h0IHNoaWZ0IEIgYnkgMyBhbmQgaW5zZXJ0IHRvIEcKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICM4ICAgICAgICAgICAgQCBjaGVjayBpZiB0aGUgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBCTUkgIHRyYWlsaW5nX3l2dXAycmdiNTY1ICAgICAgICAgIEAganVtcCB0byB0cmFpbGluZyBwcm9jZXNzaW5nIGlmIHJlbWFpbmluZyBsZW5ndGggaXMgbGVzcyB0aGFuIDgKLQotICAgIFZTVDIuVTggIHtEMjcsIEQyOH0sIFtwX3JnYl0hICAgICAgQCB2ZWN0b3Igc3RvcmUgUmVkLCBHcmVlbiwgQmx1ZSB0byBkZXN0aW5hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBCbHVlIGF0IExTQgotCi0gICAgQkhJIGxvb3BfeXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGxvb3AgaWYgbW9yZSB0aGFuIDggcGl4ZWxzIGxlZnQKLQotICAgIEJFUSAgZW5kX3l2dXAycmdiNTY1ICAgICAgICAgICAgICAgQCBkb25lIGlmIGV4YWN0bHkgOCBwaXhlbCBwcm9jZXNzZWQgaW4gdGhlIGxvb3AKLQotCi10cmFpbGluZ195dnVwMnJnYjU2NToKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgVGhlcmUgYXJlIGZyb20gMSB+IDcgcGl4ZWxzIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQuCi0gICAgICogIEZpcnN0IGFkZGluZyA3IHRvIHRoZSBsZW5ndGggc28gdGhlIGxlbmd0aCB3b3VsZCBiZSBmcm9tIDAgfiA2LgotICAgICAqICBlZzogMSBwaXhlbCBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0LCBzbyAxLTgrNyA9IDAuCi0gICAgICogIFRoZW4gc2F2ZSAxIHBpeGVsIHVuY29uZGl0aW9uYWxseSBzaW5jZSBhdCBsZWFzdCAxIHBpeGVscyBsZWZ0IGluIHRoZQotICAgICAqICB0cmFpbGluZyBwYXJ0LgotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIEFERFMgbGVuZ3RoLCBsZW5ndGgsICM3ICAgICAgICAgICAgQCB0aGVyZSBhcmUgNyBvciBsZXNzIGluIHRoZSB0cmFpbGluZyBwYXJ0Ci0KLSAgICBWU1QyLlU4IHtEMjdbMF0sIEQyOFswXX0sIFtwX3JnYl0hIEAgYXQgbGVhc3QgMSBwaXhlbCBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0Ci0gICAgQkVRICBlbmRfeXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDI3WzFdLCBEMjhbMV19LCBbcF9yZ2JdISBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRICBlbmRfeXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDI3WzJdLCBEMjhbMl19LCBbcF9yZ2JdISBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRICBlbmRfeXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDI3WzNdLCBEMjhbM119LCBbcF9yZ2JdISBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRICBlbmRfeXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDI3WzRdLCBEMjhbNF19LCBbcF9yZ2JdISBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRICBlbmRfeXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDI3WzVdLCBEMjhbNV19LCBbcF9yZ2JdISBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRICBlbmRfeXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDI3WzZdLCBEMjhbNl19LCBbcF9yZ2JdISBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0KLWVuZF95dnVwMnJnYjU2NToKLSAgICBWUE9QICB7RDgtRDE1fQotICAgIExETUZEIFNQISwge1BDfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGVuZCBvZiB5dnVwMnJnYjU2NQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogRlVOQ1RJT04gICAgIDogeXl2dXAycmdiNTY1X3ZlbnVtCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogREVTQ1JJUFRJT04gIDogUGVyZm9ybSBZWVZVIHBsYW5hciB0byBSR0I1NjUgY29udmVyc2lvbi4KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBDIFBST1RPVFlQRSAgOiB2b2lkIHl5dnVwMnJnYjU2NV92ZW51bSh1aW50OF90ICAqcF95LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAqcF9jciwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfY2IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX3JnYjU2NSwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgIGxlbmd0aCkKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgSU5QVVQgICAgOiBSMDogdWludDhfdCAgKnBfeQotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBZIExpbmUKLSogICAgICAgICAgICAgICAgUjE6IHVpbnQ4X3QgICpwX2NyCi0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IENyIExpbmUKLSogICAgICAgICAgICAgICAgUjI6IHVpbnQ4X3QgICpwX2NiCi0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IENiIExpbmUKLSogICAgICAgICAgICAgICAgUjM6IHVpbnQ4X3QgICpwX3JnYjU2NQotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgUkdCIExpbmUKLSogICAgICAgICAgICAgICAgUjEyOiB1aW50MzJfdCAgbGVuZ3RoCi0qICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIG9mIExpbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBTVEFDSyBBUkcgICAgOiBOb25lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIE9VVFBVVCAgIDogTm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIE1FTSBJTlBVVCAgICA6IHBfeSAgICAgIC0gYSBsaW5lIG9mIFkgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIHBfY3IgICAgIC0gYSBsaW5lIG9mIENyIHBpeGVscwotKiAgICAgICAgICAgICAgICBwX2NiICAgICAtIGEgbGluZSBvZiBDYiBwaXhlbHMKLSogICAgICAgICAgICAgICAgbGVuZ3RoICAgLSB0aGUgd2lkdGggb2YgdGhlIGlucHV0IGxpbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBNRU0gT1VUUFVUICAgOiBwX3JnYjU2NSAtIHRoZSBjb252ZXJ0ZWQgcmdiIHBpeGVscwotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBBRkZFQ1RFRCA6IEFSTTogIFIwLVI0LCBSMTIKLSogICAgICAgICAgICAgICAgTkVPTjogUTAtUTE1Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogU1RBQ0sgVVNBR0UgIDogbm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIENZQ0xFUyAgICAgICA6IG5vbmUKLSoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBOT1RFUyAgICAgICAgOgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotLnR5cGUgeXl2dXAycmdiNTY1X3ZlbnVtLCAlZnVuY3Rpb24KLXl5dnVwMnJnYjU2NV92ZW51bToKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgU3RvcmUgc3RhY2sgcmVnaXN0ZXJzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgU1RNRkQgU1AhLCB7TFJ9Ci0KLSAgICBWUFVTSCB7RDgtRDE1fQotCi0gICAgUExEIFtSMCwgUjNdICAgICAgICAgICAgICAgICAgICAgICBAIHByZWxvYWQgbHVtYSBsaW5lCi0KLSAgICBBRFIgICBSMTIsIGNvbnN0YW50cwotCi0gICAgVkxEMS5TMTYgIHtENiwgRDd9LCBbUjEyXSEgICAgICAgICBAIEQ2LCBENzogMzU5IHwgIC04OCB8IC0xODMgfCA0NTQgfCAyNTYgfCAwIHwgMjU1IHwgMAotICAgIFZMRDEuUzMyICB7RDMwLCBEMzF9LCBbUjEyXSAgICAgICAgQCBRMTUgICA6ICAtNDU4MjQgICAgfCAgICAzNDgxNiAgIHwgIC01Nzk4NCB8ICAgICBYCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCB0aGUgNXRoIHBhcmFtZXRlciB2aWEgc3RhY2sKLSAgICAgKiAgUjAgfiBSMyBhcmUgdXNlZCB0byBwYXNzIHRoZSBmaXJzdCA0IHBhcmFtZXRlcnMsIHRoZSA1dGggYW5kIGFib3ZlCi0gICAgICogIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB2aWEgc3RhY2sKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBMRFIgUjEyLCBbU1AsICM2OF0gICAgICAgICAgICAgICAgIEAgTFIgaXMgcHVzaGVkIGludG8gdGhlIHN0YWNrIHNvIFNQIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRlY3JlYXNlZCBieSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEOC1EMTUgYXJlIGFsc28gcHVzaGVkIGludG8gdGhlIHN0YWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNvIFNQIGlzIGRlY3JlYXNlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCA4LWJ5dGUvRC1SZWdpc3RlciAqIDggRC1SZWdpc3RlcnMgPSA2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc28gU1AgbmVlZHMgdG8gYmUgaW5jcmVhc2VkIGJ5IDY0KzQ9NjgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdG8gZ2V0IHRoZSB2YWx1ZSB0aGF0IHdhcyBmaXJzdCBwdXNoZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW50byBzdGFjayAodGhlIDV0aCBwYXJhbWV0ZXIgcGFzc2VkIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRocm91Z2h0IHN0YWNrKQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgY2xhbXBpbmcgcGFyYW1ldGVycyB0byBkdXBsaWNhdGUgdmVjdG9yIGVsZW1lbnRzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkRVUC5TMTYgIFE0LCAgRDdbMV0gICAgICAgICAgICAgICBAIFE0OiAgMCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMAotICAgIFZEVVAuUzE2ICBRNSwgIEQ3WzJdICAgICAgICAgICAgICAgQCBRNTogMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmVhZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkRVUC5TMzIgIFEwLCAgIEQzMFswXSAgICAgICAgICAgICBAIFEwOiAgLTQ1ODI0IHwgLTQ1ODI0IHwgLTQ1ODI0IHwgLTQ1ODI0Ci0gICAgVkRVUC5TMzIgIFExLCAgIEQzMFsxXSAgICAgICAgICAgICBAIFExOiAgIDM0ODE2IHwgIDM0ODE2IHwgIDM0ODE2IHwgIDM0ODE2Ci0gICAgVkRVUC5TMzIgIFEyLCAgIEQzMVswXSAgICAgICAgICAgICBAIFEyOiAgLTcwNjg4IHwgLTcwNjg4IHwgLTcwNjg4IHwgLTcwNjg4Ci0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBUaGUgbWFpbiBsb29wCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1sb29wX3l5dnVwMnJnYjU2NToKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIGlucHV0IGZyb20gWSwgViBhbmQgVQotICAgICAqICBEMTIsIEQxMzogWTAgWTIgWTQgWTYgWTggWTEwIFkxMiBZMTQsIFkxIFkzIFk1IFk3IFk5IFkxMSBZMTMgWTE1Ci0gICAgICogIEQxNCAgICAgOiBWMCBWMSBWMiBWMyBWNCBWNSAgVjYgIFY3Ci0gICAgICogIEQxNSAgICAgOiBVMCBVMSBVMiBVMyBVNCBVNSAgVTYgIFU3Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkxEMi5VOCAge0QxMixEMTN9LCBbcF95XSEgICAgICAgICBAIExvYWQgMTYgTHVtYSBlbGVtZW50cyAodWludDgpIHRvIEQxMiwgRDEzCi0gICAgVkxEMS5VOCAge0QxNH0sICAgICBbcF9jcl0hICAgICAgICBAIExvYWQgOCBDciBlbGVtZW50cyAodWludDgpIHRvIEQxNAotICAgIFZMRDEuVTggIHtEMTV9LCAgICAgW3BfY2JdISAgICAgICAgQCBMb2FkIDggQ2IgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBFeHBhbmQgdWludDggdmFsdWUgdG8gdWludDE2Ci0gICAgICogIEQyNCwgRDI1OiBZMCBZMiBZNCBZNiBZOCBZMTAgWTEyIFkxNAotICAgICAqICBEMjYsIEQyNzogWTEgWTMgWTUgWTcgWTkgWTExIFkxMyBZMTUKLSAgICAgKiAgRDI4LCBEMjk6IFYwIFYxIFYyIFYzIFY0IFY1ICBWNiAgVjcKLSAgICAgKiAgRDMwLCBEMzE6IFUwIFUxIFUyIFUzIFU0IFU1ICBVNiAgVTcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WTC5VOCBRMTIsIEQxMgotICAgIFZNT1ZMLlU4IFExMywgRDEzCi0gICAgVk1PVkwuVTggUTE0LCBEMTQKLSAgICBWTU9WTC5VOCBRMTUsIEQxNQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIE11bHRpcGx5IGNvbnRyaWJ1dGlvbiBmcm9tIGNocm9taW5hbmNlLCByZXN1bHRzIGFyZSBpbiAzMi1iaXQKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTVVMTC5TMTYgIFE2LCBEMjgsIEQ2WzBdICAgICAgICAgIEAgUTY6ICAzNTkqKFYwLFYxLFYyLFYzKSAgICAgUmVkCi0gICAgVk1VTEwuUzE2ICBRNywgRDMwLCBENlsxXSAgICAgICAgICBAIFE3OiAgLTg4KihVMCxVMSxVMixVMykgICAgIEdyZWVuCi0gICAgVk1MQUwuUzE2ICBRNywgRDI4LCBENlsyXSAgICAgICAgICBAIHE3OiAgLTg4KihVMCxVMSxVMixVMykgLSAxODMqKFYwLFYxLFYyLFYzKQotICAgIFZNVUxMLlMxNiAgUTgsIEQzMCwgRDZbM10gICAgICAgICAgQCBxODogIDQ1NCooVTAsVTEsVTIsVTMpICAgICBCbHVlCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQWRkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWQURELlMzMiAgUTYsIFEwICAgICAgICAgICAgICAgICAgIEAgUTYgYWRkIFJlZCAgIGJpYXMgLTQ1ODI0Ci0gICAgVkFERC5TMzIgIFE3LCBRMSAgICAgICAgICAgICAgICAgICBAIFE3IGFkZCBHcmVlbiBiaWFzICAzNDgxNgotICAgIFZBREQuUzMyICBROCwgUTIgICAgICAgICAgICAgICAgICAgQCBROCBhZGQgQmx1ZSAgYmlhcyAtNTc5ODQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDYWxjdWxhdGUgUmVkLCBHcmVlbiwgQmx1ZQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNT1YuUzMyICAgUTksIFE2Ci0gICAgVk1MQUwuUzE2ICBRNiwgRDI0LCBEN1swXSAgICAgICAgICBAIFE2OiBSMCwgUjIsIFI0LCBSNiBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBROSwgRDI2LCBEN1swXSAgICAgICAgICBAIFE5OiBSMSwgUjMsIFI1LCBSNyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICBWTU9WLlMzMiAgIFExMCwgUTcKLSAgICBWTUxBTC5TMTYgIFE3LCAgRDI0LCBEN1swXSAgICAgICAgIEAgUTc6ICBHMCwgRzIsIEc0LCBHNiBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTAsIEQyNiwgRDdbMF0gICAgICAgICBAIFExMDogRzEsIEczLCBHNSwgRzcgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgVk1PVi5TMzIgICBRMTEsIFE4Ci0gICAgVk1MQUwuUzE2ICBROCwgIEQyNCwgRDdbMF0gICAgICAgICBAIFE4OiAgQjAsIEIyLCBCNCwgQjYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTExLCBEMjYsIEQ3WzBdICAgICAgICAgQCBRMTE6IEIxLCBCMywgQjUsIEI3IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBSaWdodCBzaGlmdCBlaWdodCBiaXRzIHdpdGggcm91bmRpbmcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWU0hSTi5TMzIgICBEMTIsIFE2LCAgIzggICAgICAgICAgIEAgRDEyOiBSMCBSMiBSNCBSNiBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDEzLCBROSwgICM4ICAgICAgICAgICBAIEQxMzogUjEgUjMgUjUgUjcgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQxMiwgRDEzICAgICAgICAgICAgICAgQCBRNiA6IFIwIFIxIFIyIFIzIFI0IFI1IFI2IFI3Ci0KLSAgICBWU0hSTi5TMzIgICBEMTgsIFE3LCAgIzggICAgICAgICAgIEAgRDE4OiBHMCBHMiBHNCBHNiBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDE5LCBRMTAsICM4ICAgICAgICAgICBAIEQxOTogRzEgRzMgRzUgRzcgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQxOCwgRDE5ICAgICAgICAgICAgICAgQCBROSA6IEcwIEcxIEcyIEczIEc0IEc1IEc2IEc3Ci0KLSAgICBWU0hSTi5TMzIgICBEMjAsIFE4LCAgIzggICAgICAgICAgIEAgRDIwOiBCMCBCMiBCNCBCNiBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIxLCBRMTEsICM4ICAgICAgICAgICBAIEQyMTogQjEgQjMgQjUgQjcgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQyMCwgRDIxICAgICAgICAgICAgICAgQCBRMTA6IEIwIEIxIEIyIEIzIEI0IEI1IEI2IEI3Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2xhbXAgdGhlIHZhbHVlIHRvIGJlIHdpdGhpbiBbMH4yNTVdCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1BWC5TMTYgIFE2LCBRNiwgUTQgICAgICAgICAgICAgICBAIGlmIFE2IDwgICAwLCBRNiA9ICAgMAotICAgIFZNSU4uUzE2ICBRNiwgUTYsIFE1ICAgICAgICAgICAgICAgQCBpZiBRNiA+IDI1NSwgUTYgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgRDIzLCBRNiAgICAgICAgICAgICAgIEAgc3RvcmUgUmVkIHRvIEQyMywgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICBROSwgUTksIFE0ICAgICAgICAgICAgICAgQCBpZiBROSA8ICAgMCwgUTkgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTksIFE5LCBRNSAgICAgICAgICAgICAgIEAgaWYgUTkgPiAyNTUsIFE5ID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgIEQyMiwgUTkgICAgICAgICAgICAgICBAIHN0b3JlIEdyZWVuIHRvIEQyMiwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICBRMTAsIFExMCwgUTQgICAgICAgICAgICAgQCBpZiBRMTAgPCAgIDAsIFExMCA9ICAgMAotICAgIFZNSU4uUzE2ICBRMTAsIFExMCwgUTUgICAgICAgICAgICAgQCBpZiBRMTAgPiAyNTUsIFExMCA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICAgRDIxLCBRMTAgICAgICAgICAgICAgQCBzdG9yZSBCbHVlIHRvIEQyMSwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBEMjI6ICAzIGJpdHMgb2YgR3JlZW4gKyA1IGJpdHMgb2YgQmx1ZQotICAgICAqICBEMjM6ICA1IGJpdHMgb2YgUmVkICAgKyAzIGJpdHMgb2YgR3JlZW4KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWU1JJLjggICBEMjMsIEQyMiwgIzUgICAgICAgICAgICAgIEAgcmlnaHQgc2hpZnQgRyBieSA1IGFuZCBpbnNlcnQgdG8gUgotICAgIFZTSEwuVTggIEQyMiwgRDIyLCAjMyAgICAgICAgICAgICAgQCBsZWZ0IHNoaWZ0IEcgYnkgMwotICAgIFZTUkkuOCAgIEQyMiwgRDIxLCAjMyAgICAgICAgICAgICAgQCByaWdodCBzaGlmdCBCIGJ5IDMgYW5kIGluc2VydCB0byBHCi0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjOCAgICAgICAgICAgIEAgY2hlY2sgaWYgdGhlIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgQk1JICB0cmFpbGluZ195eXZ1cDJyZ2I1NjUgICAgICAgICBAIGp1bXAgdG8gdHJhaWxpbmcgcHJvY2Vzc2luZyBpZiByZW1haW5pbmcgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBWU1QyLlU4ICB7RDIyLEQyM30sIFtwX3JnYl0hICAgICAgIEAgdmVjdG9yIHN0b3JlIFJlZCwgR3JlZW4sIEJsdWUgdG8gZGVzdGluYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQmx1ZSBhdCBMU0IKLQotICAgIEJFUSAgZW5kX3l5dnVwMnJnYjU2NSAgICAgICAgICAgICAgQCBkb25lIGlmIGV4YWN0bHkgOCBwaXhlbCBwcm9jZXNzZWQgaW4gdGhlIGxvb3AKLQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIERvbmUgd2l0aCB0aGUgZmlyc3QgOCBlbGVtZW50cywgY29udGludWUgb24gdGhlIG5leHQgOCBlbGVtZW50cwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIE11bHRpcGx5IGNvbnRyaWJ1dGlvbiBmcm9tIGNocm9taW5hbmNlLCByZXN1bHRzIGFyZSBpbiAzMi1iaXQKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTVVMTC5TMTYgIFE2LCBEMjksIEQ2WzBdICAgICAgICAgIEAgUTY6IDM1OSooVjQsVjUsVjYsVjcpICAgICAgIFJlZAotICAgIFZNVUxMLlMxNiAgUTcsIEQzMSwgRDZbMV0gICAgICAgICAgQCBRNzogLTg4KihVNCxVNSxVNixVNykgICAgICBHcmVlbgotICAgIFZNTEFMLlMxNiAgUTcsIEQyOSwgRDZbMl0gICAgICAgICAgQCBRNzogLTg4KihVNCxVNSxVNixVNykgLSAxODMqKFY0LFY1LFY2LFY3KQotICAgIFZNVUxMLlMxNiAgUTgsIEQzMSwgRDZbM10gICAgICAgICAgQCBRODogNDU0KihVNCxVNSxVNixVNykgICAgICAgQmx1ZQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEFkZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkFERC5TMzIgIFE2LCBRMCAgICAgICAgICAgICAgICAgICBAIFE2IGFkZCBSZWQgICBiaWFzIC00NTgyNAotICAgIFZBREQuUzMyICBRNywgUTEgICAgICAgICAgICAgICAgICAgQCBRNyBhZGQgR3JlZW4gYmlhcyAgMzQ4MTYKLSAgICBWQURELlMzMiAgUTgsIFEyICAgICAgICAgICAgICAgICAgIEAgUTggYWRkIEJsdWUgIGJpYXMgLTU3OTg0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2FsY3VsYXRlIFJlZCwgR3JlZW4sIEJsdWUKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WLlMzMiAgIFE5LCBRNgotICAgIFZNTEFMLlMxNiAgUTYsIEQyNSwgRDdbMF0gICAgICAgICAgQCBRNjogUjggUjEwIFIxMiBSMTQgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTksIEQyNywgRDdbMF0gICAgICAgICAgQCBROTogUjkgUjExIFIxMyBSMTUgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgVk1PVi5TMzIgICBRMTAsIFE3Ci0gICAgVk1MQUwuUzE2ICBRNywgIEQyNSwgRDdbMF0gICAgICAgICBAIFE3OiBHMCwgRzIsIEc0LCBHNiBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTAsIEQyNywgRDdbMF0gICAgICAgICBAIFExMCA6IEcxLCBHMywgRzUsIEc3IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIFZNT1YuUzMyICAgUTExLCBROAotICAgIFZNTEFMLlMxNiAgUTgsICBEMjUsIEQ3WzBdICAgICAgICAgQCBRODogQjAsIEIyLCBCNCwgQjYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTExLCBEMjcsIEQ3WzBdICAgICAgICAgQCBRMTEgOiBCMSwgQjMsIEI1LCBCNyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmlnaHQgc2hpZnQgZWlnaHQgYml0cyB3aXRoIHJvdW5kaW5nCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNIUk4uUzMyICAgRDEyLCBRNiwgICM4ICAgICAgICAgICBAIEQxMjogUjggUjEwIFIxMiBSMTQgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQxMywgUTksICAjOCAgICAgICAgICAgQCBEMTM6IFI5IFIxMSBSMTMgUjE1IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMTIsIEQxMyAgICAgICAgICAgICAgIEAgUTY6IFI4IFI5IFIxMCBSMTEgUjEyIFIxMyBSMTQgUjE1Ci0KLSAgICBWU0hSTi5TMzIgICBEMTgsIFE3LCAgIzggICAgICAgICAgIEAgRDE4OiBHOCBHMTAgRzEyIEcxNCBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDE5LCBRMTAsICM4ICAgICAgICAgICBAIEQxOTogRzkgRzExIEcxMyBHMTUgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQxOCwgRDE5ICAgICAgICAgICAgICAgQCBROTogIEc4IEc5IEcxMCBHMTEgRzEyIEcxMyBHMTQgRzE1Ci0KLSAgICBWU0hSTi5TMzIgICBEMjAsIFE4LCAgIzggICAgICAgICAgIEAgRDIwOiBCOCBCMTAgQjEyIEIxNCBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIxLCBRMTEsICM4ICAgICAgICAgICBAIEQyMTogQjkgQjExIEIxMyBCMTUgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQyMCwgRDIxICAgICAgICAgICAgICAgQCBRMTA6IEI4IEI5IEIxMCBCMTEgQjEyIEIxMyBCMTQgQjE1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2xhbXAgdGhlIHZhbHVlIHRvIGJlIHdpdGhpbiBbMH4yNTVdCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1BWC5TMTYgIFE2LCBRNiwgUTQgICAgICAgICAgICAgICBAIGlmIFE2IDwgICAwLCBRNiA9ICAgMAotICAgIFZNSU4uUzE2ICBRNiwgUTYsIFE1ICAgICAgICAgICAgICAgQCBpZiBRNiA+IDI1NSwgUTYgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgRDIzLCBRNiAgICAgICAgICAgICAgIEAgc3RvcmUgUmVkIHRvIEQyMywgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICBROSwgUTksIFE0ICAgICAgICAgICAgICAgQCBpZiBROSA8ICAgMCwgUTkgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTksIFE5LCBRNSAgICAgICAgICAgICAgIEAgaWYgUTkgPiAyNTUsIFE5ID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgIEQyMiwgUTkgICAgICAgICAgICAgICBAIHN0b3JlIEdyZWVuIHRvIEQyMiwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICBRMTAsIFExMCwgUTQgICAgICAgICAgICAgQCBpZiBRMTAgPCAgIDAsIFExMCA9ICAgMAotICAgIFZNSU4uUzE2ICBRMTAsIFExMCwgUTUgICAgICAgICAgICAgQCBpZiBRMTAgPiAyNTUsIFExMCA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICAgRDIxLCBRMTAgICAgICAgICAgICAgQCBzdG9yZSBCbHVlIHRvIEQyMSwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBEMjI6ICAzIGJpdHMgb2YgR3JlZW4gKyA1IGJpdHMgb2YgQmx1ZQotICAgICAqICBEMjM6ICA1IGJpdHMgb2YgUmVkICAgKyAzIGJpdHMgb2YgR3JlZW4KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWU1JJLjggICBEMjMsIEQyMiwgIzUgICAgICAgICAgICAgIEAgcmlnaHQgc2hpZnQgRyBieSA1IGFuZCBpbnNlcnQgdG8gUgotICAgIFZTSEwuVTggIEQyMiwgRDIyLCAjMyAgICAgICAgICAgICAgQCBsZWZ0IHNoaWZ0IEcgYnkgMwotICAgIFZTUkkuOCAgIEQyMiwgRDIxLCAjMyAgICAgICAgICAgICAgQCByaWdodCBzaGlmdCBCIGJ5IDMgYW5kIGluc2VydCB0byBHCi0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjOCAgICAgICAgICAgIEAgY2hlY2sgaWYgdGhlIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgQk1JICB0cmFpbGluZ195eXZ1cDJyZ2I1NjUgICAgICAgICBAIGp1bXAgdG8gdHJhaWxpbmcgcHJvY2Vzc2luZyBpZiByZW1haW5pbmcgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBWU1QyLlU4ICB7RDIyLEQyM30sIFtwX3JnYl0hICAgICAgIEAgdmVjdG9yIHN0b3JlIFJlZCwgR3JlZW4sIEJsdWUgdG8gZGVzdGluYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQmx1ZSBhdCBMU0IKLQotICAgIEJISSBsb29wX3l5dnVwMnJnYjU2NSAgICAgICAgICAgICAgQCBsb29wIGlmIG1vcmUgdGhhbiA4IHBpeGVscyBsZWZ0Ci0KLSAgICBCRVEgIGVuZF95eXZ1cDJyZ2I1NjUgICAgICAgICAgICAgIEAgZG9uZSBpZiBleGFjdGx5IDggcGl4ZWwgcHJvY2Vzc2VkIGluIHRoZSBsb29wCi0KLQotdHJhaWxpbmdfeXl2dXAycmdiNTY1OgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBUaGVyZSBhcmUgZnJvbSAxIH4gNyBwaXhlbHMgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydC4KLSAgICAgKiAgRmlyc3QgYWRkaW5nIDcgdG8gdGhlIGxlbmd0aCBzbyB0aGUgbGVuZ3RoIHdvdWxkIGJlIGZyb20gMCB+IDYuCi0gICAgICogIGVnOiAxIHBpeGVsIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQsIHNvIDEtOCs3ID0gMC4KLSAgICAgKiAgVGhlbiBzYXZlIDEgcGl4ZWwgdW5jb25kaXRpb25hbGx5IHNpbmNlIGF0IGxlYXN0IDEgcGl4ZWxzIGxlZnQgaW4gdGhlCi0gICAgICogIHRyYWlsaW5nIHBhcnQuCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgQUREUyBsZW5ndGgsIGxlbmd0aCwgIzcgICAgICAgICAgICBAIHRoZXJlIGFyZSA3IG9yIGxlc3MgaW4gdGhlIHRyYWlsaW5nIHBhcnQKLQotICAgIFZTVDIuVTgge0QyMlswXSxEMjNbMF19LCBbcF9yZ2JdISAgQCBhdCBsZWFzdCAxIHBpeGVsIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQKLSAgICBCRVEgZW5kX3l5dnVwMnJnYjU2NSAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QyLlU4IHtEMjJbMV0sRDIzWzFdfSwgW3BfcmdiXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgZW5kX3l5dnVwMnJnYjU2NSAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QyLlU4IHtEMjJbMl0sRDIzWzJdfSwgW3BfcmdiXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgZW5kX3l5dnVwMnJnYjU2NSAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QyLlU4IHtEMjJbM10sRDIzWzNdfSwgW3BfcmdiXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgZW5kX3l5dnVwMnJnYjU2NSAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QyLlU4IHtEMjJbNF0sRDIzWzRdfSwgW3BfcmdiXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgZW5kX3l5dnVwMnJnYjU2NSAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QyLlU4IHtEMjJbNV0sRDIzWzVdfSwgW3BfcmdiXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgZW5kX3l5dnVwMnJnYjU2NSAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QyLlU4IHtEMjJbNl0sRDIzWzZdfSwgW3BfcmdiXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLQotZW5kX3l5dnVwMnJnYjU2NToKLSAgICBWUE9QICB7RDgtRDE1fQotICAgIExETUZEIFNQISwge1BDfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGVuZCBvZiB5eXZ1cDJyZ2I1NjUKLQotY29uc3RhbnRzOgotICAgIC5od29yZCAoQ09FRkZfVl9SRUQpLCAgKENPRUZGX1VfR1JFRU4pLCAoQ09FRkZfVl9HUkVFTiksIChDT0VGRl9VX0JMVUUpIEAgICAzNTkgIHwgLTg4ICAgfCAgLTE4MyAgfCA0NTQKLSAgICAuaHdvcmQgKENPRUZGX1kpLCAgICAgIChDT0VGRl8wKSwgICAgICAgKENPRUZGXzI1NSkgICAgLCAoQ09FRkZfMCkgICAgICBAICAgMjU2ICB8ICAgMCAgIHwgICAyNTUgIHwgIDAKLSAgICAud29yZCAgKENPRUZGX0JJQVNfUiksIChDT0VGRl9CSUFTX0cpLCAgKENPRUZGX0JJQVNfQikgICAgICAgICAgICAgICAgICBAIC00NTgyNCB8IDM0ODE2IHwgLTU3OTg0IHwgIFgKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBGVU5DVElPTiAgICAgOiB5dnVwMmFiZ3I4ODg4X3ZlbnVtCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogREVTQ1JJUFRJT04gIDogUGVyZm9ybSBZVlUgcGxhbmFyIHRvIEFCR1I4ODg4IGNvbnZlcnNpb24uCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogQyBQUk9UT1RZUEUgIDogdm9pZCB5dnVwMmFiZ3I4ODg4X3ZlbnVtKHVpbnQ4X3QgICpwX3ksCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAqcF9jciwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2NiLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfYWJncjg4ODgsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgbGVuZ3RoKQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBJTlBVVCAgICA6IFIwOiB1aW50OF90ICAqcF95Ci0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IFkgTGluZQotKiAgICAgICAgICAgICAgICBSMTogdWludDhfdCAgKnBfY3IKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgQ3IgTGluZQotKiAgICAgICAgICAgICAgICBSMjogdWludDhfdCAgKnBfY2IKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgQ2IgTGluZQotKiAgICAgICAgICAgICAgICBSMzogdWludDhfdCAgKnBfYWJncjg4ODgKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IEFCR1IgTGluZQotKiAgICAgICAgICAgICAgICBSMTI6IHVpbnQzMl90ICBsZW5ndGgKLSogICAgICAgICAgICAgICAgICAgICAgd2lkdGggb2YgTGluZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFNUQUNLIEFSRyAgICA6IE5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgT1VUUFVUICAgOiBOb25lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTUVNIElOUFVUICAgIDogcF95ICAgICAgLSBhIGxpbmUgb2YgWSBwaXhlbHMKLSogICAgICAgICAgICAgICAgcF9jciAgICAgLSBhIGxpbmUgb2YgQ3IgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIHBfY2IgICAgIC0gYSBsaW5lIG9mIENiIHBpeGVscwotKiAgICAgICAgICAgICAgICBsZW5ndGggICAtIHRoZSB3aWR0aCBvZiB0aGUgaW5wdXQgbGluZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIE1FTSBPVVRQVVQgICA6IHBfYWJncjg4ODggLSB0aGUgY29udmVydGVkIEFCR1IgcGl4ZWxzCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIEFGRkVDVEVEIDogQVJNOiAgUjAtUjQsIFIxMgotKiAgICAgICAgICAgICAgICBORU9OOiBRMC1RMTUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBTVEFDSyBVU0FHRSAgOiBub25lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogQ1lDTEVTICAgICAgIDogbm9uZQotKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIE5PVEVTICAgICAgICA6Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0udHlwZSB5dnVwMmFiZ3I4ODg4X3ZlbnVtLCAlZnVuY3Rpb24KLXl2dXAyYWJncjg4ODhfdmVudW06Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFN0b3JlIHN0YWNrIHJlZ2lzdGVycwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFNUTUZEIFNQISwge0xSfQotCi0gICAgVlBVU0gge0Q4LUQxNX0KLQotICAgIFBMRCBbUjAsIFIzXSAgICAgICAgICAgICAgICAgICAgICAgQCBwcmVsb2FkIGx1bWEgbGluZQotCi0gICAgQURSICAgUjEyLCBjb25zdGFudHMKLQotICAgIFZMRDEuUzE2ICB7RDYsIEQ3fSwgW1IxMl0hICAgICAgICAgQCBENiwgRDc6IDM1OSB8ICAtODggfCAtMTgzIHwgNDU0IHwgMjU2IHwgMCB8IDI1NSB8IDAKLSAgICBWTEQxLlMzMiAge0QzMCwgRDMxfSwgW1IxMl0gICAgICAgIEAgUTE1ICAgOiAgLTQ1ODI0ICAgIHwgICAgMzQ4MTYgICB8ICAtNTc5ODQgfCAgICAgWAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgdGhlIDV0aCBwYXJhbWV0ZXIgdmlhIHN0YWNrCi0gICAgICogIFIwIH4gUjMgYXJlIHVzZWQgdG8gcGFzcyB0aGUgZmlyc3QgNCBwYXJhbWV0ZXJzLCB0aGUgNXRoIGFuZCBhYm92ZQotICAgICAqICBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdmlhIHN0YWNrCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgTERSIFIxMiwgW1NQLCAjNjhdICAgICAgICAgICAgICAgICBAIExSIGlzIHB1c2hlZCBpbnRvIHRoZSBzdGFjayBzbyBTUCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkZWNyZWFzZWQgYnkgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRDgtRDE1IGFyZSBhbHNvIHB1c2hlZCBpbnRvIHRoZSBzdGFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzbyBTUCBpcyBkZWNyZWFzZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgOC1ieXRlL0QtUmVnaXN0ZXIgKiA4IEQtUmVnaXN0ZXJzID0gNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNvIFNQIG5lZWRzIHRvIGJlIGluY3JlYXNlZCBieSA2NCs0PTY4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRvIGdldCB0aGUgdmFsdWUgdGhhdCB3YXMgZmlyc3QgcHVzaGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGludG8gc3RhY2sgKHRoZSA1dGggcGFyYW1ldGVyIHBhc3NlZCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0aHJvdWdodCBzdGFjaykKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIGNsYW1waW5nIHBhcmFtZXRlcnMgdG8gZHVwbGljYXRlIHZlY3RvciBlbGVtZW50cwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZEVVAuUzE2ICBRNCwgIEQ3WzFdICAgICAgICAgICAgICAgQCBRNDogIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAKLSAgICBWRFVQLlMxNiAgUTUsICBEN1syXSAgICAgICAgICAgICAgIEAgUTU6IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFJlYWQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZEVVAuUzMyICBRMCwgICBEMzBbMF0gICAgICAgICAgICAgQCBRMDogIC00NTgyNCB8IC00NTgyNCB8IC00NTgyNCB8IC00NTgyNAotICAgIFZEVVAuUzMyICBRMSwgICBEMzBbMV0gICAgICAgICAgICAgQCBRMTogICAzNDgxNiB8ICAzNDgxNiB8ICAzNDgxNiB8ICAzNDgxNgotICAgIFZEVVAuUzMyICBRMiwgICBEMzFbMF0gICAgICAgICAgICAgQCBRMjogIC03MDY4OCB8IC03MDY4OCB8IC03MDY4OCB8IC03MDY4OAotCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgVGhlIG1haW4gbG9vcAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotbG9vcF95dnVwMmFiZ3I6Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCBpbnB1dCBmcm9tIFksIFYgYW5kIFUKLSAgICAgKiAgRDEyICA6IFkwICBZMSAgWTIgIFkzICBZNCAgWTUgIFk2ICBZNwotICAgICAqICBEMTQgIDogVjAgIFYxICBWMiAgVjMgIFY0ICBWNSAgVjYgIFY3Ci0gICAgICogIEQxNSAgOiBVMCAgVTEgIFUyICBVMyAgVTQgIFU1ICBVNiAgVTcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTEQxLlU4ICB7RDEyfSwgIFtwX3ldISAgICAgICAgICAgIEAgTG9hZCA4IEx1bWEgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTIKLSAgICBWTEQxLlU4ICB7RDE0fSwgIFtwX2NyXSEgICAgICAgICAgIEAgTG9hZCA4IENyIGVsZW1lbnRzICh1aW50OCkgdG8gRDE0Ci0gICAgVkxEMS5VOCAge0QxNX0sICBbcF9jYl0hICAgICAgICAgICBAIExvYWQgOCBDYiBlbGVtZW50cyAodWludDgpIHRvIEQxNQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEV4cGFuZCB1aW50OCB2YWx1ZSB0byB1aW50MTYKLSAgICAgKiAgRDE4LCBEMTk6IFkwIFkxIFkyIFkzIFk0IFk1IFk2IFk3Ci0gICAgICogIEQyMCwgRDIxOiBWMCBWMSBWMiBWMyBWNCBWNSBWNiBWNwotICAgICAqICBEMjIsIEQyMzogVTAgVTEgVTIgVTMgVTQgVTUgVTYgVTcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WTC5VOCBROSwgIEQxMgotICAgIFZNT1ZMLlU4IFExMCwgRDE0Ci0gICAgVk1PVkwuVTggUTExLCBEMTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBNdWx0aXBseSBjb250cmlidXRpb24gZnJvbSBjaHJvbWluYW5jZSwgcmVzdWx0cyBhcmUgaW4gMzItYml0Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1VTEwuUzE2ICBRMTIsIEQyMCwgRDZbMF0gICAgICAgICBAIFExMjogIDM1OSooVjAsVjEsVjIsVjMpICAgICBSZWQKLSAgICBWTVVMTC5TMTYgIFExMywgRDIyLCBENlsxXSAgICAgICAgIEAgUTEzOiAgLTg4KihVMCxVMSxVMixVMykgICAgIEdyZWVuCi0gICAgVk1MQUwuUzE2ICBRMTMsIEQyMCwgRDZbMl0gICAgICAgICBAIFExMzogIC04OCooVTAsVTEsVTIsVTMpIC0gMTgzKihWMCxWMSxWMixWMykKLSAgICBWTVVMTC5TMTYgIFExNCwgRDIyLCBENlszXSAgICAgICAgIEAgUTE0OiAgNDU0KihVMCxVMSxVMixVMykgICAgIEJsdWUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBBZGQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZBREQuUzMyICBRMTIsIFEwICAgICAgICAgICAgICAgICAgQCBRMTIgYWRkIFJlZCAgIGJpYXMgLTQ1ODI0Ci0gICAgVkFERC5TMzIgIFExMywgUTEgICAgICAgICAgICAgICAgICBAIFExMyBhZGQgR3JlZW4gYmlhcyAgMzQ4MTYKLSAgICBWQURELlMzMiAgUTE0LCBRMiAgICAgICAgICAgICAgICAgIEAgUTE0IGFkZCBCbHVlICBiaWFzIC01Nzk4NAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENhbGN1bGF0ZSBSZWQsIEdyZWVuLCBCbHVlCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1MQUwuUzE2ICBRMTIsIEQxOCwgRDdbMF0gICAgICAgICBAIFExMjogUjAsIFIxLCBSMiwgUjMgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTEzLCBEMTgsIEQ3WzBdICAgICAgICAgQCBRMTM6IEcwLCBHMSwgRzIsIEczIGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExNCwgRDE4LCBEN1swXSAgICAgICAgIEAgUTE0OiBCMCwgQjEsIEIyLCBCMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmlnaHQgc2hpZnQgZWlnaHQgYml0cyB3aXRoIHJvdW5kaW5nCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNIUk4uUzMyICAgRDE4ICwgUTEyLCAjOCAgICAgICAgICBAIEQxODogUjAsIFIxLCBSMiwgUjMgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMCAsIFExMywgIzggICAgICAgICAgQCBEMjA6IEcwLCBHMSwgRzIsIEczIGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMjIsICBRMTQsICM4ICAgICAgICAgIEAgRDIyOiBCMCwgQjEsIEIyLCBCMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgRG9uZSB3aXRoIHRoZSBmaXJzdCA0IGVsZW1lbnRzLCBjb250aW51ZSBvbiB0aGUgbmV4dCA0IGVsZW1lbnRzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTXVsdGlwbHkgY29udHJpYnV0aW9uIGZyb20gY2hyb21pbmFuY2UsIHJlc3VsdHMgYXJlIGluIDMyLWJpdAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNVUxMLlMxNiAgUTEyLCBEMjEsIEQ2WzBdICAgICAgICAgQCBRMTI6ICAzNTkqKFYwLFYxLFYyLFYzKSAgICAgUmVkCi0gICAgVk1VTEwuUzE2ICBRMTMsIEQyMywgRDZbMV0gICAgICAgICBAIFExMzogLTg4KihVMCxVMSxVMixVMykgICAgIEdyZWVuCi0gICAgVk1MQUwuUzE2ICBRMTMsIEQyMSwgRDZbMl0gICAgICAgICBAIFExMzogLTg4KihVMCxVMSxVMixVMykgLSAxODMqKFYwLFYxLFYyLFYzKQotICAgIFZNVUxMLlMxNiAgUTE0LCBEMjMsIEQ2WzNdICAgICAgICAgQCBRMTQ6ICA0NTQqKFUwLFUxLFUyLFUzKSAgICAgQmx1ZQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEFkZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkFERC5TMzIgIFExMiwgUTAgICAgICAgICAgICAgICAgICBAIFExMiBhZGQgUmVkICAgYmlhcyAtNDU4MjQKLSAgICBWQURELlMzMiAgUTEzLCBRMSAgICAgICAgICAgICAgICAgIEAgUTEzIGFkZCBHcmVlbiBiaWFzICAzNDgxNgotICAgIFZBREQuUzMyICBRMTQsIFEyICAgICAgICAgICAgICAgICAgQCBRMTQgYWRkIEJsdWUgIGJpYXMgLTU3OTg0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2FsY3VsYXRlIFJlZCwgR3JlZW4sIEJsdWUKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTUxBTC5TMTYgIFExMiwgRDE5LCBEN1swXSAgICAgICAgIEAgUTEyOiBSMCwgUjEsIFIyLCBSMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTMsIEQxOSwgRDdbMF0gICAgICAgICBAIFExMzogRzAsIEcxLCBHMiwgRzMgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTE0LCBEMTksIEQ3WzBdICAgICAgICAgQCBRMTQ6IEIwLCBCMSwgQjIsIEIzIGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBSaWdodCBzaGlmdCBlaWdodCBiaXRzIHdpdGggcm91bmRpbmcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWU0hSTi5TMzIgICBEMTkgLCBRMTIsICM4ICAgICAgICAgIEAgRDE4OiBSMCwgUjEsIFIyLCBSMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIxICwgUTEzLCAjOCAgICAgICAgICBAIEQyMDogRzAsIEcxLCBHMiwgRzMgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMywgIFExNCwgIzggICAgICAgICAgQCBEMjI6IEIwLCBCMSwgQjIsIEIzIGluIDE2LWJpdCBRMCBmb3JtYXQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDbGFtcCB0aGUgdmFsdWUgdG8gYmUgd2l0aGluIFswfjI1NV0KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTUFYLlMxNiAgUTExLCBRMTEsIFE0ICAgICAgICAgICAgIEAgaWYgUTExIDwgICAwLCBRMTEgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTExLCBRMTEsIFE1ICAgICAgICAgICAgIEAgaWYgUTExID4gMjU1LCBRMTEgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgIEQyOCwgUTExICAgICAgICAgICAgIEAgc3RvcmUgQmx1ZSB0byBEMjgsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTEwLCBRMTAsIFE0ICAgICAgICAgICAgIEAgaWYgUTEwIDwgICAwLCBRMTAgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTEwLCBRMTAsIFE1ICAgICAgICAgICAgIEAgaWYgUTEwID4gMjU1LCBRMTAgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgIEQyNywgUTEwICAgICAgICAgICAgIEAgc3RvcmUgR3JlZW4gdG8gRDI3LCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgVk1BWC5TMTYgICAgUTksIFE5LCBRNCAgICAgICAgICAgICBAIGlmIFE5IDwgICAwLCBROSA9ICAgMAotICAgIFZNSU4uUzE2ICAgIFE5LCBROSwgUTUgICAgICAgICAgICAgQCBpZiBROSA+IDI1NSwgUTkgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgICBEMjYsIFE5ICAgICAgICAgICAgIEAgc3RvcmUgUmVkIHRvIEQyNiwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBhYmdyIGZvcm1hdCB3aXRoIGxlYWRpbmcgMHhGRiBieXRlCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1PVk4uSTE2ICBEMjksIFE1ICAgICAgICAgICAgICAgICBAIEQyOTogIDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NQotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzggICAgICAgICAgICBAIGNoZWNrIGlmIHRoZSBsZW5ndGggaXMgbGVzcyB0aGFuIDgKLQotICAgIEJNSSAgdHJhaWxpbmdfeXZ1cDJhYmdyICAgICAgICAgICAgQCBqdW1wIHRvIHRyYWlsaW5nIHByb2Nlc3NpbmcgaWYgcmVtYWluaW5nIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgVlNUNC5VOCAge0QyNixEMjcsRDI4LEQyOX0sIFtwX2Jncl0hICAgQCB2ZWN0b3Igc3RvcmUgUmVkLCBHcmVlbiwgQmx1ZSB0byBkZXN0aW5hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBCbHVlIGF0IExTQgotCi0gICAgQkhJIGxvb3BfeXZ1cDJhYmdyICAgICAgICAgICAgICAgICBAIGxvb3AgaWYgbW9yZSB0aGFuIDggcGl4ZWxzIGxlZnQKLQotICAgIEJFUSAgZW5kX3l2dXAyYWJnciAgICAgICAgICAgICAgICAgQCBkb25lIGlmIGV4YWN0bHkgOCBwaXhlbCBwcm9jZXNzZWQgaW4gdGhlIGxvb3AKLQotCi10cmFpbGluZ195dnVwMmFiZ3I6Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFRoZXJlIGFyZSBmcm9tIDEgfiA3IHBpeGVscyBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0LgotICAgICAqICBGaXJzdCBhZGRpbmcgNyB0byB0aGUgbGVuZ3RoIHNvIHRoZSBsZW5ndGggd291bGQgYmUgZnJvbSAwIH4gNi4KLSAgICAgKiAgZWc6IDEgcGl4ZWwgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydCwgc28gMS04KzcgPSAwLgotICAgICAqICBUaGVuIHNhdmUgMSBwaXhlbCB1bmNvbmRpdGlvbmFsbHkgc2luY2UgYXQgbGVhc3QgMSBwaXhlbHMgbGVmdCBpbiB0aGUKLSAgICAgKiAgdHJhaWxpbmcgcGFydC4KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBBRERTIGxlbmd0aCwgbGVuZ3RoLCAjNyAgICAgICAgICAgIEAgdGhlcmUgYXJlIDcgb3IgbGVzcyBpbiB0aGUgdHJhaWxpbmcgcGFydAotCi0gICAgVlNUNC5VOCB7RDI2WzBdLCBEMjdbMF0sIEQyOFswXSwgRDI5WzBdfSwgW3BfYmdyXSEgQCBhdCBsZWFzdCAxIHBpeGVsIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQKLSAgICBCRVEgIGVuZF95dnVwMmFiZ3IgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1Q0LlU4IHtEMjZbMV0sIEQyN1sxXSwgRDI4WzFdLCBEMjlbMV19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAyYWJnciAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDQuVTgge0QyNlsyXSwgRDI3WzJdLCBEMjhbMl0sIEQyOVsyXX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRICBlbmRfeXZ1cDJhYmdyICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUNC5VOCB7RDI2WzNdLCBEMjdbM10sIEQyOFszXSwgRDI5WzNdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgIGVuZF95dnVwMmFiZ3IgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1Q0LlU4IHtEMjZbNF0sIEQyN1s0XSwgRDI4WzRdLCBEMjlbNF19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAyYWJnciAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDQuVTgge0QyNls1XSwgRDI3WzVdLCBEMjhbNV0sIEQyOVs1XX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRICBlbmRfeXZ1cDJhYmdyICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUNC5VOCB7RDI2WzZdLCBEMjdbNl0sIEQyOFs2XSwgRDI5WzZdfSwgW3BfYmdyXSEgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotCi1lbmRfeXZ1cDJhYmdyOgotICAgIFZQT1AgIHtEOC1EMTV9Ci0gICAgTERNRkQgU1AhLCB7UEN9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGVuZCBvZiB5dnVwMmFiZ3IKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBGVU5DVElPTiAgICAgOiB5eXZ1cDJhYmdyODg4OF92ZW51bQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIERFU0NSSVBUSU9OICA6IFBlcmZvcm0gWVlWVSBwbGFuYXIgdG8gQUJHUjg4ODggY29udmVyc2lvbi4KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBDIFBST1RPVFlQRSAgOiB2b2lkIHl5dnVwMmFiZ3I4ODg4X3ZlbnVtKHVpbnQ4X3QgICpwX3ksCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfY3IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfY2IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfYWJncjg4ODgsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgIGxlbmd0aCkKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgSU5QVVQgICAgOiBSMDogdWludDhfdCAgKnBfeQotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBZIExpbmUKLSogICAgICAgICAgICAgICAgUjE6IHVpbnQ4X3QgICpwX2NyCi0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IENyIExpbmUKLSogICAgICAgICAgICAgICAgUjI6IHVpbnQ4X3QgICpwX2NiCi0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IENiIExpbmUKLSogICAgICAgICAgICAgICAgUjM6IHVpbnQ4X3QgICpwX2FiZ3I4ODg4Ci0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBBQkdSIExpbmUKLSogICAgICAgICAgICAgICAgUjEyOiB1aW50MzJfdCAgbGVuZ3RoCi0qICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIG9mIExpbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBTVEFDSyBBUkcgICAgOiBOb25lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIE9VVFBVVCAgIDogTm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIE1FTSBJTlBVVCAgICA6IHBfeSAgICAgIC0gYSBsaW5lIG9mIFkgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIHBfY3IgICAgIC0gYSBsaW5lIG9mIENyIHBpeGVscwotKiAgICAgICAgICAgICAgICBwX2NiICAgICAtIGEgbGluZSBvZiBDYiBwaXhlbHMKLSogICAgICAgICAgICAgICAgbGVuZ3RoICAgLSB0aGUgd2lkdGggb2YgdGhlIGlucHV0IGxpbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBNRU0gT1VUUFVUICAgOiBwX2FiZ3I4ODg4IC0gdGhlIGNvbnZlcnRlZCBBQkdSIHBpeGVscwotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBBRkZFQ1RFRCA6IEFSTTogIFIwLVI0LCBSMTIKLSogICAgICAgICAgICAgICAgTkVPTjogUTAtUTE1Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogU1RBQ0sgVVNBR0UgIDogbm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIENZQ0xFUyAgICAgICA6IG5vbmUKLSoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBOT1RFUyAgICAgICAgOgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotLnR5cGUgeXl2dXAyYWJncjg4ODhfdmVudW0sICVmdW5jdGlvbgoteXl2dXAyYWJncjg4ODhfdmVudW06Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFN0b3JlIHN0YWNrIHJlZ2lzdGVycwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFNUTUZEIFNQISwge0xSfQotCi0gICAgVlBVU0gge0Q4LUQxNX0KLQotICAgIFBMRCBbUjAsIFIzXSAgICAgICAgICAgICAgICAgICAgICAgQCBwcmVsb2FkIGx1bWEgbGluZQotCi0gICAgQURSICAgUjEyLCBjb25zdGFudHMKLQotICAgIFZMRDEuUzE2ICB7RDYsIEQ3fSwgW1IxMl0hICAgICAgICAgQCBENiwgRDc6IDM1OSB8ICAtODggfCAtMTgzIHwgNDU0IHwgMjU2IHwgMCB8IDI1NSB8IDAKLSAgICBWTEQxLlMzMiAge0QzMCwgRDMxfSwgW1IxMl0gICAgICAgIEAgUTE1ICAgOiAgLTQ1ODI0ICAgIHwgICAgMzQ4MTYgICB8ICAtNTc5ODQgfCAgICAgWAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgdGhlIDV0aCBwYXJhbWV0ZXIgdmlhIHN0YWNrCi0gICAgICogIFIwIH4gUjMgYXJlIHVzZWQgdG8gcGFzcyB0aGUgZmlyc3QgNCBwYXJhbWV0ZXJzLCB0aGUgNXRoIGFuZCBhYm92ZQotICAgICAqICBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdmlhIHN0YWNrCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgTERSIFIxMiwgW1NQLCAjNjhdICAgICAgICAgICAgICAgICBAIExSIGlzIHB1c2hlZCBpbnRvIHRoZSBzdGFjayBzbyBTUCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkZWNyZWFzZWQgYnkgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRDgtRDE1IGFyZSBhbHNvIHB1c2hlZCBpbnRvIHRoZSBzdGFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzbyBTUCBpcyBkZWNyZWFzZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgOC1ieXRlL0QtUmVnaXN0ZXIgKiA4IEQtUmVnaXN0ZXJzID0gNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNvIFNQIG5lZWRzIHRvIGJlIGluY3JlYXNlZCBieSA2NCs0PTY4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRvIGdldCB0aGUgdmFsdWUgdGhhdCB3YXMgZmlyc3QgcHVzaGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGludG8gc3RhY2sgKHRoZSA1dGggcGFyYW1ldGVyIHBhc3NlZCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0aHJvdWdodCBzdGFjaykKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIGNsYW1waW5nIHBhcmFtZXRlcnMgdG8gZHVwbGljYXRlIHZlY3RvciBlbGVtZW50cwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZEVVAuUzE2ICBRNCwgIEQ3WzFdICAgICAgICAgICAgICAgQCBRNDogIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAKLSAgICBWRFVQLlMxNiAgUTUsICBEN1syXSAgICAgICAgICAgICAgIEAgUTU6IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFJlYWQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZEVVAuUzMyICBRMCwgICBEMzBbMF0gICAgICAgICAgICAgQCBRMDogIC00NTgyNCB8IC00NTgyNCB8IC00NTgyNCB8IC00NTgyNAotICAgIFZEVVAuUzMyICBRMSwgICBEMzBbMV0gICAgICAgICAgICAgQCBRMTogICAzNDgxNiB8ICAzNDgxNiB8ICAzNDgxNiB8ICAzNDgxNgotICAgIFZEVVAuUzMyICBRMiwgICBEMzFbMF0gICAgICAgICAgICAgQCBRMjogIC03MDY4OCB8IC03MDY4OCB8IC03MDY4OCB8IC03MDY4OAotCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgVGhlIG1haW4gbG9vcAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotbG9vcF95eXZ1cDJhYmdyOgotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgaW5wdXQgZnJvbSBZLCBWIGFuZCBVCi0gICAgICogIEQxMiwgRDEzOiBZMCBZMiBZNCBZNiBZOCBZMTAgWTEyIFkxNCwgWTEgWTMgWTUgWTcgWTkgWTExIFkxMyBZMTUKLSAgICAgKiAgRDE0ICA6IFYwICBWMSAgVjIgIFYzICBWNCAgVjUgIFY2ICBWNwotICAgICAqICBEMTUgIDogVTAgIFUxICBVMiAgVTMgIFU0ICBVNSAgVTYgIFU3Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkxEMi5VOCAge0QxMixEMTN9LCBbcF95XSEgICAgICAgICBAIExvYWQgMTYgTHVtYSBlbGVtZW50cyAodWludDgpIHRvIEQxMiwgRDEzCi0gICAgVkxEMS5VOCAge0QxNH0sICBbcF9jcl0hICAgICAgICAgICBAIExvYWQgOCBDciBlbGVtZW50cyAodWludDgpIHRvIEQxNAotICAgIFZMRDEuVTggIHtEMTV9LCAgW3BfY2JdISAgICAgICAgICAgQCBMb2FkIDggQ2IgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBFeHBhbmQgdWludDggdmFsdWUgdG8gdWludDE2Ci0gICAgICogIEQyNCwgRDI1OiBZMCBZMiBZNCBZNiBZOCBZMTAgWTEyIFkxNAotICAgICAqICBEMjYsIEQyNzogWTEgWTMgWTUgWTcgWTkgWTExIFkxMyBZMTUKLSAgICAgKiAgRDI4LCBEMjk6IFYwIFYxIFYyIFYzIFY0IFY1ICBWNiAgVjcKLSAgICAgKiAgRDMwLCBEMzE6IFUwIFUxIFUyIFUzIFU0IFU1ICBVNiAgVTcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WTC5VOCBRMTIsIEQxMgotICAgIFZNT1ZMLlU4IFExMywgRDEzCi0gICAgVk1PVkwuVTggUTE0LCBEMTQKLSAgICBWTU9WTC5VOCBRMTUsIEQxNQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIE11bHRpcGx5IGNvbnRyaWJ1dGlvbiBmcm9tIGNocm9taW5hbmNlLCByZXN1bHRzIGFyZSBpbiAzMi1iaXQKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTVVMTC5TMTYgIFE2LCBEMjgsIEQ2WzBdICAgICAgICAgIEAgUTY6ICAzNTkqKFYwLFYxLFYyLFYzKSAgICAgUmVkCi0gICAgVk1VTEwuUzE2ICBRNywgRDMwLCBENlsxXSAgICAgICAgICBAIFE3OiAtODgqKFUwLFUxLFUyLFUzKSAgICAgR3JlZW4KLSAgICBWTUxBTC5TMTYgIFE3LCBEMjgsIEQ2WzJdICAgICAgICAgIEAgUTc6IC04OCooVTAsVTEsVTIsVTMpIC0gMTgzKihWMCxWMSxWMixWMykKLSAgICBWTVVMTC5TMTYgIFE4LCBEMzAsIEQ2WzNdICAgICAgICAgIEAgUTg6ICA0NTQqKFUwLFUxLFUyLFUzKSAgICAgQmx1ZQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEFkZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkFERC5TMzIgIFE2LCBRMCAgICAgICAgICAgICAgICAgICBAIFE2IGFkZCBSZWQgICBiaWFzIC00NTgyNAotICAgIFZBREQuUzMyICBRNywgUTEgICAgICAgICAgICAgICAgICAgQCBRNyBhZGQgR3JlZW4gYmlhcyAgMzQ4MTYKLSAgICBWQURELlMzMiAgUTgsIFEyICAgICAgICAgICAgICAgICAgIEAgUTggYWRkIEJsdWUgIGJpYXMgLTU3OTg0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2FsY3VsYXRlIFJlZCwgR3JlZW4sIEJsdWUKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WLlMzMiAgIFE5LCBRNgotICAgIFZNTEFMLlMxNiAgUTYsIEQyNCwgRDdbMF0gICAgICAgICAgQCBRNjogUjAsIFIyLCBSNCwgUjYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTksIEQyNiwgRDdbMF0gICAgICAgICAgQCBROTogUjEsIFIzLCBSNSwgUjcgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgVk1PVi5TMzIgICBRMTAsIFE3Ci0gICAgVk1MQUwuUzE2ICBRNywgIEQyNCwgRDdbMF0gICAgICAgICBAIFE3OiAgRzAsIEcyLCBHNCwgRzYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTEwLCBEMjYsIEQ3WzBdICAgICAgICAgQCBRMTA6IEcxLCBHMywgRzUsIEc3IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIFZNT1YuUzMyICAgUTExLCBROAotICAgIFZNTEFMLlMxNiAgUTgsICBEMjQsIEQ3WzBdICAgICAgICAgQCBRODogIEIwLCBCMiwgQjQsIEI2IGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExMSwgRDI2LCBEN1swXSAgICAgICAgIEAgUTExOiBCMSwgQjMsIEI1LCBCNyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmlnaHQgc2hpZnQgZWlnaHQgYml0cyB3aXRoIHJvdW5kaW5nCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNIUk4uUzMyICAgRDEyLCBRNiwgICM4ICAgICAgICAgICBAIEQxMjogUjAgUjIgUjQgUjYgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQxMywgUTksICAjOCAgICAgICAgICAgQCBEMTM6IFIxIFIzIFI1IFI3IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMTIsIEQxMyAgICAgICAgICAgICAgIEAgUTYgOiBSMCBSMSBSMiBSMyBSNCBSNSBSNiBSNwotCi0gICAgVlNIUk4uUzMyICAgRDE4LCBRNywgICM4ICAgICAgICAgICBAIEQxODogRzAgRzIgRzQgRzYgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQxOSwgUTEwLCAjOCAgICAgICAgICAgQCBEMTk6IEcxIEczIEc1IEc3IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMTgsIEQxOSAgICAgICAgICAgICAgIEAgUTkgOiBHMCBHMSBHMiBHMyBHNCBHNSBHNiBHNwotCi0gICAgVlNIUk4uUzMyICAgRDIwLCBROCwgICM4ICAgICAgICAgICBAIEQyMDogQjAgQjIgQjQgQjYgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMSwgUTExLCAjOCAgICAgICAgICAgQCBEMjE6IEIxIEIzIEI1IEI3IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMjAsIEQyMSAgICAgICAgICAgICAgIEAgUTEwOiBCMCBCMSBCMiBCMyBCNCBCNSBCNiBCNwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENsYW1wIHRoZSB2YWx1ZSB0byBiZSB3aXRoaW4gWzB+MjU1XQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNQVguUzE2ICBRMTAsIFExMCwgUTQgICAgICAgICAgICAgQCBpZiBRMTAgPCAgIDAsIFExMCA9ICAgMAotICAgIFZNSU4uUzE2ICBRMTAsIFExMCwgUTUgICAgICAgICAgICAgQCBpZiBRMTAgPiAyNTUsIFExMCA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICAgRDIzLCBRMTAgICAgICAgICAgICAgQCBzdG9yZSBCbHVlIHRvIEQyMywgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICBROSwgUTksIFE0ICAgICAgICAgICAgICAgQCBpZiBROSA8ICAgMCwgUTkgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTksIFE5LCBRNSAgICAgICAgICAgICAgIEAgaWYgUTkgPiAyNTUsIFE5ID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgIEQyMiwgUTkgICAgICAgICAgICAgICBAIHN0b3JlIEdyZWVuIHRvIEQyMiwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICBRNiwgUTYsIFE0ICAgICAgICAgICAgICAgQCBpZiBRNiA8ICAgMCwgUTYgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTYsIFE2LCBRNSAgICAgICAgICAgICAgIEAgaWYgUTYgPiAyNTUsIFE2ID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgIEQyMSwgUTYgICAgICAgICAgICAgICBAIHN0b3JlIFJlZCB0byBEMjEsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgYWJnciBmb3JtYXQgd2l0aCBsZWFkaW5nIDB4RkYgYnl0ZQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNT1ZOLkkxNiAgRDI0LCBRNSAgICAgICAgICAgICAgICAgQCBEMjQ6ICAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICM4ICAgICAgICAgICAgQCBjaGVjayBpZiB0aGUgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBCTUkgIHRyYWlsaW5nX3l5dnVwMmFiZ3IgICAgICAgICAgIEAganVtcCB0byB0cmFpbGluZyBwcm9jZXNzaW5nIGlmIHJlbWFpbmluZyBsZW5ndGggaXMgbGVzcyB0aGFuIDgKLQotICAgIFZTVDQuVTggIHtEMjEsRDIyLEQyMyxEMjR9LCBbcF9iZ3JdISAgIEAgdmVjdG9yIHN0b3JlIEJsdWUsIEdyZWVuLCBSZWQgdG8gZGVzdGluYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUmVkIGF0IExTQgotCi0gICAgQkVRICBlbmRfeXl2dXAyYWJnciAgICAgICAgICAgICAgICBAIGRvbmUgaWYgZXhhY3RseSA4IHBpeGVsIHByb2Nlc3NlZCBpbiB0aGUgbG9vcAotCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgRG9uZSB3aXRoIHRoZSBmaXJzdCA4IGVsZW1lbnRzLCBjb250aW51ZSBvbiB0aGUgbmV4dCA4IGVsZW1lbnRzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTXVsdGlwbHkgY29udHJpYnV0aW9uIGZyb20gY2hyb21pbmFuY2UsIHJlc3VsdHMgYXJlIGluIDMyLWJpdAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNVUxMLlMxNiAgUTYsIEQyOSwgRDZbMF0gICAgICAgICAgQCBRNjogMzU5KihWNCxWNSxWNixWNykgICAgICAgUmVkCi0gICAgVk1VTEwuUzE2ICBRNywgRDMxLCBENlsxXSAgICAgICAgICBAIFE3OiAtODgqKFU0LFU1LFU2LFU3KSAgICAgIEdyZWVuCi0gICAgVk1MQUwuUzE2ICBRNywgRDI5LCBENlsyXSAgICAgICAgICBAIFE3OiAtODgqKFU0LFU1LFU2LFU3KSAtIDE4MyooVjQsVjUsVjYsVjcpCi0gICAgVk1VTEwuUzE2ICBROCwgRDMxLCBENlszXSAgICAgICAgICBAIFE4OiA0NTQqKFU0LFU1LFU2LFU3KSAgICAgICBCbHVlCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQWRkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWQURELlMzMiAgUTYsIFEwICAgICAgICAgICAgICAgICAgIEAgUTYgYWRkIFJlZCAgIGJpYXMgLTQ1ODI0Ci0gICAgVkFERC5TMzIgIFE3LCBRMSAgICAgICAgICAgICAgICAgICBAIFE3IGFkZCBHcmVlbiBiaWFzICAzNDgxNgotICAgIFZBREQuUzMyICBROCwgUTIgICAgICAgICAgICAgICAgICAgQCBROCBhZGQgQmx1ZSAgYmlhcyAtNTc5ODQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDYWxjdWxhdGUgUmVkLCBHcmVlbiwgQmx1ZQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNT1YuUzMyICAgUTksIFE2Ci0gICAgVk1MQUwuUzE2ICBRNiwgRDI1LCBEN1swXSAgICAgICAgICBAIFE2OiBSOCBSMTAgUjEyIFIxNCBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBROSwgRDI3LCBEN1swXSAgICAgICAgICBAIFE5OiBSOSBSMTEgUjEzIFIxNSBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICBWTU9WLlMzMiAgIFExMCwgUTcKLSAgICBWTUxBTC5TMTYgIFE3LCAgRDI1LCBEN1swXSAgICAgICAgIEAgUTc6IEcwLCBHMiwgRzQsIEc2IGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExMCwgRDI3LCBEN1swXSAgICAgICAgIEAgUTEwIDogRzEsIEczLCBHNSwgRzcgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgVk1PVi5TMzIgICBRMTEsIFE4Ci0gICAgVk1MQUwuUzE2ICBROCwgIEQyNSwgRDdbMF0gICAgICAgICBAIFE4OiBCMCwgQjIsIEI0LCBCNiBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTEsIEQyNywgRDdbMF0gICAgICAgICBAIFExMSA6IEIxLCBCMywgQjUsIEI3IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBSaWdodCBzaGlmdCBlaWdodCBiaXRzIHdpdGggcm91bmRpbmcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWU0hSTi5TMzIgICBEMTIsIFE2LCAgIzggICAgICAgICAgIEAgRDEyOiBSOCBSMTAgUjEyIFIxNCBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDEzLCBROSwgICM4ICAgICAgICAgICBAIEQxMzogUjkgUjExIFIxMyBSMTUgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQxMiwgRDEzICAgICAgICAgICAgICAgQCBRNjogUjggUjkgUjEwIFIxMSBSMTIgUjEzIFIxNCBSMTUKLQotICAgIFZTSFJOLlMzMiAgIEQxOCwgUTcsICAjOCAgICAgICAgICAgQCBEMTg6IEc4IEcxMCBHMTIgRzE0IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMTksIFExMCwgIzggICAgICAgICAgIEAgRDE5OiBHOSBHMTEgRzEzIEcxNSBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlpJUC4xNiAgICAgRDE4LCBEMTkgICAgICAgICAgICAgICBAIFE5OiAgRzggRzkgRzEwIEcxMSBHMTIgRzEzIEcxNCBHMTUKLQotICAgIFZTSFJOLlMzMiAgIEQyMCwgUTgsICAjOCAgICAgICAgICAgQCBEMjA6IEI4IEIxMCBCMTIgQjE0IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMjEsIFExMSwgIzggICAgICAgICAgIEAgRDIxOiBCOSBCMTEgQjEzIEIxNSBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlpJUC4xNiAgICAgRDIwLCBEMjEgICAgICAgICAgICAgICBAIFExMDogQjggQjkgQjEwIEIxMSBCMTIgQjEzIEIxNCBCMTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDbGFtcCB0aGUgdmFsdWUgdG8gYmUgd2l0aGluIFswfjI1NV0KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTUFYLlMxNiAgUTEwLCBRMTAsIFE0ICAgICAgICAgICAgIEAgaWYgUTEwIDwgICAwLCBRMTAgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTEwLCBRMTAsIFE1ICAgICAgICAgICAgIEAgaWYgUTEwID4gMjU1LCBRMTAgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgIEQyMywgUTEwICAgICAgICAgICAgIEAgc3RvcmUgQmx1ZSB0byBEMjMsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTksIFE5LCBRNCAgICAgICAgICAgICAgIEAgaWYgUTkgPCAgIDAsIFE5ID0gICAwCi0gICAgVk1JTi5TMTYgIFE5LCBROSwgUTUgICAgICAgICAgICAgICBAIGlmIFE5ID4gMjU1LCBROSA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICBEMjIsIFE5ICAgICAgICAgICAgICAgQCBzdG9yZSBHcmVlbiB0byBEMjIsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTYsIFE2LCBRNCAgICAgICAgICAgICAgIEAgaWYgUTYgPCAgIDAsIFE2ID0gICAwCi0gICAgVk1JTi5TMTYgIFE2LCBRNiwgUTUgICAgICAgICAgICAgICBAIGlmIFE2ID4gMjU1LCBRNiA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICBEMjEsIFE2ICAgICAgICAgICAgICAgQCBzdG9yZSBSZWQgdG8gRDIxLCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIGFiZ3IgZm9ybWF0IHdpdGggbGVhZGluZyAweEZGIGJ5dGUKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WTi5JMTYgIEQyNCwgUTUgICAgICAgICAgICAgICAgIEAgRDI0OiAgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjOCAgICAgICAgICAgIEAgY2hlY2sgaWYgdGhlIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgQk1JICB0cmFpbGluZ195eXZ1cDJhYmdyICAgICAgICAgICBAIGp1bXAgdG8gdHJhaWxpbmcgcHJvY2Vzc2luZyBpZiByZW1haW5pbmcgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBWU1Q0LlU4ICB7RDIxLEQyMixEMjMsRDI0fSwgW3BfYmdyXSEgICBAIHZlY3RvciBzdG9yZSBCbHVlLCBHcmVlbiwgUmVkIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJlZCBhdCBMU0IKLQotICAgIEJISSBsb29wX3l5dnVwMmFiZ3IgICAgICAgICAgICAgICAgQCBsb29wIGlmIG1vcmUgdGhhbiA4IHBpeGVscyBsZWZ0Ci0KLSAgICBCRVEgIGVuZF95eXZ1cDJhYmdyICAgICAgICAgICAgICAgIEAgZG9uZSBpZiBleGFjdGx5IDggcGl4ZWwgcHJvY2Vzc2VkIGluIHRoZSBsb29wCi0KLQotdHJhaWxpbmdfeXl2dXAyYWJncjoKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgVGhlcmUgYXJlIGZyb20gMSB+IDcgcGl4ZWxzIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQuCi0gICAgICogIEZpcnN0IGFkZGluZyA3IHRvIHRoZSBsZW5ndGggc28gdGhlIGxlbmd0aCB3b3VsZCBiZSBmcm9tIDAgfiA2LgotICAgICAqICBlZzogMSBwaXhlbCBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0LCBzbyAxLTgrNyA9IDAuCi0gICAgICogIFRoZW4gc2F2ZSAxIHBpeGVsIHVuY29uZGl0aW9uYWxseSBzaW5jZSBhdCBsZWFzdCAxIHBpeGVscyBsZWZ0IGluIHRoZQotICAgICAqICB0cmFpbGluZyBwYXJ0LgotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIEFERFMgbGVuZ3RoLCBsZW5ndGgsICM3ICAgICAgICAgICAgQCB0aGVyZSBhcmUgNyBvciBsZXNzIGluIHRoZSB0cmFpbGluZyBwYXJ0Ci0KLSAgICBWU1Q0LlU4IHtEMjFbMF0sRDIyWzBdLEQyM1swXSxEMjRbMF19LCBbcF9iZ3JdISBAIGF0IGxlYXN0IDEgcGl4ZWwgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydAotICAgIEJFUSBlbmRfeXl2dXAyYWJnciAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDQuVTgge0QyMVsxXSxEMjJbMV0sRDIzWzFdLEQyNFsxXX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJhYmdyICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUNC5VOCB7RDIxWzJdLEQyMlsyXSxEMjNbMl0sRDI0WzJdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgZW5kX3l5dnVwMmFiZ3IgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1Q0LlU4IHtEMjFbM10sRDIyWzNdLEQyM1szXSxEMjRbM119LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSBlbmRfeXl2dXAyYWJnciAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDQuVTgge0QyMVs0XSxEMjJbNF0sRDIzWzRdLEQyNFs0XX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJhYmdyICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUNC5VOCB7RDIxWzVdLEQyMls1XSxEMjNbNV0sRDI0WzVdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgZW5kX3l5dnVwMmFiZ3IgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1Q0LlU4IHtEMjFbNl0sRDIyWzZdLEQyM1s2XSxEMjRbNl19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotCi1lbmRfeXl2dXAyYWJncjoKLSAgICBWUE9QICB7RDgtRDE1fQotICAgIExETUZEIFNQISwge1BDfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBlbmQgb2YgeXl2dXAyYWJncgotCi0uZW5kCi0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2FzbS9hcm12Ny9qZGNvbG9yLWFybXY3LlMgYi9saWJqcGVndHdycC9hc20vYXJtdjcvamRjb2xvci1hcm12Ny5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmRhNmQ1Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2FzbS9hcm12Ny9qZGNvbG9yLWFybXY3LlMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogamRjb2xvci1hcm12Ny5TCi0qCi0qICBDb3B5cmlnaHQgKGMpIDIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0qICBtZXQ6Ci0qICAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKiAgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotKiAgICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotKiAgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBDb2RlIEF1cm9yYSBGb3J1bSwgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotKiAgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0qICAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0qCi0qICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0qICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0qICBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0qICBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0qICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSogIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0qICBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0qICBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogICAgICAgICAgICAgICAgICAgICAgICAgRlVOQ1RJT04gTElTVAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIC0geXZ1cDJiZ3I4ODhfdmVudW0KLSogLSB5eXZ1cDJiZ3I4ODhfdmVudW0KLSoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotICAgIC5zZWN0aW9uIHl2dV9wbGFpbl90b19iZ3IsICJ4IiAgICAgQCBBUkVBCi0gICAgLnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHwudGV4dHwsIENPREUsIFJFQURPTkxZCi0gICAgLmFsaWduIDIKLSAgICAuY29kZSAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ09ERTMyCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgQVJNIFJlZ2lzdGVycwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotcF95ICAgICAgIC5yZXEgcjAKLXBfY3IgICAgICAucmVxIHIxCi1wX2NiICAgICAgLnJlcSByMgotcF9yZ2IgICAgIC5yZXEgcjMKLXBfYmdyICAgICAucmVxIHIzCi1sZW5ndGggICAgLnJlcSByMTIKLQotICAgIC5nbG9iYWwgeXZ1cDJiZ3I4ODhfdmVudW0KLSAgICAuZ2xvYmFsIHl5dnVwMmJncjg4OF92ZW51bQotCi1AIGNvZWZmaWNpZW50cyBpbiBjb2xvciBjb252ZXJzaW9uIG1hdHJpeCBtdWx0aXBsaWNhdGlvbgotLmVxdSBDT0VGRl9ZLCAgICAgICAgICAyNTYgICAgICAgICAgICAgQCBjb250cmlidXRpb24gb2YgWQotLmVxdSBDT0VGRl9WX1JFRCwgICAgICAzNTkgICAgICAgICAgICAgQCBjb250cmlidXRpb24gb2YgViBmb3IgcmVkCi0uZXF1IENPRUZGX1VfR1JFRU4sICAgIC04OCAgICAgICAgICAgICBAIGNvbnRyaWJ1dGlvbiBvZiBVIGZvciBncmVlbgotLmVxdSBDT0VGRl9WX0dSRUVOLCAgIC0xODMgICAgICAgICAgICAgQCBjb250cmlidXRpb24gb2YgViBmb3IgZ3JlZW4KLS5lcXUgQ09FRkZfVV9CTFVFLCAgICAgNDU0ICAgICAgICAgICAgIEAgY29udHJpYnV0aW9uIG9mIFUgZm9yIGJsdWUKLQotQCBDbGFtcGluZyBjb25zdGFudHMgMHgwIGFuZCAweEZGCi0uZXF1IENPRUZGXzAsICAgICAgICAgIDAKLS5lcXUgQ09FRkZfMjU1LCAgICAgICAgMjU1Ci0KLUAgQmlhcyBjb2VmZmljaWVudHMgZm9yIHJlZCwgZ3JlZW4gYW5kIGJsdWUKLS5lcXUgQ09FRkZfQklBU19SLCAgIC00NTgyNCAgICAgICAgICAgIEAgUmVkICAgYmlhcyA9ICAgICAtMzU5KjEyOCArIDEyOAotLmVxdSBDT0VGRl9CSUFTX0csICAgIDM0ODE2ICAgICAgICAgICAgQCBHcmVlbiBiaWFzID0gKDg4KzE4MykqMTI4ICsgMTI4Ci0uZXF1IENPRUZGX0JJQVNfQiwgICAtNTc5ODQgICAgICAgICAgICBAIEJsdWUgIGJpYXMgPSAgICAgLTQ1NCoxMjggKyAxMjgKLQotY29uc3RhbnRzOgotICAgIC5od29yZCAoQ09FRkZfVl9SRUQpLCAgKENPRUZGX1VfR1JFRU4pLCAoQ09FRkZfVl9HUkVFTiksIChDT0VGRl9VX0JMVUUpIEAgICAzNTkgIHwgLTg4ICAgfCAgLTE4MyAgfCA0NTQKLSAgICAuaHdvcmQgKENPRUZGX1kpLCAgICAgIChDT0VGRl8wKSwgICAgICAgKENPRUZGXzI1NSkgICAgLCAoQ09FRkZfMCkgICAgICBAICAgMjU2ICB8ICAgMCAgIHwgICAyNTUgIHwgIDAKLSAgICAud29yZCAgKENPRUZGX0JJQVNfUiksIChDT0VGRl9CSUFTX0cpLCAgKENPRUZGX0JJQVNfQikgICAgICAgICAgICAgICAgICBAIC00NTgyNCB8IDM0ODE2IHwgLTU3OTg0IHwgIFgKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBGVU5DVElPTiAgICAgOiB5dnVwMmJncjg4OF92ZW51bQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIERFU0NSSVBUSU9OICA6IFBlcmZvcm0gWVZVIHBsYW5hciB0byBCR1I4ODggY29udmVyc2lvbi4KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBDIFBST1RPVFlQRSAgOiB2b2lkIHl2dXAyYmdyODg4X3ZlbnVtKHVpbnQ4X3QgICpwX3ksCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfY3IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfY2IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfYmdyODg4LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICBsZW5ndGgpCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIElOUFVUICAgIDogUjA6IHVpbnQ4X3QgICpwX3kKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgWSBMaW5lCi0qICAgICAgICAgICAgICAgIFIxOiB1aW50OF90ICAqcF9jcgotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBDciBMaW5lCi0qICAgICAgICAgICAgICAgIFIyOiB1aW50OF90ICAqcF9jYgotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBDYiBMaW5lCi0qICAgICAgICAgICAgICAgIFIzOiB1aW50OF90ICAqcF9iZ3I4ODgKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IEJHUiBMaW5lCi0qICAgICAgICAgICAgICAgIFIxMjogdWludDMyX3QgIGxlbmd0aAotKiAgICAgICAgICAgICAgICAgICAgICB3aWR0aCBvZiBMaW5lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogU1RBQ0sgQVJHICAgIDogTm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBPVVRQVVQgICA6IE5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBNRU0gSU5QVVQgICAgOiBwX3kgICAgICAtIGEgbGluZSBvZiBZIHBpeGVscwotKiAgICAgICAgICAgICAgICBwX2NyICAgICAtIGEgbGluZSBvZiBDciBwaXhlbHMKLSogICAgICAgICAgICAgICAgcF9jYiAgICAgLSBhIGxpbmUgb2YgQ2IgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIGxlbmd0aCAgIC0gdGhlIHdpZHRoIG9mIHRoZSBpbnB1dCBsaW5lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTUVNIE9VVFBVVCAgIDogcF9iZ3I4ODggLSB0aGUgY29udmVydGVkIGJnciBwaXhlbHMKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgQUZGRUNURUQgOiBBUk06ICBSMC1SNCwgUjEyCi0qICAgICAgICAgICAgICAgIE5FT046IFEwLVExNQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFNUQUNLIFVTQUdFICA6IG5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBDWUNMRVMgICAgICAgOiBub25lCi0qCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTk9URVMgICAgICAgIDoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLS50eXBlIHl2dXAyYmdyODg4X3ZlbnVtLCAlZnVuY3Rpb24KLXl2dXAyYmdyODg4X3ZlbnVtOgotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFN0b3JlIHN0YWNrIHJlZ2lzdGVycwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFNUTUZEIFNQISwge0xSfQotCi0gICAgVlBVU0gge0Q4LUQxNX0KLQotICAgIFBMRCBbUjAsIFIzXSAgICAgICAgICAgICAgICAgICAgICBAIHByZWxvYWQgbHVtYSBsaW5lCi0KLSAgICBBRFIgICBSMTIsIGNvbnN0YW50cwotCi0gICAgVkxEMS5TMTYgIHtENiwgRDd9LCBbUjEyXSEgICAgICAgIEAgRDYsIEQ3OiAzNTkgfCAtODggfCAtMTgzIHwgNDU0IHwgMjU2IHwgMCB8IDI1NSB8IDAKLSAgICBWTEQxLlMzMiAge0QzMCwgRDMxfSwgW1IxMl0gICAgICAgQCBRMTUgICA6ICAtNDU4MjQgICB8ICAgIDM0ODE2ICAgfCAgLTU3OTg0IHwgICAgIFgKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIHRoZSA1dGggcGFyYW1ldGVyIHZpYSBzdGFjawotICAgICAqICBSMCB+IFIzIGFyZSB1c2VkIHRvIHBhc3MgdGhlIGZpcnN0IDQgcGFyYW1ldGVycywgdGhlIDV0aCBhbmQgYWJvdmUKLSAgICAgKiAgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHZpYSBzdGFjawotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIExEUiBSMTIsIFtTUCwgIzY4XSAgICAgICAgICAgICAgICAgQCBMUiBpcyBwdXNoZWQgaW50byB0aGUgc3RhY2sgc28gU1AgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZGVjcmVhc2VkIGJ5IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEQ4LUQxNSBhcmUgYWxzbyBwdXNoZWQgaW50byB0aGUgc3RhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc28gU1AgaXMgZGVjcmVhc2VkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDgtYnl0ZS9ELVJlZ2lzdGVyICogOCBELVJlZ2lzdGVycyA9IDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzbyBTUCBuZWVkcyB0byBiZSBpbmNyZWFzZWQgYnkgNjQrND02OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0byBnZXQgdGhlIHZhbHVlIHRoYXQgd2FzIGZpcnN0IHB1c2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbnRvIHN0YWNrICh0aGUgNXRoIHBhcmFtZXRlciBwYXNzZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdGhyb3VnaHQgc3RhY2spCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCBjbGFtcGluZyBwYXJhbWV0ZXJzIHRvIGR1cGxpY2F0ZSB2ZWN0b3IgZWxlbWVudHMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWRFVQLlMxNiAgUTQsICBEN1sxXSAgICAgICAgICAgICAgQCBRNDogIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAKLSAgICBWRFVQLlMxNiAgUTUsICBEN1syXSAgICAgICAgICAgICAgQCBRNTogMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmVhZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkRVUC5TMzIgIFEwLCAgIEQzMFswXSAgICAgICAgICAgIEAgUTA6ICAtNDU4MjQgfCAtNDU4MjQgfCAtNDU4MjQgfCAtNDU4MjQKLSAgICBWRFVQLlMzMiAgUTEsICAgRDMwWzFdICAgICAgICAgICAgQCBRMTogICAzNDgxNiB8ICAzNDgxNiB8ICAzNDgxNiB8ICAzNDgxNgotICAgIFZEVVAuUzMyICBRMiwgICBEMzFbMF0gICAgICAgICAgICBAIFEyOiAgLTU3OTg0IHwgLTU3OTg0IHwgLTU3OTg0IHwgLTU3OTg0Ci0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBUaGUgbWFpbiBsb29wCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1sb29wX3l2dXAyYmdyODg4OgotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgaW5wdXQgZnJvbSBZLCBWIGFuZCBVCi0gICAgICogIEQxMiAgOiBZMCAgWTEgIFkyICBZMyAgWTQgIFk1ICBZNiAgWTcKLSAgICAgKiAgRDE0ICA6IFYwICBWMSAgVjIgIFYzICBWNCAgVjUgIFY2ICBWNwotICAgICAqICBEMTUgIDogVTAgIFUxICBVMiAgVTMgIFU0ICBVNSAgVTYgIFU3Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkxEMS5VOCAge0QxMn0sICBbcF95XSEgICAgICAgICAgIEAgTG9hZCA4IEx1bWEgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTIKLSAgICBWTEQxLlU4ICB7RDE0fSwgIFtwX2NyXSEgICAgICAgICAgQCBMb2FkIDggQ3IgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTQKLSAgICBWTEQxLlU4ICB7RDE1fSwgIFtwX2NiXSEgICAgICAgICAgQCBMb2FkIDggQ2IgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBFeHBhbmQgdWludDggdmFsdWUgdG8gdWludDE2Ci0gICAgICogIEQxOCwgRDE5OiBZMCBZMSBZMiBZMyBZNCBZNSBZNiBZNwotICAgICAqICBEMjAsIEQyMTogVjAgVjEgVjIgVjMgVjQgVjUgVjYgVjcKLSAgICAgKiAgRDIyLCBEMjM6IFUwIFUxIFUyIFUzIFU0IFU1IFU2IFU3Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1PVkwuVTggUTksICBEMTIKLSAgICBWTU9WTC5VOCBRMTAsIEQxNAotICAgIFZNT1ZMLlU4IFExMSwgRDE1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTXVsdGlwbHkgY29udHJpYnV0aW9uIGZyb20gY2hyb21pbmFuY2UsIHJlc3VsdHMgYXJlIGluIDMyLWJpdAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNVUxMLlMxNiAgUTEyLCBEMjAsIEQ2WzBdICAgICAgICBAIFExMjogIDM1OSooVjAsVjEsVjIsVjMpICAgICBSZWQKLSAgICBWTVVMTC5TMTYgIFExMywgRDIyLCBENlsxXSAgICAgICAgQCBRMTM6ICAtODgqKFUwLFUxLFUyLFUzKSAgICAgR3JlZW4KLSAgICBWTUxBTC5TMTYgIFExMywgRDIwLCBENlsyXSAgICAgICAgQCBRMTM6ICAtODgqKFUwLFUxLFUyLFUzKSAtIDE4MyooVjAsVjEsVjIsVjMpCi0gICAgVk1VTEwuUzE2ICBRMTQsIEQyMiwgRDZbM10gICAgICAgIEAgUTE0OiAgNDU0KihVMCxVMSxVMixVMykgICAgIEJsdWUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBBZGQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZBREQuUzMyICBRMTIsIFEwICAgICAgICAgICAgICAgICBAIFExMiBhZGQgUmVkICAgYmlhcyAtNDU4MjQKLSAgICBWQURELlMzMiAgUTEzLCBRMSAgICAgICAgICAgICAgICAgQCBRMTMgYWRkIEdyZWVuIGJpYXMgIDM0ODE2Ci0gICAgVkFERC5TMzIgIFExNCwgUTIgICAgICAgICAgICAgICAgIEAgUTE0IGFkZCBCbHVlICBiaWFzIC01Nzk4NAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENhbGN1bGF0ZSBSZWQsIEdyZWVuLCBCbHVlCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1MQUwuUzE2ICBRMTIsIEQxOCwgRDdbMF0gICAgICAgIEAgUTEyOiBSMCwgUjEsIFIyLCBSMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTMsIEQxOCwgRDdbMF0gICAgICAgIEAgUTEzOiBHMCwgRzEsIEcyLCBHMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTQsIEQxOCwgRDdbMF0gICAgICAgIEAgUTE0OiBCMCwgQjEsIEIyLCBCMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmlnaHQgc2hpZnQgZWlnaHQgYml0cyB3aXRoIHJvdW5kaW5nCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNIUk4uUzMyICAgRDE4ICwgUTEyLCAjOCAgICAgICAgIEAgRDE4OiBSMCwgUjEsIFIyLCBSMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIwICwgUTEzLCAjOCAgICAgICAgIEAgRDIwOiBHMCwgRzEsIEcyLCBHMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIyLCAgUTE0LCAjOCAgICAgICAgIEAgRDIyOiBCMCwgQjEsIEIyLCBCMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgRG9uZSB3aXRoIHRoZSBmaXJzdCA0IGVsZW1lbnRzLCBjb250aW51ZSBvbiB0aGUgbmV4dCA0IGVsZW1lbnRzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTXVsdGlwbHkgY29udHJpYnV0aW9uIGZyb20gY2hyb21pbmFuY2UsIHJlc3VsdHMgYXJlIGluIDMyLWJpdAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNVUxMLlMxNiAgUTEyLCBEMjEsIEQ2WzBdICAgICAgICBAIFExMjogIDM1OSooVjAsVjEsVjIsVjMpICAgICBSZWQKLSAgICBWTVVMTC5TMTYgIFExMywgRDIzLCBENlsxXSAgICAgICAgQCBRMTM6ICAtODgqKFUwLFUxLFUyLFUzKSAgICAgR3JlZW4KLSAgICBWTUxBTC5TMTYgIFExMywgRDIxLCBENlsyXSAgICAgICAgQCBRMTM6ICAtODgqKFUwLFUxLFUyLFUzKSAtIDE4MyooVjAsVjEsVjIsVjMpCi0gICAgVk1VTEwuUzE2ICBRMTQsIEQyMywgRDZbM10gICAgICAgIEAgUTE0OiAgNDU0KihVMCxVMSxVMixVMykgICAgIEJsdWUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBBZGQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZBREQuUzMyICBRMTIsIFEwICAgICAgICAgICAgICAgICBAIFExMiBhZGQgUmVkICAgYmlhcyAtNDU4MjQKLSAgICBWQURELlMzMiAgUTEzLCBRMSAgICAgICAgICAgICAgICAgQCBRMTMgYWRkIEdyZWVuIGJpYXMgIDM0ODE2Ci0gICAgVkFERC5TMzIgIFExNCwgUTIgICAgICAgICAgICAgICAgIEAgUTE0IGFkZCBCbHVlICBiaWFzIC01Nzk4NAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENhbGN1bGF0ZSBSZWQsIEdyZWVuLCBCbHVlCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1MQUwuUzE2ICBRMTIsIEQxOSwgRDdbMF0gICAgICAgIEAgUTEyOiBSMCwgUjEsIFIyLCBSMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTMsIEQxOSwgRDdbMF0gICAgICAgIEAgUTEzOiBHMCwgRzEsIEcyLCBHMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTQsIEQxOSwgRDdbMF0gICAgICAgIEAgUTE0OiBCMCwgQjEsIEIyLCBCMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmlnaHQgc2hpZnQgZWlnaHQgYml0cyB3aXRoIHJvdW5kaW5nCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNIUk4uUzMyICAgRDE5ICwgUTEyLCAjOCAgICAgICAgIEAgRDE4OiBSMCwgUjEsIFIyLCBSMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIxICwgUTEzLCAjOCAgICAgICAgIEAgRDIwOiBHMCwgRzEsIEcyLCBHMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIzLCAgUTE0LCAjOCAgICAgICAgIEAgRDIyOiBCMCwgQjEsIEIyLCBCMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2xhbXAgdGhlIHZhbHVlIHRvIGJlIHdpdGhpbiBbMH4yNTVdCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1BWC5TMTYgIFExMSwgUTExLCBRNCAgICAgICAgICAgIEAgaWYgUTExIDwgICAwLCBRMTEgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTExLCBRMTEsIFE1ICAgICAgICAgICAgQCBpZiBRMTEgPiAyNTUsIFExMSA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICAgRDI4LCBRMTEgICAgICAgICAgICBAIHN0b3JlIEJsdWUgdG8gRDI4LCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgVk1BWC5TMTYgIFExMCwgUTEwLCBRNCAgICAgICAgICAgIEAgaWYgUTEwIDwgICAwLCBRMTAgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTEwLCBRMTAsIFE1ICAgICAgICAgICAgQCBpZiBRMTAgPiAyNTUsIFExMCA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICAgRDI3LCBRMTAgICAgICAgICAgICBAIHN0b3JlIEdyZWVuIHRvIEQyNywgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICAgIFE5LCBROSwgUTQgICAgICAgICAgICBAIGlmIFE5IDwgICAwLCBROSA9ICAgMAotICAgIFZNSU4uUzE2ICAgIFE5LCBROSwgUTUgICAgICAgICAgICBAIGlmIFE5ID4gMjU1LCBROSA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICAgIEQyNiwgUTkgICAgICAgICAgICBAIHN0b3JlIFJlZCB0byBEMjYsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4LgotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzggICAgICAgICAgIEAgY2hlY2sgaWYgdGhlIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgQk1JICB0cmFpbGluZ195dnVwMmJncjg4OCAgICAgICAgIEAganVtcCB0byB0cmFpbGluZyBwcm9jZXNzaW5nIGlmIHJlbWFpbmluZyBsZW5ndGggaXMgbGVzcyB0aGFuIDgKLQotICAgIFZTVDMuVTggIHtEMjYsRDI3LEQyOH0sIFtwX2Jncl0hICBAIHZlY3RvciBzdG9yZSBSZWQsIEdyZWVuLCBCbHVlIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQmx1ZSBhdCBMU0IKLQotICAgIEJISSBsb29wX3l2dXAyYmdyODg4ICAgICAgICAgICAgICBAIGxvb3AgaWYgbW9yZSB0aGFuIDggcGl4ZWxzIGxlZnQKLQotICAgIEJFUSAgZW5kX3l2dXAyYmdyODg4ICAgICAgICAgICAgICBAIGRvbmUgaWYgZXhhY3RseSA4IHBpeGVsIHByb2Nlc3NlZCBpbiB0aGUgbG9vcAotCi0KLXRyYWlsaW5nX3l2dXAyYmdyODg4OgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBUaGVyZSBhcmUgZnJvbSAxIH4gNyBwaXhlbHMgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydC4KLSAgICAgKiAgRmlyc3QgYWRkaW5nIDcgdG8gdGhlIGxlbmd0aCBzbyB0aGUgbGVuZ3RoIHdvdWxkIGJlIGZyb20gMCB+IDYuCi0gICAgICogIGVnOiAxIHBpeGVsIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQsIHNvIDEtOCs3ID0gMC4KLSAgICAgKiAgVGhlbiBzYXZlIDEgcGl4ZWwgdW5jb25kaXRpb25hbGx5IHNpbmNlIGF0IGxlYXN0IDEgcGl4ZWxzIGxlZnQgaW4gdGhlCi0gICAgICogIHRyYWlsaW5nIHBhcnQuCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgQUREUyBsZW5ndGgsIGxlbmd0aCwgIzcgICAgICAgICAgIEAgdGhlcmUgYXJlIDcgb3IgbGVzcyBpbiB0aGUgdHJhaWxpbmcgcGFydAotCi0gICAgVlNUMy5VOCB7RDI2WzBdLCBEMjdbMF0sIEQyOFswXX0sIFtwX2Jncl0hIEAgYXQgbGVhc3QgMSBwaXhlbCBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0Ci0gICAgQkVRICBlbmRfeXZ1cDJiZ3I4ODggICAgICAgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDMuVTgge0QyNlsxXSwgRDI3WzFdLCBEMjhbMV19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAyYmdyODg4ICAgICAgICAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMy5VOCB7RDI2WzJdLCBEMjdbMl0sIEQyOFsyXX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRICBlbmRfeXZ1cDJiZ3I4ODggICAgICAgICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QzLlU4IHtEMjZbM10sIEQyN1szXSwgRDI4WzNdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgIGVuZF95dnVwMmJncjg4OCAgICAgICAgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDMuVTgge0QyNls0XSwgRDI3WzRdLCBEMjhbNF19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAyYmdyODg4ICAgICAgICAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMy5VOCB7RDI2WzVdLCBEMjdbNV0sIEQyOFs1XX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRICBlbmRfeXZ1cDJiZ3I4ODggICAgICAgICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QzLlU4IHtEMjZbNl0sIEQyN1s2XSwgRDI4WzZdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLQotZW5kX3l2dXAyYmdyODg4OgotICAgIFZQT1AgIHtEOC1EMTV9Ci0gICAgTERNRkQgU1AhLCB7UEN9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBlbmQgb2YgeXZ1cDJiZ3I4ODgKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogRlVOQ1RJT04gICAgIDogeXl2dXAyYmdyODg4X3ZlbnVtCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogREVTQ1JJUFRJT04gIDogUGVyZm9ybSBZWVZVIHBsYW5hciB0byBCR1I4ODggY29udmVyc2lvbi4KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBDIFBST1RPVFlQRSAgOiB2b2lkIHl5dnVwMmJncjg4OF92ZW51bSh1aW50OF90ICAqcF95LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAqcF9jciwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfY2IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2Jncjg4OCwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgIGxlbmd0aCkKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgSU5QVVQgICAgOiBSMDogdWludDhfdCAgKnBfeQotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBZIExpbmUKLSogICAgICAgICAgICAgICAgUjE6IHVpbnQ4X3QgICpwX2NyCi0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IENyIExpbmUKLSogICAgICAgICAgICAgICAgUjI6IHVpbnQ4X3QgICpwX2NiCi0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IENiIExpbmUKLSogICAgICAgICAgICAgICAgUjM6IHVpbnQ4X3QgICpwX2Jncjg4OAotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgQkdSIExpbmUKLSogICAgICAgICAgICAgICAgUjEyOiB1aW50MzJfdCAgbGVuZ3RoCi0qICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIG9mIExpbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBTVEFDSyBBUkcgICAgOiBOb25lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIE9VVFBVVCAgIDogTm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIE1FTSBJTlBVVCAgICA6IHBfeSAgICAgIC0gYSBsaW5lIG9mIFkgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIHBfY3IgICAgIC0gYSBsaW5lIG9mIENyIHBpeGVscwotKiAgICAgICAgICAgICAgICBwX2NiICAgICAtIGEgbGluZSBvZiBDYiBwaXhlbHMKLSogICAgICAgICAgICAgICAgbGVuZ3RoICAgLSB0aGUgd2lkdGggb2YgdGhlIGlucHV0IGxpbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBNRU0gT1VUUFVUICAgOiBwX2Jncjg4OCAtIHRoZSBjb252ZXJ0ZWQgYmdyIHBpeGVscwotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBBRkZFQ1RFRCA6IEFSTTogIFIwLVI0LCBSMTIKLSogICAgICAgICAgICAgICAgTkVPTjogUTAtUTE1Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogU1RBQ0sgVVNBR0UgIDogbm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIENZQ0xFUyAgICAgICA6IG5vbmUKLSoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBOT1RFUyAgICAgICAgOgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotLnR5cGUgeXl2dXAyYmdyODg4X3ZlbnVtLCAlZnVuY3Rpb24KLXl5dnVwMmJncjg4OF92ZW51bToKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgU3RvcmUgc3RhY2sgcmVnaXN0ZXJzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgU1RNRkQgU1AhLCB7TFJ9Ci0KLSAgICBWUFVTSCB7RDgtRDE1fQotCi0gICAgUExEIFtSMCwgUjNdICAgICAgICAgICAgICAgICAgICAgICBAIHByZWxvYWQgbHVtYSBsaW5lCi0KLSAgICBBRFIgICBSMTIsIGNvbnN0YW50cwotCi0gICAgVkxEMS5TMTYgIHtENiwgRDd9LCBbUjEyXSEgICAgICAgICBAIEQ2LCBENzogMzU5IHwgLTg4IHwgLTE4MyB8IDQ1NCB8IDI1NiB8IDAgfCAyNTUgfCAwCi0gICAgVkxEMS5TMzIgIHtEMzAsIEQzMX0sIFtSMTJdICAgICAgICBAIFExNSAgIDogIC00NTgyNCAgIHwgICAgMzQ4MTYgICB8ICAtNTc5ODQgfCAgICAgWAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgdGhlIDV0aCBwYXJhbWV0ZXIgdmlhIHN0YWNrCi0gICAgICogIFIwIH4gUjMgYXJlIHVzZWQgdG8gcGFzcyB0aGUgZmlyc3QgNCBwYXJhbWV0ZXJzLCB0aGUgNXRoIGFuZCBhYm92ZQotICAgICAqICBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdmlhIHN0YWNrCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgTERSIFIxMiwgW1NQLCAjNjhdICAgICAgICAgICAgICAgICBAIExSIGlzIHB1c2hlZCBpbnRvIHRoZSBzdGFjayBzbyBTUCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkZWNyZWFzZWQgYnkgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRDgtRDE1IGFyZSBhbHNvIHB1c2hlZCBpbnRvIHRoZSBzdGFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzbyBTUCBpcyBkZWNyZWFzZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgOC1ieXRlL0QtUmVnaXN0ZXIgKiA4IEQtUmVnaXN0ZXJzID0gNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNvIFNQIG5lZWRzIHRvIGJlIGluY3JlYXNlZCBieSA2NCs0PTY4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRvIGdldCB0aGUgdmFsdWUgdGhhdCB3YXMgZmlyc3QgcHVzaGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGludG8gc3RhY2sgKHRoZSA1dGggcGFyYW1ldGVyIHBhc3NlZCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0aHJvdWdodCBzdGFjaykKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIGNsYW1waW5nIHBhcmFtZXRlcnMgdG8gZHVwbGljYXRlIHZlY3RvciBlbGVtZW50cwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZEVVAuUzE2ICBRNCwgIEQ3WzFdICAgICAgICAgICAgICAgQCBRNDogIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAKLSAgICBWRFVQLlMxNiAgUTUsICBEN1syXSAgICAgICAgICAgICAgIEAgUTU6IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFJlYWQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZEVVAuUzMyICBRMCwgICBEMzBbMF0gICAgICAgICAgICAgQCBRMDogIC00NTgyNCB8IC00NTgyNCB8IC00NTgyNCB8IC00NTgyNAotICAgIFZEVVAuUzMyICBRMSwgICBEMzBbMV0gICAgICAgICAgICAgQCBRMTogICAzNDgxNiB8ICAzNDgxNiB8ICAzNDgxNiB8ICAzNDgxNgotICAgIFZEVVAuUzMyICBRMiwgICBEMzFbMF0gICAgICAgICAgICAgQCBRMjogIC03MDY4OCB8IC03MDY4OCB8IC03MDY4OCB8IC03MDY4OAotCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgVGhlIG1haW4gbG9vcAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotbG9vcF95eXZ1cDJiZ3I4ODg6Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCBpbnB1dCBmcm9tIFksIFYgYW5kIFUKLSAgICAgKiAgRDEyLCBEMTM6IFkwIFkyIFk0IFk2IFk4IFkxMCBZMTIgWTE0LCBZMSBZMyBZNSBZNyBZOSBZMTEgWTEzIFkxNQotICAgICAqICBEMTQgIDogVjAgIFYxICBWMiAgVjMgIFY0ICBWNSAgVjYgIFY3Ci0gICAgICogIEQxNSAgOiBVMCAgVTEgIFUyICBVMyAgVTQgIFU1ICBVNiAgVTcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTEQyLlU4ICB7RDEyLEQxM30sIFtwX3ldISAgICAgICAgIEAgTG9hZCAxNiBMdW1hIGVsZW1lbnRzICh1aW50OCkgdG8gRDEyLCBEMTMKLSAgICBWTEQxLlU4ICB7RDE0fSwgIFtwX2NyXSEgICAgICAgICAgIEAgTG9hZCA4IENyIGVsZW1lbnRzICh1aW50OCkgdG8gRDE0Ci0gICAgVkxEMS5VOCAge0QxNX0sICBbcF9jYl0hICAgICAgICAgICBAIExvYWQgOCBDYiBlbGVtZW50cyAodWludDgpIHRvIEQxNQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEV4cGFuZCB1aW50OCB2YWx1ZSB0byB1aW50MTYKLSAgICAgKiAgRDI0LCBEMjU6IFkwIFkyIFk0IFk2IFk4IFkxMCBZMTIgWTE0Ci0gICAgICogIEQyNiwgRDI3OiBZMSBZMyBZNSBZNyBZOSBZMTEgWTEzIFkxNQotICAgICAqICBEMjgsIEQyOTogVjAgVjEgVjIgVjMgVjQgVjUgIFY2ICBWNwotICAgICAqICBEMzAsIEQzMTogVTAgVTEgVTIgVTMgVTQgVTUgIFU2ICBVNwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNT1ZMLlU4IFExMiwgRDEyCi0gICAgVk1PVkwuVTggUTEzLCBEMTMKLSAgICBWTU9WTC5VOCBRMTQsIEQxNAotICAgIFZNT1ZMLlU4IFExNSwgRDE1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTXVsdGlwbHkgY29udHJpYnV0aW9uIGZyb20gY2hyb21pbmFuY2UsIHJlc3VsdHMgYXJlIGluIDMyLWJpdAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNVUxMLlMxNiAgUTYsIEQyOCwgRDZbMF0gICAgICAgICAgQCBRNjogIDM1OSooVjAsVjEsVjIsVjMpICAgICBSZWQKLSAgICBWTVVMTC5TMTYgIFE3LCBEMzAsIEQ2WzFdICAgICAgICAgIEAgUTc6IC04OCooVTAsVTEsVTIsVTMpICAgICBHcmVlbgotICAgIFZNTEFMLlMxNiAgUTcsIEQyOCwgRDZbMl0gICAgICAgICAgQCBxNzogLTg4KihVMCxVMSxVMixVMykgLSAxODMqKFYwLFYxLFYyLFYzKQotICAgIFZNVUxMLlMxNiAgUTgsIEQzMCwgRDZbM10gICAgICAgICAgQCBxODogIDQ1NCooVTAsVTEsVTIsVTMpICAgICBCbHVlCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQWRkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWQURELlMzMiAgUTYsIFEwICAgICAgICAgICAgICAgICAgIEAgUTYgYWRkIFJlZCAgIGJpYXMgLTQ1ODI0Ci0gICAgVkFERC5TMzIgIFE3LCBRMSAgICAgICAgICAgICAgICAgICBAIFE3IGFkZCBHcmVlbiBiaWFzICAzNDgxNgotICAgIFZBREQuUzMyICBROCwgUTIgICAgICAgICAgICAgICAgICAgQCBROCBhZGQgQmx1ZSAgYmlhcyAtNTc5ODQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDYWxjdWxhdGUgUmVkLCBHcmVlbiwgQmx1ZQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNT1YuUzMyICAgUTksIFE2Ci0gICAgVk1MQUwuUzE2ICBRNiwgRDI0LCBEN1swXSAgICAgICAgICBAIFE2OiBSMCwgUjIsIFI0LCBSNiBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBROSwgRDI2LCBEN1swXSAgICAgICAgICBAIFE5OiBSMSwgUjMsIFI1LCBSNyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICBWTU9WLlMzMiAgIFExMCwgUTcKLSAgICBWTUxBTC5TMTYgIFE3LCAgRDI0LCBEN1swXSAgICAgICAgIEAgUTc6ICBHMCwgRzIsIEc0LCBHNiBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTAsIEQyNiwgRDdbMF0gICAgICAgICBAIFExMDogRzEsIEczLCBHNSwgRzcgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgVk1PVi5TMzIgICBRMTEsIFE4Ci0gICAgVk1MQUwuUzE2ICBROCwgIEQyNCwgRDdbMF0gICAgICAgICBAIFE4OiAgQjAsIEIyLCBCNCwgQjYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTExLCBEMjYsIEQ3WzBdICAgICAgICAgQCBRMTE6IEIxLCBCMywgQjUsIEI3IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBSaWdodCBzaGlmdCBlaWdodCBiaXRzIHdpdGggcm91bmRpbmcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWU0hSTi5TMzIgICBEMTIsIFE2LCAgIzggICAgICAgICAgIEAgRDEyOiBSMCBSMiBSNCBSNiBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDEzLCBROSwgICM4ICAgICAgICAgICBAIEQxMzogUjEgUjMgUjUgUjcgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQxMiwgRDEzICAgICAgICAgICAgICAgQCBRNiA6IFIwIFIxIFIyIFIzIFI0IFI1IFI2IFI3Ci0KLSAgICBWU0hSTi5TMzIgICBEMTgsIFE3LCAgIzggICAgICAgICAgIEAgRDE4OiBHMCBHMiBHNCBHNiBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDE5LCBRMTAsICM4ICAgICAgICAgICBAIEQxOTogRzEgRzMgRzUgRzcgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQxOCwgRDE5ICAgICAgICAgICAgICAgQCBROSA6IEcwIEcxIEcyIEczIEc0IEc1IEc2IEc3Ci0KLSAgICBWU0hSTi5TMzIgICBEMjAsIFE4LCAgIzggICAgICAgICAgIEAgRDIwOiBCMCBCMiBCNCBCNiBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIxLCBRMTEsICM4ICAgICAgICAgICBAIEQyMTogQjEgQjMgQjUgQjcgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQyMCwgRDIxICAgICAgICAgICAgICAgQCBRMTA6IEIwIEIxIEIyIEIzIEI0IEI1IEI2IEI3Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2xhbXAgdGhlIHZhbHVlIHRvIGJlIHdpdGhpbiBbMH4yNTVdCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1BWC5TMTYgIFExMCwgUTEwLCBRNCAgICAgICAgICAgICBAIGlmIFExMCA8ICAgMCwgUTEwID0gICAwCi0gICAgVk1JTi5TMTYgIFExMCwgUTEwLCBRNSAgICAgICAgICAgICBAIGlmIFExMCA+IDI1NSwgUTEwID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgICBEMjMsIFExMCAgICAgICAgICAgICBAIHN0b3JlIEJsdWUgdG8gRDIzLCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgVk1BWC5TMTYgIFE5LCBROSwgUTQgICAgICAgICAgICAgICBAIGlmIFE5IDwgICAwLCBROSA9ICAgMAotICAgIFZNSU4uUzE2ICBROSwgUTksIFE1ICAgICAgICAgICAgICAgQCBpZiBROSA+IDI1NSwgUTkgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgRDIyLCBROSAgICAgICAgICAgICAgIEAgc3RvcmUgR3JlZW4gdG8gRDIyLCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgVk1BWC5TMTYgIFE2LCBRNiwgUTQgICAgICAgICAgICAgICBAIGlmIFE2IDwgICAwLCBRNiA9ICAgMAotICAgIFZNSU4uUzE2ICBRNiwgUTYsIFE1ICAgICAgICAgICAgICAgQCBpZiBRNiA+IDI1NSwgUTYgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgRDIxLCBRNiAgICAgICAgICAgICAgIEAgc3RvcmUgUmVkIHRvIEQyMSwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICM4ICAgICAgICAgICAgQCBjaGVjayBpZiB0aGUgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBCTUkgIHRyYWlsaW5nX3l5dnVwMmJncjg4OCAgICAgICAgIEAganVtcCB0byB0cmFpbGluZyBwcm9jZXNzaW5nIGlmIHJlbWFpbmluZyBsZW5ndGggaXMgbGVzcyB0aGFuIDgKLQotICAgIFZTVDMuVTggIHtEMjEsRDIyLEQyM30sIFtwX2Jncl0hICAgQCB2ZWN0b3Igc3RvcmUgQmx1ZSwgR3JlZW4sIFJlZCB0byBkZXN0aW5hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSZWQgYXQgTFNCCi0KLSAgICBCRVEgIGVuZF95eXZ1cDJiZ3I4ODggICAgICAgICAgICAgIEAgZG9uZSBpZiBleGFjdGx5IDggcGl4ZWwgcHJvY2Vzc2VkIGluIHRoZSBsb29wCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgRG9uZSB3aXRoIHRoZSBmaXJzdCA4IGVsZW1lbnRzLCBjb250aW51ZSBvbiB0aGUgbmV4dCA4IGVsZW1lbnRzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTXVsdGlwbHkgY29udHJpYnV0aW9uIGZyb20gY2hyb21pbmFuY2UsIHJlc3VsdHMgYXJlIGluIDMyLWJpdAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNVUxMLlMxNiAgUTYsIEQyOSwgRDZbMF0gICAgICAgICAgQCBRNjogMzU5KihWNCxWNSxWNixWNykgICAgICAgUmVkCi0gICAgVk1VTEwuUzE2ICBRNywgRDMxLCBENlsxXSAgICAgICAgICBAIFE3OiAtODgqKFU0LFU1LFU2LFU3KSAgICAgIEdyZWVuCi0gICAgVk1MQUwuUzE2ICBRNywgRDI5LCBENlsyXSAgICAgICAgICBAIFE3OiAtODgqKFU0LFU1LFU2LFU3KSAtIDE4MyooVjQsVjUsVjYsVjcpCi0gICAgVk1VTEwuUzE2ICBROCwgRDMxLCBENlszXSAgICAgICAgICBAIFE4OiA0NTQqKFU0LFU1LFU2LFU3KSAgICAgICBCbHVlCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQWRkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWQURELlMzMiAgUTYsIFEwICAgICAgICAgICAgICAgICAgIEAgUTYgYWRkIFJlZCAgIGJpYXMgLTQ1ODI0Ci0gICAgVkFERC5TMzIgIFE3LCBRMSAgICAgICAgICAgICAgICAgICBAIFE3IGFkZCBHcmVlbiBiaWFzICAzNDgxNgotICAgIFZBREQuUzMyICBROCwgUTIgICAgICAgICAgICAgICAgICAgQCBROCBhZGQgQmx1ZSAgYmlhcyAtNzA2ODgKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDYWxjdWxhdGUgUmVkLCBHcmVlbiwgQmx1ZQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNT1YuUzMyICAgUTksIFE2Ci0gICAgVk1MQUwuUzE2ICBRNiwgRDI1LCBEN1swXSAgICAgICAgICBAIFE2OiBSOCBSMTAgUjEyIFIxNCBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBROSwgRDI3LCBEN1swXSAgICAgICAgICBAIFE5OiBSOSBSMTEgUjEzIFIxNSBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICBWTU9WLlMzMiAgIFExMCwgUTcKLSAgICBWTUxBTC5TMTYgIFE3LCAgRDI1LCBEN1swXSAgICAgICAgIEAgUTc6IEcwLCBHMiwgRzQsIEc2IGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExMCwgRDI3LCBEN1swXSAgICAgICAgIEAgUTEwIDogRzEsIEczLCBHNSwgRzcgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgVk1PVi5TMzIgICBRMTEsIFE4Ci0gICAgVk1MQUwuUzE2ICBROCwgIEQyNSwgRDdbMF0gICAgICAgICBAIFE4OiBCMCwgQjIsIEI0LCBCNiBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTEsIEQyNywgRDdbMF0gICAgICAgICBAIFExMSA6IEIxLCBCMywgQjUsIEI3IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBSaWdodCBzaGlmdCBlaWdodCBiaXRzIHdpdGggcm91bmRpbmcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWU0hSTi5TMzIgICBEMTIsIFE2LCAgIzggICAgICAgICAgIEAgRDEyOiBSOCBSMTAgUjEyIFIxNCBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDEzLCBROSwgICM4ICAgICAgICAgICBAIEQxMzogUjkgUjExIFIxMyBSMTUgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQxMiwgRDEzICAgICAgICAgICAgICAgQCBRNjogUjggUjkgUjEwIFIxMSBSMTIgUjEzIFIxNCBSMTUKLQotICAgIFZTSFJOLlMzMiAgIEQxOCwgUTcsICAjOCAgICAgICAgICAgQCBEMTg6IEc4IEcxMCBHMTIgRzE0IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMTksIFExMCwgIzggICAgICAgICAgIEAgRDE5OiBHOSBHMTEgRzEzIEcxNSBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlpJUC4xNiAgICAgRDE4LCBEMTkgICAgICAgICAgICAgICBAIFE5OiAgRzggRzkgRzEwIEcxMSBHMTIgRzEzIEcxNCBHMTUKLQotICAgIFZTSFJOLlMzMiAgIEQyMCwgUTgsICAjOCAgICAgICAgICAgQCBEMjA6IEI4IEIxMCBCMTIgQjE0IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMjEsIFExMSwgIzggICAgICAgICAgIEAgRDIxOiBCOSBCMTEgQjEzIEIxNSBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlpJUC4xNiAgICAgRDIwLCBEMjEgICAgICAgICAgICAgICBAIFExMDogQjggQjkgQjEwIEIxMSBCMTIgQjEzIEIxNCBCMTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDbGFtcCB0aGUgdmFsdWUgdG8gYmUgd2l0aGluIFswfjI1NV0KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTUFYLlMxNiAgUTEwLCBRMTAsIFE0ICAgICAgICAgICAgIEAgaWYgUTEwIDwgICAwLCBRMTAgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTEwLCBRMTAsIFE1ICAgICAgICAgICAgIEAgaWYgUTEwID4gMjU1LCBRMTAgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgIEQyMywgUTEwICAgICAgICAgICAgIEAgc3RvcmUgQmx1ZSB0byBEMjMsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTksIFE5LCBRNCAgICAgICAgICAgICAgIEAgaWYgUTkgPCAgIDAsIFE5ID0gICAwCi0gICAgVk1JTi5TMTYgIFE5LCBROSwgUTUgICAgICAgICAgICAgICBAIGlmIFE5ID4gMjU1LCBROSA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICBEMjIsIFE5ICAgICAgICAgICAgICAgQCBzdG9yZSBHcmVlbiB0byBEMjIsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTYsIFE2LCBRNCAgICAgICAgICAgICAgIEAgaWYgUTYgPCAgIDAsIFE2ID0gICAwCi0gICAgVk1JTi5TMTYgIFE2LCBRNiwgUTUgICAgICAgICAgICAgICBAIGlmIFE2ID4gMjU1LCBRNiA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICBEMjEsIFE2ICAgICAgICAgICAgICAgQCBzdG9yZSBSZWQgdG8gRDIxLCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjOCAgICAgICAgICAgIEAgY2hlY2sgaWYgdGhlIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgQk1JICB0cmFpbGluZ195eXZ1cDJiZ3I4ODggICAgICAgICBAIGp1bXAgdG8gdHJhaWxpbmcgcHJvY2Vzc2luZyBpZiByZW1haW5pbmcgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBWU1QzLlU4ICB7RDIxLEQyMixEMjN9LCBbcF9iZ3JdISAgIEAgdmVjdG9yIHN0b3JlIEJsdWUsIEdyZWVuLCBSZWQgdG8gZGVzdGluYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUmVkIGF0IExTQgotCi0gICAgQkhJIGxvb3BfeXl2dXAyYmdyODg4ICAgICAgICAgICAgICBAIGxvb3AgaWYgbW9yZSB0aGFuIDggcGl4ZWxzIGxlZnQKLQotICAgIEJFUSAgZW5kX3l5dnVwMmJncjg4OCAgICAgICAgICAgICAgQCBkb25lIGlmIGV4YWN0bHkgOCBwaXhlbCBwcm9jZXNzZWQgaW4gdGhlIGxvb3AKLQotCi10cmFpbGluZ195eXZ1cDJiZ3I4ODg6Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFRoZXJlIGFyZSBmcm9tIDEgfiA3IHBpeGVscyBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0LgotICAgICAqICBGaXJzdCBhZGRpbmcgNyB0byB0aGUgbGVuZ3RoIHNvIHRoZSBsZW5ndGggd291bGQgYmUgZnJvbSAwIH4gNi4KLSAgICAgKiAgZWc6IDEgcGl4ZWwgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydCwgc28gMS04KzcgPSAwLgotICAgICAqICBUaGVuIHNhdmUgMSBwaXhlbCB1bmNvbmRpdGlvbmFsbHkgc2luY2UgYXQgbGVhc3QgMSBwaXhlbHMgbGVmdCBpbiB0aGUKLSAgICAgKiAgdHJhaWxpbmcgcGFydC4KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBBRERTIGxlbmd0aCwgbGVuZ3RoLCAjNyAgICAgICAgICAgIEAgdGhlcmUgYXJlIDcgb3IgbGVzcyBpbiB0aGUgdHJhaWxpbmcgcGFydAotCi0gICAgVlNUMy5VOCB7RDIxWzBdLEQyMlswXSxEMjNbMF19LCBbcF9iZ3JdISBAIGF0IGxlYXN0IDEgcGl4ZWwgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydAotICAgIEJFUSBlbmRfeXl2dXAyYmdyODg4ICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDMuVTgge0QyMVsxXSxEMjJbMV0sRDIzWzFdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgZW5kX3l5dnVwMmJncjg4OCAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QzLlU4IHtEMjFbMl0sRDIyWzJdLEQyM1syXX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJiZ3I4ODggICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMy5VOCB7RDIxWzNdLEQyMlszXSxEMjNbM119LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSBlbmRfeXl2dXAyYmdyODg4ICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDMuVTgge0QyMVs0XSxEMjJbNF0sRDIzWzRdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgZW5kX3l5dnVwMmJncjg4OCAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QzLlU4IHtEMjFbNV0sRDIyWzVdLEQyM1s1XX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJiZ3I4ODggICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMy5VOCB7RDIxWzZdLEQyMls2XSxEMjNbNl19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotCi1lbmRfeXl2dXAyYmdyODg4OgotICAgIFZQT1AgIHtEOC1EMTV9Ci0gICAgTERNRkQgU1AhLCB7UEN9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZW5kIG9mIHl5dnVwMmJncjg4OAotCi0uZW5kCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9hc20vYXJtdjcvamRpZGN0LWFybXY3LlMgYi9saWJqcGVndHdycC9hc20vYXJtdjcvamRpZGN0LWFybXY3LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MWUyMTkuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvYXNtL2FybXY3L2pkaWRjdC1hcm12Ny5TCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiBqZGlkY3QtYXJtdjcucwotKgotKiAgQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotKiAgbWV0OgotKiAgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSogICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0qICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSogICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSogICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZSBBdXJvcmEgRm9ydW0sIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSogICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotKiAgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotKgotKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0qICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotKiAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotKiAgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotKiAgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0qICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotKiAgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotKiAgSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICAgICAgICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OIExJU1QKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiAtIGlkY3RfMXgxX3ZlbnVtCi0qIC0gaWRjdF8yeDJfdmVudW0KLSogLSBpZGN0XzR4NF92ZW51bQotKiAtIGlkY3RfOHg4X3ZlbnVtCi0qCi0qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLUA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQCBNQUNSTyBERUZJTklUSU9OCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAubWFjcm8gVHJhbnNwb3NlOHg4Ci0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCBUcmFuc3Bvc2UgYW4gOCB4IDggeCAxNiBiaXQgbWF0cml4IGluIHBsYWNlCi0gICAgICAgIEAgSW5wdXQ6IHE4IHRvIHExNQotICAgICAgICBAIE91dHB1dDogcTggdG8gcTE1Ci0gICAgICAgIEAgUmVnaXN0ZXJzIHVzZWQ6IHE4IHRvIHExNQotICAgICAgICBAIEFzc3VtcHRpb25zOiA4IHggOCB4IDE2IGJpdCBkYXRhCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICB2c3dwIGQxNywgZDI0ICAgICAgICAgICAgICAgICAgQHE4LCBxMTIKLSAgICAgICAgdnN3cCBkMjMsIGQzMCAgICAgICAgICAgICAgICAgIEBxMTEsIHExNQotICAgICAgICB2c3dwIGQyMSwgZDI4ICAgICAgICAgICAgICAgICAgQHExMCwgcTE0Ci0gICAgICAgIHZzd3AgZDE5LCBkMjYgICAgICAgICAgICAgICAgICBAcTksIHExMwotCi0gICAgICAgIHZ0cm4uMzIgcTgsICBxMTAKLSAgICAgICAgdnRybi4zMiBxOSwgIHExMQotICAgICAgICB2dHJuLjMyIHExMiwgcTE0Ci0gICAgICAgIHZ0cm4uMzIgcTEzLCBxMTUKLQotICAgICAgICB2dHJuLjE2IHE4LCAgcTkKLSAgICAgICAgdnRybi4xNiBxMTAsIHExMQotICAgICAgICB2dHJuLjE2IHExMiwgcTEzCi0gICAgICAgIHZ0cm4uMTYgcTE0LCBxMTUKLSAgICAuZW5kbQotCi0gICAgLm1hY3JvIElEQ1QxRAotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIEAgT25lIGRpbWVuc2lvbmFsIDY0IGVsZW1lbnQgaW52ZXJzZSBEQ1QKLSAgICAgICAgQCBJbnB1dDogcTggdG8gcTE1IGxvYWRlZCB3aXRoIGRhdGEKLSAgICAgICAgQCAgICAgICAgcTAgbG9hZGVkIHdpdGggY29uc3RhbnRzCi0gICAgICAgIEAgT3V0cHV0OiBxOCB0byBxMTUKLSAgICAgICAgQCBSZWdpc3RlcnMgdXNlZDogcTAsIHE0IHRvIHExNQotICAgICAgICBAIEFzc3VtcHRpb25zOiAxNiBiaXQgZGF0YSwgZmlyc3QgZWxlbWVudHMgaW4gbGVhc3Qgc2lnbmlmaWNhbnQKLSAgICAgICAgQCBoYWxmd29yZHMKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgIEAxc3Qgc3RhZ2UKLSAgICAgICAgdnFyZG11bGguczE2IHE0LCAgcTE1LCBkMFsyXSAgIEBxNCA9IGExKnZ4NwotICAgICAgICB2cXJkbXVsaC5zMTYgcTUsICBxOSwgIGQwWzJdICAgQHE1ID0gYTEqdngxCi0gICAgICAgIHZxcmRtdWxoLnMxNiBxNiwgIHExMywgZDBbM10gICBAcTYgPSBhMip2eDUKLSAgICAgICAgdnFyZG11bGguczE2IHE3LCAgcTExLCBkMVsxXSAgIEBxNyA9IG1hMip2eDMKLSAgICAgICAgdnFyZG11bGguczE2IHEyLCAgcTE0LCBkMFsxXSAgIEBxNiA9IGEwKnZ4NgotICAgICAgICB2cXJkbXVsaC5zMTYgcTMsICBxMTAsIGQwWzFdICAgQHE3ID0gYTAqdngyCi0gICAgICAgIHZxYWRkLnMxNiAgIHE5LCAgcTQsICBxOSAgICAgICBAcTkgPSB0MSA9IGExKnZ4NyArIHZ4MQotICAgICAgICB2cXN1Yi5zMTYgICBxNSwgIHE1LCAgcTE1ICAgICAgQHE1ID0gdDggPSBhMSp2eDEgLSB2eDcKLSAgICAgICAgdnFhZGQuczE2ICAgcTE1LCBxNiwgIHExMSAgICAgIEBxMTUgPSB0NyA9IGEyKnZ4NSArIHZ4MwotICAgICAgICB2cWFkZC5zMTYgICBxMTEsIHE3LCAgcTEzICAgICAgQHExMSA9IHQzID0gbWEyKnZ4MyArIHZ4NQotCi0gICAgICAgIEAybmQgc3RhZ2UKLSAgICAgICAgdnFhZGQuczE2ICAgcTEzLCBxOCwgIHExMiAgICAgIEBxMTMgPSB0NSA9IHZ4MCArIHZ4NAotICAgICAgICB2cXN1Yi5zMTYgICBxOCwgIHE4LCAgcTEyICAgICAgQHE4ID0gdDAgPSB2eDAgLSB2eDQKLSAgICAgICAgdnFhZGQuczE2ICAgcTEwLCBxMiwgIHExMCAgICAgIEBxMTAgPSB0MiA9IGEwKnZ4NiArIHZ4MgotICAgICAgICB2cXN1Yi5zMTYgICBxMTIsIHEzLCAgcTE0ICAgICAgQHExMiA9IHQ0ID0gYTAqdngyIC0gdng2Ci0gICAgICAgIHZxYWRkLnMxNiAgIHExNCwgcTUsICBxMTEgICAgICBAcTE0ID0gdDYgPSB0OCArIHQzCi0gICAgICAgIHZxc3ViLnMxNiAgIHExMSwgcTUsICBxMTEgICAgICBAcTExID0gdDMgPSB0OCAtIHQzCi0gICAgICAgIHZxc3ViLnMxNiAgIHE1LCAgcTksICBxMTUgICAgICBAcTUgPSB0OCA9IHQxIC0gdDcKLSAgICAgICAgdnFhZGQuczE2ICAgcTksICBxOSwgIHExNSAgICAgIEBxOSA9IHQxID0gdDEgKyB0NwotCi0gICAgICAgIEAzcmQgc3RhZ2UKLSAgICAgICAgdnFhZGQuczE2ICAgcTE1LCBxMTMsIHExMCAgICAgIEBxMTUgPSB0NyA9IHQ1ICsgdDIKLSAgICAgICAgdnFzdWIuczE2ICAgcTEwLCBxMTMsIHExMCAgICAgIEBxMTAgPSB0MiA9IHQ1IC0gdDIKLSAgICAgICAgdnFhZGQuczE2ICAgcTEzLCBxOCwgIHExMiAgICAgIEBxMTMgPSB0NSA9IHQwICsgdDQKLSAgICAgICAgdnFzdWIuczE2ICAgcTcsICBxOCwgIHExMiAgICAgIEBxNyA9IHQwID0gdDAgLSB0NAotICAgICAgICB2cXN1Yi5zMTYgICBxMTIsIHE1LCAgcTExICAgICAgQHExMiA9IHQ0ID0gdDggLSB0MwotICAgICAgICB2cWFkZC5zMTYgICBxMTEsIHE1LCAgcTExICAgICAgQHExMSA9IHQzID0gdDggKyB0MwotCi0gICAgICAgIEA0dGggc3RhZ2UKLSAgICAgICAgdnFhZGQuczE2ICAgcTgsICBxMTUsIHE5ICAgICAgIEBxOCA9IHZ5MCA9IHQ3ICsgdDEKLSAgICAgICAgdnFzdWIuczE2ICAgcTE1LCBxMTUsIHE5ICAgICAgIEBxMTUgPSB2eTcgPSB0NyAtIHQxCi0gICAgICAgIHZxcmRtdWxoLnMxNiBxNiwgIHExMiwgZDBbMF0gICBAcTYgPSBjNCp0NAotICAgICAgICB2cXJkbXVsaC5zMTYgcTQsICBxMTEsIGQwWzBdICAgQHE0ID0gYzQqdDMKLSAgICAgICAgdnFzdWIuczE2ICAgcTEyLCBxMTAsIHExNCAgICAgIEBxMTIgPSB2eTQgPSB0MiAtIHQ2Ci0gICAgICAgIHZxYWRkLnMxNiAgIHExMSwgcTEwLCBxMTQgICAgICBAcTExID0gdnkzID0gdDIgKyB0NgotICAgICAgICB2cWFkZC5zMTYgICBxMTAsIHE3LCAgcTYgICAgICAgQHExMCA9IHZ5MiA9IHQwICsgYzQqdDQKLSAgICAgICAgdnFzdWIuczE2ICAgcTE0LCBxMTMsIHE0ICAgICAgIEBxMTQgPSB2eTYgPSB0NSAtIGM0KnQzCi0gICAgICAgIHZxYWRkLnMxNiAgIHE5LCAgcTEzLCBxNCAgICAgICBAcTkgPSB2eTEgPSB0NSArIGM0KnQzCi0gICAgICAgIHZxc3ViLnMxNiAgIHExMywgcTcsICBxNiAgICAgICBAcTEzID0gdnk1ID0gdDAgLSBjNCp0NAotICAgIC5lbmRtCi0KLSAgICAubWFjcm8gUEFSVDEKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBAIExvYWQgaW5wdXQgaW5wdXQgZGF0YSBmcm9tIG1lbW9yeSBhbmQgc2hpZnQKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICB2bGQxLjE2ICAge2QxNiwgZDE3fSxbcjBdISAgICAgQHE4ID1yb3cwCi0gICAgICAgIHZxc2hsLnMxNiAgcTgsICBxOCwgICM0ICAgICAgICBASW5wdXQgZGF0YSB0b28gYmlnPyEhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATWF4aW11bSBNUEVHIGlucHV0IGlzIDIwNDcvLTIwNDguCi0gICAgICAgIHZsZDEuMTYgICB7ZDE4LCBkMTl9LFtyMF0hICAgICBAcTkgPXJvdzEKLSAgICAgICAgdnFzaGwuczE2ICBxOSwgIHE5LCAgIzQgICAgICAgIEBTaGlmdCAxIGluc3RlYWQgb2YgNAotCi0gICAgICAgIHZsZDEuMTYgICB7ZDIwLCBkMjF9LFtyMF0hICAgICBAcTEwPXJvdzIKLSAgICAgICAgdnFzaGwuczE2ICBxMTAsIHExMCwgIzQKLQotICAgICAgICB2bGQxLjE2ICAge2QyMiwgZDIzfSxbcjBdISAgICAgQHExMT1yb3czCi0gICAgICAgIHZxc2hsLnMxNiAgcTExLCBxMTEsICM0Ci0KLSAgICAgICAgdmxkMS4xNiAgIHtkMjQsIGQyNX0sW3IwXSEgICAgIEBxMTI9cm93NAotICAgICAgICB2cXNobC5zMTYgIHExMiwgcTEyLCAjNAotCi0gICAgICAgIHZsZDEuMTYgICB7ZDI2LCBkMjd9LFtyMF0hICAgICBAcTEzPXJvdzUKLSAgICAgICAgdnFzaGwuczE2ICBxMTMsIHExMywgIzQKLSAgICAgICAgdmxkMS4xNiAgIHtkMjgsIGQyOX0sW3IwXSEgICAgIEBxMTQ9cm93NgotICAgICAgICB2cXNobC5zMTYgIHExNCwgcTE0LCAjNAotICAgICAgICB2bGQxLjE2ICAge2QzMCwgZDMxfSxbcjBdISAgICAgQHExNT1yb3c3Ci0gICAgICAgIHZxc2hsLnMxNiAgcTE1LCBxMTUsICM0Ci0KLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBAIHJlZnJlc2ggdGhlIGNvbnN0YW50cyB0aGF0IHdhcyBjbG9iYmVyZWQgbGFzdCB0aW1lIHRocm91Z2ggSURDVDFECi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgdmxkMS4xNiAgIHtkNCwgZDV9LFtyN10gICAgICAgIEBxMiA9Y29uc3RhbnRzWzJdCi0gICAgICAgIHZsZDEuMTYgICB7ZDYsIGQ3fSxbcjhdICAgICAgICBAcTMgPWNvbnN0YW50c1szXQotICAgICAgICB2bGQxLjE2ICAge2Q4LCBkOX0sW3I5XSAgICAgICAgQHE0ID1jb25zdGFudHNbNF0KLSAgICAuZW5kbQotCi0gICAgLm1hY3JvIFBBUlQyCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCBQcmVzY2FsZSB0aGUgaW5wdXQKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICB2cXJkbXVsaC5zMTYgcTEyLCBxMTIsIHExICAgICAgQHExMj1yb3c0ICogY29uc3RhbnRzWzFdID0gdng0Ci0gICAgICAgIHZxcmRtdWxoLnMxNiBxMTUsIHExNSwgcTIgICAgICBAcTE1PXJvdzcgKiBjb25zdGFudHNbMl0gPSB2eDcKLSAgICAgICAgdnFyZG11bGguczE2IHE5LCAgcTksICBxMiAgICAgIEBxOSA9cm93MSAqIGNvbnN0YW50c1syXSA9IHZ4MQotICAgICAgICB2cXJkbXVsaC5zMTYgcTEzLCBxMTMsIHE0ICAgICAgQHExMz1yb3c1ICogY29uc3RhbnRzWzRdID0gdng1Ci0gICAgICAgIHZxcmRtdWxoLnMxNiBxMTEsIHExMSwgcTQgICAgICBAcTExPXJvdzMgKiBjb25zdGFudHNbNF0gPSB2eDMKLSAgICAgICAgdnFyZG11bGguczE2IHExNCwgcTE0LCBxMyAgICAgIEBxMTQ9cm93NiAqIGNvbnN0YW50c1szXSA9IHZ4NgotICAgICAgICB2cXJkbXVsaC5zMTYgcTEwLCBxMTAsIHEzICAgICAgQHExMD1yb3cyICogY29uc3RhbnRzWzNdID0gdngyCi0gICAgICAgIHZxcmRtdWxoLnMxNiBxOCwgIHE4LCAgcTEgICAgICBAcTggPXJvdzAgKiBjb25zdGFudHNbMV0gPSB2eDAKLQotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIEAgQXQgdGhzaSBwb2ludCwgdGhlIGlucHV0IDh4OCB4IDE2IGJpdCBjb2VmZmljaWVudHMgYXJlCi0gICAgICAgIEAgdHJhbnNwb3NlZCwgcHJlc2NhbGVkLCBhbmQgbG9hZGVkIGluIHE4IHRvIHExNQotICAgICAgICBAIHEwIGxvYWRlZCB3aXRoIHNjYWxhciBjb25zdGFudHMKLSAgICAgICAgQCBQZXJmb3JtIDFEIElEQ1QKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBJRENUMUQgICAgICAgICAgICAgICAgICAgICAgICAgQHBlcmZvcm0gMWQgaWRjdAotCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCBUcmFuc3Bvc2UgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIHRvIGdldCByZWFkIGZvciB2ZXJ0aWNhbAotICAgICAgICBAIHRyYW5zZm9ybWF0aW9uCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgdnN3cCBkMTcsIGQyNCAgICAgICAgICAgICAgICAgIEBxOCwgcTEyCi0gICAgICAgIHZzd3AgZDIzLCBkMzAgICAgICAgICAgICAgICAgICBAcTExLCBxMTUKLSAgICAgICAgdnN3cCBkMjEsIGQyOCAgICAgICAgICAgICAgICAgIEBxMTAsIHExNAotICAgICAgICB2c3dwIGQxOSwgZDI2ICAgICAgICAgICAgICAgICAgQHE5LCBxMTMKLQotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIEAgTG9hZCB0aGUgYmlhcwotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIHZkdXAuMzIgcTQsIGQxWzFdICAgICAgICAgICAgICBAYSBjeWNsZSBpcyBzYXZlZCBieSBsb2FkaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdGhlIGJpYXMgYXQgdGhpcyBwb2ludAotCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCBGaW5pc2ggdGhlIHRyYW5zcG9zaXRpb24KLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICB2dHJuLjMyIHE4LCAgcTEwCi0gICAgICAgIHZ0cm4uMzIgcTksICBxMTEKLSAgICAgICAgdnRybi4zMiBxMTIsIHExNAotICAgICAgICB2dHJuLjMyIHExMywgcTE1Ci0gICAgICAgIHZ0cm4uMTYgcTgsICBxOQotICAgICAgICB2dHJuLjE2IHExMCwgcTExCi0gICAgICAgIHZ0cm4uMTYgcTEyLCBxMTMKLSAgICAgICAgdnRybi4xNiBxMTQsIHExNQotCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCBBZGQgYmlhcwotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIHZxYWRkLnMxNiBxOCwgcTgsIHE0Ci0KLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBAIElEQ1QgMm5kIGhhbGYKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBJRENUMUQgICAgICAgICAgICAgICAgICAgICAgICAgQHBlcmZvcm0gMWQgZGN0Ci0KLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBAIFNjYWxlIGFuZCBjbGFtcCB0aGUgb3V0cHV0IHRvIGNvcnJlY3QgcmFuZ2UgYW5kIHNhdmUgdG8gbWVtb3J5Ci0gICAgICAgIEAgMS4gc2NhbGUgdG8gOGJpdHMgYnkgcmlnaHQgc2hpZnQgNgotICAgICAgICBAIDIuIGNsYW1wIG91dHB1dCB0byBbMCwgMjU1XSBieSBtaW4vbWF4Ci0gICAgICAgIEAgMy4gdXNlIG11bHRpcGxlIHN0b3JlLiBFYWNoIHN0b3JlIHdpbGwgc2F2ZSBvbmUgcm93IG9mIG91dHB1dC4KLSAgICAgICAgQCAgICBUaGUgc3QgcXVldWUgc2l6ZSBpcyA0LCBzbyBkbyBubyBtb3JlIHRoYW4gNCBzdHIgaW4gc2VxdWVuY2UuCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgbGRyICAgICAgIHI1LCA9Y29uc3RhbnRzKzUqMTYgIEBjb25zdGFudHNbNV0sCi0gICAgICAgIHZsZDEuMTYgICBkMTAsIFtyNV0gICAgICAgICAgICBAbG9hZCBjbGFtcGluZyBwYXJhbWV0ZXJzCi0gICAgICAgIHZkdXAuczE2ICBxNiwgIGQxMFswXSAgICAgICAgICBAcTY9WzAwMDAwMDAwMDAwMDAwMDBdCi0gICAgICAgIHZkdXAuczE2ICBxNywgIGQxMFsxXSAgICAgICAgICBAcTc9W0ZGRkZGRkZGRkZGRkZGRkZdCi0KLSAgICAgICAgQFNhdmUgdGhlIHJlc3VsdHMKLSAgICAgICAgdnNoci5zMTYgIHE4LCAgcTgsICAjNiAgICAgICAgIEBxOCA9IHZ5MAotICAgICAgICB2bWF4LnMxNiAgcTgsICBxOCwgIHE2ICAgICAgICAgQGNsYW1wID4wCi0gICAgICAgIHZtaW4uczE2ICBxOCwgIHE4LCAgcTcgICAgICAgICBAY2xhbXAgPDI1NQotCi0gICAgICAgIHZzaHIuczE2ICBxOSwgIHE5LCAgIzYgICAgICAgICBAcTkgPSB2eTEKLSAgICAgICAgdm1heC5zMTYgIHE5LCAgcTksICBxNiAgICAgICAgIEBjbGFtcCA+MAotICAgICAgICB2bWluLnMxNiAgcTksICBxOSwgIHE3ICAgICAgICAgQGNsYW1wIDwyNTUKLQotICAgICAgICB2c2hyLnMxNiAgcTEwLCBxMTAsICM2ICAgICAgICAgQHExMCA9IHZ5MgotICAgICAgICB2bWF4LnMxNiAgcTEwLCBxMTAsIHE2ICAgICAgICAgQGNsYW1wID4wCi0gICAgICAgIHZtaW4uczE2ICBxMTAsIHExMCwgcTcgICAgICAgICBAY2xhbXAgPDI1NQotCi0gICAgICAgIHZzaHIuczE2ICBxMTEsIHExMSwgIzYgICAgICAgICBAcTExID0gdnkzCi0gICAgICAgIHZtYXguczE2ICBxMTEsIHExMSwgcTYgICAgICAgICBAY2xhbXAgPjAKLSAgICAgICAgdm1pbi5zMTYgIHExMSwgcTExLCBxNyAgICAgICAgIEBjbGFtcCA8MjU1Ci0KLSAgICAgICAgdnN0MS4xNiAge2QxNiwgZDE3fSxbcjFdLHIyICAgIEBxOCA9cm93MAotICAgICAgICB2c3QxLjE2ICB7ZDE4LCBkMTl9LFtyMV0scjIgICAgQHE5ID1yb3cxCi0gICAgICAgIHZzdDEuMTYgIHtkMjAsIGQyMX0sW3IxXSxyMiAgICBAcTEwPXJvdzIKLSAgICAgICAgdnN0MS4xNiAge2QyMiwgZDIzfSxbcjFdLHIyICAgIEBxMTE9cm93MwotCi0gICAgICAgIHZzaHIuczE2ICBxMTIsIHExMiwgIzYgICAgICAgICBAcTEyID0gdnk0Ci0gICAgICAgIHZtYXguczE2ICBxMTIsIHExMiwgcTYgICAgICAgICBAY2xhbXAgPjAKLSAgICAgICAgdm1pbi5zMTYgIHExMiwgcTEyLCBxNyAgICAgICAgIEBjbGFtcCA8MjU1Ci0KLSAgICAgICAgdnNoci5zMTYgIHExMywgcTEzLCAjNiAgICAgICAgIEBxMTMgPSB2eTUKLSAgICAgICAgdm1heC5zMTYgIHExMywgcTEzLCBxNiAgICAgICAgIEBjbGFtcCA+MAotICAgICAgICB2bWluLnMxNiAgcTEzLCBxMTMsIHE3ICAgICAgICAgQGNsYW1wIDwyNTUKLQotICAgICAgICB2c2hyLnMxNiAgcTE0LCBxMTQsICM2ICAgICAgICAgQHExNCA9IHZ5NgotICAgICAgICB2bWF4LnMxNiAgcTE0LCBxMTQsIHE2ICAgICAgICAgQGNsYW1wID4wCi0gICAgICAgIHZtaW4uczE2ICBxMTQsIHExNCwgcTcgICAgICAgICBAY2xhbXAgPDI1NQotCi0gICAgICAgIHZzaHIuczE2ICBxMTUsIHExNSwgIzYgICAgICAgICBAcTE1ID0gdnk3Ci0gICAgICAgIHZtYXguczE2ICBxMTUsIHExNSwgcTYgICAgICAgICBAY2xhbXAgPjAKLSAgICAgICAgdm1pbi5zMTYgIHExNSwgcTE1LCBxNyAgICAgICAgIEBjbGFtcCA8MjU1Ci0KLSAgICAgICAgdnN0MS4xNiAge2QyNCwgZDI1fSxbcjFdLHIyICAgIEBxMTI9cm93NAotICAgICAgICB2c3QxLjE2ICB7ZDI2LCBkMjd9LFtyMV0scjIgICAgQHExMz1yb3c1Ci0gICAgICAgIHZzdDEuMTYgIHtkMjgsIGQyOX0sW3IxXSxyMiAgICBAcTE0PXJvdzYKLSAgICAgICAgdnN0MS4xNiAge2QzMCwgZDMxfSxbcjFdICAgICAgIEBxMTU9cm93NwotICAgIC5lbmRtCi0KLSAgICAubWFjcm8gQklHX0JPRFlfVFJBTlNQT1NFX0lOUFVUCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCBNYWluIGJvZHkgb2YgaWRjdAotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIFBBUlQxCi0gICAgICAgIFRyYW5zcG9zZTh4OAotICAgICAgICBQQVJUMgotICAgIC5lbmRtCi0KLSAgICAubWFjcm8gSURDVF9FTlRSWQotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIEAgTG9hZCB0aGUgbG9jYXRpb25zIG9mIHRoZSBjb25zdGFudHMKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBsZHIgIHI1LCAgPWNvbnN0YW50cyswKjE2ICAgICAgQGNvbnN0YW50c1swXQotICAgICAgICBsZHIgIHI2LCAgPWNvbnN0YW50cysxKjE2ICAgICAgQGNvbnN0YW50c1sxXQotICAgICAgICBsZHIgIHI3LCAgPWNvbnN0YW50cysyKjE2ICAgICAgQGNvbnN0YW50c1syXQotICAgICAgICBsZHIgIHI4LCAgPWNvbnN0YW50cyszKjE2ICAgICAgQGNvbnN0YW50c1szXQotICAgICAgICBsZHIgIHI5LCAgPWNvbnN0YW50cys0KjE2ICAgICAgQGNvbnN0YW50c1s0XQotCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCBMb2FkIHRoZSBjb2VmZmljaWVudHMKLSAgICAgICAgQCBvbmx5IHNvbWUgaW5wdXQgY29lZmZpY2llbnRzIGFyZSBsb2FkIGR1ZSB0byByZWdpc3RlciBjb25zdHJhaW4KLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICB2bGQxLjE2ICAge2QwLCBkMX0sW3I1XSAgICAgICAgQHEwID1jb25zdGFudHNbMF0gKHNjYWxhcnMpCi0gICAgICAgIHZsZDEuMTYgICB7ZDIsIGQzfSxbcjZdICAgICAgICBAcTEgPWNvbnN0YW50c1sxXQotICAgIC5lbmRtCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUAgRU5EIG9mIE1BQ1JPIERFRklOSVRJT04KLUA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLSAgICAuc2VjdGlvbiBpZGN0X2Z1bmMsICJ4IiAgICAgICAgICAgIEAgQVJFCi0gICAgLnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGlkY3RfZnVuYywgQ09ERSwgUkVBRE9OTFkKLSAgICAuYWxpZ24gMgotICAgIC5jb2RlIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBDT0RFMzIKLQotQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1AIE1haW4gUm91dGluZQotQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAuZ2xvYmFsIGlkY3RfMXgxX3ZlbnVtCi0gICAgLmdsb2JhbCBpZGN0XzJ4Ml92ZW51bQotICAgIC5nbG9iYWwgaWRjdF80eDRfdmVudW0KLSAgICAuZ2xvYmFsIGlkY3RfOHg4X3ZlbnVtCi0KLUA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQCBGVU5DVElPTiAgICAgOiBpZGN0XzF4MV92ZW51bQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIERJU0NSSVBUSU9OICA6IEFSTSBvcHRpbWl6YXRpb24gb2Ygb25lIDF4MSBibG9jayBpRENUCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgQyBQUk9UT1RZUEUgIDogdm9pZCBpZGN0XzF4MV92ZW51bShpbnQxNiAqIGlucHV0LAotQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2ICogb3V0cHV0LAotQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIHN0cmlkZSkKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBSRUcgSU5QVVQgICAgOiBSMCBwb2ludGVyIHRvIGlucHV0IChpbnQxNikKLUAgICAgICAgICAgICAgICAgUjEgcG9pbnRlciB0byBvdXRwdXQgKGludDE2KQotQCAgICAgICAgICAgICAgICBSMiBibG9jayBzdHJpZGUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBTVEFDSyBBUkcgICAgOiBOb25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgTUVNIElOUFVUICAgIDogTm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFJFRyBPVVRQVVQgICA6IE5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBNRU0gT1VUUFVUICAgOiBOb25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgUkVHIEFGRkVDVEVEIDogUjAgLSBSMgotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFNUQUNLIFVTQUdFICA6IG5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBDWUNMRVMgICAgICAgOiAxNyBjeWNsZXMKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBOT1RFUyAgICAgICAgOgotQCBUaGlzIGlkY3RfMXgxX3ZlbnVtIGNvZGUgd2FzIGRldmVsb3BlZCB3aXRoIEFSTSBpbnN0cnVjdGlvbiBzZXQuCi1ACi1AIEFSTSBSRUdJU1RFUiBBTExPQ0FUSU9OCi1AID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUAgcjAgIDogcG9pbnRlciB0byBpbnB1dCBkYXRhCi1AIHIxICA6IHBvaW50ZXIgdG8gb3V0cHV0IGFyZWEKLUAgcjIgIDogc3RyaWRlIGluIHRoZSBvdXRwdXQgYnVmZmVyCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS50eXBlIGlkY3RfMXgxX3ZlbnVtLCAlZnVuY3Rpb24KLWlkY3RfMXgxX3ZlbnVtOgotCi0gICAgbGRyc2ggICByMywgW3IwXSAgICAgICAgICAgICAgICAgICBAIExvYWQgc2lnbmVkIGhhbGYgd29yZCAoaW50MTYpCi0gICAgbGRyICAgICByMiwgPTEwMjggICAgICAgICAgICAgICAgICBAIDEwMjggPSA0ICsgMTI4IDw8IDMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNCBmb3Igcm91bmRpbmcsIDEyOCBmb3Igb2Zmc2V0Ci0gICAgYWRkICAgICByMiwgcjMsIHIyCi0gICAgYXNycyAgICByMiwgcjIsICMzICAgICAgICAgICAgICAgICBAIERpdmlkZSBieSA4LCBhbmQgc2V0IHN0YXR1cyBiaXQKLSAgICBtb3ZtaSAgIHIyLCAjMCAgICAgICAgICAgICAgICAgICAgIEAgQ2xhbXAgdG8gYmUgZ3JlYXRlciB0aGFuIDAKLSAgICBjbXAgICAgIHIyLCAjMjU1Ci0gICAgbW92Z3QgICByMiwgIzI1NSAgICAgICAgICAgICAgICAgICBAIENsYW1wIHRvIGJlIGxlc3MgdGhhbiAyNTUKLSAgICBzdHIgICAgIHIyLCBbcjFdICAgICAgICAgICAgICAgICAgIEAgU2F2ZSBvdXRwdXQKLSAgICBieCAgICAgIGxyICAgICAgICAgICAgICAgICAgICAgICAgIEAgUmV0dXJuIHRvIGNhbGxlcgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGVuZCBvZiBpZGN0XzF4MV92ZW51bQotCi0KLUA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQCBGVU5DVElPTiAgICAgOiBpZGN0XzJ4Ml92ZW51bQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIERJU0NSSVBUSU9OICA6IFZlTnVtIG9wdGltaXphdGlvbiBvZiBvbmUgMngyIGJsb2NrIGlEQ1QKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBDIFBST1RPVFlQRSAgOiB2b2lkIGlkY3RfMngyX3ZlbnVtKGludDE2ICogaW5wdXQsCi1AICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTYgKiBvdXRwdXQsCi1AICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgc3RyaWRlKQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFJFRyBJTlBVVCAgICA6IFIwIHBvaW50ZXIgdG8gaW5wdXQgKGludDE2KQotQCAgICAgICAgICAgICAgICBSMSBwb2ludGVyIHRvIG91dHB1dCAoaW50MTYpCi1AICAgICAgICAgICAgICAgIFIyIGJsb2NrIHN0cmlkZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFNUQUNLIEFSRyAgICA6IE5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBNRU0gSU5QVVQgICAgOiBOb25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgUkVHIE9VVFBVVCAgIDogTm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIE1FTSBPVVRQVVQgICA6IE5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBSRUcgQUZGRUNURUQgOiBSMCAtIFIyCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgU1RBQ0sgVVNBR0UgIDogbm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIENZQ0xFUyAgICAgICA6IDI3IGN5Y2xlcwotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIE5PVEVTICAgICAgICA6IE91dHB1dCBidWZmZXIgbXVzdCBiZSBhbiA4eDggMTYtYml0IGJ1ZmZlcgotQAotQCBBUk0gUkVHSVNURVIgQUxMT0NBVElPTgotQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUAgcjAgIDogcG9pbnRlciB0byBpbnB1dCBkYXRhCi1AIHIxICA6IHBvaW50ZXIgdG8gb3V0cHV0IGFyZWEKLUAgcjIgIDogc3RyaWRlIGluIHRoZSBvdXRwdXQgYnVmZmVyCi1AIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAKLUAgVkVOVU0gUkVHSVNURVIgQUxMT0NBVElPTgotQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1AIHEwICAgICA6IG91dHB1dCB4MCAtIHg0Ci1AIHExICAgICA6IG5vdCB1c2VkCi1AIHEyICAgICA6IG5vdCB1c2VkCi1AIHEzICAgICA6IG5vdCB1c2VkCi1AIHE0ICAgICA6IG5vdCB1c2VkCi1AIHE1ICAgICA6IG5vdCB1c2VkCi1AIHE2ICAgICA6IG5vdCB1c2VkCi1AIHE3ICAgICA6IG5vdCB1c2VkCi1AIHE4ICAgICA6IGlucHV0IHkwIC0geTQKLUAgcTkgICAgIDogaW50ZXJtZWRpYXRlIHZhbHVlCi1AIHExMCAgICA6IGludGVybWVkaWF0ZSB2YWx1ZQotQCBxMTEgICAgOiBvZmZzZXQgdmFsdWUKLUAgcTEyICAgIDogY2xhbXAgdmFsdWUKLUAgcTEzICAgIDogbm90IHVzZWQKLUAgcTE0ICAgIDogbm90IHVzZWQKLUAgcTE1ICAgIDogbm90IHVzZWQKLUA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLnR5cGUgaWRjdF8yeDJfdmVudW0sICVmdW5jdGlvbgotaWRjdF8yeDJfdmVudW06Ci0KLSAgICB2bGQ0LjMyICAgIHtkMTYsIGQxNywgZDE4LCBkMTl9LCBbcjBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICBkMTY6IHkwIHwgeTEgfCB5MiB8IHkzICAoTFNCIHwgTVNCKQotCi0gICAgdnRybi4zMiAgICBkMTYsIGQxNyAgICAgICAgICAgICAgICBAICBkMTY6IHkwIHwgeTEgfCBYIHwgWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAgZDE3OiB5MiB8IHkzIHwgWCB8IFgKLQotICAgIHZxYWRkLnMxNiAgZDE4LCBkMTYsIGQxNyAgICAgICAgICAgQCBkMTg6IHkwK3kyIHwgeTEreTMgfCBYIHwgWCAgIHE6IHNhdHVyYXRlZAotICAgIHZxc3ViLnMxNiAgZDE5LCBkMTYsIGQxNyAgICAgICAgICAgQCBkMTk6IHkwLXkyIHwgeTEteTMgfCBYIHwgWCAgIHE6IHNhdHVyYXRlZAotCi0gICAgdnRybi4xNiAgICBkMTgsIGQxOSAgICAgICAgICAgICAgICBAIGQxODogeTAreTIgfCB5MC15MiB8IFggfCBYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGQxOTogeTEreTMgfCB5MS15MyB8IFggfCBYCi0KLSAgICB2cWFkZC5zMTYgIGQyMCwgZDE4LCBkMTkgICAgICAgICAgIEAgZDIwOiAoeTAreTIpKyh5MSt5MykgfCAoeTAteTIpKyh5MS15MykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgICAgICAgeDAgfCB4MiB8IFggfCBYCi0gICAgdnFzdWIuczE2ICBkMjEsIGQxOCwgZDE5ICAgICAgICAgICBAIGQyMTogKHkwK3kyKS0oeTEreTMpIHwgKHkwLXkyKS0oeTEteTMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICAgICAgIHgxIHwgeDMgfCBYIHwgWAotCi0gICAgdnRybi4xNiAgICBkMjAsIGQyMSAgICAgICAgICAgICAgICBAIGQyMDogIHgwIHwgeDEgfCBYIHwgWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkMjE6ICB4MiB8IHgzIHwgWCB8IFgKLQotICAgIHZyc2hyLnMxNiAgcTEwLCBxMTAsICMzICAgICAgICAgICAgICAgQCBEaXZpZGUgYnkgOAotCi0gICAgdm1vdi5pMTYgICBxMTEsICMxMjggICAgICAgICAgICAgICBAIHExMSA9IDEyOHwxMjh8MTI4fDEyOHwxMjh8MTI4fDEyOHwxMjgKLSAgICB2cWFkZC5zMTYgIHEwLCBxMTAsIHExMSAgICAgICAgICAgIEAgQWRkIG9mZnNldCB0byBtYWtlIG91dHB1dCBpbiBbMCwyNTVdCi0KLSAgICB2bW92LmkxNiAgIHExMiwgIzAgICAgICAgICAgICAgICAgICAgQCBxMTIgPSBbMDAwMDAwMDAwMDAwMDAwMF0KLSAgICB2bW92LmkxNiAgIHExMywgIzI1NSAgICAgICAgICAgICAgIEAgcTEzID0gW0ZGRkZGRkZGRkZGRkZGRkZdIChoZXgpCi0KLSAgICB2bWF4LnMxNiAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgIEAgQ2xhbXAgPiAwCi0gICAgdm1pbi5zMTYgICBxMCwgcTAsIHExMyAgICAgICAgICAgICBAIENsYW1wIDwgMjU1Ci0KLSAgICB2c3RyICAgICAgIGQwLCBbcjFdICAgICAgICAgICAgICAgIEAgU3RvcmUgIHgwIHwgeDEgfCBYIHwgWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBQb3RlbnRpYWwgb3V0IG9mIGJvdW5kYXJ5IGlzc3VlCi0gICAgYWRkICAgICAgICByMSwgcjEsIHIyICAgICAgICAgICAgICBAIEFkZCB0aGUgb2Zmc2V0IHRvIHRoZSBvdXRwdXQgcG9pbnRlcgotICAgIHZzdHIgICAgICAgZDEsIFtyMV0gICAgICAgICAgICAgICAgQCBTdG9yZSAgeDIgfCB4MyB8IFggfCBYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIFBvdGVudGlhbCBvdXQgb2YgYm91bmRhcnkgaXNzdWUKLSAgICBieCAgICAgICAgIGxyICAgICAgICAgICAgICAgICAgICAgIEAgUmV0dXJuIHRvIGNhbGxlcgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGVuZCBvZiBpZGN0XzJ4Ml92ZW51bQotCi0KLUA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQCBGVU5DVElPTiAgICAgOiBpZGN0XzR4NF92ZW51bQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIERJU0NSSVBUSU9OICA6IFZlTnVtIG9wdGltaXphdGlvbiBvZiBvbmUgNHg0IGJsb2NrIGlEQ1QKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBDIFBST1RPVFlQRSAgOiB2b2lkIGlkY3RfNHg0X3ZlbnVtKGludDE2ICogaW5wdXQsCi1AICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTYgKiBvdXRwdXQsCi1AICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgc3RyaWRlKQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFJFRyBJTlBVVCAgICA6IFIwIHBvaW50ZXIgdG8gaW5wdXQgKGludDE2KQotQCAgICAgICAgICAgICAgICBSMSBwb2ludGVyIHRvIG91dHB1dCAoaW50MTYpCi1AICAgICAgICAgICAgICAgIFIyIGJsb2NrIHN0cmlkZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFNUQUNLIEFSRyAgICA6IE5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBNRU0gSU5QVVQgICAgOiBOb25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgUkVHIE9VVFBVVCAgIDogTm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIE1FTSBPVVRQVVQgICA6IE5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBSRUcgQUZGRUNURUQgOiBSMCAtIFIzLCBSMTIKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBTVEFDSyBVU0FHRSAgOiBub25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgQ1lDTEVTICAgICAgIDogNTYgY3ljbGVzCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgTk9URVMgICAgICAgIDoKLUAKLUAgQVJNIFJFR0lTVEVSIEFMTE9DQVRJT04KLUAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1AIHIwICA6IHBvaW50ZXIgdG8gaW5wdXQgZGF0YQotQCByMSAgOiBwb2ludGVyIHRvIG91dHB1dCBhcmVhCi1AIHIyICA6IHN0cmlkZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgotQCByMyAgOiBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzZXQKLUAgcjEyIDogcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc2V0Ci1AIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAKLUAgVkVOVU0gUkVHSVNURVIgQUxMT0NBVElPTgotQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1AIHEwICAgICA6IGNvZWZmaWNpZW50c1swXQotQCBxMSAgICAgOiBjb2VmZmljaWVudHNbMV0KLUAgcTIgICAgIDogY29lZmZpY2llbnRzWzJdCi1AIHEzICAgICA6IGNvZWZmaWNpZW50c1szXQotQCBxNCAgICAgOiBub3QgdXNlZAotQCBxNSAgICAgOiBub3QgdXNlZAotQCBxNiAgICAgOiBub3QgdXNlZAotQCBxNyAgICAgOiBub3QgdXNlZAotQCBxOCAgICAgOiBpbnB1dCB5MCAtIHk3Ci1AIHE5ICAgICA6IGlucHV0IHk4IC0geTE1Ci1AIHExMCAgICA6IGludGVybWVkaWF0ZSB2YWx1ZQotQCBxMTEgICAgOiBpbnRlcm1lZGlhdGUgdmFsdWUKLUAgcTEyICAgIDogaW50ZXJtZWRpYXRlIHZhbHVlCi1AIHExMyAgICA6IGludGVybWVkaWF0ZSB2YWx1ZQotQCBxMTQgICAgOiBpbnRlcm1lZGlhdGUgdmFsdWUKLUAgcTE1ICAgIDogaW50ZXJtZWRpYXRlIHZhbHVlCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS50eXBlIGlkY3RfNHg0X3ZlbnVtLCAlZnVuY3Rpb24KLWlkY3RfNHg0X3ZlbnVtOgotCi0gICAgICAgIEAgTG9hZCB0aGUgbG9jYXRpb25zIG9mIHRoZSBmaXJzdCAyIHNldHMgb2YgY29lZmZpY2llbnRzCi0gICAgICAgIGxkciAgcjMsICAgPWNvZWZmaWNpZW50KzAqMTYgICBAIGNvZWZmaWNpZW50WzBdCi0gICAgICAgIGxkciAgcjEyLCAgPWNvZWZmaWNpZW50KzEqMTYgICBAIGNvZWZmaWNpZW50WzFdCi0KLSAgICAgICAgQCBMb2FkIHRoZSBmaXJzdCAyIHNldHMgb2YgY29lZmZpY2llbnRzCi0gICAgICAgIHZsZDEuMTYgIHtkMCwgZDF9LFtyM10gICAgICAgICBAIHEwID0gQzQgfCBDMiB8IEM0IHwgQzYgfCBDNCB8IEMyIHwgQzQgfCBDNgotICAgICAgICB2bGQxLjE2ICB7ZDIsIGQzfSxbcjEyXSAgICAgICAgQCBxMSA9IEM0IHwgQzYgfCBDNCB8IEMyIHwgQzQgfCBDNiB8IEM0IHwgQzIKLQotICAgICAgICBAIExvYWQgdGhlIGxvY2F0aW9ucyBvZiB0aGUgc2Vjb25kIDIgc2V0cyBvZiBjb2VmZmljaWVudHMKLSAgICAgICAgbGRyICByMywgICA9Y29lZmZpY2llbnQrMioxNiAgIEAgY29lZmZpY2llbnRbMl0KLSAgICAgICAgbGRyICByMTIsICA9Y29lZmZpY2llbnQrMyoxNiAgIEAgY29lZmZpY2llbnRbM10KLQotICAgICAgICBAIExvYWQgdGhlIHNlY29uZCAyIHNldHMgb2YgY29lZmZpY2llbnRzCi0gICAgICAgIHZsZDEuMTYgIHtkNCwgZDV9LFtyM10gICAgICAgICBAIHEyID0gQzQgfCBDNCB8IEM0IHwgQzQgfCBDMiB8IEMyIHwgQzIgfCBDMgotICAgICAgICB2bGQxLjE2ICB7ZDYsIGQ3fSxbcjEyXSAgICAgICAgQCBxMyA9IEM0IHwgQzQgfCBDNCB8IEM0IHwgQzYgfCBDNiB8IEM2IHwgQzYKLQotICAgICAgICBAIExvYWQgdGhlIGlucHV0IHZhbHVlcwotICAgICAgICB2bGQxLjE2ICB7ZDE2fSwgW3IwXSwgcjIgICAgICAgQCBkMTY6ICAgeTAgIHwgeTEgIHwgeTIgIHwgeTMgIChMU0IgfCBNU0IpCi0gICAgICAgIHZsZDEuMTYgIHtkMTd9LCBbcjBdLCByMiAgICAgICBAIGQxNzogICB5NCAgfCB5NSAgfCB5NiAgfCB5NyAgKExTQiB8IE1TQikKLSAgICAgICAgdmxkMS4xNiAge2QxOH0sIFtyMF0sIHIyICAgICAgIEAgZDE4OiAgIHk4ICB8IHk5ICB8IHkxMCB8IHkxMSAoTFNCIHwgTVNCKQotICAgICAgICB2bGQxLjE2ICB7ZDE5fSwgW3IwXSwgcjIgICAgICAgQCBkMTk6ICAgeTEyIHwgeTEzIHwgeTE0IHwgeTE1IChMU0IgfCBNU0IpCi0KLSAgICAgICAgQCBBcHBseSBpRENUIEhvcml6b25hbGx5Ci0KLSAgICAgICAgQCBxODogeTAgfHkxIHx5MiB8eTMgfHk0IHx5NSB8eTYgfHk3Ci0gICAgICAgIEAgcTk6IHk4IHx5OSB8eTEwfHkxMXx5MTJ8eTEzfHkxNHx5MTUKLQotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBAIHZxcmRtdWxoIGRvdWJsZXMgdGhlIHJlc3VsdCBhbmQgc2F2ZSB0aGUgaGlnaCAxNiBiaXRzIG9mIHRoZSByZXN1bHQsCi0gICAgICAgIEAgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHJpZ2h0IHNoaWZ0IGJ5IDE1IGJpdHMuCi0gICAgICAgIEAgc2luY2UgY29lZmZpY2llbnRzIGFyZSBpbiBRMTUgZm9ybWF0LCBpdCBjb250cmFkaWN0cyB3aXRoIHRoZSByaWdodAotICAgICAgICBAIHNoaWZ0IDE1IGhlcmUsIHNvIHRoZSBmaW5hbCByZXN1bHQgaXMgaW4gUTAgZm9ybWF0Ci0gICAgICAgIEAKLSAgICAgICAgQCB2cXJkbXVsaCB3aWxsIGFsc28gcm91bmQgdGhlIHJlc3VsdAotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgIHZxcmRtdWxoLnMxNiAgcTEwLCBxOCwgcTAgICAgICBAIHExMDogQzQqeTAgIHwgQzIqeTEgIHwgQzQqeTIgIHwgQzYqeTMgIHwgQzQqeTQgIHwgQzIqeTUgIHwgQzQqeTYgIHwgQzYqeTcKLSAgICAgICAgdnFyZG11bGguczE2ICBxMTEsIHE4LCBxMSAgICAgIEAgcTExOiBDNCp5MCAgfCBDNip5MSAgfCBDNCp5MiAgfCBDMip5MyAgfCBDNCp5NCAgfCBDNip5NSAgfCBDNCp5NiAgfCBDMip5NwotCi0gICAgICAgIHZxcmRtdWxoLnMxNiAgcTEyLCBxOSwgcTAgICAgICBAIHExMjogQzQqeTggIHwgQzIqeTkgIHwgQzQqeTEwIHwgQzYqeTExIHwgQzQqeTEyIHwgQzIqeTEzIHwgQzQqeTE0IHwgQzYqeTE1Ci0gICAgICAgIHZxcmRtdWxoLnMxNiAgcTEzLCBxOSwgcTEgICAgICBAIHExMzogQzQqeTggIHwgQzYqeTkgIHwgQzQqeTEwIHwgQzIqeTExIHwgQzQqeTEyIHwgQzYqeTEzIHwgQzQqeTE0IHwgQzIqeTE1Ci0KLSAgICAgICAgdnRybi4zMiAgICAgICBxMTAsIHExMiAgICAgICAgIEAgcTEwOiBDNCp5MCAgfCBDMip5MSAgfCBDNCp5OCAgfCBDMip5OSAgfCBDNCp5NCAgfCBDMip5NSAgfCBDNCp5MTIgfCBDMip5MTMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTEyOiBDNCp5MiAgfCBDNip5MyAgfCBDNCp5MTAgfCBDNip5MTEgfCBDNCp5NiAgfCBDNip5NyAgfCBDNCp5MTQgfCBDNip5MTUKLQotICAgICAgICB2dHJuLjMyICAgICAgIHExMSwgcTEzICAgICAgICAgQCBxMTE6IEM0KnkwICB8IEM2KnkxICB8IEM0Knk4ICB8IEM2Knk5ICB8IEM0Knk0ICB8IEM2Knk1ICB8IEM0KnkxMiB8IEM2KnkxMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTM6IEM0KnkyICB8IEMyKnkzICB8IEM0KnkxMCB8IEMyKnkxMSB8IEM0Knk2ICB8IEMyKnk3ICB8IEM0KnkxNCB8IEMyKnkxNQotCi0gICAgICAgIHZxYWRkLnMxNiAgICAgcTE0LCBxMTAsIHExMiAgICBAIHExNDogQzQqeTAgKyBDNCp5MiB8IEMyKnkxICsgQzYqeTMgfCBDNCp5OCArIEM0KnkxMCB8IEMyKnk5ICsgQzYqeTExIHwgQzQqeTQgKyBDNCp5NiB8IEMyKnk1ICsgQzYqeTcgfCBDNCp5MTIgKyBDNCp5MTQgfCBDMip5MTMgKyBDNip5MTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgICAgICAgUzAgfCBTMiB8IFM4IHwgUzEwIHwgUzQgfCBTNiB8IFMxMiB8IFMxNAotCi0gICAgICAgIHZxc3ViLnMxNiAgICAgcTE1LCBxMTEsIHExMyAgICBAIHExNTogQzQqeTAgLSBDNCp5MiB8IEM2KnkxIC0gQzIqeTMgfCBDNCp5OCAtIEM0KnkxMCB8IEM2Knk5IC0gQzIqeTExIHwgQzQqeTQgLSBDNCp5NiB8IEM2Knk1IC0gQzIqeTcgfCBDNCp5MTIgLSBDNCp5MTQgfCBDNip5MTMgLSBDMip5MTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgICAgICAgUzEgfCBTMyB8IFM5IHwgUzExIHwgUzUgfCBTNyB8IFMxMyB8IFMxNQotCi0gICAgICAgIHZ0cm4uMTYgICAgICAgcTE0LCBxMTUgICAgICAgICBAIHExNDogUzAgfCBTMSB8IFM4ICB8IFM5ICB8IFM0IHwgUzUgfCBTMTIgfCBTMTMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTE1OiBTMiB8IFMzIHwgUzEwIHwgUzExIHwgUzYgfCBTNyB8IFMxNCB8IFMxNQotCi0gICAgICAgIHZxYWRkLnMxNiAgICAgcTgsIHExNCwgcTE1ICAgICBAIHE4OiAgWjAgfCBaMSB8IFo4ICB8IFo5ICB8IFo0IHwgWjUgfCBaMTIgfCBaMTMKLSAgICAgICAgdnFzdWIuczE2ICAgICBxOSwgcTE0LCBxMTUgICAgIEAgcTk6ICBaMyB8IFoyIHwgWjExIHwgWjEwIHwgWjcgfCBaNiB8IFoxNSB8IFoxNAotICAgICAgICB2cmV2MzIuMTYgICAgIHE5LCBxOSAgICAgICAgICAgQCBxOTogIFoyIHwgWjMgfCBaMTAgfCBaMTEgfCBaNiB8IFo3IHwgWjE0IHwgWjE1Ci0KLQotICAgICAgICBAIEFwcGx5IGlEQ1QgVmVydGljYWxseQotCi0gICAgICAgIHZ0cm4uMzIgICAgICAgcTgsIHE5ICAgICAgICAgICBAIHE4OiAgWjAgfCBaMSB8IFoyICB8IFozICB8IFo0ICB8IFo1ICB8IFo2ICB8IFo3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHE5OiAgWjggfCBaOSB8IFoxMCB8IFoxMSB8IFoxMiB8IFoxMyB8IFoxNCB8IFoxNQotCi0KLSAgICAgICAgdnFyZG11bGguczE2ICBxMTAsIHE4LCBxMiAgICAgIEAgcTEwOiBDNCpaMCB8IEM0KloxIHwgQzQqWjIgfCBDNCpaMyB8IEMyKlo0IHwgQzIqWjUgfCBDMipaNiB8IEMyKlo3Ci0gICAgICAgIHZxcmRtdWxoLnMxNiAgcTExLCBxOCwgcTMgICAgICBAIHExMTogQzQqWjAgfCBDNCpaMSB8IEM0KloyIHwgQzQqWjMgfCBDNipaNCB8IEM2Klo1IHwgQzYqWjYgfCBDNipaNwotCi0gICAgICAgIHZxcmRtdWxoLnMxNiAgcTEyLCBxOSwgcTIgICAgICBAIHExMjogQzQqWjggfCBDNCpaOSB8IEM0KloxMCB8IEM0KloxMSB8IEMyKloxMiB8IEMyKloxMyB8IEMyKloxNCB8IEMyKloxNQotICAgICAgICB2cXJkbXVsaC5zMTYgIHExMywgcTksIHEzICAgICAgQCBxMTM6IEM0Klo4IHwgQzQqWjkgfCBDNCpaMTAgfCBDNCpaMTEgfCBDNipaMTIgfCBDNipaMTMgfCBDNipaMTQgfCBDNipaMTUKLQotICAgICAgICB2cWFkZC5zMTYgICAgIHExNCwgcTEwLCBxMTMgICAgQCBxMTQ6IEM0KlowK0M0Klo4IHwgQzQqWjErQzQqWjkgfCBDNCpaMitDNCpaMTAgfCBDNCpaMytDNCpaMTEgfCBDMipaNCtDNipaMTIgfCBDMipaNStDNipaMTMgfCBDMipaNitDNipaMTQgfCBDMipaNytDNipaMTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgICAgICBzMCB8IHM0IHwgczggfCBzMTIgfCBzMiB8IHM2IHwgczEwIHwgczE0Ci0KLSAgICAgICAgdnFzdWIuczE2ICAgICBxMTUsIHExMSwgcTEyICAgIEAgcTE1OiBDNCpaMC1DNCpaOCB8IEM0KloxLUM0Klo5IHwgQzQqWjItQzQqWjEwIHwgQzQqWjMtQzQqWjExIHwgQzYqWjQtQzIqWjEyIHwgQzYqWjUtQzIqWjEzIHwgQzYqWjYtQzIqWjE0IHwgQzYqWjctQzIqWjE1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICAgICAgczEgfCBzNSB8IHM5IHwgczEzIHwgczMgfCBzNyB8IHMxMSB8IHMxNQotCi0gICAgICAgIHZzd3AgICAgICAgICAgZDI5LCBkMzAgICAgICAgICBAIHExNDogczAgfCBzNCB8IHM4ICB8IHMxMiB8IHMxIHwgczUgfCBzOSAgfCBzMTMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTE1OiBzMiB8IHM2IHwgczEwIHwgczE0IHwgczMgfCBzNyB8IHMxMSB8IHMxNQotCi0gICAgICAgIHZxYWRkLnMxNiAgICAgcTgsIHExNCwgcTE1ICAgICBAIHE4OiAgeDAgfCB4NCB8IHg4ICB8IHgxMiB8IHgxIHwgeDUgfCB4OSB8IHgxMwotICAgICAgICB2cXN1Yi5zMTYgICAgIHE5LCBxMTQsIHExNSAgICAgQCBxOTogIHgzIHwgeDcgfCB4MTEgfCB4MTUgfCB4MiB8IHg2IHwgeDEwIHwgeDE0Ci0KLSAgICAgICAgdm1vdi5pMTYgICAgICBxMTAsICMwICAgICAgICAgICBAIHExMD1bMDAwMDAwMDAwMDAwMDAwMF0KLSAgICAgICAgdm1vdi5pMTYgICAgICBxMTEsICMyNTUgICAgICAgIEAgcTExPVtGRkZGRkZGRkZGRkZGRkZGXSAoaGV4KQotCi0gICAgICAgIHZtb3YuaTE2ICAgICAgcTAsICMxMjggICAgICAgICBAIHEwID0gMTI4fDEyOHwxMjh8MTI4fDEyOHwxMjh8MTI4fDEyOAotCi0gICAgICAgIHZxYWRkLnMxNiAgICAgcTgsIHE4LCBxMCAgICAgICBAIEFkZCB0aGUgb2Zmc2V0Ci0gICAgICAgIHZxYWRkLnMxNiAgICAgcTksIHE5LCBxMCAgICAgICBAIEFkZCB0aGUgb2Zmc2V0Ci0KLSAgICAgICAgdm1heC5zMTYgICAgICBxOCwgcTgsIHExMCAgICAgIEAgY2xhbXAgPiAwCi0gICAgICAgIHZtaW4uczE2ICAgICAgcTgsIHE4LCBxMTEgICAgICBAIGNsYW1wIDwgMjU1Ci0KLSAgICAgICAgdm1heC5zMTYgICAgICBxOSwgcTksIHExMCAgICAgIEAgY2xhbXAgPiAwCi0gICAgICAgIHZtaW4uczE2ICAgICAgcTksIHE5LCBxMTEgICAgICBAIGNsYW1wIDwgMjU1Ci0KLSAgICAgICAgdnN0MS4xNiAgICAgICB7ZDE2fSwgW3IxXSwgcjIgIEAgIGQxNjogICB4MCB8IHgxICB8IHgyICB8IHgzICAoTFNCIHwgTVNCKQotICAgICAgICB2c3QxLjE2ICAgICAgIHtkMTd9LCBbcjFdLCByMiAgQCAgZDE3OiAgIHg0IHwgeDUgIHwgeDYgIHwgeDcgIChMU0IgfCBNU0IpCi0gICAgICAgIHZzdDEuMTYgICAgICAge2QxOX0sIFtyMV0sIHIyICBAICBkMTg6ICAgeDggfCB4OSAgfCB4MTAgfCB4MTEgKExTQiB8IE1TQikKLSAgICAgICAgdnN0MS4xNiAgICAgICB7ZDE4fSwgW3IxXSwgcjIgIEAgIGQxOTogICB4MTJ8IHgxMyB8IHgxNCB8IHgxNSAoTFNCIHwgTVNCKQotCi0gICAgICAgIGJ4ICAgICAgICAgbHIgICAgICAgICAgICAgICAgICBAIFJldHVybiB0byBjYWxsZXIKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBlbmQgb2YgaWRjdF80eDRfdmVudW0KLQotQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1AIEZVTkNUSU9OICAgICA6IGlkY3RfOHg4X3ZlbnVtCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgRElTQ1JJUFRJT04gIDogVmVOdW0gb3B0aW1pemF0aW9uIG9mIG9uZSA4eDggYmxvY2sgaURDVAotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIEMgUFJPVE9UWVBFICA6IHZvaWQgaWRjdF84eDhfdmVudW0oaW50MTYgKiBpbnB1dCwKLUAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNiAqIG91dHB1dCwKLUAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiBzdHJpZGUpCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgUkVHIElOUFVUICAgIDogUjAgcG9pbnRlciB0byBpbnB1dCAoaW50MTYpCi1AICAgICAgICAgICAgICAgIFIxIHBvaW50ZXIgdG8gb3V0cHV0IChpbnQxNikKLUAgICAgICAgICAgICAgICAgUjIgYmxvY2sgc3RyaWRlCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgU1RBQ0sgQVJHICAgIDogTm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIE1FTSBJTlBVVCAgICA6IE5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBSRUcgT1VUUFVUICAgOiBOb25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgTUVNIE9VVFBVVCAgIDogTm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFJFRyBBRkZFQ1RFRCA6IFIwIC0gUjkKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBTVEFDSyBVU0FHRSAgOiBub25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgQ1lDTEVTICAgICAgIDogMTc3IGN5Y2xlcwotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIE5PVEVTICAgICAgICA6Ci1ACi1AIEl0IHdhcyB0ZXN0ZWQgdG8gYmUgSUVFRSAxMTgwIGNvbXBsaWFudC4gU2luY2UgSUVFRSAxMTgwIGNvbXBsaWFuY2UgaXMgbW9yZSBzdHJpbmdlbnQKLUAgdGhhbiBNUEVHLTQgY29tcGxpYW5jZSwgdGhpcyB2ZXJzaW9uIGlzIGFsc28gTVBFRy00IGNvbXBsaWFudC4KLUAKLUAgQ09ERSBTVFJVQ1RVUkU6Ci1AIChpKSAgIE1hY3JvcyBmb3IgdHJhbnNwb3NpbmcgYW4gOHg4IG1hdHJpeCBhbmQgZm9yIGNvbmZpZ3VyaW5nIHRoZSBWRlAgdW5pdCBhcmUgZGVmaW5lZC4KLUAgKGlpKSAgTWFjcm8gZm9yIElEQ1QgaW4gb25lIGRpbWVuc2lvbiBpcyBkZWZpbmVkIGFzIGZvdXIgc3RhZ2VzCi1AIChpaWkpIFRoZSB0d28gZGltZW5zaW9uYWwgY29kZSBiZWdpbnMKLUAgKGl2KSAgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHRoZSBhcmVhIERhdGFBcmVhCi1ACi1AIFBST0dSQU0gRkxPVzoKLUAKLUAgVGhlIFZGUCBpcyBjb25maWd1cmVkCi1AIFRoZSBwYXJhbWV0ZXJzIHRvIElEQ1QgYXJlIGxvYWRlZAotQCB0aGUgY29lZmZpY2llbnRzIGFyZSBsb2FkZWQKLUAgbG9vcDoKLUAgICAgZGVjcmVtZW50IGxvb3AgY291bnRlcgotQCAgICBUaGUgZmlyc3QgaW5wdXQgTWF0cml4IGlzIGxvYWRlZCBhbmQgcHJlLXNjYWxlZAotQCAgICBUaGUgaW5wdXQgaXMgcHJlc2NhbGVkIHVzaW5nIHRoZSBjb25zdGFudHMKLUAgICAgSURDVCBpcyBwZXJmb3JtZWQgaW4gb25lIGRpbWVuc2lvbiBvbiB0aGUgOCBjb2x1bW5zCi1AICAgIFRoZSBtYXRyaXggaXMgdHJhbnNwb3NlZAotQCAgICBBIGJpYXMgaXMgbG9hZGVkIGFuIGFkZGVkIHRvIHRoZSBtYXRyaXgKLUAgICAgSURDVCBpcyBwZXJmb3JtZWQgaW4gb25lIGRpbWVuc2lvbiBvbiB0aGUgOCByb3dzCi1AICAgIFRoZSBtYXRyaXggaXMgcG9zdC1zY2FsZWQKLUAgICAgVGhlIG1hdHJpeCBpcyBzYXZlZAotQCAgICB0ZXN0IGxvb3AgY291bnRlciBhbmQgbG9vcCBpZiBncmVhdGVyIHRoYW4gemVybwotQCBzdG9wCi1ACi1ACi1AIEFSTSBSRUdJU1RFUiBBTExPQ0FUSU9OCi1AID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQCByMCA6IHBvaW50ZXIgdG8gaW5wdXQgZGF0YQotQCByMSA6IHBvaW50ZXIgdG8gb3V0cHV0IGFyZQotQCByMiA6IHN0cmlkZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgotQCByMyA6Ci1AIHI0IDoKLUAgcjUgOiBwb2ludGVyIHRvIGNvbnN0YW50c1swXSBbNV0KLUAgcjYgOiBwb2ludGVyIHRvIGNvbnN0YW50c1sxXQotQCByNyA6IHBvaW50ZXIgdG8gY29uc3RhbnRzWzJdCi1AIHI4IDogcG9pbnRlciB0byBjb25zdGFudHNbM10KLUAgcjkgOiBwb2ludGVyIHRvIGNvbnN0YW50c1s0XQotQCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ACi1AIFZFTlVNIFJFR0lTVEVSIEFMTE9DQVRJT04KLUAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQCBxMCAgICAgOiBjb25zdGFudHNbMF0KLUAgcTEgICAgIDogY29uc3RhbnRzWzFdCi1AIHEyICAgICA6IGNvbnN0YW50c1syXSwgSURDVDFEIGluLXBsYWNlIHNjcmF0Y2gKLUAgcTMgICAgIDogY29uc3RhbnRzWzNdLCBJRENUMUQgaW4tcGxhY2Ugc2NyYXRjaAotQCBxNCAgICAgOiBjb25zdGFudHNbNF0sIElEQ1QxRCBpbi1wbGFjZSBzY3JhdGNoLCBhbmQgYmlhcyBjb21wZW5zYXRpb24KLUAgcTUgICAgIDogICAgICAgICAgICAgICBJRENUMUQgaW4tcGxhY2Ugc2NyYXRjaAotQCBxNiAgICAgOiAgICAgICAgICAgICAgIElEQ1QxRCBpbi1wbGFjZSBzY3JhdGNoCi1AIHE3ICAgICA6ICAgICAgICAgICAgICAgSURDVDFEIGluLXBsYWNlIHNjcmF0Y2gKLUAgcTggICAgIDogTWF0cml4WzBdICAgICBJRENUMUQgaW4tcGxhY2Ugc2NyYXRjaAotQCBxOSAgICAgOiBNYXRyaXhbMV0gICAgIElEQ1QxRCBpbi1wbGFjZSBzY3JhdGNoCi1AIHExMCAgICA6IE1hdHJpeFsyXSAgICAgSURDVDFEIGluLXBsYWNlIHNjcmF0Y2gKLUAgcTExICAgIDogTWF0cml4WzNdICAgICBJRENUMUQgaW4tcGxhY2Ugc2NyYXRjaAotQCBxMTIgICAgOiBNYXRyaXhbNF0gICAgIElEQ1QxRCBpbi1wbGFjZSBzY3JhdGNoCi1AIHExMyAgICA6IE1hdHJpeFs1XSAgICAgSURDVDFEIGluLXBsYWNlIHNjcmF0Y2gKLUAgcTE0ICAgIDogTWF0cml4WzZdICAgICBJRENUMUQgaW4tcGxhY2Ugc2NyYXRjaAotQCBxMTUgICAgOiBNYXRyaXhbN10gICAgIElEQ1QxRCBpbi1wbGFjZSBzY3JhdGNoCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS50eXBlIGlkY3RfOHg4X3ZlbnVtLCAlZnVuY3Rpb24KLWlkY3RfOHg4X3ZlbnVtOgotCi0gICAgICAgIHB1c2gge3I1LXI5fQotICAgICAgICB2cHVzaCB7ZDgtZDE1fQotICAgICAgICBJRENUX0VOVFJZCi0gICAgICAgIEJJR19CT0RZX1RSQU5TUE9TRV9JTlBVVAotICAgICAgICB2cG9wIHtkOC1kMTV9Ci0gICAgICAgIHBvcCAge3I1LXI5fQotICAgICAgICBieCAgIGxyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGVuZCBvZiBpZGN0Xzh4OF92ZW51bQotCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUAgQ29uc3RhbnRzIERlZmluaXRpb24gQVJFQTogZGVmaW5lIGlkY3Qga2VybmVsLCBiaWFzCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAuc2VjdGlvbiByb19kYXRhX2FyZWEgICAgICAgICAgICAgIEAgQVJFQSAgUk9EYXRhQXJlYQotICAgIC5kYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEQVRBLCBSRUFET05MWQotICAgIC5hbGlnbiA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBBTElHTj01Ci0KLWNvbnN0YW50czoKLSAgICAgICAgLmh3b3JkICAyMzE3MCwgMTM1NzMsIDY1MTgsICAyMTg5NSwgLTIzMTcwLCAtMjE4OTUsIDgyMjMsICA4MjI0Ci0gICAgICAgIC5od29yZCAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAgMTkyNjYsICAyMTQwNywgMjI3MjUKLSAgICAgICAgLmh3b3JkICAyMjcyNSwgMzE1MjEsIDI5NjkyLCAyNjcyMiwgMjI3MjUsICAyNjcyMiwgIDI5NjkyLCAzMTUyMQotICAgICAgICAuaHdvcmQgIDIxNDA3LCAyOTY5MiwgMjc5NjksIDI1MTcyLCAyMTQwNywgIDI1MTcyLCAgMjc5NjksIDI5NjkyCi0gICAgICAgIC5od29yZCAgMTkyNjYsIDI2NzIyLCAyNTE3MiwgMjI2NTQsIDE5MjY2LCAgMjI2NTQsICAyNTE3MiwgMjY3MjIKLSAgICAgICAgLmh3b3JkICAgICAgMCwgICAyNTUsICAgICAwLCAgICAgMAotCi1jb2VmZmljaWVudDogICAgICAgICAgICAgICAgICAgICAgICAgICBAIFRoZXNlIGFyZSB0aGUgY29lZmZpY2VudCB1c2VkIGJ5IDR4NCBpRENUIGluIFExNSBmb3JtYXQKLSAgICAgICAgLmh3b3JkIDExNTg1LCAxNTEzNywgIDExNTg1LCAgNjI3MCwgMTE1ODUsIDE1MTM3LCAgMTE1ODUsICA2MjcwICBAIEM0LCBDMiwgQzQsIEM2LCBDNCwgQzIsIEM0LCBDNiAvMgotICAgICAgICAuaHdvcmQgMTE1ODUsICA2MjcwLCAgMTE1ODUsIDE1MTM3LCAxMTU4NSwgIDYyNzAsICAxMTU4NSwgMTUxMzcgIEAgQzQsIEM2LCBDNCwgQzIsIEM0LCBDNiwgQzQsIEMyIC8yCi0gICAgICAgIC5od29yZCAxMTU4NSwgMTE1ODUsICAxMTU4NSwgMTE1ODUsIDE1MTM3LCAxNTEzNywgIDE1MTM3LCAxNTEzNyAgQCBDNCwgQzQsIEM0LCBDNCwgQzIsIEMyLCBDMiwgQzIgLzIKLSAgICAgICAgLmh3b3JkIDExNTg1LCAxMTU4NSwgIDExNTg1LCAxMTU4NSwgIDYyNzAsICA2MjcwLCAgIDYyNzAsICA2MjcwICBAIEM0LCBDNCwgQzQsIEM0LCBDNiwgQzYsIEM2LCBDNiAvMgotCi0uZW5kCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9jZGVycm9yLmggYi9saWJqcGVndHdycC9jZGVycm9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDM1ZTEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvY2RlcnJvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBjZGVycm9yLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBlcnJvciBhbmQgbWVzc2FnZSBjb2RlcyBmb3IgdGhlIGNqcGVnL2RqcGVnCi0gKiBhcHBsaWNhdGlvbnMuICBUaGVzZSBzdHJpbmdzIGFyZSBub3QgbmVlZGVkIGFzIHBhcnQgb2YgdGhlIEpQRUcgbGlicmFyeQotICogcHJvcGVyLgotICogRWRpdCB0aGlzIGZpbGUgdG8gYWRkIG5ldyBjb2Rlcywgb3IgdG8gdHJhbnNsYXRlIHRoZSBtZXNzYWdlIHN0cmluZ3MgdG8KLSAqIHNvbWUgb3RoZXIgbGFuZ3VhZ2UuCi0gKi8KLQotLyoKLSAqIFRvIGRlZmluZSB0aGUgZW51bSBsaXN0IG9mIG1lc3NhZ2UgY29kZXMsIGluY2x1ZGUgdGhpcyBmaWxlIHdpdGhvdXQKLSAqIGRlZmluaW5nIG1hY3JvIEpNRVNTQUdFLiAgVG8gY3JlYXRlIGEgbWVzc2FnZSBzdHJpbmcgdGFibGUsIGluY2x1ZGUgaXQKLSAqIGFnYWluIHdpdGggYSBzdWl0YWJsZSBKTUVTU0FHRSBkZWZpbml0aW9uIChzZWUgamVycm9yLmMgZm9yIGFuIGV4YW1wbGUpLgotICovCi0jaWZuZGVmIEpNRVNTQUdFCi0jaWZuZGVmIENERVJST1JfSAotI2RlZmluZSBDREVSUk9SX0gKLS8qIEZpcnN0IHRpbWUgdGhyb3VnaCwgZGVmaW5lIHRoZSBlbnVtIGxpc3QgKi8KLSNkZWZpbmUgSk1BS0VfRU5VTV9MSVNUCi0jZWxzZQotLyogUmVwZWF0ZWQgaW5jbHVzaW9ucyBvZiB0aGlzIGZpbGUgYXJlIG5vLW9wcyB1bmxlc3MgSk1FU1NBR0UgaXMgZGVmaW5lZCAqLwotI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykKLSNlbmRpZiAvKiBDREVSUk9SX0ggKi8KLSNlbmRpZiAvKiBKTUVTU0FHRSAqLwotCi0jaWZkZWYgSk1BS0VfRU5VTV9MSVNUCi0KLXR5cGVkZWYgZW51bSB7Ci0KLSNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCWNvZGUgLAotCi0jZW5kaWYgLyogSk1BS0VfRU5VTV9MSVNUICovCi0KLUpNRVNTQUdFKEpNU0dfRklSU1RBRERPTkNPREU9MTAwMCwgTlVMTCkgLyogTXVzdCBiZSBmaXJzdCBlbnRyeSEgKi8KLQotI2lmZGVmIEJNUF9TVVBQT1JURUQKLUpNRVNTQUdFKEpFUlJfQk1QX0JBRENNQVAsICJVbnN1cHBvcnRlZCBCTVAgY29sb3JtYXAgZm9ybWF0IikKLUpNRVNTQUdFKEpFUlJfQk1QX0JBRERFUFRILCAiT25seSA4LSBhbmQgMjQtYml0IEJNUCBmaWxlcyBhcmUgc3VwcG9ydGVkIikKLUpNRVNTQUdFKEpFUlJfQk1QX0JBREhFQURFUiwgIkludmFsaWQgQk1QIGZpbGU6IGJhZCBoZWFkZXIgbGVuZ3RoIikKLUpNRVNTQUdFKEpFUlJfQk1QX0JBRFBMQU5FUywgIkludmFsaWQgQk1QIGZpbGU6IGJpUGxhbmVzIG5vdCBlcXVhbCB0byAxIikKLUpNRVNTQUdFKEpFUlJfQk1QX0NPTE9SU1BBQ0UsICJCTVAgb3V0cHV0IG11c3QgYmUgZ3JheXNjYWxlIG9yIFJHQiIpCi1KTUVTU0FHRShKRVJSX0JNUF9DT01QUkVTU0VELCAiU29ycnksIGNvbXByZXNzZWQgQk1QcyBub3QgeWV0IHN1cHBvcnRlZCIpCi1KTUVTU0FHRShKRVJSX0JNUF9OT1QsICJOb3QgYSBCTVAgZmlsZSAtIGRvZXMgbm90IHN0YXJ0IHdpdGggQk0iKQotSk1FU1NBR0UoSlRSQ19CTVAsICIldXgldSAyNC1iaXQgQk1QIGltYWdlIikKLUpNRVNTQUdFKEpUUkNfQk1QX01BUFBFRCwgIiV1eCV1IDgtYml0IGNvbG9ybWFwcGVkIEJNUCBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX0JNUF9PUzIsICIldXgldSAyNC1iaXQgT1MyIEJNUCBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX0JNUF9PUzJfTUFQUEVELCAiJXV4JXUgOC1iaXQgY29sb3JtYXBwZWQgT1MyIEJNUCBpbWFnZSIpCi0jZW5kaWYgLyogQk1QX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgR0lGX1NVUFBPUlRFRAotSk1FU1NBR0UoSkVSUl9HSUZfQlVHLCAiR0lGIG91dHB1dCBnb3QgY29uZnVzZWQiKQotSk1FU1NBR0UoSkVSUl9HSUZfQ09ERVNJWkUsICJCb2d1cyBHSUYgY29kZXNpemUgJWQiKQotSk1FU1NBR0UoSkVSUl9HSUZfQ09MT1JTUEFDRSwgIkdJRiBvdXRwdXQgbXVzdCBiZSBncmF5c2NhbGUgb3IgUkdCIikKLUpNRVNTQUdFKEpFUlJfR0lGX0lNQUdFTk9URk9VTkQsICJUb28gZmV3IGltYWdlcyBpbiBHSUYgZmlsZSIpCi1KTUVTU0FHRShKRVJSX0dJRl9OT1QsICJOb3QgYSBHSUYgZmlsZSIpCi1KTUVTU0FHRShKVFJDX0dJRiwgIiV1eCV1eCVkIEdJRiBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX0dJRl9CQURWRVJTSU9OLAotCSAiV2FybmluZzogdW5leHBlY3RlZCBHSUYgdmVyc2lvbiBudW1iZXIgJyVjJWMlYyciKQotSk1FU1NBR0UoSlRSQ19HSUZfRVhURU5TSU9OLCAiSWdub3JpbmcgR0lGIGV4dGVuc2lvbiBibG9jayBvZiB0eXBlIDB4JTAyeCIpCi1KTUVTU0FHRShKVFJDX0dJRl9OT05TUVVBUkUsICJDYXV0aW9uOiBub25zcXVhcmUgcGl4ZWxzIGluIGlucHV0IikKLUpNRVNTQUdFKEpXUk5fR0lGX0JBRERBVEEsICJDb3JydXB0IGRhdGEgaW4gR0lGIGZpbGUiKQotSk1FU1NBR0UoSldSTl9HSUZfQ0hBUiwgIkJvZ3VzIGNoYXIgMHglMDJ4IGluIEdJRiBmaWxlLCBpZ25vcmluZyIpCi1KTUVTU0FHRShKV1JOX0dJRl9FTkRDT0RFLCAiUHJlbWF0dXJlIGVuZCBvZiBHSUYgaW1hZ2UiKQotSk1FU1NBR0UoSldSTl9HSUZfTk9NT1JFREFUQSwgIlJhbiBvdXQgb2YgR0lGIGJpdHMiKQotI2VuZGlmIC8qIEdJRl9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBQTV9TVVBQT1JURUQKLUpNRVNTQUdFKEpFUlJfUFBNX0NPTE9SU1BBQ0UsICJQUE0gb3V0cHV0IG11c3QgYmUgZ3JheXNjYWxlIG9yIFJHQiIpCi1KTUVTU0FHRShKRVJSX1BQTV9OT05OVU1FUklDLCAiTm9ubnVtZXJpYyBkYXRhIGluIFBQTSBmaWxlIikKLUpNRVNTQUdFKEpFUlJfUFBNX05PVCwgIk5vdCBhIFBQTS9QR00gZmlsZSIpCi1KTUVTU0FHRShKVFJDX1BHTSwgIiV1eCV1IFBHTSBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX1BHTV9URVhULCAiJXV4JXUgdGV4dCBQR00gaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19QUE0sICIldXgldSBQUE0gaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19QUE1fVEVYVCwgIiV1eCV1IHRleHQgUFBNIGltYWdlIikKLSNlbmRpZiAvKiBQUE1fU1VQUE9SVEVEICovCi0KLSNpZmRlZiBSTEVfU1VQUE9SVEVECi1KTUVTU0FHRShKRVJSX1JMRV9CQURFUlJPUiwgIkJvZ3VzIGVycm9yIGNvZGUgZnJvbSBSTEUgbGlicmFyeSIpCi1KTUVTU0FHRShKRVJSX1JMRV9DT0xPUlNQQUNFLCAiUkxFIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQotSk1FU1NBR0UoSkVSUl9STEVfRElNRU5TSU9OUywgIkltYWdlIGRpbWVuc2lvbnMgKCV1eCV1KSB0b28gbGFyZ2UgZm9yIFJMRSIpCi1KTUVTU0FHRShKRVJSX1JMRV9FTVBUWSwgIkVtcHR5IFJMRSBmaWxlIikKLUpNRVNTQUdFKEpFUlJfUkxFX0VPRiwgIlByZW1hdHVyZSBFT0YgaW4gUkxFIGhlYWRlciIpCi1KTUVTU0FHRShKRVJSX1JMRV9NRU0sICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBSTEUgaGVhZGVyIikKLUpNRVNTQUdFKEpFUlJfUkxFX05PVCwgIk5vdCBhbiBSTEUgZmlsZSIpCi1KTUVTU0FHRShKRVJSX1JMRV9UT09NQU5ZQ0hBTk5FTFMsICJDYW5ub3QgaGFuZGxlICVkIG91dHB1dCBjaGFubmVscyBmb3IgUkxFIikKLUpNRVNTQUdFKEpFUlJfUkxFX1VOU1VQUE9SVEVELCAiQ2Fubm90IGhhbmRsZSB0aGlzIFJMRSBzZXR1cCIpCi1KTUVTU0FHRShKVFJDX1JMRSwgIiV1eCV1IGZ1bGwtY29sb3IgUkxFIGZpbGUiKQotSk1FU1NBR0UoSlRSQ19STEVfRlVMTE1BUCwgIiV1eCV1IGZ1bGwtY29sb3IgUkxFIGZpbGUgd2l0aCBtYXAgb2YgbGVuZ3RoICVkIikKLUpNRVNTQUdFKEpUUkNfUkxFX0dSQVksICIldXgldSBncmF5c2NhbGUgUkxFIGZpbGUiKQotSk1FU1NBR0UoSlRSQ19STEVfTUFQR1JBWSwgIiV1eCV1IGdyYXlzY2FsZSBSTEUgZmlsZSB3aXRoIG1hcCBvZiBsZW5ndGggJWQiKQotSk1FU1NBR0UoSlRSQ19STEVfTUFQUEVELCAiJXV4JXUgY29sb3JtYXBwZWQgUkxFIGZpbGUgd2l0aCBtYXAgb2YgbGVuZ3RoICVkIikKLSNlbmRpZiAvKiBSTEVfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLUpNRVNTQUdFKEpFUlJfVEdBX0JBRENNQVAsICJVbnN1cHBvcnRlZCBUYXJnYSBjb2xvcm1hcCBmb3JtYXQiKQotSk1FU1NBR0UoSkVSUl9UR0FfQkFEUEFSTVMsICJJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIFRhcmdhIGZpbGUiKQotSk1FU1NBR0UoSkVSUl9UR0FfQ09MT1JTUEFDRSwgIlRhcmdhIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQotSk1FU1NBR0UoSlRSQ19UR0EsICIldXgldSBSR0IgVGFyZ2EgaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19UR0FfR1JBWSwgIiV1eCV1IGdyYXlzY2FsZSBUYXJnYSBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX1RHQV9NQVBQRUQsICIldXgldSBjb2xvcm1hcHBlZCBUYXJnYSBpbWFnZSIpCi0jZWxzZQotSk1FU1NBR0UoSkVSUl9UR0FfTk9UQ09NUCwgIlRhcmdhIHN1cHBvcnQgd2FzIG5vdCBjb21waWxlZCIpCi0jZW5kaWYgLyogVEFSR0FfU1VQUE9SVEVEICovCi0KLUpNRVNTQUdFKEpFUlJfQkFEX0NNQVBfRklMRSwKLQkgIkNvbG9yIG1hcCBmaWxlIGlzIGludmFsaWQgb3Igb2YgdW5zdXBwb3J0ZWQgZm9ybWF0IikKLUpNRVNTQUdFKEpFUlJfVE9PX01BTllfQ09MT1JTLAotCSAiT3V0cHV0IGZpbGUgZm9ybWF0IGNhbm5vdCBoYW5kbGUgJWQgY29sb3JtYXAgZW50cmllcyIpCi1KTUVTU0FHRShKRVJSX1VOR0VUQ19GQUlMRUQsICJ1bmdldGMgZmFpbGVkIikKLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLUpNRVNTQUdFKEpFUlJfVU5LTk9XTl9GT1JNQVQsCi0JICJVbnJlY29nbml6ZWQgaW5wdXQgZmlsZSBmb3JtYXQgLS0tIHBlcmhhcHMgeW91IG5lZWQgLXRhcmdhIikKLSNlbHNlCi1KTUVTU0FHRShKRVJSX1VOS05PV05fRk9STUFULCAiVW5yZWNvZ25pemVkIGlucHV0IGZpbGUgZm9ybWF0IikKLSNlbmRpZgotSk1FU1NBR0UoSkVSUl9VTlNVUFBPUlRFRF9GT1JNQVQsICJVbnN1cHBvcnRlZCBvdXRwdXQgZmlsZSBmb3JtYXQiKQotCi0jaWZkZWYgSk1BS0VfRU5VTV9MSVNUCi0KLSAgSk1TR19MQVNUQURET05DT0RFCi19IEFERE9OX01FU1NBR0VfQ09ERTsKLQotI3VuZGVmIEpNQUtFX0VOVU1fTElTVAotI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLwotCi0vKiBaYXAgSk1FU1NBR0UgbWFjcm8gc28gdGhhdCBmdXR1cmUgcmUtaW5jbHVzaW9ucyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQgKi8KLSN1bmRlZiBKTUVTU0FHRQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvY2RqcGVnLmMgYi9saWJqcGVndHdycC9jZGpwZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyNTBmZi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9jZGpwZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKgotICogY2RqcGVnLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gc3VwcG9ydCByb3V0aW5lcyB1c2VkIGJ5IHRoZSBJSkcgYXBwbGljYXRpb24KLSAqIHByb2dyYW1zIChjanBlZywgZGpwZWcsIGpwZWd0cmFuKS4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotI2luY2x1ZGUgPGN0eXBlLmg+CQkvKiB0byBkZWNsYXJlIGlzdXBwZXIoKSwgdG9sb3dlcigpICovCi0jaWZkZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotI2luY2x1ZGUgPHNpZ25hbC5oPgkJLyogdG8gZGVjbGFyZSBzaWduYWwoKSAqLwotI2VuZGlmCi0jaWZkZWYgVVNFX1NFVE1PREUKLSNpbmNsdWRlIDxmY250bC5oPgkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkncyBwYXJhbWV0ZXIgbWFjcm9zICovCi0vKiBJZiB5b3UgaGF2ZSBzZXRtb2RlKCkgYnV0IG5vdCA8aW8uaD4sIGp1c3QgZGVsZXRlIHRoaXMgbGluZTogKi8KLSNpbmNsdWRlIDxpby5oPgkJCS8qIHRvIGRlY2xhcmUgc2V0bW9kZSgpICovCi0jZW5kaWYKLQotCi0vKgotICogU2lnbmFsIGNhdGNoZXIgdG8gZW5zdXJlIHRoYXQgdGVtcG9yYXJ5IGZpbGVzIGFyZSByZW1vdmVkIGJlZm9yZSBhYm9ydGluZy4KLSAqIE5COiBmb3IgQW1pZ2EgTWFueCBDIHRoaXMgaXMgYWN0dWFsbHkgYSBnbG9iYWwgcm91dGluZSBuYW1lZCBfYWJvcnQoKTsKLSAqIHdlIHB1dCAiI2RlZmluZSBzaWduYWxfY2F0Y2hlciBfYWJvcnQiIGluIGpjb25maWcuaC4gIFRhbGsgYWJvdXQgYm9ndXMuLi4KLSAqLwotCi0jaWZkZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotCi1zdGF0aWMgal9jb21tb25fcHRyIHNpZ19jaW5mbzsKLQotdm9pZAkJCQkvKiBtdXN0IGJlIGdsb2JhbCBmb3IgTWFueCBDICovCi1zaWduYWxfY2F0Y2hlciAoaW50IHNpZ251bSkKLXsKLSAgaWYgKHNpZ19jaW5mbyAhPSBOVUxMKSB7Ci0gICAgaWYgKHNpZ19jaW5mby0+ZXJyICE9IE5VTEwpIC8qIHR1cm4gb2ZmIHRyYWNlIG91dHB1dCAqLwotICAgICAgc2lnX2NpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMDsKLSAgICBqcGVnX2Rlc3Ryb3koc2lnX2NpbmZvKTsJLyogY2xlYW4gdXAgbWVtb3J5IGFsbG9jYXRpb24gJiB0ZW1wIGZpbGVzICovCi0gIH0KLSAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLUdMT0JBTCh2b2lkKQotZW5hYmxlX3NpZ25hbF9jYXRjaGVyIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIHNpZ19jaW5mbyA9IGNpbmZvOwotI2lmZGVmIFNJR0lOVAkJCS8qIG5vdCBhbGwgc3lzdGVtcyBoYXZlIFNJR0lOVCAqLwotICBzaWduYWwoU0lHSU5ULCBzaWduYWxfY2F0Y2hlcik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdURVJNCQkJLyogbm90IGFsbCBzeXN0ZW1zIGhhdmUgU0lHVEVSTSAqLwotICBzaWduYWwoU0lHVEVSTSwgc2lnbmFsX2NhdGNoZXIpOwotI2VuZGlmCi19Ci0KLSNlbmRpZgotCi0KLS8qCi0gKiBPcHRpb25hbCBwcm9ncmVzcyBtb25pdG9yOiBkaXNwbGF5IGEgcGVyY2VudC1kb25lIGZpZ3VyZSBvbiBzdGRlcnIuCi0gKi8KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotCi1NRVRIT0RERUYodm9pZCkKLXByb2dyZXNzX21vbml0b3IgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgY2RfcHJvZ3Jlc3NfcHRyIHByb2cgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7Ci0gIGludCB0b3RhbF9wYXNzZXMgPSBwcm9nLT5wdWIudG90YWxfcGFzc2VzICsgcHJvZy0+dG90YWxfZXh0cmFfcGFzc2VzOwotICBpbnQgcGVyY2VudF9kb25lID0gKGludCkgKHByb2ctPnB1Yi5wYXNzX2NvdW50ZXIqMTAwTC9wcm9nLT5wdWIucGFzc19saW1pdCk7Ci0KLSAgaWYgKHBlcmNlbnRfZG9uZSAhPSBwcm9nLT5wZXJjZW50X2RvbmUpIHsKLSAgICBwcm9nLT5wZXJjZW50X2RvbmUgPSBwZXJjZW50X2RvbmU7Ci0gICAgaWYgKHRvdGFsX3Bhc3NlcyA+IDEpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiXHJQYXNzICVkLyVkOiAlM2QlJSAiLAotCSAgICAgIHByb2ctPnB1Yi5jb21wbGV0ZWRfcGFzc2VzICsgcHJvZy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcyArIDEsCi0JICAgICAgdG90YWxfcGFzc2VzLCBwZXJjZW50X2RvbmUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlxyICUzZCUlICIsIHBlcmNlbnRfZG9uZSk7Ci0gICAgfQotICAgIGZmbHVzaChzdGRlcnIpOwotICB9Ci19Ci0KLQotR0xPQkFMKHZvaWQpCi1zdGFydF9wcm9ncmVzc19tb25pdG9yIChqX2NvbW1vbl9wdHIgY2luZm8sIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcykKLXsKLSAgLyogRW5hYmxlIHByb2dyZXNzIGRpc3BsYXksIHVubGVzcyB0cmFjZSBvdXRwdXQgaXMgb24gKi8KLSAgaWYgKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID09IDApIHsKLSAgICBwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IgPSBwcm9ncmVzc19tb25pdG9yOwotICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzID0gMDsKLSAgICBwcm9ncmVzcy0+dG90YWxfZXh0cmFfcGFzc2VzID0gMDsKLSAgICBwcm9ncmVzcy0+cGVyY2VudF9kb25lID0gLTE7Ci0gICAgY2luZm8tPnByb2dyZXNzID0gJnByb2dyZXNzLT5wdWI7Ci0gIH0KLX0KLQotCi1HTE9CQUwodm9pZCkKLWVuZF9wcm9ncmVzc19tb25pdG9yIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIC8qIENsZWFyIGF3YXkgcHJvZ3Jlc3MgZGlzcGxheSAqLwotICBpZiAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPT0gMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiXHIgICAgICAgICAgICAgICAgXHIiKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLSAgfQotfQotCi0jZW5kaWYKLQotCi0vKgotICogQ2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZyBvZiBwb3NzaWJseS1hYmJyZXZpYXRlZCBrZXl3b3JkIHN3aXRjaGVzLgotICoga2V5d29yZCBpcyB0aGUgY29uc3RhbnQga2V5d29yZCAobXVzdCBiZSBsb3dlciBjYXNlIGFscmVhZHkpLAotICogbWluY2hhcnMgaXMgbGVuZ3RoIG9mIG1pbmltdW0gbGVnYWwgYWJicmV2aWF0aW9uLgotICovCi0KLUdMT0JBTChib29sZWFuKQota2V5bWF0Y2ggKGNoYXIgKiBhcmcsIGNvbnN0IGNoYXIgKiBrZXl3b3JkLCBpbnQgbWluY2hhcnMpCi17Ci0gIHJlZ2lzdGVyIGludCBjYSwgY2s7Ci0gIHJlZ2lzdGVyIGludCBubWF0Y2hlZCA9IDA7Ci0KLSAgd2hpbGUgKChjYSA9ICphcmcrKykgIT0gJ1wwJykgewotICAgIGlmICgoY2sgPSAqa2V5d29yZCsrKSA9PSAnXDAnKQotICAgICAgcmV0dXJuIEZBTFNFOwkJLyogYXJnIGxvbmdlciB0aGFuIGtleXdvcmQsIG5vIGdvb2QgKi8KLSAgICBpZiAoaXN1cHBlcihjYSkpCQkvKiBmb3JjZSBhcmcgdG8gbGNhc2UgKGFzc3VtZSBjayBpcyBhbHJlYWR5KSAqLwotICAgICAgY2EgPSB0b2xvd2VyKGNhKTsKLSAgICBpZiAoY2EgIT0gY2spCi0gICAgICByZXR1cm4gRkFMU0U7CQkvKiBubyBnb29kICovCi0gICAgbm1hdGNoZWQrKzsJCQkvKiBjb3VudCBtYXRjaGVkIGNoYXJhY3RlcnMgKi8KLSAgfQotICAvKiByZWFjaGVkIGVuZCBvZiBhcmd1bWVudDsgZmFpbCBpZiBpdCdzIHRvbyBzaG9ydCBmb3IgdW5pcXVlIGFiYnJldiAqLwotICBpZiAobm1hdGNoZWQgPCBtaW5jaGFycykKLSAgICByZXR1cm4gRkFMU0U7Ci0gIHJldHVybiBUUlVFOwkJCS8qIEEtT0sgKi8KLX0KLQotCi0vKgotICogUm91dGluZXMgdG8gZXN0YWJsaXNoIGJpbmFyeSBJL08gbW9kZSBmb3Igc3RkaW4gYW5kIHN0ZG91dC4KLSAqIE5vbi1Vbml4IHN5c3RlbXMgb2Z0ZW4gcmVxdWlyZSBzb21lIGhhY2tpbmcgdG8gZ2V0IG91dCBvZiB0ZXh0IG1vZGUuCi0gKi8KLQotR0xPQkFMKEZJTEUgKikKLXJlYWRfc3RkaW4gKHZvaWQpCi17Ci0gIEZJTEUgKiBpbnB1dF9maWxlID0gc3RkaW47Ci0KLSNpZmRlZiBVU0VfU0VUTU9ERQkJLyogbmVlZCB0byBoYWNrIGZpbGUgbW9kZT8gKi8KLSAgc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBPX0JJTkFSWSk7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfRkRPUEVOCQkvKiBuZWVkIHRvIHJlLW9wZW4gaW4gYmluYXJ5IG1vZGU/ICovCi0gIGlmICgoaW5wdXRfZmlsZSA9IGZkb3BlbihmaWxlbm8oc3RkaW4pLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCByZW9wZW4gc3RkaW5cbiIpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotI2VuZGlmCi0gIHJldHVybiBpbnB1dF9maWxlOwotfQotCi0KLUdMT0JBTChGSUxFICopCi13cml0ZV9zdGRvdXQgKHZvaWQpCi17Ci0gIEZJTEUgKiBvdXRwdXRfZmlsZSA9IHN0ZG91dDsKLQotI2lmZGVmIFVTRV9TRVRNT0RFCQkvKiBuZWVkIHRvIGhhY2sgZmlsZSBtb2RlPyAqLwotICBzZXRtb2RlKGZpbGVubyhzdGRvdXQpLCBPX0JJTkFSWSk7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfRkRPUEVOCQkvKiBuZWVkIHRvIHJlLW9wZW4gaW4gYmluYXJ5IG1vZGU/ICovCi0gIGlmICgob3V0cHV0X2ZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZG91dCksIFdSSVRFX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCByZW9wZW4gc3Rkb3V0XG4iKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLSNlbmRpZgotICByZXR1cm4gb3V0cHV0X2ZpbGU7Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9jZGpwZWcuaCBiL2xpYmpwZWd0d3JwL2NkanBlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM4N2I2Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2NkanBlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBjZGpwZWcuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbW1vbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBzYW1wbGUgYXBwbGljYXRpb25zCi0gKiBjanBlZyBhbmQgZGpwZWcuICBJdCBpcyBOT1QgdXNlZCBieSB0aGUgY29yZSBKUEVHIGxpYnJhcnkuCi0gKi8KLQotI2RlZmluZSBKUEVHX0NKUEVHX0RKUEVHCS8qIGRlZmluZSBwcm9wZXIgb3B0aW9ucyBpbiBqY29uZmlnLmggKi8KLSNkZWZpbmUgSlBFR19JTlRFUk5BTF9PUFRJT05TCS8qIGNqcGVnLmMsZGpwZWcuYyBuZWVkIHRvIHNlZSB4eHhfU1VQUE9SVEVEICovCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamVycm9yLmgiCQkvKiBnZXQgbGlicmFyeSBlcnJvciBjb2RlcyB0b28gKi8KLSNpbmNsdWRlICJjZGVycm9yLmgiCQkvKiBnZXQgYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3IgY29kZXMgKi8KLQotCi0vKgotICogT2JqZWN0IGludGVyZmFjZSBmb3IgY2pwZWcncyBzb3VyY2UgZmlsZSBkZWNvZGluZyBtb2R1bGVzCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCAqIGNqcGVnX3NvdXJjZV9wdHI7Ci0KLXN0cnVjdCBjanBlZ19zb3VyY2Vfc3RydWN0IHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9pbnB1dCwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICAgY2pwZWdfc291cmNlX3B0ciBzaW5mbykpOwotICBKTUVUSE9EKEpESU1FTlNJT04sIGdldF9waXhlbF9yb3dzLCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgICAgIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfaW5wdXQsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAgICBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKSk7Ci0KLSAgRklMRSAqaW5wdXRfZmlsZTsKLQotICBKU0FNUEFSUkFZIGJ1ZmZlcjsKLSAgSkRJTUVOU0lPTiBidWZmZXJfaGVpZ2h0OwotfTsKLQotCi0vKgotICogT2JqZWN0IGludGVyZmFjZSBmb3IgZGpwZWcncyBvdXRwdXQgZmlsZSBlbmNvZGluZyBtb2R1bGVzCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGpwZWdfZGVzdF9zdHJ1Y3QgKiBkanBlZ19kZXN0X3B0cjsKLQotc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHsKLSAgLyogc3RhcnRfb3V0cHV0IGlzIGNhbGxlZCBhZnRlciBqcGVnX3N0YXJ0X2RlY29tcHJlc3MgZmluaXNoZXMuCi0gICAqIFRoZSBjb2xvciBtYXAgd2lsbCBiZSByZWFkeSBhdCB0aGlzIHRpbWUsIGlmIG9uZSBpcyBuZWVkZWQuCi0gICAqLwotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X291dHB1dCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgICAgZGpwZWdfZGVzdF9wdHIgZGluZm8pKTsKLSAgLyogRW1pdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBwaXhlbCByb3dzIGZyb20gdGhlIGJ1ZmZlci4gKi8KLSAgSk1FVEhPRCh2b2lkLCBwdXRfcGl4ZWxfcm93cywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQkJCSBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpKTsKLSAgLyogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGltYWdlLiAqLwotICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9vdXRwdXQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCWRqcGVnX2Rlc3RfcHRyIGRpbmZvKSk7Ci0KLSAgLyogVGFyZ2V0IGZpbGUgc3BlYzsgZmlsbGVkIGluIGJ5IGRqcGVnLmMgYWZ0ZXIgb2JqZWN0IGlzIGNyZWF0ZWQuICovCi0gIEZJTEUgKiBvdXRwdXRfZmlsZTsKLQotICAvKiBPdXRwdXQgcGl4ZWwtcm93IGJ1ZmZlci4gIENyZWF0ZWQgYnkgbW9kdWxlIGluaXQgb3Igc3RhcnRfb3V0cHV0LgotICAgKiBXaWR0aCBpcyBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dHB1dF9jb21wb25lbnRzOwotICAgKiBoZWlnaHQgaXMgYnVmZmVyX2hlaWdodC4KLSAgICovCi0gIEpTQU1QQVJSQVkgYnVmZmVyOwotICBKRElNRU5TSU9OIGJ1ZmZlcl9oZWlnaHQ7Ci19OwotCi0KLS8qCi0gKiBjanBlZy9kanBlZyBtYXkgbmVlZCB0byBwZXJmb3JtIGV4dHJhIHBhc3NlcyB0byBjb252ZXJ0IHRvIG9yIGZyb20KLSAqIHRoZSBzb3VyY2UvZGVzdGluYXRpb24gZmlsZSBmb3JtYXQuICBUaGUgSlBFRyBsaWJyYXJ5IGRvZXMgbm90IGtub3cKLSAqIGFib3V0IHRoZXNlIHBhc3NlcywgYnV0IHdlJ2QgbGlrZSB0aGVtIHRvIGJlIGNvdW50ZWQgYnkgdGhlIHByb2dyZXNzCi0gKiBtb25pdG9yLiAgV2UgdXNlIGFuIGV4cGFuZGVkIHByb2dyZXNzIG1vbml0b3Igb2JqZWN0IHRvIGhvbGQgdGhlCi0gKiBhZGRpdGlvbmFsIHBhc3MgY291bnQuCi0gKi8KLQotc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgewotICBzdHJ1Y3QganBlZ19wcm9ncmVzc19tZ3IgcHViOwkvKiBmaWVsZHMga25vd24gdG8gSlBFRyBsaWJyYXJ5ICovCi0gIGludCBjb21wbGV0ZWRfZXh0cmFfcGFzc2VzOwkvKiBleHRyYSBwYXNzZXMgY29tcGxldGVkICovCi0gIGludCB0b3RhbF9leHRyYV9wYXNzZXM7CS8qIHRvdGFsIGV4dHJhICovCi0gIC8qIGxhc3QgcHJpbnRlZCBwZXJjZW50YWdlIHN0b3JlZCBoZXJlIHRvIGF2b2lkIG11bHRpcGxlIHByaW50b3V0cyAqLwotICBpbnQgcGVyY2VudF9kb25lOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgY2RqcGVnX3Byb2dyZXNzX21nciAqIGNkX3Byb2dyZXNzX3B0cjsKLQotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUgamluaXRfcmVhZF9ibXAJCWpJUmRCTVAKLSNkZWZpbmUgamluaXRfd3JpdGVfYm1wCQlqSVdyQk1QCi0jZGVmaW5lIGppbml0X3JlYWRfZ2lmCQlqSVJkR0lGCi0jZGVmaW5lIGppbml0X3dyaXRlX2dpZgkJaklXckdJRgotI2RlZmluZSBqaW5pdF9yZWFkX3BwbQkJaklSZFBQTQotI2RlZmluZSBqaW5pdF93cml0ZV9wcG0JCWpJV3JQUE0KLSNkZWZpbmUgamluaXRfcmVhZF9ybGUJCWpJUmRSTEUKLSNkZWZpbmUgamluaXRfd3JpdGVfcmxlCQlqSVdyUkxFCi0jZGVmaW5lIGppbml0X3JlYWRfdGFyZ2EJaklSZFRhcmdhCi0jZGVmaW5lIGppbml0X3dyaXRlX3RhcmdhCWpJV3JUYXJnYQotI2RlZmluZSByZWFkX3F1YW50X3RhYmxlcwlSZFFUYWJsZXMKLSNkZWZpbmUgcmVhZF9zY2FuX3NjcmlwdAlSZFNjblNjcmlwdAotI2RlZmluZSBzZXRfcXVhbnRfc2xvdHMJCVNldFFTbG90cwotI2RlZmluZSBzZXRfc2FtcGxlX2ZhY3RvcnMJU2V0U0ZhY3RzCi0jZGVmaW5lIHJlYWRfY29sb3JfbWFwCQlSZENNYXAKLSNkZWZpbmUgZW5hYmxlX3NpZ25hbF9jYXRjaGVyCUVuU2lnQ2F0Y2hlcgotI2RlZmluZSBzdGFydF9wcm9ncmVzc19tb25pdG9yCVN0UHJvZ01vbgotI2RlZmluZSBlbmRfcHJvZ3Jlc3NfbW9uaXRvcglFblByb2dNb24KLSNkZWZpbmUgcmVhZF9zdGRpbgkJUmRTdGRpbgotI2RlZmluZSB3cml0ZV9zdGRvdXQJCVdyU3Rkb3V0Ci0jZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLwotCi0vKiBNb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmVzIGZvciBJL08gbW9kdWxlcy4gKi8KLQotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfYm1wIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfYm1wIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIGJvb2xlYW4gaXNfb3MyKSk7Ci1FWFRFUk4oY2pwZWdfc291cmNlX3B0cikgamluaXRfcmVhZF9naWYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGRqcGVnX2Rlc3RfcHRyKSBqaW5pdF93cml0ZV9naWYgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oY2pwZWdfc291cmNlX3B0cikgamluaXRfcmVhZF9wcG0gSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGRqcGVnX2Rlc3RfcHRyKSBqaW5pdF93cml0ZV9wcG0gSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oY2pwZWdfc291cmNlX3B0cikgamluaXRfcmVhZF9ybGUgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGRqcGVnX2Rlc3RfcHRyKSBqaW5pdF93cml0ZV9ybGUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oY2pwZWdfc291cmNlX3B0cikgamluaXRfcmVhZF90YXJnYSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oZGpwZWdfZGVzdF9wdHIpIGppbml0X3dyaXRlX3RhcmdhIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0vKiBjanBlZyBzdXBwb3J0IHJvdXRpbmVzIChpbiByZHN3aXRjaC5jKSAqLwotCi1FWFRFUk4oYm9vbGVhbikgcmVhZF9xdWFudF90YWJsZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lLAotCQkJCSAgICBpbnQgc2NhbGVfZmFjdG9yLCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7Ci1FWFRFUk4oYm9vbGVhbikgcmVhZF9zY2FuX3NjcmlwdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICogZmlsZW5hbWUpKTsKLUVYVEVSTihib29sZWFuKSBzZXRfcXVhbnRfc2xvdHMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqYXJnKSk7Ci1FWFRFUk4oYm9vbGVhbikgc2V0X3NhbXBsZV9mYWN0b3JzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZykpOwotCi0vKiBkanBlZyBzdXBwb3J0IHJvdXRpbmVzIChpbiByZGNvbG1hcC5jKSAqLwotCi1FWFRFUk4odm9pZCkgcmVhZF9jb2xvcl9tYXAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKSk7Ci0KLS8qIGNvbW1vbiBzdXBwb3J0IHJvdXRpbmVzIChpbiBjZGpwZWcuYykgKi8KLQotRVhURVJOKHZvaWQpIGVuYWJsZV9zaWduYWxfY2F0Y2hlciBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIHN0YXJ0X3Byb2dyZXNzX21vbml0b3IgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJCSBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MpKTsKLUVYVEVSTih2b2lkKSBlbmRfcHJvZ3Jlc3NfbW9uaXRvciBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotRVhURVJOKGJvb2xlYW4pIGtleW1hdGNoIEpQUCgoY2hhciAqIGFyZywgY29uc3QgY2hhciAqIGtleXdvcmQsIGludCBtaW5jaGFycykpOwotRVhURVJOKEZJTEUgKikgcmVhZF9zdGRpbiBKUFAoKHZvaWQpKTsKLUVYVEVSTihGSUxFICopIHdyaXRlX3N0ZG91dCBKUFAoKHZvaWQpKTsKLQotLyogbWlzY2VsbGFuZW91cyB1c2VmdWwgbWFjcm9zICovCi0KLSNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCi0jZGVmaW5lIFdSSVRFX0JJTkFSWQkidyIKLSNlbHNlCi0jaWZkZWYgVk1TCQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIiwgImN0eD1zdG0iCi0jZGVmaW5lIFdSSVRFX0JJTkFSWQkid2IiLCAiY3R4PXN0bSIKLSNlbHNlCQkJCS8qIHN0YW5kYXJkIEFOU0ktY29tcGxpYW50IGNhc2UgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIgotI2RlZmluZSBXUklURV9CSU5BUlkJIndiIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBFWElUX0ZBSUxVUkUJCS8qIGRlZmluZSBleGl0KCkgY29kZXMgaWYgbm90IHByb3ZpZGVkICovCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAgMQotI2VuZGlmCi0jaWZuZGVmIEVYSVRfU1VDQ0VTUwotI2lmZGVmIFZNUwotI2RlZmluZSBFWElUX1NVQ0NFU1MgIDEJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCi0jZWxzZQotI2RlZmluZSBFWElUX1NVQ0NFU1MgIDAKLSNlbmRpZgotI2VuZGlmCi0jaWZuZGVmIEVYSVRfV0FSTklORwotI2lmZGVmIFZNUwotI2RlZmluZSBFWElUX1dBUk5JTkcgIDEJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCi0jZWxzZQotI2RlZmluZSBFWElUX1dBUk5JTkcgIDIKLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9jaGFuZ2UubG9nIGIvbGlianBlZ3R3cnAvY2hhbmdlLmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxMDJjMC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9jaGFuZ2UubG9nCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLUNIQU5HRSBMT0cgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCi0KLQotVmVyc2lvbiA2YiAgMjctTWFyLTE5OTgKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWpwZWd0cmFuIGhhcyBuZXcgZmVhdHVyZXMgZm9yIGxvc3NsZXNzIGltYWdlIHRyYW5zZm9ybWF0aW9ucyAocm90YXRpb24KLWFuZCBmbGlwcGluZykgYXMgd2VsbCBhcyAibG9zc2xlc3MiIHJlZHVjdGlvbiB0byBncmF5c2NhbGUuCi0KLWpwZWd0cmFuIG5vdyBjb3BpZXMgY29tbWVudHMgYnkgZGVmYXVsdDsgaXQgaGFzIGEgLWNvcHkgc3dpdGNoIHRvIGVuYWJsZQotY29weWluZyBhbGwgQVBQbiBibG9ja3MgYXMgd2VsbCwgb3IgdG8gc3VwcHJlc3MgY29tbWVudHMuICAoRm9ybWVybHkgaXQKLWFsd2F5cyBzdXBwcmVzc2VkIGNvbW1lbnRzIGFuZCBBUFBuIGJsb2Nrcy4pICBqcGVndHJhbiBub3cgYWxzbyBwcmVzZXJ2ZXMKLUpGSUYgdmVyc2lvbiBhbmQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbi4KLQotTmV3IGRlY29tcHJlc3NvciBsaWJyYXJ5IGZlYXR1cmU6IENPTSBhbmQgQVBQbiBtYXJrZXJzIGZvdW5kIGluIHRoZSBpbnB1dAotZmlsZSBjYW4gYmUgc2F2ZWQgaW4gbWVtb3J5IGZvciBsYXRlciB1c2UgYnkgdGhlIGFwcGxpY2F0aW9uLiAgKEJlZm9yZSwKLXlvdSBoYWQgdG8gY29kZSB0aGlzIHVwIHlvdXJzZWxmIHdpdGggYSBjdXN0b20gbWFya2VyIHByb2Nlc3Nvci4pCi0KLVRoZXJlIGlzIGFuIHVudXNlZCBmaWVsZCAidm9pZCAqIGNsaWVudF9kYXRhIiBub3cgaW4gY29tcHJlc3MgYW5kIGRlY29tcHJlc3MKLXBhcmFtZXRlciBzdHJ1Y3RzOyB0aGlzIG1heSBiZSB1c2VmdWwgaW4gc29tZSBhcHBsaWNhdGlvbnMuCi0KLUpGSUYgdmVyc2lvbiBudW1iZXIgaW5mb3JtYXRpb24gaXMgbm93IHNhdmVkIGJ5IHRoZSBkZWNvZGVyIGFuZCBhY2NlcHRlZCBieQotdGhlIGVuY29kZXIuICBqcGVndHJhbiB1c2VzIHRoaXMgdG8gY29weSB0aGUgc291cmNlIGZpbGUncyB2ZXJzaW9uIG51bWJlciwKLXRvIGVuc3VyZSAianBlZ3RyYW4gLWNvcHkgYWxsIiB3b24ndCBjcmVhdGUgYm9ndXMgZmlsZXMgdGhhdCBjb250YWluIEpGWFgKLWV4dGVuc2lvbnMgYnV0IGNsYWltIHRvIGJlIHZlcnNpb24gMS4wMS4gIEFwcGxpY2F0aW9ucyB0aGF0IGdlbmVyYXRlIHRoZWlyCi1vd24gSkZYWCBleHRlbnNpb24gbWFya2VycyBhbHNvIChmaW5hbGx5KSBoYXZlIGEgc3VwcG9ydGVkIHdheSB0byBjYXVzZSB0aGUKLWVuY29kZXIgdG8gZW1pdCBKRklGIHZlcnNpb24gbnVtYmVyIDEuMDIuCi0KLWRqcGVnJ3MgdHJhY2UgbW9kZSByZXBvcnRzIEpGSUYgMS4wMiB0aHVtYm5haWwgaW1hZ2VzIGFzIHN1Y2gsIHJhdGhlcgotdGhhbiBhcyB1bmtub3duIEFQUDAgbWFya2Vycy4KLQotSW4gLXZlcmJvc2UgbW9kZSwgZGpwZWcgYW5kIHJkanBnY29tIHdpbGwgdHJ5IHRvIHByaW50IHRoZSBjb250ZW50cyBvZgotQVBQMTIgbWFya2VycyBhcyB0ZXh0LiAgU29tZSBkaWdpdGFsIGNhbWVyYXMgc3RvcmUgdXNlZnVsIHRleHQgaW5mb3JtYXRpb24KLWluIEFQUDEyIG1hcmtlcnMuCi0KLUhhbmRsaW5nIG9mIHRydW5jYXRlZCBkYXRhIHN0cmVhbXMgaXMgbW9yZSByb2J1c3Q6IGJsb2NrcyBiZXlvbmQgdGhlIG9uZSBpbgotd2hpY2ggdGhlIGVycm9yIG9jY3VycyB3aWxsIGJlIG91dHB1dCBhcyB1bmlmb3JtIGdyYXksIG9yIGxlZnQgdW5jaGFuZ2VkCi1pZiBkZWNvZGluZyBhIHByb2dyZXNzaXZlIEpQRUcuICBUaGUgYXBwZWFyYW5jZSBubyBsb25nZXIgZGVwZW5kcyBvbiB0aGUKLUh1ZmZtYW4gdGFibGVzIGJlaW5nIHVzZWQuCi0KLUh1ZmZtYW4gdGFibGVzIGFyZSBjaGVja2VkIGZvciB2YWxpZGl0eSBtdWNoIG1vcmUgY2FyZWZ1bGx5IHRoYW4gYmVmb3JlLgotCi1UbyBhdm9pZCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsIGRqcGVnJ3MgR0lGIG91dHB1dCBjYXBhYmlsaXR5IGhhcyBiZWVuCi1jaGFuZ2VkIHRvIHByb2R1Y2UgInVuY29tcHJlc3NlZCBHSUZzIiwgYW5kIGNqcGVnJ3MgR0lGIGlucHV0IGNhcGFiaWxpdHkKLWhhcyBiZWVuIHJlbW92ZWQgYWx0b2dldGhlci4gIFdlJ3JlIG5vdCBoYXBweSBhYm91dCBpdCBlaXRoZXIsIGJ1dCB0aGVyZQotc2VlbXMgdG8gYmUgbm8gZ29vZCBhbHRlcm5hdGl2ZS4KLQotVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IHN1cHBvcnRzIGJ1aWxkaW5nIGxpYmpwZWcgYXMgYSBzaGFyZWQgbGlicmFyeQotb24gbWFueSBmbGF2b3JzIG9mIFVuaXggKGFsbCB0aGUgb25lcyB0aGF0IEdOVSBsaWJ0b29sIGtub3dzIGhvdyB0bwotYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBmb3IpLiAgVXNlICIuL2NvbmZpZ3VyZSAtLWVuYWJsZS1zaGFyZWQiIHRvCi10cnkgdGhpcyBvdXQuCi0KLU5ldyBqY29uZmlnIGZpbGUgYW5kIG1ha2VmaWxlcyBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgYW5kIERldmVsb3BlciBTdHVkaW8uCi1BbHNvLCBhIGpjb25maWcgZmlsZSBhbmQgYSBidWlsZCBzY3JpcHQgZm9yIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3IKLW9uIEFwcGxlIE1hY2ludG9zaC4gIG1ha2VmaWxlLmRqIGhhcyBiZWVuIHVwZGF0ZWQgZm9yIERKR1BQIHYyLCBhbmQgdGhlcmUKLWFyZSBtaXNjZWxsYW5lb3VzIG90aGVyIG1pbm9yIGltcHJvdmVtZW50cyBpbiB0aGUgbWFrZWZpbGVzLgotCi1qbWVtbWFjLmMgbm93IGtub3dzIGhvdyB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzIGZvbGxvd2luZyBNYWMgU3lzdGVtIDcKLWNvbnZlbnRpb25zLgotCi1kanBlZydzIC1tYXAgc3dpdGNoIGlzIG5vdyBhYmxlIHRvIHJlYWQgcmF3LWZvcm1hdCBQUE0gZmlsZXMgcmVsaWFibHkuCi0KLWNqcGVnIC1wcm9ncmVzc2l2ZSAtcmVzdGFydCBubyBsb25nZXIgZ2VuZXJhdGVzIGFueSB1bm5lY2Vzc2FyeSBEUkkgbWFya2Vycy4KLQotTXVsdGlwbGUgY2FsbHMgdG8ganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gZm9yIGEgc2luZ2xlIEpQRUcgb2JqZWN0Ci1ubyBsb25nZXIgbGVhayBtZW1vcnkuCi0KLQotVmVyc2lvbiA2YSAgNy1GZWItOTYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxpYnJhcnkgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgbW9kaWZpZWQgdG8gZGV0ZWN0IHZlcnNpb24gbWlzbWF0Y2hlcwotYW5kIHN0cnVjdCBmaWVsZCBwYWNraW5nIG1pc21hdGNoZXMgYmV0d2VlbiBsaWJyYXJ5IGFuZCBjYWxsaW5nIGFwcGxpY2F0aW9uLgotVGhpcyBjaGFuZ2UgcmVxdWlyZXMgYXBwbGljYXRpb25zIHRvIGJlIHJlY29tcGlsZWQsIGJ1dCBkb2VzIG5vdCByZXF1aXJlCi1hbnkgYXBwbGljYXRpb24gc291cmNlIGNvZGUgY2hhbmdlLgotCi1BbGwgcm91dGluZSBkZWNsYXJhdGlvbnMgY2hhbmdlZCB0byB0aGUgc3R5bGUgIkdMT0JBTCh0eXBlKSBuYW1lIC4uLiIsCi10aGF0IGlzLCBHTE9CQUwsIExPQ0FMLCBNRVRIT0RERUYsIEVYVEVSTiBhcmUgbm93IG1hY3JvcyB0YWtpbmcgdGhlCi1yb3V0aW5lJ3MgcmV0dXJuIHR5cGUgYXMgYW4gYXJndW1lbnQuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGFkZAotTWljcm9zb2Z0LXN0eWxlIGxpbmthZ2Uga2V5d29yZHMgdG8gYWxsIHRoZSByb3V0aW5lcyBieSBjaGFuZ2luZyBqdXN0Ci10aGVzZSBtYWNyb3MuICBOb3RlIHRoYXQgYW55IGFwcGxpY2F0aW9uIGNvZGUgdGhhdCB3YXMgdXNpbmcgdGhlc2UgbWFjcm9zCi13aWxsIGhhdmUgdG8gYmUgY2hhbmdlZC4KLQotRENUIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIG5vdyBzdG9yZWQgaW4gbm9ybWFsIGFycmF5IG9yZGVyCi1yYXRoZXIgdGhhbiB6aWd6YWcgb3JkZXIuICBBcHBsaWNhdGlvbiBjb2RlIHRoYXQgY2FsbHMganBlZ19hZGRfcXVhbnRfdGFibGUsCi1vciBvdGhlcndpc2UgbWFuaXB1bGF0ZXMgcXVhbnRpemF0aW9uIHRhYmxlcyBkaXJlY3RseSwgd2lsbCBuZWVkIHRvIGJlCi1jaGFuZ2VkLiAgSWYgeW91IG5lZWQgdG8gbWFrZSBzdWNoIGNvZGUgd29yayB3aXRoIGVpdGhlciBvbGRlciBvciBuZXdlcgotdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnksIGEgdGVzdCBsaWtlICIjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA2MSIgaXMKLXJlY29tbWVuZGVkLgotCi1kanBlZydzIHRyYWNlIGNhcGFiaWxpdHkgbm93IGR1bXBzIERRVCB0YWJsZXMgaW4gbmF0dXJhbCBvcmRlciwgbm90IHppZ3phZwotb3JkZXIuICBUaGlzIGFsbG93cyB0aGUgdHJhY2Ugb3V0cHV0IHRvIGJlIG1hZGUgaW50byBhICItcXRhYmxlcyIgZmlsZQotbW9yZSBlYXNpbHkuCi0KLU5ldyBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VyIG1vZHVsZSBmb3IgdXNlIG9uIEFwcGxlIE1hY2ludG9zaC4KLQotRml4IGJ1ZyBpbiBjanBlZydzIC1zbW9vdGggb3B0aW9uOiBsYXN0IG9uZSBvciB0d28gc2NhbmxpbmVzIHdvdWxkIGJlCi1kdXBsaWNhdGVzIG9mIHRoZSBwcmlvciBsaW5lIHVubGVzcyB0aGUgaW1hZ2UgaGVpZ2h0IG1vZCAxNiB3YXMgMSBvciAyLgotCi1SZXBhaXIgbWlub3IgcHJvYmxlbXMgaW4gVk1TLCBCQ0MsIE1DNiBtYWtlZmlsZXMuCi0KLU5ldyBjb25maWd1cmUgc2NyaXB0IGJhc2VkIG9uIGxhdGVzdCBHTlUgQXV0b2NvbmYuCi0KLUNvcnJlY3QgdGhlIGxpc3Qgb2YgaW5jbHVkZSBmaWxlcyBuZWVkZWQgYnkgTWV0cm9XZXJrcyBDIGZvciBjY29tbWFuZCgpLgotCi1OdW1lcm91cyBzbWFsbCBkb2N1bWVudGF0aW9uIHVwZGF0ZXMuCi0KLQotVmVyc2lvbiA2ICAyLUF1Zy05NQotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Qcm9ncmVzc2l2ZSBKUEVHIHN1cHBvcnQ6IGxpYnJhcnkgY2FuIHJlYWQgYW5kIHdyaXRlIGZ1bGwgcHJvZ3Jlc3NpdmUgSlBFRwotZmlsZXMuICBBICJidWZmZXJlZCBpbWFnZSIgbW9kZSBzdXBwb3J0cyBpbmNyZW1lbnRhbCBkZWNvZGluZyBmb3Igb24tdGhlLWZseQotZGlzcGxheSBvZiBwcm9ncmVzc2l2ZSBpbWFnZXMuICBTaW1wbHkgcmVjb21waWxpbmcgYW4gZXhpc3RpbmcgSUpHLXY1LWJhc2VkCi1kZWNvZGVyIHdpdGggdjYgc2hvdWxkIGFsbG93IGl0IHRvIHJlYWQgcHJvZ3Jlc3NpdmUgZmlsZXMsIHRob3VnaCBvZiBjb3Vyc2UKLXdpdGhvdXQgYW55IHNwZWNpYWwgcHJvZ3Jlc3NpdmUgZGlzcGxheS4KLQotTmV3ICJqcGVndHJhbiIgYXBwbGljYXRpb24gcGVyZm9ybXMgbG9zc2xlc3MgdHJhbnNjb2RpbmcgYmV0d2VlbiBkaWZmZXJlbnQKLUpQRUcgZm9ybWF0czsgcHJpbWFyaWx5LCBpdCBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGJhc2VsaW5lIHRvIHByb2dyZXNzaXZlCi1KUEVHIGFuZCB2aWNlIHZlcnNhLiAgSW4gc3VwcG9ydCBvZiBqcGVndHJhbiwgdGhlIGxpYnJhcnkgbm93IGFsbG93cyBsb3NzbGVzcwotcmVhZGluZyBhbmQgd3JpdGluZyBvZiBKUEVHIGZpbGVzIGFzIERDVCBjb2VmZmljaWVudCBhcnJheXMuICBUaGlzIGFiaWxpdHkKLW1heSBiZSBvZiB1c2UgaW4gb3RoZXIgYXBwbGljYXRpb25zLgotCi1Ob3RlcyBmb3IgcHJvZ3JhbW1lcnM6Ci0qIFdlIGNoYW5nZWQganBlZ19zdGFydF9kZWNvbXByZXNzKCkgdG8gYmUgYWJsZSB0byBzdXNwZW5kOyB0aGlzIG1ha2VzIGFsbAotZGVjb2RpbmcgbW9kZXMgYXZhaWxhYmxlIHRvIHN1c3BlbmRpbmctaW5wdXQgYXBwbGljYXRpb25zLiAgSG93ZXZlciwKLWV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBzdXNwZW5kaW5nIGlucHV0IHdpbGwgbmVlZCB0byBiZSBjaGFuZ2VkCi10byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGZyb20ganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICBZb3UgZG9uJ3QgbmVlZCB0bwotZG8gYW55dGhpbmcgaWYgeW91IGRvbid0IHVzZSBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuCi0qIFdlIGNoYW5nZWQgdGhlIGludGVyZmFjZSB0byB0aGUgdmlydHVhbCBhcnJheSByb3V0aW5lczogYWNjZXNzX3ZpcnRfYXJyYXkKLXJvdXRpbmVzIG5vdyB0YWtlIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiByb3dzIHRvIGFjY2VzcyB0aGlzIHRpbWUuICBUaGUKLWxhc3QgcGFyYW1ldGVyIHRvIHJlcXVlc3RfdmlydF9hcnJheSByb3V0aW5lcyBpcyBub3cgaW50ZXJwcmV0ZWQgYXMgdGhlCi1tYXhpbXVtIG51bWJlciBvZiByb3dzIHRoYXQgbWF5IGJlIGFjY2Vzc2VkIGF0IG9uY2UsIGJ1dCBub3QgbmVjZXNzYXJpbHkKLXRoZSBoZWlnaHQgb2YgZXZlcnkgYWNjZXNzLgotCi0KLVZlcnNpb24gNWIgIDE1LU1hci05NQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvcnJlY3QgYnVncyB3aXRoIGdyYXlzY2FsZSBpbWFnZXMgaGF2aW5nIHZfc2FtcF9mYWN0b3IgPiAxLgotCi1qcGVnX3dyaXRlX3Jhd19kYXRhKCkgbm93IHN1cHBvcnRzIG91dHB1dCBzdXNwZW5zaW9uLgotCi1Db3JyZWN0IGJ1Z3MgaW4gImNvbmZpZ3VyZSIgc2NyaXB0IGZvciBjYXNlIG9mIGNvbXBpbGluZyBpbgotYSBkaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBmaWxlcy4KLQotUmVwYWlyIGJ1ZyBpbiBqcXVhbnQxLmM6IHNvbWV0aW1lcyBkaWRuJ3QgdXNlIGFzIG1hbnkgY29sb3JzIGFzIGl0IGNvdWxkLgotCi1Cb3JsYW5kIEMgbWFrZWZpbGUgYW5kIGpjb25maWcgZmlsZSB3b3JrIHVuZGVyIGVpdGhlciBNUy1ET1Mgb3IgT1MvMi4KLQotTWlzY2VsbGFuZW91cyBpbXByb3ZlbWVudHMgdG8gZG9jdW1lbnRhdGlvbi4KLQotCi1WZXJzaW9uIDVhICA3LURlYy05NAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlZCBjb2xvciBjb252ZXJzaW9uIHJvdW5kb2ZmIGJlaGF2aW9yIHNvIHRoYXQgZ3JheXNjYWxlIHZhbHVlcyBhcmUKLXJlcHJlc2VudGVkIGV4YWN0bHkuICAoVGhpcyBjYXVzZXMgdGVzdCBpbWFnZSBmaWxlcyB0byBjaGFuZ2UuKQotCi1NYWtlIG9yZGVyZWQgZGl0aGVyIHVzZSAxNngxNiBpbnN0ZWFkIG9mIDR4NCBwYXR0ZXJuIGZvciBhIHNtYWxsIHF1YWxpdHkKLWltcHJvdmVtZW50LgotCi1OZXcgY29uZmlndXJlIHNjcmlwdCBiYXNlZCBvbiBsYXRlc3QgR05VIEF1dG9jb25mLgotRml4IGNvbmZpZ3VyZSBzY3JpcHQgdG8gaGFuZGxlIENGTEFHUyBjb3JyZWN0bHkuCi1SZW5hbWUgKi5hdXRvIGZpbGVzIHRvICouY2ZnLCBzbyB0aGF0IGNvbmZpZ3VyZSBzY3JpcHQgc3RpbGwgd29ya3MgaWYKLWZpbGUgbmFtZXMgaGF2ZSBiZWVuIHRydW5jYXRlZCBmb3IgRE9TLgotCi1GaXggYnVnIGluIHJkYm1wLmM6IGRpZG4ndCBhbGxvdyBmb3IgZXh0cmEgZGF0YSBiZXR3ZWVuIGhlYWRlciBhbmQgaW1hZ2UuCi0KLU1vZGlmeSByZHBwbS5jL3dycHBtLmMgdG8gaGFuZGxlIDItYnl0ZSByYXcgUFBNL1BHTSBmb3JtYXRzIGZvciAxMi1iaXQgZGF0YS4KLQotRml4IHNldmVyYWwgYnVncyBpbiByZHJsZS5jLgotCi1ORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTIG9wdGlvbiB3YXMgYnJva2VuLgotCi1SZXZpc2UgamVycm9yLmgvamVycm9yLmMgZm9yIG1vcmUgZmxleGliaWxpdHkgaW4gbWVzc2FnZSB0YWJsZS4KLQotUmVwYWlyIG92ZXJzaWdodCBpbiBqbWVtbmFtZS5jIE5PX01LVEVNUCBjYXNlOiBmaWxlIGNvdWxkIGJlIHRoZXJlCi1idXQgdW5yZWFkYWJsZS4KLQotCi1WZXJzaW9uIDUgIDI0LVNlcC05NAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVmVyc2lvbiA1IHJlcHJlc2VudHMgYSBuZWFybHkgY29tcGxldGUgcmVkZXNpZ24gYW5kIHJld3JpdGUgb2YgdGhlIElKRwotc29mdHdhcmUuICBNYWpvciB1c2VyLXZpc2libGUgY2hhbmdlcyBpbmNsdWRlOgotICAqIEF1dG9tYXRpYyBjb25maWd1cmF0aW9uIHNpbXBsaWZpZXMgaW5zdGFsbGF0aW9uIGZvciBtb3N0IFVuaXggc3lzdGVtcy4KLSAgKiBBIHJhbmdlIG9mIHNwZWVkIHZzLiBpbWFnZSBxdWFsaXR5IHRyYWRlb2ZmcyBhcmUgc3VwcG9ydGVkLgotICAgIFRoaXMgaW5jbHVkZXMgcmVzaXppbmcgb2YgYW4gaW1hZ2UgZHVyaW5nIGRlY29tcHJlc3Npb246IHNjYWxpbmcgZG93bgotICAgIGJ5IGEgZmFjdG9yIG9mIDEvMiwgMS80LCBvciAxLzggaXMgaGFuZGxlZCB2ZXJ5IGVmZmljaWVudGx5LgotICAqIE5ldyBwcm9ncmFtcyByZGpwZ2NvbSBhbmQgd3JqcGdjb20gYWxsb3cgaW5zZXJ0aW9uIGFuZCBleHRyYWN0aW9uCi0gICAgb2YgdGV4dCBjb21tZW50cyBpbiBhIEpQRUcgZmlsZS4KLQotVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIncyBpbnRlcmZhY2UgdG8gdGhlIGxpYnJhcnkgaGFzIGNoYW5nZWQgY29tcGxldGVseS4KLU5vdGFibGUgaW1wcm92ZW1lbnRzIGluY2x1ZGU6Ci0gICogV2UgaGF2ZSBlbGltaW5hdGVkIHRoZSB1c2Ugb2YgY2FsbGJhY2sgcm91dGluZXMgZm9yIGhhbmRsaW5nIHRoZQotICAgIHVuY29tcHJlc3NlZCBpbWFnZSBkYXRhLiAgVGhlIGFwcGxpY2F0aW9uIG5vdyBzZWVzIHRoZSBsaWJyYXJ5IGFzIGEKLSAgICBzZXQgb2Ygcm91dGluZXMgdGhhdCBpdCBjYWxscyB0byByZWFkIG9yIHdyaXRlIGltYWdlIGRhdGEgb24gYQotICAgIHNjYW5saW5lLWJ5LXNjYW5saW5lIGJhc2lzLgotICAqIFRoZSBhcHBsaWNhdGlvbiBpbWFnZSBkYXRhIGlzIHJlcHJlc2VudGVkIGluIGEgY29udmVudGlvbmFsIGludGVybGVhdmVkLQotICAgIHBpeGVsIGZvcm1hdCwgcmF0aGVyIHRoYW4gYXMgYSBzZXBhcmF0ZSBhcnJheSBmb3IgZWFjaCBjb2xvciBjaGFubmVsLgotICAgIFRoaXMgY2FuIHNhdmUgYSBjb3B5aW5nIHN0ZXAgaW4gbWFueSBwcm9ncmFtcy4KLSAgKiBUaGUgaGFuZGxpbmcgb2YgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGNsZWFuZWQgdXA6IHRoZSBhcHBsaWNhdGlvbiBjYW4KLSAgICBzdXBwbHkgcm91dGluZXMgdG8gc291cmNlIG9yIHNpbmsgdGhlIGNvbXByZXNzZWQgZGF0YS4gIEl0IGlzIHBvc3NpYmxlIHRvCi0gICAgc3VzcGVuZCBwcm9jZXNzaW5nIG9uIHNvdXJjZS9zaW5rIGJ1ZmZlciBvdmVycnVuLCBhbHRob3VnaCB0aGlzIGlzIG5vdAotICAgIHN1cHBvcnRlZCBpbiBhbGwgb3BlcmF0aW5nIG1vZGVzLgotICAqIEFsbCBzdGF0aWMgc3RhdGUgaGFzIGJlZW4gZWxpbWluYXRlZCBmcm9tIHRoZSBsaWJyYXJ5LCBzbyB0aGF0IG11bHRpcGxlCi0gICAgaW5zdGFuY2VzIG9mIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gY2FuIGJlIGFjdGl2ZSBjb25jdXJyZW50bHkuCi0gICogSlBFRyBhYmJyZXZpYXRlZCBkYXRhc3RyZWFtIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCwgaWUsIHF1YW50aXphdGlvbiBhbmQKLSAgICBIdWZmbWFuIHRhYmxlcyBjYW4gYmUgc3RvcmVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgaW1hZ2UgZGF0YS4KLSAgKiBBbmQgbm90IG9ubHkgdGhhdCwgYnV0IHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBsaWJyYXJ5IGhhcyBpbXByb3ZlZAotICAgIGNvbnNpZGVyYWJseSEKLQotCi1UaGUgbGFzdCB3aWRlbHkgdXNlZCByZWxlYXNlIGJlZm9yZSB0aGUgdmVyc2lvbiA1IHJld3JpdGUgd2FzIHZlcnNpb24gNEEgb2YKLTE4LUZlYi05My4gIENoYW5nZSBsb2dzIGJlZm9yZSB0aGF0IHBvaW50IGhhdmUgYmVlbiBkaXNjYXJkZWQsIHNpbmNlIHRoZXkKLWFyZSBub3Qgb2YgbXVjaCBpbnRlcmVzdCBhZnRlciB0aGUgcmV3cml0ZS4KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2NqcGVnLjEgYi9saWJqcGVndHdycC9janBlZy4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTc1YTk2Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2NqcGVnLjEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLlRIIENKUEVHIDEgIjIwIE1hcmNoIDE5OTgiCi0uU0ggTkFNRQotY2pwZWcgXC0gY29tcHJlc3MgYW4gaW1hZ2UgZmlsZSB0byBhIEpQRUcgZmlsZQotLlNIIFNZTk9QU0lTCi0uQiBjanBlZwotWwotLkkgb3B0aW9ucwotXQotWwotLkkgZmlsZW5hbWUKLV0KLS5MUAotLlNIIERFU0NSSVBUSU9OCi0uTFAKLS5CIGNqcGVnCi1jb21wcmVzc2VzIHRoZSBuYW1lZCBpbWFnZSBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcwotbmFtZWQsIGFuZCBwcm9kdWNlcyBhIEpQRUcvSkZJRiBmaWxlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCi1UaGUgY3VycmVudGx5IHN1cHBvcnRlZCBpbnB1dCBmaWxlIGZvcm1hdHMgYXJlOiBQUE0gKFBCTVBMVVMgY29sb3IKLWZvcm1hdCksIFBHTSAoUEJNUExVUyBncmF5LXNjYWxlIGZvcm1hdCksIEJNUCwgVGFyZ2EsIGFuZCBSTEUgKFV0YWggUmFzdGVyCi1Ub29sa2l0IGZvcm1hdCkuICAoUkxFIGlzIHN1cHBvcnRlZCBvbmx5IGlmIHRoZSBVUlQgbGlicmFyeSBpcyBhdmFpbGFibGUuKQotLlNIIE9QVElPTlMKLUFsbCBzd2l0Y2ggbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkOyBmb3IgZXhhbXBsZSwKLS5CIFwtZ3JheXNjYWxlCi1tYXkgYmUgd3JpdHRlbgotLkIgXC1ncmF5Ci1vcgotLkJSIFwtZ3IgLgotTW9zdCBvZiB0aGUgImJhc2ljIiBzd2l0Y2hlcyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gYXMgbGl0dGxlIGFzIG9uZSBsZXR0ZXIuCi1VcHBlciBhbmQgbG93ZXIgY2FzZSBhcmUgZXF1aXZhbGVudCAodGh1cwotLkIgXC1CTVAKLWlzIHRoZSBzYW1lIGFzCi0uQlIgXC1ibXAgKS4KLUJyaXRpc2ggc3BlbGxpbmdzIGFyZSBhbHNvIGFjY2VwdGVkIChlLmcuLAotLkJSIFwtZ3JleXNjYWxlICksCi10aG91Z2ggZm9yIGJyZXZpdHkgdGhlc2UgYXJlIG5vdCBtZW50aW9uZWQgYmVsb3cuCi0uUFAKLVRoZSBiYXNpYyBzd2l0Y2hlcyBhcmU6Ci0uVFAKLS5CSSBcLXF1YWxpdHkgIiBOIgotU2NhbGUgcXVhbnRpemF0aW9uIHRhYmxlcyB0byBhZGp1c3QgaW1hZ2UgcXVhbGl0eS4gIFF1YWxpdHkgaXMgMCAod29yc3QpIHRvCi0xMDAgKGJlc3QpOyBkZWZhdWx0IGlzIDc1LiAgKFNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvLikKLS5UUAotLkIgXC1ncmF5c2NhbGUKLUNyZWF0ZSBtb25vY2hyb21lIEpQRUcgZmlsZSBmcm9tIGNvbG9yIGlucHV0LiAgQmUgc3VyZSB0byB1c2UgdGhpcyBzd2l0Y2ggd2hlbgotY29tcHJlc3NpbmcgYSBncmF5c2NhbGUgQk1QIGZpbGUsIGJlY2F1c2UKLS5CIGNqcGVnCi1pc24ndCBicmlnaHQgZW5vdWdoIHRvIG5vdGljZSB3aGV0aGVyIGEgQk1QIGZpbGUgdXNlcyBvbmx5IHNoYWRlcyBvZiBncmF5LgotQnkgc2F5aW5nCi0uQlIgXC1ncmF5c2NhbGUgLAoteW91J2xsIGdldCBhIHNtYWxsZXIgSlBFRyBmaWxlIHRoYXQgdGFrZXMgbGVzcyB0aW1lIHRvIHByb2Nlc3MuCi0uVFAKLS5CIFwtb3B0aW1pemUKLVBlcmZvcm0gb3B0aW1pemF0aW9uIG9mIGVudHJvcHkgZW5jb2RpbmcgcGFyYW1ldGVycy4gIFdpdGhvdXQgdGhpcywgZGVmYXVsdAotZW5jb2RpbmcgcGFyYW1ldGVycyBhcmUgdXNlZC4KLS5CIFwtb3B0aW1pemUKLXVzdWFsbHkgbWFrZXMgdGhlIEpQRUcgZmlsZSBhIGxpdHRsZSBzbWFsbGVyLCBidXQKLS5CIGNqcGVnCi1ydW5zIHNvbWV3aGF0IHNsb3dlciBhbmQgbmVlZHMgbXVjaCBtb3JlIG1lbW9yeS4gIEltYWdlIHF1YWxpdHkgYW5kIHNwZWVkIG9mCi1kZWNvbXByZXNzaW9uIGFyZSB1bmFmZmVjdGVkIGJ5Ci0uQlIgXC1vcHRpbWl6ZSAuCi0uVFAKLS5CIFwtcHJvZ3Jlc3NpdmUKLUNyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgKHNlZSBiZWxvdykuCi0uVFAKLS5CIFwtdGFyZ2EKLUlucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0LiAgVGFyZ2EgZmlsZXMgdGhhdCBjb250YWluIGFuICJpZGVudGlmaWNhdGlvbiIKLWZpZWxkIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgcmVjb2duaXplZCBieQotLkJSIGNqcGVnIDsKLWZvciBzdWNoIGZpbGVzIHlvdSBtdXN0IHNwZWNpZnkKLS5CIFwtdGFyZ2EKLXRvIG1ha2UKLS5CIGNqcGVnCi10cmVhdCB0aGUgaW5wdXQgYXMgVGFyZ2EgZm9ybWF0LgotRm9yIG1vc3QgVGFyZ2EgZmlsZXMsIHlvdSB3b24ndCBuZWVkIHRoaXMgc3dpdGNoLgotLlBQCi1UaGUKLS5CIFwtcXVhbGl0eQotc3dpdGNoIGxldHMgeW91IHRyYWRlIG9mZiBjb21wcmVzc2VkIGZpbGUgc2l6ZSBhZ2FpbnN0IHF1YWxpdHkgb2YgdGhlCi1yZWNvbnN0cnVjdGVkIGltYWdlOiB0aGUgaGlnaGVyIHRoZSBxdWFsaXR5IHNldHRpbmcsIHRoZSBsYXJnZXIgdGhlIEpQRUcgZmlsZSwKLWFuZCB0aGUgY2xvc2VyIHRoZSBvdXRwdXQgaW1hZ2Ugd2lsbCBiZSB0byB0aGUgb3JpZ2luYWwgaW5wdXQuICBOb3JtYWxseSB5b3UKLXdhbnQgdG8gdXNlIHRoZSBsb3dlc3QgcXVhbGl0eSBzZXR0aW5nIChzbWFsbGVzdCBmaWxlKSB0aGF0IGRlY29tcHJlc3NlcyBpbnRvCi1zb21ldGhpbmcgdmlzdWFsbHkgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgb3JpZ2luYWwgaW1hZ2UuICBGb3IgdGhpcwotcHVycG9zZSB0aGUgcXVhbGl0eSBzZXR0aW5nIHNob3VsZCBiZSBiZXR3ZWVuIDUwIGFuZCA5NTsgdGhlIGRlZmF1bHQgb2YgNzUgaXMKLW9mdGVuIGFib3V0IHJpZ2h0LiAgSWYgeW91IHNlZSBkZWZlY3RzIGF0Ci0uQiBcLXF1YWxpdHkKLTc1LCB0aGVuIGdvIHVwIDUgb3IgMTAgY291bnRzIGF0IGEgdGltZSB1bnRpbCB5b3UgYXJlIGhhcHB5IHdpdGggdGhlIG91dHB1dAotaW1hZ2UuICAoVGhlIG9wdGltYWwgc2V0dGluZyB3aWxsIHZhcnkgZnJvbSBvbmUgaW1hZ2UgdG8gYW5vdGhlci4pCi0uUFAKLS5CIFwtcXVhbGl0eQotMTAwIHdpbGwgZ2VuZXJhdGUgYSBxdWFudGl6YXRpb24gdGFibGUgb2YgYWxsIDEncywgbWluaW1pemluZyBsb3NzIGluIHRoZQotcXVhbnRpemF0aW9uIHN0ZXAgKGJ1dCB0aGVyZSBpcyBzdGlsbCBpbmZvcm1hdGlvbiBsb3NzIGluIHN1YnNhbXBsaW5nLCBhcyB3ZWxsCi1hcyByb3VuZG9mZiBlcnJvcikuICBUaGlzIHNldHRpbmcgaXMgbWFpbmx5IG9mIGludGVyZXN0IGZvciBleHBlcmltZW50YWwKLXB1cnBvc2VzLiAgUXVhbGl0eSB2YWx1ZXMgYWJvdmUgYWJvdXQgOTUgYXJlCi0uQiBub3QKLXJlY29tbWVuZGVkIGZvciBub3JtYWwgdXNlOyB0aGUgY29tcHJlc3NlZCBmaWxlIHNpemUgZ29lcyB1cCBkcmFtYXRpY2FsbHkgZm9yCi1oYXJkbHkgYW55IGdhaW4gaW4gb3V0cHV0IGltYWdlIHF1YWxpdHkuCi0uUFAKLUluIHRoZSBvdGhlciBkaXJlY3Rpb24sIHF1YWxpdHkgdmFsdWVzIGJlbG93IDUwIHdpbGwgcHJvZHVjZSB2ZXJ5IHNtYWxsIGZpbGVzCi1vZiBsb3cgaW1hZ2UgcXVhbGl0eS4gIFNldHRpbmdzIGFyb3VuZCA1IHRvIDEwIG1pZ2h0IGJlIHVzZWZ1bCBpbiBwcmVwYXJpbmcgYW4KLWluZGV4IG9mIGEgbGFyZ2UgaW1hZ2UgbGlicmFyeSwgZm9yIGV4YW1wbGUuICBUcnkKLS5CIFwtcXVhbGl0eQotMiAob3Igc28pIGZvciBzb21lIGFtdXNpbmcgQ3ViaXN0IGVmZmVjdHMuICAoTm90ZTogcXVhbGl0eQotdmFsdWVzIGJlbG93IGFib3V0IDI1IGdlbmVyYXRlIDItYnl0ZSBxdWFudGl6YXRpb24gdGFibGVzLCB3aGljaCBhcmUKLWNvbnNpZGVyZWQgb3B0aW9uYWwgaW4gdGhlIEpQRUcgc3RhbmRhcmQuCi0uQiBjanBlZwotZW1pdHMgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB5b3UgZ2l2ZSBzdWNoIGEgcXVhbGl0eSB2YWx1ZSwgYmVjYXVzZSBzb21lCi1vdGhlciBKUEVHIHByb2dyYW1zIG1heSBiZSB1bmFibGUgdG8gZGVjb2RlIHRoZSByZXN1bHRpbmcgZmlsZS4gIFVzZQotLkIgXC1iYXNlbGluZQotaWYgeW91IG5lZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYXQgbG93IHF1YWxpdHkgdmFsdWVzLikKLS5QUAotVGhlCi0uQiBcLXByb2dyZXNzaXZlCi1zd2l0Y2ggY3JlYXRlcyBhICJwcm9ncmVzc2l2ZSBKUEVHIiBmaWxlLiAgSW4gdGhpcyB0eXBlIG9mIEpQRUcgZmlsZSwgdGhlIGRhdGEKLWlzIHN0b3JlZCBpbiBtdWx0aXBsZSBzY2FucyBvZiBpbmNyZWFzaW5nIHF1YWxpdHkuICBJZiB0aGUgZmlsZSBpcyBiZWluZwotdHJhbnNtaXR0ZWQgb3ZlciBhIHNsb3cgY29tbXVuaWNhdGlvbnMgbGluaywgdGhlIGRlY29kZXIgY2FuIHVzZSB0aGUgZmlyc3QKLXNjYW4gdG8gZGlzcGxheSBhIGxvdy1xdWFsaXR5IGltYWdlIHZlcnkgcXVpY2tseSwgYW5kIGNhbiB0aGVuIGltcHJvdmUgdGhlCi1kaXNwbGF5IHdpdGggZWFjaCBzdWJzZXF1ZW50IHNjYW4uICBUaGUgZmluYWwgaW1hZ2UgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvIGEKLXN0YW5kYXJkIEpQRUcgZmlsZSBvZiB0aGUgc2FtZSBxdWFsaXR5IHNldHRpbmcsIGFuZCB0aGUgdG90YWwgZmlsZSBzaXplIGlzCi1hYm91dCB0aGUgc2FtZSAtLS0gb2Z0ZW4gYSBsaXR0bGUgc21hbGxlci4KLS5CIENhdXRpb246Ci1wcm9ncmVzc2l2ZSBKUEVHIGlzIG5vdCB5ZXQgd2lkZWx5IGltcGxlbWVudGVkLCBzbyBtYW55IGRlY29kZXJzIHdpbGwgYmUKLXVuYWJsZSB0byB2aWV3IGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIGF0IGFsbC4KLS5QUAotU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOgotLlRQCi0uQiBcLWRjdCBpbnQKLVVzZSBpbnRlZ2VyIERDVCBtZXRob2QgKGRlZmF1bHQpLgotLlRQCi0uQiBcLWRjdCBmYXN0Ci1Vc2UgZmFzdCBpbnRlZ2VyIERDVCAobGVzcyBhY2N1cmF0ZSkuCi0uVFAKLS5CIFwtZGN0IGZsb2F0Ci1Vc2UgZmxvYXRpbmctcG9pbnQgRENUIG1ldGhvZC4KLVRoZSBmbG9hdCBtZXRob2QgaXMgdmVyeSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIGludCBtZXRob2QsIGJ1dCBpcwotbXVjaCBzbG93ZXIgdW5sZXNzIHlvdXIgbWFjaGluZSBoYXMgdmVyeSBmYXN0IGZsb2F0aW5nLXBvaW50IGhhcmR3YXJlLiAgQWxzbwotbm90ZSB0aGF0IHJlc3VsdHMgb2YgdGhlIGZsb2F0aW5nLXBvaW50IG1ldGhvZCBtYXkgdmFyeSBzbGlnaHRseSBhY3Jvc3MKLW1hY2hpbmVzLCB3aGlsZSB0aGUgaW50ZWdlciBtZXRob2RzIHNob3VsZCBnaXZlIHRoZSBzYW1lIHJlc3VsdHMgZXZlcnl3aGVyZS4KLVRoZSBmYXN0IGludGVnZXIgbWV0aG9kIGlzIG11Y2ggbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBvdGhlciB0d28uCi0uVFAKLS5CSSBcLXJlc3RhcnQgIiBOIgotRW1pdCBhIEpQRUcgcmVzdGFydCBtYXJrZXIgZXZlcnkgTiBNQ1Ugcm93cywgb3IgZXZlcnkgTiBNQ1UgYmxvY2tzIGlmICJCIiBpcwotYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KLS5CIFwtcmVzdGFydCAwCi0odGhlIGRlZmF1bHQpIG1lYW5zIG5vIHJlc3RhcnQgbWFya2Vycy4KLS5UUAotLkJJIFwtc21vb3RoICIgTiIKLVNtb290aCB0aGUgaW5wdXQgaW1hZ2UgdG8gZWxpbWluYXRlIGRpdGhlcmluZyBub2lzZS4gIE4sIHJhbmdpbmcgZnJvbSAxIHRvCi0xMDAsIGluZGljYXRlcyB0aGUgc3RyZW5ndGggb2Ygc21vb3RoaW5nLiAgMCAodGhlIGRlZmF1bHQpIG1lYW5zIG5vIHNtb290aGluZy4KLS5UUAotLkJJIFwtbWF4bWVtb3J5ICIgTiIKLVNldCBsaW1pdCBmb3IgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgaW4gcHJvY2Vzc2luZyBsYXJnZSBpbWFnZXMuICBWYWx1ZSBpcwotaW4gdGhvdXNhbmRzIG9mIGJ5dGVzLCBvciBtaWxsaW9ucyBvZiBieXRlcyBpZiAiTSIgaXMgYXR0YWNoZWQgdG8gdGhlCi1udW1iZXIuICBGb3IgZXhhbXBsZSwKLS5CIFwtbWF4IDRtCi1zZWxlY3RzIDQwMDAwMDAgYnl0ZXMuICBJZiBtb3JlIHNwYWNlIGlzIG5lZWRlZCwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4KLS5UUAotLkJJIFwtb3V0ZmlsZSAiIG5hbWUiCi1TZW5kIG91dHB1dCBpbWFnZSB0byB0aGUgbmFtZWQgZmlsZSwgbm90IHRvIHN0YW5kYXJkIG91dHB1dC4KLS5UUAotLkIgXC12ZXJib3NlCi1FbmFibGUgZGVidWcgcHJpbnRvdXQuICBNb3JlCi0uQlIgXC12ICdzCi1naXZlIG1vcmUgb3V0cHV0LiAgQWxzbywgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBwcmludGVkIGF0IHN0YXJ0dXAuCi0uVFAKLS5CIFwtZGVidWcKLVNhbWUgYXMKLS5CUiBcLXZlcmJvc2UgLgotLlBQCi1UaGUKLS5CIFwtcmVzdGFydAotb3B0aW9uIGluc2VydHMgZXh0cmEgbWFya2VycyB0aGF0IGFsbG93IGEgSlBFRyBkZWNvZGVyIHRvIHJlc3luY2hyb25pemUgYWZ0ZXIKLWEgdHJhbnNtaXNzaW9uIGVycm9yLiAgV2l0aG91dCByZXN0YXJ0IG1hcmtlcnMsIGFueSBkYW1hZ2UgdG8gYSBjb21wcmVzc2VkCi1maWxlIHdpbGwgdXN1YWxseSBydWluIHRoZSBpbWFnZSBmcm9tIHRoZSBwb2ludCBvZiB0aGUgZXJyb3IgdG8gdGhlIGVuZCBvZiB0aGUKLWltYWdlOyB3aXRoIHJlc3RhcnQgbWFya2VycywgdGhlIGRhbWFnZSBpcyB1c3VhbGx5IGNvbmZpbmVkIHRvIHRoZSBwb3J0aW9uIG9mCi10aGUgaW1hZ2UgdXAgdG8gdGhlIG5leHQgcmVzdGFydCBtYXJrZXIuICBPZiBjb3Vyc2UsIHRoZSByZXN0YXJ0IG1hcmtlcnMKLW9jY3VweSBleHRyYSBzcGFjZS4gIFdlIHJlY29tbWVuZAotLkIgXC1yZXN0YXJ0IDEKLWZvciBpbWFnZXMgdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkIGFjcm9zcyB1bnJlbGlhYmxlIG5ldHdvcmtzIHN1Y2ggYXMgVXNlbmV0LgotLlBQCi1UaGUKLS5CIFwtc21vb3RoCi1vcHRpb24gZmlsdGVycyB0aGUgaW5wdXQgdG8gZWxpbWluYXRlIGZpbmUtc2NhbGUgbm9pc2UuICBUaGlzIGlzIG9mdGVuIHVzZWZ1bAotd2hlbiBjb252ZXJ0aW5nIGRpdGhlcmVkIGltYWdlcyB0byBKUEVHOiBhIG1vZGVyYXRlIHNtb290aGluZyBmYWN0b3Igb2YgMTAgdG8KLTUwIGdldHMgcmlkIG9mIGRpdGhlcmluZyBwYXR0ZXJucyBpbiB0aGUgaW5wdXQgZmlsZSwgcmVzdWx0aW5nIGluIGEgc21hbGxlcgotSlBFRyBmaWxlIGFuZCBhIGJldHRlci1sb29raW5nIGltYWdlLiAgVG9vIGxhcmdlIGEgc21vb3RoaW5nIGZhY3RvciB3aWxsCi12aXNpYmx5IGJsdXIgdGhlIGltYWdlLCBob3dldmVyLgotLlBQCi1Td2l0Y2hlcyBmb3Igd2l6YXJkczoKLS5UUAotLkIgXC1iYXNlbGluZQotRm9yY2UgYmFzZWxpbmUtY29tcGF0aWJsZSBxdWFudGl6YXRpb24gdGFibGVzIHRvIGJlIGdlbmVyYXRlZC4gIFRoaXMgY2xhbXBzCi1xdWFudGl6YXRpb24gdmFsdWVzIHRvIDggYml0cyBldmVuIGF0IGxvdyBxdWFsaXR5IHNldHRpbmdzLiAgKFRoaXMgc3dpdGNoIGlzCi1wb29ybHkgbmFtZWQsIHNpbmNlIGl0IGRvZXMgbm90IGVuc3VyZSB0aGF0IHRoZSBvdXRwdXQgaXMgYWN0dWFsbHkgYmFzZWxpbmUKLUpQRUcuICBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UKLS5CIFwtYmFzZWxpbmUKLWFuZAotLkIgXC1wcm9ncmVzc2l2ZQotdG9nZXRoZXIuKQotLlRQCi0uQkkgXC1xdGFibGVzICIgZmlsZSIKLVVzZSB0aGUgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KLS5UUAotLkJJIFwtcXNsb3RzICIgTlssLi4uXSIKLVNlbGVjdCB3aGljaCBxdWFudGl6YXRpb24gdGFibGUgdG8gdXNlIGZvciBlYWNoIGNvbG9yIGNvbXBvbmVudC4KLS5UUAotLkJJIFwtc2FtcGxlICIgSHhWWywuLi5dIgotU2V0IEpQRUcgc2FtcGxpbmcgZmFjdG9ycyBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQuCi0uVFAKLS5CSSBcLXNjYW5zICIgZmlsZSIKLVVzZSB0aGUgc2NhbiBzY3JpcHQgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCi0uUFAKLVRoZSAid2l6YXJkIiBzd2l0Y2hlcyBhcmUgaW50ZW5kZWQgZm9yIGV4cGVyaW1lbnRhdGlvbiB3aXRoIEpQRUcuICBJZiB5b3UKLWRvbid0IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCBcZkJkb24ndCB1c2UgdGhlbVxmUi4gIFRoZXNlIHN3aXRjaGVzIGFyZQotZG9jdW1lbnRlZCBmdXJ0aGVyIGluIHRoZSBmaWxlIHdpemFyZC5kb2MuCi0uU0ggRVhBTVBMRVMKLS5MUAotVGhpcyBleGFtcGxlIGNvbXByZXNzZXMgdGhlIFBQTSBmaWxlIGZvby5wcG0gd2l0aCBhIHF1YWxpdHkgZmFjdG9yIG9mCi02MCBhbmQgc2F2ZXMgdGhlIG91dHB1dCBhcyBmb28uanBnOgotLklQCi0uQiBjanBlZyBcLXF1YWxpdHkKLS5JIDYwIGZvby5wcG0KLS5CID4KLS5JIGZvby5qcGcKLS5TSCBISU5UUwotQ29sb3IgR0lGIGZpbGVzIGFyZSBub3QgdGhlIGlkZWFsIGlucHV0IGZvciBKUEVHOyBKUEVHIGlzIHJlYWxseSBpbnRlbmRlZCBmb3IKLWNvbXByZXNzaW5nIGZ1bGwtY29sb3IgKDI0LWJpdCkgaW1hZ2VzLiAgSW4gcGFydGljdWxhciwgZG9uJ3QgdHJ5IHRvIGNvbnZlcnQKLWNhcnRvb25zLCBsaW5lIGRyYXdpbmdzLCBhbmQgb3RoZXIgaW1hZ2VzIHRoYXQgaGF2ZSBvbmx5IGEgZmV3IGRpc3RpbmN0Ci1jb2xvcnMuICBHSUYgd29ya3MgZ3JlYXQgb24gdGhlc2UsIEpQRUcgZG9lcyBub3QuICBJZiB5b3Ugd2FudCB0byBjb252ZXJ0IGEKLUdJRiB0byBKUEVHLCB5b3Ugc2hvdWxkIGV4cGVyaW1lbnQgd2l0aAotLkJSIGNqcGVnICdzCi0uQiBcLXF1YWxpdHkKLWFuZAotLkIgXC1zbW9vdGgKLW9wdGlvbnMgdG8gZ2V0IGEgc2F0aXNmYWN0b3J5IGNvbnZlcnNpb24uCi0uQiBcLXNtb290aCAxMAotb3Igc28gaXMgb2Z0ZW4gaGVscGZ1bC4KLS5QUAotQXZvaWQgcnVubmluZyBhbiBpbWFnZSB0aHJvdWdoIGEgc2VyaWVzIG9mIEpQRUcgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbgotY3ljbGVzLiAgSW1hZ2UgcXVhbGl0eSBsb3NzIHdpbGwgYWNjdW11bGF0ZTsgYWZ0ZXIgdGVuIG9yIHNvIGN5Y2xlcyB0aGUgaW1hZ2UKLW1heSBiZSBub3RpY2VhYmx5IHdvcnNlIHRoYW4gaXQgd2FzIGFmdGVyIG9uZSBjeWNsZS4gIEl0J3MgYmVzdCB0byB1c2UgYQotbG9zc2xlc3MgZm9ybWF0IHdoaWxlIG1hbmlwdWxhdGluZyBhbiBpbWFnZSwgdGhlbiBjb252ZXJ0IHRvIEpQRUcgZm9ybWF0IHdoZW4KLXlvdSBhcmUgcmVhZHkgdG8gZmlsZSB0aGUgaW1hZ2UgYXdheS4KLS5QUAotVGhlCi0uQiBcLW9wdGltaXplCi1vcHRpb24gdG8KLS5CIGNqcGVnCi1pcyB3b3J0aCB1c2luZyB3aGVuIHlvdSBhcmUgbWFraW5nIGEgImZpbmFsIiB2ZXJzaW9uIGZvciBwb3N0aW5nIG9yIGFyY2hpdmluZy4KLUl0J3MgYWxzbyBhIHdpbiB3aGVuIHlvdSBhcmUgdXNpbmcgbG93IHF1YWxpdHkgc2V0dGluZ3MgdG8gbWFrZSB2ZXJ5IHNtYWxsCi1KUEVHIGZpbGVzOyB0aGUgcGVyY2VudGFnZSBpbXByb3ZlbWVudCBpcyBvZnRlbiBhIGxvdCBtb3JlIHRoYW4gaXQgaXMgb24KLWxhcmdlciBmaWxlcy4gIChBdCBwcmVzZW50LAotLkIgXC1vcHRpbWl6ZQotbW9kZSBpcyBhbHdheXMgc2VsZWN0ZWQgd2hlbiBnZW5lcmF0aW5nIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMuKQotLlNIIEVOVklST05NRU5UCi0uVFAKLS5CIEpQRUdNRU0KLUlmIHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCBpdHMgdmFsdWUgaXMgdGhlIGRlZmF1bHQgbWVtb3J5IGxpbWl0LgotVGhlIHZhbHVlIGlzIHNwZWNpZmllZCBhcyBkZXNjcmliZWQgZm9yIHRoZQotLkIgXC1tYXhtZW1vcnkKLXN3aXRjaC4KLS5CIEpQRUdNRU0KLW92ZXJyaWRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBzcGVjaWZpZWQgd2hlbiB0aGUgcHJvZ3JhbSB3YXMgY29tcGlsZWQsIGFuZAotaXRzZWxmIGlzIG92ZXJyaWRkZW4gYnkgYW4gZXhwbGljaXQKLS5CUiBcLW1heG1lbW9yeSAuCi0uU0ggU0VFIEFMU08KLS5CUiBkanBlZyAoMSksCi0uQlIganBlZ3RyYW4gKDEpLAotLkJSIHJkanBnY29tICgxKSwKLS5CUiB3cmpwZ2NvbSAoMSkKLS5icgotLkJSIHBwbSAoNSksCi0uQlIgcGdtICg1KQotLmJyCi1XYWxsYWNlLCBHcmVnb3J5IEsuICAiVGhlIEpQRUcgU3RpbGwgUGljdHVyZSBDb21wcmVzc2lvbiBTdGFuZGFyZCIsCi1Db21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCBBcHJpbCAxOTkxICh2b2wuIDM0LCBuby4gNCksIHBwLiAzMC00NC4KLS5TSCBBVVRIT1IKLUluZGVwZW5kZW50IEpQRUcgR3JvdXAKLS5TSCBCVUdTCi1Bcml0aG1ldGljIGNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLgotLlBQCi1HSUYgaW5wdXQgZmlsZXMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQsIHRvIGF2b2lkIHRoZSBVbmlzeXMgTFpXIHBhdGVudC4KLVVzZSBhIFVuaXN5cy1saWNlbnNlZCBwcm9ncmFtIGlmIHlvdSBuZWVkIHRvIHJlYWQgYSBHSUYgZmlsZS4gIChDb252ZXJzaW9uCi1vZiBHSUYgZmlsZXMgdG8gSlBFRyBpcyB1c3VhbGx5IGEgYmFkIGlkZWEgYW55d2F5LikKLS5QUAotTm90IGFsbCB2YXJpYW50cyBvZiBCTVAgYW5kIFRhcmdhIGZpbGUgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLgotLlBQCi1UaGUKLS5CIFwtdGFyZ2EKLXN3aXRjaCBpcyBub3QgYSBidWcsIGl0J3MgYSBmZWF0dXJlLiAgKEl0IHdvdWxkIGJlIGEgYnVnIGlmIHRoZSBUYXJnYSBmb3JtYXQKLWRlc2lnbmVycyBoYWQgbm90IGJlZW4gY2x1ZWxlc3MuKQotLlBQCi1TdGlsbCBub3QgYXMgZmFzdCBhcyB3ZSdkIGxpa2UuCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9janBlZy5jIGIvbGlianBlZ3R3cnAvY2pwZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhOTI5Zi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9janBlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA2ICswLDAgQEAKLS8qCi0gKiBjanBlZy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYSBjb21tYW5kLWxpbmUgdXNlciBpbnRlcmZhY2UgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCi0gKiBJdCBzaG91bGQgd29yayBvbiBhbnkgc3lzdGVtIHdpdGggVW5peC0gb3IgTVMtRE9TLXN0eWxlIGNvbW1hbmQgbGluZXMuCi0gKgotICogVHdvIGRpZmZlcmVudCBjb21tYW5kIGxpbmUgc3R5bGVzIGFyZSBwZXJtaXR0ZWQsIGRlcGVuZGluZyBvbiB0aGUKLSAqIGNvbXBpbGUtdGltZSBzd2l0Y2ggVFdPX0ZJTEVfQ09NTUFORExJTkU6Ci0gKgljanBlZyBbb3B0aW9uc10gIGlucHV0ZmlsZSBvdXRwdXRmaWxlCi0gKgljanBlZyBbb3B0aW9uc10gIFtpbnB1dGZpbGVdCi0gKiBJbiB0aGUgc2Vjb25kIHN0eWxlLCBvdXRwdXQgaXMgYWx3YXlzIHRvIHN0YW5kYXJkIG91dHB1dCwgd2hpY2ggeW91J2QKLSAqIG5vcm1hbGx5IHJlZGlyZWN0IHRvIGEgZmlsZSBvciBwaXBlIHRvIHNvbWUgb3RoZXIgcHJvZ3JhbS4gIElucHV0IGlzCi0gKiBlaXRoZXIgZnJvbSBhIG5hbWVkIGZpbGUgb3IgZnJvbSBzdGFuZGFyZCBpbnB1dCAodHlwaWNhbGx5IHJlZGlyZWN0ZWQpLgotICogVGhlIHNlY29uZCBzdHlsZSBpcyBjb252ZW5pZW50IG9uIFVuaXggYnV0IGlzIHVuaGVscGZ1bCBvbiBzeXN0ZW1zIHRoYXQKLSAqIGRvbid0IHN1cHBvcnQgcGlwZXMuICBBbHNvLCB5b3UgTVVTVCB1c2UgdGhlIGZpcnN0IHN0eWxlIGlmIHlvdXIgc3lzdGVtCi0gKiBkb2Vzbid0IGRvIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LgotICogVG8gc2ltcGxpZnkgc2NyaXB0IHdyaXRpbmcsIHRoZSAiLW91dGZpbGUiIHN3aXRjaCBpcyBwcm92aWRlZC4gIFRoZSBzeW50YXgKLSAqCWNqcGVnIFtvcHRpb25zXSAgLW91dGZpbGUgb3V0cHV0ZmlsZSAgaW5wdXRmaWxlCi0gKiB3b3JrcyByZWdhcmRsZXNzIG9mIHdoaWNoIGNvbW1hbmQgbGluZSBzdHlsZSBpcyB1c2VkLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0jaW5jbHVkZSAianZlcnNpb24uaCIJCS8qIGZvciB2ZXJzaW9uIG1lc3NhZ2UgKi8KLQotI2lmZGVmIFVTRV9DQ09NTUFORAkJLyogY29tbWFuZC1saW5lIHJlYWRlciBmb3IgTWFjaW50b3NoICovCi0jaWZkZWYgX19NV0VSS1NfXwotI2luY2x1ZGUgPFNJT1VYLmg+ICAgICAgICAgICAgICAvKiBNZXRyb3dlcmtzIG5lZWRzIHRoaXMgKi8KLSNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiAuLi4gYW5kIHRoaXMgKi8KLSNlbmRpZgotI2lmZGVmIFRISU5LX0MKLSNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiBUaGluayBkZWNsYXJlcyBpdCBoZXJlICovCi0jZW5kaWYKLSNlbmRpZgotCi0KLS8qIENyZWF0ZSB0aGUgYWRkLW9uIG1lc3NhZ2Ugc3RyaW5nIHRhYmxlLiAqLwotCi0jZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQlzdHJpbmcgLAotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkanBlZ19tZXNzYWdlX3RhYmxlW10gPSB7Ci0jaW5jbHVkZSAiY2RlcnJvci5oIgotICBOVUxMCi19OwotCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgZGV0ZXJtaW5lcyB3aGF0IGZvcm1hdCB0aGUgaW5wdXQgZmlsZSBpcywKLSAqIGFuZCBzZWxlY3RzIHRoZSBhcHByb3ByaWF0ZSBpbnB1dC1yZWFkaW5nIG1vZHVsZS4KLSAqCi0gKiBUbyBkZXRlcm1pbmUgd2hpY2ggZmFtaWx5IG9mIGlucHV0IGZvcm1hdHMgdGhlIGZpbGUgYmVsb25ncyB0bywKLSAqIHdlIG1heSBsb29rIG9ubHkgYXQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGZpbGUsIHNpbmNlIEMgZG9lcyBub3QKLSAqIGd1YXJhbnRlZSB0aGF0IG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyIGNhbiBiZSBwdXNoZWQgYmFjayB3aXRoIHVuZ2V0Yy4KLSAqIExvb2tpbmcgYXQgYWRkaXRpb25hbCBieXRlcyB3b3VsZCByZXF1aXJlIG9uZSBvZiB0aGVzZSBhcHByb2FjaGVzOgotICogICAgIDEpIGFzc3VtZSB3ZSBjYW4gZnNlZWsoKSB0aGUgaW5wdXQgZmlsZSAoZmFpbHMgZm9yIHBpcGVkIGlucHV0KTsKLSAqICAgICAyKSBhc3N1bWUgd2UgY2FuIHB1c2ggYmFjayBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciAod29ya3MgaW4KLSAqICAgICAgICBzb21lIEMgaW1wbGVtZW50YXRpb25zLCBidXQgdW5wb3J0YWJsZSk7Ci0gKiAgICAgMykgcHJvdmlkZSBvdXIgb3duIGJ1ZmZlcmluZyAoYnJlYWtzIGlucHV0IHJlYWRlcnMgdGhhdCB3YW50IHRvIHVzZQotICogICAgICAgIHN0ZGlvIGRpcmVjdGx5LCBzdWNoIGFzIHRoZSBSTEUgbGlicmFyeSk7Ci0gKiBvciAgNCkgZG9uJ3QgcHV0IGJhY2sgdGhlIGRhdGEsIGFuZCBtb2RpZnkgdGhlIGlucHV0X2luaXQgbWV0aG9kcyB0byBhc3N1bWUKLSAqICAgICAgICB0aGV5IHN0YXJ0IHJlYWRpbmcgYWZ0ZXIgdGhlIHN0YXJ0IG9mIGZpbGUgKGFsc28gYnJlYWtzIFJMRSBsaWJyYXJ5KS4KLSAqICMxIGlzIGF0dHJhY3RpdmUgZm9yIE1TLURPUyBidXQgaXMgdW50ZW5hYmxlIG9uIFVuaXguCi0gKgotICogVGhlIG1vc3QgcG9ydGFibGUgc29sdXRpb24gZm9yIGZpbGUgdHlwZXMgdGhhdCBjYW4ndCBiZSBpZGVudGlmaWVkIGJ5IHRoZWlyCi0gKiBmaXJzdCBieXRlIGlzIHRvIG1ha2UgdGhlIHVzZXIgdGVsbCB1cyB3aGF0IHRoZXkgYXJlLiAgVGhpcyBpcyBhbHNvIHRoZQotICogb25seSBhcHByb2FjaCBmb3IgInJhdyIgZmlsZSB0eXBlcyB0aGF0IGNvbnRhaW4gb25seSBhcmJpdHJhcnkgdmFsdWVzLgotICogV2UgcHJlc2VudGx5IGFwcGx5IHRoaXMgbWV0aG9kIGZvciBUYXJnYSBmaWxlcy4gIE1vc3Qgb2YgdGhlIHRpbWUgVGFyZ2EKLSAqIGZpbGVzIHN0YXJ0IHdpdGggMHgwMCwgc28gd2UgcmVjb2duaXplIHRoYXQgY2FzZS4gIFBvdGVudGlhbGx5LCBob3dldmVyLAotICogYSBUYXJnYSBmaWxlIGNvdWxkIHN0YXJ0IHdpdGggYW55IGJ5dGUgdmFsdWUgKGJ5dGUgMCBpcyB0aGUgbGVuZ3RoIG9mIHRoZQotICogc2VsZG9tLXVzZWQgSUQgZmllbGQpLCBzbyB3ZSBwcm92aWRlIGEgc3dpdGNoIHRvIGZvcmNlIFRhcmdhIGlucHV0IG1vZGUuCi0gKi8KLQotc3RhdGljIGJvb2xlYW4gaXNfdGFyZ2E7CS8qIHJlY29yZHMgdXNlciAtdGFyZ2Egc3dpdGNoICovCi0KLQotTE9DQUwoY2pwZWdfc291cmNlX3B0cikKLXNlbGVjdF9maWxlX3R5cGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQotewotICBpbnQgYzsKLQotICBpZiAoaXNfdGFyZ2EpIHsKLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLSAgICByZXR1cm4gamluaXRfcmVhZF90YXJnYShjaW5mbyk7Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX05PVENPTVApOwotI2VuZGlmCi0gIH0KLQotICBpZiAoKGMgPSBnZXRjKGluZmlsZSkpID09IEVPRikKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VNUFRZKTsKLSAgaWYgKHVuZ2V0YyhjLCBpbmZpbGUpID09IEVPRikKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1VOR0VUQ19GQUlMRUQpOwotCi0gIHN3aXRjaCAoYykgewotI2lmZGVmIEJNUF9TVVBQT1JURUQKLSAgY2FzZSAnQic6Ci0gICAgcmV0dXJuIGppbml0X3JlYWRfYm1wKGNpbmZvKTsKLSNlbmRpZgotI2lmZGVmIEdJRl9TVVBQT1JURUQKLSAgY2FzZSAnRyc6Ci0gICAgcmV0dXJuIGppbml0X3JlYWRfZ2lmKGNpbmZvKTsKLSNlbmRpZgotI2lmZGVmIFBQTV9TVVBQT1JURUQKLSAgY2FzZSAnUCc6Ci0gICAgcmV0dXJuIGppbml0X3JlYWRfcHBtKGNpbmZvKTsKLSNlbmRpZgotI2lmZGVmIFJMRV9TVVBQT1JURUQKLSAgY2FzZSAnUic6Ci0gICAgcmV0dXJuIGppbml0X3JlYWRfcmxlKGNpbmZvKTsKLSNlbmRpZgotI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAotICBjYXNlIDB4MDA6Ci0gICAgcmV0dXJuIGppbml0X3JlYWRfdGFyZ2EoY2luZm8pOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9VTktOT1dOX0ZPUk1BVCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gTlVMTDsJCQkvKiBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5ncyAqLwotfQotCi0KLS8qCi0gKiBBcmd1bWVudC1wYXJzaW5nIGNvZGUuCi0gKiBUaGUgc3dpdGNoIHBhcnNlciBpcyBkZXNpZ25lZCB0byBiZSB1c2VmdWwgd2l0aCBET1Mtc3R5bGUgY29tbWFuZCBsaW5lCi0gKiBzeW50YXgsIGllLCBpbnRlcm1peGVkIHN3aXRjaGVzIGFuZCBmaWxlIG5hbWVzLCB3aGVyZSBvbmx5IHRoZSBzd2l0Y2hlcwotICogdG8gdGhlIGxlZnQgb2YgYSBnaXZlbiBmaWxlIG5hbWUgYWZmZWN0IHByb2Nlc3Npbmcgb2YgdGhhdCBmaWxlLgotICogVGhlIG1haW4gcHJvZ3JhbSBpbiB0aGlzIGZpbGUgZG9lc24ndCBhY3R1YWxseSB1c2UgdGhpcyBjYXBhYmlsaXR5Li4uCi0gKi8KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqIHByb2duYW1lOwkvKiBwcm9ncmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCi1zdGF0aWMgY2hhciAqIG91dGZpbGVuYW1lOwkvKiBmb3IgLW91dGZpbGUgc3dpdGNoICovCi0KLQotTE9DQUwodm9pZCkKLXVzYWdlICh2b2lkKQotLyogY29tcGxhaW4gYWJvdXQgYmFkIGNvbW1hbmQgbGluZSAqLwotewotICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbc3dpdGNoZXNdICIsIHByb2duYW1lKTsKLSNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQotICBmcHJpbnRmKHN0ZGVyciwgImlucHV0ZmlsZSBvdXRwdXRmaWxlXG4iKTsKLSNlbHNlCi0gIGZwcmludGYoc3RkZXJyLCAiW2lucHV0ZmlsZV1cbiIpOwotI2VuZGlmCi0KLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyAobmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkKTpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXF1YWxpdHkgTiAgICAgQ29tcHJlc3Npb24gcXVhbGl0eSAoMC4uMTAwOyA1LTk1IGlzIHVzZWZ1bCByYW5nZSlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdyYXlzY2FsZSAgICAgQ3JlYXRlIG1vbm9jaHJvbWUgSlBFRyBmaWxlXG4iKTsKLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vcHRpbWl6ZSAgICAgIE9wdGltaXplIEh1ZmZtYW4gdGFibGUgKHNtYWxsZXIgZmlsZSwgYnV0IHNsb3cgY29tcHJlc3Npb24pXG4iKTsKLSNlbmRpZgotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtcHJvZ3Jlc3NpdmUgICBDcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlXG4iKTsKLSNlbmRpZgotI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXRhcmdhICAgICAgICAgSW5wdXQgZmlsZSBpcyBUYXJnYSBmb3JtYXQgKHVzdWFsbHkgbm90IG5lZWRlZClcbiIpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOlxuIik7Ci0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBpbnQgICAgICAgVXNlIGludGVnZXIgRENUIG1ldGhvZCVzXG4iLAotCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0lTTE9XID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgZmFzdCAgICAgIFVzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKSVzXG4iLAotCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0lGQVNUID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgZmxvYXQgICAgIFVzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kJXNcbiIsCi0JICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfRkxPQVQgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiICAtcmVzdGFydCBOICAgICBTZXQgcmVzdGFydCBpbnRlcnZhbCBpbiByb3dzLCBvciBpbiBibG9ja3Mgd2l0aCBCXG4iKTsKLSNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtc21vb3RoIE4gICAgICBTbW9vdGggZGl0aGVyZWQgaW5wdXQgKE49MS4uMTAwIGlzIHN0cmVuZ3RoKVxuIik7Ci0jZW5kaWYKLSAgZnByaW50ZihzdGRlcnIsICIgIC1tYXhtZW1vcnkgTiAgIE1heGltdW0gbWVtb3J5IHRvIHVzZSAoaW4ga2J5dGVzKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtb3V0ZmlsZSBuYW1lICBTcGVjaWZ5IG5hbWUgZm9yIG91dHB1dCBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJib3NlICBvciAgLWRlYnVnICAgRW1pdCBkZWJ1ZyBvdXRwdXRcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIGZvciB3aXphcmRzOlxuIik7Ci0jaWZkZWYgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtYXJpdGhtZXRpYyAgICBVc2UgYXJpdGhtZXRpYyBjb2RpbmdcbiIpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiICAtYmFzZWxpbmUgICAgICBGb3JjZSBiYXNlbGluZSBxdWFudGl6YXRpb24gdGFibGVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1xdGFibGVzIGZpbGUgIFVzZSBxdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXFzbG90cyBOWywuLi5dICAgIFNldCBjb21wb25lbnQgcXVhbnRpemF0aW9uIHRhYmxlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtc2FtcGxlIEh4VlssLi4uXSAgU2V0IGNvbXBvbmVudCBzYW1wbGluZyBmYWN0b3JzXG4iKTsKLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1zY2FucyBmaWxlICAgIENyZWF0ZSBtdWx0aS1zY2FuIEpQRUcgcGVyIHNjcmlwdCBmaWxlXG4iKTsKLSNlbmRpZgotICBleGl0KEVYSVRfRkFJTFVSRSk7Ci19Ci0KLQotTE9DQUwoaW50KQotcGFyc2Vfc3dpdGNoZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCi0JCWludCBsYXN0X2ZpbGVfYXJnX3NlZW4sIGJvb2xlYW4gZm9yX3JlYWwpCi0vKiBQYXJzZSBvcHRpb25hbCBzd2l0Y2hlcy4KLSAqIFJldHVybnMgYXJndltdIGluZGV4IG9mIGZpcnN0IGZpbGUtbmFtZSBhcmd1bWVudCAoPT0gYXJnYyBpZiBub25lKS4KLSAqIEFueSBmaWxlIG5hbWVzIHdpdGggaW5kZXhlcyA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4gYXJlIGlnbm9yZWQ7Ci0gKiB0aGV5IGhhdmUgcHJlc3VtYWJseSBiZWVuIHByb2Nlc3NlZCBpbiBhIHByZXZpb3VzIGl0ZXJhdGlvbi4KLSAqIChQYXNzIDAgZm9yIGxhc3RfZmlsZV9hcmdfc2VlbiBvbiB0aGUgZmlyc3Qgb3Igb25seSBpdGVyYXRpb24uKQotICogZm9yX3JlYWwgaXMgRkFMU0Ugb24gdGhlIGZpcnN0IChkdW1teSkgcGFzczsgd2UgbWF5IHNraXAgYW55IGV4cGVuc2l2ZQotICogcHJvY2Vzc2luZy4KLSAqLwotewotICBpbnQgYXJnbjsKLSAgY2hhciAqIGFyZzsKLSAgaW50IHF1YWxpdHk7CQkJLyogLXF1YWxpdHkgcGFyYW1ldGVyICovCi0gIGludCBxX3NjYWxlX2ZhY3RvcjsJCS8qIHNjYWxpbmcgcGVyY2VudGFnZSBmb3IgLXF0YWJsZXMgKi8KLSAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZTsKLSAgYm9vbGVhbiBzaW1wbGVfcHJvZ3Jlc3NpdmU7Ci0gIGNoYXIgKiBxdGFibGVmaWxlID0gTlVMTDsJLyogc2F2ZXMgLXF0YWJsZXMgZmlsZW5hbWUgaWYgYW55ICovCi0gIGNoYXIgKiBxc2xvdHNhcmcgPSBOVUxMOwkvKiBzYXZlcyAtcXNsb3RzIHBhcm0gaWYgYW55ICovCi0gIGNoYXIgKiBzYW1wbGVhcmcgPSBOVUxMOwkvKiBzYXZlcyAtc2FtcGxlIHBhcm0gaWYgYW55ICovCi0gIGNoYXIgKiBzY2Fuc2FyZyA9IE5VTEw7CS8qIHNhdmVzIC1zY2FucyBwYXJtIGlmIGFueSAqLwotCi0gIC8qIFNldCB1cCBkZWZhdWx0IEpQRUcgcGFyYW1ldGVycy4gKi8KLSAgLyogTm90ZSB0aGF0IGRlZmF1bHQgLXF1YWxpdHkgbGV2ZWwgbmVlZCBub3QsIGFuZCBkb2VzIG5vdCwKLSAgICogbWF0Y2ggdGhlIGRlZmF1bHQgc2NhbGluZyBmb3IgYW4gZXhwbGljaXQgLXF0YWJsZXMgYXJndW1lbnQuCi0gICAqLwotICBxdWFsaXR5ID0gNzU7CQkJLyogZGVmYXVsdCAtcXVhbGl0eSB2YWx1ZSAqLwotICBxX3NjYWxlX2ZhY3RvciA9IDEwMDsJCS8qIGRlZmF1bHQgdG8gbm8gc2NhbGluZyBmb3IgLXF0YWJsZXMgKi8KLSAgZm9yY2VfYmFzZWxpbmUgPSBGQUxTRTsJLyogYnkgZGVmYXVsdCwgYWxsb3cgMTYtYml0IHF1YW50aXplcnMgKi8KLSAgc2ltcGxlX3Byb2dyZXNzaXZlID0gRkFMU0U7Ci0gIGlzX3RhcmdhID0gRkFMU0U7Ci0gIG91dGZpbGVuYW1lID0gTlVMTDsKLSAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPSAwOwotCi0gIC8qIFNjYW4gY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFkanVzdCBwYXJhbWV0ZXJzICovCi0KLSAgZm9yIChhcmduID0gMTsgYXJnbiA8IGFyZ2M7IGFyZ24rKykgewotICAgIGFyZyA9IGFyZ3ZbYXJnbl07Ci0gICAgaWYgKCphcmcgIT0gJy0nKSB7Ci0gICAgICAvKiBOb3QgYSBzd2l0Y2gsIG11c3QgYmUgYSBmaWxlIG5hbWUgYXJndW1lbnQgKi8KLSAgICAgIGlmIChhcmduIDw9IGxhc3RfZmlsZV9hcmdfc2VlbikgewotCW91dGZpbGVuYW1lID0gTlVMTDsJLyogLW91dGZpbGUgYXBwbGllcyB0byBqdXN0IG9uZSBpbnB1dCBmaWxlICovCi0JY29udGludWU7CQkvKiBpZ25vcmUgdGhpcyBuYW1lIGlmIHByZXZpb3VzbHkgcHJvY2Vzc2VkICovCi0gICAgICB9Ci0gICAgICBicmVhazsJCQkvKiBlbHNlIGRvbmUgcGFyc2luZyBzd2l0Y2hlcyAqLwotICAgIH0KLSAgICBhcmcrKzsJCQkvKiBhZHZhbmNlIHBhc3Qgc3dpdGNoIG1hcmtlciBjaGFyYWN0ZXIgKi8KLQotICAgIGlmIChrZXltYXRjaChhcmcsICJhcml0aG1ldGljIiwgMSkpIHsKLSAgICAgIC8qIFVzZSBhcml0aG1ldGljIGNvZGluZy4gKi8KLSNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKLSAgICAgIGNpbmZvLT5hcml0aF9jb2RlID0gVFJVRTsKLSNlbHNlCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgYXJpdGhtZXRpYyBjb2Rpbmcgbm90IHN1cHBvcnRlZFxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiYmFzZWxpbmUiLCAxKSkgewotICAgICAgLyogRm9yY2UgYmFzZWxpbmUtY29tcGF0aWJsZSBvdXRwdXQgKDgtYml0IHF1YW50aXplciB2YWx1ZXMpLiAqLwotICAgICAgZm9yY2VfYmFzZWxpbmUgPSBUUlVFOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkY3QiLCAyKSkgewotICAgICAgLyogU2VsZWN0IERDVCBhbGdvcml0aG0uICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImludCIsIDEpKSB7Ci0JY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0lTTE9XOwotICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiZmFzdCIsIDIpKSB7Ci0JY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0lGQVNUOwotICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiZmxvYXQiLCAyKSkgewotCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9GTE9BVDsKLSAgICAgIH0gZWxzZQotCXVzYWdlKCk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImRlYnVnIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAidmVyYm9zZSIsIDEpKSB7Ci0gICAgICAvKiBFbmFibGUgZGVidWcgcHJpbnRvdXRzLiAqLwotICAgICAgLyogT24gZmlyc3QgLWQsIHByaW50IHZlcnNpb24gaWRlbnRpZmljYXRpb24gKi8KLSAgICAgIHN0YXRpYyBib29sZWFuIHByaW50ZWRfdmVyc2lvbiA9IEZBTFNFOwotCi0gICAgICBpZiAoISBwcmludGVkX3ZlcnNpb24pIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBDSlBFRywgdmVyc2lvbiAlc1xuJXNcbiIsCi0JCUpWRVJTSU9OLCBKQ09QWVJJR0hUKTsKLQlwcmludGVkX3ZlcnNpb24gPSBUUlVFOwotICAgICAgfQotICAgICAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwrKzsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZ3JheXNjYWxlIiwgMikgfHwga2V5bWF0Y2goYXJnLCAiZ3JleXNjYWxlIiwyKSkgewotICAgICAgLyogRm9yY2UgYSBtb25vY2hyb21lIEpQRUcgZmlsZSB0byBiZSBnZW5lcmF0ZWQuICovCi0gICAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfR1JBWVNDQUxFKTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibWF4bWVtb3J5IiwgMykpIHsKLSAgICAgIC8qIE1heGltdW0gbWVtb3J5IGluIEtiIChvciBNYiB3aXRoICdtJykuICovCi0gICAgICBsb25nIGx2YWw7Ci0gICAgICBjaGFyIGNoID0gJ3gnOwotCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlbGQlYyIsICZsdmFsLCAmY2gpIDwgMSkKLQl1c2FnZSgpOwotICAgICAgaWYgKGNoID09ICdtJyB8fCBjaCA9PSAnTScpCi0JbHZhbCAqPSAxMDAwTDsKLSAgICAgIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlID0gbHZhbCAqIDEwMDBMOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvcHRpbWl6ZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgIm9wdGltaXNlIiwgMSkpIHsKLSAgICAgIC8qIEVuYWJsZSBlbnRyb3B5IHBhcm0gb3B0aW1pemF0aW9uLiAqLwotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICAgICAgY2luZm8tPm9wdGltaXplX2NvZGluZyA9IFRSVUU7Ci0jZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGVudHJvcHkgb3B0aW1pemF0aW9uIHdhcyBub3QgY29tcGlsZWRcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm91dGZpbGUiLCA0KSkgewotICAgICAgLyogU2V0IG91dHB1dCBmaWxlIG5hbWUuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbYXJnbl07CS8qIHNhdmUgaXQgYXdheSBmb3IgbGF0ZXIgdXNlICovCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInByb2dyZXNzaXZlIiwgMSkpIHsKLSAgICAgIC8qIFNlbGVjdCBzaW1wbGUgcHJvZ3Jlc3NpdmUgbW9kZS4gKi8KLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgICAgc2ltcGxlX3Byb2dyZXNzaXZlID0gVFJVRTsKLSAgICAgIC8qIFdlIG11c3QgcG9zdHBvbmUgZXhlY3V0aW9uIHVudGlsIG51bV9jb21wb25lbnRzIGlzIGtub3duLiAqLwotI2Vsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBwcm9ncmVzc2l2ZSBvdXRwdXQgd2FzIG5vdCBjb21waWxlZFxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicXVhbGl0eSIsIDEpKSB7Ci0gICAgICAvKiBRdWFsaXR5IGZhY3RvciAocXVhbnRpemF0aW9uIHRhYmxlIHNjYWxpbmcgZmFjdG9yKS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkIiwgJnF1YWxpdHkpICE9IDEpCi0JdXNhZ2UoKTsKLSAgICAgIC8qIENoYW5nZSBzY2FsZSBmYWN0b3IgaW4gY2FzZSAtcXRhYmxlcyBpcyBwcmVzZW50LiAqLwotICAgICAgcV9zY2FsZV9mYWN0b3IgPSBqcGVnX3F1YWxpdHlfc2NhbGluZyhxdWFsaXR5KTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicXNsb3RzIiwgMikpIHsKLSAgICAgIC8qIFF1YW50aXphdGlvbiB0YWJsZSBzbG90IG51bWJlcnMuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBxc2xvdHNhcmcgPSBhcmd2W2FyZ25dOwotICAgICAgLyogTXVzdCBkZWxheSBzZXR0aW5nIHFzbG90cyB1bnRpbCBhZnRlciB3ZSBoYXZlIHByb2Nlc3NlZCBhbnkKLSAgICAgICAqIGNvbG9yc3BhY2UtZGV0ZXJtaW5pbmcgc3dpdGNoZXMsIHNpbmNlIGpwZWdfc2V0X2NvbG9yc3BhY2Ugc2V0cwotICAgICAgICogZGVmYXVsdCBxdWFudCB0YWJsZSBudW1iZXJzLgotICAgICAgICovCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInF0YWJsZXMiLCAyKSkgewotICAgICAgLyogUXVhbnRpemF0aW9uIHRhYmxlcyBmZXRjaGVkIGZyb20gZmlsZS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIHF0YWJsZWZpbGUgPSBhcmd2W2FyZ25dOwotICAgICAgLyogV2UgcG9zdHBvbmUgYWN0dWFsbHkgcmVhZGluZyB0aGUgZmlsZSBpbiBjYXNlIC1xdWFsaXR5IGNvbWVzIGxhdGVyLiAqLwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJyZXN0YXJ0IiwgMSkpIHsKLSAgICAgIC8qIFJlc3RhcnQgaW50ZXJ2YWwgaW4gTUNVIHJvd3MgKG9yIGluIE1DVXMgd2l0aCAnYicpLiAqLwotICAgICAgbG9uZyBsdmFsOwotICAgICAgY2hhciBjaCA9ICd4JzsKLQotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChsdmFsIDwgMCB8fCBsdmFsID4gNjU1MzVMKQotCXVzYWdlKCk7Ci0gICAgICBpZiAoY2ggPT0gJ2InIHx8IGNoID09ICdCJykgewotCWNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gKHVuc2lnbmVkIGludCkgbHZhbDsKLQljaW5mby0+cmVzdGFydF9pbl9yb3dzID0gMDsgLyogZWxzZSBwcmlvciAnLXJlc3RhcnQgbicgb3ZlcnJpZGVzIG1lICovCi0gICAgICB9IGVsc2UgewotCWNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgPSAoaW50KSBsdmFsOwotCS8qIHJlc3RhcnRfaW50ZXJ2YWwgd2lsbCBiZSBjb21wdXRlZCBkdXJpbmcgc3RhcnR1cCAqLwotICAgICAgfQotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJzYW1wbGUiLCAyKSkgewotICAgICAgLyogU2V0IHNhbXBsaW5nIGZhY3RvcnMuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBzYW1wbGVhcmcgPSBhcmd2W2FyZ25dOwotICAgICAgLyogTXVzdCBkZWxheSBzZXR0aW5nIHNhbXBsZSBmYWN0b3JzIHVudGlsIGFmdGVyIHdlIGhhdmUgcHJvY2Vzc2VkIGFueQotICAgICAgICogY29sb3JzcGFjZS1kZXRlcm1pbmluZyBzd2l0Y2hlcywgc2luY2UganBlZ19zZXRfY29sb3JzcGFjZSBzZXRzCi0gICAgICAgKiBkZWZhdWx0IHNhbXBsaW5nIGZhY3RvcnMuCi0gICAgICAgKi8KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2NhbnMiLCAyKSkgewotICAgICAgLyogU2V0IHNjYW4gc2NyaXB0LiAqLwotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgc2NhbnNhcmcgPSBhcmd2W2FyZ25dOwotICAgICAgLyogV2UgbXVzdCBwb3N0cG9uZSByZWFkaW5nIHRoZSBmaWxlIGluIGNhc2UgLXByb2dyZXNzaXZlIGFwcGVhcnMuICovCi0jZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIG11bHRpLXNjYW4gb3V0cHV0IHdhcyBub3QgY29tcGlsZWRcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNtb290aCIsIDIpKSB7Ci0gICAgICAvKiBTZXQgaW5wdXQgc21vb3RoaW5nIGZhY3Rvci4gKi8KLSAgICAgIGludCB2YWw7Ci0KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkIiwgJnZhbCkgIT0gMSkKLQl1c2FnZSgpOwotICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gMTAwKQotCXVzYWdlKCk7Ci0gICAgICBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciA9IHZhbDsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAidGFyZ2EiLCAxKSkgewotICAgICAgLyogSW5wdXQgZmlsZSBpcyBUYXJnYSBmb3JtYXQuICovCi0gICAgICBpc190YXJnYSA9IFRSVUU7Ci0KLSAgICB9IGVsc2UgewotICAgICAgdXNhZ2UoKTsJCQkvKiBib2d1cyBzd2l0Y2ggKi8KLSAgICB9Ci0gIH0KLQotICAvKiBQb3N0LXN3aXRjaC1zY2FubmluZyBjbGVhbnVwICovCi0KLSAgaWYgKGZvcl9yZWFsKSB7Ci0KLSAgICAvKiBTZXQgcXVhbnRpemF0aW9uIHRhYmxlcyBmb3Igc2VsZWN0ZWQgcXVhbGl0eS4gKi8KLSAgICAvKiBTb21lIG9yIGFsbCBtYXkgYmUgb3ZlcnJpZGRlbiBpZiAtcXRhYmxlcyBpcyBwcmVzZW50LiAqLwotICAgIGpwZWdfc2V0X3F1YWxpdHkoY2luZm8sIHF1YWxpdHksIGZvcmNlX2Jhc2VsaW5lKTsKLQotICAgIGlmIChxdGFibGVmaWxlICE9IE5VTEwpCS8qIHByb2Nlc3MgLXF0YWJsZXMgaWYgaXQgd2FzIHByZXNlbnQgKi8KLSAgICAgIGlmICghIHJlYWRfcXVhbnRfdGFibGVzKGNpbmZvLCBxdGFibGVmaWxlLAotCQkJICAgICAgcV9zY2FsZV9mYWN0b3IsIGZvcmNlX2Jhc2VsaW5lKSkKLQl1c2FnZSgpOwotCi0gICAgaWYgKHFzbG90c2FyZyAhPSBOVUxMKQkvKiBwcm9jZXNzIC1xc2xvdHMgaWYgaXQgd2FzIHByZXNlbnQgKi8KLSAgICAgIGlmICghIHNldF9xdWFudF9zbG90cyhjaW5mbywgcXNsb3RzYXJnKSkKLQl1c2FnZSgpOwotCi0gICAgaWYgKHNhbXBsZWFyZyAhPSBOVUxMKQkvKiBwcm9jZXNzIC1zYW1wbGUgaWYgaXQgd2FzIHByZXNlbnQgKi8KLSAgICAgIGlmICghIHNldF9zYW1wbGVfZmFjdG9ycyhjaW5mbywgc2FtcGxlYXJnKSkKLQl1c2FnZSgpOwotCi0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICBpZiAoc2ltcGxlX3Byb2dyZXNzaXZlKQkvKiBwcm9jZXNzIC1wcm9ncmVzc2l2ZTsgLXNjYW5zIGNhbiBvdmVycmlkZSAqLwotICAgICAganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24oY2luZm8pOwotI2VuZGlmCi0KLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgICBpZiAoc2NhbnNhcmcgIT0gTlVMTCkJLyogcHJvY2VzcyAtc2NhbnMgaWYgaXQgd2FzIHByZXNlbnQgKi8KLSAgICAgIGlmICghIHJlYWRfc2Nhbl9zY3JpcHQoY2luZm8sIHNjYW5zYXJnKSkKLQl1c2FnZSgpOwotI2VuZGlmCi0gIH0KLQotICByZXR1cm4gYXJnbjsJCQkvKiByZXR1cm4gaW5kZXggb2YgbmV4dCBhcmcgKGZpbGUgbmFtZSkgKi8KLX0KLQotCi0vKgotICogVGhlIG1haW4gcHJvZ3JhbS4KLSAqLwotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOwotICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgcHJvZ3Jlc3M7Ci0jZW5kaWYKLSAgaW50IGZpbGVfaW5kZXg7Ci0gIGNqcGVnX3NvdXJjZV9wdHIgc3JjX21ncjsKLSAgRklMRSAqIGlucHV0X2ZpbGU7Ci0gIEZJTEUgKiBvdXRwdXRfZmlsZTsKLSAgSkRJTUVOU0lPTiBudW1fc2NhbmxpbmVzOwotCi0gIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCi0jaWZkZWYgVVNFX0NDT01NQU5ECi0gIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7Ci0jZW5kaWYKLQotICBwcm9nbmFtZSA9IGFyZ3ZbMF07Ci0gIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCi0gICAgcHJvZ25hbWUgPSAiY2pwZWciOwkJLyogaW4gY2FzZSBDIGxpYnJhcnkgZG9lc24ndCBwcm92aWRlIGl0ICovCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IGVycm9yIGhhbmRsaW5nLiAqLwotICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7Ci0gIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7Ci0gIC8qIEFkZCBzb21lIGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yIG1lc3NhZ2VzIChmcm9tIGNkZXJyb3IuaCkgKi8KLSAgamVyci5hZGRvbl9tZXNzYWdlX3RhYmxlID0gY2RqcGVnX21lc3NhZ2VfdGFibGU7Ci0gIGplcnIuZmlyc3RfYWRkb25fbWVzc2FnZSA9IEpNU0dfRklSU1RBRERPTkNPREU7Ci0gIGplcnIubGFzdF9hZGRvbl9tZXNzYWdlID0gSk1TR19MQVNUQURET05DT0RFOwotCi0gIC8qIE5vdyBzYWZlIHRvIGVuYWJsZSBzaWduYWwgY2F0Y2hlci4gKi8KLSNpZmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCi0gIGVuYWJsZV9zaWduYWxfY2F0Y2hlcigoal9jb21tb25fcHRyKSAmY2luZm8pOwotI2VuZGlmCi0KLSAgLyogSW5pdGlhbGl6ZSBKUEVHIHBhcmFtZXRlcnMuCi0gICAqIE11Y2ggb2YgdGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBsYXRlci4KLSAgICogSW4gcGFydGljdWxhciwgd2UgZG9uJ3QgeWV0IGtub3cgdGhlIGlucHV0IGZpbGUncyBjb2xvciBzcGFjZSwKLSAgICogYnV0IHdlIG5lZWQgdG8gcHJvdmlkZSBzb21lIHZhbHVlIGZvciBqcGVnX3NldF9kZWZhdWx0cygpIHRvIHdvcmsuCi0gICAqLwotCi0gIGNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsgLyogYXJiaXRyYXJ5IGd1ZXNzICovCi0gIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7Ci0KLSAgLyogU2NhbiBjb21tYW5kIGxpbmUgdG8gZmluZCBmaWxlIG5hbWVzLgotICAgKiBJdCBpcyBjb252ZW5pZW50IHRvIHVzZSBqdXN0IG9uZSBzd2l0Y2gtcGFyc2luZyByb3V0aW5lLCBidXQgdGhlIHN3aXRjaAotICAgKiB2YWx1ZXMgcmVhZCBoZXJlIGFyZSBpZ25vcmVkOyB3ZSB3aWxsIHJlc2NhbiB0aGUgc3dpdGNoZXMgYWZ0ZXIgb3BlbmluZwotICAgKiB0aGUgaW5wdXQgZmlsZS4KLSAgICovCi0KLSAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgMCwgRkFMU0UpOwotCi0jaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSAgLyogTXVzdCBoYXZlIGVpdGhlciAtb3V0ZmlsZSBzd2l0Y2ggb3IgZXhwbGljaXQgb3V0cHV0IGZpbGUgbmFtZSAqLwotICBpZiAob3V0ZmlsZW5hbWUgPT0gTlVMTCkgewotICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMikgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotICAgIG91dGZpbGVuYW1lID0gYXJndltmaWxlX2luZGV4KzFdOwotICB9IGVsc2UgewotICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotICB9Ci0jZWxzZQotICAvKiBVbml4IHN0eWxlOiBleHBlY3QgemVybyBvciBvbmUgZmlsZSBuYW1lICovCi0gIGlmIChmaWxlX2luZGV4IDwgYXJnYy0xKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlczogb25seSBvbmUgaW5wdXQgZmlsZVxuIiwgcHJvZ25hbWUpOwotICAgIHVzYWdlKCk7Ci0gIH0KLSNlbmRpZiAvKiBUV09fRklMRV9DT01NQU5ETElORSAqLwotCi0gIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCi0gIGlmIChmaWxlX2luZGV4IDwgYXJnYykgewotICAgIGlmICgoaW5wdXRfZmlsZSA9IGZvcGVuKGFyZ3ZbZmlsZV9pbmRleF0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbZmlsZV9pbmRleF0pOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KLSAgICBpbnB1dF9maWxlID0gcmVhZF9zdGRpbigpOwotICB9Ci0KLSAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICovCi0gIGlmIChvdXRmaWxlbmFtZSAhPSBOVUxMKSB7Ci0gICAgaWYgKChvdXRwdXRfZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgb3V0ZmlsZW5hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIHN0ZG91dCAqLwotICAgIG91dHB1dF9maWxlID0gd3JpdGVfc3Rkb3V0KCk7Ci0gIH0KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBzdGFydF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbywgJnByb2dyZXNzKTsKLSNlbmRpZgotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGlucHV0IGZpbGUgZm9ybWF0LCBhbmQgc2V0IHVwIHRvIHJlYWQgaXQuICovCi0gIHNyY19tZ3IgPSBzZWxlY3RfZmlsZV90eXBlKCZjaW5mbywgaW5wdXRfZmlsZSk7Ci0gIHNyY19tZ3ItPmlucHV0X2ZpbGUgPSBpbnB1dF9maWxlOwotCi0gIC8qIFJlYWQgdGhlIGlucHV0IGZpbGUgaGVhZGVyIHRvIG9idGFpbiBmaWxlIHNpemUgJiBjb2xvcnNwYWNlLiAqLwotICAoKnNyY19tZ3ItPnN0YXJ0X2lucHV0KSAoJmNpbmZvLCBzcmNfbWdyKTsKLQotICAvKiBOb3cgdGhhdCB3ZSBrbm93IGlucHV0IGNvbG9yc3BhY2UsIGZpeCBjb2xvcnNwYWNlLWRlcGVuZGVudCBkZWZhdWx0cyAqLwotICBqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSgmY2luZm8pOwotCi0gIC8qIEFkanVzdCBkZWZhdWx0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYnkgcmUtcGFyc2luZyB0aGUgb3B0aW9ucyAqLwotICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmNpbmZvLCBhcmdjLCBhcmd2LCAwLCBUUlVFKTsKLQotICAvKiBTcGVjaWZ5IGRhdGEgZGVzdGluYXRpb24gZm9yIGNvbXByZXNzaW9uICovCi0gIGpwZWdfc3RkaW9fZGVzdCgmY2luZm8sIG91dHB1dF9maWxlKTsKLQotICAvKiBTdGFydCBjb21wcmVzc29yICovCi0gIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKLQotICAvKiBQcm9jZXNzIGRhdGEgKi8KLSAgd2hpbGUgKGNpbmZvLm5leHRfc2NhbmxpbmUgPCBjaW5mby5pbWFnZV9oZWlnaHQpIHsKLSAgICBudW1fc2NhbmxpbmVzID0gKCpzcmNfbWdyLT5nZXRfcGl4ZWxfcm93cykgKCZjaW5mbywgc3JjX21ncik7Ci0gICAgKHZvaWQpIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjaW5mbywgc3JjX21nci0+YnVmZmVyLCBudW1fc2NhbmxpbmVzKTsKLSAgfQotCi0gIC8qIEZpbmlzaCBjb21wcmVzc2lvbiBhbmQgcmVsZWFzZSBtZW1vcnkgKi8KLSAgKCpzcmNfbWdyLT5maW5pc2hfaW5wdXQpICgmY2luZm8sIHNyY19tZ3IpOwotICBqcGVnX2ZpbmlzaF9jb21wcmVzcygmY2luZm8pOwotICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmNpbmZvKTsKLQotICAvKiBDbG9zZSBmaWxlcywgaWYgd2Ugb3BlbmVkIHRoZW0gKi8KLSAgaWYgKGlucHV0X2ZpbGUgIT0gc3RkaW4pCi0gICAgZmNsb3NlKGlucHV0X2ZpbGUpOwotICBpZiAob3V0cHV0X2ZpbGUgIT0gc3Rkb3V0KQotICAgIGZjbG9zZShvdXRwdXRfZmlsZSk7Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgZW5kX3Byb2dyZXNzX21vbml0b3IoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKLSNlbmRpZgotCi0gIC8qIEFsbCBkb25lLiAqLwotICBleGl0KGplcnIubnVtX3dhcm5pbmdzID8gRVhJVF9XQVJOSU5HIDogRVhJVF9TVUNDRVNTKTsKLSAgcmV0dXJuIDA7CQkJLyogc3VwcHJlc3Mgbm8tcmV0dXJuLXZhbHVlIHdhcm5pbmdzICovCi19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9ja2NvbmZpZy5jIGIvbGlianBlZ3R3cnAvY2tjb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiYWY3OS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9ja2NvbmZpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qCi0gKiBja2NvbmZpZy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGludGVuZGVkIHRvIGhlbHAgeW91IGRldGVybWluZSBob3cgdG8gY29uZmlndXJlIHRoZSBKUEVHCi0gKiBzb2Z0d2FyZSBmb3IgaW5zdGFsbGF0aW9uIG9uIGEgcGFydGljdWxhciBzeXN0ZW0uICBUaGUgaWRlYSBpcyB0byB0cnkgdG8KLSAqIGNvbXBpbGUgYW5kIGV4ZWN1dGUgdGhpcyBwcm9ncmFtLiAgSWYgeW91ciBjb21waWxlciBmYWlscyB0byBjb21waWxlIHRoZQotICogcHJvZ3JhbSwgbWFrZSBjaGFuZ2VzIGFzIGluZGljYXRlZCBpbiB0aGUgY29tbWVudHMgYmVsb3cuICBPbmNlIHlvdSBjYW4KLSAqIGNvbXBpbGUgdGhlIHByb2dyYW0sIHJ1biBpdCwgYW5kIGl0IHdpbGwgcHJvZHVjZSBhICJqY29uZmlnLmgiIGZpbGUgZm9yCi0gKiB5b3VyIHN5c3RlbS4KLSAqCi0gKiBBcyBhIGdlbmVyYWwgcnVsZSwgZWFjaCB0aW1lIHlvdSB0cnkgdG8gY29tcGlsZSB0aGlzIHByb2dyYW0sCi0gKiBwYXkgYXR0ZW50aW9uIG9ubHkgdG8gdGhlICpmaXJzdCogZXJyb3IgbWVzc2FnZSB5b3UgZ2V0IGZyb20gdGhlIGNvbXBpbGVyLgotICogTWFueSBDIGNvbXBpbGVycyB3aWxsIGlzc3VlIGxvdHMgb2Ygc3B1cmlvdXMgZXJyb3IgbWVzc2FnZXMgb25jZSB0aGV5Ci0gKiBoYXZlIGdvdHRlbiBjb25mdXNlZC4gIEdvIHRvIHRoZSBsaW5lIGluZGljYXRlZCBpbiB0aGUgZmlyc3QgZXJyb3IgbWVzc2FnZSwKLSAqIGFuZCByZWFkIHRoZSBjb21tZW50cyBwcmVjZWRpbmcgdGhhdCBsaW5lIHRvIHNlZSB3aGF0IHRvIGNoYW5nZS4KLSAqCi0gKiBBbG1vc3QgYWxsIG9mIHRoZSBlZGl0cyB5b3UgbWF5IG5lZWQgdG8gbWFrZSB0byB0aGlzIHByb2dyYW0gY29uc2lzdCBvZgotICogY2hhbmdpbmcgYSBsaW5lIHRoYXQgcmVhZHMgIiNkZWZpbmUgU09NRV9TWU1CT0wiIHRvICIjdW5kZWYgU09NRV9TWU1CT0wiLAotICogb3IgdmljZSB2ZXJzYS4gIFRoaXMgaXMgY2FsbGVkIGRlZmluaW5nIG9yIHVuZGVmaW5pbmcgdGhhdCBzeW1ib2wuCi0gKi8KLQotCi0vKiBGaXJzdCB3ZSBtdXN0IHNlZSBpZiB5b3VyIHN5c3RlbSBoYXMgdGhlIGluY2x1ZGUgZmlsZXMgd2UgbmVlZC4KLSAqIFdlIHN0YXJ0IG91dCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgeW91ciBzeXN0ZW0gaGFzIGFsbCB0aGUgQU5TSS1zdGFuZGFyZAotICogaW5jbHVkZSBmaWxlcy4gIElmIHlvdSBnZXQgYW55IGVycm9yIHRyeWluZyB0byBpbmNsdWRlIG9uZSBvZiB0aGVzZSBmaWxlcywKLSAqIHVuZGVmaW5lIHRoZSBjb3JyZXNwb25kaW5nIEhBVkVfeHh4IHN5bWJvbC4KLSAqLwotCi0jZGVmaW5lIEhBVkVfU1REREVGX0gJCS8qIHJlcGxhY2UgJ2RlZmluZScgYnkgJ3VuZGVmJyBpZiBlcnJvciBoZXJlICovCi0jaWZkZWYgSEFWRV9TVERERUZfSAkJLyogbmV4dCBsaW5lIHdpbGwgYmUgc2tpcHBlZCBpZiB5b3UgdW5kZWYuLi4gKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEhBVkVfU1RETElCX0gJCS8qIHNhbWUgdGhpbmcgZm9yIHN0ZGxpYi5oICovCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgkJLyogSWYgeW91IGFpbid0IGdvdCB0aGlzLCB5b3UgYWluJ3QgZ290IEMuICovCi0KLS8qIFdlIGhhdmUgdG8gc2VlIGlmIHlvdXIgc3RyaW5nIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBieQotICogc3RyaW5ncy5oIChvbGQgQlNEIGNvbnZlbnRpb24pIG9yIHN0cmluZy5oIChldmVyeWJvZHkgZWxzZSkuCi0gKiBXZSB0cnkgdGhlIG5vbi1CU0QgY29udmVudGlvbiBmaXJzdDsgZGVmaW5lIE5FRURfQlNEX1NUUklOR1MKLSAqIGlmIHRoZSBjb21waWxlciBzYXlzIGl0IGNhbid0IGZpbmQgc3RyaW5nLmguCi0gKi8KLQotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLQotI2lmZGVmIE5FRURfQlNEX1NUUklOR1MKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0KLS8qIE9uIHNvbWUgc3lzdGVtcyAoZXNwZWNpYWxseSBvbGRlciBVbml4IG1hY2hpbmVzKSwgdHlwZSBzaXplX3QgaXMKLSAqIGRlZmluZWQgb25seSBpbiB0aGUgaW5jbHVkZSBmaWxlIDxzeXMvdHlwZXMuaD4uICBJZiB5b3UgZ2V0IGEgZmFpbHVyZQotICogb24gdGhlIHNpemVfdCB0ZXN0IGJlbG93LCB0cnkgZGVmaW5pbmcgTkVFRF9TWVNfVFlQRVNfSC4KLSAqLwotCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAkJLyogc3RhcnQgYnkgYXNzdW1pbmcgd2UgZG9uJ3QgbmVlZCBpdCAqLwotI2lmZGVmIE5FRURfU1lTX1RZUEVTX0gKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotCi0KLS8qIFVzdWFsbHkgdHlwZSBzaXplX3QgaXMgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGluY2x1ZGUgZmlsZXMgd2UndmUgaW5jbHVkZWQKLSAqIGFib3ZlLiAgSWYgbm90LCB5b3UnbGwgZ2V0IGFuIGVycm9yIG9uIHRoZSAidHlwZWRlZiBzaXplX3QgbXlfc2l6ZV90OyIgbGluZS4KLSAqIEluIHRoYXQgY2FzZSwgZmlyc3QgdHJ5IGRlZmluaW5nIE5FRURfU1lTX1RZUEVTX0gganVzdCBhYm92ZS4KLSAqIElmIHRoYXQgZG9lc24ndCB3b3JrLCB5b3UnbGwgaGF2ZSB0byBzZWFyY2ggdGhyb3VnaCB5b3VyIHN5c3RlbSBsaWJyYXJ5Ci0gKiB0byBmaWd1cmUgb3V0IHdoaWNoIGluY2x1ZGUgZmlsZSBkZWZpbmVzICJzaXplX3QiLiAgTG9vayBmb3IgYSBsaW5lIHRoYXQKLSAqIHNheXMgInR5cGVkZWYgc29tZXRoaW5nLW9yLW90aGVyIHNpemVfdDsiLiAgVGhlbiwgY2hhbmdlIHRoZSBsaW5lIGJlbG93Ci0gKiB0aGF0IHNheXMgIiNpbmNsdWRlIDxzb21laW5jbHVkZWZpbGUuaD4iIHRvIGluc3RlYWQgaW5jbHVkZSB0aGUgZmlsZQotICogeW91IGZvdW5kIHNpemVfdCBpbiwgYW5kIGRlZmluZSBORUVEX1NQRUNJQUxfSU5DTFVERS4gIElmIHlvdSBjYW4ndCBmaW5kCi0gKiB0eXBlIHNpemVfdCBhbnl3aGVyZSwgdHJ5IHJlcGxhY2luZyAiI2luY2x1ZGUgPHNvbWVpbmNsdWRlZmlsZS5oPiIgd2l0aAotICogInR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsiLgotICovCi0KLSN1bmRlZiBORUVEX1NQRUNJQUxfSU5DTFVERQkvKiBhc3N1bWUgd2UgRE9OJ1QgbmVlZCBpdCwgZm9yIHN0YXJ0ZXJzICovCi0KLSNpZmRlZiBORUVEX1NQRUNJQUxfSU5DTFVERQotI2luY2x1ZGUgPHNvbWVpbmNsdWRlZmlsZS5oPgotI2VuZGlmCi0KLXR5cGVkZWYgc2l6ZV90IG15X3NpemVfdDsJLyogVGhlIHBheW9mZjogZG8gd2UgaGF2ZSBzaXplX3Qgbm93PyAqLwotCi0KLS8qIFRoZSBuZXh0IHF1ZXN0aW9uIGlzIHdoZXRoZXIgeW91ciBjb21waWxlciBzdXBwb3J0cyBBTlNJLXN0eWxlIGZ1bmN0aW9uCi0gKiBwcm90b3R5cGVzLiAgWW91IG5lZWQgdG8ga25vdyB0aGlzIGluIG9yZGVyIHRvIGNob29zZSBiZXR3ZWVuIHVzaW5nCi0gKiBtYWtlZmlsZS5hbnNpIGFuZCB1c2luZyBtYWtlZmlsZS51bml4LgotICogVGhlICNkZWZpbmUgbGluZSBiZWxvdyBpcyBzZXQgdG8gYXNzdW1lIHlvdSBoYXZlIEFOU0kgZnVuY3Rpb24gcHJvdG90eXBlcy4KLSAqIElmIHlvdSBnZXQgYW4gZXJyb3IgaW4gdGhpcyBncm91cCBvZiBsaW5lcywgdW5kZWZpbmUgSEFWRV9QUk9UT1RZUEVTLgotICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLWludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKTsgLyogY2hlY2sgcHJvdG90eXBlcyAqLwotCi1zdHJ1Y3QgbWV0aG9kc19zdHJ1Y3QgewkJLyogY2hlY2sgbWV0aG9kLXBvaW50ZXIgZGVjbGFyYXRpb25zICovCi0gIGludCAoKmVycm9yX2V4aXQpIChjaGFyICptc2d0ZXh0KTsKLSAgaW50ICgqdHJhY2VfbWVzc2FnZSkgKGNoYXIgKm1zZ3RleHQpOwotICBpbnQgKCphbm90aGVyX21ldGhvZCkgKHZvaWQpOwotfTsKLQotaW50IHRlc3RmdW5jdGlvbiAoaW50IGFyZzEsIGludCAqIGFyZzIpIC8qIGNoZWNrIGRlZmluaXRpb25zICovCi17Ci0gIHJldHVybiBhcmcyW2FyZzFdOwotfQotCi1pbnQgdGVzdDJmdW5jdGlvbiAodm9pZCkJLyogY2hlY2sgdm9pZCBhcmcgbGlzdCAqLwotewotICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0KLS8qIE5vdyB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHlvdXIgY29tcGlsZXIga25vd3Mgd2hhdCAidW5zaWduZWQgY2hhciIgbWVhbnMuCi0gKiBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSAidW5zaWduZWQgY2hhciB1bl9jaGFyOyIgbGluZSwKLSAqIHRoZW4gdW5kZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSLgotICovCi0KLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0KLSNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKLXVuc2lnbmVkIGNoYXIgdW5fY2hhcjsKLSNlbmRpZgotCi0KLS8qIE5vdyB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHlvdXIgY29tcGlsZXIga25vd3Mgd2hhdCAidW5zaWduZWQgc2hvcnQiIG1lYW5zLgotICogSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgInVuc2lnbmVkIHNob3J0IHVuX3Nob3J0OyIgbGluZSwKLSAqIHRoZW4gdW5kZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVC4KLSAqLwotCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLQotI2lmZGVmIEhBVkVfVU5TSUdORURfU0hPUlQKLXVuc2lnbmVkIHNob3J0IHVuX3Nob3J0OwotI2VuZGlmCi0KLQotLyogTm93IHdlIHdhbnQgdG8gZmluZCBvdXQgaWYgeW91ciBjb21waWxlciB1bmRlcnN0YW5kcyB0eXBlICJ2b2lkIi4KLSAqIElmIHlvdSBnZXQgYW4gZXJyb3IgYW55d2hlcmUgaW4gaGVyZSwgdW5kZWZpbmUgSEFWRV9WT0lELgotICovCi0KLSNkZWZpbmUgSEFWRV9WT0lECi0KLSNpZmRlZiBIQVZFX1ZPSUQKLS8qIENhdXRpb246IGEgQysrIGNvbXBpbGVyIHdpbGwgaW5zaXN0IG9uIGNvbXBsZXRlIHByb3RvdHlwZXMgKi8KLXR5cGVkZWYgdm9pZCAqIHZvaWRfcHRyOwkvKiBjaGVjayB2b2lkICogKi8KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHB0ciB0byBmdW5jdGlvbiByZXR1cm5pbmcgdm9pZCAqLwotdHlwZWRlZiB2b2lkICgqdm9pZF9mdW5jKSAoaW50IGEsIGludCBiKTsKLSNlbHNlCi10eXBlZGVmIHZvaWQgKCp2b2lkX2Z1bmMpICgpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHZvaWQgZnVuY3Rpb24gcmVzdWx0ICovCi12b2lkIHRlc3QzZnVuY3Rpb24gKHZvaWRfcHRyIGFyZzEsIHZvaWRfZnVuYyBhcmcyKQotI2Vsc2UKLXZvaWQgdGVzdDNmdW5jdGlvbiAoYXJnMSwgYXJnMikKLSAgICAgdm9pZF9wdHIgYXJnMTsKLSAgICAgdm9pZF9mdW5jIGFyZzI7Ci0jZW5kaWYKLXsKLSAgY2hhciAqIGxvY3B0ciA9IChjaGFyICopIGFyZzE7IC8qIGNoZWNrIGNhc3RpbmcgdG8gYW5kIGZyb20gdm9pZCAqICovCi0gIGFyZzEgPSAodm9pZCAqKSBsb2NwdHI7Ci0gICgqYXJnMikgKDEsIDIpOwkJLyogY2hlY2sgY2FsbCBvZiBmY24gcmV0dXJuaW5nIHZvaWQgKi8KLX0KLSNlbmRpZgotCi0KLS8qIE5vdyB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHlvdXIgY29tcGlsZXIga25vd3Mgd2hhdCAiY29uc3QiIG1lYW5zLgotICogSWYgeW91IGdldCBhbiBlcnJvciBoZXJlLCB1bmRlZmluZSBIQVZFX0NPTlNULgotICovCi0KLSNkZWZpbmUgSEFWRV9DT05TVAotCi0jaWZkZWYgSEFWRV9DT05TVAotc3RhdGljIGNvbnN0IGludCBjYXJyYXlbM10gPSB7MSwgMiwgM307Ci0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLWludCB0ZXN0NGZ1bmN0aW9uIChjb25zdCBpbnQgYXJnMSkKLSNlbHNlCi1pbnQgdGVzdDRmdW5jdGlvbiAoYXJnMSkKLSAgICAgY29uc3QgaW50IGFyZzE7Ci0jZW5kaWYKLXsKLSAgcmV0dXJuIGNhcnJheVthcmcxXTsKLX0KLSNlbmRpZgotCi0KLS8qIElmIHlvdSBnZXQgYW4gZXJyb3Igb3Igd2FybmluZyBhYm91dCB0aGlzIHN0cnVjdHVyZSBkZWZpbml0aW9uLAotICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLgotICovCi0KLSN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotCi0jaWZuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi10eXBlZGVmIHN0cnVjdCB1bmRlZmluZWRfc3RydWN0dXJlICogdW5kZWZfc3RydWN0X3B0cjsKLSNlbmRpZgotCi0KLS8qIElmIHlvdSBnZXQgYW4gZXJyb3IgYWJvdXQgZHVwbGljYXRlIG5hbWVzLAotICogZGVmaW5lIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMuCi0gKi8KLQotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLQotI2lmbmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0KLWludCBwb3NzaWJseV9kdXBsaWNhdGVfZnVuY3Rpb24gKCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBwb3NzaWJseV9kdXBsaV9mdW5jdGlvbiAoKQotewotICByZXR1cm4gMTsKLX0KLQotI2VuZGlmCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgT0ssIHRoYXQncyBpdC4gIFlvdSBzaG91bGQgbm90IGhhdmUgdG8gY2hhbmdlIGFueXRoaW5nIGJleW9uZCB0aGlzCi0gKiAgcG9pbnQgaW4gb3JkZXIgdG8gY29tcGlsZSBhbmQgZXhlY3V0ZSB0aGlzIHByb2dyYW0uICAoWW91IG1pZ2h0IGdldAotICogIHNvbWUgd2FybmluZ3MsIGJ1dCB5b3UgY2FuIGlnbm9yZSB0aGVtLikKLSAqICBXaGVuIHlvdSBydW4gdGhlIHByb2dyYW0sIGl0IHdpbGwgbWFrZSBhIGNvdXBsZSBtb3JlIHRlc3RzIHRoYXQgaXQKLSAqICBjYW4gZG8gYXV0b21hdGljYWxseSwgYW5kIHRoZW4gaXQgd2lsbCBjcmVhdGUgamNvbmZpZy5oIGFuZCBwcmludCBvdXQKLSAqICBhbnkgYWRkaXRpb25hbCBzdWdnZXN0aW9ucyBpdCBoYXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi1pbnQgaXNfY2hhcl9zaWduZWQgKGludCBhcmcpCi0jZWxzZQotaW50IGlzX2NoYXJfc2lnbmVkIChhcmcpCi0gICAgIGludCBhcmc7Ci0jZW5kaWYKLXsKLSAgaWYgKGFyZyA9PSAxODkpIHsJCS8qIGV4cGVjdGVkIHJlc3VsdCBmb3IgdW5zaWduZWQgY2hhciAqLwotICAgIHJldHVybiAwOwkJCS8qIHR5cGUgY2hhciBpcyB1bnNpZ25lZCAqLwotICB9Ci0gIGVsc2UgaWYgKGFyZyAhPSAtNjcpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgY2hhciAqLwotICAgIHByaW50ZigiSG1tLCBpdCBzZWVtcyAnY2hhcicgaXMgbm90IGVpZ2h0IGJpdHMgd2lkZSBvbiB5b3VyIG1hY2hpbmUuXG4iKTsKLSAgICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7Ci0gIH0KLSAgcmV0dXJuIDE7CQkJLyogYXNzdW1lIGNoYXIgaXMgc2lnbmVkIG90aGVyd2lzZSAqLwotfQotCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLWludCBpc19zaGlmdGluZ19zaWduZWQgKGxvbmcgYXJnKQotI2Vsc2UKLWludCBpc19zaGlmdGluZ19zaWduZWQgKGFyZykKLSAgICAgbG9uZyBhcmc7Ci0jZW5kaWYKLS8qIFNlZSB3aGV0aGVyIHJpZ2h0LXNoaWZ0IG9uIGEgbG9uZyBpcyBzaWduZWQgb3Igbm90LiAqLwotewotICBsb25nIHJlcyA9IGFyZyA+PiA0OwotCi0gIGlmIChyZXMgPT0gLTB4N0Y3RTgwQ0wpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgc2hpZnQgKi8KLSAgICByZXR1cm4gMTsJCQkvKiByaWdodCBzaGlmdCBpcyBzaWduZWQgKi8KLSAgfQotICAvKiBzZWUgaWYgdW5zaWduZWQtc2hpZnQgaGFjayB3aWxsIGZpeCBpdC4gKi8KLSAgLyogd2UgY2FuJ3QganVzdCB0ZXN0IGV4YWN0IHZhbHVlIHNpbmNlIGl0IGRlcGVuZHMgb24gd2lkdGggb2YgbG9uZy4uLiAqLwotICByZXMgfD0gKH4wTCkgPDwgKDMyLTQpOwotICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBub3c/ICovCi0gICAgcmV0dXJuIDA7CQkJLyogcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgKi8KLSAgfQotICBwcmludGYoIlJpZ2h0IHNoaWZ0IGlzbid0IGFjdGluZyBhcyBJIGV4cGVjdCBpdCB0by5cbiIpOwotICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7Ci0gIHJldHVybiAwOwkJCS8qIHRyeSBpdCB3aXRoIHVuc2lnbmVkIGFueXdheSAqLwotfQotCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLWludCBtYWluIChpbnQgYXJnYywgY2hhciAqKiBhcmd2KQotI2Vsc2UKLWludCBtYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKiBhcmd2OwotI2VuZGlmCi17Ci0gIGNoYXIgc2lnbmVkX2NoYXJfY2hlY2sgPSAoY2hhcikgKC02Nyk7Ci0gIEZJTEUgKm91dGZpbGU7Ci0KLSAgLyogQXR0ZW1wdCB0byB3cml0ZSBqY29uZmlnLmggKi8KLSAgaWYgKChvdXRmaWxlID0gZm9wZW4oImpjb25maWcuaCIsICJ3IikpID09IE5VTEwpIHsKLSAgICBwcmludGYoIkZhaWxlZCB0byB3cml0ZSBqY29uZmlnLmhcbiIpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLyogV3JpdGUgb3V0IGFsbCB0aGUgaW5mbyAqLwotICBmcHJpbnRmKG91dGZpbGUsICIvKiBqY29uZmlnLmggLS0tIGdlbmVyYXRlZCBieSBja2NvbmZpZy5jICovXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi9cblxuIik7Ci0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTXG4iKTsKLSNlbHNlCi0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1BST1RPVFlQRVNcbiIpOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSXG4iKTsKLSNlbHNlCi0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1VOU0lHTkVEX0NIQVJcbiIpOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTlNJR05FRF9TSE9SVAotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlRcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEhBVkVfVU5TSUdORURfU0hPUlRcbiIpOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9WT0lECi0gIGZwcmludGYob3V0ZmlsZSwgIi8qICNkZWZpbmUgdm9pZCBjaGFyICovXG4iKTsKLSNlbHNlCi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgdm9pZCBjaGFyXG4iKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfQ09OU1QKLSAgZnByaW50ZihvdXRmaWxlLCAiLyogI2RlZmluZSBjb25zdCAqL1xuIik7Ci0jZWxzZQotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIGNvbnN0XG4iKTsKLSNlbmRpZgotICBpZiAoaXNfY2hhcl9zaWduZWQoKGludCkgc2lnbmVkX2NoYXJfY2hlY2spKQotICAgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBDSEFSX0lTX1VOU0lHTkVEXG4iKTsKLSAgZWxzZQotICAgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgQ0hBUl9JU19VTlNJR05FRFxuIik7Ci0jaWZkZWYgSEFWRV9TVERERUZfSAotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfU1REREVGX0hcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEhBVkVfU1REREVGX0hcbiIpOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfU1RETElCX0hcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEhBVkVfU1RETElCX0hcbiIpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9CU0RfU1RSSU5HUwotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIE5FRURfQlNEX1NUUklOR1NcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfQlNEX1NUUklOR1NcbiIpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9TWVNfVFlQRVNfSAotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIE5FRURfU1lTX1RZUEVTX0hcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfU1lTX1RZUEVTX0hcbiIpOwotI2VuZGlmCi0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSU1xuIik7Ci0jaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVNcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVNcbiIpOwotI2VuZGlmCi0jaWZkZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTlxuIik7Ci0jZWxzZQotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU5cbiIpOwotI2VuZGlmCi0gIGZwcmludGYob3V0ZmlsZSwgIlxuI2lmZGVmIEpQRUdfSU5URVJOQUxTXG5cbiIpOwotICBpZiAoaXNfc2hpZnRpbmdfc2lnbmVkKC0weDdGN0U4MEIxTCkpCi0gICAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVEXG4iKTsKLSAgZWxzZQotICAgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgUklHSFRfU0hJRlRfSVNfVU5TSUdORURcbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICJcbiNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqL1xuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIlxuI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUdcblxuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi9cbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIFlvdSBtYXkgbmVlZCB0aGlzIG9uIG5vbi1Vbml4IHN5c3RlbXMgKi9cbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1uYW1lLmMgKi9cbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgRE9OVF9VU0VfQl9NT0RFXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiLyogI2RlZmluZSBQUk9HUkVTU19SRVBPUlQgKi8JLyogb3B0aW9uYWwgKi9cbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICJcbiNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovXG4iKTsKLQotICAvKiBDbG9zZSB0aGUgamNvbmZpZy5oIGZpbGUgKi8KLSAgZmNsb3NlKG91dGZpbGUpOwotCi0gIC8qIFVzZXIgcmVwb3J0ICovCi0gIHByaW50ZigiQ29uZmlndXJhdGlvbiBjaGVjayBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlIGRvbmUuXG4iKTsKLSAgcHJpbnRmKCJcbkkgaGF2ZSB3cml0dGVuIHRoZSBqY29uZmlnLmggZmlsZSBmb3IgeW91LlxuXG4iKTsKLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLSAgcHJpbnRmKCJZb3Ugc2hvdWxkIHVzZSBtYWtlZmlsZS5hbnNpIGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgeW91ciBNYWtlZmlsZS5cbiIpOwotI2Vsc2UKLSAgcHJpbnRmKCJZb3Ugc2hvdWxkIHVzZSBtYWtlZmlsZS51bml4IGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgeW91ciBNYWtlZmlsZS5cbiIpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX1NQRUNJQUxfSU5DTFVERQotICBwcmludGYoIlxuWW91J2xsIG5lZWQgdG8gY2hhbmdlIGpjb25maWcuaCB0byBpbmNsdWRlIHRoZSBzeXN0ZW0gaW5jbHVkZSBmaWxlXG4iKTsKLSAgcHJpbnRmKCJ0aGF0IHlvdSBmb3VuZCB0eXBlIHNpemVfdCBpbiwgb3IgYWRkIGEgZGlyZWN0IGRlZmluaXRpb24gb2YgdHlwZVxuIik7Ci0gIHByaW50Zigic2l6ZV90IGlmIHRoYXQncyB3aGF0IHlvdSB1c2VkLiAgSnVzdCBhZGQgaXQgdG8gdGhlIGVuZC5cbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9jb2RlcnVsZXMuZG9jIGIvbGlianBlZ3R3cnAvY29kZXJ1bGVzLmRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiNWQ5Yi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9jb2RlcnVsZXMuZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLUlKRyBKUEVHIExJQlJBUlk6ICBDT0RJTkcgUlVMRVMKLQotQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLUZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLQotCi1TaW5jZSBudW1lcm91cyBwZW9wbGUgd2lsbCBiZSBjb250cmlidXRpbmcgY29kZSBhbmQgYnVnIGZpeGVzLCBpdCdzIGltcG9ydGFudAotdG8gZXN0YWJsaXNoIGEgY29tbW9uIGNvZGluZyBzdHlsZS4gIFRoZSBnb2FsIG9mIHVzaW5nIHNpbWlsYXIgY29kaW5nIHN0eWxlcwotaXMgbXVjaCBtb3JlIGltcG9ydGFudCB0aGFuIHRoZSBkZXRhaWxzIG9mIGp1c3Qgd2hhdCB0aGF0IHN0eWxlIGlzLgotCi1JbiBnZW5lcmFsIHdlIGZvbGxvdyB0aGUgcmVjb21tZW5kYXRpb25zIG9mICJSZWNvbW1lbmRlZCBDIFN0eWxlIGFuZCBDb2RpbmcKLVN0YW5kYXJkcyIgcmV2aXNpb24gNi4xIChDYW5ub24gZXQgYWwuIGFzIG1vZGlmaWVkIGJ5IFNwZW5jZXIsIEtlcHBlbCBhbmQKLUJyYWRlcikuICBUaGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBpbiB0aGUgSUpHIEZUUCBhcmNoaXZlIChzZWUKLWpwZWcvZG9jL2NzdHlsZS5tcy50YmwuWiwgb3IgY3N0eWxlLnR4dC5aIGZvciB0aG9zZSB3aXRob3V0IG5yb2ZmL3RibCkuCi0KLUJsb2NrIGNvbW1lbnRzIHNob3VsZCBiZSBsYWlkIG91dCB0aHVzbHk6Ci0KLS8qCi0gKiAgQmxvY2sgY29tbWVudHMgaW4gdGhpcyBzdHlsZS4KLSAqLwotCi1XZSBpbmRlbnQgc3RhdGVtZW50cyBpbiBLJlIgc3R5bGUsIGUuZy4sCi0JaWYgKHRlc3QpIHsKLQkgIHRoZW4tcGFydDsKLQl9IGVsc2UgewotCSAgZWxzZS1wYXJ0OwotCX0KLXdpdGggdHdvIHNwYWNlcyBwZXIgaW5kZW50YXRpb24gbGV2ZWwuICAoVGhpcyBpbmRlbnRhdGlvbiBjb252ZW50aW9uIGlzCi1oYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgR05VIEVtYWNzIGFuZCBtYW55IG90aGVyIHRleHQgZWRpdG9ycy4pCi0KLU11bHRpLXdvcmQgbmFtZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gbG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzLCBlLmcuLAotbXVsdGlfd29yZF9uYW1lIChub3QgbXVsdGlXb3JkTmFtZSkuICBQcmVwcm9jZXNzb3Igc3ltYm9scyBhbmQgZW51bSBjb25zdGFudHMKLWFyZSBzaW1pbGFyIGJ1dCB1cHBlciBjYXNlIChNVUxUSV9XT1JEX05BTUUpLiAgTmFtZXMgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4KLXRoZSBmaXJzdCBmaWZ0ZWVuIGNoYXJhY3RlcnMuICAoT24gc29tZSBvbGRlciBzeXN0ZW1zLCBnbG9iYWwgbmFtZXMgbXVzdCBiZQotdW5pcXVlIHdpdGhpbiBzaXggY2hhcmFjdGVycy4gIFdlIGFjY29tbW9kYXRlIHRoaXMgd2l0aG91dCBjbHV0dGVyaW5nIHRoZQotc291cmNlIGNvZGUgYnkgdXNpbmcgbWFjcm9zIHRvIHN1YnN0aXR1dGUgc2hvcnRlciBuYW1lcy4pCi0KLVdlIHVzZSBmdW5jdGlvbiBwcm90b3R5cGVzIGV2ZXJ5d2hlcmU7IHdlIHJlbHkgb24gYXV0b21hdGljIHNvdXJjZSBjb2RlCi10cmFuc2Zvcm1hdGlvbiB0byBmZWVkIHByb3RvdHlwZS1sZXNzIEMgY29tcGlsZXJzLiAgVHJhbnNmb3JtYXRpb24gaXMgZG9uZQotYnkgdGhlIHNpbXBsZSBhbmQgcG9ydGFibGUgdG9vbCAnYW5zaTJrbnIuYycgKGNvdXJ0ZXN5IG9mIEdob3N0c2NyaXB0KS4KLWFuc2kya25yIGlzIG5vdCB2ZXJ5IGJyaWdodCwgc28gaXQgaW1wb3NlcyBhIGZvcm1hdCByZXF1aXJlbWVudCBvbiBmdW5jdGlvbgotZGVjbGFyYXRpb25zOiB0aGUgZnVuY3Rpb24gbmFtZSBNVVNUIEJFR0lOIElOIENPTFVNTiAxLiAgVGh1cyBhbGwgZnVuY3Rpb25zCi1zaG91bGQgYmUgd3JpdHRlbiBpbiB0aGUgZm9sbG93aW5nIHN0eWxlOgotCi1MT0NBTChpbnQgKikKLWZ1bmN0aW9uX25hbWUgKGludCBhLCBjaGFyICpiKQotewotICAgIGNvZGUuLi4KLX0KLQotTm90ZSB0aGF0IGVhY2ggZnVuY3Rpb24gZGVmaW5pdGlvbiBtdXN0IGJlZ2luIHdpdGggR0xPQkFMKHR5cGUpLCBMT0NBTCh0eXBlKSwKLW9yIE1FVEhPRERFRih0eXBlKS4gIFRoZXNlIG1hY3JvcyBleHBhbmQgdG8gInN0YXRpYyB0eXBlIiBvciBqdXN0ICJ0eXBlIiBhcwotYXBwcm9wcmlhdGUuICBUaGV5IHByb3ZpZGUgYSByZWFkYWJsZSBpbmRpY2F0aW9uIG9mIHRoZSByb3V0aW5lJ3MgdXNhZ2UgYW5kCi1jYW4gcmVhZGlseSBiZSBjaGFuZ2VkIGZvciBzcGVjaWFsIG5lZWRzLiAgKEZvciBpbnN0YW5jZSwgc3BlY2lhbCBsaW5rYWdlCi1rZXl3b3JkcyBjYW4gYmUgaW5zZXJ0ZWQgZm9yIHVzZSBpbiBXaW5kb3dzIERMTHMuKQotCi1hbnNpMmtuciBkb2VzIG5vdCB0cmFuc2Zvcm0gbWV0aG9kIGRlY2xhcmF0aW9ucyAoZnVuY3Rpb24gcG9pbnRlcnMgaW4KLXN0cnVjdHMpLiAgV2UgaGFuZGxlIHRoZXNlIHdpdGggYSBtYWNybyBKTUVUSE9ELCBkZWZpbmVkIGFzCi0JI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotCSNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSBhcmdsaXN0Ci0JI2Vsc2UKLQkjZGVmaW5lIEpNRVRIT0QodHlwZSxtZXRob2RuYW1lLGFyZ2xpc3QpICB0eXBlICgqbWV0aG9kbmFtZSkgKCkKLQkjZW5kaWYKLXdoaWNoIGlzIHVzZWQgbGlrZSB0aGlzOgotCXN0cnVjdCBmdW5jdGlvbl9wb2ludGVycyB7Ci0JICBKTUVUSE9EKHZvaWQsIGluaXRfZW50cm9weV9lbmNvZGVyLCAoaW50IHNvbWVhcmcsIGpwYXJtcyAqanApKTsKLQkgIEpNRVRIT0Qodm9pZCwgdGVybV9lbnRyb3B5X2VuY29kZXIsICh2b2lkKSk7Ci0JfTsKLU5vdGUgdGhlIHNldCBvZiBwYXJlbnRoZXNlcyBzdXJyb3VuZGluZyB0aGUgcGFyYW1ldGVyIGxpc3QuCi0KLUEgc2ltaWxhciBzb2x1dGlvbiBpcyB1c2VkIGZvciBmb3J3YXJkIGFuZCBleHRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLShzZWUgdGhlIEVYVEVSTiBhbmQgSlBQIG1hY3JvcykuCi0KLUlmIHRoZSBjb2RlIGlzIHRvIHdvcmsgb24gbm9uLUFOU0kgY29tcGlsZXJzLCB3ZSBjYW5ub3QgcmVseSBvbiBhIHByb3RvdHlwZQotZGVjbGFyYXRpb24gdG8gY29lcmNlIGFjdHVhbCBwYXJhbWV0ZXJzIGludG8gdGhlIHJpZ2h0IHR5cGVzLiAgVGhlcmVmb3JlLCB1c2UKLWV4cGxpY2l0IGNhc3RzIG9uIGFjdHVhbCBwYXJhbWV0ZXJzIHdoZW5ldmVyIHRoZSBhY3R1YWwgcGFyYW1ldGVyIHR5cGUgaXMgbm90Ci1pZGVudGljYWwgdG8gdGhlIGZvcm1hbCBwYXJhbWV0ZXIuICBCZXdhcmUgb2YgaW1wbGljaXQgY29udmVyc2lvbnMgdG8gImludCIuCi0KLUl0IHNlZW1zIHRoZXJlIGFyZSBzb21lIG5vbi1BTlNJIGNvbXBpbGVycyBpbiB3aGljaCB0aGUgc2l6ZW9mKCkgb3BlcmF0b3IKLWlzIGRlZmluZWQgdG8gcmV0dXJuIGludCwgeWV0IHNpemVfdCBpcyBkZWZpbmVkIGFzIGxvbmcuICBOZWVkbGVzcyB0byBzYXksCi10aGlzIGlzIGJyYWluLWRhbWFnZWQuICBBbHdheXMgdXNlIHRoZSBTSVpFT0YoKSBtYWNybyBpbiBwbGFjZSBvZiBzaXplb2YoKSwKLXNvIHRoYXQgdGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9mIHR5cGUgc2l6ZV90LgotCi0KLVRoZSBKUEVHIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoaW4gbGFyZ2VyIHByb2dyYW1zLiAgRnVydGhlcm1vcmUsCi13ZSB3YW50IGl0IHRvIGJlIHJlZW50cmFudCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB0aGF0IHByb2Nlc3MKLW11bHRpcGxlIGltYWdlcyBjb25jdXJyZW50bHkuICBUaGUgZm9sbG93aW5nIHJ1bGVzIHN1cHBvcnQgdGhlc2UgcmVxdWlyZW1lbnRzOgotCi0xLiBBdm9pZCBkaXJlY3QgdXNlIG9mIGZpbGUgSS9PLCAibWFsbG9jIiwgZXJyb3IgcmVwb3J0IHByaW50b3V0cywgZXRjOwotcGFzcyB0aGVzZSB0aHJvdWdoIHRoZSBjb21tb24gcm91dGluZXMgcHJvdmlkZWQuCi0KLTIuIE1pbmltaXplIGdsb2JhbCBuYW1lc3BhY2UgcG9sbHV0aW9uLiAgRnVuY3Rpb25zIHNob3VsZCBiZSBkZWNsYXJlZCBzdGF0aWMKLXdoZXJldmVyIHBvc3NpYmxlLiAgKE5vdGUgdGhhdCBvdXIgbWV0aG9kLWJhc2VkIGNhbGxpbmcgY29udmVudGlvbnMgaGVscCB0aGlzCi1hIGxvdDogaW4gbWFueSBtb2R1bGVzIG9ubHkgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHdpbGwgZXZlciBuZWVkIHRvIGJlCi1jYWxsZWQgZGlyZWN0bHksIHNvIG9ubHkgdGhhdCBmdW5jdGlvbiBuZWVkIGJlIGV4dGVybmFsbHkgdmlzaWJsZS4pICBBbGwKLWdsb2JhbCBmdW5jdGlvbiBuYW1lcyBzaG91bGQgYmVnaW4gd2l0aCAianBlZ18iLCBhbmQgc2hvdWxkIGhhdmUgYW4KLWFiYnJldmlhdGVkIG5hbWUgKHVuaXF1ZSBpbiB0aGUgZmlyc3Qgc2l4IGNoYXJhY3RlcnMpIHN1YnN0aXR1dGVkIGJ5IG1hY3JvCi13aGVuIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgaXMgc2V0LgotCi0zLiBEb24ndCB1c2UgZ2xvYmFsIHZhcmlhYmxlczsgYW55dGhpbmcgdGhhdCBtdXN0IGJlIHVzZWQgaW4gYW5vdGhlciBtb2R1bGUKLXNob3VsZCBiZSBpbiB0aGUgY29tbW9uIGRhdGEgc3RydWN0dXJlcy4KLQotNC4gRG9uJ3QgdXNlIHN0YXRpYyB2YXJpYWJsZXMgZXhjZXB0IGZvciByZWFkLW9ubHkgY29uc3RhbnQgdGFibGVzLiAgVmFyaWFibGVzCi10aGF0IHNob3VsZCBiZSBwcml2YXRlIHRvIGEgbW9kdWxlIGNhbiBiZSBwbGFjZWQgaW50byBwcml2YXRlIHN0cnVjdHVyZXMgKHNlZQotdGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgZG9jdW1lbnQsIHN0cnVjdHVyZS5kb2MpLgotCi01LiBTb3VyY2UgZmlsZSBuYW1lcyBzaG91bGQgYmVnaW4gd2l0aCAiaiIgZm9yIGZpbGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlCi1saWJyYXJ5IHByb3Blcjsgc291cmNlIGZpbGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsaWJyYXJ5LCBzdWNoIGFzIGNqcGVnLmMKLWFuZCBkanBlZy5jLCBkbyBub3QgYmVnaW4gd2l0aCAiaiIuICBLZWVwIHNvdXJjZSBmaWxlIG5hbWVzIHRvIGVpZ2h0Ci1jaGFyYWN0ZXJzIChwbHVzICIuYyIgb3IgIi5oIiwgZXRjKSB0byBtYWtlIGxpZmUgZWFzeSBmb3IgTVMtRE9TZXJzLiAgS2VlcAotY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gY29kZSBpbiBzZXBhcmF0ZSBzb3VyY2UgZmlsZXMgLS0tIHNvbWUKLWFwcGxpY2F0aW9ucyBtYXkgd2FudCBvbmx5IG9uZSBoYWxmIG9mIHRoZSBsaWJyYXJ5LgotCi1Ob3RlOiB0aGVzZSBydWxlcyAocGFydGljdWxhcmx5ICM0KSBhcmUgbm90IGZvbGxvd2VkIHJlbGlnaW91c2x5IGluIHRoZQotbW9kdWxlcyB0aGF0IGFyZSB1c2VkIGluIGNqcGVnL2RqcGVnIGJ1dCBhcmUgbm90IHBhcnQgb2YgdGhlIEpQRUcgbGlicmFyeQotcHJvcGVyLiAgVGhvc2UgbW9kdWxlcyBhcmUgbm90IHJlYWxseSBpbnRlbmRlZCB0byBiZSB1c2VkIGluIG90aGVyCi1hcHBsaWNhdGlvbnMuCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9jb25maWcuZ3Vlc3MgYi9saWJqcGVndHdycC9jb25maWcuZ3Vlc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxM2VkNDEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvY29uZmlnLmd1ZXNzCisrKyAvZGV2L251bGwKQEAgLTEsODgzICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgV3JpdHRlbiBieSBQZXIgQm90aG5lciA8Ym90aG5lckBjeWdudXMuY29tPi4KLSMgVGhlIG1hc3RlciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpcyBhdCB0aGUgRlNGIGluIC9ob21lL2dkL2dudS9saWIuCi0jCi0jIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KLSMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCi0jIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgotIwotIyBUaGUgcGxhbiBpcyB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBieSBjb25maWd1cmUgc2NyaXB0cyBpZiB5b3UKLSMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBzeXN0ZW0gdHlwZSAoaG9zdC90YXJnZXQgbmFtZSkuCi0jCi0jIE9ubHkgYSBmZXcgc3lzdGVtcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcyBsaXN0OyBwbGVhc2UgYWRkIG90aGVycwotIyAoYnV0IHRyeSB0byBrZWVwIHRoZSBzdHJ1Y3R1cmUgY2xlYW4pLgotIwotCi0jIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgotIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDgvMjQvOTQuKQotaWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKLWZpCi0KLVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgotVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCi1VTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCi1VTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KLQotdHJhcCAncm0gLWYgZHVtbXkuYyBkdW1teS5vIGR1bW15OyBleGl0IDEnIDEgMiAxNQotCi0jIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCi0KLWNhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KLSAgICBhbHBoYTpPU0YxOio6KikKLQlpZiB0ZXN0ICRVTkFNRV9SRUxFQVNFID0gIlY0LjAiOyB0aGVuCi0JCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JZmkKLQkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KLQkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgotCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgotCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgotCWNhdCA8PEVPRiA+ZHVtbXkucwotCS5nbG9ibCBtYWluCi0JLmVudCBtYWluCi1tYWluOgotCS5mcmFtZSBcJDMwLDAsXCQyNiwwCi0JLnByb2xvZ3VlIDAKLQkubG9uZyAweDQ3ZTAzZDgwICMgaW1wbHZlciAkMAotCWxkYSBcJDIsMjU5Ci0JLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrICQyLCQxCi0Jc3JsIFwkMSw4LFwkMgotCXNsbCBcJDIsMixcJDIKLQlzbGwgXCQwLDMsXCQwCi0JYWRkbCBcJDEsXCQwLFwkMAotCWFkZGwgXCQyLFwkMCxcJDAKLQlyZXQgXCQzMSwoXCQyNiksMQotCS5lbmQgbWFpbgotRU9GCi0JJHtDQy1jY30gZHVtbXkucyAtbyBkdW1teSAyPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCS4vZHVtbXkKLQkJY2FzZSAiJD8iIGluCi0JCQk3KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxNSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIKLQkJCQk7OwotCQkJMTQpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IgotCQkJCTs7Ci0JCQkxMCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IgotCQkJCTs7Ci0JCQkxNikKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIKLQkJCQk7OwotCQllc2FjCi0JZmkKLQlybSAtZiBkdW1teS5zIGR1bW15Ci0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyIFtbQS1aXV0gW1thLXpdXWAKLQlleGl0IDAgOzsKLSAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCi0JZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKLQlleGl0IDAgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstY2JtLXN5c3Y0Ci0JZXhpdCAwOzsKLSAgICBhbWlnYTpOZXRCU0Q6KjoqKQotICAgICAgZWNobyBtNjhrLWNibS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0gICAgICBleGl0IDAgOzsKLSAgICBhbWlnYTpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFyYzY0Ok9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwczY0ZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFyYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaGttaXBzOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcG1heDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc2dpOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgd2dyaXNjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMDs7Ci0gICAgYXJtMzI6TmV0QlNEOio6KikKLQllY2hvIGFybS11bmtub3duLW5ldGJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCWV4aXQgMCA7OwotICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqKQotCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKLQlleGl0IDA7OwotICAgIFB5cmFtaWQqOk9TeCo6KjoqfE1JUyo6T1N4KjoqOiopCi0JIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KLQlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCi0JZWxzZQotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKLQlmaQotCWV4aXQgMCA7OwotICAgIE5JTEU6KjoqOmRjb3N4KQotCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgaTg2cGM6U3VuT1M6NS4qOiopCi0JZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6Nio6KikKLQkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQotCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0Ci0JIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOio6KikKLQljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCi0JICAgIFNlcmllcyp8UzQqKQotCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKLQkJOzsKLQllc2FjCi0JIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgotCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuKjoqOjQuMkJTRDoqKQotCVVOQU1FX1JFTEVBU0U9YChoZWFkIC0xIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAotCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKLQljYXNlICJgL2Jpbi9hcmNoYCIgaW4KLQkgICAgc3VuMykKLQkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQkgICAgc3VuNCkKLQkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JZXNhYwotCWV4aXQgMCA7OwotICAgIGF1c2hwOlN1bk9TOio6KikKLQllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhdGFyaSo6TmV0QlNEOio6KikKLQllY2hvIG02OGstYXRhcmktbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHN1bjMqOk5ldEJTRDoqOiopCi0JZWNobyBtNjhrLXN1bi1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWM2OGs6TmV0QlNEOio6KikKLQllY2hvIG02OGstYXBwbGUtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hYzY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lODhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcG93ZXJwYzptYWNodGVuOio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSSVNDKjpNYWNoOio6KikKLQllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCi0JZXhpdCAwIDs7Ci0gICAgUklTQyo6VUxUUklYOio6KikKLQllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBWQVgqOlVMVFJJWCo6KjoqKQotCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgMjAyMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCXNlZCAncy9eCS8vJyA8PCBFT0YgPmR1bW15LmMKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKiphcmd2OyB7Ci0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgXAotCSAgJiYgLi9kdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCi0JICAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCXJtIC1mIGR1bW15LmMgZHVtbXkKLQllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKLQllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAotCWV4aXQgMCA7OwotICAgIG04OGs6Q1gvVVg6Nyo6KikKLQllY2hvIG04OGstaGFycmlzLWN4dXg3Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azoqOjQqOlI0KikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBtODhrOio6Myo6UjMqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MwotCWV4aXQgMCA7OwotICAgIEFWaWlPTjpkZ3V4Oio6KikKLSAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKLSAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKLSAgICAgICAgaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCAtbyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdIDsgdGhlbgotCWlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IFwKLQkgICAgIC1vICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXSA7IHRoZW4KLQkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KLQlmaQotICAgICAgICBlbHNlIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBmaQotIAlleGl0IDAgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgTTg4KjoqOlIzKjoqKQotCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKLQllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgMCA7OwotICAgICo6SVJJWCo6KjoqKQotCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKLQlleGl0IDAgOzsKLSAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCi0JZWNobyByb21wLWlibS1haXggICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpPzg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDAgOzsKLSAgICAqOkFJWDoyOjMpCi0JaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXNlZCAncy9eCQkvLycgPDwgRU9GID5kdW1teS5jCi0JCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+Ci0KLQkJbWFpbigpCi0JCQl7Ci0JCQlpZiAoIV9fcG93ZXJfcGMoKSkKLQkJCQlleGl0KDEpOwotCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKLQkJCWV4aXQoMCk7Ci0JCQl9Ci1FT0YKLQkJJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAmJiAuL2R1bW15ICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0JCXJtIC1mIGR1bW15LmMgZHVtbXkKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41Ci0JZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40Ci0JZWxzZQotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCi0JZmkKLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOjQpCi0JaWYgL3Vzci9zYmluL2xzYXR0ciAtRUhsIHByb2MwIHwgZ3JlcCBQT1dFUiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJSUJNX0FSQ0g9cnM2MDAwCi0JZWxzZQotCQlJQk1fQVJDSD1wb3dlcnBjCi0JZmkKLQlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KLQkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKLQllbHNlCi0JCUlCTV9SRVY9NC4ke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLQllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6KjoqKQotCWVjaG8gcnM2MDAwLWlibS1haXgKLQlleGl0IDAgOzsKLSAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKLQllY2hvIHJvbXAtaWJtLWJzZDQuNAotCWV4aXQgMCA7OwotICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBOZXRCU0QgYW5kCi0JZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bwotCWV4aXQgMCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCi0gICAgKjpCT1NYOio6KikKLQllY2hvIHJzNjAwMC1idWxsLWJvc3gKLQlleGl0IDAgOzsKLSAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQotCWVjaG8gbTY4ay1idWxsLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2Q0LjQKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNDc4XT8/OkhQLVVYOio6KikKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwLzc/PyB8IDkwMDAvOD9bMTY3OV0gKSBIUF9BUkNIPWhwcGExLjEgOzsKLQkgICAgOTAwMC84Pz8gKSAgICAgICAgICAgIEhQX0FSQ0g9aHBwYTEuMCA7OwotCWVzYWMKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgMzA1MCo6SEktVVg6KjoqKQotCXNlZCAncy9eCS8vJyA8PCBFT0YgPmR1bW15LmMKLQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0JaW50Ci0JbWFpbiAoKQotCXsKLQkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLQkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCi0JICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAotCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCi0JICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGNwdSkKLQkJewotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCi0JICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGV4aXQgKDApOwotCX0KLUVPRgotCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCXJtIC1mIGR1bW15LmMgZHVtbXkKLQllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaHA4Pz86T1NGMToqOiopCi0JZWNobyBocHBhMS4wLWhwLW9zZgotCWV4aXQgMCA7OwotICAgIGk/ODY6T1NGMToqOiopCi0JaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKLQllbHNlCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKLQlmaQotCWV4aXQgMCA7OwotICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKLQllY2hvIGhwcGExLjEtaHAtbGl0ZXMKLQlleGl0IDAgOzsKLSAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQotCWVjaG8gYzEtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQ1JBWSpYLU1QOio6KjoqKQotCWVjaG8geG1wLWNyYXktdW5pY29zCi0gICAgICAgIGV4aXQgMCA7OwotICAgIENSQVkqWS1NUDoqOio6KikKLQllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8KLQlleGl0IDAgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIENSQVktMjoqOio6KikKLQllY2hvIGNyYXkyLWNyYXktdW5pY29zCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEYzMDA6VU5JWF9TeXN0ZW1fVjoqOiopCi0gICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyIFtBLVpdIFthLXpdIHwgc2VkIC1lICdzL1wvLy8nYAotICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAotICAgICAgICBlY2hvICJmMzAwLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgRjMwMTpVTklYX1N5c3RlbV9WOio6KikKLSAgICAgICBlY2hvIGYzMDEtZnVqaXRzdS11eHB2YGVjaG8gJFVOQU1FX1JFTEVBU0UgfCBzZWQgJ3MvIC4qLy8nYAotICAgICAgIGV4aXQgMCA7OwotICAgIGhwM1swLTldWzA1XTpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1ocC1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaHAzMDA6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBpPzg2OkJTRC8zODY6KjoqIHwgKjpCU0QvT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6RnJlZUJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKLQlleGl0IDAgOzsKLSAgICAqOk5ldEJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbmV0YnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpPcGVuQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JZXhpdCAwIDs7Ci0gICAgaSo6Q1lHV0lOKjoqKQotCWVjaG8gaTM4Ni1wYy1jeWd3aW4zMgotCWV4aXQgMCA7OwotICAgIGkqOk1JTkdXKjoqKQotCWVjaG8gaTM4Ni1wYy1taW5ndzMyCi0JZXhpdCAwIDs7Ci0gICAgcCo6Q1lHV0lOKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luMzIKLQlleGl0IDAgOzsKLSAgICBwcmVwKjpTdW5PUzo1Lio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpHTlU6KjoqKQotCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAotCWV4aXQgMCA7OwotICAgICo6TGludXg6KjoqKQotCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCi0JIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLgotCWxkX2hlbHBfc3RyaW5nPWBsZCAtLWhlbHAgMj4mMWAKLQlsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucz1gZWNobyAkbGRfaGVscF9zdHJpbmcgXAotCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCBlbXVsYXRpb25zOi8hZAotCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKLQkJCQkgICAgcy8uKnN1cHBvcnRlZCBlbXVsYXRpb25zOiAqLy8KLQkJCQkgICAgcy8gLiovLwotCQkJCSAgICBwJ2AKLSAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF9lbXVsYXRpb25zIiBpbgotCSAgaT84NmxpbnV4KSAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IiAgICAgIDsgZXhpdCAwIDs7Ci0JICBpPzg2Y29mZikgICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiICAgICAgOyBleGl0IDAgOzsKLQkgIHNwYXJjbGludXgpIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OwotCSAgbTY4a2xpbnV4KSAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiIDsgZXhpdCAwIDs7Ci0JICBlbGYzMnBwYykgICBlY2hvICJwb3dlcnBjLXVua25vd24tbGludXgtZ251IiAgICAgICAgICAgICAgOyBleGl0IDAgOzsKLQllc2FjCi0KLQlpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJhbHBoYSIgOyB0aGVuCi0JCXNlZCAncy9eCS8vJyAgPDxFT0YgPmR1bW15LnMKLQkJLmdsb2JsIG1haW4KLQkJLmVudCBtYWluCi0JbWFpbjoKLQkJLmZyYW1lIFwkMzAsMCxcJDI2LDAKLQkJLnByb2xvZ3VlIDAKLQkJLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgJDAKLQkJbGRhIFwkMiwyNTkKLQkJLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrICQyLCQxCi0JCXNybCBcJDEsOCxcJDIKLQkJc2xsIFwkMiwyLFwkMgotCQlzbGwgXCQwLDMsXCQwCi0JCWFkZGwgXCQxLFwkMCxcJDAKLQkJYWRkbCBcJDIsXCQwLFwkMAotCQlyZXQgXCQzMSwoXCQyNiksMQotCQkuZW5kIG1haW4KLUVPRgotCQlMSUJDPSIiCi0JCSR7Q0MtY2N9IGR1bW15LnMgLW8gZHVtbXkgMj4vZGV2L251bGwKLQkJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KLQkJCS4vZHVtbXkKLQkJCWNhc2UgIiQ/IiBpbgotCQkJNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIKLQkJCQk7OwotCQkJMTUpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCi0JCQkJOzsKLQkJCTE0KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIKLQkJCQk7OwotCQkJMTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIKLQkJCQk7OwotCQkJMTYpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiCi0JCQkJOzsKLQkJCWVzYWMJCi0KLQkJCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgZHVtbXkgfCBcCi0JCQkgIGdyZXAgbGQuc28uMSA+IC9kZXYvbnVsbAotCQkJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KLQkJCQlMSUJDPSJsaWJjMSIKLQkJCWZpCi0JCWZpCQotCQlybSAtZiBkdW1teS5zIGR1bW15Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30gOyBleGl0IDAKLQllbGlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gIm1pcHMiIDsgdGhlbgotCSAgY2F0ID5kdW1teS5jIDw8RU9GCi1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWZkZWYgX19NSVBTRUJfXwotICBwcmludGYgKCIlcy11bmtub3duLWxpbnV4LWdudVxuIiwgYXJndlsxXSk7Ci0jZW5kaWYKLSNpZmRlZiBfX01JUFNFTF9fCi0gIHByaW50ZiAoIiVzZWwtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotRU9GCi0JICAke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgIiR7VU5BTUVfTUFDSElORX0iICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0JICBybSAtZiBkdW1teS5jIGR1bW15Ci0JZWxzZQotCSAgIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpCi0JICAjIG9yIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KLQkgICMgR0NDIHdhbnRzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbGludXgtZ251b2xkbGQgYW5kIGxpbnV4LWdudWFvdXQuCi0JICAjIElmIGxkIGRvZXMgbm90IHByb3ZpZGUgKmFueSogInN1cHBvcnRlZCBlbXVsYXRpb25zOiIKLQkgICMgdGhhdCBtZWFucyBpdCBpcyBnbnVvbGRsZC4KLQkgIGVjaG8gIiRsZF9oZWxwX3N0cmluZyIgfCBncmVwID4vZGV2L251bGwgMj4mMSAic3VwcG9ydGVkIGVtdWxhdGlvbnM6IgotCSAgdGVzdCAkPyAhPSAwICYmIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251b2xkbGQiICYmIGV4aXQgMAotCi0JICBjYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgaT84NikKLQkgICAgVkVORE9SPXBjOwotCSAgICA7OwotCSAgKikKLQkgICAgVkVORE9SPXVua25vd247Ci0JICAgIDs7Ci0JICBlc2FjCi0JICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgotCSAgY2F0ID5kdW1teS5jIDw8RU9GCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLW1haW4oYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSNpZmRlZiBfX0VMRl9fCi0jIGlmZGVmIF9fR0xJQkNfXwotIyAgaWYgX19HTElCQ19fID49IDIKLSAgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKLSMgIGVsc2UKLSAgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251bGliYzFcbiIsIGFyZ3ZbMV0pOwotIyAgZW5kaWYKLSMgZWxzZQotICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWxpYmMxXG4iLCBhcmd2WzFdKTsKLSMgZW5kaWYKLSNlbHNlCi0gIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVhb3V0XG4iLCBhcmd2WzFdKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLUVPRgotCSAgJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICIke1VOQU1FX01BQ0hJTkV9IiAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCSAgcm0gLWYgZHVtbXkuYyBkdW1teQotCWZpIDs7Ci0jIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLiAgZWFybGllciB2ZXJzaW9ucwotIyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGggc3lzbmFtZSBhbmQgbm9kZW5hbWUuCi0gICAgaT84NjpEWU5JWC9wdHg6NCo6KikKLQllY2hvIGkzODYtc2VxdWVudC1zeXN2NAotCWV4aXQgMCA7OwotICAgIGk/ODY6VU5JWF9TVjo0LjJNUDoyLiopCi0gICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KLSAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgotICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCi0JIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgotICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgMCA7OwotICAgIGk/ODY6Kjo0Lio6KiB8IGk/ODY6U1lTVEVNX1Y6NC4qOiopCi0JaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgaT84NjoqOjMuMjoqKQotCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KLQkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAotCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGVncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2Ci0JCSgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDAgOzsKLSAgICBwYzoqOio6KikKLSAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKLSAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KLQllY2hvIGkzODYtcGMtbXNkb3NkamdwcAotICAgICAgICBleGl0IDAgOzsKLSAgICBJbnRlbDpNYWNoOjMqOiopCi0JZWNobyBpMzg2LXBjLW1hY2gzCi0JZXhpdCAwIDs7Ci0gICAgcGFyYWdvbjoqOio6KikKLQllY2hvIGk4NjAtaW50ZWwtb3NmMQotCWV4aXQgMCA7OwotICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKLQlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAotCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KLQkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBtaW5pKjpDVElYOlNZUyo1OiopCi0JIyAibWluaWZyYW1lIgotCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgotCWV4aXQgMCA7OwotICAgIE02OCo6KjpSM1ZbNTY3XSo6KikKLQl0ZXN0IC1yIC9zeXNWNjggJiYgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JyAmJiBleGl0IDAgOzsKLSAgICAzWzM0XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCkKLQlPU19SRUw9JycKLQl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKLQkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotCSAgJiYgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMAotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAotCSAgJiYgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMCA7OwotICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQotICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLSAgICAgICAgICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0ICYmIGV4aXQgMCA7OwotICAgIG02OCo6THlueE9TOjIuKjoqKQotCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCi0JZWNobyBtNjhrLWF0YXJpLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpMeW54T1M6Mi4qOiopCi0JZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcnM2MDAwOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjIuKjoqKQotCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCi0JZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJNKjpTSU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpTSU5JWC0qOio6KikKLQlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0Ci0JZWxzZQotCQllY2hvIG5zMzJrLXNuaS1zeXN2Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBQRU5USVVNOkNQdW5peDo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+Ci0gICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCi0JIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgotCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjoqOio6RlRYKikKLQkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KLQllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAotCWV4aXQgMCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbmV3cyo6TkVXUy1PUzoqOjYqKQotCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDAgOzsKLSAgICBSMzAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiopCi0JaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCi0JICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotICAgICAgICBleGl0IDAgOzsKLWVzYWMKLQotI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCi0jZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCi0KLWNhdCA+ZHVtbXkuYyA8PEVPRgotI2lmZGVmIF9TRVFVRU5UXwotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLSNlbmRpZgotbWFpbiAoKQotewotI2lmIGRlZmluZWQgKHNvbnkpCi0jaWYgZGVmaW5lZCAoTUlQU0VCKQotICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAotICAgICBJIGRvbid0IGtub3cuLi4uICAqLwotICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCi0jaWZkZWYgTkVXU09TNAotICAgICAgICAgICI0IgotI2Vsc2UKLQkgICIiCi0jZW5kaWYKLSAgICAgICAgICk7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCi0gIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXgiKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKLSAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTmVYVCkKLSNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKLSNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKLSNlbmRpZgotICBpbnQgdmVyc2lvbjsKLSAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOwotICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKLSNpZiBkZWZpbmVkIChVTUFYVikKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoQ01VKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX18zODZCU0RfXykKLSAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc2VxdWVudCkKLSNpZiBkZWZpbmVkIChpMzg2KQotICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKG5zMzIwMDApCi0gIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCi0gICAgc3RydWN0IHV0c25hbWUgdW47Ci0KLSAgICB1bmFtZSgmdW4pOwotCi0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgewotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCi0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOwotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHZheCkKLSNpZiAhZGVmaW5lZCAodWx0cml4KQotICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQotICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotICBleGl0ICgxKTsKLX0KLUVPRgotCi0ke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLXJtIC1mIGR1bW15LmMgZHVtbXkKLQotIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgotCi10ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQgMDsgfQotCi0jIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCi0KLWlmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCi10aGVuCi0gICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KLSAgICBjMSopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzIqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBjMzQqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMzgqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjNCopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgZXNhYwotZmkKLQotI2VjaG8gJyhVbmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUpJyAxPiYyCi0KLWV4aXQgMQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvY29uZmlnLnN1YiBiL2xpYmpwZWd0d3JwL2NvbmZpZy5zdWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxM2E2ZDQuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvY29uZmlnLnN1YgorKysgL2Rldi9udWxsCkBAIC0xLDk1NCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdCwgdmVyc2lvbiAxLjEuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KLSMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQotIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KLSMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgotIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KLSMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KLQotIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKLSMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCi0jIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCi0jIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCi0jIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAotIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCi0jIGNvbmZpZ3VyYXRpb24uCi0KLSMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCi0jIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0jIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KLQotaWYgWyB4JDEgPSB4IF0KLXRoZW4KLQllY2hvIENvbmZpZ3VyYXRpb24gbmFtZSBtaXNzaW5nLiAxPiYyCi0JZWNobyAiVXNhZ2U6ICQwIENQVS1NRlItT1BTWVMiIDE+JjIKLQllY2hvICJvciAgICAgJDAgQUxJQVMiIDE+JjIKLQllY2hvIHdoZXJlIEFMSUFTIGlzIGEgcmVjb2duaXplZCBjb25maWd1cmF0aW9uIHR5cGUuIDE+JjIKLQlleGl0IDEKLWZpCi0KLSMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgotY2FzZSAkMSBpbgotCSpsb2NhbCopCi0JCWVjaG8gJDEKLQkJZXhpdCAwCi0JCTs7Ci0JKikKLQk7OwotZXNhYwotCi0jIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCi0jIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgotbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCi1jYXNlICRtYXliZV9vcyBpbgotICBsaW51eC1nbnUqKQotICAgIG9zPS0kbWF5YmVfb3MKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAotICAgIDs7Ci0gICopCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAotICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQotICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKLSAgICBlbHNlIG9zPTsgZmkKLSAgICA7OwotZXNhYwotCi0jIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KLSMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCi0jIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCi0jIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KLWNhc2UgJG9zIGluCi0JLXN1bipvcyopCi0JCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgotCQk7OwotCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCi0JLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCi0JLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKLQktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAotCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCi0JLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCi0JLWFwcGxlKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1oaXV4KikKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQktc2NvNSkKLQkJb3M9c2NvMy4ydjUKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY280KQotCQlvcz0tc2NvMy4ydjQKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjIuWzQtOV0qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4ydls0LTldKikKLQkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28qKQotCQlvcz0tc2NvMy4ydjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1pc2MpCi0JCW9zPS1pc2MyLjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1jbGl4KikKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKLQkJOzsKLQktaXNjKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1seW54KikKLQkJb3M9LWx5bnhvcwotCQk7OwotCS1wdHgqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKLQkJOzsKLQktd2luZG93c250KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAotCQk7OwotCS1wc29zKikKLQkJb3M9LXBzb3MKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KLQkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgotCXRhaG9lIHwgaTg2MCB8IG0zMnIgfCBtNjhrIHwgbTY4MDAwIHwgbTg4ayB8IG5zMzJrIHwgYXJjIHwgYXJtIFwKLQkJfCBhcm1lW2xiXSB8IHB5cmFtaWQgfCBtbjEwMjAwIHwgbW4xMDMwMCBcCi0JCXwgdHJvbiB8IGEyOWsgfCA1ODAgfCBpOTYwIHwgaDgzMDAgfCBocHBhIHwgaHBwYTEuMCB8IGhwcGExLjEgXAotCQl8IGFscGhhIHwgYWxwaGFldjUgfCBhbHBoYWV2NTYgfCB3ZTMyayB8IG5zMTZrIHwgY2xpcHBlciBcCi0JCXwgaTM3MCB8IHNoIHwgcG93ZXJwYyB8IHBvd2VycGNsZSB8IDE3NTBhIHwgZHNwMTZ4eCB8IHBkcDExIFwKLQkJfCBtaXBzNjQgfCBtaXBzZWwgfCBtaXBzNjRlbCB8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCi0JCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKLQkJfCBzcGFyYyB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmM2NCB8IHY4NTApCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCi0JIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCi0JIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgotCWlbMzQ1Nl04NikKLQkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKLQkgIDs7Ci0JIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KLQkqLSotKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCi0JdmF4LSogfCB0YWhvZS0qIHwgaVszNDU2XTg2LSogfCBpODYwLSogfCBtMzJyLSogfCBtNjhrLSogfCBtNjgwMDAtKiBcCi0JICAgICAgfCBtODhrLSogfCBzcGFyYy0qIHwgbnMzMmstKiB8IGZ4ODAtKiB8IGFyYy0qIHwgYXJtLSogfCBjWzEyM10qIFwKLQkgICAgICB8IG1pcHMtKiB8IHB5cmFtaWQtKiB8IHRyb24tKiB8IGEyOWstKiB8IHJvbXAtKiB8IHJzNjAwMC0qIFwKLQkgICAgICB8IHBvd2VyLSogfCBub25lLSogfCA1ODAtKiB8IGNyYXkyLSogfCBoODMwMC0qIHwgaTk2MC0qIFwKLQkgICAgICB8IHhtcC0qIHwgeW1wLSogfCBocHBhLSogfCBocHBhMS4wLSogfCBocHBhMS4xLSogXAotCSAgICAgIHwgYWxwaGEtKiB8IGFscGhhZXY1LSogfCBhbHBoYWV2NTYtKiB8IHdlMzJrLSogfCBjeWRyYS0qIFwKLQkgICAgICB8IG5zMTZrLSogfCBwbi0qIHwgbnAxLSogfCB4cHMxMDAtKiB8IGNsaXBwZXItKiB8IG9yaW9uLSogXAotCSAgICAgIHwgc3BhcmNsaXRlLSogfCBwZHAxMS0qIHwgc2gtKiB8IHBvd2VycGMtKiB8IHBvd2VycGNsZS0qIFwKLQkgICAgICB8IHNwYXJjNjQtKiB8IG1pcHM2NC0qIHwgbWlwc2VsLSogXAotCSAgICAgIHwgbWlwczY0ZWwtKiB8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogIFwKLQkgICAgICB8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAotCSAgICAgIHwgZjMwMS0qKQotCQk7OwotCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKLQkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgotCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKLQkJOzsKLQkzYiopCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0JYWxsaWFudCB8IGZ4ODApCi0JCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50Ci0JCTs7Ci0JYWx0b3MgfCBhbHRvczMwNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcwotCQk7OwotCWFtMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQotCQlvcz0tYnNkCi0JCTs7Ci0JYW1kYWhsKQotCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKLQkJb3M9LXN5c3YKLQkJOzsKLQlhbWlnYSB8IGFtaWdhLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KLQkJOzsKLQlhbWlnYW9zIHwgYW1pZ2Fkb3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQlhbWlnYXVuaXggfCBhbWl4KQotCQliYXNpY19tYWNoaW5lPW02OGstY2JtCi0JCW9zPS1zeXN2NAotCQk7OwotCWFwb2xsbzY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYXV4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJb3M9LWF1eAotCQk7OwotCWJhbGFuY2UpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQljb252ZXgtYzEpCi0JCWJhc2ljX21hY2hpbmU9YzEtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzIpCi0JCWJhc2ljX21hY2hpbmU9YzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzMyKQotCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzQpCi0JCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzOCkKLQkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljcmF5IHwgeW1wKQotCQliYXNpY19tYWNoaW5lPXltcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQljcmF5MikKLQkJYmFzaWNfbWFjaGluZT1jcmF5Mi1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQlbY3RqXTkwLWNyYXkpCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyZHMgfCB1bm9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY3JkcwotCQk7OwotCWRhMzAgfCBkYTMwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCi0JCTs7Ci0JZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQotCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCi0JCTs7Ci0JZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKLQkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCi0JCTs7Ci0JZGVsdGE4OCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCi0JCW9zPS1zeXN2MwotCQk7OwotCWRweDIwIHwgZHB4MjAtKikKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAotCQlvcz0tYm9zeAotCQk7OwotCWRweDIqIHwgZHB4MiotYnVsbCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZWJtb24yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LWVibW9uCi0JCTs7Ci0JZWx4c2kpCi0JCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKLQkJb3M9LWJzZAotCQk7OwotCWVuY29yZSB8IHVtYXggfCBtbWF4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQotCQk7OwotCWZ4MjgwMCkKLQkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKLQkJOzsKLQlnZW5peCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1ucwotCQk7OwotCWdtaWNybykKLQkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybwotCQlvcz0tc3lzdgotCQk7OwotCWgzMDUwciogfCBoaXV4KikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQloODMwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloYXJyaXMpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JaHAzMDAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHAzMDBic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0tYnNkCi0JCTs7Ci0JaHAzMDBocHV4KQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWhwdXgKLQkJOzsKLQlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKLQkJOzsKLQlocDlrM1syLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwOWs3WzAtOV1bMC05XSB8IGhwN1swLTldWzAtOV0gfCBocDlrOFswLTldNyB8IGhwOFswLTldNykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHBwYS1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0JaTM3MC1pYm0qIHwgaWJtKikKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQlvcz0tbXZzCi0JCTs7Ci0jIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KLQlpWzM0NTZdODZ2MzIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjMyCi0JCTs7Ci0JaVszNDU2XTg2djQqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JaVszNDU2XTg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaVszNDU2XTg2c29sMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCWlyaXMgfCBpcmlzNGQpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1pcml4KikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LWlyaXg0Ci0JCQk7OwotCQllc2FjCi0JCTs7Ci0JaXNpNjggfCBpc2kpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKLQkJb3M9LXN5c3YKLQkJOzsKLQltODhrLW9tcm9uKikKLQkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCi0JCTs7Ci0JbWFnbnVtIHwgbTMyMzApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWVybGluKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKLQkJb3M9LXN5c3YKLQkJOzsKLQltaW5pZnJhbWUpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKLQkJOzsKLQltaXBzZWwqLWxpbnV4KikKLQkJYmFzaWNfbWFjaGluZT1taXBzZWwtdW5rbm93bgotCQlvcz0tbGludXgtZ251Ci0JCTs7Ci0JbWlwcyotbGludXgqKQotCQliYXNpY19tYWNoaW5lPW1pcHMtdW5rbm93bgotCQlvcz0tbGludXgtZ251Ci0JCTs7Ci0JbWlwczMqLSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCi0JCTs7Ci0JbWlwczMqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCi0JCTs7Ci0JbmNyMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgotCQlvcz0tc3lzdjQKLQkJOzsKLQluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQotCQliYXNpY19tYWNoaW5lPW02OGstc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3czEwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5leHQgfCBtKi1uZXh0ICkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1uZXh0c3RlcCogKQotCQkJOzsKLQkJICAgIC1uczIqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAyCi0JCQk7OwotCQkgICAgKikKLQkJICAgICAgb3M9LW5leHRzdGVwMwotCQkJOzsKLQkJZXNhYwotCQk7OwotCW5oMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5oWzQ1XTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5pbmR5OTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW5pbmR5Ci0JCTs7Ci0JbnAxKQotCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAotCQk7OwotCXBhLWhpdGFjaGkpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JcGFyYWdvbikKLQkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCi0JCW9zPS1vc2YKLQkJOzsKLQlwYmQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCi0JCTs7Ci0JcGJiKQotCQliYXNpY19tYWNoaW5lPW02OGstdHRpCi0JCTs7Ci0gICAgICAgIHBjNTMyIHwgcGM1MzItKikKLQkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgotCQk7OwotCXBlbnRpdW0gfCBwNSkKLQkJYmFzaWNfbWFjaGluZT1pNTg2LWludGVsCi0JCTs7Ci0JcGVudGl1bXBybyB8IHA2KQotCQliYXNpY19tYWNoaW5lPWk2ODYtaW50ZWwKLQkJOzsKLQlwZW50aXVtLSogfCBwNS0qKQotCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtcHJvLSogfCBwNi0qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlrNSkKLQkJIyBXZSBkb24ndCBoYXZlIHNwZWNpZmljIHN1cHBvcnQgZm9yIEFNRCdzIEs1IHlldCwgc28ganVzdCBjYWxsIGl0IGEgUGVudGl1bQotCQliYXNpY19tYWNoaW5lPWk1ODYtYW1kCi0JCTs7Ci0JbmV4ZW4pCi0JCSMgV2UgZG9uJ3QgaGF2ZSBzcGVjaWZpYyBzdXBwb3J0IGZvciBOZXhnZW4geWV0LCBzbyBqdXN0IGNhbGwgaXQgYSBQZW50aXVtCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1uZXhnZW4KLQkJOzsKLQlwbikKLQkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAotCQk7OwotCXBvd2VyKQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JICAgICAgICA7OwotCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBzMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQotCQk7OwotCXJtWzQ2XTAwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwotCQk7OwotCXJ0cGMgfCBydHBjLSopCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlzZXF1ZW50KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQk7OwotCXNoKQotCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCXNwczcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MgotCQk7OwotCXNwdXIpCi0JCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCi0JCTs7Ci0Jc3VuMikKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCTs7Ci0Jc3VuMm9zMykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4yb3M0KQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjNvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjNvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRvczMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW40b3M0KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNHNvbDIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCXN1bjMgfCBzdW4zLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJOzsKLQlzdW40KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQotCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCi0JCTs7Ci0Jc3ltbWV0cnkpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCXR4MzkpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgotCQk7OwotCXR4MzllbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KLQkJOzsKLQl0b3dlciB8IHRvd2VyLTMyKQotCQliYXNpY19tYWNoaW5lPW02OGstbmNyCi0JCTs7Ci0JdWRpMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQl1bHRyYTMpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKLQkJb3M9LXN5bTEKLQkJOzsKLQl2YXh2KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQl2bXMpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tdm1zCi0JCTs7Ci0JdnBwKnx2eHx2eC0qKQotICAgICAgICAgICAgICAgYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKLSAgICAgICAgICAgICAgIDs7Ci0Jdnh3b3Jrczk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3M2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3MyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl4bXApCi0JCWJhc2ljX21hY2hpbmU9eG1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotICAgICAgICB4cHMgfCB4cHMxMDApCi0JCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAotCQk7OwotCW5vbmUpCi0JCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCi0JCW9zPS1ub25lCi0JCTs7Ci0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KLSMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KLQltaXBzKQotCQlpZiBbIHgkb3MgPSB4LWxpbnV4LWdudSBdOyB0aGVuCi0JCQliYXNpY19tYWNoaW5lPW1pcHMtdW5rbm93bgotCQllbHNlCi0JCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlmaQotCQk7OwotCXJvbXApCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlyczYwMDApCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQotCQk7OwotCXZheCkKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCTs7Ci0JcGRwMTEpCi0JCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCi0JCTs7Ci0Jd2UzMmspCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0Jc3BhcmMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0gICAgICAgIGN5ZHJhKQotCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKLQkJOzsKLQlvcmlvbikKLQkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKLQkJOzsKLQlvcmlvbjEwNSkKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAotCQk7OwotCSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLQotIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1kaWdpdGFsKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCi0JCTs7Ci0JKi1jb21tb2RvcmUqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAotCQk7OwotCSopCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1pZiBbIHgiJG9zIiAhPSB4IiIgXQotdGhlbgotY2FzZSAkb3MgaW4KLSAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKLSAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KLQkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KLQktc29sYXJpczEgfCAtc29sYXJpczEuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAotCQk7OwotCS1zb2xhcmlzKQotCQlvcz0tc29sYXJpczIKLQkJOzsKLQktc3ZyNCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS11bml4d2FyZSopCi0JCW9zPS1zeXN2NC4ydXcKLQkJOzsKLQktZ251L2xpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgotCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCi0JIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCi0JLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAotCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCi0JICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKLQkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKLQkgICAgICB8IC1hb3MqIFwKLQkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAotCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAotCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIFwKLQkgICAgICB8IC1seW54b3MqIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIFwKLQkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCi0JICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCi0JICAgICAgfCAtY3lnd2luMzIqIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC11eHB2KikKLQkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JCTs7Ci0JLWxpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCS1zdW5vczUqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCi0JCTs7Ci0JLXN1bm9zNiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKLQkJOzsKLQktb3Nmcm9zZSopCi0JCW9zPS1vc2Zyb3NlCi0JCTs7Ci0JLW9zZiopCi0JCW9zPS1vc2YKLQkJOzsKLQktdXRlayopCi0JCW9zPS1ic2QKLQkJOzsKLQktZHluaXgqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWFjaXMqKQotCQlvcz0tYW9zCi0JCTs7Ci0JLWN0aXgqIHwgLXV0cyopCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JLW5zMiApCi0JICAgICAgICBvcz0tbmV4dHN0ZXAyCi0JCTs7Ci0JIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgotCS1zaW5peDUuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKLQkJOzsKLQktc2luaXgqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdHJpdG9uKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLW9zcyopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQktc3ZyMykKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN5c3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgotCS1zeXN2KikKLQkJOzsKLQkteGVuaXgpCi0JCW9zPS14ZW5peAotCQk7OwotCS1ub25lKQotCQk7OwotCSopCi0JCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgotCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi1lbHNlCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KLSMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCi0jIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKLSMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKLSMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQotIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCi0jIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgotCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1hY29ybikKLQkJb3M9LXJpc2NpeDEuMgotCQk7OwotCWFybSotc2VtaSkKLQkJb3M9LWFvdXQKLQkJOzsKLSAgICAgICAgcGRwMTEtKikKLQkJb3M9LW5vbmUKLQkJOzsKLQkqLWRlYyB8IHZheC0qKQotCQlvcz0tdWx0cml4NC4yCi0JCTs7Ci0JbTY4Ki1hcG9sbG8pCi0JCW9zPS1kb21haW4KLQkJOzsKLQlpMzg2LXN1bikKLQkJb3M9LXN1bm9zNC4wLjIKLQkJOzsKLQltNjgwMDAtc3VuKQotCQlvcz0tc3Vub3MzCi0JCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQotCQkjIGRlZmF1bHQuCi0JCSMgb3M9LXN1bm9zNAotCQk7OwotCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCi0JCW9zPS1zeXN2MwotCQk7OwotCXNwYXJjLSogfCAqLXN1bikKLQkJb3M9LXN1bm9zNC4xLjEKLQkJOzsKLQkqLWlibSkKLQkJb3M9LWFpeAotCQk7OwotCSotaHApCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JKi1oaXRhY2hpKQotCQlvcz0taGl1eAotCQk7OwotCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWNibSkKLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQkqLWRnKQotCQlvcz0tZGd1eAotCQk7OwotCSotZG9scGhpbikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JbTY4ay1jY3VyKQotCQlvcz0tcnR1Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCW9zPS1sdW5hCi0JCTs7Ci0JKi1uZXh0ICkKLQkJb3M9LW5leHRzdGVwCi0JCTs7Ci0JKi1zZXF1ZW50KQotCQlvcz0tcHR4Ci0JCTs7Ci0JKi1jcmRzKQotCQlvcz0tdW5vcwotCQk7OwotCSotbnMpCi0JCW9zPS1nZW5peAotCQk7OwotCWkzNzAtKikKLQkJb3M9LW12cwotCQk7OwotCSotbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotICAgICAgICAqLWdvdWxkKQotCQlvcz0tc3lzdgotCQk7OwotICAgICAgICAqLWhpZ2hsZXZlbCkKLQkJb3M9LWJzZAotCQk7OwotCSotZW5jb3JlKQotCQlvcz0tYnNkCi0JCTs7Ci0gICAgICAgICotc2dpKQotCQlvcz0taXJpeAotCQk7OwotICAgICAgICAqLXNpZW1lbnMpCi0JCW9zPS1zeXN2NAotCQk7OwotCSotbWFzc2NvbXApCi0JCW9zPS1ydHUKLQkJOzsKLQlmMzAxLWZ1aml0c3UpCi0JCW9zPS11eHB2Ci0JCTs7Ci0JKikKLQkJb3M9LW5vbmUKLQkJOzsKLWVzYWMKLWZpCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCi0jIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgotdmVuZG9yPXVua25vd24KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLXVua25vd24pCi0JCWNhc2UgJG9zIGluCi0JCQktcmlzY2l4KikKLQkJCQl2ZW5kb3I9YWNvcm4KLQkJCQk7OwotCQkJLXN1bm9zKikKLQkJCQl2ZW5kb3I9c3VuCi0JCQkJOzsKLQkJCS1haXgqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLWhwdXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktaGl1eCopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLXVub3MqKQotCQkJCXZlbmRvcj1jcmRzCi0JCQkJOzsKLQkJCS1kZ3V4KikKLQkJCQl2ZW5kb3I9ZGcKLQkJCQk7OwotCQkJLWx1bmEqKQotCQkJCXZlbmRvcj1vbXJvbgotCQkJCTs7Ci0JCQktZ2VuaXgqKQotCQkJCXZlbmRvcj1ucwotCQkJCTs7Ci0JCQktbXZzKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1wdHgqKQotCQkJCXZlbmRvcj1zZXF1ZW50Ci0JCQkJOzsKLQkJCS12eHNpbSogfCAtdnh3b3JrcyopCi0JCQkJdmVuZG9yPXdycwotCQkJCTs7Ci0JCQktYXV4KikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQllc2FjCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCi0JCTs7Ci1lc2FjCi0KLWVjaG8gJGJhc2ljX21hY2hpbmUkb3MKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2NvbmZpZ3VyZSBiL2xpYmpwZWd0d3JwL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzVjOWRiNS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSwyMDExICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWQgICAgICAgICBidWlsZCBzaGFyZWQgbGlicmFyeSB1c2luZyBHTlUgbGlidG9vbCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpYyAgICAgICAgIGJ1aWxkIHN0YXRpYyBsaWJyYXJ5IHVzaW5nIEdOVSBsaWJ0b29sIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWF4bWVtWz1OXSAgICAgZW5hYmxlIHVzZSBvZiB0ZW1wIGZpbGVzLCBzZXQgbWF4IG1lbSB1c2FnZSB0byBOIE1CIgotYWNfaGVscD0iJGFjX2hlbHAKLSIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMiIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICo9KikKLSAgICB2YXJuYW1lPWBlY2hvICIkYWNfb3B0aW9uInxzZWQgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlbid0IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICR2YXJuYW1lfCBzZWQgJ3MvW2EtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICR2YXJuYW1lOiBpbnZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgdmFsPSJgZWNobyAiJGFjX29wdGlvbiJ8c2VkICdzL1tePV0qPS8vJ2AiCi0gICAgdGVzdCAtbiAiJHZlcmJvc2UiICYmIGVjaG8gIglzZXR0aW5nIHNoZWxsIHZhcmlhYmxlICR2YXJuYW1lIHRvICR2YWwiCi0gICAgZXZhbCAiJHZhcm5hbWU9JyR2YWwnIgotICAgIGV2YWwgImV4cG9ydCAkdmFybmFtZSIgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9amNtYXN0ZXIuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1Mzg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDYyNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2Mjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDk6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NTQ6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjY2MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1PMiIKLWVsc2UKLSAgR0NDPQotICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1PIgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY4MTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2OTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcwMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3MTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcxOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBmdW5jdGlvbiBwcm90b3R5cGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NDI6IGNoZWNraW5nIGZvciBmdW5jdGlvbiBwcm90b3R5cGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydpamdfY3ZfaGF2ZV9wcm90b3R5cGVzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzQ3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IHRlc3RmdW5jdGlvbiAoaW50IGFyZzEsIGludCAqIGFyZzIpOyAvKiBjaGVjayBwcm90b3R5cGVzICovCi1zdHJ1Y3QgbWV0aG9kc19zdHJ1Y3QgewkJLyogY2hlY2sgbWV0aG9kLXBvaW50ZXIgZGVjbGFyYXRpb25zICovCi0gIGludCAoKmVycm9yX2V4aXQpIChjaGFyICptc2d0ZXh0KTsKLSAgaW50ICgqdHJhY2VfbWVzc2FnZSkgKGNoYXIgKm1zZ3RleHQpOwotICBpbnQgKCphbm90aGVyX21ldGhvZCkgKHZvaWQpOwotfTsKLWludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKSAvKiBjaGVjayBkZWZpbml0aW9ucyAqLwoteyByZXR1cm4gYXJnMlthcmcxXTsgfQotaW50IHRlc3QyZnVuY3Rpb24gKHZvaWQpCS8qIGNoZWNrIHZvaWQgYXJnIGxpc3QgKi8KLXsgcmV0dXJuIDA7IH0KLQotaW50IG1haW4oKSB7Ci0gCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzY1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgaWpnX2N2X2hhdmVfcHJvdG90eXBlcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgaWpnX2N2X2hhdmVfcHJvdG90eXBlcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRpamdfY3ZfaGF2ZV9wcm90b3R5cGVzIiAxPiY2Ci1pZiB0ZXN0ICRpamdfY3ZfaGF2ZV9wcm90b3R5cGVzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMgCi1FT0YKLQotZWxzZQotICBlY2hvIFlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc2VlbSB0byBrbm93IGFib3V0IGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0gIGVjaG8gUGVyaGFwcyBpdCBuZWVkcyBhIHNwZWNpYWwgc3dpdGNoIHRvIGVuYWJsZSBBTlNJIEMgbW9kZS4KLSAgZWNobyBJZiBzbywgd2UgcmVjb21tZW5kIHJ1bm5pbmcgY29uZmlndXJlIGxpa2UgdGhpczoKLSAgZWNobyAiICAgLi9jb25maWd1cmUgIENDPSdjYyAtc3dpdGNoJyIKLSAgZWNobyB3aGVyZSAtc3dpdGNoIGlzIHRoZSBwcm9wZXIgc3dpdGNoLgotZmkKLWFjX3NhZmU9YGVjaG8gInN0ZGRlZi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdGRkZWYuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzkyOiBjaGVja2luZyBmb3Igc3RkZGVmLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDc5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjgwMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1REREVGX0ggCi1FT0YKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWFjX3NhZmU9YGVjaG8gInN0ZGxpYi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdGRsaWIuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODI4OiBjaGVja2luZyBmb3Igc3RkbGliLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDgzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjgzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggCi1FT0YKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWFjX3NhZmU9YGVjaG8gInN0cmluZy5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdHJpbmcuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODY0OiBjaGVja2luZyBmb3Igc3RyaW5nLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg2OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjg3NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgOgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0JTRF9TVFJJTkdTIAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkwMDogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgSEFWRV9TVERERUZfSAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotdHlwZWRlZiBzaXplX3QgbXlfc2l6ZV90OwotCi1pbnQgbWFpbigpIHsKLSBteV9zaXplX3QgZm9vdmFyOyAKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MjM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBpamdfc2l6ZV90X29rPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBpamdfc2l6ZV90X29rPSJub3QgQU5TSSwgcGVyaGFwcyBpdCBpcyBpbiBzeXMvdHlwZXMuaCIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiIkaWpnX3NpemVfdF9vayIgMT4mNgotaWYgdGVzdCAiJGlqZ19zaXplX3Rfb2siICE9IHllczsgdGhlbgotYWNfc2FmZT1gZWNobyAic3lzL3R5cGVzLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN5cy90eXBlcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5Mzc6IGNoZWNraW5nIGZvciBzeXMvdHlwZXMuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6OTQ3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9TWVNfVFlQRVNfSCAKLUVPRgotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5NjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJzaXplX3QiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGlqZ19zaXplX3Rfb2s9InNpemVfdCBpcyBpbiBzeXMvdHlwZXMuaCIKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBpamdfc2l6ZV90X29rPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1pamdfc2l6ZV90X29rPW5vCi1maQotCi1lY2hvICIkYWNfdCIiJGlqZ19zaXplX3Rfb2siIDE+JjYKLWlmIHRlc3QgIiRpamdfc2l6ZV90X29rIiA9IG5vOyB0aGVuCi0gIGVjaG8gVHlwZSBzaXplX3QgaXMgbm90IGRlZmluZWQgaW4gYW55IG9mIHRoZSB1c3VhbCBwbGFjZXMuCi0gIGVjaG8gVHJ5IHB1dHRpbmcgJyJ0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7IicgaW4gamNvbmZpZy5oLgotZmkKLWZpCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdHlwZSB1bnNpZ25lZCBjaGFyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5OTQ6IGNoZWNraW5nIGZvciB0eXBlIHVuc2lnbmVkIGNoYXIiID4mNQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTk2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0gdW5zaWduZWQgY2hhciB1bl9jaGFyOyAKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDAzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUiAKLUVPRgotCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHR5cGUgdW5zaWduZWQgc2hvcnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMTg6IGNoZWNraW5nIGZvciB0eXBlIHVuc2lnbmVkIHNob3J0IiA+JjUKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLSB1bnNpZ25lZCBzaG9ydCB1bl9zaG9ydDsgCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAyNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUIAotRU9GCi0KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdHlwZSB2b2lkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDQyOiBjaGVja2luZyBmb3IgdHlwZSB2b2lkIiA+JjUKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBDYXV0aW9uOiBhIEMrKyBjb21waWxlciB3aWxsIGluc2lzdCBvbiB2YWxpZCBwcm90b3R5cGVzICovCi10eXBlZGVmIHZvaWQgKiB2b2lkX3B0cjsJLyogY2hlY2sgdm9pZCAqICovCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCQkvKiBjaGVjayBwdHIgdG8gZnVuY3Rpb24gcmV0dXJuaW5nIHZvaWQgKi8KLXR5cGVkZWYgdm9pZCAoKnZvaWRfZnVuYykgKGludCBhLCBpbnQgYik7Ci0jZWxzZQotdHlwZWRlZiB2b2lkICgqdm9pZF9mdW5jKSAoKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCQkvKiBjaGVjayB2b2lkIGZ1bmN0aW9uIHJlc3VsdCAqLwotdm9pZCB0ZXN0M2Z1bmN0aW9uICh2b2lkX3B0ciBhcmcxLCB2b2lkX2Z1bmMgYXJnMikKLSNlbHNlCi12b2lkIHRlc3QzZnVuY3Rpb24gKGFyZzEsIGFyZzIpCi0gICAgIHZvaWRfcHRyIGFyZzE7Ci0gICAgIHZvaWRfZnVuYyBhcmcyOwotI2VuZGlmCi17Ci0gIGNoYXIgKiBsb2NwdHIgPSAoY2hhciAqKSBhcmcxOyAvKiBjaGVjayBjYXN0aW5nIHRvIGFuZCBmcm9tIHZvaWQgKiAqLwotICBhcmcxID0gKHZvaWQgKikgbG9jcHRyOwotICAoKmFyZzIpICgxLCAyKTsJCS8qIGNoZWNrIGNhbGwgb2YgZmNuIHJldHVybmluZyB2b2lkICovCi19Ci0KLWludCBtYWluKCkgewotIAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwNzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHZvaWQgY2hhcgotRU9GCi0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwODg6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA5MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTQyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNjM6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWpnX2N2X2lubGluZT0iIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSBfX2lubGluZV9fIGludCBmb28oKSB7IHJldHVybiAwOyB9Ci1pbnQgYmFyKCkgeyByZXR1cm4gZm9vKCk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE3NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGlqZ19jdl9pbmxpbmU9Il9faW5saW5lX18iCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExODIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gX19pbmxpbmUgaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KLWludCBiYXIoKSB7IHJldHVybiBmb28oKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTkwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgaWpnX2N2X2lubGluZT0iX19pbmxpbmUiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExOTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gaW5saW5lIGludCBmb28oKSB7IHJldHVybiAwOyB9Ci1pbnQgYmFyKCkgeyByZXR1cm4gZm9vKCk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIwNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGlqZ19jdl9pbmxpbmU9ImlubGluZSIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIiJGlqZ19jdl9pbmxpbmUiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIElOTElORSAkaWpnX2N2X2lubGluZQotRU9GCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBicm9rZW4gaW5jb21wbGV0ZSB0eXBlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyNDogY2hlY2tpbmcgZm9yIGJyb2tlbiBpbmNvbXBsZXRlIHR5cGVzIiA+JjUKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotIHR5cGVkZWYgc3RydWN0IHVuZGVmaW5lZF9zdHJ1Y3R1cmUgKiB1bmRlZl9zdHJ1Y3RfcHRyOyAKLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIzMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJvayIgMT4mNgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIiYnJva2VuIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSU5DT01QTEVURV9UWVBFU19CUk9LRU4gCi1FT0YKLQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNob3J0IGV4dGVybmFsIG5hbWVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjQ4OiBjaGVja2luZyBmb3Igc2hvcnQgZXh0ZXJuYWwgbmFtZXMiID4mNQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI1MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBwb3NzaWJseV9kdXBsaWNhdGVfZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfQotaW50IHBvc3NpYmx5X2R1cGxpX2Z1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0KLQotaW50IG1haW4oKSB7Ci0gCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiIm9rIiAxPiY2Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJzaG9ydCIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgCi1FT0YKLQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAkYWNfbiAiY2hlY2tpbmcgdG8gc2VlIGlmIGNoYXIgaXMgc2lnbmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjc1OiBjaGVja2luZyB0byBzZWUgaWYgY2hhciBpcyBzaWduZWQiID4mNQotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgZWNobyBBc3N1bWluZyB0aGF0IGNoYXIgaXMgc2lnbmVkIG9uIHRhcmdldCBtYWNoaW5lLgotZWNobyBJZiBpdCBpcyB1bnNpZ25lZCwgdGhpcyB3aWxsIGJlIGEgbGl0dGxlIGJpdCBpbmVmZmljaWVudC4KLQotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjgyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotaW50IGlzX2NoYXJfc2lnbmVkIChpbnQgYXJnKQotI2Vsc2UKLWludCBpc19jaGFyX3NpZ25lZCAoYXJnKQotICAgICBpbnQgYXJnOwotI2VuZGlmCi17Ci0gIGlmIChhcmcgPT0gMTg5KSB7CQkvKiBleHBlY3RlZCByZXN1bHQgZm9yIHVuc2lnbmVkIGNoYXIgKi8KLSAgICByZXR1cm4gMDsJCQkvKiB0eXBlIGNoYXIgaXMgdW5zaWduZWQgKi8KLSAgfQotICBlbHNlIGlmIChhcmcgIT0gLTY3KSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBmb3Igc2lnbmVkIGNoYXIgKi8KLSAgICBwcmludGYoIkhtbSwgaXQgc2VlbXMgJ2NoYXInIGlzIG5vdCBlaWdodCBiaXRzIHdpZGUgb24geW91ciBtYWNoaW5lLlxuIik7Ci0gICAgcHJpbnRmKCJJIGZlYXIgdGhlIEpQRUcgc29mdHdhcmUgd2lsbCBub3Qgd29yayBhdCBhbGwuXG5cbiIpOwotICB9Ci0gIHJldHVybiAxOwkJCS8qIGFzc3VtZSBjaGFyIGlzIHNpZ25lZCBvdGhlcndpc2UgKi8KLX0KLWNoYXIgc2lnbmVkX2NoYXJfY2hlY2sgPSAoY2hhcikgKC02Nyk7Ci1tYWluKCkgewotICBleGl0KGlzX2NoYXJfc2lnbmVkKChpbnQpIHNpZ25lZF9jaGFyX2NoZWNrKSk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDSEFSX0lTX1VOU0lHTkVEIAotRU9GCi0KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRvIHNlZSBpZiByaWdodCBzaGlmdCBpcyBzaWduZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMjM6IGNoZWNraW5nIHRvIHNlZSBpZiByaWdodCBzaGlmdCBpcyBzaWduZWQiID4mNQotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgZWNobyAiJGFjX3QiIkFzc3VtaW5nIHRoYXQgcmlnaHQgc2hpZnQgaXMgc2lnbmVkIG9uIHRhcmdldCBtYWNoaW5lLiIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotaW50IGlzX3NoaWZ0aW5nX3NpZ25lZCAobG9uZyBhcmcpCi0jZWxzZQotaW50IGlzX3NoaWZ0aW5nX3NpZ25lZCAoYXJnKQotICAgICBsb25nIGFyZzsKLSNlbmRpZgotLyogU2VlIHdoZXRoZXIgcmlnaHQtc2hpZnQgb24gYSBsb25nIGlzIHNpZ25lZCBvciBub3QuICovCi17Ci0gIGxvbmcgcmVzID0gYXJnID4+IDQ7Ci0KLSAgaWYgKHJlcyA9PSAtMHg3RjdFODBDTCkgewkvKiBleHBlY3RlZCByZXN1bHQgZm9yIHNpZ25lZCBzaGlmdCAqLwotICAgIHJldHVybiAxOwkJCS8qIHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCAqLwotICB9Ci0gIC8qIHNlZSBpZiB1bnNpZ25lZC1zaGlmdCBoYWNrIHdpbGwgZml4IGl0LiAqLwotICAvKiB3ZSBjYW4ndCBqdXN0IHRlc3QgZXhhY3QgdmFsdWUgc2luY2UgaXQgZGVwZW5kcyBvbiB3aWR0aCBvZiBsb25nLi4uICovCi0gIHJlcyB8PSAofjBMKSA8PCAoMzItNCk7Ci0gIGlmIChyZXMgPT0gLTB4N0Y3RTgwQ0wpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IG5vdz8gKi8KLSAgICByZXR1cm4gMDsJCQkvKiByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCAqLwotICB9Ci0gIHByaW50ZigiUmlnaHQgc2hpZnQgaXNuJ3QgYWN0aW5nIGFzIEkgZXhwZWN0IGl0IHRvLlxuIik7Ci0gIHByaW50ZigiSSBmZWFyIHRoZSBKUEVHIHNvZnR3YXJlIHdpbGwgbm90IHdvcmsgYXQgYWxsLlxuXG4iKTsKLSAgcmV0dXJuIDA7CQkJLyogdHJ5IGl0IHdpdGggdW5zaWduZWQgYW55d2F5ICovCi19Ci1tYWluKCkgewotICBleGl0KGlzX3NoaWZ0aW5nX3NpZ25lZCgtMHg3RjdFODBCMUwpKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVEIAotRU9GCi0KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRvIHNlZSBpZiBmb3BlbiBhY2NlcHRzIGIgc3BlYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM3NTogY2hlY2tpbmcgdG8gc2VlIGlmIGZvcGVuIGFjY2VwdHMgYiBzcGVjIiA+JjUKLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGVjaG8gIiRhY190IiJBc3N1bWluZyB0aGF0IGl0IGRvZXMuIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzODAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLW1haW4oKSB7Ci0gIGlmIChmb3BlbigiY29uZnRlc3RkYXRhIiwgIndiIikgIT0gTlVMTCkKLSAgICBleGl0KDApOwotICBleGl0KDEpOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzOTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBET05UX1VTRV9CX01PREUgCi1FT0YKLQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDM2OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIGluc3RhbGxic2Qgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgICMgT1NGLzEgaW5zdGFsbGJzZCBhbHNvIHVzZXMgZHNwbXNnLCBidXQgaXMgdXNhYmxlLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ4ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotIyBEZWNpZGUgd2hldGhlciB0byB1c2UgbGlidG9vbCwKLSMgYW5kIGlmIHNvIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkLCBzdGF0aWMsIG9yIGJvdGggZmxhdm9ycyBvZiBsaWJyYXJ5LgotTFRTSEFSRUQ9Im5vIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBMVFNIQVJFRD0iJGVuYWJsZXZhbCIKLWZpCi0KLUxUU1RBVElDPSJubyIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgTFRTVEFUSUM9IiRlbmFibGV2YWwiCi1maQotCi1pZiB0ZXN0ICJ4JExUU0hBUkVEIiAhPSB4bm8gIC1vICAieCRMVFNUQVRJQyIgIT0geG5vOyB0aGVuCi0gIFVTRUxJQlRPT0w9InllcyIKLSAgTElCVE9PTD0iLi9saWJ0b29sIgotICBPPSJsbyIKLSAgQT0ibGEiCi0gIExOPSckKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0MpJwotICBJTlNUQUxMX0xJQj0nJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAke0lOU1RBTEx9JwotICBJTlNUQUxMX1BST0dSQU09IlwkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICRJTlNUQUxMX1BST0dSQU0iCi1lbHNlCi0gIFVTRUxJQlRPT0w9Im5vIgotICBMSUJUT09MPSIiCi0gIE89Im8iCi0gIEE9ImEiCi0gIExOPSckKENDKScKLSAgSU5TVEFMTF9MSUI9IiRJTlNUQUxMX0RBVEEiCi1maQotCi0KLQotCi0KLQotIyBDb25maWd1cmUgbGlidG9vbCBpZiBuZWVkZWQuCi1pZiB0ZXN0ICRVU0VMSUJUT09MID0geWVzOyB0aGVuCi0gIGRpc2FibGVfc2hhcmVkPQotICBkaXNhYmxlX3N0YXRpYz0KLSAgaWYgdGVzdCAieCRMVFNIQVJFRCIgPSB4bm87IHRoZW4KLSAgICBkaXNhYmxlX3NoYXJlZD0iLS1kaXNhYmxlLXNoYXJlZCIKLSAgZmkKLSAgaWYgdGVzdCAieCRMVFNUQVRJQyIgPSB4bm87IHRoZW4KLSAgICBkaXNhYmxlX3N0YXRpYz0iLS1kaXNhYmxlLXN0YXRpYyIKLSAgZmkKLSAgJHNyY2Rpci9sdGNvbmZpZyAkZGlzYWJsZV9zaGFyZWQgJGRpc2FibGVfc3RhdGljICRzcmNkaXIvbHRtYWluLnNoCi1maQotCi0jIFNlbGVjdCBtZW1vcnkgbWFuYWdlciBkZXBlbmRpbmcgb24gdXNlciBpbnB1dC4KLSMgSWYgbm8gIi1lbmFibGUtbWF4bWVtIiwgdXNlIGptZW1ub2JzCi1NRU1PUllNR1I9J2ptZW1ub2JzLiQoTyknCi1NQVhNRU09Im5vIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1heG1lbSBvciAtLWRpc2FibGUtbWF4bWVtIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21heG1lbStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWF4bWVtIgotICBNQVhNRU09IiRlbmFibGV2YWwiCi1maQotCi0jIHN1cHBvcnQgLS13aXRoLW1heG1lbSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBJSkcgVjUuCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLW1heG1lbSBvciAtLXdpdGhvdXQtbWF4bWVtIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9tYXhtZW0rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfbWF4bWVtIgotICBNQVhNRU09IiR3aXRodmFsIgotZmkKLQotaWYgdGVzdCAieCRNQVhNRU0iID0geHllczsgdGhlbgotICBNQVhNRU09MQotZmkKLWlmIHRlc3QgIngkTUFYTUVNIiAhPSB4bm87IHRoZW4KLSAgaWYgdGVzdCAtbiAiYGVjaG8gJE1BWE1FTSB8IHNlZCAncy9bMC05XS8vZydgIjsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gLS1lbmFibGUtbWF4bWVtIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgREVGQVVMVE1BWE1FTT1gZXhwciAkTUFYTUVNIFwqIDEwNDg1NzZgCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBERUZBVUxUX01BWF9NRU0gJHtERUZBVUxUTUFYTUVNfQotRU9GCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAndG1wZmlsZSgpJyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU5NjogY2hlY2tpbmcgZm9yICd0bXBmaWxlKCknIiA+JjUKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1OTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci1pbnQgbWFpbigpIHsKLSBGSUxFICogdGZpbGUgPSB0bXBmaWxlKCk7IAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLU1FTU9SWU1HUj0nam1lbWFuc2kuJChPKScKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1NRU1PUllNR1I9J2ptZW1uYW1lLiQoTyknCi1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUiAKLUVPRgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJ21rdGVtcCgpJyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYyMDogY2hlY2tpbmcgZm9yICdta3RlbXAoKSciID4mNQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotIGNoYXIgZm5hbWVbODBdOyBta3RlbXAoZm5hbWUpOyAKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5PX01LVEVNUCAKLUVPRgotCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0KLSMgRXh0cmFjdCB0aGUgbGlicmFyeSB2ZXJzaW9uIElEIGZyb20ganBlZ2xpYi5oLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgbGlianBlZyB2ZXJzaW9uIG51bWJlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY1MDogY2hlY2tpbmcgbGlianBlZyB2ZXJzaW9uIG51bWJlciIgPiY1Ci1KUEVHX0xJQl9WRVJTSU9OPWBzZWQgLWUgJy9eI2RlZmluZSBKUEVHX0xJQl9WRVJTSU9OLyFkJyAtZSAncy9eW14wLTldKlwoWzAtOV1bMC05XSpcKS4qJC9cMS8nICRzcmNkaXIvanBlZ2xpYi5oYAotZWNobyAiJGFjX3QiIiRKUEVHX0xJQl9WRVJTSU9OIiAxPiY2Ci0KLQotIyBQcmVwYXJlIHRvIG1hc3NhZ2UgbWFrZWZpbGUuY2ZnIGNvcnJlY3RseS4KLWlmIHRlc3QgJGlqZ19jdl9oYXZlX3Byb3RvdHlwZXMgPSB5ZXM7IHRoZW4KLSAgQTJLX0RFUFM9IiIKLSAgQ09NX0EySz0iIyAiCi1lbHNlCi0gIEEyS19ERVBTPSJhbnNpMmtuciIKLSAgQ09NX0EySz0iIgotZmkKLQotCi0jIGFuc2kya25yIG5lZWRzIC1EQlNEIGlmIHN0cmluZy5oIGlzIG1pc3NpbmcKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdHJpbmdfaCA9IG5vOyB0aGVuCi0gIEFOU0kyS05SRkxBR1M9Ii1EQlNEIgotZWxzZQotICBBTlNJMktOUkZMQUdTPSIiCi1maQotCi0jIFN1YnN0aXR1dGlvbnMgdG8gZW5hYmxlIG9yIGRpc2FibGUgbGlidG9vbC1yZWxhdGVkIHN0dWZmCi1pZiB0ZXN0ICRVU0VMSUJUT09MID0geWVzIC1hICRpamdfY3ZfaGF2ZV9wcm90b3R5cGVzID0geWVzOyB0aGVuCi0gIENPTV9MVD0iIgotZWxzZQotICBDT01fTFQ9IiMgIgotZmkKLQotaWYgdGVzdCAieCRMVFNIQVJFRCIgIT0geG5vOyB0aGVuCi0gIEZPUkNFX0lOU1RBTExfTElCPSJpbnN0YWxsLWxpYiIKLWVsc2UKLSAgRk9SQ0VfSU5TVEFMTF9MSUI9IiIKLWZpCi0KLSMgU2V0IHVwIC1JIGRpcmVjdGl2ZXMKLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIElOQ0xVREVGTEFHUz0nLUkkKHNyY2RpciknCi1lbHNlCi0gIElOQ0xVREVGTEFHUz0nLUkuIC1JJChzcmNkaXIpJwotZmkKLQotdHJhcCAnJyAxIDIgMTUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGU6bWFrZWZpbGUuY2ZnIGpjb25maWcuaDpqY29uZmlnLmNmZyIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAQ0NAJSRDQyVnCi1zJUBDUFBAJSRDUFAlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVAT0AlJE8lZwotcyVAQUAlJEElZwotcyVATE5AJSRMTiVnCi1zJUBJTlNUQUxMX0xJQkAlJElOU1RBTExfTElCJWcKLXMlQE1FTU9SWU1HUkAlJE1FTU9SWU1HUiVnCi1zJUBKUEVHX0xJQl9WRVJTSU9OQCUkSlBFR19MSUJfVkVSU0lPTiVnCi1zJUBBMktfREVQU0AlJEEyS19ERVBTJWcKLXMlQENPTV9BMktAJSRDT01fQTJLJWcKLXMlQEFOU0kyS05SRkxBR1NAJSRBTlNJMktOUkZMQUdTJWcKLXMlQENPTV9MVEAlJENPTV9MVCVnCi1zJUBGT1JDRV9JTlNUQUxMX0xJQkAlJEZPUkNFX0lOU1RBTExfTElCJWcKLXMlQElOQ0xVREVGTEFHU0AlJElOQ0xVREVGTEFHUyVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZTptYWtlZmlsZS5jZmcifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9Impjb25maWcuaDpqY29uZmlnLmNmZyIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9kanBlZy4xIGIvbGlianBlZ3R3cnAvZGpwZWcuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiZWI2YS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9kanBlZy4xCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS5USCBESlBFRyAxICIyMiBBdWd1c3QgMTk5NyIKLS5TSCBOQU1FCi1kanBlZyBcLSBkZWNvbXByZXNzIGEgSlBFRyBmaWxlIHRvIGFuIGltYWdlIGZpbGUKLS5TSCBTWU5PUFNJUwotLkIgZGpwZWcKLVsKLS5JIG9wdGlvbnMKLV0KLVsKLS5JIGZpbGVuYW1lCi1dCi0uTFAKLS5TSCBERVNDUklQVElPTgotLkxQCi0uQiBkanBlZwotZGVjb21wcmVzc2VzIHRoZSBuYW1lZCBKUEVHIGZpbGUsIG9yIHRoZSBzdGFuZGFyZCBpbnB1dCBpZiBubyBmaWxlIGlzIG5hbWVkLAotYW5kIHByb2R1Y2VzIGFuIGltYWdlIGZpbGUgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4gIFBCTVBMVVMgKFBQTS9QR00pLCBCTVAsCi1HSUYsIFRhcmdhLCBvciBSTEUgKFV0YWggUmFzdGVyIFRvb2xraXQpIG91dHB1dCBmb3JtYXQgY2FuIGJlIHNlbGVjdGVkLgotKFJMRSBpcyBzdXBwb3J0ZWQgb25seSBpZiB0aGUgVVJUIGxpYnJhcnkgaXMgYXZhaWxhYmxlLikKLS5TSCBPUFRJT05TCi1BbGwgc3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZDsgZm9yIGV4YW1wbGUsCi0uQiBcLWdyYXlzY2FsZQotbWF5IGJlIHdyaXR0ZW4KLS5CIFwtZ3JheQotb3IKLS5CUiBcLWdyIC4KLU1vc3Qgb2YgdGhlICJiYXNpYyIgc3dpdGNoZXMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIGFzIGxpdHRsZSBhcyBvbmUgbGV0dGVyLgotVXBwZXIgYW5kIGxvd2VyIGNhc2UgYXJlIGVxdWl2YWxlbnQgKHRodXMKLS5CIFwtQk1QCi1pcyB0aGUgc2FtZSBhcwotLkJSIFwtYm1wICkuCi1Ccml0aXNoIHNwZWxsaW5ncyBhcmUgYWxzbyBhY2NlcHRlZCAoZS5nLiwKLS5CUiBcLWdyZXlzY2FsZSApLAotdGhvdWdoIGZvciBicmV2aXR5IHRoZXNlIGFyZSBub3QgbWVudGlvbmVkIGJlbG93LgotLlBQCi1UaGUgYmFzaWMgc3dpdGNoZXMgYXJlOgotLlRQCi0uQkkgXC1jb2xvcnMgIiBOIgotUmVkdWNlIGltYWdlIHRvIGF0IG1vc3QgTiBjb2xvcnMuICBUaGlzIHJlZHVjZXMgdGhlIG51bWJlciBvZiBjb2xvcnMgdXNlZCBpbgotdGhlIG91dHB1dCBpbWFnZSwgc28gdGhhdCBpdCBjYW4gYmUgZGlzcGxheWVkIG9uIGEgY29sb3JtYXBwZWQgZGlzcGxheSBvcgotc3RvcmVkIGluIGEgY29sb3JtYXBwZWQgZmlsZSBmb3JtYXQuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYW4gOC1iaXQKLWRpc3BsYXksIHlvdSdkIG5lZWQgdG8gcmVkdWNlIHRvIDI1NiBvciBmZXdlciBjb2xvcnMuCi0uVFAKLS5CSSBcLXF1YW50aXplICIgTiIKLVNhbWUgYXMKLS5CUiBcLWNvbG9ycyAuCi0uQiBcLWNvbG9ycwotaXMgdGhlIHJlY29tbWVuZGVkIG5hbWUsCi0uQiBcLXF1YW50aXplCi1pcyBwcm92aWRlZCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLS5UUAotLkIgXC1mYXN0Ci1TZWxlY3QgcmVjb21tZW5kZWQgcHJvY2Vzc2luZyBvcHRpb25zIGZvciBmYXN0LCBsb3cgcXVhbGl0eSBvdXRwdXQuICAoVGhlCi1kZWZhdWx0IG9wdGlvbnMgYXJlIGNob3NlbiBmb3IgaGlnaGVzdCBxdWFsaXR5IG91dHB1dC4pICBDdXJyZW50bHksIHRoaXMgaXMKLWVxdWl2YWxlbnQgdG8gXGZCXC1kY3QgZmFzdCBcLW5vc21vb3RoIFwtb25lcGFzcyBcLWRpdGhlciBvcmRlcmVkXGZSLgotLlRQCi0uQiBcLWdyYXlzY2FsZQotRm9yY2UgZ3JheS1zY2FsZSBvdXRwdXQgZXZlbiBpZiBKUEVHIGZpbGUgaXMgY29sb3IuICBVc2VmdWwgZm9yIHZpZXdpbmcgb24KLW1vbm9jaHJvbWUgZGlzcGxheXM7IGFsc28sCi0uQiBkanBlZwotcnVucyBub3RpY2VhYmx5IGZhc3RlciBpbiB0aGlzIG1vZGUuCi0uVFAKLS5CSSBcLXNjYWxlICIgTS9OIgotU2NhbGUgdGhlIG91dHB1dCBpbWFnZSBieSBhIGZhY3RvciBNL04uICBDdXJyZW50bHkgdGhlIHNjYWxlIGZhY3RvciBtdXN0IGJlCi0xLzEsIDEvMiwgMS80LCBvciAxLzguICBTY2FsaW5nIGlzIGhhbmR5IGlmIHRoZSBpbWFnZSBpcyBsYXJnZXIgdGhhbiB5b3VyCi1zY3JlZW47IGFsc28sCi0uQiBkanBlZwotcnVucyBtdWNoIGZhc3RlciB3aGVuIHNjYWxpbmcgZG93biB0aGUgb3V0cHV0LgotLlRQCi0uQiBcLWJtcAotU2VsZWN0IEJNUCBvdXRwdXQgZm9ybWF0IChXaW5kb3dzIGZsYXZvcikuICA4LWJpdCBjb2xvcm1hcHBlZCBmb3JtYXQgaXMKLWVtaXR0ZWQgaWYKLS5CIFwtY29sb3JzCi1vcgotLkIgXC1ncmF5c2NhbGUKLWlzIHNwZWNpZmllZCwgb3IgaWYgdGhlIEpQRUcgZmlsZSBpcyBncmF5LXNjYWxlOyBvdGhlcndpc2UsIDI0LWJpdCBmdWxsLWNvbG9yCi1mb3JtYXQgaXMgZW1pdHRlZC4KLS5UUAotLkIgXC1naWYKLVNlbGVjdCBHSUYgb3V0cHV0IGZvcm1hdC4gIFNpbmNlIEdJRiBkb2VzIG5vdCBzdXBwb3J0IG1vcmUgdGhhbiAyNTYgY29sb3JzLAotLkIgXC1jb2xvcnMgMjU2Ci1pcyBhc3N1bWVkICh1bmxlc3MgeW91IHNwZWNpZnkgYSBzbWFsbGVyIG51bWJlciBvZiBjb2xvcnMpLgotLlRQCi0uQiBcLW9zMgotU2VsZWN0IEJNUCBvdXRwdXQgZm9ybWF0IChPUy8yIDEueCBmbGF2b3IpLiAgOC1iaXQgY29sb3JtYXBwZWQgZm9ybWF0IGlzCi1lbWl0dGVkIGlmCi0uQiBcLWNvbG9ycwotb3IKLS5CIFwtZ3JheXNjYWxlCi1pcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZTsgb3RoZXJ3aXNlLCAyNC1iaXQgZnVsbC1jb2xvcgotZm9ybWF0IGlzIGVtaXR0ZWQuCi0uVFAKLS5CIFwtcG5tCi1TZWxlY3QgUEJNUExVUyAoUFBNL1BHTSkgb3V0cHV0IGZvcm1hdCAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtYXQpLgotUEdNIGlzIGVtaXR0ZWQgaWYgdGhlIEpQRUcgZmlsZSBpcyBncmF5LXNjYWxlIG9yIGlmCi0uQiBcLWdyYXlzY2FsZQotaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UgUFBNIGlzIGVtaXR0ZWQuCi0uVFAKLS5CIFwtcmxlCi1TZWxlY3QgUkxFIG91dHB1dCBmb3JtYXQuICAoUmVxdWlyZXMgVVJUIGxpYnJhcnkuKQotLlRQCi0uQiBcLXRhcmdhCi1TZWxlY3QgVGFyZ2Egb3V0cHV0IGZvcm1hdC4gIEdyYXktc2NhbGUgZm9ybWF0IGlzIGVtaXR0ZWQgaWYgdGhlIEpQRUcgZmlsZSBpcwotZ3JheS1zY2FsZSBvciBpZgotLkIgXC1ncmF5c2NhbGUKLWlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlLCBjb2xvcm1hcHBlZCBmb3JtYXQgaXMgZW1pdHRlZCBpZgotLkIgXC1jb2xvcnMKLWlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlLCAyNC1iaXQgZnVsbC1jb2xvciBmb3JtYXQgaXMgZW1pdHRlZC4KLS5QUAotU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOgotLlRQCi0uQiBcLWRjdCBpbnQKLVVzZSBpbnRlZ2VyIERDVCBtZXRob2QgKGRlZmF1bHQpLgotLlRQCi0uQiBcLWRjdCBmYXN0Ci1Vc2UgZmFzdCBpbnRlZ2VyIERDVCAobGVzcyBhY2N1cmF0ZSkuCi0uVFAKLS5CIFwtZGN0IGZsb2F0Ci1Vc2UgZmxvYXRpbmctcG9pbnQgRENUIG1ldGhvZC4KLVRoZSBmbG9hdCBtZXRob2QgaXMgdmVyeSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIGludCBtZXRob2QsIGJ1dCBpcwotbXVjaCBzbG93ZXIgdW5sZXNzIHlvdXIgbWFjaGluZSBoYXMgdmVyeSBmYXN0IGZsb2F0aW5nLXBvaW50IGhhcmR3YXJlLiAgQWxzbwotbm90ZSB0aGF0IHJlc3VsdHMgb2YgdGhlIGZsb2F0aW5nLXBvaW50IG1ldGhvZCBtYXkgdmFyeSBzbGlnaHRseSBhY3Jvc3MKLW1hY2hpbmVzLCB3aGlsZSB0aGUgaW50ZWdlciBtZXRob2RzIHNob3VsZCBnaXZlIHRoZSBzYW1lIHJlc3VsdHMgZXZlcnl3aGVyZS4KLVRoZSBmYXN0IGludGVnZXIgbWV0aG9kIGlzIG11Y2ggbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBvdGhlciB0d28uCi0uVFAKLS5CIFwtZGl0aGVyIGZzCi1Vc2UgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCi0uVFAKLS5CIFwtZGl0aGVyIG9yZGVyZWQKLVVzZSBvcmRlcmVkIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCi0uVFAKLS5CIFwtZGl0aGVyIG5vbmUKLURvIG5vdCB1c2UgZGl0aGVyaW5nIGluIGNvbG9yIHF1YW50aXphdGlvbi4KLUJ5IGRlZmF1bHQsIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgaXMgYXBwbGllZCB3aGVuIHF1YW50aXppbmcgY29sb3JzOyB0aGlzCi1pcyBzbG93IGJ1dCB1c3VhbGx5IHByb2R1Y2VzIHRoZSBiZXN0IHJlc3VsdHMuICBPcmRlcmVkIGRpdGhlciBpcyBhIGNvbXByb21pc2UKLWJldHdlZW4gc3BlZWQgYW5kIHF1YWxpdHk7IG5vIGRpdGhlcmluZyBpcyBmYXN0IGJ1dCB1c3VhbGx5IGxvb2tzIGF3ZnVsLiAgTm90ZQotdGhhdCB0aGVzZSBzd2l0Y2hlcyBoYXZlIG5vIGVmZmVjdCB1bmxlc3MgY29sb3IgcXVhbnRpemF0aW9uIGlzIGJlaW5nIGRvbmUuCi1PcmRlcmVkIGRpdGhlciBpcyBvbmx5IGF2YWlsYWJsZSBpbgotLkIgXC1vbmVwYXNzCi1tb2RlLgotLlRQCi0uQkkgXC1tYXAgIiBmaWxlIgotUXVhbnRpemUgdG8gdGhlIGNvbG9ycyB1c2VkIGluIHRoZSBzcGVjaWZpZWQgaW1hZ2UgZmlsZS4gIFRoaXMgaXMgdXNlZnVsIGZvcgotcHJvZHVjaW5nIG11bHRpcGxlIGZpbGVzIHdpdGggaWRlbnRpY2FsIGNvbG9yIG1hcHMsIG9yIGZvciBmb3JjaW5nIGEKLXByZWRlZmluZWQgc2V0IG9mIGNvbG9ycyB0byBiZSB1c2VkLiAgVGhlCi0uSSBmaWxlCi1tdXN0IGJlIGEgR0lGIG9yIFBQTSBmaWxlLiBUaGlzIG9wdGlvbiBvdmVycmlkZXMKLS5CIFwtY29sb3JzCi1hbmQKLS5CUiBcLW9uZXBhc3MgLgotLlRQCi0uQiBcLW5vc21vb3RoCi1Vc2UgYSBmYXN0ZXIsIGxvd2VyLXF1YWxpdHkgdXBzYW1wbGluZyByb3V0aW5lLgotLlRQCi0uQiBcLW9uZXBhc3MKLVVzZSBvbmUtcGFzcyBpbnN0ZWFkIG9mIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbi4gIFRoZSBvbmUtcGFzcyBtZXRob2QgaXMKLWZhc3RlciBhbmQgbmVlZHMgbGVzcyBtZW1vcnksIGJ1dCBpdCBwcm9kdWNlcyBhIGxvd2VyLXF1YWxpdHkgaW1hZ2UuCi0uQiBcLW9uZXBhc3MKLWlzIGlnbm9yZWQgdW5sZXNzIHlvdSBhbHNvIHNheQotLkIgXC1jb2xvcnMKLS5JUiBOIC4KLUFsc28sIHRoZSBvbmUtcGFzcyBtZXRob2QgaXMgYWx3YXlzIHVzZWQgZm9yIGdyYXktc2NhbGUgb3V0cHV0ICh0aGUgdHdvLXBhc3MKLW1ldGhvZCBpcyBubyBpbXByb3ZlbWVudCB0aGVuKS4KLS5UUAotLkJJIFwtbWF4bWVtb3J5ICIgTiIKLVNldCBsaW1pdCBmb3IgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgaW4gcHJvY2Vzc2luZyBsYXJnZSBpbWFnZXMuICBWYWx1ZSBpcwotaW4gdGhvdXNhbmRzIG9mIGJ5dGVzLCBvciBtaWxsaW9ucyBvZiBieXRlcyBpZiAiTSIgaXMgYXR0YWNoZWQgdG8gdGhlCi1udW1iZXIuICBGb3IgZXhhbXBsZSwKLS5CIFwtbWF4IDRtCi1zZWxlY3RzIDQwMDAwMDAgYnl0ZXMuICBJZiBtb3JlIHNwYWNlIGlzIG5lZWRlZCwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4KLS5UUAotLkJJIFwtb3V0ZmlsZSAiIG5hbWUiCi1TZW5kIG91dHB1dCBpbWFnZSB0byB0aGUgbmFtZWQgZmlsZSwgbm90IHRvIHN0YW5kYXJkIG91dHB1dC4KLS5UUAotLkIgXC12ZXJib3NlCi1FbmFibGUgZGVidWcgcHJpbnRvdXQuICBNb3JlCi0uQlIgXC12ICdzCi1naXZlIG1vcmUgb3V0cHV0LiAgQWxzbywgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBwcmludGVkIGF0IHN0YXJ0dXAuCi0uVFAKLS5CIFwtZGVidWcKLVNhbWUgYXMKLS5CUiBcLXZlcmJvc2UgLgotLlNIIEVYQU1QTEVTCi0uTFAKLVRoaXMgZXhhbXBsZSBkZWNvbXByZXNzZXMgdGhlIEpQRUcgZmlsZSBmb28uanBnLCBxdWFudGl6ZXMgaXQgdG8KLTI1NiBjb2xvcnMsIGFuZCBzYXZlcyB0aGUgb3V0cHV0IGluIDgtYml0IEJNUCBmb3JtYXQgaW4gZm9vLmJtcDoKLS5JUAotLkIgZGpwZWcgXC1jb2xvcnMgMjU2IFwtYm1wCi0uSSBmb28uanBnCi0uQiA+Ci0uSSBmb28uYm1wCi0uU0ggSElOVFMKLVRvIGdldCBhIHF1aWNrIHByZXZpZXcgb2YgYW4gaW1hZ2UsIHVzZSB0aGUKLS5CIFwtZ3JheXNjYWxlCi1hbmQvb3IKLS5CIFwtc2NhbGUKLXN3aXRjaGVzLgotLkIgXC1ncmF5c2NhbGUgXC1zY2FsZSAxLzgKLWlzIHRoZSBmYXN0ZXN0IGNhc2UuCi0uUFAKLVNldmVyYWwgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHRoYXQgdHJhZGUgb2ZmIGltYWdlIHF1YWxpdHkgdG8gZ2FpbiBzcGVlZC4KLS5CIFwtZmFzdAotdHVybnMgb24gdGhlIHJlY29tbWVuZGVkIHNldHRpbmdzLgotLlBQCi0uQiBcLWRjdCBmYXN0Ci1hbmQvb3IKLS5CIFwtbm9zbW9vdGgKLWdhaW4gc3BlZWQgYXQgYSBzbWFsbCBzYWNyaWZpY2UgaW4gcXVhbGl0eS4KLVdoZW4gcHJvZHVjaW5nIGEgY29sb3ItcXVhbnRpemVkIGltYWdlLAotLkIgXC1vbmVwYXNzIFwtZGl0aGVyIG9yZGVyZWQKLWlzIGZhc3QgYnV0IG11Y2ggbG93ZXIgcXVhbGl0eSB0aGFuIHRoZSBkZWZhdWx0IGJlaGF2aW9yLgotLkIgXC1kaXRoZXIgbm9uZQotbWF5IGdpdmUgYWNjZXB0YWJsZSByZXN1bHRzIGluIHR3by1wYXNzIG1vZGUsIGJ1dCBpcyBzZWxkb20gdG9sZXJhYmxlIGluCi1vbmUtcGFzcyBtb2RlLgotLlBQCi1JZiB5b3UgYXJlIGZvcnR1bmF0ZSBlbm91Z2ggdG8gaGF2ZSB2ZXJ5IGZhc3QgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUsCi1cZkJcLWRjdCBmbG9hdFxmUiBtYXkgYmUgZXZlbiBmYXN0ZXIgdGhhbiBcZkJcLWRjdCBmYXN0XGZSLiAgQnV0IG9uIG1vc3QKLW1hY2hpbmVzIFxmQlwtZGN0IGZsb2F0XGZSIGlzIHNsb3dlciB0aGFuIFxmQlwtZGN0IGludFxmUjsgaW4gdGhpcyBjYXNlIGl0IGlzCi1ub3Qgd29ydGggdXNpbmcsIGJlY2F1c2UgaXRzIHRoZW9yZXRpY2FsIGFjY3VyYWN5IGFkdmFudGFnZSBpcyB0b28gc21hbGwgdG8gYmUKLXNpZ25pZmljYW50IGluIHByYWN0aWNlLgotLlNIIEVOVklST05NRU5UCi0uVFAKLS5CIEpQRUdNRU0KLUlmIHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCBpdHMgdmFsdWUgaXMgdGhlIGRlZmF1bHQgbWVtb3J5IGxpbWl0LgotVGhlIHZhbHVlIGlzIHNwZWNpZmllZCBhcyBkZXNjcmliZWQgZm9yIHRoZQotLkIgXC1tYXhtZW1vcnkKLXN3aXRjaC4KLS5CIEpQRUdNRU0KLW92ZXJyaWRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBzcGVjaWZpZWQgd2hlbiB0aGUgcHJvZ3JhbSB3YXMgY29tcGlsZWQsIGFuZAotaXRzZWxmIGlzIG92ZXJyaWRkZW4gYnkgYW4gZXhwbGljaXQKLS5CUiBcLW1heG1lbW9yeSAuCi0uU0ggU0VFIEFMU08KLS5CUiBjanBlZyAoMSksCi0uQlIganBlZ3RyYW4gKDEpLAotLkJSIHJkanBnY29tICgxKSwKLS5CUiB3cmpwZ2NvbSAoMSkKLS5icgotLkJSIHBwbSAoNSksCi0uQlIgcGdtICg1KQotLmJyCi1XYWxsYWNlLCBHcmVnb3J5IEsuICAiVGhlIEpQRUcgU3RpbGwgUGljdHVyZSBDb21wcmVzc2lvbiBTdGFuZGFyZCIsCi1Db21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCBBcHJpbCAxOTkxICh2b2wuIDM0LCBuby4gNCksIHBwLiAzMC00NC4KLS5TSCBBVVRIT1IKLUluZGVwZW5kZW50IEpQRUcgR3JvdXAKLS5TSCBCVUdTCi1Bcml0aG1ldGljIGNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLgotLlBQCi1UbyBhdm9pZCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsCi0uQiBkanBlZwotcHJvZHVjZXMgdW5jb21wcmVzc2VkIEdJRiBmaWxlcy4gIFRoZXNlIGFyZSBsYXJnZXIgdGhhbiB0aGV5IHNob3VsZCBiZSwgYnV0Ci1hcmUgcmVhZGFibGUgYnkgc3RhbmRhcmQgR0lGIGRlY29kZXJzLgotLlBQCi1TdGlsbCBub3QgYXMgZmFzdCBhcyB3ZSdkIGxpa2UuCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9kanBlZy5jIGIvbGlianBlZ3R3cnAvZGpwZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5OWU5MC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9kanBlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE2ICswLDAgQEAKLS8qCi0gKiBkanBlZy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYSBjb21tYW5kLWxpbmUgdXNlciBpbnRlcmZhY2UgZm9yIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KLSAqIEl0IHNob3VsZCB3b3JrIG9uIGFueSBzeXN0ZW0gd2l0aCBVbml4LSBvciBNUy1ET1Mtc3R5bGUgY29tbWFuZCBsaW5lcy4KLSAqCi0gKiBUd28gZGlmZmVyZW50IGNvbW1hbmQgbGluZSBzdHlsZXMgYXJlIHBlcm1pdHRlZCwgZGVwZW5kaW5nIG9uIHRoZQotICogY29tcGlsZS10aW1lIHN3aXRjaCBUV09fRklMRV9DT01NQU5ETElORToKLSAqCWRqcGVnIFtvcHRpb25zXSAgaW5wdXRmaWxlIG91dHB1dGZpbGUKLSAqCWRqcGVnIFtvcHRpb25zXSAgW2lucHV0ZmlsZV0KLSAqIEluIHRoZSBzZWNvbmQgc3R5bGUsIG91dHB1dCBpcyBhbHdheXMgdG8gc3RhbmRhcmQgb3V0cHV0LCB3aGljaCB5b3UnZAotICogbm9ybWFsbHkgcmVkaXJlY3QgdG8gYSBmaWxlIG9yIHBpcGUgdG8gc29tZSBvdGhlciBwcm9ncmFtLiAgSW5wdXQgaXMKLSAqIGVpdGhlciBmcm9tIGEgbmFtZWQgZmlsZSBvciBmcm9tIHN0YW5kYXJkIGlucHV0ICh0eXBpY2FsbHkgcmVkaXJlY3RlZCkuCi0gKiBUaGUgc2Vjb25kIHN0eWxlIGlzIGNvbnZlbmllbnQgb24gVW5peCBidXQgaXMgdW5oZWxwZnVsIG9uIHN5c3RlbXMgdGhhdAotICogZG9uJ3Qgc3VwcG9ydCBwaXBlcy4gIEFsc28sIHlvdSBNVVNUIHVzZSB0aGUgZmlyc3Qgc3R5bGUgaWYgeW91ciBzeXN0ZW0KLSAqIGRvZXNuJ3QgZG8gYmluYXJ5IEkvTyB0byBzdGRpbi9zdGRvdXQuCi0gKiBUbyBzaW1wbGlmeSBzY3JpcHQgd3JpdGluZywgdGhlICItb3V0ZmlsZSIgc3dpdGNoIGlzIHByb3ZpZGVkLiAgVGhlIHN5bnRheAotICoJZGpwZWcgW29wdGlvbnNdICAtb3V0ZmlsZSBvdXRwdXRmaWxlICBpbnB1dGZpbGUKLSAqIHdvcmtzIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggY29tbWFuZCBsaW5lIHN0eWxlIGlzIHVzZWQuCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLSNpbmNsdWRlICJqdmVyc2lvbi5oIgkJLyogZm9yIHZlcnNpb24gbWVzc2FnZSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXNwcmludCgpICovCi0KLSNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLwotI2lmZGVmIF9fTVdFUktTX18KLSNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCi0jZW5kaWYKLSNpZmRlZiBUSElOS19DCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLwotI2VuZGlmCi0jZW5kaWYKLQotCi0vKiBDcmVhdGUgdGhlIGFkZC1vbiBtZXNzYWdlIHN0cmluZyB0YWJsZS4gKi8KLQotI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykJc3RyaW5nICwKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGpwZWdfbWVzc2FnZV90YWJsZVtdID0gewotI2luY2x1ZGUgImNkZXJyb3IuaCIKLSAgTlVMTAotfTsKLQotCi0vKgotICogVGhpcyBsaXN0IGRlZmluZXMgdGhlIGtub3duIG91dHB1dCBpbWFnZSBmb3JtYXRzCi0gKiAobm90IGFsbCBvZiB3aGljaCBuZWVkIGJlIHN1cHBvcnRlZCBieSBhIGdpdmVuIHZlcnNpb24pLgotICogWW91IGNhbiBjaGFuZ2UgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCBieSBkZWZpbmluZyBERUZBVUxUX0ZNVDsKLSAqIGluZGVlZCwgeW91IGhhZCBiZXR0ZXIgZG8gc28gaWYgeW91IHVuZGVmaW5lIFBQTV9TVVBQT1JURUQuCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlGTVRfQk1QLAkJLyogQk1QIGZvcm1hdCAoV2luZG93cyBmbGF2b3IpICovCi0JRk1UX0dJRiwJCS8qIEdJRiBmb3JtYXQgKi8KLQlGTVRfT1MyLAkJLyogQk1QIGZvcm1hdCAoT1MvMiBmbGF2b3IpICovCi0JRk1UX1BQTSwJCS8qIFBQTS9QR00gKFBCTVBMVVMgZm9ybWF0cykgKi8KLQlGTVRfUkxFLAkJLyogUkxFIGZvcm1hdCAqLwotCUZNVF9UQVJHQSwJCS8qIFRhcmdhIGZvcm1hdCAqLwotCUZNVF9USUZGCQkvKiBUSUZGIGZvcm1hdCAqLwotfSBJTUFHRV9GT1JNQVRTOwotCi0jaWZuZGVmIERFRkFVTFRfRk1UCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBDRkxBR1MgaW4gTWFrZWZpbGUgKi8KLSNkZWZpbmUgREVGQVVMVF9GTVQJRk1UX1BQTQotI2VuZGlmCi0KLXN0YXRpYyBJTUFHRV9GT1JNQVRTIHJlcXVlc3RlZF9mbXQ7Ci0KLQotLyoKLSAqIEFyZ3VtZW50LXBhcnNpbmcgY29kZS4KLSAqIFRoZSBzd2l0Y2ggcGFyc2VyIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWZ1bCB3aXRoIERPUy1zdHlsZSBjb21tYW5kIGxpbmUKLSAqIHN5bnRheCwgaWUsIGludGVybWl4ZWQgc3dpdGNoZXMgYW5kIGZpbGUgbmFtZXMsIHdoZXJlIG9ubHkgdGhlIHN3aXRjaGVzCi0gKiB0byB0aGUgbGVmdCBvZiBhIGdpdmVuIGZpbGUgbmFtZSBhZmZlY3QgcHJvY2Vzc2luZyBvZiB0aGF0IGZpbGUuCi0gKiBUaGUgbWFpbiBwcm9ncmFtIGluIHRoaXMgZmlsZSBkb2Vzbid0IGFjdHVhbGx5IHVzZSB0aGlzIGNhcGFiaWxpdHkuLi4KLSAqLwotCi0KLXN0YXRpYyBjb25zdCBjaGFyICogcHJvZ25hbWU7CS8qIHByb2dyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KLXN0YXRpYyBjaGFyICogb3V0ZmlsZW5hbWU7CS8qIGZvciAtb3V0ZmlsZSBzd2l0Y2ggKi8KLQotCi1MT0NBTCh2b2lkKQotdXNhZ2UgKHZvaWQpCi0vKiBjb21wbGFpbiBhYm91dCBiYWQgY29tbWFuZCBsaW5lICovCi17Ci0gIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFtzd2l0Y2hlc10gIiwgcHJvZ25hbWUpOwotI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0gIGZwcmludGYoc3RkZXJyLCAiaW5wdXRmaWxlIG91dHB1dGZpbGVcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihzdGRlcnIsICJbaW5wdXRmaWxlXVxuIik7Ci0jZW5kaWYKLQotICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtY29sb3JzIE4gICAgICBSZWR1Y2UgaW1hZ2UgdG8gbm8gbW9yZSB0aGFuIE4gY29sb3JzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1mYXN0ICAgICAgICAgIEZhc3QsIGxvdy1xdWFsaXR5IHByb2Nlc3NpbmdcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdyYXlzY2FsZSAgICAgRm9yY2UgZ3JheXNjYWxlIG91dHB1dFxuIik7Ci0jaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNjYWxlIE0vTiAgICAgU2NhbGUgb3V0cHV0IGltYWdlIGJ5IGZyYWN0aW9uIE0vTiwgZWcsIDEvOFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBCTVBfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtYm1wICAgICAgICAgICBTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKFdpbmRvd3Mgc3R5bGUpJXNcbiIsCi0JICAoREVGQVVMVF9GTVQgPT0gRk1UX0JNUCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBHSUZfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtZ2lmICAgICAgICAgICBTZWxlY3QgR0lGIG91dHB1dCBmb3JtYXQlc1xuIiwKLQkgIChERUZBVUxUX0ZNVCA9PSBGTVRfR0lGID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIEJNUF9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vczIgICAgICAgICAgIFNlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoT1MvMiBzdHlsZSklc1xuIiwKLQkgIChERUZBVUxUX0ZNVCA9PSBGTVRfT1MyID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIFBQTV9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1wbm0gICAgICAgICAgIFNlbGVjdCBQQk1QTFVTIChQUE0vUEdNKSBvdXRwdXQgZm9ybWF0JXNcbiIsCi0JICAoREVGQVVMVF9GTVQgPT0gRk1UX1BQTSA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBSTEVfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtcmxlICAgICAgICAgICBTZWxlY3QgVXRhaCBSTEUgb3V0cHV0IGZvcm1hdCVzXG4iLAotCSAgKERFRkFVTFRfRk1UID09IEZNVF9STEUgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0jaWZkZWYgVEFSR0FfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtdGFyZ2EgICAgICAgICBTZWxlY3QgVGFyZ2Egb3V0cHV0IGZvcm1hdCVzXG4iLAotCSAgKERFRkFVTFRfRk1UID09IEZNVF9UQVJHQSA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6XG4iKTsKLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGludCAgICAgICBVc2UgaW50ZWdlciBEQ1QgbWV0aG9kJXNcbiIsCi0JICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfSVNMT1cgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBmYXN0ICAgICAgVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpJXNcbiIsCi0JICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfSUZBU1QgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBmbG9hdCAgICAgVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2Qlc1xuIiwKLQkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9GTE9BVCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kaXRoZXIgZnMgICAgIFVzZSBGLVMgZGl0aGVyaW5nIChkZWZhdWx0KVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtZGl0aGVyIG5vbmUgICBEb24ndCB1c2UgZGl0aGVyaW5nIGluIHF1YW50aXphdGlvblxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtZGl0aGVyIG9yZGVyZWQgIFVzZSBvcmRlcmVkIGRpdGhlciAobWVkaXVtIHNwZWVkLCBxdWFsaXR5KVxuIik7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtbWFwIEZJTEUgICAgICBNYXAgdG8gY29sb3JzIHVzZWQgaW4gbmFtZWQgaW1hZ2UgZmlsZVxuIik7Ci0jZW5kaWYKLSAgZnByaW50ZihzdGRlcnIsICIgIC1ub3Ntb290aCAgICAgIERvbid0IHVzZSBoaWdoLXF1YWxpdHkgdXBzYW1wbGluZ1xuIik7Ci0jaWZkZWYgUVVBTlRfMVBBU1NfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtb25lcGFzcyAgICAgICBVc2UgMS1wYXNzIHF1YW50aXphdGlvbiAoZmFzdCwgbG93IHF1YWxpdHkpXG4iKTsKLSNlbmRpZgotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW1heG1lbW9yeSBOICAgTWF4aW11bSBtZW1vcnkgdG8gdXNlIChpbiBrYnl0ZXMpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vdXRmaWxlIG5hbWUgIFNwZWNpZnkgbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcmJvc2UgIG9yICAtZGVidWcgICBFbWl0IGRlYnVnIG91dHB1dFxuIik7Ci0gIGV4aXQoRVhJVF9GQUlMVVJFKTsKLX0KLQotCi1MT0NBTChpbnQpCi1wYXJzZV9zd2l0Y2hlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAotCQlpbnQgbGFzdF9maWxlX2FyZ19zZWVuLCBib29sZWFuIGZvcl9yZWFsKQotLyogUGFyc2Ugb3B0aW9uYWwgc3dpdGNoZXMuCi0gKiBSZXR1cm5zIGFyZ3ZbXSBpbmRleCBvZiBmaXJzdCBmaWxlLW5hbWUgYXJndW1lbnQgKD09IGFyZ2MgaWYgbm9uZSkuCi0gKiBBbnkgZmlsZSBuYW1lcyB3aXRoIGluZGV4ZXMgPD0gbGFzdF9maWxlX2FyZ19zZWVuIGFyZSBpZ25vcmVkOwotICogdGhleSBoYXZlIHByZXN1bWFibHkgYmVlbiBwcm9jZXNzZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uCi0gKiAoUGFzcyAwIGZvciBsYXN0X2ZpbGVfYXJnX3NlZW4gb24gdGhlIGZpcnN0IG9yIG9ubHkgaXRlcmF0aW9uLikKLSAqIGZvcl9yZWFsIGlzIEZBTFNFIG9uIHRoZSBmaXJzdCAoZHVtbXkpIHBhc3M7IHdlIG1heSBza2lwIGFueSBleHBlbnNpdmUKLSAqIHByb2Nlc3NpbmcuCi0gKi8KLXsKLSAgaW50IGFyZ247Ci0gIGNoYXIgKiBhcmc7Ci0KLSAgLyogU2V0IHVwIGRlZmF1bHQgSlBFRyBwYXJhbWV0ZXJzLiAqLwotICByZXF1ZXN0ZWRfZm10ID0gREVGQVVMVF9GTVQ7CS8qIHNldCBkZWZhdWx0IG91dHB1dCBmaWxlIGZvcm1hdCAqLwotICBvdXRmaWxlbmFtZSA9IE5VTEw7Ci0gIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMDsKLQotICAvKiBTY2FuIGNvbW1hbmQgbGluZSBvcHRpb25zLCBhZGp1c3QgcGFyYW1ldGVycyAqLwotCi0gIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKLSAgICBhcmcgPSBhcmd2W2FyZ25dOwotICAgIGlmICgqYXJnICE9ICctJykgewotICAgICAgLyogTm90IGEgc3dpdGNoLCBtdXN0IGJlIGEgZmlsZSBuYW1lIGFyZ3VtZW50ICovCi0gICAgICBpZiAoYXJnbiA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4pIHsKLQlvdXRmaWxlbmFtZSA9IE5VTEw7CS8qIC1vdXRmaWxlIGFwcGxpZXMgdG8ganVzdCBvbmUgaW5wdXQgZmlsZSAqLwotCWNvbnRpbnVlOwkJLyogaWdub3JlIHRoaXMgbmFtZSBpZiBwcmV2aW91c2x5IHByb2Nlc3NlZCAqLwotICAgICAgfQotICAgICAgYnJlYWs7CQkJLyogZWxzZSBkb25lIHBhcnNpbmcgc3dpdGNoZXMgKi8KLSAgICB9Ci0gICAgYXJnKys7CQkJLyogYWR2YW5jZSBwYXN0IHN3aXRjaCBtYXJrZXIgY2hhcmFjdGVyICovCi0KLSAgICBpZiAoa2V5bWF0Y2goYXJnLCAiYm1wIiwgMSkpIHsKLSAgICAgIC8qIEJNUCBvdXRwdXQgZm9ybWF0LiAqLwotICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9CTVA7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImNvbG9ycyIsIDEpIHx8IGtleW1hdGNoKGFyZywgImNvbG91cnMiLCAxKSB8fAotCSAgICAgICBrZXltYXRjaChhcmcsICJxdWFudGl6ZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgInF1YW50aXNlIiwgMSkpIHsKLSAgICAgIC8qIERvIGNvbG9yIHF1YW50aXphdGlvbi4gKi8KLSAgICAgIGludCB2YWw7Ci0KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkIiwgJnZhbCkgIT0gMSkKLQl1c2FnZSgpOwotICAgICAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IHZhbDsKLSAgICAgIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgPSBUUlVFOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkY3QiLCAyKSkgewotICAgICAgLyogU2VsZWN0IElEQ1QgYWxnb3JpdGhtLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJpbnQiLCAxKSkgewotCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JU0xPVzsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZhc3QiLCAyKSkgewotCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZsb2F0IiwgMikpIHsKLQljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfRkxPQVQ7Ci0gICAgICB9IGVsc2UKLQl1c2FnZSgpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkaXRoZXIiLCAyKSkgewotICAgICAgLyogU2VsZWN0IGRpdGhlcmluZyBhbGdvcml0aG0uICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZzIiwgMikpIHsKLQljaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOwotICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAibm9uZSIsIDIpKSB7Ci0JY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9OT05FOwotICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAib3JkZXJlZCIsIDIpKSB7Ci0JY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9PUkRFUkVEOwotICAgICAgfSBlbHNlCi0JdXNhZ2UoKTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGVidWciLCAxKSB8fCBrZXltYXRjaChhcmcsICJ2ZXJib3NlIiwgMSkpIHsKLSAgICAgIC8qIEVuYWJsZSBkZWJ1ZyBwcmludG91dHMuICovCi0gICAgICAvKiBPbiBmaXJzdCAtZCwgcHJpbnQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiAqLwotICAgICAgc3RhdGljIGJvb2xlYW4gcHJpbnRlZF92ZXJzaW9uID0gRkFMU0U7Ci0KLSAgICAgIGlmICghIHByaW50ZWRfdmVyc2lvbikgewotCWZwcmludGYoc3RkZXJyLCAiSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIERKUEVHLCB2ZXJzaW9uICVzXG4lc1xuIiwKLQkJSlZFUlNJT04sIEpDT1BZUklHSFQpOwotCXByaW50ZWRfdmVyc2lvbiA9IFRSVUU7Ci0gICAgICB9Ci0gICAgICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCsrOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJmYXN0IiwgMSkpIHsKLSAgICAgIC8qIFNlbGVjdCByZWNvbW1lbmRlZCBwcm9jZXNzaW5nIG9wdGlvbnMgZm9yIHF1aWNrLWFuZC1kaXJ0eSBvdXRwdXQuICovCi0gICAgICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKLSAgICAgIGNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfT1JERVJFRDsKLSAgICAgIGlmICghIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIC8qIGRvbid0IG92ZXJyaWRlIGFuIGVhcmxpZXIgLWNvbG9ycyAqLwotCWNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPSAyMTY7Ci0gICAgICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfRkFTVEVTVDsKLSAgICAgIGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nID0gRkFMU0U7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImdpZiIsIDEpKSB7Ci0gICAgICAvKiBHSUYgb3V0cHV0IGZvcm1hdC4gKi8KLSAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfR0lGOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJncmF5c2NhbGUiLCAyKSB8fCBrZXltYXRjaChhcmcsICJncmV5c2NhbGUiLDIpKSB7Ci0gICAgICAvKiBGb3JjZSBtb25vY2hyb21lIG91dHB1dC4gKi8KLSAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJtYXAiLCAzKSkgewotICAgICAgLyogUXVhbnRpemUgdG8gYSBjb2xvciBtYXAgdGFrZW4gZnJvbSBhbiBpbnB1dCBmaWxlLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKGZvcl9yZWFsKSB7CQkvKiB0b28gZXhwZW5zaXZlIHRvIGRvIHR3aWNlISAqLwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAkvKiBvdGhlcndpc2UgY2FuJ3QgcXVhbnRpemUgdG8gc3VwcGxpZWQgbWFwICovCi0JRklMRSAqIG1hcGZpbGU7Ci0KLQlpZiAoKG1hcGZpbGUgPSBmb3Blbihhcmd2W2FyZ25dLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLQkgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ25dKTsKLQkgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLQl9Ci0JcmVhZF9jb2xvcl9tYXAoY2luZm8sIG1hcGZpbGUpOwotCWZjbG9zZShtYXBmaWxlKTsKLQljaW5mby0+cXVhbnRpemVfY29sb3JzID0gVFJVRTsKLSNlbHNlCi0JRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmCi0gICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm1heG1lbW9yeSIsIDMpKSB7Ci0gICAgICAvKiBNYXhpbXVtIG1lbW9yeSBpbiBLYiAob3IgTWIgd2l0aCAnbScpLiAqLwotICAgICAgbG9uZyBsdmFsOwotICAgICAgY2hhciBjaCA9ICd4JzsKLQotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQotCWx2YWwgKj0gMTAwMEw7Ci0gICAgICBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSA9IGx2YWwgKiAxMDAwTDsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibm9zbW9vdGgiLCAzKSkgewotICAgICAgLyogU3VwcHJlc3MgZmFuY3kgdXBzYW1wbGluZyAqLwotICAgICAgY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBGQUxTRTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib25lcGFzcyIsIDMpKSB7Ci0gICAgICAvKiBVc2UgZmFzdCBvbmUtcGFzcyBxdWFudGl6YXRpb24uICovCi0gICAgICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3MyIiwgMykpIHsKLSAgICAgIC8qIEJNUCBvdXRwdXQgZm9ybWF0IChPUy8yIGZsYXZvcikuICovCi0gICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX09TMjsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3V0ZmlsZSIsIDQpKSB7Ci0gICAgICAvKiBTZXQgb3V0cHV0IGZpbGUgbmFtZS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIG91dGZpbGVuYW1lID0gYXJndlthcmduXTsJLyogc2F2ZSBpdCBhd2F5IGZvciBsYXRlciB1c2UgKi8KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicG5tIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAicHBtIiwgMSkpIHsKLSAgICAgIC8qIFBQTS9QR00gb3V0cHV0IGZvcm1hdC4gKi8KLSAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfUFBNOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJybGUiLCAxKSkgewotICAgICAgLyogUkxFIG91dHB1dCBmb3JtYXQuICovCi0gICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX1JMRTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2NhbGUiLCAxKSkgewotICAgICAgLyogU2NhbGUgdGhlIG91dHB1dCBpbWFnZSBieSBhIGZyYWN0aW9uIE0vTi4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkLyVkIiwKLQkJICZjaW5mby0+c2NhbGVfbnVtLCAmY2luZm8tPnNjYWxlX2Rlbm9tKSAhPSAyKQotCXVzYWdlKCk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInRhcmdhIiwgMSkpIHsKLSAgICAgIC8qIFRhcmdhIG91dHB1dCBmb3JtYXQuICovCi0gICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX1RBUkdBOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIHVzYWdlKCk7CQkJLyogYm9ndXMgc3dpdGNoICovCi0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGFyZ247CQkJLyogcmV0dXJuIGluZGV4IG9mIG5leHQgYXJnIChmaWxlIG5hbWUpICovCi19Ci0KLQotLyoKLSAqIE1hcmtlciBwcm9jZXNzb3IgZm9yIENPTSBhbmQgaW50ZXJlc3RpbmcgQVBQbiBtYXJrZXJzLgotICogVGhpcyByZXBsYWNlcyB0aGUgbGlicmFyeSdzIGJ1aWx0LWluIHByb2Nlc3Nvciwgd2hpY2gganVzdCBza2lwcyB0aGUgbWFya2VyLgotICogV2Ugd2FudCB0byBwcmludCBvdXQgdGhlIG1hcmtlciBhcyB0ZXh0LCB0byB0aGUgZXh0ZW50IHBvc3NpYmxlLgotICogTm90ZSB0aGlzIGNvZGUgcmVsaWVzIG9uIGEgbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuCi0gKi8KLQotTE9DQUwodW5zaWduZWQgaW50KQotanBlZ19nZXRjIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUmVhZCBuZXh0IGJ5dGUgKi8KLXsKLSAgc3RydWN0IGpwZWdfc291cmNlX21nciAqIGRhdGFzcmMgPSBjaW5mby0+c3JjOwotCi0gIGlmIChkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIgPT0gMCkgewotICAgIGlmICghICgqZGF0YXNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7Ci0gIH0KLSAgZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyLS07Ci0gIHJldHVybiBHRVRKT0NURVQoKmRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZSsrKTsKLX0KLQotCi1NRVRIT0RERUYoYm9vbGVhbikKLXByaW50X3RleHRfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBib29sZWFuIHRyYWNlaXQgPSAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPj0gMSk7Ci0gIElOVDMyIGxlbmd0aDsKLSAgdW5zaWduZWQgaW50IGNoOwotICB1bnNpZ25lZCBpbnQgbGFzdGNoID0gMDsKLQotICBsZW5ndGggPSBqcGVnX2dldGMoY2luZm8pIDw8IDg7Ci0gIGxlbmd0aCArPSBqcGVnX2dldGMoY2luZm8pOwotICBsZW5ndGggLT0gMjsJCQkvKiBkaXNjb3VudCB0aGUgbGVuZ3RoIHdvcmQgaXRzZWxmICovCi0KLSAgaWYgKHRyYWNlaXQpIHsKLSAgICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gSlBFR19DT00pCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbW1lbnQsIGxlbmd0aCAlbGQ6XG4iLCAobG9uZykgbGVuZ3RoKTsKLSAgICBlbHNlCQkJLyogYXNzdW1lIGl0IGlzIGFuIEFQUG4gb3RoZXJ3aXNlICovCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkFQUCVkLCBsZW5ndGggJWxkOlxuIiwKLQkgICAgICBjaW5mby0+dW5yZWFkX21hcmtlciAtIEpQRUdfQVBQMCwgKGxvbmcpIGxlbmd0aCk7Ci0gIH0KLQotICB3aGlsZSAoLS1sZW5ndGggPj0gMCkgewotICAgIGNoID0ganBlZ19nZXRjKGNpbmZvKTsKLSAgICBpZiAodHJhY2VpdCkgewotICAgICAgLyogRW1pdCB0aGUgY2hhcmFjdGVyIGluIGEgcmVhZGFibGUgZm9ybS4KLSAgICAgICAqIE5vbnByaW50YWJsZXMgYXJlIGNvbnZlcnRlZCB0byBcbm5uIGZvcm0sCi0gICAgICAgKiB3aGlsZSBcIGlzIGNvbnZlcnRlZCB0byBcXC4KLSAgICAgICAqIE5ld2xpbmVzIGluIENSLCBDUi9MRiwgb3IgTEYgZm9ybSB3aWxsIGJlIHByaW50ZWQgYXMgb25lIG5ld2xpbmUuCi0gICAgICAgKi8KLSAgICAgIGlmIChjaCA9PSAnXHInKSB7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXG4nKSB7Ci0JaWYgKGxhc3RjaCAhPSAnXHInKQotCSAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnKSB7Ci0JZnByaW50ZihzdGRlcnIsICJcXFxcIik7Ci0gICAgICB9IGVsc2UgaWYgKGlzcHJpbnQoY2gpKSB7Ci0JcHV0YyhjaCwgc3RkZXJyKTsKLSAgICAgIH0gZWxzZSB7Ci0JZnByaW50ZihzdGRlcnIsICJcXCUwM28iLCBjaCk7Ci0gICAgICB9Ci0gICAgICBsYXN0Y2ggPSBjaDsKLSAgICB9Ci0gIH0KLQotICBpZiAodHJhY2VpdCkKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIFRoZSBtYWluIHByb2dyYW0uCi0gKi8KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGNpbmZvOwotICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgcHJvZ3Jlc3M7Ci0jZW5kaWYKLSAgaW50IGZpbGVfaW5kZXg7Ci0gIGRqcGVnX2Rlc3RfcHRyIGRlc3RfbWdyID0gTlVMTDsKLSAgRklMRSAqIGlucHV0X2ZpbGU7Ci0gIEZJTEUgKiBvdXRwdXRfZmlsZTsKLSAgSkRJTUVOU0lPTiBudW1fc2NhbmxpbmVzOwotCi0gIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCi0jaWZkZWYgVVNFX0NDT01NQU5ECi0gIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7Ci0jZW5kaWYKLQotICBwcm9nbmFtZSA9IGFyZ3ZbMF07Ci0gIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCi0gICAgcHJvZ25hbWUgPSAiZGpwZWciOwkJLyogaW4gY2FzZSBDIGxpYnJhcnkgZG9lc24ndCBwcm92aWRlIGl0ICovCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCB3aXRoIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcuICovCi0gIGNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKLSAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmY2luZm8pOwotICAvKiBBZGQgc29tZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvciBtZXNzYWdlcyAoZnJvbSBjZGVycm9yLmgpICovCi0gIGplcnIuYWRkb25fbWVzc2FnZV90YWJsZSA9IGNkanBlZ19tZXNzYWdlX3RhYmxlOwotICBqZXJyLmZpcnN0X2FkZG9uX21lc3NhZ2UgPSBKTVNHX0ZJUlNUQURET05DT0RFOwotICBqZXJyLmxhc3RfYWRkb25fbWVzc2FnZSA9IEpNU0dfTEFTVEFERE9OQ09ERTsKLQotICAvKiBJbnNlcnQgY3VzdG9tIG1hcmtlciBwcm9jZXNzb3IgZm9yIENPTSBhbmQgQVBQMTIuCi0gICAqIEFQUDEyIGlzIHVzZWQgYnkgc29tZSBkaWdpdGFsIGNhbWVyYSBtYWtlcnMgZm9yIHRleHR1YWwgaW5mbywKLSAgICogc28gd2UgcHJvdmlkZSB0aGUgYWJpbGl0eSB0byBkaXNwbGF5IGl0IGFzIHRleHQuCi0gICAqIElmIHlvdSBsaWtlLCBhZGRpdGlvbmFsIEFQUG4gbWFya2VyIHR5cGVzIGNhbiBiZSBzZWxlY3RlZCBmb3IgZGlzcGxheSwKLSAgICogYnV0IGRvbid0IHRyeSB0byBvdmVycmlkZSBBUFAwIG9yIEFQUDE0IHRoaXMgd2F5IChzZWUgbGlianBlZy5kb2MpLgotICAgKi8KLSAganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcigmY2luZm8sIEpQRUdfQ09NLCBwcmludF90ZXh0X21hcmtlcik7Ci0gIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IoJmNpbmZvLCBKUEVHX0FQUDArMTIsIHByaW50X3RleHRfbWFya2VyKTsKLQotICAvKiBOb3cgc2FmZSB0byBlbmFibGUgc2lnbmFsIGNhdGNoZXIuICovCi0jaWZkZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotICBlbmFibGVfc2lnbmFsX2NhdGNoZXIoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKLSNlbmRpZgotCi0gIC8qIFNjYW4gY29tbWFuZCBsaW5lIHRvIGZpbmQgZmlsZSBuYW1lcy4gKi8KLSAgLyogSXQgaXMgY29udmVuaWVudCB0byB1c2UganVzdCBvbmUgc3dpdGNoLXBhcnNpbmcgcm91dGluZSwgYnV0IHRoZSBzd2l0Y2gKLSAgICogdmFsdWVzIHJlYWQgaGVyZSBhcmUgaWdub3JlZDsgd2Ugd2lsbCByZXNjYW4gdGhlIHN3aXRjaGVzIGFmdGVyIG9wZW5pbmcKLSAgICogdGhlIGlucHV0IGZpbGUuCi0gICAqIChFeGNlcHRpb246IHRyYWNpbmcgbGV2ZWwgc2V0IGhlcmUgY29udHJvbHMgdmVyYm9zaXR5IGZvciBDT00gbWFya2VycwotICAgKiBmb3VuZCBkdXJpbmcganBlZ19yZWFkX2hlYWRlci4uLikKLSAgICovCi0KLSAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgMCwgRkFMU0UpOwotCi0jaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSAgLyogTXVzdCBoYXZlIGVpdGhlciAtb3V0ZmlsZSBzd2l0Y2ggb3IgZXhwbGljaXQgb3V0cHV0IGZpbGUgbmFtZSAqLwotICBpZiAob3V0ZmlsZW5hbWUgPT0gTlVMTCkgewotICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMikgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotICAgIG91dGZpbGVuYW1lID0gYXJndltmaWxlX2luZGV4KzFdOwotICB9IGVsc2UgewotICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotICB9Ci0jZWxzZQotICAvKiBVbml4IHN0eWxlOiBleHBlY3QgemVybyBvciBvbmUgZmlsZSBuYW1lICovCi0gIGlmIChmaWxlX2luZGV4IDwgYXJnYy0xKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlczogb25seSBvbmUgaW5wdXQgZmlsZVxuIiwgcHJvZ25hbWUpOwotICAgIHVzYWdlKCk7Ci0gIH0KLSNlbmRpZiAvKiBUV09fRklMRV9DT01NQU5ETElORSAqLwotCi0gIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCi0gIGlmIChmaWxlX2luZGV4IDwgYXJnYykgewotICAgIGlmICgoaW5wdXRfZmlsZSA9IGZvcGVuKGFyZ3ZbZmlsZV9pbmRleF0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbZmlsZV9pbmRleF0pOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KLSAgICBpbnB1dF9maWxlID0gcmVhZF9zdGRpbigpOwotICB9Ci0KLSAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICovCi0gIGlmIChvdXRmaWxlbmFtZSAhPSBOVUxMKSB7Ci0gICAgaWYgKChvdXRwdXRfZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgb3V0ZmlsZW5hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIHN0ZG91dCAqLwotICAgIG91dHB1dF9maWxlID0gd3JpdGVfc3Rkb3V0KCk7Ci0gIH0KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBzdGFydF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbywgJnByb2dyZXNzKTsKLSNlbmRpZgotCi0gIC8qIFNwZWNpZnkgZGF0YSBzb3VyY2UgZm9yIGRlY29tcHJlc3Npb24gKi8KLSAganBlZ19zdGRpb19zcmMoJmNpbmZvLCBpbnB1dF9maWxlKTsKLQotICAvKiBSZWFkIGZpbGUgaGVhZGVyLCBzZXQgZGVmYXVsdCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgKi8KLSAgKHZvaWQpIGpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKLQotICAvKiBBZGp1c3QgZGVmYXVsdCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYnkgcmUtcGFyc2luZyB0aGUgb3B0aW9ucyAqLwotICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmNpbmZvLCBhcmdjLCBhcmd2LCAwLCBUUlVFKTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBvdXRwdXQgbW9kdWxlIG5vdyB0byBsZXQgaXQgb3ZlcnJpZGUgYW55IGNydWNpYWwKLSAgICogb3B0aW9uIHNldHRpbmdzIChmb3IgaW5zdGFuY2UsIEdJRiB3YW50cyB0byBmb3JjZSBjb2xvciBxdWFudGl6YXRpb24pLgotICAgKi8KLSAgc3dpdGNoIChyZXF1ZXN0ZWRfZm10KSB7Ci0jaWZkZWYgQk1QX1NVUFBPUlRFRAotICBjYXNlIEZNVF9CTVA6Ci0gICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9ibXAoJmNpbmZvLCBGQUxTRSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk1UX09TMjoKLSAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX2JtcCgmY2luZm8sIFRSVUUpOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgR0lGX1NVUFBPUlRFRAotICBjYXNlIEZNVF9HSUY6Ci0gICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9naWYoJmNpbmZvKTsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFBQTV9TVVBQT1JURUQKLSAgY2FzZSBGTVRfUFBNOgotICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfcHBtKCZjaW5mbyk7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBSTEVfU1VQUE9SVEVECi0gIGNhc2UgRk1UX1JMRToKLSAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX3JsZSgmY2luZm8pOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgVEFSR0FfU1VQUE9SVEVECi0gIGNhc2UgRk1UX1RBUkdBOgotICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfdGFyZ2EoJmNpbmZvKTsKLSAgICBicmVhazsKLSNlbmRpZgotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoJmNpbmZvLCBKRVJSX1VOU1VQUE9SVEVEX0ZPUk1BVCk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgZGVzdF9tZ3ItPm91dHB1dF9maWxlID0gb3V0cHV0X2ZpbGU7Ci0KLSAgLyogU3RhcnQgZGVjb21wcmVzc29yICovCi0gICh2b2lkKSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJmNpbmZvKTsKLQotICAvKiBXcml0ZSBvdXRwdXQgZmlsZSBoZWFkZXIgKi8KLSAgKCpkZXN0X21nci0+c3RhcnRfb3V0cHV0KSAoJmNpbmZvLCBkZXN0X21ncik7Ci0KLSAgLyogUHJvY2VzcyBkYXRhICovCi0gIHdoaWxlIChjaW5mby5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby5vdXRwdXRfaGVpZ2h0KSB7Ci0gICAgbnVtX3NjYW5saW5lcyA9IGpwZWdfcmVhZF9zY2FubGluZXMoJmNpbmZvLCBkZXN0X21nci0+YnVmZmVyLAotCQkJCQlkZXN0X21nci0+YnVmZmVyX2hlaWdodCk7Ci0gICAgKCpkZXN0X21nci0+cHV0X3BpeGVsX3Jvd3MpICgmY2luZm8sIGRlc3RfbWdyLCBudW1fc2NhbmxpbmVzKTsKLSAgfQotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIC8qIEhhY2s6IGNvdW50IGZpbmFsIHBhc3MgYXMgZG9uZSBpbiBjYXNlIGZpbmlzaF9vdXRwdXQgZG9lcyBhbiBleHRyYSBwYXNzLgotICAgKiBUaGUgbGlicmFyeSB3b24ndCBoYXZlIHVwZGF0ZWQgY29tcGxldGVkX3Bhc3Nlcy4KLSAgICovCi0gIHByb2dyZXNzLnB1Yi5jb21wbGV0ZWRfcGFzc2VzID0gcHJvZ3Jlc3MucHViLnRvdGFsX3Bhc3NlczsKLSNlbmRpZgotCi0gIC8qIEZpbmlzaCBkZWNvbXByZXNzaW9uIGFuZCByZWxlYXNlIG1lbW9yeS4KLSAgICogSSBtdXN0IGRvIGl0IGluIHRoaXMgb3JkZXIgYmVjYXVzZSBvdXRwdXQgbW9kdWxlIGhhcyBhbGxvY2F0ZWQgbWVtb3J5Ci0gICAqIG9mIGxpZmVzcGFuIEpQT09MX0lNQUdFOyBpdCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHJlbGVhc2luZyBtZW1vcnkuCi0gICAqLwotICAoKmRlc3RfbWdyLT5maW5pc2hfb3V0cHV0KSAoJmNpbmZvLCBkZXN0X21ncik7Ci0gICh2b2lkKSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0KLSAgLyogQ2xvc2UgZmlsZXMsIGlmIHdlIG9wZW5lZCB0aGVtICovCi0gIGlmIChpbnB1dF9maWxlICE9IHN0ZGluKQotICAgIGZjbG9zZShpbnB1dF9maWxlKTsKLSAgaWYgKG91dHB1dF9maWxlICE9IHN0ZG91dCkKLSAgICBmY2xvc2Uob3V0cHV0X2ZpbGUpOwotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGVuZF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7Ci0jZW5kaWYKLQotICAvKiBBbGwgZG9uZS4gKi8KLSAgZXhpdChqZXJyLm51bV93YXJuaW5ncyA/IEVYSVRfV0FSTklORyA6IEVYSVRfU1VDQ0VTUyk7Ci0gIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvZXhhbXBsZS5jIGIvbGlianBlZ3R3cnAvZXhhbXBsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmMzNTRmLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2V4YW1wbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKgotICogZXhhbXBsZS5jCi0gKgotICogVGhpcyBmaWxlIGlsbHVzdHJhdGVzIGhvdyB0byB1c2UgdGhlIElKRyBjb2RlIGFzIGEgc3Vicm91dGluZSBsaWJyYXJ5Ci0gKiB0byByZWFkIG9yIHdyaXRlIEpQRUcgaW1hZ2UgZmlsZXMuICBZb3Ugc2hvdWxkIGxvb2sgYXQgdGhpcyBjb2RlIGluCi0gKiBjb25qdW5jdGlvbiB3aXRoIHRoZSBkb2N1bWVudGF0aW9uIGZpbGUgbGlianBlZy5kb2MuCi0gKgotICogVGhpcyBjb2RlIHdpbGwgbm90IGRvIGFueXRoaW5nIHVzZWZ1bCBhcy1pcywgYnV0IGl0IG1heSBiZSBoZWxwZnVsIGFzIGEKLSAqIHNrZWxldG9uIGZvciBjb25zdHJ1Y3Rpbmcgcm91dGluZXMgdGhhdCBjYWxsIHRoZSBKUEVHIGxpYnJhcnkuICAKLSAqCi0gKiBXZSBwcmVzZW50IHRoZXNlIHJvdXRpbmVzIGluIHRoZSBzYW1lIGNvZGluZyBzdHlsZSB1c2VkIGluIHRoZSBKUEVHIGNvZGUKLSAqIChBTlNJIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldGMpOyBidXQgeW91IGFyZSBvZiBjb3Vyc2UgZnJlZSB0byBjb2RlIHlvdXIKLSAqIHJvdXRpbmVzIGluIGEgZGlmZmVyZW50IHN0eWxlIGlmIHlvdSBwcmVmZXIuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qCi0gKiBJbmNsdWRlIGZpbGUgZm9yIHVzZXJzIG9mIEpQRUcgbGlicmFyeS4KLSAqIFlvdSB3aWxsIG5lZWQgdG8gaGF2ZSBpbmNsdWRlZCBzeXN0ZW0gaGVhZGVycyB0aGF0IGRlZmluZSBhdCBsZWFzdAotICogdGhlIHR5cGVkZWZzIEZJTEUgYW5kIHNpemVfdCBiZWZvcmUgeW91IGNhbiBpbmNsdWRlIGpwZWdsaWIuaC4KLSAqIChzdGRpby5oIGlzIHN1ZmZpY2llbnQgb24gQU5TSS1jb25mb3JtaW5nIHN5c3RlbXMuKQotICogWW91IG1heSBhbHNvIHdpc2ggdG8gaW5jbHVkZSAiamVycm9yLmgiLgotICovCi0KLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLS8qCi0gKiA8c2V0am1wLmg+IGlzIHVzZWQgZm9yIHRoZSBvcHRpb25hbCBlcnJvciByZWNvdmVyeSBtZWNoYW5pc20gc2hvd24gaW4KLSAqIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgZXhhbXBsZS4KLSAqLwotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKiogSlBFRyBDT01QUkVTU0lPTiBTQU1QTEUgSU5URVJGQUNFICoqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoaXMgaGFsZiBvZiB0aGUgZXhhbXBsZSBzaG93cyBob3cgdG8gZmVlZCBkYXRhIGludG8gdGhlIEpQRUcgY29tcHJlc3Nvci4KLSAqIFdlIHByZXNlbnQgYSBtaW5pbWFsIHZlcnNpb24gdGhhdCBkb2VzIG5vdCB3b3JyeSBhYm91dCByZWZpbmVtZW50cyBzdWNoCi0gKiBhcyBlcnJvciByZWNvdmVyeSAodGhlIEpQRUcgY29kZSB3aWxsIGp1c3QgZXhpdCgpIGlmIGl0IGdldHMgYW4gZXJyb3IpLgotICovCi0KLQotLyoKLSAqIElNQUdFIERBVEEgRk9STUFUUzoKLSAqCi0gKiBUaGUgc3RhbmRhcmQgaW5wdXQgaW1hZ2UgZm9ybWF0IGlzIGEgcmVjdGFuZ3VsYXIgYXJyYXkgb2YgcGl4ZWxzLCB3aXRoCi0gKiBlYWNoIHBpeGVsIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2YgImNvbXBvbmVudCIgdmFsdWVzIChjb2xvciBjaGFubmVscykuCi0gKiBFYWNoIHBpeGVsIHJvdyBpcyBhbiBhcnJheSBvZiBKU0FNUExFcyAod2hpY2ggdHlwaWNhbGx5IGFyZSB1bnNpZ25lZCBjaGFycykuCi0gKiBJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBjb2xvciBkYXRhLCB0aGVuIHRoZSBjb2xvciB2YWx1ZXMgZm9yIGVhY2ggcGl4ZWwKLSAqIG11c3QgYmUgYWRqYWNlbnQgaW4gdGhlIHJvdzsgZm9yIGV4YW1wbGUsIFIsRyxCLFIsRyxCLFIsRyxCLC4uLiBmb3IgMjQtYml0Ci0gKiBSR0IgY29sb3IuCi0gKgotICogRm9yIHRoaXMgZXhhbXBsZSwgd2UnbGwgYXNzdW1lIHRoYXQgdGhpcyBkYXRhIHN0cnVjdHVyZSBtYXRjaGVzIHRoZSB3YXkKLSAqIG91ciBhcHBsaWNhdGlvbiBoYXMgc3RvcmVkIHRoZSBpbWFnZSBpbiBtZW1vcnksIHNvIHdlIGNhbiBqdXN0IHBhc3MgYQotICogcG9pbnRlciB0byBvdXIgaW1hZ2UgYnVmZmVyLiAgSW4gcGFydGljdWxhciwgbGV0J3Mgc2F5IHRoYXQgdGhlIGltYWdlIGlzCi0gKiBSR0IgY29sb3IgYW5kIGlzIGRlc2NyaWJlZCBieToKLSAqLwotCi1leHRlcm4gSlNBTVBMRSAqIGltYWdlX2J1ZmZlcjsJLyogUG9pbnRzIHRvIGxhcmdlIGFycmF5IG9mIFIsRyxCLW9yZGVyIGRhdGEgKi8KLWV4dGVybiBpbnQgaW1hZ2VfaGVpZ2h0OwkvKiBOdW1iZXIgb2Ygcm93cyBpbiBpbWFnZSAqLwotZXh0ZXJuIGludCBpbWFnZV93aWR0aDsJCS8qIE51bWJlciBvZiBjb2x1bW5zIGluIGltYWdlICovCi0KLQotLyoKLSAqIFNhbXBsZSByb3V0aW5lIGZvciBKUEVHIGNvbXByZXNzaW9uLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHRhcmdldCBmaWxlIG5hbWUKLSAqIGFuZCBhIGNvbXByZXNzaW9uIHF1YWxpdHkgZmFjdG9yIGFyZSBwYXNzZWQgaW4uCi0gKi8KLQotR0xPQkFMKHZvaWQpCi13cml0ZV9KUEVHX2ZpbGUgKGNoYXIgKiBmaWxlbmFtZSwgaW50IHF1YWxpdHkpCi17Ci0gIC8qIFRoaXMgc3RydWN0IGNvbnRhaW5zIHRoZSBKUEVHIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHBvaW50ZXJzIHRvCi0gICAqIHdvcmtpbmcgc3BhY2UgKHdoaWNoIGlzIGFsbG9jYXRlZCBhcyBuZWVkZWQgYnkgdGhlIEpQRUcgbGlicmFyeSkuCi0gICAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgc2V2ZXJhbCBzdWNoIHN0cnVjdHVyZXMsIHJlcHJlc2VudGluZyBtdWx0aXBsZQotICAgKiBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIHByb2Nlc3NlcywgaW4gZXhpc3RlbmNlIGF0IG9uY2UuICBXZSByZWZlcgotICAgKiB0byBhbnkgb25lIHN0cnVjdCAoYW5kIGl0cyBhc3NvY2lhdGVkIHdvcmtpbmcgZGF0YSkgYXMgYSAiSlBFRyBvYmplY3QiLgotICAgKi8KLSAgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOwotICAvKiBUaGlzIHN0cnVjdCByZXByZXNlbnRzIGEgSlBFRyBlcnJvciBoYW5kbGVyLiAgSXQgaXMgZGVjbGFyZWQgc2VwYXJhdGVseQotICAgKiBiZWNhdXNlIGFwcGxpY2F0aW9ucyBvZnRlbiB3YW50IHRvIHN1cHBseSBhIHNwZWNpYWxpemVkIGVycm9yIGhhbmRsZXIKLSAgICogKHNlZSB0aGUgc2Vjb25kIGhhbGYgb2YgdGhpcyBmaWxlIGZvciBhbiBleGFtcGxlKS4gIEJ1dCBoZXJlIHdlIGp1c3QKLSAgICogdGFrZSB0aGUgZWFzeSB3YXkgb3V0IGFuZCB1c2UgdGhlIHN0YW5kYXJkIGVycm9yIGhhbmRsZXIsIHdoaWNoIHdpbGwKLSAgICogcHJpbnQgYSBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgY2FsbCBleGl0KCkgaWYgY29tcHJlc3Npb24gZmFpbHMuCi0gICAqIE5vdGUgdGhhdCB0aGlzIHN0cnVjdCBtdXN0IGxpdmUgYXMgbG9uZyBhcyB0aGUgbWFpbiBKUEVHIHBhcmFtZXRlcgotICAgKiBzdHJ1Y3QsIHRvIGF2b2lkIGRhbmdsaW5nLXBvaW50ZXIgcHJvYmxlbXMuCi0gICAqLwotICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKLSAgLyogTW9yZSBzdHVmZiAqLwotICBGSUxFICogb3V0ZmlsZTsJCS8qIHRhcmdldCBmaWxlICovCi0gIEpTQU1QUk9XIHJvd19wb2ludGVyWzFdOwkvKiBwb2ludGVyIHRvIEpTQU1QTEUgcm93W3NdICovCi0gIGludCByb3dfc3RyaWRlOwkJLyogcGh5c2ljYWwgcm93IHdpZHRoIGluIGltYWdlIGJ1ZmZlciAqLwotCi0gIC8qIFN0ZXAgMTogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QgKi8KLQotICAvKiBXZSBoYXZlIHRvIHNldCB1cCB0aGUgZXJyb3IgaGFuZGxlciBmaXJzdCwgaW4gY2FzZSB0aGUgaW5pdGlhbGl6YXRpb24KLSAgICogc3RlcCBmYWlscy4gIChVbmxpa2VseSwgYnV0IGl0IGNvdWxkIGhhcHBlbiBpZiB5b3UgYXJlIG91dCBvZiBtZW1vcnkuKQotICAgKiBUaGlzIHJvdXRpbmUgZmlsbHMgaW4gdGhlIGNvbnRlbnRzIG9mIHN0cnVjdCBqZXJyLCBhbmQgcmV0dXJucyBqZXJyJ3MKLSAgICogYWRkcmVzcyB3aGljaCB3ZSBwbGFjZSBpbnRvIHRoZSBsaW5rIGZpZWxkIGluIGNpbmZvLgotICAgKi8KLSAgY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOwotICAvKiBOb3cgd2UgY2FuIGluaXRpYWxpemUgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LiAqLwotICBqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOwotCi0gIC8qIFN0ZXAgMjogc3BlY2lmeSBkYXRhIGRlc3RpbmF0aW9uIChlZywgYSBmaWxlKSAqLwotICAvKiBOb3RlOiBzdGVwcyAyIGFuZCAzIGNhbiBiZSBkb25lIGluIGVpdGhlciBvcmRlci4gKi8KLQotICAvKiBIZXJlIHdlIHVzZSB0aGUgbGlicmFyeS1zdXBwbGllZCBjb2RlIHRvIHNlbmQgY29tcHJlc3NlZCBkYXRhIHRvIGEKLSAgICogc3RkaW8gc3RyZWFtLiAgWW91IGNhbiBhbHNvIHdyaXRlIHlvdXIgb3duIGNvZGUgdG8gZG8gc29tZXRoaW5nIGVsc2UuCi0gICAqIFZFUlkgSU1QT1JUQU5UOiB1c2UgImIiIG9wdGlvbiB0byBmb3BlbigpIGlmIHlvdSBhcmUgb24gYSBtYWNoaW5lIHRoYXQKLSAgICogcmVxdWlyZXMgaXQgaW4gb3JkZXIgdG8gd3JpdGUgYmluYXJ5IGZpbGVzLgotICAgKi8KLSAgaWYgKChvdXRmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgZXhpdCgxKTsKLSAgfQotICBqcGVnX3N0ZGlvX2Rlc3QoJmNpbmZvLCBvdXRmaWxlKTsKLQotICAvKiBTdGVwIDM6IHNldCBwYXJhbWV0ZXJzIGZvciBjb21wcmVzc2lvbiAqLwotCi0gIC8qIEZpcnN0IHdlIHN1cHBseSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpbnB1dCBpbWFnZS4KLSAgICogRm91ciBmaWVsZHMgb2YgdGhlIGNpbmZvIHN0cnVjdCBtdXN0IGJlIGZpbGxlZCBpbjoKLSAgICovCi0gIGNpbmZvLmltYWdlX3dpZHRoID0gaW1hZ2Vfd2lkdGg7IAkvKiBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0LCBpbiBwaXhlbHMgKi8KLSAgY2luZm8uaW1hZ2VfaGVpZ2h0ID0gaW1hZ2VfaGVpZ2h0OwotICBjaW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsJCS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBwZXIgcGl4ZWwgKi8KLSAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOyAJLyogY29sb3JzcGFjZSBvZiBpbnB1dCBpbWFnZSAqLwotICAvKiBOb3cgdXNlIHRoZSBsaWJyYXJ5J3Mgcm91dGluZSB0byBzZXQgZGVmYXVsdCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgotICAgKiAoWW91IG11c3Qgc2V0IGF0IGxlYXN0IGNpbmZvLmluX2NvbG9yX3NwYWNlIGJlZm9yZSBjYWxsaW5nIHRoaXMsCi0gICAqIHNpbmNlIHRoZSBkZWZhdWx0cyBkZXBlbmQgb24gdGhlIHNvdXJjZSBjb2xvciBzcGFjZS4pCi0gICAqLwotICBqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOwotICAvKiBOb3cgeW91IGNhbiBzZXQgYW55IG5vbi1kZWZhdWx0IHBhcmFtZXRlcnMgeW91IHdpc2ggdG8uCi0gICAqIEhlcmUgd2UganVzdCBpbGx1c3RyYXRlIHRoZSB1c2Ugb2YgcXVhbGl0eSAocXVhbnRpemF0aW9uIHRhYmxlKSBzY2FsaW5nOgotICAgKi8KLSAganBlZ19zZXRfcXVhbGl0eSgmY2luZm8sIHF1YWxpdHksIFRSVUUgLyogbGltaXQgdG8gYmFzZWxpbmUtSlBFRyB2YWx1ZXMgKi8pOwotCi0gIC8qIFN0ZXAgNDogU3RhcnQgY29tcHJlc3NvciAqLwotCi0gIC8qIFRSVUUgZW5zdXJlcyB0aGF0IHdlIHdpbGwgd3JpdGUgYSBjb21wbGV0ZSBpbnRlcmNoYW5nZS1KUEVHIGZpbGUuCi0gICAqIFBhc3MgVFJVRSB1bmxlc3MgeW91IGFyZSB2ZXJ5IHN1cmUgb2Ygd2hhdCB5b3UncmUgZG9pbmcuCi0gICAqLwotICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7Ci0KLSAgLyogU3RlcCA1OiB3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgd3JpdHRlbikgKi8KLSAgLyogICAgICAgICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKC4uLik7ICovCi0KLSAgLyogSGVyZSB3ZSB1c2UgdGhlIGxpYnJhcnkncyBzdGF0ZSB2YXJpYWJsZSBjaW5mby5uZXh0X3NjYW5saW5lIGFzIHRoZQotICAgKiBsb29wIGNvdW50ZXIsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIHRyYWNrIG91cnNlbHZlcy4KLSAgICogVG8ga2VlcCB0aGluZ3Mgc2ltcGxlLCB3ZSBwYXNzIG9uZSBzY2FubGluZSBwZXIgY2FsbDsgeW91IGNhbiBwYXNzCi0gICAqIG1vcmUgaWYgeW91IHdpc2gsIHRob3VnaC4KLSAgICovCi0gIHJvd19zdHJpZGUgPSBpbWFnZV93aWR0aCAqIDM7CS8qIEpTQU1QTEVzIHBlciByb3cgaW4gaW1hZ2VfYnVmZmVyICovCi0KLSAgd2hpbGUgKGNpbmZvLm5leHRfc2NhbmxpbmUgPCBjaW5mby5pbWFnZV9oZWlnaHQpIHsKLSAgICAvKiBqcGVnX3dyaXRlX3NjYW5saW5lcyBleHBlY3RzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNjYW5saW5lcy4KLSAgICAgKiBIZXJlIHRoZSBhcnJheSBpcyBvbmx5IG9uZSBlbGVtZW50IGxvbmcsIGJ1dCB5b3UgY291bGQgcGFzcwotICAgICAqIG1vcmUgdGhhbiBvbmUgc2NhbmxpbmUgYXQgYSB0aW1lIGlmIHRoYXQncyBtb3JlIGNvbnZlbmllbnQuCi0gICAgICovCi0gICAgcm93X3BvaW50ZXJbMF0gPSAmIGltYWdlX2J1ZmZlcltjaW5mby5uZXh0X3NjYW5saW5lICogcm93X3N0cmlkZV07Ci0gICAgKHZvaWQpIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjaW5mbywgcm93X3BvaW50ZXIsIDEpOwotICB9Ci0KLSAgLyogU3RlcCA2OiBGaW5pc2ggY29tcHJlc3Npb24gKi8KLQotICBqcGVnX2ZpbmlzaF9jb21wcmVzcygmY2luZm8pOwotICAvKiBBZnRlciBmaW5pc2hfY29tcHJlc3MsIHdlIGNhbiBjbG9zZSB0aGUgb3V0cHV0IGZpbGUuICovCi0gIGZjbG9zZShvdXRmaWxlKTsKLQotICAvKiBTdGVwIDc6IHJlbGVhc2UgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QgKi8KLQotICAvKiBUaGlzIGlzIGFuIGltcG9ydGFudCBzdGVwIHNpbmNlIGl0IHdpbGwgcmVsZWFzZSBhIGdvb2QgZGVhbCBvZiBtZW1vcnkuICovCi0gIGpwZWdfZGVzdHJveV9jb21wcmVzcygmY2luZm8pOwotCi0gIC8qIEFuZCB3ZSdyZSBkb25lISAqLwotfQotCi0KLS8qCi0gKiBTT01FIEZJTkUgUE9JTlRTOgotICoKLSAqIEluIHRoZSBhYm92ZSBsb29wLCB3ZSBpZ25vcmVkIHRoZSByZXR1cm4gdmFsdWUgb2YganBlZ193cml0ZV9zY2FubGluZXMsCi0gKiB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyBhY3R1YWxseSB3cml0dGVuLiAgV2UgY291bGQgZ2V0IGF3YXkKLSAqIHdpdGggdGhpcyBiZWNhdXNlIHdlIHdlcmUgb25seSByZWx5aW5nIG9uIHRoZSB2YWx1ZSBvZiBjaW5mby5uZXh0X3NjYW5saW5lLAotICogd2hpY2ggd2lsbCBiZSBpbmNyZW1lbnRlZCBjb3JyZWN0bHkuICBJZiB5b3UgbWFpbnRhaW4gYWRkaXRpb25hbCBsb29wCi0gKiB2YXJpYWJsZXMgdGhlbiB5b3Ugc2hvdWxkIGJlIGNhcmVmdWwgdG8gaW5jcmVtZW50IHRoZW0gcHJvcGVybHkuCi0gKiBBY3R1YWxseSwgZm9yIG91dHB1dCB0byBhIHN0ZGlvIHN0cmVhbSB5b3UgbmVlZG4ndCB3b3JyeSwgYmVjYXVzZQotICogdGhlbiBqcGVnX3dyaXRlX3NjYW5saW5lcyB3aWxsIHdyaXRlIGFsbCB0aGUgbGluZXMgcGFzc2VkIChvciBlbHNlIGV4aXQKLSAqIHdpdGggYSBmYXRhbCBlcnJvcikuICBQYXJ0aWFsIHdyaXRlcyBjYW4gb25seSBvY2N1ciBpZiB5b3UgdXNlIGEgZGF0YQotICogZGVzdGluYXRpb24gbW9kdWxlIHRoYXQgY2FuIGRlbWFuZCBzdXNwZW5zaW9uIG9mIHRoZSBjb21wcmVzc29yLgotICogKElmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhhdCdzIGZvciwgeW91IGRvbid0IG5lZWQgaXQuKQotICoKLSAqIElmIHRoZSBjb21wcmVzc29yIHJlcXVpcmVzIGZ1bGwtaW1hZ2UgYnVmZmVycyAoZm9yIGVudHJvcHktY29kaW5nCi0gKiBvcHRpbWl6YXRpb24gb3IgYSBtdWx0aS1zY2FuIEpQRUcgZmlsZSksIGl0IHdpbGwgY3JlYXRlIHRlbXBvcmFyeQotICogZmlsZXMgZm9yIGFueXRoaW5nIHRoYXQgZG9lc24ndCBmaXQgd2l0aGluIHRoZSBtYXhpbXVtLW1lbW9yeSBzZXR0aW5nLgotICogKE5vdGUgdGhhdCB0ZW1wIGZpbGVzIGFyZSBOT1QgbmVlZGVkIGlmIHlvdSB1c2UgdGhlIGRlZmF1bHQgcGFyYW1ldGVycy4pCi0gKiBPbiBzb21lIHN5c3RlbXMgeW91IG1heSBuZWVkIHRvIHNldCB1cCBhIHNpZ25hbCBoYW5kbGVyIHRvIGVuc3VyZSB0aGF0Ci0gKiB0ZW1wb3JhcnkgZmlsZXMgYXJlIGRlbGV0ZWQgaWYgdGhlIHByb2dyYW0gaXMgaW50ZXJydXB0ZWQuICBTZWUgbGlianBlZy5kb2MuCi0gKgotICogU2NhbmxpbmVzIE1VU1QgYmUgc3VwcGxpZWQgaW4gdG9wLXRvLWJvdHRvbSBvcmRlciBpZiB5b3Ugd2FudCB5b3VyIEpQRUcKLSAqIGZpbGVzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBldmVyeW9uZSBlbHNlJ3MuICBJZiB5b3UgY2Fubm90IHJlYWRpbHkgcmVhZAotICogeW91ciBkYXRhIGluIHRoYXQgb3JkZXIsIHlvdSdsbCBuZWVkIGFuIGludGVybWVkaWF0ZSBhcnJheSB0byBob2xkIHRoZQotICogaW1hZ2UuICBTZWUgcmR0YXJnYS5jIG9yIHJkYm1wLmMgZm9yIGV4YW1wbGVzIG9mIGhhbmRsaW5nIGJvdHRvbS10by10b3AKLSAqIHNvdXJjZSBkYXRhIHVzaW5nIHRoZSBKUEVHIGNvZGUncyBpbnRlcm5hbCB2aXJ0dWFsLWFycmF5IG1lY2hhbmlzbXMuCi0gKi8KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKiBKUEVHIERFQ09NUFJFU1NJT04gU0FNUExFIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGlzIGhhbGYgb2YgdGhlIGV4YW1wbGUgc2hvd3MgaG93IHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KLSAqIEl0J3MgYSBiaXQgbW9yZSByZWZpbmVkIHRoYW4gdGhlIGFib3ZlLCBpbiB0aGF0IHdlIHNob3c6Ci0gKiAgIChhKSBob3cgdG8gbW9kaWZ5IHRoZSBKUEVHIGxpYnJhcnkncyBzdGFuZGFyZCBlcnJvci1yZXBvcnRpbmcgYmVoYXZpb3I7Ci0gKiAgIChiKSBob3cgdG8gYWxsb2NhdGUgd29ya3NwYWNlIHVzaW5nIHRoZSBsaWJyYXJ5J3MgbWVtb3J5IG1hbmFnZXIuCi0gKgotICogSnVzdCB0byBtYWtlIHRoaXMgZXhhbXBsZSBhIGxpdHRsZSBkaWZmZXJlbnQgZnJvbSB0aGUgZmlyc3Qgb25lLCB3ZSdsbAotICogYXNzdW1lIHRoYXQgd2UgZG8gbm90IGludGVuZCB0byBwdXQgdGhlIHdob2xlIGltYWdlIGludG8gYW4gaW4tbWVtb3J5Ci0gKiBidWZmZXIsIGJ1dCB0byBzZW5kIGl0IGxpbmUtYnktbGluZSBzb21lcGxhY2UgZWxzZS4gIFdlIG5lZWQgYSBvbmUtCi0gKiBzY2FubGluZS1oaWdoIEpTQU1QTEUgYXJyYXkgYXMgYSB3b3JrIGJ1ZmZlciwgYW5kIHdlIHdpbGwgbGV0IHRoZSBKUEVHCi0gKiBtZW1vcnkgbWFuYWdlciBhbGxvY2F0ZSBpdCBmb3IgdXMuICBUaGlzIGFwcHJvYWNoIGlzIGFjdHVhbGx5IHF1aXRlIHVzZWZ1bAotICogYmVjYXVzZSB3ZSBkb24ndCBuZWVkIHRvIHJlbWVtYmVyIHRvIGRlYWxsb2NhdGUgdGhlIGJ1ZmZlciBzZXBhcmF0ZWx5OiBpdAotICogd2lsbCBnbyBhd2F5IGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgSlBFRyBvYmplY3QgaXMgY2xlYW5lZCB1cC4KLSAqLwotCi0KLS8qCi0gKiBFUlJPUiBIQU5ETElORzoKLSAqCi0gKiBUaGUgSlBFRyBsaWJyYXJ5J3Mgc3RhbmRhcmQgZXJyb3IgaGFuZGxlciAoamVycm9yLmMpIGlzIGRpdmlkZWQgaW50bwotICogc2V2ZXJhbCAibWV0aG9kcyIgd2hpY2ggeW91IGNhbiBvdmVycmlkZSBpbmRpdmlkdWFsbHkuICBUaGlzIGxldHMgeW91Ci0gKiBhZGp1c3QgdGhlIGJlaGF2aW9yIHdpdGhvdXQgZHVwbGljYXRpbmcgYSBsb3Qgb2YgY29kZSwgd2hpY2ggeW91IG1pZ2h0Ci0gKiBoYXZlIHRvIHVwZGF0ZSB3aXRoIGVhY2ggZnV0dXJlIHJlbGVhc2UuCi0gKgotICogT3VyIGV4YW1wbGUgaGVyZSBzaG93cyBob3cgdG8gb3ZlcnJpZGUgdGhlICJlcnJvcl9leGl0IiBtZXRob2Qgc28gdGhhdAotICogY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgbGlicmFyeSdzIGNhbGxlciB3aGVuIGEgZmF0YWwgZXJyb3Igb2NjdXJzLAotICogcmF0aGVyIHRoYW4gY2FsbGluZyBleGl0KCkgYXMgdGhlIHN0YW5kYXJkIGVycm9yX2V4aXQgbWV0aG9kIGRvZXMuCi0gKgotICogV2UgdXNlIEMncyBzZXRqbXAvbG9uZ2ptcCBmYWNpbGl0eSB0byByZXR1cm4gY29udHJvbC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKLSAqIHJvdXRpbmUgd2hpY2ggY2FsbHMgdGhlIEpQRUcgbGlicmFyeSBtdXN0IGZpcnN0IGV4ZWN1dGUgYSBzZXRqbXAoKSBjYWxsIHRvCi0gKiBlc3RhYmxpc2ggdGhlIHJldHVybiBwb2ludC4gIFdlIHdhbnQgdGhlIHJlcGxhY2VtZW50IGVycm9yX2V4aXQgdG8gZG8gYQotICogbG9uZ2ptcCgpLiAgQnV0IHdlIG5lZWQgdG8gbWFrZSB0aGUgc2V0am1wIGJ1ZmZlciBhY2Nlc3NpYmxlIHRvIHRoZQotICogZXJyb3JfZXhpdCByb3V0aW5lLiAgVG8gZG8gdGhpcywgd2UgbWFrZSBhIHByaXZhdGUgZXh0ZW5zaW9uIG9mIHRoZQotICogc3RhbmRhcmQgSlBFRyBlcnJvciBoYW5kbGVyIG9iamVjdC4gIChJZiB3ZSB3ZXJlIHVzaW5nIEMrKywgd2UnZCBzYXkgd2UKLSAqIHdlcmUgbWFraW5nIGEgc3ViY2xhc3Mgb2YgdGhlIHJlZ3VsYXIgZXJyb3IgaGFuZGxlci4pCi0gKgotICogSGVyZSdzIHRoZSBleHRlbmRlZCBlcnJvciBoYW5kbGVyIHN0cnVjdDoKLSAqLwotCi1zdHJ1Y3QgbXlfZXJyb3JfbWdyIHsKLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIHB1YjsJLyogInB1YmxpYyIgZmllbGRzICovCi0KLSAgam1wX2J1ZiBzZXRqbXBfYnVmZmVyOwkvKiBmb3IgcmV0dXJuIHRvIGNhbGxlciAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbXlfZXJyb3JfbWdyICogbXlfZXJyb3JfcHRyOwotCi0vKgotICogSGVyZSdzIHRoZSByb3V0aW5lIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzdGFuZGFyZCBlcnJvcl9leGl0IG1ldGhvZDoKLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW15X2Vycm9yX2V4aXQgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgLyogY2luZm8tPmVyciByZWFsbHkgcG9pbnRzIHRvIGEgbXlfZXJyb3JfbWdyIHN0cnVjdCwgc28gY29lcmNlIHBvaW50ZXIgKi8KLSAgbXlfZXJyb3JfcHRyIG15ZXJyID0gKG15X2Vycm9yX3B0cikgY2luZm8tPmVycjsKLQotICAvKiBBbHdheXMgZGlzcGxheSB0aGUgbWVzc2FnZS4gKi8KLSAgLyogV2UgY291bGQgcG9zdHBvbmUgdGhpcyB1bnRpbCBhZnRlciByZXR1cm5pbmcsIGlmIHdlIGNob3NlLiAqLwotICAoKmNpbmZvLT5lcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOwotCi0gIC8qIFJldHVybiBjb250cm9sIHRvIHRoZSBzZXRqbXAgcG9pbnQgKi8KLSAgbG9uZ2ptcChteWVyci0+c2V0am1wX2J1ZmZlciwgMSk7Ci19Ci0KLQotLyoKLSAqIFNhbXBsZSByb3V0aW5lIGZvciBKUEVHIGRlY29tcHJlc3Npb24uICBXZSBhc3N1bWUgdGhhdCB0aGUgc291cmNlIGZpbGUgbmFtZQotICogaXMgcGFzc2VkIGluLiAgV2Ugd2FudCB0byByZXR1cm4gMSBvbiBzdWNjZXNzLCAwIG9uIGVycm9yLgotICovCi0KLQotR0xPQkFMKGludCkKLXJlYWRfSlBFR19maWxlIChjaGFyICogZmlsZW5hbWUpCi17Ci0gIC8qIFRoaXMgc3RydWN0IGNvbnRhaW5zIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyBhbmQgcG9pbnRlcnMgdG8KLSAgICogd29ya2luZyBzcGFjZSAod2hpY2ggaXMgYWxsb2NhdGVkIGFzIG5lZWRlZCBieSB0aGUgSlBFRyBsaWJyYXJ5KS4KLSAgICovCi0gIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGNpbmZvOwotICAvKiBXZSB1c2Ugb3VyIHByaXZhdGUgZXh0ZW5zaW9uIEpQRUcgZXJyb3IgaGFuZGxlci4KLSAgICogTm90ZSB0aGF0IHRoaXMgc3RydWN0IG11c3QgbGl2ZSBhcyBsb25nIGFzIHRoZSBtYWluIEpQRUcgcGFyYW1ldGVyCi0gICAqIHN0cnVjdCwgdG8gYXZvaWQgZGFuZ2xpbmctcG9pbnRlciBwcm9ibGVtcy4KLSAgICovCi0gIHN0cnVjdCBteV9lcnJvcl9tZ3IgamVycjsKLSAgLyogTW9yZSBzdHVmZiAqLwotICBGSUxFICogaW5maWxlOwkJLyogc291cmNlIGZpbGUgKi8KLSAgSlNBTVBBUlJBWSBidWZmZXI7CQkvKiBPdXRwdXQgcm93IGJ1ZmZlciAqLwotICBpbnQgcm93X3N0cmlkZTsJCS8qIHBoeXNpY2FsIHJvdyB3aWR0aCBpbiBvdXRwdXQgYnVmZmVyICovCi0KLSAgLyogSW4gdGhpcyBleGFtcGxlIHdlIHdhbnQgdG8gb3BlbiB0aGUgaW5wdXQgZmlsZSBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZSwKLSAgICogc28gdGhhdCB0aGUgc2V0am1wKCkgZXJyb3IgcmVjb3ZlcnkgYmVsb3cgY2FuIGFzc3VtZSB0aGUgZmlsZSBpcyBvcGVuLgotICAgKiBWRVJZIElNUE9SVEFOVDogdXNlICJiIiBvcHRpb24gdG8gZm9wZW4oKSBpZiB5b3UgYXJlIG9uIGEgbWFjaGluZSB0aGF0Ci0gICAqIHJlcXVpcmVzIGl0IGluIG9yZGVyIHRvIHJlYWQgYmluYXJ5IGZpbGVzLgotICAgKi8KLQotICBpZiAoKGluZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkgPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyogU3RlcCAxOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0ICovCi0KLSAgLyogV2Ugc2V0IHVwIHRoZSBub3JtYWwgSlBFRyBlcnJvciByb3V0aW5lcywgdGhlbiBvdmVycmlkZSBlcnJvcl9leGl0LiAqLwotICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVyci5wdWIpOwotICBqZXJyLnB1Yi5lcnJvcl9leGl0ID0gbXlfZXJyb3JfZXhpdDsKLSAgLyogRXN0YWJsaXNoIHRoZSBzZXRqbXAgcmV0dXJuIGNvbnRleHQgZm9yIG15X2Vycm9yX2V4aXQgdG8gdXNlLiAqLwotICBpZiAoc2V0am1wKGplcnIuc2V0am1wX2J1ZmZlcikpIHsKLSAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIEpQRUcgY29kZSBoYXMgc2lnbmFsZWQgYW4gZXJyb3IuCi0gICAgICogV2UgbmVlZCB0byBjbGVhbiB1cCB0aGUgSlBFRyBvYmplY3QsIGNsb3NlIHRoZSBpbnB1dCBmaWxlLCBhbmQgcmV0dXJuLgotICAgICAqLwotICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgZmNsb3NlKGluZmlsZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyogTm93IHdlIGNhbiBpbml0aWFsaXplIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0LiAqLwotICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0KLSAgLyogU3RlcCAyOiBzcGVjaWZ5IGRhdGEgc291cmNlIChlZywgYSBmaWxlKSAqLwotCi0gIGpwZWdfc3RkaW9fc3JjKCZjaW5mbywgaW5maWxlKTsKLQotICAvKiBTdGVwIDM6IHJlYWQgZmlsZSBwYXJhbWV0ZXJzIHdpdGgganBlZ19yZWFkX2hlYWRlcigpICovCi0KLSAgKHZvaWQpIGpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKLSAgLyogV2UgY2FuIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20ganBlZ19yZWFkX2hlYWRlciBzaW5jZQotICAgKiAgIChhKSBzdXNwZW5zaW9uIGlzIG5vdCBwb3NzaWJsZSB3aXRoIHRoZSBzdGRpbyBkYXRhIHNvdXJjZSwgYW5kCi0gICAqICAgKGIpIHdlIHBhc3NlZCBUUlVFIHRvIHJlamVjdCBhIHRhYmxlcy1vbmx5IEpQRUcgZmlsZSBhcyBhbiBlcnJvci4KLSAgICogU2VlIGxpYmpwZWcuZG9jIGZvciBtb3JlIGluZm8uCi0gICAqLwotCi0gIC8qIFN0ZXAgNDogc2V0IHBhcmFtZXRlcnMgZm9yIGRlY29tcHJlc3Npb24gKi8KLQotICAvKiBJbiB0aGlzIGV4YW1wbGUsIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIGFueSBvZiB0aGUgZGVmYXVsdHMgc2V0IGJ5Ci0gICAqIGpwZWdfcmVhZF9oZWFkZXIoKSwgc28gd2UgZG8gbm90aGluZyBoZXJlLgotICAgKi8KLQotICAvKiBTdGVwIDU6IFN0YXJ0IGRlY29tcHJlc3NvciAqLwotCi0gICh2b2lkKSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgLyogV2UgY2FuIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIHNpbmNlIHN1c3BlbnNpb24gaXMgbm90IHBvc3NpYmxlCi0gICAqIHdpdGggdGhlIHN0ZGlvIGRhdGEgc291cmNlLgotICAgKi8KLQotICAvKiBXZSBtYXkgbmVlZCB0byBkbyBzb21lIHNldHVwIG9mIG91ciBvd24gYXQgdGhpcyBwb2ludCBiZWZvcmUgcmVhZGluZwotICAgKiB0aGUgZGF0YS4gIEFmdGVyIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHdlIGhhdmUgdGhlIGNvcnJlY3Qgc2NhbGVkCi0gICAqIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyB0aGUgb3V0cHV0IGNvbG9ybWFwCi0gICAqIGlmIHdlIGFza2VkIGZvciBjb2xvciBxdWFudGl6YXRpb24uCi0gICAqIEluIHRoaXMgZXhhbXBsZSwgd2UgbmVlZCB0byBtYWtlIGFuIG91dHB1dCB3b3JrIGJ1ZmZlciBvZiB0aGUgcmlnaHQgc2l6ZS4KLSAgICovIAotICAvKiBKU0FNUExFcyBwZXIgcm93IGluIG91dHB1dCBidWZmZXIgKi8KLSAgcm93X3N0cmlkZSA9IGNpbmZvLm91dHB1dF93aWR0aCAqIGNpbmZvLm91dHB1dF9jb21wb25lbnRzOwotICAvKiBNYWtlIGEgb25lLXJvdy1oaWdoIHNhbXBsZSBhcnJheSB0aGF0IHdpbGwgZ28gYXdheSB3aGVuIGRvbmUgd2l0aCBpbWFnZSAqLwotICBidWZmZXIgPSAoKmNpbmZvLm1lbS0+YWxsb2Nfc2FycmF5KQotCQkoKGpfY29tbW9uX3B0cikgJmNpbmZvLCBKUE9PTF9JTUFHRSwgcm93X3N0cmlkZSwgMSk7Ci0KLSAgLyogU3RlcCA2OiB3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgcmVhZCkgKi8KLSAgLyogICAgICAgICAgIGpwZWdfcmVhZF9zY2FubGluZXMoLi4uKTsgKi8KLQotICAvKiBIZXJlIHdlIHVzZSB0aGUgbGlicmFyeSdzIHN0YXRlIHZhcmlhYmxlIGNpbmZvLm91dHB1dF9zY2FubGluZSBhcyB0aGUKLSAgICogbG9vcCBjb3VudGVyLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8ga2VlcCB0cmFjayBvdXJzZWx2ZXMuCi0gICAqLwotICB3aGlsZSAoY2luZm8ub3V0cHV0X3NjYW5saW5lIDwgY2luZm8ub3V0cHV0X2hlaWdodCkgewotICAgIC8qIGpwZWdfcmVhZF9zY2FubGluZXMgZXhwZWN0cyBhbiBhcnJheSBvZiBwb2ludGVycyB0byBzY2FubGluZXMuCi0gICAgICogSGVyZSB0aGUgYXJyYXkgaXMgb25seSBvbmUgZWxlbWVudCBsb25nLCBidXQgeW91IGNvdWxkIGFzayBmb3IKLSAgICAgKiBtb3JlIHRoYW4gb25lIHNjYW5saW5lIGF0IGEgdGltZSBpZiB0aGF0J3MgbW9yZSBjb252ZW5pZW50LgotICAgICAqLwotICAgICh2b2lkKSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZjaW5mbywgYnVmZmVyLCAxKTsKLSAgICAvKiBBc3N1bWUgcHV0X3NjYW5saW5lX3NvbWVwbGFjZSB3YW50cyBhIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudC4gKi8KLSAgICBwdXRfc2NhbmxpbmVfc29tZXBsYWNlKGJ1ZmZlclswXSwgcm93X3N0cmlkZSk7Ci0gIH0KLQotICAvKiBTdGVwIDc6IEZpbmlzaCBkZWNvbXByZXNzaW9uICovCi0KLSAgKHZvaWQpIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgLyogV2UgY2FuIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIHNpbmNlIHN1c3BlbnNpb24gaXMgbm90IHBvc3NpYmxlCi0gICAqIHdpdGggdGhlIHN0ZGlvIGRhdGEgc291cmNlLgotICAgKi8KLQotICAvKiBTdGVwIDg6IFJlbGVhc2UgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCAqLwotCi0gIC8qIFRoaXMgaXMgYW4gaW1wb3J0YW50IHN0ZXAgc2luY2UgaXQgd2lsbCByZWxlYXNlIGEgZ29vZCBkZWFsIG9mIG1lbW9yeS4gKi8KLSAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLQotICAvKiBBZnRlciBmaW5pc2hfZGVjb21wcmVzcywgd2UgY2FuIGNsb3NlIHRoZSBpbnB1dCBmaWxlLgotICAgKiBIZXJlIHdlIHBvc3Rwb25lIGl0IHVudGlsIGFmdGVyIG5vIG1vcmUgSlBFRyBlcnJvcnMgYXJlIHBvc3NpYmxlLAotICAgKiBzbyBhcyB0byBzaW1wbGlmeSB0aGUgc2V0am1wIGVycm9yIGxvZ2ljIGFib3ZlLiAgKEFjdHVhbGx5LCBJIGRvbid0Ci0gICAqIHRoaW5rIHRoYXQganBlZ19kZXN0cm95IGNhbiBkbyBhbiBlcnJvciBleGl0LCBidXQgd2h5IGFzc3VtZSBhbnl0aGluZy4uLikKLSAgICovCi0gIGZjbG9zZShpbmZpbGUpOwotCi0gIC8qIEF0IHRoaXMgcG9pbnQgeW91IG1heSB3YW50IHRvIGNoZWNrIHRvIHNlZSB3aGV0aGVyIGFueSBjb3JydXB0LWRhdGEKLSAgICogd2FybmluZ3Mgb2NjdXJyZWQgKHRlc3Qgd2hldGhlciBqZXJyLnB1Yi5udW1fd2FybmluZ3MgaXMgbm9uemVybykuCi0gICAqLwotCi0gIC8qIEFuZCB3ZSdyZSBkb25lISAqLwotICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogU09NRSBGSU5FIFBPSU5UUzoKLSAqCi0gKiBJbiB0aGUgYWJvdmUgY29kZSwgd2UgaWdub3JlZCB0aGUgcmV0dXJuIHZhbHVlIG9mIGpwZWdfcmVhZF9zY2FubGluZXMsCi0gKiB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyBhY3R1YWxseSByZWFkLiAgV2UgY291bGQgZ2V0IGF3YXkgd2l0aAotICogdGhpcyBiZWNhdXNlIHdlIGFza2VkIGZvciBvbmx5IG9uZSBsaW5lIGF0IGEgdGltZSBhbmQgd2Ugd2VyZW4ndCB1c2luZwotICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLiAgU2VlIGxpYmpwZWcuZG9jIGZvciBtb3JlIGluZm8uCi0gKgotICogV2UgY2hlYXRlZCBhIGJpdCBieSBjYWxsaW5nIGFsbG9jX3NhcnJheSgpIGFmdGVyIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpOwotICogd2Ugc2hvdWxkIGhhdmUgZG9uZSBpdCBiZWZvcmVoYW5kIHRvIGVuc3VyZSB0aGF0IHRoZSBzcGFjZSB3b3VsZCBiZQotICogY291bnRlZCBhZ2FpbnN0IHRoZSBKUEVHIG1heF9tZW1vcnkgc2V0dGluZy4gIEluIHNvbWUgc3lzdGVtcyB0aGUgYWJvdmUKLSAqIGNvZGUgd291bGQgcmlzayBhbiBvdXQtb2YtbWVtb3J5IGVycm9yLiAgSG93ZXZlciwgaW4gZ2VuZXJhbCB3ZSBkb24ndAotICoga25vdyB0aGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYmVmb3JlIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLCB1bmxlc3Mgd2UKLSAqIGNhbGwganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCkuICBTZWUgbGlianBlZy5kb2MgZm9yIG1vcmUgYWJvdXQgdGhpcy4KLSAqCi0gKiBTY2FubGluZXMgYXJlIHJldHVybmVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBKUEVHIGZpbGUsCi0gKiB3aGljaCBpcyBzdGFuZGFyZGx5IHRvcC10by1ib3R0b20uICBJZiB5b3UgbXVzdCBlbWl0IGRhdGEgYm90dG9tLXRvLXRvcCwKLSAqIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgdmlydHVhbCBhcnJheXMgcHJvdmlkZWQgYnkgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIKLSAqIHRvIGludmVydCB0aGUgZGF0YS4gIFNlZSB3cmJtcC5jIGZvciBhbiBleGFtcGxlLgotICoKLSAqIEFzIHdpdGggY29tcHJlc3Npb24sIHNvbWUgb3BlcmF0aW5nIG1vZGVzIG1heSByZXF1aXJlIHRlbXBvcmFyeSBmaWxlcy4KLSAqIE9uIHNvbWUgc3lzdGVtcyB5b3UgbWF5IG5lZWQgdG8gc2V0IHVwIGEgc2lnbmFsIGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQKLSAqIHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcnJ1cHRlZC4gIFNlZSBsaWJqcGVnLmRvYy4KLSAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvZmlsZWxpc3QuZG9jIGIvbGlianBlZ3R3cnAvZmlsZWxpc3QuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTQ5ODJjLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ZpbGVsaXN0LmRvYworKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi1JSkcgSlBFRyBMSUJSQVJZOiAgRklMRSBMSVNUCi0KLUNvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi1Gb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0KLQotSGVyZSBpcyBhIHJvYWQgbWFwIHRvIHRoZSBmaWxlcyBpbiB0aGUgSUpHIEpQRUcgZGlzdHJpYnV0aW9uLiAgVGhlCi1kaXN0cmlidXRpb24gaW5jbHVkZXMgdGhlIEpQRUcgbGlicmFyeSBwcm9wZXIsIHBsdXMgdHdvIGFwcGxpY2F0aW9uCi1wcm9ncmFtcyAoImNqcGVnIiBhbmQgImRqcGVnIikgd2hpY2ggdXNlIHRoZSBsaWJyYXJ5IHRvIGNvbnZlcnQgSlBFRwotZmlsZXMgdG8gYW5kIGZyb20gc29tZSBvdGhlciBwb3B1bGFyIGltYWdlIGZvcm1hdHMuICBBIHRoaXJkIGFwcGxpY2F0aW9uCi0ianBlZ3RyYW4iIHVzZXMgdGhlIGxpYnJhcnkgdG8gZG8gbG9zc2xlc3MgY29udmVyc2lvbiBiZXR3ZWVuIGRpZmZlcmVudAotdmFyaWFudHMgb2YgSlBFRy4gIFRoZXJlIGFyZSBhbHNvIHR3byBzdGFuZC1hbG9uZSBhcHBsaWNhdGlvbnMsCi0icmRqcGdjb20iIGFuZCAid3JqcGdjb20iLgotCi0KLVRIRSBKUEVHIExJQlJBUlkKLT09PT09PT09PT09PT09PT0KLQotSW5jbHVkZSBmaWxlczoKLQotanBlZ2xpYi5oCUpQRUcgbGlicmFyeSdzIGV4cG9ydGVkIGRhdGEgYW5kIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLWpjb25maWcuaAlDb25maWd1cmF0aW9uIGRlY2xhcmF0aW9ucy4gIE5vdGU6IHRoaXMgZmlsZSBpcyBub3QgcHJlc2VudAotCQlpbiB0aGUgZGlzdHJpYnV0aW9uOyBpdCBpcyBnZW5lcmF0ZWQgZHVyaW5nIGluc3RhbGxhdGlvbi4KLWptb3JlY2ZnLmgJQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGRlY2xhcmF0aW9uczsgbmVlZCBub3QgYmUgY2hhbmdlZAotCQlmb3IgYSBzdGFuZGFyZCBpbnN0YWxsYXRpb24uCi1qZXJyb3IuaAlEZWNsYXJlcyBKUEVHIGxpYnJhcnkncyBlcnJvciBhbmQgdHJhY2UgbWVzc2FnZSBjb2Rlcy4KLWppbmNsdWRlLmgJQ2VudHJhbCBpbmNsdWRlIGZpbGUgdXNlZCBieSBhbGwgSUpHIC5jIGZpbGVzIHRvIHJlZmVyZW5jZQotCQlzeXN0ZW0gaW5jbHVkZSBmaWxlcy4KLWpwZWdpbnQuaAlKUEVHIGxpYnJhcnkncyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCi1qY2h1ZmYuaAlQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgSHVmZm1hbiBlbmNvZGVyIG1vZHVsZXMuCi1qZGh1ZmYuaAlQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgSHVmZm1hbiBkZWNvZGVyIG1vZHVsZXMuCi1qZGN0LmgJCVByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBmb3J3YXJkICYgcmV2ZXJzZSBEQ1Qgc3Vic3lzdGVtcy4KLWptZW1zeXMuaAlQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLgotanZlcnNpb24uaAlWZXJzaW9uIGluZm9ybWF0aW9uLgotCi1BcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkgc2hvdWxkIGluY2x1ZGUganBlZ2xpYi5oICh3aGljaCBpbiB0dXJuCi1pbmNsdWRlcyBqY29uZmlnLmggYW5kIGptb3JlY2ZnLmgpLiAgT3B0aW9uYWxseSwgamVycm9yLmggbWF5IGJlIGluY2x1ZGVkCi1pZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8gcmVmZXJlbmNlIGluZGl2aWR1YWwgSlBFRyBlcnJvciBjb2Rlcy4gIFRoZQotb3RoZXIgaW5jbHVkZSBmaWxlcyBhcmUgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBhbmQgd291bGQgbm90IG5vcm1hbGx5Ci1iZSBpbmNsdWRlZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtLiAgKGNqcGVnL2RqcGVnL2V0YyBkbyB1c2UgamluY2x1ZGUuaCwKLXNpbmNlIGl0cyBmdW5jdGlvbiBpcyB0byBpbXByb3ZlIHBvcnRhYmlsaXR5IG9mIHRoZSB3aG9sZSBJSkcgZGlzdHJpYnV0aW9uLgotTW9zdCBvdGhlciBhcHBsaWNhdGlvbnMgd2lsbCBkaXJlY3RseSBpbmNsdWRlIHRoZSBzeXN0ZW0gaW5jbHVkZSBmaWxlcyB0aGV5Ci13YW50LCBhbmQgaGVuY2Ugd29uJ3QgbmVlZCBqaW5jbHVkZS5oLikKLQotCi1DIHNvdXJjZSBjb2RlIGZpbGVzOgotCi1UaGVzZSBmaWxlcyBjb250YWluIG1vc3Qgb2YgdGhlIGZ1bmN0aW9ucyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkgYnkKLWFuIGFwcGxpY2F0aW9uIHByb2dyYW06Ci0KLWpjYXBpbWluLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2U6IGNvcmUgcm91dGluZXMgZm9yIGNvbXByZXNzaW9uLgotamNhcGlzdGQuYwlBcHBsaWNhdGlvbiBwcm9ncmFtIGludGVyZmFjZTogc3RhbmRhcmQgY29tcHJlc3Npb24uCi1qZGFwaW1pbi5jCUFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlOiBjb3JlIHJvdXRpbmVzIGZvciBkZWNvbXByZXNzaW9uLgotamRhcGlzdGQuYwlBcHBsaWNhdGlvbiBwcm9ncmFtIGludGVyZmFjZTogc3RhbmRhcmQgZGVjb21wcmVzc2lvbi4KLWpjb21hcGkuYwlBcHBsaWNhdGlvbiBwcm9ncmFtIGludGVyZmFjZSByb3V0aW5lcyBjb21tb24gdG8gY29tcHJlc3Npb24KLQkJYW5kIGRlY29tcHJlc3Npb24uCi1qY3BhcmFtLmMJQ29tcHJlc3Npb24gcGFyYW1ldGVyIHNldHRpbmcgaGVscGVyIHJvdXRpbmVzLgotamN0cmFucy5jCUFQSSBhbmQgbGlicmFyeSByb3V0aW5lcyBmb3IgdHJhbnNjb2RpbmcgY29tcHJlc3Npb24uCi1qZHRyYW5zLmMJQVBJIGFuZCBsaWJyYXJ5IHJvdXRpbmVzIGZvciB0cmFuc2NvZGluZyBkZWNvbXByZXNzaW9uLgotCi1Db21wcmVzc2lvbiBzaWRlIG9mIHRoZSBsaWJyYXJ5OgotCi1qY2luaXQuYwlJbml0aWFsaXphdGlvbjogZGV0ZXJtaW5lcyB3aGljaCBvdGhlciBtb2R1bGVzIHRvIHVzZS4KLWpjbWFzdGVyLmMJTWFzdGVyIGNvbnRyb2w6IHNldHVwIGFuZCBpbnRlci1wYXNzIHNlcXVlbmNpbmcgbG9naWMuCi1qY21haW5jdC5jCU1haW4gYnVmZmVyIGNvbnRyb2xsZXIgKHByZXByb2Nlc3NvciA9PiBKUEVHIGNvbXByZXNzb3IpLgotamNwcmVwY3QuYwlQcmVwcm9jZXNzb3IgYnVmZmVyIGNvbnRyb2xsZXIuCi1qY2NvZWZjdC5jCUJ1ZmZlciBjb250cm9sbGVyIGZvciBEQ1QgY29lZmZpY2llbnQgYnVmZmVyLgotamNjb2xvci5jCUNvbG9yIHNwYWNlIGNvbnZlcnNpb24uCi1qY3NhbXBsZS5jCURvd25zYW1wbGluZy4KLWpjZGN0bWdyLmMJRENUIG1hbmFnZXIgKERDVCBpbXBsZW1lbnRhdGlvbiBzZWxlY3Rpb24gJiBjb250cm9sKS4KLWpmZGN0aW50LmMJRm9yd2FyZCBEQ1QgdXNpbmcgc2xvdy1idXQtYWNjdXJhdGUgaW50ZWdlciBtZXRob2QuCi1qZmRjdGZzdC5jCUZvcndhcmQgRENUIHVzaW5nIGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZC4KLWpmZGN0Zmx0LmMJRm9yd2FyZCBEQ1QgdXNpbmcgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYy4KLWpjaHVmZi5jCUh1ZmZtYW4gZW50cm9weSBjb2RpbmcgZm9yIHNlcXVlbnRpYWwgSlBFRy4KLWpjcGh1ZmYuYwlIdWZmbWFuIGVudHJvcHkgY29kaW5nIGZvciBwcm9ncmVzc2l2ZSBKUEVHLgotamNtYXJrZXIuYwlKUEVHIG1hcmtlciB3cml0aW5nLgotamRhdGFkc3QuYwlEYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXIgZm9yIHN0ZGlvIG91dHB1dC4KLQotRGVjb21wcmVzc2lvbiBzaWRlIG9mIHRoZSBsaWJyYXJ5OgotCi1qZG1hc3Rlci5jCU1hc3RlciBjb250cm9sOiBkZXRlcm1pbmVzIHdoaWNoIG90aGVyIG1vZHVsZXMgdG8gdXNlLgotamRpbnB1dC5jCUlucHV0IGNvbnRyb2xsZXI6IGNvbnRyb2xzIGlucHV0IHByb2Nlc3NpbmcgbW9kdWxlcy4KLWpkbWFpbmN0LmMJTWFpbiBidWZmZXIgY29udHJvbGxlciAoSlBFRyBkZWNvbXByZXNzb3IgPT4gcG9zdHByb2Nlc3NvcikuCi1qZGNvZWZjdC5jCUJ1ZmZlciBjb250cm9sbGVyIGZvciBEQ1QgY29lZmZpY2llbnQgYnVmZmVyLgotamRwb3N0Y3QuYwlQb3N0cHJvY2Vzc29yIGJ1ZmZlciBjb250cm9sbGVyLgotamRtYXJrZXIuYwlKUEVHIG1hcmtlciByZWFkaW5nLgotamRodWZmLmMJSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIGZvciBzZXF1ZW50aWFsIEpQRUcuCi1qZHBodWZmLmMJSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIGZvciBwcm9ncmVzc2l2ZSBKUEVHLgotamRkY3RtZ3IuYwlJRENUIG1hbmFnZXIgKElEQ1QgaW1wbGVtZW50YXRpb24gc2VsZWN0aW9uICYgY29udHJvbCkuCi1qaWRjdGludC5jCUludmVyc2UgRENUIHVzaW5nIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgbWV0aG9kLgotamlkY3Rmc3QuYwlJbnZlcnNlIERDVCB1c2luZyBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QuCi1qaWRjdGZsdC5jCUludmVyc2UgRENUIHVzaW5nIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMuCi1qaWRjdHJlZC5jCUludmVyc2UgRENUcyB3aXRoIHJlZHVjZWQtc2l6ZSBvdXRwdXRzLgotamRzYW1wbGUuYwlVcHNhbXBsaW5nLgotamRjb2xvci5jCUNvbG9yIHNwYWNlIGNvbnZlcnNpb24uCi1qZG1lcmdlLmMJTWVyZ2VkIHVwc2FtcGxpbmcvY29sb3IgY29udmVyc2lvbiAoZmFzdGVyLCBsb3dlciBxdWFsaXR5KS4KLWpxdWFudDEuYwlPbmUtcGFzcyBjb2xvciBxdWFudGl6YXRpb24gdXNpbmcgYSBmaXhlZC1zcGFjaW5nIGNvbG9ybWFwLgotanF1YW50Mi5jCVR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiB1c2luZyBhIGN1c3RvbS1nZW5lcmF0ZWQgY29sb3JtYXAuCi0JCUFsc28gaGFuZGxlcyBvbmUtcGFzcyBxdWFudGl6YXRpb24gdG8gYW4gZXh0ZXJuYWxseSBnaXZlbiBtYXAuCi1qZGF0YXNyYy5jCURhdGEgc291cmNlIG1hbmFnZXIgZm9yIHN0ZGlvIGlucHV0LgotCi1TdXBwb3J0IGZpbGVzIGZvciBib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uOgotCi1qZXJyb3IuYwlTdGFuZGFyZCBlcnJvciBoYW5kbGluZyByb3V0aW5lcyAoYXBwbGljYXRpb24gcmVwbGFjZWFibGUpLgotam1lbW1nci5jCVN5c3RlbS1pbmRlcGVuZGVudCAobW9yZSBvciBsZXNzKSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLgotanV0aWxzLmMJTWlzY2VsbGFuZW91cyB1dGlsaXR5IHJvdXRpbmVzLgotCi1qbWVtbWdyLmMgcmVsaWVzIG9uIGEgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkgbWFuYWdlbWVudCBtb2R1bGUuICBUaGUgSUpHCi1kaXN0cmlidXRpb24gaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHN5c3RlbS1kZXBlbmRlbnQKLW1vZHVsZToKLQotam1lbW5vYnMuYwkiTm8gYmFja2luZyBzdG9yZSI6IGFzc3VtZXMgYWRlcXVhdGUgdmlydHVhbCBtZW1vcnkgZXhpc3RzLgotam1lbWFuc2kuYwlNYWtlcyB0ZW1wb3JhcnkgZmlsZXMgd2l0aCBBTlNJLXN0YW5kYXJkIHJvdXRpbmUgdG1wZmlsZSgpLgotam1lbW5hbWUuYwlNYWtlcyB0ZW1wb3JhcnkgZmlsZXMgd2l0aCBwcm9ncmFtLWdlbmVyYXRlZCBmaWxlIG5hbWVzLgotam1lbWRvcy5jCUN1c3RvbSBpbXBsZW1lbnRhdGlvbiBmb3IgTVMtRE9TICgxNi1iaXQgZW52aXJvbm1lbnQgb25seSk6Ci0JCWNhbiB1c2UgZXh0ZW5kZWQgYW5kIGV4cGFuZGVkIG1lbW9yeSBhcyB3ZWxsIGFzIHRlbXAgZmlsZXMuCi1qbWVtbWFjLmMJQ3VzdG9tIGltcGxlbWVudGF0aW9uIGZvciBBcHBsZSBNYWNpbnRvc2guCi0KLUV4YWN0bHkgb25lIG9mIHRoZSBzeXN0ZW0tZGVwZW5kZW50IG1vZHVsZXMgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgaW50byBhbgotaW5zdGFsbGVkIEpQRUcgbGlicmFyeSAoc2VlIGluc3RhbGwuZG9jIGZvciBoaW50cyBhYm91dCB3aGljaCBvbmUgdG8gdXNlKS4KLU9uIHVudXN1YWwgc3lzdGVtcyB5b3UgbWF5IGZpbmQgaXQgd29ydGh3aGlsZSB0byBtYWtlIGEgc3BlY2lhbAotc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkgbWFuYWdlci4KLQotCi1Ob24tQyBzb3VyY2UgY29kZSBmaWxlczoKLQotam1lbWRvc2EuYXNtCTgweDg2IGFzc2VtYmx5IGNvZGUgc3VwcG9ydCBmb3Igam1lbWRvcy5jOyB1c2VkIG9ubHkgaW4KLQkJTVMtRE9TLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIG9mIHRoZSBKUEVHIGxpYnJhcnkuCi0KLQotQ0pQRUcvREpQRUcvSlBFR1RSQU4KLT09PT09PT09PT09PT09PT09PT09Ci0KLUluY2x1ZGUgZmlsZXM6Ci0KLWNkanBlZy5oCURlY2xhcmF0aW9ucyBzaGFyZWQgYnkgY2pwZWcvZGpwZWcvanBlZ3RyYW4gbW9kdWxlcy4KLWNkZXJyb3IuaAlBZGRpdGlvbmFsIGVycm9yIGFuZCB0cmFjZSBtZXNzYWdlIGNvZGVzIGZvciBjanBlZyBldCBhbC4KLXRyYW5zdXBwLmgJRGVjbGFyYXRpb25zIGZvciBqcGVndHJhbiBzdXBwb3J0IHJvdXRpbmVzIGluIHRyYW5zdXBwLmMuCi0KLUMgc291cmNlIGNvZGUgZmlsZXM6Ci0KLWNqcGVnLmMJCU1haW4gcHJvZ3JhbSBmb3IgY2pwZWcuCi1kanBlZy5jCQlNYWluIHByb2dyYW0gZm9yIGRqcGVnLgotanBlZ3RyYW4uYwlNYWluIHByb2dyYW0gZm9yIGpwZWd0cmFuLgotY2RqcGVnLmMJVXRpbGl0eSByb3V0aW5lcyB1c2VkIGJ5IGFsbCB0aHJlZSBwcm9ncmFtcy4KLXJkY29sbWFwLmMJQ29kZSB0byByZWFkIGEgY29sb3JtYXAgZmlsZSBmb3IgZGpwZWcncyAiLW1hcCIgc3dpdGNoLgotcmRzd2l0Y2guYwlDb2RlIHRvIHByb2Nlc3Mgc29tZSBvZiBjanBlZydzIG1vcmUgY29tcGxleCBzd2l0Y2hlcy4KLQkJQWxzbyB1c2VkIGJ5IGpwZWd0cmFuLgotdHJhbnN1cHAuYwlTdXBwb3J0IGNvZGUgZm9yIGpwZWd0cmFuOiBsb3NzbGVzcyBpbWFnZSBtYW5pcHVsYXRpb25zLgotCi1JbWFnZSBmaWxlIHJlYWRlciBtb2R1bGVzIGZvciBjanBlZzoKLQotcmRibXAuYwkJQk1QIGZpbGUgaW5wdXQuCi1yZGdpZi5jCQlHSUYgZmlsZSBpbnB1dCAobm93IGp1c3QgYSBzdHViKS4KLXJkcHBtLmMJCVBQTS9QR00gZmlsZSBpbnB1dC4KLXJkcmxlLmMJCVV0YWggUkxFIGZpbGUgaW5wdXQuCi1yZHRhcmdhLmMJVGFyZ2EgZmlsZSBpbnB1dC4KLQotSW1hZ2UgZmlsZSB3cml0ZXIgbW9kdWxlcyBmb3IgZGpwZWc6Ci0KLXdyYm1wLmMJCUJNUCBmaWxlIG91dHB1dC4KLXdyZ2lmLmMJCUdJRiBmaWxlIG91dHB1dCAoYSBtZXJlIHNoYWRvdyBvZiBpdHMgZm9ybWVyIHNlbGYpLgotd3JwcG0uYwkJUFBNL1BHTSBmaWxlIG91dHB1dC4KLXdycmxlLmMJCVV0YWggUkxFIGZpbGUgb3V0cHV0Lgotd3J0YXJnYS5jCVRhcmdhIGZpbGUgb3V0cHV0LgotCi0KLVJESlBHQ09NL1dSSlBHQ09NCi09PT09PT09PT09PT09PT09PQotCi1DIHNvdXJjZSBjb2RlIGZpbGVzOgotCi1yZGpwZ2NvbS5jCVN0YW5kLWFsb25lIHJkanBnY29tIGFwcGxpY2F0aW9uLgotd3JqcGdjb20uYwlTdGFuZC1hbG9uZSB3cmpwZ2NvbSBhcHBsaWNhdGlvbi4KLQotVGhlc2UgcHJvZ3JhbXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgSUpHIGxpYnJhcnkuICBUaGV5IGRvIHVzZQotamNvbmZpZy5oIGFuZCBqaW5jbHVkZS5oLCBvbmx5IHRvIGltcHJvdmUgcG9ydGFiaWxpdHkuCi0KLQotQURESVRJT05BTCBGSUxFUwotPT09PT09PT09PT09PT09PQotCi1Eb2N1bWVudGF0aW9uIChzZWUgUkVBRE1FIGZvciBhIGd1aWRlIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZpbGVzKToKLQotUkVBRE1FCQlNYXN0ZXIgZG9jdW1lbnRhdGlvbiBmaWxlLgotKi5kb2MJCU90aGVyIGRvY3VtZW50YXRpb24gZmlsZXMuCi0qLjEJCURvY3VtZW50YXRpb24gaW4gVW5peCBtYW4gcGFnZSBmb3JtYXQuCi1jaGFuZ2UubG9nCVZlcnNpb24tdG8tdmVyc2lvbiBjaGFuZ2UgaGlnaGxpZ2h0cy4KLWV4YW1wbGUuYwlTYW1wbGUgY29kZSBmb3IgY2FsbGluZyBKUEVHIGxpYnJhcnkuCi0KLUNvbmZpZ3VyYXRpb24vaW5zdGFsbGF0aW9uIGZpbGVzIGFuZCBwcm9ncmFtcyAoc2VlIGluc3RhbGwuZG9jIGZvciBtb3JlIGluZm8pOgotCi1jb25maWd1cmUJVW5peCBzaGVsbCBzY3JpcHQgdG8gcGVyZm9ybSBhdXRvbWF0aWMgY29uZmlndXJhdGlvbi4KLWx0Y29uZmlnCVN1cHBvcnQgc2NyaXB0cyBmb3IgY29uZmlndXJlIChmcm9tIEdOVSBsaWJ0b29sKS4KLWx0bWFpbi5zaAotY29uZmlnLmd1ZXNzCi1jb25maWcuc3ViCi1pbnN0YWxsLXNoCUluc3RhbGwgc2hlbGwgc2NyaXB0IGZvciB0aG9zZSBVbml4IHN5c3RlbXMgbGFja2luZyBvbmUuCi1ja2NvbmZpZy5jCVByb2dyYW0gdG8gZ2VuZXJhdGUgamNvbmZpZy5oIG9uIG5vbi1Vbml4IHN5c3RlbXMuCi1qY29uZmlnLmRvYwlUZW1wbGF0ZSBmb3IgbWFraW5nIGpjb25maWcuaCBieSBoYW5kLgotbWFrZWZpbGUuKglTYW1wbGUgbWFrZWZpbGVzIGZvciBwYXJ0aWN1bGFyIHN5c3RlbXMuCi1qY29uZmlnLioJU2FtcGxlIGpjb25maWcuaCBmb3IgcGFydGljdWxhciBzeXN0ZW1zLgotYW5zaTJrbnIuYwlEZS1BTlNJZmllciBmb3IgcHJlLUFOU0kgQyBjb21waWxlcnMgKGNvdXJ0ZXN5IG9mCi0JCUwuIFBldGVyIERldXRzY2ggYW5kIEFsYWRkaW4gRW50ZXJwcmlzZXMpLgotCi1UZXN0IGZpbGVzIChzZWUgaW5zdGFsbC5kb2MgZm9yIHRlc3QgcHJvY2VkdXJlKToKLQotdGVzdCouKgkJU291cmNlIGFuZCBjb21wYXJpc29uIGZpbGVzIGZvciBjb25maWRlbmNlIHRlc3QuCi0JCVRoZXNlIGFyZSBiaW5hcnkgaW1hZ2UgZmlsZXMsIE5PVCB0ZXh0IGZpbGVzLgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvaW5zdGFsbC1zaCBiL2xpYmpwZWd0d3JwL2luc3RhbGwtc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4NDM2NjkuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvaW5zdGFsbC1zaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCi0jIFRoaXMgY29tZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKS4KLSMKLSMgQ29weXJpZ2h0IDE5OTEgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKLSMKLSMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0jIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0jIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0jIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgotIyBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCi0jIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCi0jIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgotIyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSMKLSMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKLSMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKLSMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KLSMKLSMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgotIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgotIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KLQotCi0jIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKLQotIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgotZG9pdD0iJHtET0lUUFJPRy19IgotCi0KLSMgcHV0IGluIGFic29sdXRlIHBhdGhzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOyBvciB1c2UgZW52LiB2YXJzLgotCi1tdnByb2c9IiR7TVZQUk9HLW12fSIKLWNwcHJvZz0iJHtDUFBST0ctY3B9IgotY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCi1jaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKLWNoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igotc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCi1ybXByb2c9IiR7Uk1QUk9HLXJtfSIKLW1rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgotCi10cmFuc2Zvcm1iYXNlbmFtZT0iIgotdHJhbnNmb3JtX2FyZz0iIgotaW5zdGNtZD0iJG12cHJvZyIKLWNobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCi1jaG93bmNtZD0iIgotY2hncnBjbWQ9IiIKLXN0cmlwY21kPSIiCi1ybWNtZD0iJHJtcHJvZyAtZiIKLW12Y21kPSIkbXZwcm9nIgotc3JjPSIiCi1kc3Q9IiIKLWRpcl9hcmc9IiIKLQotd2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCi0gICAgY2FzZSAkMSBpbgotCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktZCkgZGlyX2FyZz10cnVlCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQkqKSAgaWYgWyB4IiRzcmMiID0geCBdCi0JICAgIHRoZW4KLQkJc3JjPSQxCi0JICAgIGVsc2UKLQkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCi0JCToKLQkJZHN0PSQxCi0JICAgIGZpCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLSAgICBlc2FjCi1kb25lCi0KLWlmIFsgeCIkc3JjIiA9IHggXQotdGhlbgotCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgotCWV4aXQgMQotZWxzZQotCXRydWUKLWZpCi0KLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCi0JZHN0PSRzcmMKLQlzcmM9IiIKLQkKLQlpZiBbIC1kICRkc3QgXTsgdGhlbgotCQlpbnN0Y21kPToKLQllbHNlCi0JCWluc3RjbWQ9bWtkaXIKLQlmaQotZWxzZQotCi0jIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKLSMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCi0jIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KLQotCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KLQl0aGVuCi0JCXRydWUKLQllbHNlCi0JCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgotCQlleGl0IDEKLQlmaQotCQotCWlmIFsgeCIkZHN0IiA9IHggXQotCXRoZW4KLQkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgotCQlleGl0IDEKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQotIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCi0KLQlpZiBbIC1kICRkc3QgXQotCXRoZW4KLQkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKLQllbHNlCi0JCXRydWUKLQlmaQotZmkKLQotIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCi1kc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCi0KLSMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCi0jICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKLQotIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KLWlmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgotZGVmYXVsdElGUz0nCQotJwotSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKLQotb0lGUz0iJHtJRlN9IgotIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KLUlGUz0nJScKLXNldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAotSUZTPSIke29JRlN9IgotCi1wYXRoY29tcD0nJwotCi13aGlsZSBbICQjIC1uZSAwIF0gOyBkbwotCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCi0Jc2hpZnQKLQotCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOwotICAgICAgICB0aGVuCi0JCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLQlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgotZG9uZQotZmkKLQotaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KLXRoZW4KLQkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCi0KLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCi1lbHNlCi0KLSMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgotCi0JaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAotCXRoZW4KLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKLQllbHNlCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCi0JCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKLQlmaQotCi0jIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKLQotCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCi0JdGhlbgotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLSMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgotCi0JZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCi0KLSMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQotCi0JJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCi0KLQl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKLQotIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCi0KLSMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KLSMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQotIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KLQotCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0KLSMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KLQotCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCi0JJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKLQotZmkgJiYKLQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2luc3RhbGwuZG9jIGIvbGlianBlZ3R3cnAvaW5zdGFsbC5kb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MDJiOTguLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvaW5zdGFsbC5kb2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYzICswLDAgQEAKLUlOU1RBTExBVElPTiBJTlNUUlVDVElPTlMgZm9yIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQotCi1Db3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotCi0KLVRoaXMgZmlsZSBleHBsYWlucyBob3cgdG8gY29uZmlndXJlIGFuZCBpbnN0YWxsIHRoZSBJSkcgc29mdHdhcmUuICBXZSBoYXZlCi10cmllZCB0byBtYWtlIHRoaXMgc29mdHdhcmUgZXh0cmVtZWx5IHBvcnRhYmxlIGFuZCBmbGV4aWJsZSwgc28gdGhhdCBpdCBjYW4gYmUKLWFkYXB0ZWQgdG8gYWxtb3N0IGFueSBlbnZpcm9ubWVudC4gIFRoZSBkb3duc2lkZSBvZiB0aGlzIGRlY2lzaW9uIGlzIHRoYXQgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2VzcyBpcyBjb21wbGljYXRlZC4gIFdlIGhhdmUgcHJvdmlkZWQgc2hvcnRjdXRzIHRvIHNpbXBsaWZ5Ci10aGUgdGFzayBvbiBjb21tb24gc3lzdGVtcy4gIEJ1dCBpbiBhbnkgY2FzZSwgeW91IHdpbGwgbmVlZCBhdCBsZWFzdCBhIGxpdHRsZQotZmFtaWxpYXJpdHkgd2l0aCBDIHByb2dyYW1taW5nIGFuZCBwcm9ncmFtIGJ1aWxkIHByb2NlZHVyZXMgZm9yIHlvdXIgc3lzdGVtLgotCi1JZiB5b3UgYXJlIG9ubHkgdXNpbmcgdGhpcyBzb2Z0d2FyZSBhcyBwYXJ0IG9mIGEgbGFyZ2VyIHByb2dyYW0sIHRoZSBsYXJnZXIKLXByb2dyYW0ncyBpbnN0YWxsYXRpb24gcHJvY2VkdXJlIG1heSB0YWtlIGNhcmUgb2YgY29uZmlndXJpbmcgdGhlIElKRyBjb2RlLgotRm9yIGV4YW1wbGUsIEdob3N0c2NyaXB0J3MgaW5zdGFsbGF0aW9uIHNjcmlwdCB3aWxsIGNvbmZpZ3VyZSB0aGUgSUpHIGNvZGUuCi1Zb3UgZG9uJ3QgbmVlZCB0byByZWFkIHRoaXMgZmlsZSBpZiB5b3UganVzdCB3YW50IHRvIGNvbXBpbGUgR2hvc3RzY3JpcHQuCi0KLUlmIHlvdSBhcmUgb24gYSBVbml4IG1hY2hpbmUsIHlvdSBtYXkgbm90IG5lZWQgdG8gcmVhZCB0aGlzIGZpbGUgYXQgYWxsLgotVHJ5IGRvaW5nCi0JLi9jb25maWd1cmUKLQltYWtlCi0JbWFrZSB0ZXN0Ci1JZiB0aGF0IGRvZXNuJ3QgY29tcGxhaW4sIGRvCi0JbWFrZSBpbnN0YWxsCi0oYmV0dGVyIGRvICJtYWtlIC1uIGluc3RhbGwiIGZpcnN0IHRvIHNlZSBpZiB0aGUgbWFrZWZpbGUgd2lsbCBwdXQgdGhlIGZpbGVzCi13aGVyZSB5b3Ugd2FudCB0aGVtKS4gIFJlYWQgZnVydGhlciBpZiB5b3UgcnVuIGludG8gc25hZ3Mgb3Igd2FudCB0byBjdXN0b21pemUKLXRoZSBjb2RlIGZvciB5b3VyIHN5c3RlbS4KLQotCi1UQUJMRSBPRiBDT05URU5UUwotLS0tLS0tLS0tLS0tLS0tLS0KLQotQmVmb3JlIHlvdSBzdGFydAotQ29uZmlndXJpbmcgdGhlIHNvZnR3YXJlOgotCXVzaW5nIHRoZSBhdXRvbWF0aWMgImNvbmZpZ3VyZSIgc2NyaXB0Ci0JdXNpbmcgb25lIG9mIHRoZSBzdXBwbGllZCBqY29uZmlnIGFuZCBtYWtlZmlsZSBmaWxlcwotCWJ5IGhhbmQKLUJ1aWxkaW5nIHRoZSBzb2Z0d2FyZQotVGVzdGluZyB0aGUgc29mdHdhcmUKLUluc3RhbGxpbmcgdGhlIHNvZnR3YXJlCi1PcHRpb25hbCBzdHVmZgotT3B0aW1pemF0aW9uCi1IaW50cyBmb3Igc3BlY2lmaWMgc3lzdGVtcwotCi0KLUJFRk9SRSBZT1UgU1RBUlQKLT09PT09PT09PT09PT09PT0KLQotQmVmb3JlIGluc3RhbGxpbmcgdGhlIHNvZnR3YXJlIHlvdSBtdXN0IHVucGFjayB0aGUgZGlzdHJpYnV0ZWQgc291cmNlIGNvZGUuCi1TaW5jZSB5b3UgYXJlIHJlYWRpbmcgdGhpcyBmaWxlLCB5b3UgaGF2ZSBwcm9iYWJseSBhbHJlYWR5IHN1Y2NlZWRlZCBpbiB0aGlzCi10YXNrLiAgSG93ZXZlciwgdGhlcmUgaXMgYSBwb3RlbnRpYWwgZm9yIGVycm9yIGlmIHlvdSBuZWVkZWQgdG8gY29udmVydCB0aGUKLWZpbGVzIHRvIHRoZSBsb2NhbCBzdGFuZGFyZCB0ZXh0IGZpbGUgZm9ybWF0IChmb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBvbgotTVMtRE9TIHlvdSBtYXkgaGF2ZSBjb252ZXJ0ZWQgTEYgZW5kLW9mLWxpbmUgdG8gQ1IvTEYpLiAgWW91IG11c3QgYXBwbHkKLXN1Y2ggY29udmVyc2lvbiB0byBhbGwgdGhlIGZpbGVzIEVYQ0VQVCB0aG9zZSB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoICJ0ZXN0Ii4KLVRoZSB0ZXN0IGZpbGVzIGNvbnRhaW4gYmluYXJ5IGRhdGE7IGlmIHlvdSBjaGFuZ2UgdGhlbSBpbiBhbnkgd2F5IHRoZW4gdGhlCi1zZWxmLXRlc3Qgd2lsbCBnaXZlIGJhZCByZXN1bHRzLgotCi1QbGVhc2UgY2hlY2sgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGlzIGZpbGUgdG8gc2VlIGlmIHRoZXJlIGFyZSBoaW50cyBmb3IgdGhlCi1zcGVjaWZpYyBtYWNoaW5lIG9yIGNvbXBpbGVyIHlvdSBhcmUgdXNpbmcuCi0KLQotQ09ORklHVVJJTkcgVEhFIFNPRlRXQVJFCi09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVG8gY29uZmlndXJlIHRoZSBJSkcgY29kZSBmb3IgeW91ciBzeXN0ZW0sIHlvdSBuZWVkIHRvIGNyZWF0ZSB0d28gZmlsZXM6Ci0gICogamNvbmZpZy5oOiBjb250YWlucyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgI2RlZmluZSBzeW1ib2xzLgotICAqIE1ha2VmaWxlOiBjb250cm9scyB0aGUgY29tcGlsYXRpb24gcHJvY2Vzcy4KLShPbiBhIG5vbi1Vbml4IG1hY2hpbmUsIHlvdSBtYXkgY3JlYXRlICJwcm9qZWN0IGZpbGVzIiBvciBzb21lIG90aGVyCi1zdWJzdGl0dXRlIGZvciBhIE1ha2VmaWxlLiAgamNvbmZpZy5oIGlzIG5lZWRlZCBpbiBhbnkgZW52aXJvbm1lbnQuKQotCi1XZSBwcm92aWRlIHRocmVlIGRpZmZlcmVudCB3YXlzIHRvIGdlbmVyYXRlIHRoZXNlIGZpbGVzOgotICAqIE9uIGEgVW5peCBzeXN0ZW0sIHlvdSBjYW4ganVzdCBydW4gdGhlICJjb25maWd1cmUiIHNjcmlwdC4KLSAgKiBXZSBwcm92aWRlIHNhbXBsZSBqY29uZmlnIGZpbGVzIGFuZCBtYWtlZmlsZXMgZm9yIHBvcHVsYXIgbWFjaGluZXM7Ci0gICAgaWYgeW91ciBtYWNoaW5lIG1hdGNoZXMgb25lIG9mIHRoZSBzYW1wbGVzLCBqdXN0IGNvcHkgdGhlIHJpZ2h0IHNhbXBsZQotICAgIGZpbGVzIHRvIGpjb25maWcuaCBhbmQgTWFrZWZpbGUuCi0gICogSWYgYWxsIGVsc2UgZmFpbHMsIHJlYWQgdGhlIGluc3RydWN0aW9ucyBiZWxvdyBhbmQgbWFrZSB5b3VyIG93biBmaWxlcy4KLQotCi1Db25maWd1cmluZyB0aGUgc29mdHdhcmUgdXNpbmcgdGhlIGF1dG9tYXRpYyAiY29uZmlndXJlIiBzY3JpcHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JZiB5b3UgYXJlIG9uIGEgVW5peCBtYWNoaW5lLCB5b3UgY2FuIGp1c3QgdHlwZQotCS4vY29uZmlndXJlCi1hbmQgbGV0IHRoZSBjb25maWd1cmUgc2NyaXB0IGNvbnN0cnVjdCBhcHByb3ByaWF0ZSBjb25maWd1cmF0aW9uIGZpbGVzLgotSWYgeW91J3JlIHVzaW5nICJjc2giIG9uIGFuIG9sZCB2ZXJzaW9uIG9mIFN5c3RlbSBWLCB5b3UgbWlnaHQgbmVlZCB0byB0eXBlCi0Jc2ggY29uZmlndXJlCi1pbnN0ZWFkIHRvIHByZXZlbnQgY3NoIGZyb20gdHJ5aW5nIHRvIGV4ZWN1dGUgY29uZmlndXJlIGl0c2VsZi4KLUV4cGVjdCBjb25maWd1cmUgdG8gcnVuIGZvciBhIGZldyBtaW51dGVzLCBwYXJ0aWN1bGFybHkgb24gc2xvd2VyIG1hY2hpbmVzOwotaXQgd29ya3MgYnkgY29tcGlsaW5nIGEgc2VyaWVzIG9mIHRlc3QgcHJvZ3JhbXMuCi0KLUNvbmZpZ3VyZSB3YXMgY3JlYXRlZCB3aXRoIEdOVSBBdXRvY29uZiBhbmQgaXQgZm9sbG93cyB0aGUgdXN1YWwgY29udmVudGlvbnMKLWZvciBHTlUgY29uZmlndXJlIHNjcmlwdHMuICBJdCBtYWtlcyBhIGZldyBhc3N1bXB0aW9ucyB0aGF0IHlvdSBtYXkgd2FudCB0bwotb3ZlcnJpZGUuICBZb3UgY2FuIGRvIHRoaXMgYnkgcHJvdmlkaW5nIG9wdGlvbmFsIHN3aXRjaGVzIHRvIGNvbmZpZ3VyZToKLQotKiBJZiB5b3Ugd2FudCB0byBidWlsZCBsaWJqcGVnIGFzIGEgc2hhcmVkIGxpYnJhcnksIHNheQotCS4vY29uZmlndXJlIC0tZW5hYmxlLXNoYXJlZAotVG8gZ2V0IGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzLCBzYXkKLQkuL2NvbmZpZ3VyZSAtLWVuYWJsZS1zaGFyZWQgLS1lbmFibGUtc3RhdGljCi1Ob3RlIHRoYXQgdGhlc2Ugc3dpdGNoZXMgaW52b2tlIEdOVSBsaWJ0b29sIHRvIHRha2UgY2FyZSBvZiBzeXN0ZW0tZGVwZW5kZW50Ci1zaGFyZWQgbGlicmFyeSBidWlsZGluZyBtZXRob2RzLiAgSWYgdGhpbmdzIGRvbid0IHdvcmsgdGhpcyB3YXksIHBsZWFzZSB0cnkKLXJ1bm5pbmcgY29uZmlndXJlIHdpdGhvdXQgZWl0aGVyIHN3aXRjaDsgdGhhdCBzaG91bGQgYnVpbGQgYSBzdGF0aWMgbGlicmFyeQotd2l0aG91dCB1c2luZyBsaWJ0b29sLiAgSWYgdGhhdCB3b3JrcywgeW91ciBwcm9ibGVtIGlzIHByb2JhYmx5IHdpdGggbGlidG9vbAotbm90IHdpdGggdGhlIElKRyBjb2RlLiAgbGlidG9vbCBpcyBmYWlybHkgbmV3IGFuZCBkb2Vzbid0IHN1cHBvcnQgYWxsIGZsYXZvcnMKLW9mIFVuaXggeWV0LiAgKFlvdSBtaWdodCBiZSBhYmxlIHRvIGZpbmQgYSBuZXdlciB2ZXJzaW9uIG9mIGxpYnRvb2wgdGhhbiB0aGUKLW9uZSBpbmNsdWRlZCB3aXRoIGxpYmpwZWc7IHNlZSBmdHAuZ251Lm9yZy4gIFJlcG9ydCBsaWJ0b29sIHByb2JsZW1zIHRvCi1idWctbGlidG9vbEBnbnUub3JnLikKLQotKiBDb25maWd1cmUgd2lsbCB1c2UgZ2NjIChHTlUgQyBjb21waWxlcikgaWYgaXQncyBhdmFpbGFibGUsIG90aGVyd2lzZSBjYy4KLVRvIGZvcmNlIGEgcGFydGljdWxhciBjb21waWxlciB0byBiZSBzZWxlY3RlZCwgdXNlIHRoZSBDQyBvcHRpb24sIGZvciBleGFtcGxlCi0JLi9jb25maWd1cmUgQ0M9J2NjJwotVGhlIHNhbWUgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGluY2x1ZGUgYW55IHVudXN1YWwgY29tcGlsZXIgc3dpdGNoZXMuCi1Gb3IgZXhhbXBsZSwgb24gSFAtVVggeW91IHByb2JhYmx5IHdhbnQgdG8gc2F5Ci0JLi9jb25maWd1cmUgQ0M9J2NjIC1BYScKLXRvIGdldCBIUCdzIGNvbXBpbGVyIHRvIHJ1biBpbiBBTlNJIG1vZGUuCi0KLSogVGhlIGRlZmF1bHQgQ0ZMQUdTIHNldHRpbmcgaXMgIi1PIiBmb3Igbm9uLWdjYyBjb21waWxlcnMsICItTzIiIGZvciBnY2MuCi1Zb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgc2F5aW5nLCBmb3IgZXhhbXBsZSwKLQkuL2NvbmZpZ3VyZSBDRkxBR1M9Jy1nJwotaWYgeW91IHdhbnQgdG8gY29tcGlsZSB3aXRoIGRlYnVnZ2luZyBzdXBwb3J0LgotCi0qIENvbmZpZ3VyZSB3aWxsIHNldCB1cCB0aGUgbWFrZWZpbGUgc28gdGhhdCAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgZmlsZXMKLWludG8gL3Vzci9sb2NhbC9iaW4sIC91c3IvbG9jYWwvbWFuLCBldGMuICBZb3UgY2FuIHNwZWNpZnkgYW4gaW5zdGFsbGF0aW9uCi1wcmVmaXggb3RoZXIgdGhhbiAiL3Vzci9sb2NhbCIgYnkgZ2l2aW5nIGNvbmZpZ3VyZSB0aGUgb3B0aW9uICItLXByZWZpeD1QQVRIIi4KLQotKiBJZiB5b3UgZG9uJ3QgaGF2ZSBhIGxvdCBvZiBzd2FwIHNwYWNlLCB5b3UgbWF5IG5lZWQgdG8gZW5hYmxlIHRoZSBJSkcKLXNvZnR3YXJlJ3MgaW50ZXJuYWwgdmlydHVhbCBtZW1vcnkgbWVjaGFuaXNtLiAgVG8gZG8gdGhpcywgZ2l2ZSB0aGUgb3B0aW9uCi0iLS1lbmFibGUtbWF4bWVtPU4iIHdoZXJlIE4gaXMgdGhlIGRlZmF1bHQgbWF4bWVtb3J5IGxpbWl0IGluIG1lZ2FieXRlcy4KLVRoaXMgaXMgZGlzY3Vzc2VkIGluIG1vcmUgZGV0YWlsIHVuZGVyICJTZWxlY3RpbmcgYSBtZW1vcnkgbWFuYWdlciIsIGJlbG93LgotWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyBvbiByZWFzb25hYmx5LXNpemVkIFVuaXggbWFjaGluZXMsCi11bmxlc3MgeW91IHBsYW4gdG8gcHJvY2VzcyB2ZXJ5IGxhcmdlIGltYWdlcy4KLQotQ29uZmlndXJlIGhhcyBzb21lIG90aGVyIGZlYXR1cmVzIHRoYXQgYXJlIHVzZWZ1bCBpZiB5b3UgYXJlIGNyb3NzLWNvbXBpbGluZwotb3Igd29ya2luZyBpbiBhIG5ldHdvcmsgb2YgbXVsdGlwbGUgbWFjaGluZSB0eXBlczsgYnV0IGlmIHlvdSBuZWVkIHRob3NlCi1mZWF0dXJlcywgeW91IHByb2JhYmx5IGFscmVhZHkga25vdyBob3cgdG8gdXNlIHRoZW0uCi0KLQotQ29uZmlndXJpbmcgdGhlIHNvZnR3YXJlIHVzaW5nIG9uZSBvZiB0aGUgc3VwcGxpZWQgamNvbmZpZyBhbmQgbWFrZWZpbGUgZmlsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBzeXN0ZW1zLCB5b3UgY2FuIGp1c3QgdXNlIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uCi1maWxlczoKLQotTWFrZWZpbGUJamNvbmZpZyBmaWxlCVN5c3RlbSBhbmQvb3IgY29tcGlsZXIKLQotbWFrZWZpbGUubWFueAlqY29uZmlnLm1hbngJQW1pZ2EsIE1hbnggQXp0ZWMgQwotbWFrZWZpbGUuc2FzCWpjb25maWcuc2FzCUFtaWdhLCBTQVMgQwotbWFrZXByb2oubWFjCWpjb25maWcubWFjCUFwcGxlIE1hY2ludG9zaCwgTWV0cm93ZXJrcyBDb2RlV2FycmlvcgotbWFrKmpwZWcuc3QJamNvbmZpZy5zdAlBdGFyaSBTVC9TVEUvVFQsIFB1cmUgQyBvciBUdXJibyBDCi1tYWtlZmlsZS5iY2MJamNvbmZpZy5iY2MJTVMtRE9TIG9yIE9TLzIsIEJvcmxhbmQgQwotbWFrZWZpbGUuZGoJamNvbmZpZy5kaglNUy1ET1MsIERKR1BQIChEZWxvcmllJ3MgcG9ydCBvZiBHTlUgQykKLW1ha2VmaWxlLm1jNglqY29uZmlnLm1jNglNUy1ET1MsIE1pY3Jvc29mdCBDICgxNi1iaXQgb25seSkKLW1ha2VmaWxlLndhdAlqY29uZmlnLndhdAlNUy1ET1MsIE9TLzIsIG9yIFdpbmRvd3MgTlQsIFdhdGNvbSBDCi1tYWtlZmlsZS52YwlqY29uZmlnLnZjCVdpbmRvd3MgTlQvOTUsIE1TIFZpc3VhbCBDKysKLW1ha2UqLmRzCWpjb25maWcudmMJV2luZG93cyBOVC85NSwgTVMgRGV2ZWxvcGVyIFN0dWRpbwotbWFrZWZpbGUubW1zCWpjb25maWcudm1zCURpZ2l0YWwgVk1TLCB3aXRoIE1NUyBzb2Z0d2FyZQotbWFrZWZpbGUudm1zCWpjb25maWcudm1zCURpZ2l0YWwgVk1TLCB3aXRob3V0IE1NUyBzb2Z0d2FyZQotCi1Db3B5IHRoZSBwcm9wZXIgamNvbmZpZyBmaWxlIHRvIGpjb25maWcuaCBhbmQgdGhlIG1ha2VmaWxlIHRvIE1ha2VmaWxlIChvcgotd2hhdGV2ZXIgeW91ciBzeXN0ZW0gdXNlcyBhcyB0aGUgc3RhbmRhcmQgbWFrZWZpbGUgbmFtZSkuICBGb3IgbW9yZSBpbmZvIHNlZQotdGhlIGFwcHJvcHJpYXRlIHN5c3RlbS1zcGVjaWZpYyBoaW50cyBzZWN0aW9uIG5lYXIgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCi0KLQotQ29uZmlndXJpbmcgdGhlIHNvZnR3YXJlIGJ5IGhhbmQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUZpcnN0LCBnZW5lcmF0ZSBhIGpjb25maWcuaCBmaWxlLiAgSWYgeW91IGFyZSBtb2RlcmF0ZWx5IGZhbWlsaWFyIHdpdGggQywKLXRoZSBjb21tZW50cyBpbiBqY29uZmlnLmRvYyBzaG91bGQgYmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRvIHRoaXM7IGp1c3QKLWNvcHkgamNvbmZpZy5kb2MgdG8gamNvbmZpZy5oIGFuZCBlZGl0IGl0IGFwcHJvcHJpYXRlbHkuICBPdGhlcndpc2UsIHlvdSBtYXkKLXByZWZlciB0byB1c2UgdGhlIGNrY29uZmlnLmMgcHJvZ3JhbS4gIFlvdSB3aWxsIG5lZWQgdG8gY29tcGlsZSBhbmQgZXhlY3V0ZQotY2tjb25maWcuYyBieSBoYW5kIC0tLSB3ZSBob3BlIHlvdSBrbm93IGF0IGxlYXN0IGVub3VnaCB0byBkbyB0aGF0LgotY2tjb25maWcuYyBtYXkgbm90IGNvbXBpbGUgdGhlIGZpcnN0IHRyeSAoaW4gZmFjdCwgdGhlIHdob2xlIGlkZWEgaXMgZm9yIGl0Ci10byBmYWlsIGlmIGFueXRoaW5nIGlzIGdvaW5nIHRvKS4gIElmIHlvdSBnZXQgY29tcGlsZSBlcnJvcnMsIGZpeCB0aGVtIGJ5Ci1lZGl0aW5nIGNrY29uZmlnLmMgYWNjb3JkaW5nIHRvIHRoZSBkaXJlY3Rpb25zIGdpdmVuIGluIGNrY29uZmlnLmMuICBPbmNlCi15b3UgZ2V0IGl0IHRvIHJ1biwgaXQgd2lsbCB3cml0ZSBhIHN1aXRhYmxlIGpjb25maWcuaCBmaWxlLCBhbmQgd2lsbCBhbHNvCi1wcmludCBvdXQgc29tZSBhZHZpY2UgYWJvdXQgd2hpY2ggbWFrZWZpbGUgdG8gdXNlLgotCi1Zb3UgbWF5IGFsc28gd2FudCB0byBsb29rIGF0IHRoZSBjYW5uZWQgamNvbmZpZyBmaWxlcywgaWYgdGhlcmUgaXMgb25lIGZvciBhCi1zeXN0ZW0gc2ltaWxhciB0byB5b3Vycy4KLQotU2Vjb25kLCBzZWxlY3QgYSBtYWtlZmlsZSBhbmQgY29weSBpdCB0byBNYWtlZmlsZSAob3Igd2hhdGV2ZXIgeW91ciBzeXN0ZW0KLXVzZXMgYXMgdGhlIHN0YW5kYXJkIG1ha2VmaWxlIG5hbWUpLiAgVGhlIG1vc3QgZ2VuZXJpYyBtYWtlZmlsZXMgd2UgcHJvdmlkZQotYXJlCi0JbWFrZWZpbGUuYW5zaToJaWYgeW91ciBDIGNvbXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIHByb3RvdHlwZXMKLQltYWtlZmlsZS51bml4OglpZiBub3QuCi0oWW91IGhhdmUgZnVuY3Rpb24gcHJvdG90eXBlcyBpZiBja2NvbmZpZy5jIHB1dCAiI2RlZmluZSBIQVZFX1BST1RPVFlQRVMiCi1pbiBqY29uZmlnLmguKSAgWW91IG1heSB3YW50IHRvIHN0YXJ0IGZyb20gb25lIG9mIHRoZSBvdGhlciBtYWtlZmlsZXMgaWYKLXRoZXJlIGlzIG9uZSBmb3IgYSBzeXN0ZW0gc2ltaWxhciB0byB5b3Vycy4KLQotTG9vayBvdmVyIHRoZSBzZWxlY3RlZCBNYWtlZmlsZSBhbmQgYWRqdXN0IG9wdGlvbnMgYXMgbmVlZGVkLiAgSW4gcGFydGljdWxhcgoteW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGUgQ0MgYW5kIENGTEFHUyBkZWZpbml0aW9ucy4gIEZvciBpbnN0YW5jZSwgaWYgeW91Ci1hcmUgdXNpbmcgR0NDLCBzZXQgQ0M9Z2NjLiAgSWYgeW91IGhhZCB0byB1c2UgYW55IGNvbXBpbGVyIHN3aXRjaGVzIHRvIGdldAotY2tjb25maWcuYyB0byB3b3JrLCBtYWtlIHN1cmUgdGhlIHNhbWUgc3dpdGNoZXMgYXJlIGluIENGTEFHUy4KLQotSWYgeW91IGFyZSBvbiBhIHN5c3RlbSB0aGF0IGRvZXNuJ3QgdXNlIG1ha2VmaWxlcywgeW91J2xsIG5lZWQgdG8gc2V0IHVwCi1wcm9qZWN0IGZpbGVzIChvciB3aGF0ZXZlciB5b3UgZG8gdXNlKSB0byBjb21waWxlIGFsbCB0aGUgc291cmNlIGZpbGVzIGFuZAotbGluayB0aGVtIGludG8gZXhlY3V0YWJsZSBmaWxlcyBjanBlZywgZGpwZWcsIGpwZWd0cmFuLCByZGpwZ2NvbSwgYW5kIHdyanBnY29tLgotU2VlIHRoZSBmaWxlIGxpc3RzIGluIGFueSBvZiB0aGUgbWFrZWZpbGVzIHRvIGZpbmQgb3V0IHdoaWNoIGZpbGVzIGdvIGludG8KLWVhY2ggcHJvZ3JhbS4gIE5vdGUgdGhhdCB0aGUgcHJvdmlkZWQgbWFrZWZpbGVzIGFsbCBtYWtlIGEgImxpYnJhcnkiIGZpbGUKLWxpYmpwZWcgZmlyc3QsIGJ1dCB5b3UgZG9uJ3QgaGF2ZSB0byBkbyB0aGF0IGlmIHlvdSBkb24ndCB3YW50IHRvOyB0aGUgZmlsZQotbGlzdHMgaWRlbnRpZnkgd2hpY2ggc291cmNlIGZpbGVzIGFyZSBhY3R1YWxseSBuZWVkZWQgZm9yIGNvbXByZXNzaW9uLAotZGVjb21wcmVzc2lvbiwgb3IgYm90aC4gIEFzIGEgbGFzdCByZXNvcnQsIHlvdSBjYW4gbWFrZSBhIGJhdGNoIHNjcmlwdCB0aGF0Ci1qdXN0IGNvbXBpbGVzIGV2ZXJ5dGhpbmcgYW5kIGxpbmtzIGl0IGFsbCB0b2dldGhlcjsgbWFrZWZpbGUudm1zIGlzIGFuIGV4YW1wbGUKLW9mIHRoaXMgKGl0J3MgZm9yIFZNUyBzeXN0ZW1zIHRoYXQgaGF2ZSBubyBtYWtlLWxpa2UgdXRpbGl0eSkuCi0KLUhlcmUgYXJlIGNvbW1lbnRzIGFib3V0IHNvbWUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkZWNpc2lvbnMgeW91J2xsCi1uZWVkIHRvIG1ha2U6Ci0KLUNvbW1hbmQgbGluZSBzdHlsZQotLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZXNlIHByb2dyYW1zIGNhbiB1c2UgYSBVbml4LWxpa2UgY29tbWFuZCBsaW5lIHN0eWxlIHdoaWNoIHN1cHBvcnRzCi1yZWRpcmVjdGlvbiBhbmQgcGlwaW5nLCBsaWtlIHRoaXM6Ci0JY2pwZWcgaW5wdXRmaWxlID5vdXRwdXRmaWxlCi0JY2pwZWcgPGlucHV0ZmlsZSA+b3V0cHV0ZmlsZQotCXNvdXJjZSBwcm9ncmFtIHwgY2pwZWcgPm91dHB1dGZpbGUKLVRoZSBzaW1wbGVyICJ0d28gZmlsZSIgY29tbWFuZCBsaW5lIHN0eWxlIGlzIGp1c3QKLQljanBlZyBpbnB1dGZpbGUgb3V0cHV0ZmlsZQotWW91IG1heSBwcmVmZXIgdGhlIHR3by1maWxlIHN0eWxlLCBwYXJ0aWN1bGFybHkgaWYgeW91IGRvbid0IGhhdmUgcGlwZXMuCi0KLVlvdSBNVVNUIHVzZSB0d28tZmlsZSBzdHlsZSBvbiBhbnkgc3lzdGVtIHRoYXQgZG9lc24ndCBjb3BlIHdlbGwgd2l0aCBiaW5hcnkKLWRhdGEgZmVkIHRocm91Z2ggc3RkaW4vc3Rkb3V0OyB0aGlzIGlzIHRydWUgZm9yIHNvbWUgTVMtRE9TIGNvbXBpbGVycywgZm9yCi1leGFtcGxlLiAgSWYgeW91J3JlIG5vdCBvbiBhIFVuaXggc3lzdGVtLCBpdCdzIHNhZmVzdCB0byBhc3N1bWUgeW91IG5lZWQKLXR3by1maWxlIHN0eWxlLiAgKEJ1dCBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIGVpdGhlciB0aGUgUG9zaXgtc3RhbmRhcmQKLWZkb3BlbigpIGxpYnJhcnkgcm91dGluZSBvciBhIE1pY3Jvc29mdC1jb21wYXRpYmxlIHNldG1vZGUoKSByb3V0aW5lLCB5b3UKLWNhbiBzYWZlbHkgdXNlIHRoZSBVbml4IGNvbW1hbmQgbGluZSBzdHlsZSwgYnkgZGVmaW5pbmcgVVNFX0ZET1BFTiBvcgotVVNFX1NFVE1PREUgcmVzcGVjdGl2ZWx5LikKLQotVG8gdXNlIHRoZSB0d28tZmlsZSBzdHlsZSwgbWFrZSBqY29uZmlnLmggc2F5ICIjZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FIi4KLQotU2VsZWN0aW5nIGEgbWVtb3J5IG1hbmFnZXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBJSkcgY29kZSBpcyBjYXBhYmxlIG9mIHdvcmtpbmcgb24gaW1hZ2VzIHRoYXQgYXJlIHRvbyBiaWcgdG8gZml0IGluIG1haW4KLW1lbW9yeTsgZGF0YSBpcyBzd2FwcGVkIG91dCB0byB0ZW1wb3JhcnkgZmlsZXMgYXMgbmVjZXNzYXJ5LiAgSG93ZXZlciwgdGhlCi1jb2RlIHRvIGRvIHRoaXMgaXMgcmF0aGVyIHN5c3RlbS1kZXBlbmRlbnQuICBXZSBwcm92aWRlIGZpdmUgZGlmZmVyZW50Ci1tZW1vcnkgbWFuYWdlcnM6Ci0KLSogam1lbWFuc2kuYwlUaGlzIHZlcnNpb24gdXNlcyB0aGUgQU5TSS1zdGFuZGFyZCBsaWJyYXJ5IHJvdXRpbmUgdG1wZmlsZSgpLAotCQl3aGljaCBub3QgYWxsIG5vbi1BTlNJIHN5c3RlbXMgaGF2ZS4gIE9uIHNvbWUgc3lzdGVtcwotCQl0bXBmaWxlKCkgbWF5IHB1dCB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gYSBub24tb3B0aW1hbAotCQlsb2NhdGlvbjsgaWYgeW91IGRvbid0IGxpa2Ugd2hhdCBpdCBkb2VzLCB1c2Ugam1lbW5hbWUuYy4KLQotKiBqbWVtbmFtZS5jCVRoaXMgdmVyc2lvbiBjcmVhdGVzIG5hbWVkIHRlbXBvcmFyeSBmaWxlcy4gIEZvciBhbnl0aGluZwotCQlleGNlcHQgYSBVbml4IG1hY2hpbmUsIHlvdSdsbCBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUKLQkJc2VsZWN0X2ZpbGVfbmFtZSgpIHJvdXRpbmUgYXBwcm9wcmlhdGVseTsgc2VlIHRoZSBjb21tZW50cwotCQluZWFyIHRoZSBoZWFkIG9mIGptZW1uYW1lLmMuICBJZiB5b3UgdXNlIHRoaXMgdmVyc2lvbiwgZGVmaW5lCi0JCU5FRURfU0lHTkFMX0NBVENIRVIgaW4gamNvbmZpZy5oIHRvIG1ha2Ugc3VyZSB0aGUgdGVtcCBmaWxlcwotCQlhcmUgcmVtb3ZlZCBpZiB0aGUgcHJvZ3JhbSBpcyBhYm9ydGVkLgotCi0qIGptZW1ub2JzLmMJKFRoYXQgc3RhbmRzIGZvciBObyBCYWNraW5nIFN0b3JlIDotKS4pICBUaGlzIHdpbGwgY29tcGlsZSBvbgotCQlhbG1vc3QgYW55IHN5c3RlbSwgYnV0IGl0IGFzc3VtZXMgeW91IGhhdmUgZW5vdWdoIG1haW4gbWVtb3J5Ci0JCW9yIHZpcnR1YWwgbWVtb3J5IHRvIGhvbGQgdGhlIGJpZ2dlc3QgaW1hZ2VzIHlvdSB3b3JrIHdpdGguCi0KLSogam1lbWRvcy5jCVRoaXMgc2hvdWxkIGJlIHVzZWQgd2l0aCBtb3N0IDE2LWJpdCBNUy1ET1MgY29tcGlsZXJzLgotCQlTZWUgdGhlIHN5c3RlbS1zcGVjaWZpYyBub3RlcyBhYm91dCBNUy1ET1MgZm9yIG1vcmUgaW5mby4KLQkJSU1QT1JUQU5UOiBpZiB5b3UgdXNlIHRoaXMsIGRlZmluZSBVU0VfTVNET1NfTUVNTUdSIGluCi0JCWpjb25maWcuaCwgYW5kIGluY2x1ZGUgdGhlIGFzc2VtYmx5IGZpbGUgam1lbWRvc2EuYXNtIGluIHRoZQotCQlwcm9ncmFtcy4gIFRoZSBzdXBwbGllZCBtYWtlZmlsZXMgYW5kIGpjb25maWcgZmlsZXMgZm9yCi0JCTE2LWJpdCBNUy1ET1MgY29tcGlsZXJzIGFscmVhZHkgZG8gYm90aC4KLQotKiBqbWVtbWFjLmMJQ3VzdG9tIHZlcnNpb24gZm9yIEFwcGxlIE1hY2ludG9zaDsgc2VlIHRoZSBzeXN0ZW0tc3BlY2lmaWMKLQkJbm90ZXMgZm9yIE1hY2ludG9zaCBmb3IgbW9yZSBpbmZvLgotCi1UbyB1c2UgYSBwYXJ0aWN1bGFyIG1lbW9yeSBtYW5hZ2VyLCBjaGFuZ2UgdGhlIFNZU0RFUE1FTSB2YXJpYWJsZSBpbiB5b3VyCi1tYWtlZmlsZSB0byBlcXVhbCB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QgZmlsZSBuYW1lIChmb3IgZXhhbXBsZSwgam1lbWFuc2kubwotb3Igam1lbWFuc2kub2JqIGZvciBqbWVtYW5zaS5jKS4KLQotSWYgeW91IGhhdmUgcGxlbnR5IG9mIChyZWFsIG9yIHZpcnR1YWwpIG1haW4gbWVtb3J5LCBqdXN0IHVzZSBqbWVtbm9icy5jLgotIlBsZW50eSIgbWVhbnMgYWJvdXQgdGVuIGJ5dGVzIGZvciBldmVyeSBwaXhlbCBpbiB0aGUgbGFyZ2VzdCBpbWFnZXMKLXlvdSBwbGFuIHRvIHByb2Nlc3MsIHNvIGEgbG90IG9mIHN5c3RlbXMgZG9uJ3QgbWVldCB0aGlzIGNyaXRlcmlvbi4KLUlmIHlvdXJzIGRvZXNuJ3QsIHRyeSBqbWVtYW5zaS5jIGZpcnN0LiAgSWYgdGhhdCBkb2Vzbid0IGNvbXBpbGUsIHlvdSdsbCBoYXZlCi10byB1c2Ugam1lbW5hbWUuYzsgYmUgc3VyZSB0byBhZGp1c3Qgc2VsZWN0X2ZpbGVfbmFtZSgpIGZvciBsb2NhbCBjb25kaXRpb25zLgotWW91IG1heSBhbHNvIG5lZWQgdG8gY2hhbmdlIHVubGluaygpIHRvIHJlbW92ZSgpIGluIGNsb3NlX2JhY2tpbmdfc3RvcmUoKS4KLQotRXhjZXB0IHdpdGggam1lbW5vYnMuYyBvciBqbWVtbWFjLmMsIHlvdSBuZWVkIHRvIGFkanVzdCB0aGUgREVGQVVMVF9NQVhfTUVNCi1zZXR0aW5nIHRvIGEgcmVhc29uYWJsZSB2YWx1ZSBmb3IgeW91ciBzeXN0ZW0gKGVpdGhlciBieSBhZGRpbmcgYSAjZGVmaW5lIGZvcgotREVGQVVMVF9NQVhfTUVNIHRvIGpjb25maWcuaCwgb3IgYnkgYWRkaW5nIGEgLUQgc3dpdGNoIHRvIHRoZSBNYWtlZmlsZSkuCi1UaGlzIHZhbHVlIGxpbWl0cyB0aGUgYW1vdW50IG9mIGRhdGEgc3BhY2UgdGhlIHByb2dyYW0gd2lsbCBhdHRlbXB0IHRvCi1hbGxvY2F0ZS4gIENvZGUgYW5kIHN0YXRpYyBkYXRhIHNwYWNlIGlzbid0IGNvdW50ZWQsIHNvIHRoZSBhY3R1YWwgbWVtb3J5Ci1uZWVkcyBmb3IgY2pwZWcgb3IgZGpwZWcgYXJlIHR5cGljYWxseSAxMDAgdG8gMTUwS2IgbW9yZSB0aGFuIHRoZSBtYXgtbWVtb3J5Ci1zZXR0aW5nLiAgTGFyZ2VyIG1heC1tZW1vcnkgc2V0dGluZ3MgcmVkdWNlIHRoZSBhbW91bnQgb2YgSS9PIG5lZWRlZCB0bwotcHJvY2VzcyBhIGxhcmdlIGltYWdlLCBidXQgdG9vIGxhcmdlIGEgdmFsdWUgY2FuIHJlc3VsdCBpbiAiaW5zdWZmaWNpZW50Ci1tZW1vcnkiIGZhaWx1cmVzLiAgT24gbW9zdCBVbml4IG1hY2hpbmVzIChhbmQgb3RoZXIgc3lzdGVtcyB3aXRoIHZpcnR1YWwKLW1lbW9yeSksIGp1c3Qgc2V0IERFRkFVTFRfTUFYX01FTSB0byBzZXZlcmFsIG1pbGxpb24gYW5kIGZvcmdldCBpdC4gIEF0IHRoZQotb3RoZXIgZW5kIG9mIHRoZSBzcGVjdHJ1bSwgZm9yIE1TLURPUyBtYWNoaW5lcyB5b3UgcHJvYmFibHkgY2FuJ3QgZ28gbXVjaAotYWJvdmUgMzAwSyB0byA0MDBLLiAgKE9uIE1TLURPUyB0aGUgdmFsdWUgcmVmZXJzIHRvIGNvbnZlbnRpb25hbCBtZW1vcnkgb25seS4KLUV4dGVuZGVkL2V4cGFuZGVkIG1lbW9yeSBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYnkgam1lbWRvcy5jLikKLQotCi1CVUlMRElORyBUSEUgU09GVFdBUkUKLT09PT09PT09PT09PT09PT09PT09PQotCi1Ob3cgeW91IHNob3VsZCBiZSBhYmxlIHRvIGNvbXBpbGUgdGhlIHNvZnR3YXJlLiAgSnVzdCBzYXkgIm1ha2UiIChvcgotd2hhdGV2ZXIncyBuZWNlc3NhcnkgdG8gc3RhcnQgdGhlIGNvbXBpbGF0aW9uKS4gIEhhdmUgYSBjdXAgb2YgY29mZmVlLgotCi1IZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IGNvdWxkIGdvIHdyb25nOgotCi1JZiB5b3VyIGNvbXBpbGVyIGNvbXBsYWlucyBhYm91dCB1bmRlZmluZWQgc3RydWN0dXJlcywgeW91IHNob3VsZCBiZSBhYmxlIHRvCi1zaHV0IGl0IHVwIGJ5IHB1dHRpbmcgIiNkZWZpbmUgSU5DT01QTEVURV9UWVBFU19CUk9LRU4iIGluIGpjb25maWcuaC4KLQotSWYgeW91IGhhdmUgdHJvdWJsZSB3aXRoIG1pc3Npbmcgc3lzdGVtIGluY2x1ZGUgZmlsZXMgb3IgaW5jbHVzaW9uIG9mIHRoZQotd3Jvbmcgb25lcywgcmVhZCBqaW5jbHVkZS5oLiAgVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGlmIHlvdSB1c2VkIGNvbmZpZ3VyZQotb3IgY2tjb25maWcuYyB0byBzZXQgdXAgamNvbmZpZy5oLgotCi1UaGVyZSBhcmUgYSBmYWlyIG51bWJlciBvZiByb3V0aW5lcyB0aGF0IGRvIG5vdCB1c2UgYWxsIG9mIHRoZWlyIHBhcmFtZXRlcnM7Ci1zb21lIGNvbXBpbGVycyB3aWxsIGlzc3VlIHdhcm5pbmdzIGFib3V0IHRoaXMsIHdoaWNoIHlvdSBjYW4gaWdub3JlLiAgVGhlcmUKLWFyZSBhbHNvIGEgZmV3IGNvbmZpZ3VyYXRpb24gY2hlY2tzIHRoYXQgbWF5IGdpdmUgInVucmVhY2hhYmxlIGNvZGUiIHdhcm5pbmdzLgotQW55IG90aGVyIHdhcm5pbmcgZGVzZXJ2ZXMgaW52ZXN0aWdhdGlvbi4KLQotSWYgeW91IGRvbid0IGhhdmUgYSBnZXRlbnYoKSBsaWJyYXJ5IHJvdXRpbmUsIGRlZmluZSBOT19HRVRFTlYuCi0KLUFsc28gc2VlIHRoZSBzeXN0ZW0tc3BlY2lmaWMgaGludHMsIGJlbG93LgotCi0KLVRFU1RJTkcgVEhFIFNPRlRXQVJFCi09PT09PT09PT09PT09PT09PT09PQotCi1BcyBhIHF1aWNrIHRlc3Qgb2YgZnVuY3Rpb25hbGl0eSB3ZSd2ZSBpbmNsdWRlZCBhIHNtYWxsIHNhbXBsZSBpbWFnZSBpbgotc2V2ZXJhbCBmb3JtczoKLQl0ZXN0b3JpZy5qcGcJU3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBkanBlZyB0ZXN0cy4KLQl0ZXN0aW1nLnBwbQlUaGUgb3V0cHV0IG9mIGRqcGVnIHRlc3RvcmlnLmpwZwotCXRlc3RpbWcuYm1wCVRoZSBvdXRwdXQgb2YgZGpwZWcgLWJtcCAtY29sb3JzIDI1NiB0ZXN0b3JpZy5qcGcKLQl0ZXN0aW1nLmpwZwlUaGUgb3V0cHV0IG9mIGNqcGVnIHRlc3RpbWcucHBtCi0JdGVzdHByb2cuanBnCVByb2dyZXNzaXZlLW1vZGUgZXF1aXZhbGVudCBvZiB0ZXN0b3JpZy5qcGcuCi0JdGVzdGltZ3AuanBnCVRoZSBvdXRwdXQgb2YgY2pwZWcgLXByb2dyZXNzaXZlIC1vcHRpbWl6ZSB0ZXN0aW1nLnBwbQotKFRoZSBmaXJzdC0gYW5kIHNlY29uZC1nZW5lcmF0aW9uIC5qcGcgZmlsZXMgYXJlbid0IGlkZW50aWNhbCBzaW5jZSBKUEVHIGlzCi1sb3NzeS4pICBJZiB5b3UgY2FuIGdlbmVyYXRlIGR1cGxpY2F0ZXMgb2YgdGhlIHRlc3RpbWcqIGZpbGVzIHRoZW4geW91Ci1wcm9iYWJseSBoYXZlIHdvcmtpbmcgcHJvZ3JhbXMuCi0KLVdpdGggbW9zdCBvZiB0aGUgbWFrZWZpbGVzLCAibWFrZSB0ZXN0IiB3aWxsIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeQotY29tcGFyaXNvbnMuCi0KLUlmIHlvdSdyZSB1c2luZyBhIG1ha2VmaWxlIHRoYXQgZG9lc24ndCBwcm92aWRlIHRoZSB0ZXN0IG9wdGlvbiwgcnVuIGRqcGVnCi1hbmQgY2pwZWcgYnkgaGFuZCBhbmQgY29tcGFyZSB0aGUgb3V0cHV0IGZpbGVzIHRvIHRlc3RpbWcqIHdpdGggd2hhdGV2ZXIKLWJpbmFyeSBmaWxlIGNvbXBhcmlzb24gdG9vbCB5b3UgaGF2ZS4gIFRoZSBmaWxlcyBzaG91bGQgYmUgYml0LWZvci1iaXQKLWlkZW50aWNhbC4KLQotSWYgdGhlIHByb2dyYW1zIGNvbXBsYWluICJNQVhfQUxMT0NfQ0hVTksgaXMgd3JvbmcsIHBsZWFzZSBmaXgiLCB0aGVuIHlvdQotbmVlZCB0byByZWR1Y2UgTUFYX0FMTE9DX0NIVU5LIHRvIGEgdmFsdWUgdGhhdCBmaXRzIGluIHR5cGUgc2l6ZV90LgotVHJ5IGFkZGluZyAiI2RlZmluZSBNQVhfQUxMT0NfQ0hVTksgNjU1MjBMIiB0byBqY29uZmlnLmguICBBIGxlc3MgbGlrZWx5Ci1jb25maWd1cmF0aW9uIGVycm9yIGlzICJBTElHTl9UWVBFIGlzIHdyb25nLCBwbGVhc2UgZml4IjogZGVmaW5pbmcgQUxJR05fVFlQRQotYXMgbG9uZyBzaG91bGQgdGFrZSBjYXJlIG9mIHRoYXQgb25lLgotCi1JZiB0aGUgY2pwZWcgdGVzdCBydW4gZmFpbHMgd2l0aCAiTWlzc2luZyBIdWZmbWFuIGNvZGUgdGFibGUgZW50cnkiLCBpdCdzIGEKLWdvb2QgYmV0IHRoYXQgeW91IG5lZWRlZCB0byBkZWZpbmUgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQuICBHbyBiYWNrIHRvIHRoZQotY29uZmlndXJhdGlvbiBzdGVwIGFuZCBydW4gY2tjb25maWcuYy4gIChUaGlzIGlzIGEgZ29vZCBwbGFuIGZvciBhbnkgb3RoZXIKLXRlc3QgZmFpbHVyZSwgdG9vLikKLQotSWYgeW91IGFyZSB1c2luZyBVbml4IChvbmUtZmlsZSkgY29tbWFuZCBsaW5lIHN0eWxlIG9uIGEgbm9uLVVuaXggc3lzdGVtLAotaXQncyBhIGdvb2QgaWRlYSB0byBjaGVjayB0aGF0IGJpbmFyeSBJL08gdGhyb3VnaCBzdGRpbi9zdGRvdXQgYWN0dWFsbHkKLXdvcmtzLiAgWW91IHNob3VsZCBnZXQgdGhlIHNhbWUgcmVzdWx0cyBmcm9tICJkanBlZyA8dGVzdG9yaWcuanBnID5vdXQucHBtIgotYXMgZnJvbSAiZGpwZWcgLW91dGZpbGUgb3V0LnBwbSB0ZXN0b3JpZy5qcGciLiAgTm90ZSB0aGF0IHRoZSBtYWtlZmlsZXMgYWxsCi11c2UgdGhlIGxhdHRlciBzdHlsZSBhbmQgdGhlcmVmb3JlIGRvIG5vdCBleGVyY2lzZSBzdGRpbi9zdGRvdXQhICBJZiB0aGlzCi1jaGVjayBmYWlscywgdHJ5IHJlY29tcGlsaW5nIHdpdGggVVNFX1NFVE1PREUgb3IgVVNFX0ZET1BFTiBkZWZpbmVkLgotSWYgaXQgc3RpbGwgZG9lc24ndCB3b3JrLCBiZXR0ZXIgdXNlIHR3by1maWxlIHN0eWxlLgotCi1JZiB5b3UgY2hvc2UgYSBtZW1vcnkgbWFuYWdlciBvdGhlciB0aGFuIGptZW1ub2JzLmMsIHlvdSBzaG91bGQgdGVzdCB0aGF0Ci10ZW1wb3JhcnktZmlsZSB1c2FnZSB3b3Jrcy4gIFRyeSAiZGpwZWcgLWJtcCAtY29sb3JzIDI1NiAtbWF4IDAgdGVzdG9yaWcuanBnIgotYW5kIG1ha2Ugc3VyZSBpdHMgb3V0cHV0IG1hdGNoZXMgdGVzdGltZy5ibXAuICBJZiB5b3UgaGF2ZSBhbnkgcmVhbGx5IGxhcmdlCi1pbWFnZXMgaGFuZHksIHRyeSBjb21wcmVzc2luZyB0aGVtIHdpdGggLW9wdGltaXplIGFuZC9vciBkZWNvbXByZXNzaW5nIHdpdGgKLS1jb2xvcnMgMjU2IHRvIG1ha2Ugc3VyZSB5b3VyIERFRkFVTFRfTUFYX01FTSBzZXR0aW5nIGlzIG5vdCB0b28gbGFyZ2UuCi0KLU5PVEU6IHRoaXMgaXMgZmFyIGZyb20gYW4gZXhoYXVzdGl2ZSB0ZXN0IG9mIHRoZSBKUEVHIHNvZnR3YXJlOyBzb21lIG1vZHVsZXMsCi1zdWNoIGFzIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24sIGFyZSBub3QgZXhlcmNpc2VkIGF0IGFsbC4gIEl0J3MganVzdCBhCi1xdWljayB0ZXN0IHRvIGdpdmUgeW91IHNvbWUgY29uZmlkZW5jZSB0aGF0IHlvdSBoYXZlbid0IG1pc3NlZCBzb21ldGhpbmcKLW1ham9yLgotCi0KLUlOU1RBTExJTkcgVEhFIFNPRlRXQVJFCi09PT09PT09PT09PT09PT09PT09PT09PQotCi1PbmNlIHlvdSdyZSBkb25lIHdpdGggdGhlIGFib3ZlIHN0ZXBzLCB5b3UgY2FuIGluc3RhbGwgdGhlIHNvZnR3YXJlIGJ5Ci1jb3B5aW5nIHRoZSBleGVjdXRhYmxlIGZpbGVzIChjanBlZywgZGpwZWcsIGpwZWd0cmFuLCByZGpwZ2NvbSwgYW5kIHdyanBnY29tKQotdG8gd2hlcmV2ZXIgeW91IG5vcm1hbGx5IGluc3RhbGwgcHJvZ3JhbXMuICBPbiBVbml4IHN5c3RlbXMsIHlvdSdsbCBhbHNvIHdhbnQKLXRvIHB1dCB0aGUgbWFuIHBhZ2VzIChjanBlZy4xLCBkanBlZy4xLCBqcGVndHJhbi4xLCByZGpwZ2NvbS4xLCB3cmpwZ2NvbS4xKQotaW4gdGhlIG1hbi1wYWdlIGRpcmVjdG9yeS4gIFRoZSBwcmUtZmFiIG1ha2VmaWxlcyBkb24ndCBzdXBwb3J0IHRoaXMgc3RlcAotc2luY2UgdGhlcmUncyBzdWNoIGEgd2lkZSB2YXJpZXR5IG9mIGluc3RhbGxhdGlvbiBwcm9jZWR1cmVzIG9uIGRpZmZlcmVudAotc3lzdGVtcy4KLQotSWYgeW91IGdlbmVyYXRlZCBhIE1ha2VmaWxlIHdpdGggdGhlICJjb25maWd1cmUiIHNjcmlwdCwgeW91IGNhbiBqdXN0IHNheQotCW1ha2UgaW5zdGFsbAotdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbXMgYW5kIHRoZWlyIG1hbiBwYWdlcyBpbnRvIHRoZSBzdGFuZGFyZCBwbGFjZXMuCi0oWW91J2xsIHByb2JhYmx5IG5lZWQgdG8gYmUgcm9vdCB0byBkbyB0aGlzLikgIFdlIHJlY29tbWVuZCBmaXJzdCBzYXlpbmcKLQltYWtlIC1uIGluc3RhbGwKLXRvIHNlZSB3aGVyZSBjb25maWd1cmUgdGhvdWdodCB0aGUgZmlsZXMgc2hvdWxkIGdvLiAgWW91IG1heSBuZWVkIHRvIGVkaXQKLXRoZSBNYWtlZmlsZSwgcGFydGljdWxhcmx5IGlmIHlvdXIgc3lzdGVtJ3MgY29udmVudGlvbnMgZm9yIG1hbiBwYWdlCi1maWxlbmFtZXMgZG9uJ3QgbWF0Y2ggd2hhdCBjb25maWd1cmUgZXhwZWN0cy4KLQotSWYgeW91IHdhbnQgdG8gaW5zdGFsbCB0aGUgSUpHIGxpYnJhcnkgaXRzZWxmLCBmb3IgdXNlIGluIGNvbXBpbGluZyBvdGhlcgotcHJvZ3JhbXMgYmVzaWRlcyBvdXJzLCB0aGVuIHlvdSBuZWVkIHRvIHB1dCB0aGUgZm91ciBpbmNsdWRlIGZpbGVzCi0JanBlZ2xpYi5oIGplcnJvci5oIGpjb25maWcuaCBqbW9yZWNmZy5oCi1pbnRvIHlvdXIgaW5jbHVkZS1maWxlIGRpcmVjdG9yeSwgYW5kIHB1dCB0aGUgbGlicmFyeSBmaWxlIGxpYmpwZWcuYQotKGV4dGVuc2lvbiBtYXkgdmFyeSBkZXBlbmRpbmcgb24gc3lzdGVtKSB3aGVyZXZlciBsaWJyYXJ5IGZpbGVzIGdvLgotSWYgeW91IGdlbmVyYXRlZCBhIE1ha2VmaWxlIHdpdGggImNvbmZpZ3VyZSIsIGl0IHdpbGwgZG8gd2hhdCBpdCB0aGlua3MKLWlzIHRoZSByaWdodCB0aGluZyBpZiB5b3Ugc2F5Ci0JbWFrZSBpbnN0YWxsLWxpYgotCi0KLU9QVElPTkFMIFNUVUZGCi09PT09PT09PT09PT09PQotCi1Qcm9ncmVzcyBtb25pdG9yOgotCi1JZiB5b3UgbGlrZSwgeW91IGNhbiAjZGVmaW5lIFBST0dSRVNTX1JFUE9SVCAoaW4gamNvbmZpZy5oKSB0byBlbmFibGUgZGlzcGxheQotb2YgcGVyY2VudC1kb25lIHByb2dyZXNzIHJlcG9ydHMuICBUaGUgcm91dGluZSBwcm92aWRlZCBpbiBjZGpwZWcuYyBtZXJlbHkKLXByaW50cyBwZXJjZW50YWdlcyB0byBzdGRlcnIsIGJ1dCB5b3UgY2FuIGN1c3RvbWl6ZSBpdCB0byBkbyBzb21ldGhpbmcKLWZhbmNpZXIuCi0KLVV0YWggUkxFIGZpbGUgZm9ybWF0IHN1cHBvcnQ6Ci0KLVdlIGRpc3RyaWJ1dGUgdGhlIHNvZnR3YXJlIHdpdGggc3VwcG9ydCBmb3IgUkxFIGltYWdlIGZpbGVzIChVdGFoIFJhc3RlcgotVG9vbGtpdCBmb3JtYXQpIGRpc2FibGVkLCBiZWNhdXNlIHRoZSBSTEUgc3VwcG9ydCB3b24ndCBjb21waWxlIHdpdGhvdXQgdGhlCi1VdGFoIGxpYnJhcnkuICBJZiB5b3UgaGF2ZSBVUlQgdmVyc2lvbiAzLjEgb3IgbGF0ZXIsIHlvdSBjYW4gZW5hYmxlIFJMRQotc3VwcG9ydCBhcyBmb2xsb3dzOgotCTEuICAjZGVmaW5lIFJMRV9TVVBQT1JURUQgaW4gamNvbmZpZy5oLgotCTIuICBBZGQgYSAtSSBvcHRpb24gdG8gQ0ZMQUdTIGluIHRoZSBNYWtlZmlsZSBmb3IgdGhlIGRpcmVjdG9yeQotCSAgICBjb250YWluaW5nIHRoZSBVUlQgLmggZmlsZXMgKHR5cGljYWxseSB0aGUgImluY2x1ZGUiCi0JICAgIHN1YmRpcmVjdG9yeSBvZiB0aGUgVVJUIGRpc3RyaWJ1dGlvbikuCi0JMy4gIEFkZCAtTC4uLiAtbHJsZSB0byBMRExJQlMgaW4gdGhlIE1ha2VmaWxlLCB3aGVyZSAuLi4gc3BlY2lmaWVzCi0JICAgIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgVVJUICJsaWJybGUuYSIgZmlsZSAodHlwaWNhbGx5IHRoZQotCSAgICAibGliIiBzdWJkaXJlY3Rvcnkgb2YgdGhlIFVSVCBkaXN0cmlidXRpb24pLgotCi1TdXBwb3J0IGZvciAxMi1iaXQtZGVlcCBwaXhlbCBkYXRhOgotCi1UaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgZWl0aGVyIDgtYml0IG9yIDEyLWJpdCBkYXRhIHByZWNpc2lvbi4gIChGb3IgY29sb3IsCi10aGlzIG1lYW5zIDggb3IgMTIgYml0cyBwZXIgY2hhbm5lbCwgb2YgY291cnNlLikgIElmIHlvdSBuZWVkIHRvIHdvcmsgd2l0aAotZGVlcGVyIHRoYW4gOC1iaXQgZGF0YSwgeW91IGNhbiBjb21waWxlIHRoZSBJSkcgY29kZSBmb3IgMTItYml0IG9wZXJhdGlvbi4KLVRvIGRvIHNvOgotICAxLiBJbiBqbW9yZWNmZy5oLCBkZWZpbmUgQklUU19JTl9KU0FNUExFIGFzIDEyIHJhdGhlciB0aGFuIDguCi0gIDIuIEluIGpjb25maWcuaCwgdW5kZWZpbmUgQk1QX1NVUFBPUlRFRCwgUkxFX1NVUFBPUlRFRCwgYW5kIFRBUkdBX1NVUFBPUlRFRCwKLSAgICAgYmVjYXVzZSB0aGUgY29kZSBmb3IgdGhvc2UgZm9ybWF0cyBkb2Vzbid0IGhhbmRsZSAxMi1iaXQgZGF0YSBhbmQgd29uJ3QKLSAgICAgZXZlbiBjb21waWxlLiAgKFRoZSBQUE0gY29kZSBkb2VzIHdvcmssIGFzIGV4cGxhaW5lZCBiZWxvdy4gIFRoZSBHSUYKLSAgICAgY29kZSB3b3JrcyB0b287IGl0IHNjYWxlcyA4LWJpdCBHSUYgZGF0YSB0byBhbmQgZnJvbSAxMi1iaXQgZGVwdGgKLSAgICAgYXV0b21hdGljYWxseS4pCi0gIDMuIENvbXBpbGUuICBEb24ndCBleHBlY3QgIm1ha2UgdGVzdCIgdG8gcGFzcywgc2luY2UgdGhlIHN1cHBsaWVkIHRlc3QKLSAgICAgZmlsZXMgYXJlIGZvciA4LWJpdCBkYXRhLgotCi1DdXJyZW50bHksIDEyLWJpdCBzdXBwb3J0IGRvZXMgbm90IHdvcmsgb24gMTYtYml0LWludCBtYWNoaW5lcy4KLQotTm90ZSB0aGF0IGEgMTItYml0IHZlcnNpb24gd2lsbCBub3QgcmVhZCA4LWJpdCBKUEVHIGZpbGVzLCBub3IgdmljZSB2ZXJzYTsKLXNvIHlvdSdsbCB3YW50IHRvIGtlZXAgYXJvdW5kIGEgcmVndWxhciA4LWJpdCBjb21waWxhdGlvbiBhcyB3ZWxsLgotKFJ1bi10aW1lIHNlbGVjdGlvbiBvZiBkYXRhIGRlcHRoLCB0byBhbGxvdyBhIHNpbmdsZSBjb3B5IHRoYXQgZG9lcyBib3RoLAotaXMgcG9zc2libGUgYnV0IHdvdWxkIHByb2JhYmx5IHNsb3cgdGhpbmdzIGRvd24gY29uc2lkZXJhYmx5OyBpdCdzIHZlcnkgbG93Ci1vbiBvdXIgdG8tZG8gbGlzdC4pCi0KLVRoZSBQUE0gcmVhZGVyIChyZHBwbS5jKSBjYW4gcmVhZCAxMi1iaXQgZGF0YSBmcm9tIGVpdGhlciB0ZXh0LWZvcm1hdCBvcgotYmluYXJ5LWZvcm1hdCBQUE0gYW5kIFBHTSBmaWxlcy4gIEJpbmFyeS1mb3JtYXQgUFBNL1BHTSBmaWxlcyB3aGljaCBoYXZlIGEKLW1heHZhbCBncmVhdGVyIHRoYW4gMjU1IGFyZSBhc3N1bWVkIHRvIHVzZSAyIGJ5dGVzIHBlciBzYW1wbGUsIExTQiBmaXJzdAotKGxpdHRsZS1lbmRpYW4gb3JkZXIpLiAgQXMgb2YgZWFybHkgMTk5NSwgMi1ieXRlIGJpbmFyeSBmb3JtYXQgaXMgbm90Ci1vZmZpY2lhbGx5IHN1cHBvcnRlZCBieSB0aGUgUEJNUExVUyBsaWJyYXJ5LCBidXQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBhCi1mdXR1cmUgcmVsZWFzZSBvZiBQQk1QTFVTIHdpbGwgc3VwcG9ydCBpdC4gIE5vdGUgdGhhdCB0aGUgUFBNIHJlYWRlciB3aWxsCi1yZWFkIGZpbGVzIG9mIGFueSBtYXh2YWwgcmVnYXJkbGVzcyBvZiB0aGUgQklUU19JTl9KU0FNUExFIHNldHRpbmc7IGluY29taW5nCi1kYXRhIGlzIGF1dG9tYXRpY2FsbHkgcmVzY2FsZWQgdG8gZWl0aGVyIG1heHZhbD0yNTUgb3IgbWF4dmFsPTQwOTUgYXMKLWFwcHJvcHJpYXRlIGZvciB0aGUgY2pwZWcgYml0IGRlcHRoLgotCi1UaGUgUFBNIHdyaXRlciAod3JwcG0uYykgd2lsbCBub3JtYWxseSB3cml0ZSAyLWJ5dGUgYmluYXJ5IFBQTSBvciBQR00KLWZvcm1hdCwgbWF4dmFsIDQwOTUsIHdoZW4gY29tcGlsZWQgd2l0aCBCSVRTX0lOX0pTQU1QTEU9MTIuICBTaW5jZSB0aGlzCi1mb3JtYXQgaXMgbm90IHlldCB3aWRlbHkgc3VwcG9ydGVkLCB5b3UgY2FuIGRpc2FibGUgaXQgYnkgY29tcGlsaW5nIHdycHBtLmMKLXdpdGggUFBNX05PUkFXV09SRCBkZWZpbmVkOyB0aGVuIHRoZSBkYXRhIGlzIHNjYWxlZCBkb3duIHRvIDggYml0cyB0byBtYWtlIGEKLXN0YW5kYXJkIDEtYnl0ZS9zYW1wbGUgUFBNIG9yIFBHTSBmaWxlLiAgKFllcywgdGhpcyBtZWFucyBzdGlsbCBhbm90aGVyIGNvcHkKLW9mIGRqcGVnIHRvIGtlZXAgYXJvdW5kLiAgQnV0IGhvcGVmdWxseSB5b3Ugd29uJ3QgbmVlZCBpdCBmb3IgdmVyeSBsb25nLgotUG9za2FuemVyJ3Mgc3VwcG9zZWQgdG8gZ2V0IHRoYXQgbmV3IFBCTVBMVVMgcmVsZWFzZSBvdXQgUmVhbCBTb29uIE5vdy4pCi0KLU9mIGNvdXJzZSwgaWYgeW91IGFyZSB3b3JraW5nIHdpdGggMTItYml0IGRhdGEsIHlvdSBwcm9iYWJseSBoYXZlIGl0IHN0b3JlZAotaW4gc29tZSBvdGhlciwgbm9uc3RhbmRhcmQgZm9ybWF0LiAgSW4gdGhhdCBjYXNlIHlvdSdsbCBwcm9iYWJseSB3YW50IHRvCi13cml0ZSB5b3VyIG93biBJL08gbW9kdWxlcyB0byByZWFkIGFuZCB3cml0ZSB5b3VyIGZvcm1hdC4KLQotTm90ZSB0aGF0IGEgMTItYml0IHZlcnNpb24gb2YgY2pwZWcgYWx3YXlzIHJ1bnMgaW4gIi1vcHRpbWl6ZSIgbW9kZSwgaW4KLW9yZGVyIHRvIGdlbmVyYXRlIHZhbGlkIEh1ZmZtYW4gdGFibGVzLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvdXIKLWRlZmF1bHQgSHVmZm1hbiB0YWJsZXMgb25seSBjb3ZlciA4LWJpdCBkYXRhLgotCi1SZW1vdmluZyBjb2RlOgotCi1JZiB5b3UgbmVlZCB0byBtYWtlIGEgc21hbGxlciB2ZXJzaW9uIG9mIHRoZSBKUEVHIHNvZnR3YXJlLCBzb21lIG9wdGlvbmFsCi1mdW5jdGlvbnMgY2FuIGJlIHJlbW92ZWQgYXQgY29tcGlsZSB0aW1lLiAgU2VlIHRoZSB4eHhfU1VQUE9SVEVEICNkZWZpbmVzIGluCi1qY29uZmlnLmggYW5kIGptb3JlY2ZnLmguICBJZiBhdCBhbGwgcG9zc2libGUsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBsZWF2ZSBpbgotZGVjb2RlciBzdXBwb3J0IGZvciBhbGwgdmFsaWQgSlBFRyBmaWxlcywgdG8gZW5zdXJlIHRoYXQgeW91IGNhbiByZWFkIGFueW9uZSdzCi1vdXRwdXQuICBUYWtpbmcgb3V0IHN1cHBvcnQgZm9yIGltYWdlIGZpbGUgZm9ybWF0cyB0aGF0IHlvdSBkb24ndCB1c2UgaXMgdGhlCi1tb3N0IHBhaW5sZXNzIHdheSB0byBtYWtlIHRoZSBwcm9ncmFtcyBzbWFsbGVyLiAgQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0bwotcmVtb3ZlIHNvbWUgb2YgdGhlIERDVCBtZXRob2RzOiBpbiBwYXJ0aWN1bGFyLCB0aGUgIklGQVNUIiBtZXRob2QgbWF5IG5vdCBiZQotZW5vdWdoIGZhc3RlciB0aGFuIHRoZSBvdGhlcnMgdG8gYmUgd29ydGgga2VlcGluZyBvbiB5b3VyIG1hY2hpbmUuICAoSWYgeW91Ci1kbyByZW1vdmUgSVNMT1cgb3IgSUZBU1QsIGJlIHN1cmUgdG8gcmVkZWZpbmUgSkRDVF9ERUZBVUxUIG9yIEpEQ1RfRkFTVEVTVAotdG8gYSBzdXBwb3J0ZWQgbWV0aG9kLCBieSBhZGRpbmcgYSAjZGVmaW5lIGluIGpjb25maWcuaC4pCi0KLQotT1BUSU1JWkFUSU9OCi09PT09PT09PT09PT0KLQotVW5sZXNzIHlvdSBvd24gYSBDcmF5LCB5b3UnbGwgcHJvYmFibHkgYmUgaW50ZXJlc3RlZCBpbiBtYWtpbmcgdGhlIEpQRUcKLXNvZnR3YXJlIGdvIGFzIGZhc3QgYXMgcG9zc2libGUuICBUaGlzIHNlY3Rpb24gY292ZXJzIHNvbWUgbWFjaGluZS1kZXBlbmRlbnQKLW9wdGltaXphdGlvbnMgeW91IG1heSB3YW50IHRvIHRyeS4gIFdlIHN1Z2dlc3QgdGhhdCBiZWZvcmUgdHJ5aW5nIGFueSBvZgotdGhpcywgeW91IGZpcnN0IGdldCB0aGUgYmFzaWMgaW5zdGFsbGF0aW9uIHRvIHBhc3MgdGhlIHNlbGYtdGVzdCBzdGVwLgotUmVwZWF0IHRoZSBzZWxmLXRlc3QgYWZ0ZXIgYW55IG9wdGltaXphdGlvbiB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZW4ndAotYnJva2VuIGFueXRoaW5nLgotCi1UaGUgaW50ZWdlciBEQ1Qgcm91dGluZXMgcGVyZm9ybSBhIGxvdCBvZiBtdWx0aXBsaWNhdGlvbnMuICBUaGVzZQotbXVsdGlwbGljYXRpb25zIG11c3QgeWllbGQgMzItYml0IHJlc3VsdHMsIGJ1dCBub25lIG9mIHRoZWlyIGlucHV0IHZhbHVlcwotYXJlIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUuICBPbiBtYW55IG1hY2hpbmVzLCBub3RhYmx5IHRoZSA2ODB4MCBhbmQgODB4ODYKLUNQVXMsIGEgMTZ4MTY9PjMyIGJpdCBtdWx0aXBseSBpbnN0cnVjdGlvbiBpcyBmYXN0ZXIgdGhhbiBhIGZ1bGwgMzJ4MzI9PjMyCi1iaXQgbXVsdGlwbHkuICBVbmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIHBvcnRhYmxlIHdheSB0byBzcGVjaWZ5IHN1Y2ggYQotbXVsdGlwbGljYXRpb24gaW4gQywgYnV0IHNvbWUgY29tcGlsZXJzIGNhbiBnZW5lcmF0ZSBvbmUgd2hlbiB5b3UgdXNlIHRoZQotcmlnaHQgY29tYmluYXRpb24gb2YgY2FzdHMuICBTZWUgdGhlIE1VTFRJUExZeHh4IG1hY3JvIGRlZmluaXRpb25zIGluCi1qZGN0LmguICBJZiB5b3VyIGNvbXBpbGVyIG1ha2VzICJpbnQiIGJlIDMyIGJpdHMgYW5kICJzaG9ydCIgYmUgMTYgYml0cywKLWRlZmluaW5nIFNIT1JUeFNIT1JUXzMyIGlzIGZhaXJseSBsaWtlbHkgdG8gd29yay4gIFdoZW4gZXhwZXJpbWVudGluZyB3aXRoCi1hbHRlcm5hdGUgZGVmaW5pdGlvbnMsIGJlIHN1cmUgdG8gdGVzdCBub3Qgb25seSB3aGV0aGVyIHRoZSBjb2RlIHN0aWxsIHdvcmtzCi0odXNlIHRoZSBzZWxmLXRlc3QpLCBidXQgYWxzbyB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGZhc3RlciAtLS0gb24gc29tZQotY29tcGlsZXJzLCBhbHRlcm5hdGUgZGVmaW5pdGlvbnMgbWF5IGNvbXB1dGUgdGhlIHJpZ2h0IGFuc3dlciwgeWV0IGJlIHNsb3dlcgotdGhhbiB0aGUgZGVmYXVsdC4gIFRpbWluZyBjanBlZyBvbiBhIGxhcmdlIFBHTSAoZ3JheXNjYWxlKSBpbnB1dCBmaWxlIGlzIHRoZQotYmVzdCB3YXkgdG8gY2hlY2sgdGhpcywgYXMgdGhlIERDVCB3aWxsIGJlIHRoZSBsYXJnZXN0IGZyYWN0aW9uIG9mIHRoZSBydW50aW1lCi1pbiB0aGF0IG1vZGUuICAoTm90ZTogc29tZSBvZiB0aGUgZGlzdHJpYnV0ZWQgY29tcGlsZXItc3BlY2lmaWMgamNvbmZpZyBmaWxlcwotYWxyZWFkeSBjb250YWluICNkZWZpbmUgc3dpdGNoZXMgdG8gc2VsZWN0IGFwcHJvcHJpYXRlIE1VTFRJUExZeHh4Ci1kZWZpbml0aW9ucy4pCi0KLUlmIHlvdXIgbWFjaGluZSBoYXMgc3VmZmljaWVudGx5IGZhc3QgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUsIHlvdSBtYXkgZmluZAotdGhhdCB0aGUgZmxvYXQgRENUIG1ldGhvZCBpcyBmYXN0ZXIgdGhhbiB0aGUgaW50ZWdlciBEQ1QgbWV0aG9kcywgZXZlbgotYWZ0ZXIgdHdlYWtpbmcgdGhlIGludGVnZXIgbXVsdGlwbHkgbWFjcm9zLiAgSW4gdGhhdCBjYXNlIHlvdSBtYXkgd2FudCB0bwotbWFrZSB0aGUgZmxvYXQgRENUIGJlIHRoZSBkZWZhdWx0IG1ldGhvZC4gIChUaGUgb25seSBvYmplY3Rpb24gdG8gdGhpcyBpcwotdGhhdCBmbG9hdCBEQ1QgcmVzdWx0cyBtYXkgdmFyeSBzbGlnaHRseSBhY3Jvc3MgbWFjaGluZXMuKSAgVG8gZG8gdGhhdCwgYWRkCi0iI2RlZmluZSBKRENUX0RFRkFVTFQgSkRDVF9GTE9BVCIgdG8gamNvbmZpZy5oLiAgRXZlbiBpZiB5b3UgZG9uJ3QgY2hhbmdlCi10aGUgZGVmYXVsdCwgeW91IHNob3VsZCByZWRlZmluZSBKRENUX0ZBU1RFU1QsIHdoaWNoIGlzIHRoZSBtZXRob2Qgc2VsZWN0ZWQKLWJ5IGRqcGVnJ3MgLWZhc3Qgc3dpdGNoLiAgRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlcwotKHVzYWdlLmRvYyBhbmQvb3IgY2pwZWcuMSwgZGpwZWcuMSkgdG8gYWdyZWUgd2l0aCB3aGF0IHlvdSd2ZSBkb25lLgotCi1JZiBhY2Nlc3MgdG8gInNob3J0IiBhcnJheXMgaXMgc2xvdyBvbiB5b3VyIG1hY2hpbmUsIGl0IG1heSBiZSBhIHdpbiB0bwotZGVmaW5lIHR5cGUgSkNPRUYgYXMgaW50IHJhdGhlciB0aGFuIHNob3J0LiAgVGhpcyB3aWxsIGNvc3QgYSBnb29kIGRlYWwgb2YKLW1lbW9yeSB0aG91Z2gsIHBhcnRpY3VsYXJseSBpbiBzb21lIG11bHRpLXBhc3MgbW9kZXMsIHNvIGRvbid0IGRvIGl0IHVubGVzcwoteW91IGhhdmUgbWVtb3J5IHRvIGJ1cm4gYW5kIHNob3J0IGlzIFJFQUxMWSBzbG93LgotCi1JZiB5b3VyIGNvbXBpbGVyIGNhbiBjb21waWxlIGZ1bmN0aW9uIGNhbGxzIGluLWxpbmUsIG1ha2Ugc3VyZSB0aGUgSU5MSU5FCi1tYWNybyBpbiBqbW9yZWNmZy5oIGlzIGRlZmluZWQgYXMgdGhlIGtleXdvcmQgdGhhdCBtYXJrcyBhIGZ1bmN0aW9uCi1pbmxpbmUtYWJsZS4gIFNvbWUgY29tcGlsZXJzIGhhdmUgYSBzd2l0Y2ggdGhhdCB0ZWxscyB0aGUgY29tcGlsZXIgdG8gaW5saW5lCi1hbnkgZnVuY3Rpb24gaXQgdGhpbmtzIGlzIHByb2ZpdGFibGUgKGUuZy4sIC1maW5saW5lLWZ1bmN0aW9ucyBmb3IgZ2NjKS4KLUVuYWJsaW5nIHN1Y2ggYSBzd2l0Y2ggaXMgbGlrZWx5IHRvIG1ha2UgdGhlIGNvbXBpbGVkIGNvZGUgYmlnZ2VyIGJ1dCBmYXN0ZXIuCi0KLUluIGdlbmVyYWwsIGl0J3Mgd29ydGggdHJ5aW5nIHRoZSBtYXhpbXVtIG9wdGltaXphdGlvbiBsZXZlbCBvZiB5b3VyIGNvbXBpbGVyLAotYW5kIGV4cGVyaW1lbnRpbmcgd2l0aCBhbnkgb3B0aW9uYWwgb3B0aW1pemF0aW9ucyBzdWNoIGFzIGxvb3AgdW5yb2xsaW5nLgotKFVuZm9ydHVuYXRlbHksIGZhciB0b28gbWFueSBjb21waWxlcnMgaGF2ZSBvcHRpbWl6ZXIgYnVncyAuLi4gYmUgcHJlcGFyZWQgdG8KLWJhY2sgb2ZmIGlmIHRoZSBjb2RlIGZhaWxzIHNlbGYtdGVzdC4pICBJZiB5b3UgZG8gYW55IGV4cGVyaW1lbnRhdGlvbiBhbG9uZwotdGhlc2UgbGluZXMsIHBsZWFzZSByZXBvcnQgdGhlIG9wdGltYWwgc2V0dGluZ3MgdG8ganBlZy1pbmZvQHV1bmV0LnV1Lm5ldCBzbwotd2UgY2FuIG1lbnRpb24gdGhlbSBpbiBmdXR1cmUgcmVsZWFzZXMuICBCZSBzdXJlIHRvIHNwZWNpZnkgeW91ciBtYWNoaW5lIGFuZAotY29tcGlsZXIgdmVyc2lvbi4KLQotCi1ISU5UUyBGT1IgU1BFQ0lGSUMgU1lTVEVNUwotPT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotV2Ugd2VsY29tZSByZXBvcnRzIG9uIGNoYW5nZXMgbmVlZGVkIGZvciBzeXN0ZW1zIG5vdCBtZW50aW9uZWQgaGVyZS4gIFN1Ym1pdAotJ2VtIHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQuICBBbHNvLCBpZiBjb25maWd1cmUgb3IgY2tjb25maWcuYyBpcyB3cm9uZwotYWJvdXQgaG93IHRvIGNvbmZpZ3VyZSB0aGUgSlBFRyBzb2Z0d2FyZSBmb3IgeW91ciBzeXN0ZW0sIHBsZWFzZSBsZXQgdXMga25vdy4KLQotCi1BY29ybiBSSVNDIE9TOgotCi0oVGhhbmtzIHRvIFNpbW9uIE1pZGRsZXRvbiBmb3IgdGhlc2UgaGludHMgb24gY29tcGlsaW5nIHdpdGggRGVza3RvcCBDLikKLUFmdGVyIHJlbmFtaW5nIHRoZSBmaWxlcyBhY2NvcmRpbmcgdG8gQWNvcm4gY29udmVudGlvbnMsIHRha2UgYSBjb3B5IG9mCi1tYWtlZmlsZS5hbnNpLCBjaGFuZ2UgYWxsIG9jY3VycmVuY2VzIG9mICdsaWJqcGVnLmEnIHRvICdsaWJqcGVnLm8nIGFuZAotY2hhbmdlIHRoZXNlIGRlZmluaXRpb25zIGFzIGluZGljYXRlZDoKLQotQ0ZMQUdTPSAtdGhyb3diYWNrIC1JQzogLVduCi1MRExJQlM9QzpvLlN0dWJzCi1TWVNERVBNRU09am1lbWFuc2kubwotTE49TGluawotQVI9TGliRmlsZSAtYyAtbwotCi1BbHNvIGFkZCBhIG5ldyBsaW5lICcuYy5vOjsgJChjYykgJDwgJChjZmxhZ3MpIC1jIC1vICRAJy4gIFJlbW92ZSB0aGUKLWxpbmVzICckKFJNKSBsaWJqcGVnLm8nIGFuZCAnJChBUjIpIGxpYmpwZWcubycgYW5kIHRoZSAnamNvbmZpZy5oJwotZGVwZW5kZW5jeSBzZWN0aW9uLgotCi1Db3B5IGpjb25maWcuZG9jIHRvIGpjb25maWcuaC4gIEVkaXQgamNvbmZpZy5oIHRvIGRlZmluZSBUV09fRklMRV9DT01NQU5ETElORQotYW5kIENIQVJfSVNfVU5TSUdORUQuCi0KLVJ1biB0aGUgbWFrZWZpbGUgdXNpbmcgIUFNVSBub3QgIU1ha2UuICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlICdjbGVhbicgYW5kCi0ndGVzdCcgbWFrZWZpbGUgZW50cmllcyB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gZmlkZGxlIHdpdGggdGhlIHN5bnRheCBhIGJpdAotYW5kIHJlbmFtZSB0aGUgdGVzdCBmaWxlcy4KLQotCi1BbWlnYToKLQotU0FTIEMgNi41MCByZXBvcnRlZGx5IGlzIHRvbyBidWdneSB0byBjb21waWxlIHRoZSBJSkcgY29kZSBwcm9wZXJseS4KLUEgcGF0Y2ggdG8gdXBkYXRlIHRvIDYuNTEgaXMgYXZhaWxhYmxlIGZyb20gU0FTIG9yIEFtaU5ldCBGVFAgc2l0ZXMuCi0KLVRoZSBzdXBwbGllZCBjb25maWcgZmlsZXMgYXJlIHNldCB1cCB0byB1c2Ugam1lbW5hbWUuYyBhcyB0aGUgbWVtb3J5Ci1tYW5hZ2VyLCB3aXRoIHRlbXBvcmFyeSBmaWxlcyBiZWluZyBjcmVhdGVkIG9uIHRoZSBkZXZpY2UgbmFtZWQgYnkKLSJKUEVHVE1QOiIuCi0KLQotQXRhcmkgU1QvU1RFL1RUOgotIAotQ29weSB0aGUgcHJvamVjdCBmaWxlcyBtYWtjanBlZy5zdCwgbWFrZGpwZWcuc3QsIG1ha3RqcGVnLnN0LCBhbmQgbWFrbGpwZWcuc3QKLXRvIGNqcGVnLnByaiwgZGpwZWcucHJqLCBqcGVndHJhbi5wcmosIGFuZCBsaWJqcGVnLnByaiByZXNwZWN0aXZlbHkuICBUaGUKLXByb2plY3QgZmlsZXMgc2hvdWxkIHdvcmsgYXMtaXMgd2l0aCBQdXJlIEMuICBGb3IgVHVyYm8gQywgY2hhbmdlIGxpYnJhcnkKLWZpbGVuYW1lcyAicGMuLi4iIHRvICJ0Yy4uLiIgaW4gZWFjaCBwcm9qZWN0IGZpbGUuICBOb3RlIHRoYXQgbGlianBlZy5wcmoKLXNlbGVjdHMgam1lbWFuc2kuYyBhcyB0aGUgcmVjb21tZW5kZWQgbWVtb3J5IG1hbmFnZXIuICBZb3UnbGwgcHJvYmFibHkgd2FudCB0bwotYWRqdXN0IHRoZSBERUZBVUxUX01BWF9NRU0gc2V0dGluZyAtLS0geW91IHdhbnQgaXQgdG8gYmUgYSBjb3VwbGUgaHVuZHJlZCBLCi1sZXNzIHRoYW4geW91ciBub3JtYWwgZnJlZSBtZW1vcnkuICBQdXQgIiNkZWZpbmUgREVGQVVMVF9NQVhfTUVNIG5ubm4iIGludG8KLWpjb25maWcuaCB0byBkbyB0aGlzLgotCi1UbyB1c2UgdGhlIDY4ODgxLzY4ODgyIGNvcHJvY2Vzc29yIGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgRENULCBhZGQgdGhlCi1jb21waWxlciBvcHRpb24gIi04IiB0byB0aGUgcHJvamVjdCBmaWxlcyBhbmQgcmVwbGFjZSBwY2ZsdGxpYi5saWIgd2l0aAotcGM4ODFsaWIubGliIGluIGNqcGVnLnByaiBhbmQgZGpwZWcucHJqLiAgT3IgaWYgeW91IGRvbid0IGhhdmUgYQotY29wcm9jZXNzb3IsIHlvdSBtYXkgcHJlZmVyIHRvIHJlbW92ZSB0aGUgZmxvYXQgRENUIGNvZGUgYnkgdW5kZWZpbmluZwotRENUX0ZMT0FUX1NVUFBPUlRFRCBpbiBqbW9yZWNmZy5oIChzaW5jZSB3aXRob3V0IGEgY29wcm9jZXNzb3IsIHRoZSBmbG9hdAotY29kZSB3aWxsIGJlIHRvbyBzbG93IHRvIGJlIHVzZWZ1bCkuICBJbiB0aGF0IGNhc2UsIHlvdSBjYW4gZGVsZXRlCi1wY2ZsdGxpYi5saWIgZnJvbSB0aGUgcHJvamVjdCBmaWxlcy4KLQotTm90ZSB0aGF0IHlvdSBtdXN0IG1ha2UgbGlianBlZy5saWIgYmVmb3JlIG1ha2luZyBjanBlZy50dHAsIGRqcGVnLnR0cCwKLW9yIGpwZWd0cmFuLnR0cC4gIFlvdSdsbCBoYXZlIHRvIHBlcmZvcm0gdGhlIHNlbGYtdGVzdCBieSBoYW5kLgotCi1XZSBoYXZlbid0IGJvdGhlcmVkIHRvIGluY2x1ZGUgcHJvamVjdCBmaWxlcyBmb3IgcmRqcGdjb20gYW5kIHdyanBnY29tLgotVGhvc2Ugc291cmNlIGZpbGVzIHNob3VsZCBqdXN0IGJlIGNvbXBpbGVkIGJ5IHRoZW1zZWx2ZXM7IHRoZXkgZG9uJ3QKLWRlcGVuZCBvbiB0aGUgSlBFRyBsaWJyYXJ5LgotCi1UaGVyZSBpcyBhIGJ1ZyBpbiBzb21lIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBUdXJibyBDIGxpYnJhcnkgd2hpY2ggY2F1c2VzIHRoZQotc3BhY2UgdXNlZCBieSB0ZW1wb3JhcnkgZmlsZXMgY3JlYXRlZCB3aXRoICJ0bXBmaWxlKCkiIG5vdCB0byBiZSBmcmVlZCBhZnRlcgotYW4gYWJub3JtYWwgcHJvZ3JhbSBleGl0LiAgSWYgeW91IGNoZWNrIHlvdXIgZGlzayBhZnRlcndhcmRzLCB5b3Ugd2lsbCBmaW5kCi1jbHVzdGVyIGNoYWlucyB0aGF0IGFyZSBhbGxvY2F0ZWQgYnV0IG5vdCB1c2VkIGJ5IGEgZmlsZS4gIFRoaXMgc2hvdWxkIG5vdAotaGFwcGVuIGluIGNqcGVnL2RqcGVnL2pwZWd0cmFuLCBzaW5jZSB3ZSBlbmFibGUgYSBzaWduYWwgY2F0Y2hlciB0byBleHBsaWNpdGx5Ci1jbG9zZSB0ZW1wIGZpbGVzIGJlZm9yZSBleGl0aW5nLiAgQnV0IGlmIHlvdSB1c2UgdGhlIEpQRUcgbGlicmFyeSB3aXRoIHlvdXIKLW93biBjb2RlLCBiZSBzdXJlIHRvIHN1cHBseSBhIHNpZ25hbCBjYXRjaGVyLCBvciBlbHNlIHVzZSBhIGRpZmZlcmVudAotc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkgbWFuYWdlci4KLQotCi1DcmF5OgotCi1TaG91bGQgeW91IGJlIHNvIGZvcnR1bmF0ZSBhcyB0byBiZSBydW5uaW5nIEpQRUcgb24gYSBDcmF5IFlNUCwgdGhlcmUgaXMgYQotY29tcGlsZXIgYnVnIGluIG9sZCB2ZXJzaW9ucyBvZiBDcmF5J3MgU3RhbmRhcmQgQyAocHJpb3IgdG8gMy4xKS4gIElmIHlvdQotc3RpbGwgaGF2ZSBhbiBvbGQgY29tcGlsZXIsIHlvdSdsbCBuZWVkIHRvIGluc2VydCBhIGxpbmUgcmVhZGluZwotIiNwcmFnbWEgbm92ZWN0b3IiIGp1c3QgYmVmb3JlIHRoZSBsb29wCQotICAgIGZvciAoaSA9IDE7IGkgPD0gKGludCkgaHRibC0+Yml0c1tsXTsgaSsrKQotICAgICAgaHVmZnNpemVbcCsrXSA9IChjaGFyKSBsOwotaW4gZml4X2h1ZmZfdGJsIChpbiBWNWJldGExLCBsaW5lIDIwNCBvZiBqY2h1ZmYuYyBhbmQgbGluZSAxNzYgb2YgamRodWZmLmMpLgotW1RoaXMgYnVnIG1heSBvciBtYXkgbm90IHN0aWxsIG9jY3VyIHdpdGggdGhlIGN1cnJlbnQgSUpHIGNvZGUsIGJ1dCBpdCdzCi1wcm9iYWJseSBhIGRlYWQgaXNzdWUgYW55d2F5Li4uXQotCi0KLUhQLVVYOgotCi1JZiB5b3UgaGF2ZSBIUC1VWCA3LjA1IG9yIGxhdGVyIHdpdGggdGhlICJzb2Z0d2FyZSBkZXZlbG9wbWVudCIgQyBjb21waWxlciwKLXlvdSBzaG91bGQgcnVuIHRoZSBjb21waWxlciBpbiBBTlNJIG1vZGUuICBJZiB1c2luZyB0aGUgY29uZmlndXJlIHNjcmlwdCwKLXNheQotCS4vY29uZmlndXJlIENDPSdjYyAtQWEnCi0ob3IgLUFlIGlmIHlvdSBwcmVmZXIpLiAgSWYgY29uZmlndXJpbmcgYnkgaGFuZCwgdXNlIG1ha2VmaWxlLmFuc2kgYW5kIGFkZAotIi1BYSIgdG8gdGhlIENGTEFHUyBsaW5lIGluIHRoZSBtYWtlZmlsZS4KLQotSWYgeW91IGhhdmUgYSBwcmUtNy4wNSBzeXN0ZW0sIG9yIGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5vbi1BTlNJIEMgY29tcGlsZXIKLWRlbGl2ZXJlZCB3aXRoIGEgbWluaW11bSBIUC1VWCBzeXN0ZW0sIHRoZW4geW91IG11c3QgdXNlIG1ha2VmaWxlLnVuaXgKLShhbmQgZG8gTk9UIGFkZCAtQWEpOyBvciBqdXN0IHJ1biBjb25maWd1cmUgd2l0aG91dCB0aGUgQ0Mgb3B0aW9uLgotCi1PbiBIUCA5MDAwIHNlcmllcyA4MDAgbWFjaGluZXMsIHRoZSBIUCBDIGNvbXBpbGVyIGlzIGJ1Z2d5IGluIHJldmlzaW9ucyBwcmlvcgotdG8gQS4wOC4wNy4gIElmIHlvdSBnZXQgY29tcGxhaW50cyBhYm91dCAibm90IGEgdHlwZWRlZiBuYW1lIiwgeW91J2xsIGhhdmUgdG8KLXVzZSBtYWtlZmlsZS51bml4LCBvciBydW4gY29uZmlndXJlIHdpdGhvdXQgdGhlIENDIG9wdGlvbi4KLQotCi1NYWNpbnRvc2gsIGdlbmVyaWMgY29tbWVudHM6Ci0KLVRoZSBzdXBwbGllZCB1c2VyLWludGVyZmFjZSBmaWxlcyAoY2pwZWcuYywgZGpwZWcuYywgZXRjKSBhcmUgc2V0IHVwIHRvCi1wcm92aWRlIGEgVW5peC1zdHlsZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLiAgWW91IGNhbiB1c2UgdGhpcyBpbnRlcmZhY2Ugb24KLXRoZSBNYWMgYnkgbWVhbnMgb2YgdGhlIGNjb21tYW5kKCkgbGlicmFyeSByb3V0aW5lIHByb3ZpZGVkIGJ5IE1ldHJvd2Vya3MKLUNvZGVXYXJyaW9yIG9yIFRoaW5rIEMuICBUaGlzIGlzIG9ubHkgYXBwcm9wcmlhdGUgZm9yIHRlc3RpbmcgdGhlIGxpYnJhcnksCi1ob3dldmVyOyB0byBtYWtlIGEgdXNlci1mcmllbmRseSBlcXVpdmFsZW50IG9mIGNqcGVnL2RqcGVnIHlvdSdkIHJlYWxseSB3YW50Ci10byBkZXZlbG9wIGEgTWFjLXN0eWxlIHVzZXIgaW50ZXJmYWNlLiAgVGhlcmUgaXNuJ3QgYSBjb21wbGV0ZSBleGFtcGxlCi1hdmFpbGFibGUgYXQgdGhlIG1vbWVudCwgYnV0IHRoZXJlIGFyZSBzb21lIGhlbHBmdWwgc3RhcnRpbmcgcG9pbnRzOgotMS4gU2FtIEJ1c2hlbGwncyBmcmVlICJUbyBKUEVHIiBhcHBsZXQgcHJvdmlkZXMgZHJhZy1hbmQtZHJvcCBjb252ZXJzaW9uIHRvCi1KUEVHIHVuZGVyIFN5c3RlbSA3IGFuZCBsYXRlci4gIFRoaXMgb25seSBpbGx1c3RyYXRlcyBob3cgdG8gdXNlIHRoZQotY29tcHJlc3Npb24gaGFsZiBvZiB0aGUgbGlicmFyeSwgYnV0IGl0IGRvZXMgYSB2ZXJ5IG5pY2Ugam9iIG9mIHRoYXQgcGFydC4KLVRoZSBDb2RlV2FycmlvciBzb3VyY2UgY29kZSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LnBvYm94LmNvbS9+anNhbS4KLTIuIEppbSBCcnVubmVyIHByZXBhcmVkIGEgTWFjLXN0eWxlIHVzZXIgaW50ZXJmYWNlIGZvciBib3RoIGNvbXByZXNzaW9uIGFuZAotZGVjb21wcmVzc2lvbi4gIFVuZm9ydHVuYXRlbHksIGl0IGhhc24ndCBiZWVuIHVwZGF0ZWQgc2luY2UgSUpHIHY0LCBhbmQKLXRoZSBsaWJyYXJ5J3MgQVBJIGhhcyBjaGFuZ2VkIGNvbnNpZGVyYWJseSBzaW5jZSB0aGVuLiAgU3RpbGwgaXQgbWF5IGJlIG9mCi1zb21lIGhlbHAsIHBhcnRpY3VsYXJseSBhcyBhIGd1aWRlIHRvIGNvbXBpbGluZyB0aGUgSUpHIGNvZGUgdW5kZXIgVGhpbmsgQy4KLUppbSdzIGNvZGUgaXMgYXZhaWxhYmxlIGZyb20gdGhlIEluZm8tTWFjIGFyY2hpdmVzLCBhdCBzdW1leC1haW0uc3RhbmZvcmQuZWR1Ci1vciBtaXJyb3JzIHRoZXJlb2Y7IHNlZSBmaWxlIC9pbmZvLW1hYy9kZXYvc3JjL2pwZWctY29udmVydC1jLmhxeC4KLQotam1lbW1hYy5jIGlzIHRoZSByZWNvbW1lbmRlZCBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZCBmb3IgTWFjaW50b3NoLiAgSXQgdXNlcwotTmV3UHRyL0Rpc3Bvc2VQdHIgaW5zdGVhZCBvZiBtYWxsb2MvZnJlZSwgYW5kIGhhcyBhIE1hYy1zcGVjaWZpYwotaW1wbGVtZW50YXRpb24gb2YganBlZ19tZW1fYXZhaWxhYmxlKCkuICBJdCBhbHNvIGNyZWF0ZXMgdGVtcG9yYXJ5IGZpbGVzIHRoYXQKLWZvbGxvdyBNYWMgY29udmVudGlvbnMuICAoVGhhdCBwYXJ0IG9mIHRoZSBjb2RlIHJlbGllcyBvbiBTeXN0ZW0tNy1vci1sYXRlciBPUwotZnVuY3Rpb25zLiAgU2VlIHRoZSBjb21tZW50cyBpbiBqbWVtbWFjLmMgaWYgeW91IG5lZWQgdG8gcnVuIGl0IG9uIFN5c3RlbSA2LikKLU5PVEUgdGhhdCBVU0VfTUFDX01FTU1HUiBtdXN0IGJlIGRlZmluZWQgaW4gamNvbmZpZy5oIHRvIHVzZSBqbWVtbWFjLmMuCi0KLVlvdSBjYW4gYWxzbyB1c2Ugam1lbW5vYnMuYywgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgaGFuZGxpbmcgaW1hZ2VzIGxhcmdlcgotdGhhbiBhdmFpbGFibGUgbWVtb3J5LiAgSWYgeW91IHVzZSBhbnkgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmQgb3RoZXIgdGhhbgotam1lbW1hYy5jLCB3ZSByZWNvbW1lbmQgcmVwbGFjaW5nICJtYWxsb2MiIGFuZCAiZnJlZSIgYnkgIk5ld1B0ciIgYW5kCi0iRGlzcG9zZVB0ciIsIGJlY2F1c2UgTWFjIEMgbGlicmFyaWVzIG9mdGVuIGhhdmUgcGVjdWxpYXIgaW1wbGVtZW50YXRpb25zIG9mCi1tYWxsb2MvZnJlZS4gIChGb3IgaW5zdGFuY2UsIGZyZWUoKSBtYXkgbm90IHJldHVybiB0aGUgZnJlZWQgc3BhY2UgdG8gdGhlCi1NYWMgTWVtb3J5IE1hbmFnZXIuICBUaGlzIGlzIHVuZGVzaXJhYmxlIGZvciB0aGUgSUpHIGNvZGUgYmVjYXVzZSBqbWVtbWdyLmMKLWFscmVhZHkgY2x1bXBzIHNwYWNlIHJlcXVlc3RzLikKLQotCi1NYWNpbnRvc2gsIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6Ci0KLVRoZSBVbml4LWNvbW1hbmQtbGluZS1zdHlsZSBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgYnkgZGVmaW5pbmcgVVNFX0NDT01NQU5ELgotWW91J2xsIGFsc28gbmVlZCB0byBkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUgdG8gYXZvaWQgc3RkaW4vc3Rkb3V0LgotVGhpcyBtZWFucyB0aGF0IHdoZW4gdXNpbmcgdGhlIGNqcGVnL2RqcGVnIHByb2dyYW1zLCB5b3UnbGwgaGF2ZSB0byB0eXBlIHRoZQotaW5wdXQgYW5kIG91dHB1dCBmaWxlIG5hbWVzIGluIHRoZSAiQXJndW1lbnRzIiB0ZXh0LWVkaXQgYm94LCByYXRoZXIgdGhhbgotdXNpbmcgdGhlIGZpbGUgcmFkaW8gYnV0dG9ucy4gIChQZXJoYXBzIFVTRV9GRE9QRU4gb3IgVVNFX1NFVE1PREUgd291bGQKLWVsaW1pbmF0ZSB0aGUgcHJvYmxlbSwgYnV0IEkgaGF2ZW4ndCBoZWFyZCBmcm9tIGFueW9uZSB3aG8ncyB0cmllZCBpdC4pCi0KLU9uIDY4MHgwIE1hY3MsIE1ldHJvd2Vya3MgZGVmaW5lcyB0eXBlICJkb3VibGUiIGFzIGEgMTAtYnl0ZSBJRUVFIGV4dGVuZGVkCi1mbG9hdC4gIGptZW1tZ3IuYyB3b24ndCBsaWtlIHRoaXM6IGl0IHdhbnRzIHNpemVvZihBTElHTl9UWVBFKSB0byBiZSBhIHBvd2VyCi1vZiAyLiAgQWRkICIjZGVmaW5lIEFMSUdOX1RZUEUgbG9uZyIgdG8gamNvbmZpZy5oIHRvIGVsaW1pbmF0ZSB0aGUgY29tcGxhaW50LgotCi1UaGUgc3VwcGxpZWQgY29uZmlndXJhdGlvbiBmaWxlIGpjb25maWcubWFjIGNhbiBiZSB1c2VkIGZvciB5b3VyIGpjb25maWcuaDsKLWl0IGluY2x1ZGVzIGFsbCB0aGUgcmVjb21tZW5kZWQgc3ltYm9sIGRlZmluaXRpb25zLiAgSWYgeW91IGhhdmUgQXBwbGVTY3JpcHQKLWluc3RhbGxlZCwgeW91IGNhbiBydW4gdGhlIHN1cHBsaWVkIHNjcmlwdCBtYWtlcHJvai5tYWMgdG8gY3JlYXRlIENvZGVXYXJyaW9yCi1wcm9qZWN0IGZpbGVzIGZvciB0aGUgbGlicmFyeSBhbmQgdGhlIHRlc3RiZWQgYXBwbGljYXRpb25zLCB0aGVuIGJ1aWxkIHRoZQotbGlicmFyeSBhbmQgYXBwbGljYXRpb25zLiAgKFRoYW5rcyB0byBEYW4gU2VhcnMgYW5kIERvbiBBZ3JvIGZvciB0aGlzIG5pZnR5Ci1oYWNrLCB3aGljaCBzYXZlcyB1cyBmcm9tIHRyeWluZyB0byBtYWludGFpbiBDb2RlV2FycmlvciBwcm9qZWN0IGZpbGVzIGFzIHBhcnQKLW9mIHRoZSBJSkcgZGlzdHJpYnV0aW9uLi4uKQotCi0KLU1hY2ludG9zaCwgVGhpbmsgQzoKLQotVGhlIGRvY3VtZW50YXRpb24gaW4gSmltIEJydW5uZXIncyAiSlBFRyBDb252ZXJ0IiBzb3VyY2UgY29kZSAoc2VlIGFib3ZlKQotaW5jbHVkZXMgZGV0YWlsZWQgYnVpbGQgaW5zdHJ1Y3Rpb25zIGZvciBUaGluayBDOyBpdCdzIHByb2JhYmx5IHNvbWV3aGF0Ci1vdXQgb2YgZGF0ZSBmb3IgdGhlIGN1cnJlbnQgcmVsZWFzZSwgYnV0IG1heSBiZSBoZWxwZnVsLgotCi1JZiB5b3Ugd2FudCB0byBidWlsZCB0aGUgbWluaW1hbCBjb21tYW5kIGxpbmUgdmVyc2lvbiwgcHJvY2VlZCBhcyBmb2xsb3dzLgotWW91J2xsIGhhdmUgdG8gcHJlcGFyZSBwcm9qZWN0IGZpbGVzIGZvciB0aGUgcHJvZ3JhbXM7IHdlIGRvbid0IGluY2x1ZGUgYW55Ci1pbiB0aGUgZGlzdHJpYnV0aW9uIHNpbmNlIHRoZXkgYXJlIG5vdCB0ZXh0IGZpbGVzLiAgVXNlIHRoZSBmaWxlIGxpc3RzIGluCi1hbnkgb2YgdGhlIHN1cHBsaWVkIG1ha2VmaWxlcyBhcyBhIGd1aWRlLiAgQWxzbyBhZGQgdGhlIEFOU0kgYW5kIFVuaXggQwotbGlicmFyaWVzIGluIGEgc2VwYXJhdGUgc2VnbWVudC4gIFlvdSBtYXkgbmVlZCB0byBkaXZpZGUgdGhlIEpQRUcgZmlsZXMgaW50bwotbW9yZSB0aGFuIG9uZSBzZWdtZW50OyB3ZSByZWNvbW1lbmQgZGl2aWRpbmcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLW1vZHVsZXMuICBEZWZpbmUgVVNFX0NDT01NQU5EIGluIGpjb25maWcuaCBzbyB0aGF0IHRoZSBjY29tbWFuZCgpIHJvdXRpbmUgaXMKLWNhbGxlZC4gIFlvdSBtdXN0IGFsc28gZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FIGJlY2F1c2Ugc3RkaW4vc3Rkb3V0Ci1kb24ndCBoYW5kbGUgYmluYXJ5IGRhdGEgY29ycmVjdGx5LgotCi1PbiA2ODB4MCBNYWNzLCBUaGluayBDIGRlZmluZXMgdHlwZSAiZG91YmxlIiBhcyBhIDEyLWJ5dGUgSUVFRSBleHRlbmRlZCBmbG9hdC4KLWptZW1tZ3IuYyB3b24ndCBsaWtlIHRoaXM6IGl0IHdhbnRzIHNpemVvZihBTElHTl9UWVBFKSB0byBiZSBhIHBvd2VyIG9mIDIuCi1BZGQgIiNkZWZpbmUgQUxJR05fVFlQRSBsb25nIiB0byBqY29uZmlnLmggdG8gZWxpbWluYXRlIHRoZSBjb21wbGFpbnQuCi0KLWpjb25maWcubWFjIHNob3VsZCB3b3JrIGFzIGEgamNvbmZpZy5oIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgVGhpbmsgQywKLWJ1dCB0aGUgbWFrZXByb2oubWFjIEFwcGxlU2NyaXB0IHNjcmlwdCBpcyBzcGVjaWZpYyB0byBDb2RlV2Fycmlvci4gIFNvcnJ5LgotCi0KLU1JUFMgUjMwMDA6Ci0KLU1JUFMncyBjYyB2ZXJzaW9uIDEuMzEgaGFzIGEgcmF0aGVyIG5hc3R5IG9wdGltaXphdGlvbiBidWcuICBEb24ndCB1c2UgLU8KLWlmIHlvdSBoYXZlIHRoYXQgY29tcGlsZXIgdmVyc2lvbi4gIChVc2UgImNjIC1WIiB0byBjaGVjayB0aGUgdmVyc2lvbi4pCi1Ob3RlIHRoYXQgdGhlIFIzMDAwIGNoaXAgaXMgZm91bmQgaW4gd29ya3N0YXRpb25zIGZyb20gREVDIGFuZCBvdGhlcnMuCi0KLQotTVMtRE9TLCBnZW5lcmljIGNvbW1lbnRzIGZvciAxNi1iaXQgY29tcGlsZXJzOgotCi1UaGUgSUpHIGNvZGUgaXMgZGVzaWduZWQgdG8gd29yayB3ZWxsIGluIDgweDg2ICJzbWFsbCIgb3IgIm1lZGl1bSIgbWVtb3J5Ci1tb2RlbHMgKGkuZS4sIGRhdGEgcG9pbnRlcnMgYXJlIDE2IGJpdHMgdW5sZXNzIGV4cGxpY2l0bHkgZGVjbGFyZWQgImZhciI7Ci1jb2RlIHBvaW50ZXJzIGNhbiBiZSBlaXRoZXIgc2l6ZSkuICBZb3UgbWF5IGJlIGFibGUgdG8gdXNlIHNtYWxsIG1vZGVsIHRvCi1jb21waWxlIGNqcGVnIG9yIGRqcGVnIGJ5IGl0c2VsZiwgYnV0IHlvdSB3aWxsIHByb2JhYmx5IGhhdmUgdG8gdXNlIG1lZGl1bQotbW9kZWwgZm9yIGFueSBsYXJnZXIgYXBwbGljYXRpb24uICBUaGlzIHdvbid0IG1ha2UgbXVjaCBkaWZmZXJlbmNlIGluCi1wZXJmb3JtYW5jZS4gIFlvdSAqd2lsbCogdGFrZSBhIG5vdGljZWFibGUgcGVyZm9ybWFuY2UgaGl0IGlmIHlvdSB1c2UgYQotbGFyZ2UtZGF0YSBtZW1vcnkgbW9kZWwsIGFuZCB5b3Ugc2hvdWxkIGF2b2lkICJodWdlIiBtb2RlbCBpZiBhdCBhbGwKLXBvc3NpYmxlLiAgQmUgc3VyZSB0aGF0IE5FRURfRkFSX1BPSU5URVJTIGlzIGRlZmluZWQgaW4gamNvbmZpZy5oIGlmIHlvdSB1c2UKLWEgc21hbGwtZGF0YSBtZW1vcnkgbW9kZWw7IGJlIHN1cmUgaXQgaXMgTk9UIGRlZmluZWQgaWYgeW91IHVzZSBhIGxhcmdlLWRhdGEKLW1vZGVsLiAgKFRoZSBzdXBwbGllZCBtYWtlZmlsZXMgYW5kIGpjb25maWcgZmlsZXMgZm9yIEJvcmxhbmQgYW5kIE1pY3Jvc29mdCBDCi1jb21waWxlIGluIG1lZGl1bSBtb2RlbCBhbmQgZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTLikKLQotVGhlIERPUy1zcGVjaWZpYyBtZW1vcnkgbWFuYWdlciwgam1lbWRvcy5jLCBzaG91bGQgYmUgdXNlZCBpZiBwb3NzaWJsZS4KLUl0IG5lZWRzIHNvbWUgYXNzZW1ibHktY29kZSByb3V0aW5lcyB3aGljaCBhcmUgaW4gam1lbWRvc2EuYXNtOyBtYWtlIHN1cmUKLXlvdXIgbWFrZWZpbGUgYXNzZW1ibGVzIHRoYXQgZmlsZSBhbmQgaW5jbHVkZXMgaXQgaW4gdGhlIGxpYnJhcnkuICBJZiB5b3UKLWRvbid0IGhhdmUgYSBzdWl0YWJsZSBhc3NlbWJsZXIsIHlvdSBjYW4gZ2V0IHByZS1hc3NlbWJsZWQgb2JqZWN0IGZpbGVzIGZvcgotam1lbWRvc2EgYnkgRlRQIGZyb20gZnRwLnV1Lm5ldDovZ3JhcGhpY3MvanBlZy9qZG9zYW9iai56aXAuICAoRE9TLW9yaWVudGVkCi1kaXN0cmlidXRpb25zIG9mIHRoZSBJSkcgc291cmNlIGNvZGUgb2Z0ZW4gaW5jbHVkZSB0aGVzZSBvYmplY3QgZmlsZXMuKQotCi1XaGVuIHVzaW5nIGptZW1kb3MuYywgamNvbmZpZy5oIG11c3QgZGVmaW5lIFVTRV9NU0RPU19NRU1NR1IgYW5kIG11c3Qgc2V0Ci1NQVhfQUxMT0NfQ0hVTksgdG8gbGVzcyB0aGFuIDY0SyAoNjU1MjBMIGlzIGEgdHlwaWNhbCB2YWx1ZSkuICBJZiB5b3VyCi1DIGxpYnJhcnkncyBmYXItaGVhcCBtYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBibG9ja3MgdGhhdCBsYXJnZSwgcmVkdWNlCi1NQVhfQUxMT0NfQ0hVTksgdG8gd2hhdGV2ZXIgaXQgY2FuIGhhbmRsZS4KLQotSWYgeW91IGNhbid0IHVzZSBqbWVtZG9zLmMgZm9yIHNvbWUgcmVhc29uIC0tLSBmb3IgZXhhbXBsZSwgYmVjYXVzZSB5b3UKLWRvbid0IGhhdmUgYW4gYXNzZW1ibGVyIHRvIGFzc2VtYmxlIGptZW1kb3NhLmFzbSAtLS0geW91J2xsIGhhdmUgdG8gZmFsbAotYmFjayB0byBqbWVtYW5zaS5jIG9yIGptZW1uYW1lLmMuICBZb3UnbGwgcHJvYmFibHkgc3RpbGwgbmVlZCB0byBzZXQKLU1BWF9BTExPQ19DSFVOSyBpbiBqY29uZmlnLmgsIGJlY2F1c2UgbW9zdCBET1MgQyBsaWJyYXJpZXMgd29uJ3QgbWFsbG9jKCkKLW1vcmUgdGhhbiA2NEsgYXQgYSB0aW1lLiAgSU1QT1JUQU5UOiBpZiB5b3UgdXNlIGptZW1hbnNpLmMgb3Igam1lbW5hbWUuYywKLXlvdSB3aWxsIGhhdmUgdG8gY29tcGlsZSBpbiBhIGxhcmdlLWRhdGEgbWVtb3J5IG1vZGVsIGluIG9yZGVyIHRvIGdldCB0aGUKLXJpZ2h0IHN0ZGlvIGxpYnJhcnkuICBUb28gYmFkLgotCi13cmpwZ2NvbSBuZWVkcyB0byBiZSBjb21waWxlZCBpbiBsYXJnZSBtb2RlbCwgYmVjYXVzZSBpdCBtYWxsb2MoKXMgYSA2NEtCCi13b3JrIGFyZWEgdG8gaG9sZCB0aGUgY29tbWVudCB0ZXh0LiAgSWYgeW91ciBDIGxpYnJhcnkncyBtYWxsb2MgY2FuJ3QKLWhhbmRsZSB0aGF0LCByZWR1Y2UgTUFYX0NPTV9MRU5HVEggYXMgbmVjZXNzYXJ5IGluIHdyanBnY29tLmMuCi0KLU1vc3QgTVMtRE9TIGNvbXBpbGVycyB0cmVhdCBzdGRpbi9zdGRvdXQgYXMgdGV4dCBmaWxlcywgc28geW91IG11c3QgdXNlCi10d28tZmlsZSBjb21tYW5kIGxpbmUgc3R5bGUuICBCdXQgaWYgeW91ciBjb21waWxlciBoYXMgZWl0aGVyIGZkb3BlbigpIG9yCi1zZXRtb2RlKCksIHlvdSBjYW4gdXNlIG9uZS1maWxlIHN0eWxlIGlmIHlvdSBsaWtlLiAgVG8gZG8gdGhpcywgZGVmaW5lCi1VU0VfU0VUTU9ERSBvciBVU0VfRkRPUEVOIHNvIHRoYXQgc3RkaW4vc3Rkb3V0IHdpbGwgYmUgc2V0IHRvIGJpbmFyeSBtb2RlLgotKFVTRV9TRVRNT0RFIHNlZW1zIHRvIHdvcmsgd2l0aCBtb3JlIERPUyBjb21waWxlcnMgdGhhbiBVU0VfRkRPUEVOLikgIFlvdQotc2hvdWxkIHRlc3QgdGhhdCBJL08gdGhyb3VnaCBzdGRpbi9zdGRvdXQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0cyBhcyBJL08KLXRvIGV4cGxpY2l0bHkgbmFtZWQgZmlsZXMuLi4gdGhlICJtYWtlIHRlc3QiIHByb2NlZHVyZXMgaW4gdGhlIHN1cHBsaWVkCi1tYWtlZmlsZXMgZG8gTk9UIHVzZSBzdGRpbi9zdGRvdXQuCi0KLQotTVMtRE9TLCBnZW5lcmljIGNvbW1lbnRzIGZvciAzMi1iaXQgY29tcGlsZXJzOgotCi1Ob25lIG9mIHRoZSBhYm92ZSBjb21tZW50cyBhYm91dCBtZW1vcnkgbW9kZWxzIGFwcGx5IGlmIHlvdSBhcmUgdXNpbmcgYQotMzItYml0IGZsYXQtbWVtb3J5LXNwYWNlIGVudmlyb25tZW50LCBzdWNoIGFzIERKR1BQIG9yIFdhdGNvbSBDLiAgKEFuZCB5b3UKLXNob3VsZCB1c2Ugb25lIGlmIHlvdSBoYXZlIGl0LCBhcyBwZXJmb3JtYW5jZSB3aWxsIGJlIG11Y2ggYmV0dGVyIHRoYW4KLTgwODYtY29tcGF0aWJsZSBjb2RlISkgIEZvciBmbGF0LW1lbW9yeS1zcGFjZSBjb21waWxlcnMsIGRvIE5PVCBkZWZpbmUKLU5FRURfRkFSX1BPSU5URVJTLCBhbmQgZG8gTk9UIHVzZSBqbWVtZG9zLmMuICBVc2Ugam1lbW5vYnMuYyBpZiB0aGUKLWVudmlyb25tZW50IHN1cHBsaWVzIGFkZXF1YXRlIHZpcnR1YWwgbWVtb3J5LCBvdGhlcndpc2UgdXNlIGptZW1hbnNpLmMgb3IKLWptZW1uYW1lLmMuCi0KLVlvdSdsbCBzdGlsbCBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQgYmluYXJ5IEkvTyB0aHJvdWdoIHN0ZGluL3N0ZG91dC4KLVNlZSB0aGUgbGFzdCBwYXJhZ3JhcGggb2YgdGhlIHByZXZpb3VzIHNlY3Rpb24uCi0KLQotTVMtRE9TLCBCb3JsYW5kIEM6Ci0KLUJlIHN1cmUgdG8gY29udmVydCBhbGwgdGhlIHNvdXJjZSBmaWxlcyB0byBET1MgdGV4dCBmb3JtYXQgKENSL0xGIG5ld2xpbmVzKS4KLUFsdGhvdWdoIEJvcmxhbmQgQyB3aWxsIG9mdGVuIHdvcmsgT0sgd2l0aCB1bm1vZGlmaWVkIFVuaXggKExGIG5ld2xpbmVzKQotc291cmNlIGZpbGVzLCBzb21ldGltZXMgaXQgd2lsbCBnaXZlIGJvZ3VzIGNvbXBpbGUgZXJyb3JzLgotIklsbGVnYWwgY2hhcmFjdGVyICcjJyIgaXMgdGhlIG1vc3QgY29tbW9uIHN1Y2ggZXJyb3IuICAoVGhpcyBpcyB0cnVlIHdpdGgKLUJvcmxhbmQgQyAzLjEsIGJ1dCBwZXJoYXBzIGlzIGZpeGVkIGluIG5ld2VyIHJlbGVhc2VzLikKLQotSWYgeW91IHdhbnQgb25lLWZpbGUgY29tbWFuZCBsaW5lIHN0eWxlLCBqdXN0IHVuZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FLgotamNvbmZpZy5iY2MgYWxyZWFkeSBpbmNsdWRlcyAjZGVmaW5lIFVTRV9TRVRNT0RFIHRvIG1ha2UgdGhpcyB3b3JrLgotKGZkb3BlbiBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseS4pCi0KLQotTVMtRE9TLCBNaWNyb3NvZnQgQzoKLQotbWFrZWZpbGUubWM2IHdvcmtzIHdpdGggTWljcm9zb2Z0IEMsIERPUyBWaXN1YWwgQysrLCBldGMuICBJdCBzaG91bGQgb25seQotYmUgdXNlZCBpZiB5b3Ugd2FudCB0byBidWlsZCBhIDE2LWJpdCAoc21hbGwgb3IgbWVkaXVtIG1lbW9yeSBtb2RlbCkgcHJvZ3JhbS4KLQotSWYgeW91IHdhbnQgb25lLWZpbGUgY29tbWFuZCBsaW5lIHN0eWxlLCBqdXN0IHVuZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FLgotamNvbmZpZy5tYzYgYWxyZWFkeSBpbmNsdWRlcyAjZGVmaW5lIFVTRV9TRVRNT0RFIHRvIG1ha2UgdGhpcyB3b3JrLgotKGZkb3BlbiBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseS4pCi0KLU5vdGUgdGhhdCB0aGlzIG1ha2VmaWxlIGFzc3VtZXMgdGhhdCB0aGUgd29ya2luZyBjb3B5IG9mIGl0c2VsZiBpcyBjYWxsZWQKLSJtYWtlZmlsZSIuICBJZiB5b3Ugd2FudCB0byBjYWxsIGl0IHNvbWV0aGluZyBlbHNlLCBzYXkgIm1ha2VmaWxlLm1hayIsCi1iZSBzdXJlIHRvIGFkanVzdCB0aGUgZGVwZW5kZW5jeSBsaW5lIHRoYXQgcmVhZHMgIiQoUkZJTEUpIDogbWFrZWZpbGUiLgotT3RoZXJ3aXNlIHRoZSBtYWtlIHdpbGwgZmFpbCBiZWNhdXNlIGl0IGRvZXNuJ3Qga25vdyBob3cgdG8gY3JlYXRlICJtYWtlZmlsZSIuCi1Xb3JzZSwgc29tZSByZWxlYXNlcyBvZiBNaWNyb3NvZnQncyBtYWtlIHV0aWxpdGllcyBnaXZlIGFuIGluY29ycmVjdCBlcnJvcgotbWVzc2FnZSBpbiB0aGlzIHNpdHVhdGlvbi4KLQotT2xkIHZlcnNpb25zIG9mIE1TIEMgZmFpbCB3aXRoIGFuICJvdXQgb2YgbWFjcm8gZXhwYW5zaW9uIHNwYWNlIiBlcnJvcgotYmVjYXVzZSB0aGV5IGNhbid0IGNvcGUgd2l0aCB0aGUgbWFjcm8gVFJBQ0VNUzggKGRlZmluZWQgaW4gamVycm9yLmgpLgotSWYgdGhpcyBoYXBwZW5zIHRvIHlvdSwgdGhlIGVhc2llc3Qgc29sdXRpb24gaXMgdG8gY2hhbmdlIFRSQUNFTVM4IHRvCi1leHBhbmQgdG8gbm90aGluZy4gIFlvdSdsbCBsb3NlIHRoZSBhYmlsaXR5IHRvIGR1bXAgb3V0IEpQRUcgY29lZmZpY2llbnQKLXRhYmxlcyB3aXRoIGRqcGVnIC1kZWJ1ZyAtZGVidWcsIGJ1dCBhdCBsZWFzdCB5b3UgY2FuIGNvbXBpbGUuCi0KLU9yaWdpbmFsIE1TIEMgNi4wIGlzIHZlcnkgYnVnZ3k7IGl0IGNvbXBpbGVzIGluY29ycmVjdCBjb2RlIHVubGVzcyB5b3UgdHVybgotb2ZmIG9wdGltaXphdGlvbiBlbnRpcmVseSAocmVtb3ZlIC1PIGZyb20gQ0ZMQUdTKS4gIDYuMDBBIGlzIGJldHRlciwgYnV0IGl0Ci1zdGlsbCBnZW5lcmF0ZXMgYmFkIGNvZGUgaWYgeW91IGVuYWJsZSBsb29wIG9wdGltaXphdGlvbnMgKC1PbCBvciAtT3gpLgotCi1NUyBDIDguMCBjcmFzaGVzIHdoZW4gY29tcGlsaW5nIGpxdWFudDEuYyB3aXRoIG9wdGltaXphdGlvbiBzd2l0Y2ggL09vIC4uLgotd2hpY2ggaXMgb24gYnkgZGVmYXVsdC4gIFRvIHdvcmsgYXJvdW5kIHRoaXMgYnVnLCBjb21waWxlIHRoYXQgb25lIGZpbGUKLXdpdGggL09vLS4KLQotCi1NaWNyb3NvZnQgV2luZG93cyAoYWxsIHZlcnNpb25zKSwgZ2VuZXJpYyBjb21tZW50czoKLQotU29tZSBXaW5kb3dzIHN5c3RlbSBpbmNsdWRlIGZpbGVzIGRlZmluZSB0eXBlZGVmIGJvb2xlYW4gYXMgInVuc2lnbmVkIGNoYXIiLgotVGhlIElKRyBjb2RlIGFsc28gZGVmaW5lcyB0eXBlZGVmIGJvb2xlYW4sIGJ1dCB3ZSBtYWtlIGl0ICJpbnQiIGJ5IGRlZmF1bHQuCi1UaGlzIGRvZXNuJ3QgYWZmZWN0IHRoZSBJSkcgcHJvZ3JhbXMgYmVjYXVzZSB3ZSBkb24ndCBpbXBvcnQgdGhvc2UgV2luZG93cwotaW5jbHVkZSBmaWxlcy4gIEJ1dCBpZiB5b3UgdXNlIHRoZSBKUEVHIGxpYnJhcnkgaW4geW91ciBvd24gcHJvZ3JhbSwgYW5kIHNvbWUKLW9mIHlvdXIgcHJvZ3JhbSdzIGZpbGVzIGltcG9ydCBvbmUgZGVmaW5pdGlvbiBvZiBib29sZWFuIHdoaWxlIHNvbWUgaW1wb3J0IHRoZQotb3RoZXIsIHlvdSBjYW4gZ2V0IGFsbCBzb3J0cyBvZiBteXN0ZXJpb3VzIHByb2JsZW1zLiAgQSBnb29kIHByZXZlbnRpdmUgc3RlcAotaXMgdG8gbWFrZSB0aGUgSUpHIGxpYnJhcnkgdXNlICJ1bnNpZ25lZCBjaGFyIiBmb3IgYm9vbGVhbi4gIFRvIGRvIHRoYXQsCi1hZGQgc29tZXRoaW5nIGxpa2UgdGhpcyB0byB5b3VyIGpjb25maWcuaCBmaWxlOgotCS8qIERlZmluZSAiYm9vbGVhbiIgYXMgdW5zaWduZWQgY2hhciwgbm90IGludCwgcGVyIFdpbmRvd3MgY3VzdG9tICovCi0JI2lmbmRlZiBfX1JQQ05EUl9IX18JLyogZG9uJ3QgY29uZmxpY3QgaWYgcnBjbmRyLmggYWxyZWFkeSByZWFkICovCi0JdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJvb2xlYW47Ci0JI2VuZGlmCi0JI2RlZmluZSBIQVZFX0JPT0xFQU4JLyogcHJldmVudCBqbW9yZWNmZy5oIGZyb20gcmVkZWZpbmluZyBpdCAqLwotKFRoaXMgaXMgYWxyZWFkeSBpbiBqY29uZmlnLnZjLCBieSB0aGUgd2F5LikKLQotd2luZGVmLmggY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucwotCSNkZWZpbmUgZmFyCi0JI2RlZmluZSBGQVIgZmFyCi1TaW5jZSBqbW9yZWNmZy5oIHRyaWVzIHRvIGRlZmluZSBGQVIgYXMgZW1wdHksIHlvdSBtYXkgZ2V0IGEgY29tcGlsZXIKLXdhcm5pbmcgaWYgeW91IGluY2x1ZGUgYm90aCBqcGVnbGliLmggYW5kIHdpbmRlZi5oICh3aGljaCB3aW5kb3dzLmgKLWluY2x1ZGVzKS4gIFRvIHN1cHByZXNzIHRoZSB3YXJuaW5nLCB5b3UgY2FuIHB1dCAiI2lmbmRlZiBGQVIiLyIjZW5kaWYiCi1hcm91bmQgdGhlIGxpbmUgIiNkZWZpbmUgRkFSIiBpbiBqbW9yZWNmZy5oLgotCi1XaGVuIHVzaW5nIHRoZSBsaWJyYXJ5IGluIGEgV2luZG93cyBhcHBsaWNhdGlvbiwgeW91IHdpbGwgYWxtb3N0IGNlcnRhaW5seQotd2FudCB0byBtb2RpZnkgb3IgcmVwbGFjZSB0aGUgZXJyb3IgaGFuZGxlciBtb2R1bGUgamVycm9yLmMsIHNpbmNlIG91cgotZGVmYXVsdCBlcnJvciBoYW5kbGVyIGRvZXMgYSBjb3VwbGUgb2YgaW5hcHByb3ByaWF0ZSB0aGluZ3M6Ci0gIDEuIGl0IHRyaWVzIHRvIHdyaXRlIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIG9uIHN0ZGVycjsKLSAgMi4gaW4gZXZlbnQgb2YgYSBmYXRhbCBlcnJvciwgaXQgZXhpdHMgYnkgY2FsbGluZyBleGl0KCkuCi0KLUEgc2ltcGxlIHN0b3BnYXAgc29sdXRpb24gZm9yIHByb2JsZW0gMSBpcyB0byByZXBsYWNlIHRoZSBsaW5lCi0JZnByaW50ZihzdGRlcnIsICIlc1xuIiwgYnVmZmVyKTsKLShpbiBvdXRwdXRfbWVzc2FnZSBpbiBqZXJyb3IuYykgd2l0aAotCU1lc3NhZ2VCb3goR2V0QWN0aXZlV2luZG93KCksYnVmZmVyLCJKUEVHIEVycm9yIixNQl9PS3xNQl9JQ09ORVJST1IpOwotSXQncyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYXQgbGVhc3QgZG8gdGhhdCBtdWNoLCBzaW5jZSBvdGhlcndpc2UKLWVycm9yIG1lc3NhZ2VzIHdpbGwgZGlzYXBwZWFyIGludG8gbm93aGVyZS4gIChCZWdpbm5pbmcgd2l0aCBJSkcgdjZiLCB0aGlzCi1jb2RlIGlzIGFscmVhZHkgcHJlc2VudCBpbiBqZXJyb3IuYzsganVzdCBkZWZpbmUgVVNFX1dJTkRPV1NfTUVTU0FHRUJPWCBpbgotamNvbmZpZy5oIHRvIGVuYWJsZSBpdC4pCi0KLVRoZSBwcm9wZXIgc29sdXRpb24gZm9yIHByb2JsZW0gMiBpcyB0byByZXR1cm4gY29udHJvbCB0byB5b3VyIGNhbGxpbmcKLWFwcGxpY2F0aW9uIGFmdGVyIGEgbGlicmFyeSBlcnJvci4gIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgc2V0am1wL2xvbmdqbXAKLXRlY2huaXF1ZSBkaXNjdXNzZWQgaW4gbGlianBlZy5kb2MgYW5kIGlsbHVzdHJhdGVkIGluIGV4YW1wbGUuYy4gIChOT1RFOgotc29tZSBvbGRlciBXaW5kb3dzIEMgY29tcGlsZXJzIHByb3ZpZGUgdmVyc2lvbnMgb2Ygc2V0am1wL2xvbmdqbXAgdGhhdAotZG9uJ3QgYWN0dWFsbHkgd29yayB1bmRlciBXaW5kb3dzLiAgWW91IG1heSBuZWVkIHRvIHVzZSB0aGUgV2luZG93cyBzeXN0ZW0KLWZ1bmN0aW9ucyBDYXRjaCBhbmQgVGhyb3cgaW5zdGVhZC4pCi0KLVRoZSByZWNvbW1lbmRlZCBtZW1vcnkgbWFuYWdlciB1bmRlciBXaW5kb3dzIGlzIGptZW1ub2JzLmM7IGluIG90aGVyIHdvcmRzLAotbGV0IFdpbmRvd3MgZG8gYW55IHZpcnR1YWwgbWVtb3J5IG1hbmFnZW1lbnQgbmVlZGVkLiAgWW91IHNob3VsZCBOT1QgdXNlCi1qbWVtZG9zLmMgbm9yIGptZW1kb3NhLmFzbSB1bmRlciBXaW5kb3dzLgotCi1Gb3IgV2luZG93cyAzLjEsIHdlIHJlY29tbWVuZCBjb21waWxpbmcgaW4gbWVkaXVtIG9yIGxhcmdlIG1lbW9yeSBtb2RlbDsKLWZvciBuZXdlciBXaW5kb3dzIHZlcnNpb25zLCB1c2UgYSAzMi1iaXQgZmxhdCBtZW1vcnkgbW9kZWwuICAoU2VlIHRoZSBNUy1ET1MKLXNlY3Rpb25zIGFib3ZlIGZvciBtb3JlIGluZm8gYWJvdXQgbWVtb3J5IG1vZGVscy4pICBJbiB0aGUgMTYtYml0IG1lbW9yeQotbW9kZWxzIG9ubHksIHlvdSdsbCBuZWVkIHRvIHB1dAotCSNkZWZpbmUgTUFYX0FMTE9DX0NIVU5LIDY1NTIwTAkvKiBNYXhpbXVtIHJlcXVlc3QgdG8gbWFsbG9jKCkgKi8KLWludG8gamNvbmZpZy5oIHRvIGxpbWl0IGFsbG9jYXRpb24gY2h1bmtzIHRvIDY0S2IuICAoV2l0aG91dCB0aGF0LCB5b3UnZAotaGF2ZSB0byB1c2UgaHVnZSBtZW1vcnkgbW9kZWwsIHdoaWNoIHNsb3dzIHRoaW5ncyBkb3duIHVubmVjZXNzYXJpbHkuKQotam1lbW5vYnMuYyB3b3JrcyB3aXRob3V0IG1vZGlmaWNhdGlvbiBpbiBsYXJnZSBvciBmbGF0IG1lbW9yeSBtb2RlbHMsIGJ1dCB0bwotdXNlIG1lZGl1bSBtb2RlbCwgeW91IG5lZWQgdG8gbW9kaWZ5IGl0cyBqcGVnX2dldF9sYXJnZSBhbmQganBlZ19mcmVlX2xhcmdlCi1yb3V0aW5lcyB0byBhbGxvY2F0ZSBmYXIgbWVtb3J5LiAgSW4gYW55IGNhc2UsIHlvdSBtaWdodCBsaWtlIHRvIHJlcGxhY2UKLWl0cyBjYWxscyB0byBtYWxsb2MgYW5kIGZyZWUgd2l0aCBkaXJlY3QgY2FsbHMgb24gV2luZG93cyBtZW1vcnkgYWxsb2NhdGlvbgotZnVuY3Rpb25zLgotCi1Zb3UgbWF5IGFsc28gd2FudCB0byBtb2RpZnkgamRhdGFzcmMuYyBhbmQgamRhdGFkc3QuYyB0byB1c2UgV2luZG93cyBmaWxlCi1vcGVyYXRpb25zIHJhdGhlciB0aGFuIGZyZWFkL2Z3cml0ZS4gIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgeW91ciBDCi1jb21waWxlciBkb2Vzbid0IHByb3ZpZGUgYSBjb21wZXRlbnQgaW1wbGVtZW50YXRpb24gb2YgQyBzdGRpbyBmdW5jdGlvbnMuCi0KLVlvdSBtaWdodCB3YW50IHRvIHR3ZWFrIHRoZSBSR0JfeHh4IG1hY3JvcyBpbiBqbW9yZWNmZy5oIHNvIHRoYXQgdGhlIGxpYnJhcnkKLXdpbGwgYWNjZXB0IG9yIGRlbGl2ZXIgY29sb3IgcGl4ZWxzIGluIEJHUiBzYW1wbGUgb3JkZXIsIG5vdCBSR0I7IEJHUiBvcmRlcgotaXMgdXN1YWxseSBtb3JlIGNvbnZlbmllbnQgdW5kZXIgV2luZG93cy4gIE5vdGUgdGhhdCB0aGlzIGNoYW5nZSB3aWxsIGJyZWFrCi10aGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBjanBlZy9kanBlZywgYnV0IHRoZSBsaWJyYXJ5IGl0c2VsZiB3b3JrcyBmaW5lLgotCi0KLU1hbnkgcGVvcGxlIHdhbnQgdG8gY29udmVydCB0aGUgSUpHIGxpYnJhcnkgaW50byBhIERMTC4gIFRoaXMgaXMgcmVhc29uYWJseQotc3RyYWlnaHRmb3J3YXJkLCBidXQgd2F0Y2ggb3V0IGZvciB0aGUgZm9sbG93aW5nOgotCi0gIDEuIERvbid0IHRyeSB0byBjb21waWxlIGFzIGEgRExMIGluIHNtYWxsIG9yIG1lZGl1bSBtZW1vcnkgbW9kZWw7IHVzZQotbGFyZ2UgbW9kZWwsIG9yIGV2ZW4gYmV0dGVyLCAzMi1iaXQgZmxhdCBtb2RlbC4gIE1hbnkgcGxhY2VzIGluIHRoZSBJSkcgY29kZQotYXNzdW1lIHRoZSBhZGRyZXNzIG9mIGEgbG9jYWwgdmFyaWFibGUgaXMgYW4gb3JkaW5hcnkgKG5vdCBGQVIpIHBvaW50ZXI7Ci10aGF0IGlzbid0IHRydWUgaW4gYSBtZWRpdW0tbW9kZWwgRExMLgotCi0gIDIuIE1pY3Jvc29mdCBDIGNhbm5vdCBwYXNzIGZpbGUgcG9pbnRlcnMgYmV0d2VlbiBhcHBsaWNhdGlvbnMgYW5kIERMTHMuCi0oU2VlIE1pY3Jvc29mdCBLbm93bGVkZ2UgQmFzZSwgUFNTIElEIE51bWJlciBRNTAzMzYuKSAgU28gamRhdGFzcmMuYyBhbmQKLWpkYXRhZHN0LmMgZG9uJ3Qgd29yayBpZiB5b3Ugb3BlbiBhIGZpbGUgaW4geW91ciBhcHBsaWNhdGlvbiBhbmQgdGhlbiBwYXNzCi10aGUgcG9pbnRlciB0byB0aGUgRExMLiAgT25lIHdvcmthcm91bmQgaXMgdG8gbWFrZSBqZGF0YXNyYy5jL2pkYXRhZHN0LmMKLXBhcnQgb2YgeW91ciBtYWluIGFwcGxpY2F0aW9uIHJhdGhlciB0aGFuIHBhcnQgb2YgdGhlIERMTC4KLQotICAzLiBZb3UnbGwgcHJvYmFibHkgbmVlZCB0byBtb2RpZnkgdGhlIG1hY3JvcyBHTE9CQUwoKSBhbmQgRVhURVJOKCkgdG8KLWF0dGFjaCBzdWl0YWJsZSBsaW5rYWdlIGtleXdvcmRzIHRvIHRoZSBleHBvcnRlZCByb3V0aW5lIG5hbWVzLiAgU2ltaWxhcmx5LAoteW91J2xsIHdhbnQgdG8gbW9kaWZ5IE1FVEhPRERFRigpIGFuZCBKTUVUSE9EKCkgdG8gZW5zdXJlIGZ1bmN0aW9uIHBvaW50ZXJzCi1hcmUgZGVjbGFyZWQgaW4gYSB3YXkgdGhhdCBsZXRzIGFwcGxpY2F0aW9uIHJvdXRpbmVzIGJlIGNhbGxlZCBiYWNrIHRocm91Z2gKLXRoZSBmdW5jdGlvbiBwb2ludGVycy4gIFRoZXNlIG1hY3JvcyBhcmUgaW4gam1vcmVjZmcuaC4gIFR5cGljYWwgZGVmaW5pdGlvbnMKLWZvciBhIDE2LWJpdCBETEwgYXJlOgotCSNkZWZpbmUgR0xPQkFMKHR5cGUpCQl0eXBlIF9mYXIgX3Bhc2NhbCBfbG9hZGRzIF9leHBvcnQKLQkjZGVmaW5lIEVYVEVSTih0eXBlKQkJZXh0ZXJuIHR5cGUgX2ZhciBfcGFzY2FsIF9sb2FkZHMKLQkjZGVmaW5lIE1FVEhPRERFRih0eXBlKQkJc3RhdGljIHR5cGUgX2ZhciBfcGFzY2FsCi0JI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgXAotCQl0eXBlIChfZmFyIF9wYXNjYWwgKm1ldGhvZG5hbWUpIGFyZ2xpc3QKLUZvciBhIDMyLWJpdCBETEwgeW91IG1heSB3YW50IHNvbWV0aGluZyBsaWtlCi0JI2RlZmluZSBHTE9CQUwodHlwZSkJCV9fZGVjbHNwZWMoZGxsZXhwb3J0KSB0eXBlCi0JI2RlZmluZSBFWFRFUk4odHlwZSkJCWV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdHlwZQotQWx0aG91Z2ggbm90IGFsbCB0aGUgR0xPQkFMIHJvdXRpbmVzIGFyZSBhY3R1YWxseSBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkKLXRoZSBhcHBsaWNhdGlvbiwgdGhlIHBlcmZvcm1hbmNlIGNvc3Qgb2YgbWFraW5nIHRoZW0gYWxsIERMTCBlbnRyeSBwb2ludHMgaXMKLW5lZ2xpZ2libGUuCi0KLVRoZSB1bm1vZGlmaWVkIElKRyBsaWJyYXJ5IHByZXNlbnRzIGEgdmVyeSBDLXNwZWNpZmljIGFwcGxpY2F0aW9uIGludGVyZmFjZSwKLXNvIHRoZSByZXN1bHRpbmcgRExMIGlzIG9ubHkgdXNhYmxlIGZyb20gQyBvciBDKysgYXBwbGljYXRpb25zLiAgVGhlcmUgaGFzCi1iZWVuIHNvbWUgdGFsayBvZiB3cml0aW5nIHdyYXBwZXIgY29kZSB0aGF0IHdvdWxkIHByZXNlbnQgYSBzaW1wbGVyIGludGVyZmFjZQotdXNhYmxlIGZyb20gb3RoZXIgbGFuZ3VhZ2VzLCBzdWNoIGFzIFZpc3VhbCBCYXNpYy4gIFRoaXMgaXMgb24gb3VyIHRvLWRvIGxpc3QKLWJ1dCBoYXNuJ3QgYmVlbiB2ZXJ5IGhpZ2ggcHJpb3JpdHkgLS0tIGFueSB2b2x1bnRlZXJzIG91dCB0aGVyZT8KLQotCi1NaWNyb3NvZnQgV2luZG93cywgQm9ybGFuZCBDOgotCi1UaGUgcHJvdmlkZWQgamNvbmZpZy5iY2Mgc2hvdWxkIHdvcmsgT0sgaW4gYSAzMi1iaXQgV2luZG93cyBlbnZpcm9ubWVudCwKLWJ1dCB5b3UnbGwgbmVlZCB0byB0d2VhayBpdCBpbiBhIDE2LWJpdCBlbnZpcm9ubWVudCAoeW91J2QgbmVlZCB0byBkZWZpbmUKLU5FRURfRkFSX1BPSU5URVJTIGFuZCBNQVhfQUxMT0NfQ0hVTkspLiAgQmV3YXJlIHRoYXQgbWFrZWZpbGUuYmNjIHdpbGwgbmVlZAotYWx0ZXJhdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgaXQgZm9yIFdpbmRvd3MgLS0tIGluIHBhcnRpY3VsYXIsIHlvdSBzaG91bGQKLXVzZSBqbWVtbm9icy5jIG5vdCBqbWVtZG9zLmMgdW5kZXIgV2luZG93cy4KLQotQm9ybGFuZCBDKysgNC41IGZhaWxzIHdpdGggYW4gaW50ZXJuYWwgY29tcGlsZXIgZXJyb3Igd2hlbiB0cnlpbmcgdG8gY29tcGlsZQotamRtZXJnZS5jIGluIDMyLWJpdCBtb2RlLiAgSWYgZW5vdWdoIHBlb3BsZSBjb21wbGFpbiwgcGVyaGFwcyBCb3JsYW5kIHdpbGwgZml4Ci1pdC4gIEluIHRoZSBtZWFudGltZSwgdGhlIHNpbXBsZXN0IGtub3duIHdvcmthcm91bmQgaXMgdG8gYWRkIGEgcmVkdW5kYW50Ci1kZWZpbml0aW9uIG9mIHRoZSB2YXJpYWJsZSByYW5nZV9saW1pdCBpbiBoMnYxX21lcmdlZF91cHNhbXBsZSgpLCBhdCB0aGUgaGVhZAotb2YgdGhlIGJsb2NrIHRoYXQgaGFuZGxlcyBvZGQgaW1hZ2Ugd2lkdGggKGFib3V0IGxpbmUgMjY4IGluIHY2IGpkbWVyZ2UuYyk6Ci0gIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCi0gIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgewotICAgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7IC8qIEFERCBUSElTICovCi0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOwotUHJldHR5IGJpemFycmUsIGVzcGVjaWFsbHkgc2luY2UgdGhlIHZlcnkgc2ltaWxhciByb3V0aW5lIGgydjJfbWVyZ2VkX3Vwc2FtcGxlCi1kb2Vzbid0IHRyaWdnZXIgdGhlIGJ1Zy4KLVJlY2VudCByZXBvcnRzIHN1Z2dlc3QgdGhhdCB0aGlzIGJ1ZyBkb2VzIG5vdCBvY2N1ciB3aXRoICJiY2MzMmEiICh0aGUKLVBlbnRpdW0tb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGNvbXBpbGVyKS4KLQotQW5vdGhlciByZXBvcnQgZnJvbSBhIHVzZXIgb2YgQm9ybGFuZCBDIDQuNSB3YXMgdGhhdCBpbmNvcnJlY3QgY29kZSAobGVhZGluZwotdG8gYSBjb2xvciBzaGlmdCBpbiBwcm9jZXNzZWQgaW1hZ2VzKSB3YXMgcHJvZHVjZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcKLW9wdGltaXphdGlvbiBzd2l0Y2ggY29tYmluYXRpb25zIHdlcmUgdXNlZDogCi0JLU90IC1PZwotCS1PdCAtT3AKLQktT3QgLU9tCi1TbyB0cnkgYmFja2luZyBvZmYgb24gb3B0aW1pemF0aW9uIGlmIHlvdSBzZWUgc3VjaCBhIHByb2JsZW0uICAoQXJlIHRoZXJlCi1zZXZlcmFsIGRpZmZlcmVudCByZWxlYXNlcyBhbGwgbnVtYmVyZWQgIjQuNSI/PykKLQotCi1NaWNyb3NvZnQgV2luZG93cywgTWljcm9zb2Z0IFZpc3VhbCBDKys6Ci0KLWpjb25maWcudmMgc2hvdWxkIHdvcmsgT0sgd2l0aCBhbnkgTWljcm9zb2Z0IGNvbXBpbGVyIGZvciBhIDMyLWJpdCBtZW1vcnkKLW1vZGVsLiAgbWFrZWZpbGUudmMgaXMgaW50ZW5kZWQgZm9yIGNvbW1hbmQtbGluZSB1c2UuICAoSWYgeW91IGFyZSB1c2luZwotdGhlIERldmVsb3BlciBTdHVkaW8gZW52aXJvbm1lbnQsIHlvdSBtYXkgcHJlZmVyIHRoZSBEZXZTdHVkaW8gcHJvamVjdAotZmlsZXM7IHNlZSBiZWxvdy4pCi0KLVNvbWUgdXNlcnMgZmVlbCB0aGF0IGl0J3MgZWFzaWVyIHRvIGNhbGwgdGhlIGxpYnJhcnkgZnJvbSBDKysgY29kZSBpZiB5b3UKLWZvcmNlIFZDKysgdG8gdHJlYXQgdGhlIGxpYnJhcnkgYXMgQysrIGNvZGUsIHdoaWNoIHlvdSBjYW4gZG8gYnkgcmVuYW1pbmcKLWFsbCB0aGUgKi5jIGZpbGVzIHRvICouY3BwIChhbmQgYWRqdXN0aW5nIHRoZSBtYWtlZmlsZSB0byBtYXRjaCkuICBUaGlzCi1hdm9pZHMgdGhlIG5lZWQgdG8gcHV0IGV4dGVybiAiQyIgeyAuLi4gfSBhcm91bmQgI2luY2x1ZGUgImpwZWdsaWIuaCIgaW4KLXlvdXIgQysrIGFwcGxpY2F0aW9uLgotCi0KLU1pY3Jvc29mdCBXaW5kb3dzLCBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbzoKLQotV2UgaW5jbHVkZSBtYWtlZmlsZXMgdGhhdCBzaG91bGQgd29yayBhcyBwcm9qZWN0IGZpbGVzIGluIERldlN0dWRpbyA0LjIgb3IKLWxhdGVyLiAgVGhlcmUgaXMgYSBsaWJyYXJ5IG1ha2VmaWxlIHRoYXQgYnVpbGRzIHRoZSBJSkcgbGlicmFyeSBhcyBhIHN0YXRpYwotV2luMzIgbGlicmFyeSwgYW5kIGFuIGFwcGxpY2F0aW9uIG1ha2VmaWxlIHRoYXQgYnVpbGRzIHRoZSBzYW1wbGUgYXBwbGljYXRpb25zCi1hcyBXaW4zMiBjb25zb2xlIGFwcGxpY2F0aW9ucy4gIChFdmVuIGlmIHlvdSBvbmx5IHdhbnQgdGhlIGxpYnJhcnksIHdlCi1yZWNvbW1lbmQgYnVpbGRpbmcgdGhlIGFwcGxpY2F0aW9ucyBzbyB0aGF0IHlvdSBjYW4gcnVuIHRoZSBzZWxmLXRlc3QuKQotCi1UbyB1c2U6Ci0xLiBDb3B5IGpjb25maWcudmMgdG8gamNvbmZpZy5oLCBtYWtlbGliLmRzIHRvIGpwZWcubWFrLCBhbmQKLSAgIG1ha2VhcHBzLmRzIHRvIGFwcHMubWFrLiAgKE5vdGUgdGhhdCB0aGUgcmVuYW1pbmcgaXMgY3JpdGljYWwhKQotMi4gQ2xpY2sgb24gdGhlIC5tYWsgZmlsZXMgdG8gY29uc3RydWN0IHByb2plY3Qgd29ya3NwYWNlcy4KLSAgIChJZiB5b3UgYXJlIHVzaW5nIERldlN0dWRpbyBtb3JlIHJlY2VudCB0aGFuIDQuMiwgeW91J2xsIHByb2JhYmx5Ci0gICBnZXQgYSBtZXNzYWdlIHNheWluZyB0aGF0IHRoZSBtYWtlZmlsZXMgYXJlIGJlaW5nIHVwZGF0ZWQuKQotMy4gQnVpbGQgdGhlIGxpYnJhcnkgcHJvamVjdCwgdGhlbiB0aGUgYXBwbGljYXRpb25zIHByb2plY3QuCi00LiBNb3ZlIHRoZSBhcHBsaWNhdGlvbiAuZXhlIGZpbGVzIGZyb20gYGFwcGBcUmVsZWFzZSB0byBhbgotICAgYXBwcm9wcmlhdGUgbG9jYXRpb24gb24geW91ciBwYXRoLgotNS4gVG8gcGVyZm9ybSB0aGUgc2VsZi10ZXN0LCBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUKLQlOTUFLRSAvZiBtYWtlZmlsZS52YyAgdGVzdAotCi0KLU9TLzIsIEJvcmxhbmQgQysrOgotCi1XYXRjaCBvdXQgZm9yIG9wdGltaXphdGlvbiBidWdzIGluIG9sZGVyIEJvcmxhbmQgY29tcGlsZXJzOyB5b3UgbWF5IG5lZWQKLXRvIGJhY2sgb2ZmIHRoZSBvcHRpbWl6YXRpb24gc3dpdGNoIHNldHRpbmdzLiAgU2VlIHRoZSBjb21tZW50cyBpbgotbWFrZWZpbGUuYmNjLgotCi0KLVNHSToKLQotT24gc29tZSBTR0kgc3lzdGVtcywgeW91IG1heSBuZWVkIHRvIHNldCAiQVIyPSBhciAtdHMiIGluIHRoZSBNYWtlZmlsZS4KLUlmIHlvdSBhcmUgdXNpbmcgY29uZmlndXJlLCB5b3UgY2FuIGRvIHRoaXMgYnkgc2F5aW5nCi0JLi9jb25maWd1cmUgUkFOTElCPSdhciAtdHMnCi1UaGlzIGNoYW5nZSBpcyBub3QgbmVlZGVkIG9uIGFsbCBTR0lzLiAgVXNlIGl0IG9ubHkgaWYgdGhlIG1ha2UgZmFpbHMgYXQgdGhlCi1zdGFnZSBvZiBsaW5raW5nIHRoZSBjb21wbGV0ZWQgcHJvZ3JhbXMuCi0KLU9uIHRoZSBNSVBTIFI0MDAwIGFyY2hpdGVjdHVyZSAoSW5keSwgZXRjLiksIHRoZSBjb21waWxlciBvcHRpb24gIi1taXBzMiIKLXJlcG9ydGVkbHkgc3BlZWRzIHVwIHRoZSBmbG9hdCBEQ1QgbWV0aG9kIHN1YnN0YW50aWFsbHksIGVub3VnaCB0byBtYWtlIGl0Ci1mYXN0ZXIgdGhhbiB0aGUgZGVmYXVsdCBpbnQgbWV0aG9kIChidXQgc3RpbGwgc2xvd2VyIHRoYW4gdGhlIGZhc3QgaW50Ci1tZXRob2QpLiAgSWYgeW91IHVzZSAtbWlwczIsIHlvdSBtYXkgd2FudCB0byBhbHRlciB0aGUgZGVmYXVsdCBEQ1QgbWV0aG9kIHRvCi1iZSBmbG9hdC4gIFRvIGRvIHRoaXMsIHB1dCAiI2RlZmluZSBKRENUX0RFRkFVTFQgSkRDVF9GTE9BVCIgaW4gamNvbmZpZy5oLgotCi0KLVZNUzoKLQotT24gYW4gQWxwaGEvVk1TIHN5c3RlbSB3aXRoIE1NUywgYmUgc3VyZSB0byB1c2UgdGhlICIvTWFyY289QWxwaGE9MSIKLXF1YWxpZmllciB3aXRoIE1NUyB3aGVuIGJ1aWxkaW5nIHRoZSBKUEVHIHBhY2thZ2UuCi0KLVZBWC9WTVMgdjUuNS0xIG1heSBoYXZlIHByb2JsZW1zIHdpdGggdGhlIHRlc3Qgc3RlcCBvZiB0aGUgYnVpbGQgcHJvY2VkdXJlCi1yZXBvcnRpbmcgZGlmZmVyZW5jZXMgd2hlbiBpdCBjb21wYXJlcyB0aGUgb3JpZ2luYWwgYW5kIHRlc3QgaW1hZ2VzLiAgSWYgdGhlCi1lcnJvciBwb2ludHMgdG8gdGhlIGxhc3QgYmxvY2sgb2YgdGhlIGZpbGVzLCBpdCBpcyBtb3N0IGxpa2VseSBib2d1cyBhbmQgbWF5Ci1iZSBzYWZlbHkgaWdub3JlZC4gIEl0IHNlZW1zIHRvIGJlIGJlY2F1c2UgdGhlIGZpbGVzIGFyZSBTdHJlYW1fTEYgYW5kCi1CYWNrdXAvQ29tcGFyZSBoYXMgZGlmZmljdWx0eSB3aXRoIHRoZSAocHJlc3VtYWJseSkgbnVsbCBwYWRkZWQgZmlsZXMuCi1UaGlzIHByb2JsZW0gd2FzIG5vdCBvYnNlcnZlZCBvbiBWQVgvVk1TIHY2LjEgb3IgQVhQL1ZNUyB2Ni4xLgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNhcGltaW4uYyBiL2xpYmpwZWd0d3JwL2pjYXBpbWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZmI4YzUuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNhcGltaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogamNhcGltaW4uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSBjb2RlIGZvciB0aGUgY29tcHJlc3Npb24gaGFsZgotICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgIm1pbmltdW0iIEFQSSByb3V0aW5lcyB0aGF0IG1heSBiZQotICogbmVlZGVkIGluIGVpdGhlciB0aGUgbm9ybWFsIGZ1bGwtY29tcHJlc3Npb24gY2FzZSBvciB0aGUgdHJhbnNjb2Rpbmctb25seQotICogY2FzZS4KLSAqCi0gKiBNb3N0IG9mIHRoZSByb3V0aW5lcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24KLSAqIGFyZSBpbiB0aGlzIGZpbGUgb3IgaW4gamNhcGlzdGQuYy4gIEJ1dCBhbHNvIHNlZSBqY3BhcmFtLmMgZm9yCi0gKiBwYXJhbWV0ZXItc2V0dXAgaGVscGVyIHJvdXRpbmVzLCBqY29tYXBpLmMgZm9yIHJvdXRpbmVzIHNoYXJlZCBieQotICogY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24sIGFuZCBqY3RyYW5zLmMgZm9yIHRoZSB0cmFuc2NvZGluZyBjYXNlLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICogSW5pdGlhbGl6YXRpb24gb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdC4KLSAqIFRoZSBlcnJvciBtYW5hZ2VyIG11c3QgYWxyZWFkeSBiZSBzZXQgdXAgKGluIGNhc2UgbWVtb3J5IG1hbmFnZXIgZmFpbHMpLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19DcmVhdGVDb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2ZXJzaW9uLCBzaXplX3Qgc3RydWN0c2l6ZSkKLXsKLSAgaW50IGk7Ci0KLSAgLyogR3VhcmQgYWdhaW5zdCB2ZXJzaW9uIG1pc21hdGNoZXMgYmV0d2VlbiBsaWJyYXJ5IGFuZCBjYWxsZXIuICovCi0gIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogc28ganBlZ19kZXN0cm95IGtub3dzIG1lbSBtZ3Igbm90IGNhbGxlZCAqLwotICBpZiAodmVyc2lvbiAhPSBKUEVHX0xJQl9WRVJTSU9OKQotICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0JBRF9MSUJfVkVSU0lPTiwgSlBFR19MSUJfVkVSU0lPTiwgdmVyc2lvbik7Ci0gIGlmIChzdHJ1Y3RzaXplICE9IFNJWkVPRihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QpKQotICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0JBRF9TVFJVQ1RfU0laRSwgCi0JICAgICAoaW50KSBTSVpFT0Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSwgKGludCkgc3RydWN0c2l6ZSk7Ci0KLSAgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UgemVybyB0aGUgd2hvbGUgbWFzdGVyIHN0cnVjdHVyZS4KLSAgICogQnV0IHRoZSBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBzZXQgdGhlIGVyciBwb2ludGVyLCBhbmQgbWF5IGhhdmUgc2V0Ci0gICAqIGNsaWVudF9kYXRhLCBzbyB3ZSBoYXZlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhvc2UgZmllbGRzLgotICAgKiBOb3RlOiBpZiBhcHBsaWNhdGlvbiBoYXNuJ3Qgc2V0IGNsaWVudF9kYXRhLCB0b29scyBsaWtlIFB1cmlmeSBtYXkKLSAgICogY29tcGxhaW4gaGVyZS4KLSAgICovCi0gIHsKLSAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOwotICAgIHZvaWQgKiBjbGllbnRfZGF0YSA9IGNpbmZvLT5jbGllbnRfZGF0YTsgLyogaWdub3JlIFB1cmlmeSBjb21wbGFpbnQgaGVyZSAqLwotICAgIE1FTVpFUk8oY2luZm8sIFNJWkVPRihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QpKTsKLSAgICBjaW5mby0+ZXJyID0gZXJyOwotICAgIGNpbmZvLT5jbGllbnRfZGF0YSA9IGNsaWVudF9kYXRhOwotICB9Ci0gIGNpbmZvLT5pc19kZWNvbXByZXNzb3IgPSBGQUxTRTsKLQotICAvKiBJbml0aWFsaXplIGEgbWVtb3J5IG1hbmFnZXIgaW5zdGFuY2UgZm9yIHRoaXMgb2JqZWN0ICovCi0gIGppbml0X21lbW9yeV9tZ3IoKGpfY29tbW9uX3B0cikgY2luZm8pOwotCi0gIC8qIFplcm8gb3V0IHBvaW50ZXJzIHRvIHBlcm1hbmVudCBzdHJ1Y3R1cmVzLiAqLwotICBjaW5mby0+cHJvZ3Jlc3MgPSBOVUxMOwotICBjaW5mby0+ZGVzdCA9IE5VTEw7Ci0KLSAgY2luZm8tPmNvbXBfaW5mbyA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspCi0gICAgY2luZm8tPnF1YW50X3RibF9wdHJzW2ldID0gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gPSBOVUxMOwotICAgIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKLSAgfQotCi0gIGNpbmZvLT5zY3JpcHRfc3BhY2UgPSBOVUxMOwotCi0gIGNpbmZvLT5pbnB1dF9nYW1tYSA9IDEuMDsJLyogaW4gY2FzZSBhcHBsaWNhdGlvbiBmb3JnZXRzICovCi0KLSAgLyogT0ssIEknbSByZWFkeSAqLwotICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gQ1NUQVRFX1NUQVJUOwotfQotCi0KLS8qCi0gKiBEZXN0cnVjdGlvbiBvZiBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0Ci0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2Rlc3Ryb3lfY29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBqcGVnX2Rlc3Ryb3koKGpfY29tbW9uX3B0cikgY2luZm8pOyAvKiB1c2UgY29tbW9uIHJvdXRpbmUgKi8KLX0KLQotCi0vKgotICogQWJvcnQgcHJvY2Vzc2luZyBvZiBhIEpQRUcgY29tcHJlc3Npb24gb3BlcmF0aW9uLAotICogYnV0IGRvbid0IGRlc3Ryb3kgdGhlIG9iamVjdCBpdHNlbGYuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2Fib3J0X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHVzZSBjb21tb24gcm91dGluZSAqLwotfQotCi0KLS8qCi0gKiBGb3JjaWJseSBzdXBwcmVzcyBvciB1bi1zdXBwcmVzcyBhbGwgcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcy4KLSAqIE1hcmtzIGFsbCBjdXJyZW50bHkgZGVmaW5lZCB0YWJsZXMgYXMgYWxyZWFkeSB3cml0dGVuIChpZiBzdXBwcmVzcykKLSAqIG9yIG5vdCB3cml0dGVuIChpZiAhc3VwcHJlc3MpLiAgVGhpcyB3aWxsIGNvbnRyb2wgd2hldGhlciB0aGV5IGdldCBlbWl0dGVkCi0gKiBieSBhIHN1YnNlcXVlbnQganBlZ19zdGFydF9jb21wcmVzcyBjYWxsLgotICoKLSAqIFRoaXMgcm91dGluZSBpcyBleHBvcnRlZCBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgdG8gcHJvZHVjZQotICogYWJicmV2aWF0ZWQgSlBFRyBkYXRhc3RyZWFtcy4gIEl0IGxvZ2ljYWxseSBiZWxvbmdzIGluIGpjcGFyYW0uYywgYnV0Ci0gKiBzaW5jZSBpdCBpcyBjYWxsZWQgYnkganBlZ19zdGFydF9jb21wcmVzcywgd2UgcHV0IGl0IGhlcmUgLS0tIG90aGVyd2lzZQotICogamNwYXJhbS5vIHdvdWxkIGJlIGxpbmtlZCB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiB1c2VkIGl0IG9yIG5vdC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfc3VwcHJlc3NfdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBzdXBwcmVzcykKLXsKLSAgaW50IGk7Ci0gIEpRVUFOVF9UQkwgKiBxdGJsOwotICBKSFVGRl9UQkwgKiBodGJsOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKSB7Ci0gICAgaWYgKChxdGJsID0gY2luZm8tPnF1YW50X3RibF9wdHJzW2ldKSAhPSBOVUxMKQotICAgICAgcXRibC0+c2VudF90YWJsZSA9IHN1cHByZXNzOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgewotICAgIGlmICgoaHRibCA9IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldKSAhPSBOVUxMKQotICAgICAgaHRibC0+c2VudF90YWJsZSA9IHN1cHByZXNzOwotICAgIGlmICgoaHRibCA9IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldKSAhPSBOVUxMKQotICAgICAgaHRibC0+c2VudF90YWJsZSA9IHN1cHByZXNzOwotICB9Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCBKUEVHIGNvbXByZXNzaW9uLgotICoKLSAqIElmIGEgbXVsdGlwYXNzIG9wZXJhdGluZyBtb2RlIHdhcyBzZWxlY3RlZCwgdGhpcyBtYXkgZG8gYSBncmVhdCBkZWFsIG9mCi0gKiB3b3JrIGluY2x1ZGluZyBtb3N0IG9mIHRoZSBhY3R1YWwgb3V0cHV0LgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19maW5pc2hfY29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBKRElNRU5TSU9OIGlNQ1Vfcm93OwotCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IENTVEFURV9TQ0FOTklORyB8fAotICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBDU1RBVEVfUkFXX09LKSB7Ci0gICAgLyogVGVybWluYXRlIGZpcnN0IHBhc3MgKi8KLSAgICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UT09fTElUVExFX0RBVEEpOwotICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfV1JDT0VGUykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICAvKiBQZXJmb3JtIGFueSByZW1haW5pbmcgcGFzc2VzICovCi0gIHdoaWxlICghIGNpbmZvLT5tYXN0ZXItPmlzX2xhc3RfcGFzcykgewotICAgICgqY2luZm8tPm1hc3Rlci0+cHJlcGFyZV9mb3JfcGFzcykgKGNpbmZvKTsKLSAgICBmb3IgKGlNQ1Vfcm93ID0gMDsgaU1DVV9yb3cgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzOyBpTUNVX3JvdysrKSB7Ci0gICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLQljaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IChsb25nKSBpTUNVX3JvdzsKLQljaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKLQkoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIH0KLSAgICAgIC8qIFdlIGJ5cGFzcyB0aGUgbWFpbiBjb250cm9sbGVyIGFuZCBpbnZva2UgY29lZiBjb250cm9sbGVyIGRpcmVjdGx5OwotICAgICAgICogYWxsIHdvcmsgaXMgYmVpbmcgZG9uZSBmcm9tIHRoZSBjb2VmZmljaWVudCBidWZmZXIuCi0gICAgICAgKi8KLSAgICAgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgKEpTQU1QSU1BR0UpIE5VTEwpKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKLSAgICB9Ci0gICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfcGFzcykgKGNpbmZvKTsKLSAgfQotICAvKiBXcml0ZSBFT0ksIGRvIGZpbmFsIGNsZWFudXAgKi8KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9maWxlX3RyYWlsZXIpIChjaW5mbyk7Ci0gICgqY2luZm8tPmRlc3QtPnRlcm1fZGVzdGluYXRpb24pIChjaW5mbyk7Ci0gIC8qIFdlIGNhbiB1c2UganBlZ19hYm9ydCB0byByZWxlYXNlIG1lbW9yeSBhbmQgcmVzZXQgZ2xvYmFsX3N0YXRlICovCi0gIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOwotfQotCi0KLS8qCi0gKiBXcml0ZSBhIHNwZWNpYWwgbWFya2VyLgotICogVGhpcyBpcyBvbmx5IHJlY29tbWVuZGVkIGZvciB3cml0aW5nIENPTSBvciBBUFBuIG1hcmtlcnMuCi0gKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIGJlZm9yZQotICogZmlyc3QgY2FsbCB0byBqcGVnX3dyaXRlX3NjYW5saW5lcygpIG9yIGpwZWdfd3JpdGVfcmF3X2RhdGEoKS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfd3JpdGVfbWFya2VyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwKLQkJICAgY29uc3QgSk9DVEVUICpkYXRhcHRyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKLXsKLSAgSk1FVEhPRCh2b2lkLCB3cml0ZV9tYXJrZXJfYnl0ZSwgKGpfY29tcHJlc3NfcHRyIGluZm8sIGludCB2YWwpKTsKLQotICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgIT0gMCB8fAotICAgICAgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NDQU5OSU5HICYmCi0gICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfUkFXX09LICYmCi0gICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfV1JDT0VGUykpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX21hcmtlcl9oZWFkZXIpIChjaW5mbywgbWFya2VyLCBkYXRhbGVuKTsKLSAgd3JpdGVfbWFya2VyX2J5dGUgPSBjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfYnl0ZTsJLyogY29weSBmb3Igc3BlZWQgKi8KLSAgd2hpbGUgKGRhdGFsZW4tLSkgewotICAgICgqd3JpdGVfbWFya2VyX2J5dGUpIChjaW5mbywgKmRhdGFwdHIpOwotICAgIGRhdGFwdHIrKzsKLSAgfQotfQotCi0vKiBTYW1lLCBidXQgcGllY2VtZWFsLiAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfd3JpdGVfbV9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKLXsKLSAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lICE9IDAgfHwKLSAgICAgIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TQ0FOTklORyAmJgotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSyAmJgotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1dSQ09FRlMpKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfaGVhZGVyKSAoY2luZm8sIG1hcmtlciwgZGF0YWxlbik7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ193cml0ZV9tX2J5dGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKQotewotICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX21hcmtlcl9ieXRlKSAoY2luZm8sIHZhbCk7Ci19Ci0KLQotLyoKLSAqIEFsdGVybmF0ZSBjb21wcmVzc2lvbiBmdW5jdGlvbjoganVzdCB3cml0ZSBhbiBhYmJyZXZpYXRlZCB0YWJsZSBmaWxlLgotICogQmVmb3JlIGNhbGxpbmcgdGhpcywgYWxsIHBhcmFtZXRlcnMgYW5kIGEgZGF0YSBkZXN0aW5hdGlvbiBtdXN0IGJlIHNldCB1cC4KLSAqCi0gKiBUbyBwcm9kdWNlIGEgcGFpciBvZiBmaWxlcyBjb250YWluaW5nIGFiYnJldmlhdGVkIHRhYmxlcyBhbmQgYWJicmV2aWF0ZWQKLSAqIGltYWdlIGRhdGEsIG9uZSB3b3VsZCBwcm9jZWVkIGFzIGZvbGxvd3M6Ci0gKgotICoJCWluaXRpYWxpemUgSlBFRyBvYmplY3QKLSAqCQlzZXQgSlBFRyBwYXJhbWV0ZXJzCi0gKgkJc2V0IGRlc3RpbmF0aW9uIHRvIHRhYmxlIGZpbGUKLSAqCQlqcGVnX3dyaXRlX3RhYmxlcyhjaW5mbyk7Ci0gKgkJc2V0IGRlc3RpbmF0aW9uIHRvIGltYWdlIGZpbGUKLSAqCQlqcGVnX3N0YXJ0X2NvbXByZXNzKGNpbmZvLCBGQUxTRSk7Ci0gKgkJd3JpdGUgZGF0YS4uLgotICoJCWpwZWdfZmluaXNoX2NvbXByZXNzKGNpbmZvKTsKLSAqCi0gKiBqcGVnX3dyaXRlX3RhYmxlcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIG1hcmtpbmcgYWxsIHRhYmxlcyB3cml0dGVuCi0gKiAoc2FtZSBhcyBqcGVnX3N1cHByZXNzX3RhYmxlcyguLi4sIFRSVUUpKS4gIFRodXMgYSBzdWJzZXF1ZW50IHN0YXJ0X2NvbXByZXNzCi0gKiB3aWxsIG5vdCByZS1lbWl0IHRoZSB0YWJsZXMgdW5sZXNzIGl0IGlzIHBhc3NlZCB3cml0ZV9hbGxfdGFibGVzPVRSVUUuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3dyaXRlX3RhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotCi0gIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLwotICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKLSAgLyogSW5pdGlhbGl6ZSB0aGUgbWFya2VyIHdyaXRlciAuLi4gYml0IG9mIGEgY3JvY2sgdG8gZG8gaXQgaGVyZS4gKi8KLSAgamluaXRfbWFya2VyX3dyaXRlcihjaW5mbyk7Ci0gIC8qIFdyaXRlIHRoZW0gdGFibGVzISAqLwotICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX3RhYmxlc19vbmx5KSAoY2luZm8pOwotICAvKiBBbmQgY2xlYW4gdXAuICovCi0gICgqY2luZm8tPmRlc3QtPnRlcm1fZGVzdGluYXRpb24pIChjaW5mbyk7Ci0gIC8qCi0gICAqIEluIGxpYnJhcnkgcmVsZWFzZXMgdXAgdGhyb3VnaCB2NmEsIHdlIGNhbGxlZCBqcGVnX2Fib3J0KCkgaGVyZSB0byBmcmVlCi0gICAqIGFueSB3b3JraW5nIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGRlc3RpbmF0aW9uIG1hbmFnZXIgYW5kIG1hcmtlcgotICAgKiB3cml0ZXIuICBTb21lIGFwcGxpY2F0aW9ucyBoYWQgYSBwcm9ibGVtIHdpdGggdGhhdDogdGhleSBhbGxvY2F0ZWQgc3BhY2UKLSAgICogb2YgdGhlaXIgb3duIGZyb20gdGhlIGxpYnJhcnkgbWVtb3J5IG1hbmFnZXIsIGFuZCBkaWRuJ3Qgd2FudCBpdCB0byBnbwotICAgKiBhd2F5IGR1cmluZyB3cml0ZV90YWJsZXMuICBTbyBub3cgd2UgZG8gbm90aGluZy4gIFRoaXMgd2lsbCBjYXVzZSBhCi0gICAqIG1lbW9yeSBsZWFrIGlmIGFuIGFwcCBjYWxscyB3cml0ZV90YWJsZXMgcmVwZWF0ZWRseSB3aXRob3V0IGRvaW5nIGEgZnVsbAotICAgKiBjb21wcmVzc2lvbiBjeWNsZSBvciBvdGhlcndpc2UgcmVzZXR0aW5nIHRoZSBKUEVHIG9iamVjdC4gIEhvd2V2ZXIsIHRoYXQKLSAgICogc2VlbXMgbGVzcyBiYWQgdGhhbiB1bmV4cGVjdGVkbHkgZnJlZWluZyBtZW1vcnkgaW4gdGhlIG5vcm1hbCBjYXNlLgotICAgKiBBbiBhcHAgdGhhdCBwcmVmZXJzIHRoZSBvbGQgYmVoYXZpb3IgY2FuIGNhbGwganBlZ19hYm9ydCBmb3IgaXRzZWxmIGFmdGVyCi0gICAqIGVhY2ggY2FsbCB0byBqcGVnX3dyaXRlX3RhYmxlcygpLgotICAgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjYXBpc3RkLmMgYi9saWJqcGVndHdycC9qY2FwaXN0ZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDMyMGIxLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjYXBpc3RkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqIGpjYXBpc3RkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGNvbXByZXNzaW9uIGhhbGYKLSAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJzdGFuZGFyZCIgQVBJIHJvdXRpbmVzIHRoYXQgYXJlCi0gKiB1c2VkIGluIHRoZSBub3JtYWwgZnVsbC1jb21wcmVzc2lvbiBjYXNlLiAgVGhleSBhcmUgbm90IHVzZWQgYnkgYQotICogdHJhbnNjb2Rpbmctb25seSBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdCBpZiBhbiBhcHBsaWNhdGlvbiBsaW5rcyBpbgotICoganBlZ19zdGFydF9jb21wcmVzcywgaXQgd2lsbCBlbmQgdXAgbGlua2luZyBpbiB0aGUgZW50aXJlIGNvbXByZXNzb3IuCi0gKiBXZSB0aHVzIG11c3Qgc2VwYXJhdGUgdGhpcyBmaWxlIGZyb20gamNhcGltaW4uYyB0byBhdm9pZCBsaW5raW5nIHRoZQotICogd2hvbGUgY29tcHJlc3Npb24gbGlicmFyeSBpbnRvIGEgdHJhbnNjb2Rlci4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyoKLSAqIENvbXByZXNzaW9uIGluaXRpYWxpemF0aW9uLgotICogQmVmb3JlIGNhbGxpbmcgdGhpcywgYWxsIHBhcmFtZXRlcnMgYW5kIGEgZGF0YSBkZXN0aW5hdGlvbiBtdXN0IGJlIHNldCB1cC4KLSAqCi0gKiBXZSByZXF1aXJlIGEgd3JpdGVfYWxsX3RhYmxlcyBwYXJhbWV0ZXIgYXMgYSBmYWlsc2FmZSBjaGVjayB3aGVuIHdyaXRpbmcKLSAqIG11bHRpcGxlIGRhdGFzdHJlYW1zIGZyb20gdGhlIHNhbWUgY29tcHJlc3Npb24gb2JqZWN0LiAgU2luY2UgcHJpb3IgcnVucwotICogd2lsbCBoYXZlIGxlZnQgYWxsIHRoZSB0YWJsZXMgbWFya2VkIHNlbnRfdGFibGU9VFJVRSwgYSBzdWJzZXF1ZW50IHJ1bgotICogd291bGQgZW1pdCBhbiBhYmJyZXZpYXRlZCBzdHJlYW0gKG5vIHRhYmxlcykgYnkgZGVmYXVsdC4gIFRoaXMgbWF5IGJlIHdoYXQKLSAqIGlzIHdhbnRlZCwgYnV0IGZvciBzYWZldHkncyBzYWtlIGl0IHNob3VsZCBub3QgYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3I6Ci0gKiBwcm9ncmFtbWVycyBzaG91bGQgaGF2ZSB0byBtYWtlIGEgZGVsaWJlcmF0ZSBjaG9pY2UgdG8gZW1pdCBhYmJyZXZpYXRlZAotICogaW1hZ2VzLiAgVGhlcmVmb3JlIHRoZSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcyBzaG91bGQgZW5jb3VyYWdlIHBlb3BsZQotICogdG8gcGFzcyB3cml0ZV9hbGxfdGFibGVzPVRSVUU7IHRoZW4gaXQgd2lsbCB0YWtlIGFjdGl2ZSB0aG91Z2h0IHRvIGRvIHRoZQotICogd3JvbmcgdGhpbmcuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3N0YXJ0X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiB3cml0ZV9hbGxfdGFibGVzKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICBpZiAod3JpdGVfYWxsX3RhYmxlcykKLSAgICBqcGVnX3N1cHByZXNzX3RhYmxlcyhjaW5mbywgRkFMU0UpOwkvKiBtYXJrIGFsbCB0YWJsZXMgdG8gYmUgd3JpdHRlbiAqLwotCi0gIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLwotICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKLSAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCi0gIGppbml0X2NvbXByZXNzX21hc3RlcihjaW5mbyk7Ci0gIC8qIFNldCB1cCBmb3IgdGhlIGZpcnN0IHBhc3MgKi8KLSAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9wYXNzKSAoY2luZm8pOwotICAvKiBSZWFkeSBmb3IgYXBwbGljYXRpb24gdG8gZHJpdmUgZmlyc3QgcGFzcyB0aHJvdWdoIGpwZWdfd3JpdGVfc2NhbmxpbmVzCi0gICAqIG9yIGpwZWdfd3JpdGVfcmF3X2RhdGEuCi0gICAqLwotICBjaW5mby0+bmV4dF9zY2FubGluZSA9IDA7Ci0gIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSAoY2luZm8tPnJhd19kYXRhX2luID8gQ1NUQVRFX1JBV19PSyA6IENTVEFURV9TQ0FOTklORyk7Ci19Ci0KLQotLyoKLSAqIFdyaXRlIHNvbWUgc2NhbmxpbmVzIG9mIGRhdGEgdG8gdGhlIEpQRUcgY29tcHJlc3Nvci4KLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIG51bWJlciBvZiBsaW5lcyBhY3R1YWxseSB3cml0dGVuLgotICogVGhpcyBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSBzdXBwbGllZCBudW1fbGluZXMgb25seSBpbiBjYXNlIHRoYXQKLSAqIHRoZSBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZSBoYXMgcmVxdWVzdGVkIHN1c3BlbnNpb24gb2YgdGhlIGNvbXByZXNzb3IsCi0gKiBvciBpZiBtb3JlIHRoYW4gaW1hZ2VfaGVpZ2h0IHNjYW5saW5lcyBhcmUgcGFzc2VkIGluLgotICoKLSAqIE5vdGU6IHdlIHdhcm4gYWJvdXQgZXhjZXNzIGNhbGxzIHRvIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgc2luY2UKLSAqIHRoaXMgbGlrZWx5IHNpZ25hbHMgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1lciBlcnJvci4gIEhvd2V2ZXIsCi0gKiBleGNlc3Mgc2NhbmxpbmVzIHBhc3NlZCBpbiB0aGUgbGFzdCB2YWxpZCBjYWxsIGFyZSAqc2lsZW50bHkqIGlnbm9yZWQsCi0gKiBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBuZWVkIG5vdCBhZGp1c3QgbnVtX2xpbmVzIGZvciBlbmQtb2YtaW1hZ2UKLSAqIHdoZW4gdXNpbmcgYSBtdWx0aXBsZS1zY2FubGluZSBidWZmZXIuCi0gKi8KLQotR0xPQkFMKEpESU1FTlNJT04pCi1qcGVnX3dyaXRlX3NjYW5saW5lcyAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAotCQkgICAgICBKRElNRU5TSU9OIG51bV9saW5lcykKLXsKLSAgSkRJTUVOU0lPTiByb3dfY3RyLCByb3dzX2xlZnQ7Ci0KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NDQU5OSU5HKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSA+PSBjaW5mby0+aW1hZ2VfaGVpZ2h0KQotICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKLQotICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5uZXh0X3NjYW5saW5lOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OwotICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICB9Ci0KLSAgLyogR2l2ZSBtYXN0ZXIgY29udHJvbCBtb2R1bGUgYW5vdGhlciBjaGFuY2UgaWYgdGhpcyBpcyBmaXJzdCBjYWxsIHRvCi0gICAqIGpwZWdfd3JpdGVfc2NhbmxpbmVzLiAgVGhpcyBsZXRzIG91dHB1dCBvZiB0aGUgZnJhbWUvc2NhbiBoZWFkZXJzIGJlCi0gICAqIGRlbGF5ZWQgc28gdGhhdCBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgQ09NLCBldGMsIG1hcmtlcnMgYmV0d2VlbgotICAgKiBqcGVnX3N0YXJ0X2NvbXByZXNzIGFuZCBqcGVnX3dyaXRlX3NjYW5saW5lcy4KLSAgICovCi0gIGlmIChjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCkKLSAgICAoKmNpbmZvLT5tYXN0ZXItPnBhc3Nfc3RhcnR1cCkgKGNpbmZvKTsKLQotICAvKiBJZ25vcmUgYW55IGV4dHJhIHNjYW5saW5lcyBhdCBib3R0b20gb2YgaW1hZ2UuICovCi0gIHJvd3NfbGVmdCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgLSBjaW5mby0+bmV4dF9zY2FubGluZTsKLSAgaWYgKG51bV9saW5lcyA+IHJvd3NfbGVmdCkKLSAgICBudW1fbGluZXMgPSByb3dzX2xlZnQ7Ci0KLSAgcm93X2N0ciA9IDA7Ci0gICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCBudW1fbGluZXMpOwotICBjaW5mby0+bmV4dF9zY2FubGluZSArPSByb3dfY3RyOwotICByZXR1cm4gcm93X2N0cjsKLX0KLQotCi0vKgotICogQWx0ZXJuYXRlIGVudHJ5IHBvaW50IHRvIHdyaXRlIHJhdyBkYXRhLgotICogUHJvY2Vzc2VzIGV4YWN0bHkgb25lIGlNQ1Ugcm93IHBlciBjYWxsLCB1bmxlc3Mgc3VzcGVuZGVkLgotICovCi0KLUdMT0JBTChKRElNRU5TSU9OKQotanBlZ193cml0ZV9yYXdfZGF0YSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgZGF0YSwKLQkJICAgICBKRElNRU5TSU9OIG51bV9saW5lcykKLXsKLSAgSkRJTUVOU0lPTiBsaW5lc19wZXJfaU1DVV9yb3c7Ci0KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgPj0gY2luZm8tPmltYWdlX2hlaWdodCkgewotICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm5leHRfc2NhbmxpbmU7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gIH0KLQotICAvKiBHaXZlIG1hc3RlciBjb250cm9sIG1vZHVsZSBhbm90aGVyIGNoYW5jZSBpZiB0aGlzIGlzIGZpcnN0IGNhbGwgdG8KLSAgICoganBlZ193cml0ZV9yYXdfZGF0YS4gIFRoaXMgbGV0cyBvdXRwdXQgb2YgdGhlIGZyYW1lL3NjYW4gaGVhZGVycyBiZQotICAgKiBkZWxheWVkIHNvIHRoYXQgYXBwbGljYXRpb24gY2FuIHdyaXRlIENPTSwgZXRjLCBtYXJrZXJzIGJldHdlZW4KLSAgICoganBlZ19zdGFydF9jb21wcmVzcyBhbmQganBlZ193cml0ZV9yYXdfZGF0YS4KLSAgICovCi0gIGlmIChjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCkKLSAgICAoKmNpbmZvLT5tYXN0ZXItPnBhc3Nfc3RhcnR1cCkgKGNpbmZvKTsKLQotICAvKiBWZXJpZnkgdGhhdCBhdCBsZWFzdCBvbmUgaU1DVSByb3cgaGFzIGJlZW4gcGFzc2VkLiAqLwotICBsaW5lc19wZXJfaU1DVV9yb3cgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOwotICBpZiAobnVtX2xpbmVzIDwgbGluZXNfcGVyX2lNQ1Vfcm93KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQlVGRkVSX1NJWkUpOwotCi0gIC8qIERpcmVjdGx5IGNvbXByZXNzIHRoZSByb3cuICovCi0gIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgZGF0YSkpIHsKLSAgICAvKiBJZiBjb21wcmVzc29yIGRpZCBub3QgY29uc3VtZSB0aGUgd2hvbGUgcm93LCBzdXNwZW5kIHByb2Nlc3NpbmcuICovCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBPSywgd2UgcHJvY2Vzc2VkIG9uZSBpTUNVIHJvdy4gKi8KLSAgY2luZm8tPm5leHRfc2NhbmxpbmUgKz0gbGluZXNfcGVyX2lNQ1Vfcm93OwotICByZXR1cm4gbGluZXNfcGVyX2lNQ1Vfcm93OwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNjb2VmY3QuYyBiL2xpYmpwZWd0d3JwL2pjY29lZmN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NjNkZGIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNjb2VmY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKgotICogamNjb2VmY3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlciBmb3IgY29tcHJlc3Npb24uCi0gKiBUaGlzIGNvbnRyb2xsZXIgaXMgdGhlIHRvcCBsZXZlbCBvZiB0aGUgSlBFRyBjb21wcmVzc29yIHByb3Blci4KLSAqIFRoZSBjb2VmZmljaWVudCBidWZmZXIgbGllcyBiZXR3ZWVuIGZvcndhcmQtRENUIGFuZCBlbnRyb3B5IGVuY29kaW5nIHN0ZXBzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBXZSB1c2UgYSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGVuIGRvaW5nIEh1ZmZtYW4gb3B0aW1pemF0aW9uLAotICogYW5kIGFsc28gZm9yIHdyaXRpbmcgbXVsdGlwbGUtc2NhbiBKUEVHIGZpbGVzLiAgSW4gYWxsIGNhc2VzLCB0aGUgRENUCi0gKiBzdGVwIGlzIHJ1biBkdXJpbmcgdGhlIGZpcnN0IHBhc3MsIGFuZCBzdWJzZXF1ZW50IHBhc3NlcyBuZWVkIG9ubHkgcmVhZAotICogdGhlIGJ1ZmZlcmVkIGNvZWZmaWNpZW50cy4KLSAqLwotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotI2RlZmluZSBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAotI2Vsc2UKLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSNkZWZpbmUgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKLSNlbmRpZgotI2VuZGlmCi0KLQotLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBKRElNRU5TSU9OIGlNQ1Vfcm93X251bTsJLyogaU1DVSByb3cgIyB3aXRoaW4gaW1hZ2UgKi8KLSAgSkRJTUVOU0lPTiBtY3VfY3RyOwkJLyogY291bnRzIE1DVXMgcHJvY2Vzc2VkIGluIGN1cnJlbnQgcm93ICovCi0gIGludCBNQ1VfdmVydF9vZmZzZXQ7CQkvKiBjb3VudHMgTUNVIHJvd3Mgd2l0aGluIGlNQ1Ugcm93ICovCi0gIGludCBNQ1Vfcm93c19wZXJfaU1DVV9yb3c7CS8qIG51bWJlciBvZiBzdWNoIHJvd3MgbmVlZGVkICovCi0KLSAgLyogRm9yIHNpbmdsZS1wYXNzIGNvbXByZXNzaW9uLCBpdCdzIHN1ZmZpY2llbnQgdG8gYnVmZmVyIGp1c3Qgb25lIE1DVQotICAgKiAoYWx0aG91Z2ggdGhpcyBtYXkgcHJvdmUgYSBiaXQgc2xvdyBpbiBwcmFjdGljZSkuICBXZSBhbGxvY2F0ZSBhCi0gICAqIHdvcmtzcGFjZSBvZiBDX01BWF9CTE9DS1NfSU5fTUNVIGNvZWZmaWNpZW50IGJsb2NrcywgYW5kIHJldXNlIGl0IGZvciBlYWNoCi0gICAqIE1DVSBjb25zdHJ1Y3RlZCBhbmQgc2VudC4gIChPbiA4MHg4NiwgdGhlIHdvcmtzcGFjZSBpcyBGQVIgZXZlbiB0aG91Z2gKLSAgICogaXQncyBub3QgcmVhbGx5IHZlcnkgYmlnOyB0aGlzIGlzIHRvIGtlZXAgdGhlIG1vZHVsZSBpbnRlcmZhY2VzIHVuY2hhbmdlZAotICAgKiB3aGVuIGEgbGFyZ2UgY29lZmZpY2llbnQgYnVmZmVyIGlzIG5lY2Vzc2FyeS4pCi0gICAqIEluIG11bHRpLXBhc3MgbW9kZXMsIHRoaXMgYXJyYXkgcG9pbnRzIHRvIHRoZSBjdXJyZW50IE1DVSdzIGJsb2NrcwotICAgKiB3aXRoaW4gdGhlIHZpcnR1YWwgYXJyYXlzLgotICAgKi8KLSAgSkJMT0NLUk9XIE1DVV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07Ci0KLSAgLyogSW4gbXVsdGktcGFzcyBtb2Rlcywgd2UgbmVlZCBhIHZpcnR1YWwgYmxvY2sgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LiAqLwotICBqdmlydF9iYXJyYXlfcHRyIHdob2xlX2ltYWdlW01BWF9DT01QT05FTlRTXTsKLX0gbXlfY29lZl9jb250cm9sbGVyOwotCi10eXBlZGVmIG15X2NvZWZfY29udHJvbGxlciAqIG15X2NvZWZfcHRyOwotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYoYm9vbGVhbikgY29tcHJlc3NfZGF0YQotICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKSk7Ci0jaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKLU1FVEhPRERFRihib29sZWFuKSBjb21wcmVzc19maXJzdF9wYXNzCi0gICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKLU1FVEhPRERFRihib29sZWFuKSBjb21wcmVzc19vdXRwdXQKLSAgICBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikpOwotI2VuZGlmCi0KLQotTE9DQUwodm9pZCkKLXN0YXJ0X2lNQ1Vfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIFJlc2V0IHdpdGhpbi1pTUNVLXJvdyBjb3VudGVycyBmb3IgYSBuZXcgcm93ICovCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotCi0gIC8qIEluIGFuIGludGVybGVhdmVkIHNjYW4sIGFuIE1DVSByb3cgaXMgdGhlIHNhbWUgYXMgYW4gaU1DVSByb3cuCi0gICAqIEluIGEgbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYW4gaU1DVSByb3cgaGFzIHZfc2FtcF9mYWN0b3IgTUNVIHJvd3MuCi0gICAqIEJ1dCBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgcHJvY2VzcyBvbmx5IHdoYXQncyBsZWZ0LgotICAgKi8KLSAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID4gMSkgewotICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IChjaW5mby0+dG90YWxfaU1DVV9yb3dzLTEpKQotICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPnZfc2FtcF9mYWN0b3I7Ci0gICAgZWxzZQotICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPmxhc3Rfcm93X2hlaWdodDsKLSAgfQotCi0gIGNvZWYtPm1jdV9jdHIgPSAwOwotICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSAwOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfY29lZiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLQotICBjb2VmLT5pTUNVX3Jvd19udW0gPSAwOwotICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci0KLSAgc3dpdGNoIChwYXNzX21vZGUpIHsKLSAgY2FzZSBKQlVGX1BBU1NfVEhSVToKLSAgICBpZiAoY29lZi0+d2hvbGVfaW1hZ2VbMF0gIT0gTlVMTCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX2RhdGE7Ci0gICAgYnJlYWs7Ci0jaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKLSAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6Ci0gICAgaWYgKGNvZWYtPndob2xlX2ltYWdlWzBdID09IE5VTEwpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgY29lZi0+cHViLmNvbXByZXNzX2RhdGEgPSBjb21wcmVzc19maXJzdF9wYXNzOwotICAgIGJyZWFrOwotICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKLSAgICBpZiAoY29lZi0+d2hvbGVfaW1hZ2VbMF0gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX291dHB1dDsKLSAgICBicmVhazsKLSNlbmRpZgotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2luZ2xlLXBhc3MgY2FzZS4KLSAqIFdlIHByb2Nlc3MgdGhlIGVxdWl2YWxlbnQgb2Ygb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpCi0gKiBwZXIgY2FsbCwgaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIGltYWdlLgotICogUmV0dXJucyBUUlVFIGlmIHRoZSBpTUNVIHJvdyBpcyBjb21wbGV0ZWQsIEZBTFNFIGlmIHN1c3BlbmRlZC4KLSAqCi0gKiBOQjogaW5wdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLAotICogd2hpY2ggd2UgaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBjb21wb25lbnQncyBTT0YgcG9zaXRpb24uCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1jb21wcmVzc19kYXRhIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCi0gIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7Ci0gIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOwotICBpbnQgYmxrbiwgYmksIGNpLCB5aW5kZXgsIHlvZmZzZXQsIGJsb2NrY250OwotICBKRElNRU5TSU9OIHlwb3MsIHhwb3M7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgLyogTG9vcCB0byB3cml0ZSBhcyBtdWNoIGFzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLwotICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7Ci0gICAgICAgeW9mZnNldCsrKSB7Ci0gICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPm1jdV9jdHI7IE1DVV9jb2xfbnVtIDw9IGxhc3RfTUNVX2NvbDsKLQkgTUNVX2NvbF9udW0rKykgewotICAgICAgLyogRGV0ZXJtaW5lIHdoZXJlIGRhdGEgY29tZXMgZnJvbSBpbiBpbnB1dF9idWYgYW5kIGRvIHRoZSBEQ1QgdGhpbmcuCi0gICAgICAgKiBFYWNoIGNhbGwgb24gZm9yd2FyZF9EQ1QgcHJvY2Vzc2VzIGEgaG9yaXpvbnRhbCByb3cgb2YgRENUIGJsb2NrcwotICAgICAgICogYXMgd2lkZSBhcyBhbiBNQ1U7IHdlIHJlbHkgb24gaGF2aW5nIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcwotICAgICAgICogc2VxdWVudGlhbGx5LiAgRHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBvciBib3R0b20gZWRnZSBhcmUgZmlsbGVkIGluCi0gICAgICAgKiBzcGVjaWFsbHkuICBUaGUgZGF0YSBpbiB0aGVtIGRvZXMgbm90IG1hdHRlciBmb3IgaW1hZ2UgcmVjb25zdHJ1Y3Rpb24sCi0gICAgICAgKiBzbyB3ZSBmaWxsIHRoZW0gd2l0aCB2YWx1ZXMgdGhhdCB3aWxsIGVuY29kZSB0byB0aGUgc21hbGxlc3QgYW1vdW50IG9mCi0gICAgICAgKiBkYXRhLCB2aXo6IGFsbCB6ZXJvZXMgaW4gdGhlIEFDIGVudHJpZXMsIERDIGVudHJpZXMgZXF1YWwgdG8gcHJldmlvdXMKLSAgICAgICAqIGJsb2NrJ3MgREMgdmFsdWUuICAoVGhhbmtzIHRvIFRob21hcyBLaW5zbWFuIGZvciB0aGlzIGlkZWEuKQotICAgICAgICovCi0gICAgICBibGtuID0gMDsKLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0JY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLQlibG9ja2NudCA9IChNQ1VfY29sX251bSA8IGxhc3RfTUNVX2NvbCkgPyBjb21wcHRyLT5NQ1Vfd2lkdGgKLQkJCQkJCTogY29tcHB0ci0+bGFzdF9jb2xfd2lkdGg7Ci0JeHBvcyA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aDsKLQl5cG9zID0geW9mZnNldCAqIERDVFNJWkU7IC8qIHlwb3MgPT0gKHlvZmZzZXQreWluZGV4KSAqIERDVFNJWkUgKi8KLQlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7Ci0JICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdyB8fAotCSAgICAgIHlvZmZzZXQreWluZGV4IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7Ci0JICAgICgqY2luZm8tPmZkY3QtPmZvcndhcmRfRENUKSAoY2luZm8sIGNvbXBwdHIsCi0JCQkJCSBpbnB1dF9idWZbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKLQkJCQkJIGNvZWYtPk1DVV9idWZmZXJbYmxrbl0sCi0JCQkJCSB5cG9zLCB4cG9zLCAoSkRJTUVOU0lPTikgYmxvY2tjbnQpOwotCSAgICBpZiAoYmxvY2tjbnQgPCBjb21wcHRyLT5NQ1Vfd2lkdGgpIHsKLQkgICAgICAvKiBDcmVhdGUgc29tZSBkdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGltYWdlLiAqLwotCSAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY29lZi0+TUNVX2J1ZmZlcltibGtuICsgYmxvY2tjbnRdLAotCQkJKGNvbXBwdHItPk1DVV93aWR0aCAtIGJsb2NrY250KSAqIFNJWkVPRihKQkxPQ0spKTsKLQkgICAgICBmb3IgKGJpID0gYmxvY2tjbnQ7IGJpIDwgY29tcHB0ci0+TUNVX3dpZHRoOyBiaSsrKSB7Ci0JCWNvZWYtPk1DVV9idWZmZXJbYmxrbitiaV1bMF1bMF0gPSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rYmktMV1bMF1bMF07Ci0JICAgICAgfQotCSAgICB9Ci0JICB9IGVsc2UgewotCSAgICAvKiBDcmVhdGUgYSByb3cgb2YgZHVtbXkgYmxvY2tzIGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLiAqLwotCSAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbYmxrbl0sCi0JCSAgICAgIGNvbXBwdHItPk1DVV93aWR0aCAqIFNJWkVPRihKQkxPQ0spKTsKLQkgICAgZm9yIChiaSA9IDA7IGJpIDwgY29tcHB0ci0+TUNVX3dpZHRoOyBiaSsrKSB7Ci0JICAgICAgY29lZi0+TUNVX2J1ZmZlcltibGtuK2JpXVswXVswXSA9IGNvZWYtPk1DVV9idWZmZXJbYmxrbi0xXVswXVswXTsKLQkgICAgfQotCSAgfQotCSAgYmxrbiArPSBjb21wcHRyLT5NQ1Vfd2lkdGg7Ci0JICB5cG9zICs9IERDVFNJWkU7Ci0JfQotICAgICAgfQotICAgICAgLyogVHJ5IHRvIHdyaXRlIHRoZSBNQ1UuICBJbiBldmVudCBvZiBhIHN1c3BlbnNpb24gZmFpbHVyZSwgd2Ugd2lsbAotICAgICAgICogcmUtRENUIHRoZSBNQ1Ugb24gcmVzdGFydCAoYSBiaXQgaW5lZmZpY2llbnQsIGNvdWxkIGJlIGZpeGVkLi4uKQotICAgICAgICovCi0gICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5lbmNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7Ci0JLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLwotCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7Ci0JY29lZi0+bWN1X2N0ciA9IE1DVV9jb2xfbnVtOwotCXJldHVybiBGQUxTRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLwotICAgIGNvZWYtPm1jdV9jdHIgPSAwOwotICB9Ci0gIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCi0gIGNvZWYtPmlNQ1Vfcm93X251bSsrOwotICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLSNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIGZpcnN0IHBhc3Mgb2YgYSBtdWx0aS1wYXNzIGNhc2UuCi0gKiBXZSBwcm9jZXNzIHRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KQotICogcGVyIGNhbGwsIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBpbWFnZS4KLSAqIFRoaXMgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyLCBEQ1QnZCBhbmQgcXVhbnRpemVkLAotICogYW5kIHNhdmVkIGludG8gdGhlIHZpcnR1YWwgYXJyYXlzLiAgV2UgYWxzbyBnZW5lcmF0ZSBzdWl0YWJsZSBkdW1teSBibG9ja3MKLSAqIGFzIG5lZWRlZCBhdCB0aGUgcmlnaHQgYW5kIGxvd2VyIGVkZ2VzLiAgKFRoZSBkdW1teSBibG9ja3MgYXJlIGNvbnN0cnVjdGVkCi0gKiBpbiB0aGUgdmlydHVhbCBhcnJheXMsIHdoaWNoIGhhdmUgYmVlbiBwYWRkZWQgYXBwcm9wcmlhdGVseS4pICBUaGlzIG1ha2VzCi0gKiBpdCBwb3NzaWJsZSBmb3Igc3Vic2VxdWVudCBwYXNzZXMgbm90IHRvIHdvcnJ5IGFib3V0IHJlYWwgdnMuIGR1bW15IGJsb2Nrcy4KLSAqCi0gKiBXZSBtdXN0IGFsc28gZW1pdCB0aGUgZGF0YSB0byB0aGUgZW50cm9weSBlbmNvZGVyLiAgVGhpcyBpcyBjb252ZW5pZW50bHkKLSAqIGRvbmUgYnkgY2FsbGluZyBjb21wcmVzc19vdXRwdXQoKSBhZnRlciB3ZSd2ZSBsb2FkZWQgdGhlIGN1cnJlbnQgc3RyaXAKLSAqIG9mIHRoZSB2aXJ0dWFsIGFycmF5cy4KLSAqCi0gKiBOQjogaW5wdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLiAgQWxsCi0gKiBjb21wb25lbnRzIGFyZSBEQ1QnZCBhbmQgbG9hZGVkIGludG8gdGhlIHZpcnR1YWwgYXJyYXlzIGluIHRoaXMgcGFzcy4KLSAqIEhvd2V2ZXIsIGl0IG1heSBiZSB0aGF0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGVtaXR0ZWQgdG8KLSAqIHRoZSBlbnRyb3B5IGVuY29kZXIgZHVyaW5nIHRoaXMgZmlyc3QgcGFzczsgYmUgY2FyZWZ1bCBhYm91dCBsb29raW5nCi0gKiBhdCB0aGUgc2Nhbi1kZXBlbmRlbnQgdmFyaWFibGVzIChNQ1UgZGltZW5zaW9ucywgZXRjKS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWNvbXByZXNzX2ZpcnN0X3Bhc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOwotICBKRElNRU5TSU9OIGJsb2Nrc19hY3Jvc3MsIE1DVXNfYWNyb3NzLCBNQ1VpbmRleDsKLSAgaW50IGJpLCBjaSwgaF9zYW1wX2ZhY3RvciwgYmxvY2tfcm93LCBibG9ja19yb3dzLCBuZHVtbXk7Ci0gIEpDT0VGIGxhc3REQzsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSkJMT0NLQVJSQVkgYnVmZmVyOwotICBKQkxPQ0tST1cgdGhpc2Jsb2Nrcm93LCBsYXN0YmxvY2tyb3c7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXIgZm9yIHRoaXMgY29tcG9uZW50LiAqLwotICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCi0gICAgICAgY29lZi0+aU1DVV9yb3dfbnVtICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLSAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7Ci0gICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCi0gICAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IGxhc3RfaU1DVV9yb3cpCi0gICAgICBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICBlbHNlIHsKLSAgICAgIC8qIE5COiBjYW4ndCB1c2UgbGFzdF9yb3dfaGVpZ2h0IGhlcmUsIHNpbmNlIG1heSBub3QgYmUgc2V0ISAqLwotICAgICAgYmxvY2tfcm93cyA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgICBpZiAoYmxvY2tfcm93cyA9PSAwKSBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICB9Ci0gICAgYmxvY2tzX2Fjcm9zcyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKLSAgICBoX3NhbXBfZmFjdG9yID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgICAvKiBDb3VudCBudW1iZXIgb2YgZHVtbXkgYmxvY2tzIHRvIGJlIGFkZGVkIGF0IHRoZSByaWdodCBtYXJnaW4uICovCi0gICAgbmR1bW15ID0gKGludCkgKGJsb2Nrc19hY3Jvc3MgJSBoX3NhbXBfZmFjdG9yKTsKLSAgICBpZiAobmR1bW15ID4gMCkKLSAgICAgIG5kdW1teSA9IGhfc2FtcF9mYWN0b3IgLSBuZHVtbXk7Ci0gICAgLyogUGVyZm9ybSBEQ1QgZm9yIGFsbCBub24tZHVtbXkgYmxvY2tzIGluIHRoaXMgaU1DVSByb3cuICBFYWNoIGNhbGwKLSAgICAgKiBvbiBmb3J3YXJkX0RDVCBwcm9jZXNzZXMgYSBjb21wbGV0ZSBob3Jpem9udGFsIHJvdyBvZiBEQ1QgYmxvY2tzLgotICAgICAqLwotICAgIGZvciAoYmxvY2tfcm93ID0gMDsgYmxvY2tfcm93IDwgYmxvY2tfcm93czsgYmxvY2tfcm93KyspIHsKLSAgICAgIHRoaXNibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ddOwotICAgICAgKCpjaW5mby0+ZmRjdC0+Zm9yd2FyZF9EQ1QpIChjaW5mbywgY29tcHB0ciwKLQkJCQkgICBpbnB1dF9idWZbY2ldLCB0aGlzYmxvY2tyb3csCi0JCQkJICAgKEpESU1FTlNJT04pIChibG9ja19yb3cgKiBEQ1RTSVpFKSwKLQkJCQkgICAoSkRJTUVOU0lPTikgMCwgYmxvY2tzX2Fjcm9zcyk7Ci0gICAgICBpZiAobmR1bW15ID4gMCkgewotCS8qIENyZWF0ZSBkdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGltYWdlLiAqLwotCXRoaXNibG9ja3JvdyArPSBibG9ja3NfYWNyb3NzOyAvKiA9PiBmaXJzdCBkdW1teSBibG9jayAqLwotCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgdGhpc2Jsb2Nrcm93LCBuZHVtbXkgKiBTSVpFT0YoSkJMT0NLKSk7Ci0JbGFzdERDID0gdGhpc2Jsb2Nrcm93Wy0xXVswXTsKLQlmb3IgKGJpID0gMDsgYmkgPCBuZHVtbXk7IGJpKyspIHsKLQkgIHRoaXNibG9ja3Jvd1tiaV1bMF0gPSBsYXN0REM7Ci0JfQotICAgICAgfQotICAgIH0KLSAgICAvKiBJZiBhdCBlbmQgb2YgaW1hZ2UsIGNyZWF0ZSBkdW1teSBibG9jayByb3dzIGFzIG5lZWRlZC4KLSAgICAgKiBUaGUgdHJpY2t5IHBhcnQgaGVyZSBpcyB0aGF0IHdpdGhpbiBlYWNoIE1DVSwgd2Ugd2FudCB0aGUgREMgdmFsdWVzCi0gICAgICogb2YgdGhlIGR1bW15IGJsb2NrcyB0byBtYXRjaCB0aGUgbGFzdCByZWFsIGJsb2NrJ3MgREMgdmFsdWUuCi0gICAgICogVGhpcyBzcXVlZXplcyBhIGZldyBtb3JlIGJ5dGVzIG91dCBvZiB0aGUgcmVzdWx0aW5nIGZpbGUuLi4KLSAgICAgKi8KLSAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtID09IGxhc3RfaU1DVV9yb3cpIHsKLSAgICAgIGJsb2Nrc19hY3Jvc3MgKz0gbmR1bW15OwkvKiBpbmNsdWRlIGxvd2VyIHJpZ2h0IGNvcm5lciAqLwotICAgICAgTUNVc19hY3Jvc3MgPSBibG9ja3NfYWNyb3NzIC8gaF9zYW1wX2ZhY3RvcjsKLSAgICAgIGZvciAoYmxvY2tfcm93ID0gYmxvY2tfcm93czsgYmxvY2tfcm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLQkgICBibG9ja19yb3crKykgewotCXRoaXNibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ddOwotCWxhc3RibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ctMV07Ci0Janplcm9fZmFyKCh2b2lkIEZBUiAqKSB0aGlzYmxvY2tyb3csCi0JCSAgKHNpemVfdCkgKGJsb2Nrc19hY3Jvc3MgKiBTSVpFT0YoSkJMT0NLKSkpOwotCWZvciAoTUNVaW5kZXggPSAwOyBNQ1VpbmRleCA8IE1DVXNfYWNyb3NzOyBNQ1VpbmRleCsrKSB7Ci0JICBsYXN0REMgPSBsYXN0YmxvY2tyb3dbaF9zYW1wX2ZhY3Rvci0xXVswXTsKLQkgIGZvciAoYmkgPSAwOyBiaSA8IGhfc2FtcF9mYWN0b3I7IGJpKyspIHsKLQkgICAgdGhpc2Jsb2Nrcm93W2JpXVswXSA9IGxhc3REQzsKLQkgIH0KLQkgIHRoaXNibG9ja3JvdyArPSBoX3NhbXBfZmFjdG9yOyAvKiBhZHZhbmNlIHRvIG5leHQgTUNVIGluIHJvdyAqLwotCSAgbGFzdGJsb2Nrcm93ICs9IGhfc2FtcF9mYWN0b3I7Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotICAvKiBOQjogY29tcHJlc3Nfb3V0cHV0IHdpbGwgaW5jcmVtZW50IGlNQ1Vfcm93X251bSBpZiBzdWNjZXNzZnVsLgotICAgKiBBIHN1c3BlbnNpb24gcmV0dXJuIHdpbGwgcmVzdWx0IGluIHJlZG9pbmcgYWxsIHRoZSB3b3JrIGFib3ZlIG5leHQgdGltZS4KLSAgICovCi0KLSAgLyogRW1pdCBkYXRhIHRvIHRoZSBlbnRyb3B5IGVuY29kZXIsIHNoYXJpbmcgY29kZSB3aXRoIHN1YnNlcXVlbnQgcGFzc2VzICovCi0gIHJldHVybiBjb21wcmVzc19vdXRwdXQoY2luZm8sIGlucHV0X2J1Zik7Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHN1YnNlcXVlbnQgcGFzc2VzIG9mIGEgbXVsdGktcGFzcyBjYXNlLgotICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKLSAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KLSAqIFRoZSBkYXRhIGlzIG9idGFpbmVkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzIGFuZCBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIuCi0gKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgotICoKLSAqIE5COiBpbnB1dF9idWYgaXMgaWdub3JlZDsgaXQgaXMgbGlrZWx5IHRvIGJlIGEgTlVMTCBwb2ludGVyLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotY29tcHJlc3Nfb3V0cHV0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCi0gIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQ7Ci0gIEpESU1FTlNJT04gc3RhcnRfY29sOwotICBKQkxPQ0tBUlJBWSBidWZmZXJbTUFYX0NPTVBTX0lOX1NDQU5dOwotICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4KLSAgICogTkI6IGR1cmluZyBmaXJzdCBwYXNzLCB0aGlzIGlzIHNhZmUgb25seSBiZWNhdXNlIHRoZSBidWZmZXJzIHdpbGwKLSAgICogYWxyZWFkeSBiZSBhbGlnbmVkIHByb3Blcmx5LCBzbyBqbWVtbWdyLmMgd29uJ3QgbmVlZCB0byBkbyBhbnkgSS9PLgotICAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKLSAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0gIH0KLQotICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCi0gIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLSAgICAgICB5b2Zmc2V0KyspIHsKLSAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OwotCSBNQ1VfY29sX251bSsrKSB7Ci0gICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLwotICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLQljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOwotCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKLQkgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbY2ldW3lpbmRleCt5b2Zmc2V0XSArIHN0YXJ0X2NvbDsKLQkgIGZvciAoeGluZGV4ID0gMDsgeGluZGV4IDwgY29tcHB0ci0+TUNVX3dpZHRoOyB4aW5kZXgrKykgewotCSAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgLyogVHJ5IHRvIHdyaXRlIHRoZSBNQ1UuICovCi0gICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5lbmNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7Ci0JLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLwotCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7Ci0JY29lZi0+bWN1X2N0ciA9IE1DVV9jb2xfbnVtOwotCXJldHVybiBGQUxTRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLwotICAgIGNvZWYtPm1jdV9jdHIgPSAwOwotICB9Ci0gIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCi0gIGNvZWYtPmlNQ1Vfcm93X251bSsrOwotICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0jZW5kaWYgLyogRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NfY29lZl9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9jb2VmX3B0ciBjb2VmOwotCi0gIGNvZWYgPSAobXlfY29lZl9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICopIGNvZWY7Ci0gIGNvZWYtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19jb2VmOwotCi0gIC8qIENyZWF0ZSB0aGUgY29lZmZpY2llbnQgYnVmZmVyLiAqLwotICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgewotI2lmZGVmIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECi0gICAgLyogQWxsb2NhdGUgYSBmdWxsLWltYWdlIHZpcnR1YWwgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LCAqLwotICAgIC8qIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIHNhbXBfZmFjdG9yIERDVCBibG9ja3MgaW4gZWFjaCBkaXJlY3Rpb24uICovCi0gICAgaW50IGNpOwotICAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIGNvZWYtPndob2xlX2ltYWdlW2NpXSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICB9Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIC8qIFdlIG9ubHkgbmVlZCBhIHNpbmdsZS1NQ1UgYnVmZmVyLiAqLwotICAgIEpCTE9DS1JPVyBidWZmZXI7Ci0gICAgaW50IGk7Ci0KLSAgICBidWZmZXIgPSAoSkJMT0NLUk9XKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIENfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IENfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgewotICAgICAgY29lZi0+TUNVX2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7Ci0gICAgfQotICAgIGNvZWYtPndob2xlX2ltYWdlWzBdID0gTlVMTDsgLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNjb2xvci5jIGIvbGlianBlZ3R3cnAvamNjb2xvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2E3NmMzLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjY29sb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKgotICogamNjb2xvci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgaW5wdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uIHJvdXRpbmVzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotLy8gdGhpcyBlbmFibGVzIHVucm9sbGluZyBudWxsX2NvbnZlcnQncyBsb29wLCBhbmQgcmVhZGluZy93cml0ZSBpbnRzIGZvciBzcGVlZAotI2RlZmluZSBFTkFCTEVfQU5EUk9JRF9OVUxMX0NPTlZFUlQKLQotLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogUHJpdmF0ZSBzdGF0ZSBmb3IgUkdCLT5ZQ0MgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIHJnYl95Y2NfdGFiOwkJLyogPT4gdGFibGUgZm9yIFJHQiB0byBZQ2JDciBjb252ZXJzaW9uICovCi19IG15X2NvbG9yX2NvbnZlcnRlcjsKLQotdHlwZWRlZiBteV9jb2xvcl9jb252ZXJ0ZXIgKiBteV9jY29udmVydF9wdHI7Ci0KLQotLyoqKioqKioqKioqKioqKiogUkdCIC0+IFlDYkNyIGNvbnZlcnNpb246IG1vc3QgY29tbW9uIGNhc2UgKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBZQ2JDciBpcyBkZWZpbmVkIHBlciBDQ0lSIDYwMS0xLCBleGNlcHQgdGhhdCBDYiBhbmQgQ3IgYXJlCi0gKiBub3JtYWxpemVkIHRvIHRoZSByYW5nZSAwLi5NQVhKU0FNUExFIHJhdGhlciB0aGFuIC0wLjUgLi4gMC41LgotICogVGhlIGNvbnZlcnNpb24gZXF1YXRpb25zIHRvIGJlIGltcGxlbWVudGVkIGFyZSB0aGVyZWZvcmUKLSAqCVkgID0gIDAuMjk5MDAgKiBSICsgMC41ODcwMCAqIEcgKyAwLjExNDAwICogQgotICoJQ2IgPSAtMC4xNjg3NCAqIFIgLSAwLjMzMTI2ICogRyArIDAuNTAwMDAgKiBCICArIENFTlRFUkpTQU1QTEUKLSAqCUNyID0gIDAuNTAwMDAgKiBSIC0gMC40MTg2OSAqIEcgLSAwLjA4MTMxICogQiAgKyBDRU5URVJKU0FNUExFCi0gKiAoVGhlc2UgbnVtYmVycyBhcmUgZGVyaXZlZCBmcm9tIFRJRkYgNi4wIHNlY3Rpb24gMjEsIGRhdGVkIDMtSnVuZS05Mi4pCi0gKiBOb3RlOiBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgSUpHIGNvZGUgdXNlZCBhIHplcm8gb2Zmc2V0IG9mIE1BWEpTQU1QTEUvMiwKLSAqIHJhdGhlciB0aGFuIENFTlRFUkpTQU1QTEUsIGZvciBDYiBhbmQgQ3IuICBUaGlzIGdhdmUgZXF1YWwgcG9zaXRpdmUgYW5kCi0gKiBuZWdhdGl2ZSBzd2luZ3MgZm9yIENiL0NyLCBidXQgbWVhbnQgdGhhdCBncmF5c2NhbGUgdmFsdWVzIChDYj1Dcj0wKQotICogd2VyZSBub3QgcmVwcmVzZW50ZWQgZXhhY3RseS4gIE5vdyB3ZSBzYWNyaWZpY2UgZXhhY3QgcmVwcmVzZW50YXRpb24gb2YKLSAqIG1heGltdW0gcmVkIGFuZCBtYXhpbXVtIGJsdWUgaW4gb3JkZXIgdG8gZ2V0IGV4YWN0IGdyYXlzY2FsZXMuCi0gKgotICogVG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYywgd2UgcmVwcmVzZW50IHRoZSBmcmFjdGlvbmFsIGNvbnN0YW50cwotICogYXMgaW50ZWdlcnMgc2NhbGVkIHVwIGJ5IDJeMTYgKGFib3V0IDQgZGlnaXRzIHByZWNpc2lvbik7IHdlIGhhdmUgdG8gZGl2aWRlCi0gKiB0aGUgcHJvZHVjdHMgYnkgMl4xNiwgd2l0aCBhcHByb3ByaWF0ZSByb3VuZGluZywgdG8gZ2V0IHRoZSBjb3JyZWN0IGFuc3dlci4KLSAqCi0gKiBGb3IgZXZlbiBtb3JlIHNwZWVkLCB3ZSBhdm9pZCBkb2luZyBhbnkgbXVsdGlwbGljYXRpb25zIGluIHRoZSBpbm5lciBsb29wCi0gKiBieSBwcmVjYWxjdWxhdGluZyB0aGUgY29uc3RhbnRzIHRpbWVzIFIsRyxCIGZvciBhbGwgcG9zc2libGUgdmFsdWVzLgotICogRm9yIDgtYml0IEpTQU1QTEVzIHRoaXMgaXMgdmVyeSByZWFzb25hYmxlIChvbmx5IDI1NiBlbnRyaWVzIHBlciB0YWJsZSk7Ci0gKiBmb3IgMTItYml0IHNhbXBsZXMgaXQgaXMgc3RpbGwgYWNjZXB0YWJsZS4gIEl0J3Mgbm90IHZlcnkgcmVhc29uYWJsZSBmb3IKLSAqIDE2LWJpdCBzYW1wbGVzLCBidXQgaWYgeW91IHdhbnQgbG9zc2xlc3Mgc3RvcmFnZSB5b3Ugc2hvdWxkbid0IGJlIGNoYW5naW5nCi0gKiBjb2xvcnNwYWNlIGFueXdheS4KLSAqIFRoZSBDRU5URVJKU0FNUExFIG9mZnNldHMgYW5kIHRoZSByb3VuZGluZyBmdWRnZS1mYWN0b3Igb2YgMC41IGFyZSBpbmNsdWRlZAotICogaW4gdGhlIHRhYmxlcyB0byBzYXZlIGFkZGluZyB0aGVtIHNlcGFyYXRlbHkgaW4gdGhlIGlubmVyIGxvb3AuCi0gKi8KLQotI2RlZmluZSBTQ0FMRUJJVFMJMTYJLyogc3BlZWRpZXN0IHJpZ2h0LXNoaWZ0IG9uIHNvbWUgbWFjaGluZXMgKi8KLSNkZWZpbmUgQ0JDUl9PRkZTRVQJKChJTlQzMikgQ0VOVEVSSlNBTVBMRSA8PCBTQ0FMRUJJVFMpCi0jZGVmaW5lIE9ORV9IQUxGCSgoSU5UMzIpIDEgPDwgKFNDQUxFQklUUy0xKSkKLSNkZWZpbmUgRklYKHgpCQkoKElOVDMyKSAoKHgpICogKDFMPDxTQ0FMRUJJVFMpICsgMC41KSkKLQotLyogV2UgYWxsb2NhdGUgb25lIGJpZyB0YWJsZSBhbmQgZGl2aWRlIGl0IHVwIGludG8gZWlnaHQgcGFydHMsIGluc3RlYWQgb2YKLSAqIGRvaW5nIGVpZ2h0IGFsbG9jX3NtYWxsIHJlcXVlc3RzLiAgVGhpcyBsZXRzIHVzIHVzZSBhIHNpbmdsZSB0YWJsZSBiYXNlCi0gKiBhZGRyZXNzLCB3aGljaCBjYW4gYmUgaGVsZCBpbiBhIHJlZ2lzdGVyIGluIHRoZSBpbm5lciBsb29wcyBvbiBtYW55Ci0gKiBtYWNoaW5lcyAobW9yZSB0aGFuIGNhbiBob2xkIGFsbCBlaWdodCBhZGRyZXNzZXMsIGFueXdheSkuCi0gKi8KLQotI2RlZmluZSBSX1lfT0ZGCQkwCQkJLyogb2Zmc2V0IHRvIFIgPT4gWSBzZWN0aW9uICovCi0jZGVmaW5lIEdfWV9PRkYJCSgxKihNQVhKU0FNUExFKzEpKQkvKiBvZmZzZXQgdG8gRyA9PiBZIHNlY3Rpb24gKi8KLSNkZWZpbmUgQl9ZX09GRgkJKDIqKE1BWEpTQU1QTEUrMSkpCS8qIGV0Yy4gKi8KLSNkZWZpbmUgUl9DQl9PRkYJKDMqKE1BWEpTQU1QTEUrMSkpCi0jZGVmaW5lIEdfQ0JfT0ZGCSg0KihNQVhKU0FNUExFKzEpKQotI2RlZmluZSBCX0NCX09GRgkoNSooTUFYSlNBTVBMRSsxKSkKLSNkZWZpbmUgUl9DUl9PRkYJQl9DQl9PRkYJCS8qIEI9PkNiLCBSPT5DciBhcmUgdGhlIHNhbWUgKi8KLSNkZWZpbmUgR19DUl9PRkYJKDYqKE1BWEpTQU1QTEUrMSkpCi0jZGVmaW5lIEJfQ1JfT0ZGCSg3KihNQVhKU0FNUExFKzEpKQotI2RlZmluZSBUQUJMRV9TSVpFCSg4KihNQVhKU0FNUExFKzEpKQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBSR0ItPllDQyBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1yZ2JfeWNjX3N0YXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICBJTlQzMiAqIHJnYl95Y2NfdGFiOwotICBJTlQzMiBpOwotCi0gIC8qIEFsbG9jYXRlIGFuZCBmaWxsIGluIHRoZSBjb252ZXJzaW9uIHRhYmxlcy4gKi8KLSAgY2NvbnZlcnQtPnJnYl95Y2NfdGFiID0gcmdiX3ljY190YWIgPSAoSU5UMzIgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCShUQUJMRV9TSVpFICogU0laRU9GKElOVDMyKSkpOwotCi0gIGZvciAoaSA9IDA7IGkgPD0gTUFYSlNBTVBMRTsgaSsrKSB7Ci0gICAgcmdiX3ljY190YWJbaStSX1lfT0ZGXSA9IEZJWCgwLjI5OTAwKSAqIGk7Ci0gICAgcmdiX3ljY190YWJbaStHX1lfT0ZGXSA9IEZJWCgwLjU4NzAwKSAqIGk7Ci0gICAgcmdiX3ljY190YWJbaStCX1lfT0ZGXSA9IEZJWCgwLjExNDAwKSAqIGkgICAgICsgT05FX0hBTEY7Ci0gICAgcmdiX3ljY190YWJbaStSX0NCX09GRl0gPSAoLUZJWCgwLjE2ODc0KSkgKiBpOwotICAgIHJnYl95Y2NfdGFiW2krR19DQl9PRkZdID0gKC1GSVgoMC4zMzEyNikpICogaTsKLSAgICAvKiBXZSB1c2UgYSByb3VuZGluZyBmdWRnZS1mYWN0b3Igb2YgMC41LWVwc2lsb24gZm9yIENiIGFuZCBDci4KLSAgICAgKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbWF4aW11bSBvdXRwdXQgd2lsbCByb3VuZCB0byBNQVhKU0FNUExFCi0gICAgICogbm90IE1BWEpTQU1QTEUrMSwgYW5kIHRodXMgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJhbmdlLWxpbWl0LgotICAgICAqLwotICAgIHJnYl95Y2NfdGFiW2krQl9DQl9PRkZdID0gRklYKDAuNTAwMDApICogaSAgICArIENCQ1JfT0ZGU0VUICsgT05FX0hBTEYtMTsKLS8qICBCPT5DYiBhbmQgUj0+Q3IgdGFibGVzIGFyZSB0aGUgc2FtZQotICAgIHJnYl95Y2NfdGFiW2krUl9DUl9PRkZdID0gRklYKDAuNTAwMDApICogaSAgICArIENCQ1JfT0ZGU0VUICsgT05FX0hBTEYtMTsKLSovCi0gICAgcmdiX3ljY190YWJbaStHX0NSX09GRl0gPSAoLUZJWCgwLjQxODY5KSkgKiBpOwotICAgIHJnYl95Y2NfdGFiW2krQl9DUl9PRkZdID0gKC1GSVgoMC4wODEzMSkpICogaTsKLSAgfQotfQotCi0KLS8qCi0gKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCi0gKgotICogTm90ZSB0aGF0IHdlIGNoYW5nZSBmcm9tIHRoZSBhcHBsaWNhdGlvbidzIGludGVybGVhdmVkLXBpeGVsIGZvcm1hdAotICogdG8gb3VyIGludGVybmFsIG5vbmludGVybGVhdmVkLCBvbmUtcGxhbmUtcGVyLWNvbXBvbmVudCBmb3JtYXQuCi0gKiBUaGUgaW5wdXQgYnVmZmVyIGlzIHRoZXJlZm9yZSB0aHJlZSB0aW1lcyBhcyB3aWRlIGFzIHRoZSBvdXRwdXQgYnVmZmVyLgotICoKLSAqIEEgc3RhcnRpbmcgcm93IG9mZnNldCBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4gIFRoZSBjYWxsZXIKLSAqIGNhbiBlYXNpbHkgYWRqdXN0IHRoZSBwYXNzZWQgaW5wdXRfYnVmIHZhbHVlIHRvIGFjY29tbW9kYXRlIGFueSByb3cKLSAqIG9mZnNldCByZXF1aXJlZCBvbiB0aGF0IHNpZGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1yZ2JfeWNjX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkJIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIHJlZ2lzdGVyIGludCByLCBnLCBiOwotICByZWdpc3RlciBJTlQzMiAqIGN0YWIgPSBjY29udmVydC0+cmdiX3ljY190YWI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxLCBvdXRwdHIyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgaW5wdHIgPSAqaW5wdXRfYnVmKys7Ci0gICAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHRyMiA9IG91dHB1dF9idWZbMl1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHV0X3JvdysrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICByID0gR0VUSlNBTVBMRShpbnB0cltSR0JfUkVEXSk7Ci0gICAgICBnID0gR0VUSlNBTVBMRShpbnB0cltSR0JfR1JFRU5dKTsKLSAgICAgIGIgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9CTFVFXSk7Ci0gICAgICBpbnB0ciArPSBSR0JfUElYRUxTSVpFOwotICAgICAgLyogSWYgdGhlIGlucHV0cyBhcmUgMC4uTUFYSlNBTVBMRSwgdGhlIG91dHB1dHMgb2YgdGhlc2UgZXF1YXRpb25zCi0gICAgICAgKiBtdXN0IGJlIHRvbzsgd2UgZG8gbm90IG5lZWQgYW4gZXhwbGljaXQgcmFuZ2UtbGltaXRpbmcgb3BlcmF0aW9uLgotICAgICAgICogSGVuY2UgdGhlIHZhbHVlIGJlaW5nIHNoaWZ0ZWQgaXMgbmV2ZXIgbmVnYXRpdmUsIGFuZCB3ZSBkb24ndAotICAgICAgICogbmVlZCB0aGUgZ2VuZXJhbCBSSUdIVF9TSElGVCBtYWNyby4KLSAgICAgICAqLwotICAgICAgLyogWSAqLwotICAgICAgb3V0cHRyMFtjb2xdID0gKEpTQU1QTEUpCi0JCSgoY3RhYltyK1JfWV9PRkZdICsgY3RhYltnK0dfWV9PRkZdICsgY3RhYltiK0JfWV9PRkZdKQotCQkgPj4gU0NBTEVCSVRTKTsKLSAgICAgIC8qIENiICovCi0gICAgICBvdXRwdHIxW2NvbF0gPSAoSlNBTVBMRSkKLQkJKChjdGFiW3IrUl9DQl9PRkZdICsgY3RhYltnK0dfQ0JfT0ZGXSArIGN0YWJbYitCX0NCX09GRl0pCi0JCSA+PiBTQ0FMRUJJVFMpOwotICAgICAgLyogQ3IgKi8KLSAgICAgIG91dHB0cjJbY29sXSA9IChKU0FNUExFKQotCQkoKGN0YWJbcitSX0NSX09GRl0gKyBjdGFiW2crR19DUl9PRkZdICsgY3RhYltiK0JfQ1JfT0ZGXSkKLQkJID4+IFNDQUxFQklUUyk7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKiogQ2FzZXMgb3RoZXIgdGhhbiBSR0IgLT4gWUNiQ3IgKioqKioqKioqKioqKiovCi0KLQotLyoKLSAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIFJHQi0+Z3JheXNjYWxlIGNvbnZlcnNpb24sIHdoaWNoIGlzIHRoZSBzYW1lCi0gKiBhcyB0aGUgUkdCLT5ZIHBvcnRpb24gb2YgUkdCLT5ZQ2JDci4KLSAqIFdlIGFzc3VtZSByZ2JfeWNjX3N0YXJ0IGhhcyBiZWVuIGNhbGxlZCAod2Ugb25seSB1c2UgdGhlIFkgdGFibGVzKS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJnYl9ncmF5X2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCSAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKLSAgcmVnaXN0ZXIgaW50IHIsIGcsIGI7Ci0gIHJlZ2lzdGVyIElOVDMyICogY3RhYiA9IGNjb252ZXJ0LT5yZ2JfeWNjX3RhYjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyID0gKmlucHV0X2J1ZisrOwotICAgIG91dHB0ciA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHV0X3JvdysrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICByID0gR0VUSlNBTVBMRShpbnB0cltSR0JfUkVEXSk7Ci0gICAgICBnID0gR0VUSlNBTVBMRShpbnB0cltSR0JfR1JFRU5dKTsKLSAgICAgIGIgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9CTFVFXSk7Ci0gICAgICBpbnB0ciArPSBSR0JfUElYRUxTSVpFOwotICAgICAgLyogWSAqLwotICAgICAgb3V0cHRyW2NvbF0gPSAoSlNBTVBMRSkKLQkJKChjdGFiW3IrUl9ZX09GRl0gKyBjdGFiW2crR19ZX09GRl0gKyBjdGFiW2IrQl9ZX09GRl0pCi0JCSA+PiBTQ0FMRUJJVFMpOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCi0gKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBBZG9iZS1zdHlsZSBDTVlLLT5ZQ0NLIGNvbnZlcnNpb24sCi0gKiB3aGVyZSB3ZSBjb252ZXJ0IFI9MS1DLCBHPTEtTSwgYW5kIEI9MS1ZIHRvIFlDYkNyIHVzaW5nIHRoZSBzYW1lCi0gKiBjb252ZXJzaW9uIGFzIGFib3ZlLCB3aGlsZSBwYXNzaW5nIEsgKGJsYWNrKSB1bmNoYW5nZWQuCi0gKiBXZSBhc3N1bWUgcmdiX3ljY19zdGFydCBoYXMgYmVlbiBjYWxsZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1jbXlrX3ljY2tfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCSAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCSAgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIHJlZ2lzdGVyIGludCByLCBnLCBiOwotICByZWdpc3RlciBJTlQzMiAqIGN0YWIgPSBjY29udmVydC0+cmdiX3ljY190YWI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxLCBvdXRwdHIyLCBvdXRwdHIzOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgaW5wdHIgPSAqaW5wdXRfYnVmKys7Ci0gICAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHRyMiA9IG91dHB1dF9idWZbMl1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHRyMyA9IG91dHB1dF9idWZbM11bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHV0X3JvdysrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICByID0gTUFYSlNBTVBMRSAtIEdFVEpTQU1QTEUoaW5wdHJbMF0pOwotICAgICAgZyA9IE1BWEpTQU1QTEUgLSBHRVRKU0FNUExFKGlucHRyWzFdKTsKLSAgICAgIGIgPSBNQVhKU0FNUExFIC0gR0VUSlNBTVBMRShpbnB0clsyXSk7Ci0gICAgICAvKiBLIHBhc3NlcyB0aHJvdWdoIGFzLWlzICovCi0gICAgICBvdXRwdHIzW2NvbF0gPSBpbnB0clszXTsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFIGhlcmUgKi8KLSAgICAgIGlucHRyICs9IDQ7Ci0gICAgICAvKiBJZiB0aGUgaW5wdXRzIGFyZSAwLi5NQVhKU0FNUExFLCB0aGUgb3V0cHV0cyBvZiB0aGVzZSBlcXVhdGlvbnMKLSAgICAgICAqIG11c3QgYmUgdG9vOyB3ZSBkbyBub3QgbmVlZCBhbiBleHBsaWNpdCByYW5nZS1saW1pdGluZyBvcGVyYXRpb24uCi0gICAgICAgKiBIZW5jZSB0aGUgdmFsdWUgYmVpbmcgc2hpZnRlZCBpcyBuZXZlciBuZWdhdGl2ZSwgYW5kIHdlIGRvbid0Ci0gICAgICAgKiBuZWVkIHRoZSBnZW5lcmFsIFJJR0hUX1NISUZUIG1hY3JvLgotICAgICAgICovCi0gICAgICAvKiBZICovCi0gICAgICBvdXRwdHIwW2NvbF0gPSAoSlNBTVBMRSkKLQkJKChjdGFiW3IrUl9ZX09GRl0gKyBjdGFiW2crR19ZX09GRl0gKyBjdGFiW2IrQl9ZX09GRl0pCi0JCSA+PiBTQ0FMRUJJVFMpOwotICAgICAgLyogQ2IgKi8KLSAgICAgIG91dHB0cjFbY29sXSA9IChKU0FNUExFKQotCQkoKGN0YWJbcitSX0NCX09GRl0gKyBjdGFiW2crR19DQl9PRkZdICsgY3RhYltiK0JfQ0JfT0ZGXSkKLQkJID4+IFNDQUxFQklUUyk7Ci0gICAgICAvKiBDciAqLwotICAgICAgb3V0cHRyMltjb2xdID0gKEpTQU1QTEUpCi0JCSgoY3RhYltyK1JfQ1JfT0ZGXSArIGN0YWJbZytHX0NSX09GRl0gKyBjdGFiW2IrQl9DUl9PRkZdKQotCQkgPj4gU0NBTEVCSVRTKTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgZ3JheXNjYWxlIG91dHB1dCB3aXRoIG5vIGNvbnZlcnNpb24uCi0gKiBUaGUgc291cmNlIGNhbiBiZSBlaXRoZXIgcGxhaW4gZ3JheXNjYWxlIG9yIFlDYkNyIChzaW5jZSBZID09IGdyYXkpLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZ3JheXNjYWxlX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAotCQkgICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKLXsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7Ci0gIGludCBpbnN0cmlkZSA9IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzOwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOwotICAgIG91dHB1dF9yb3crKzsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgewotICAgICAgb3V0cHRyW2NvbF0gPSBpbnB0clswXTsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgaW5wdHIgKz0gaW5zdHJpZGU7Ci0gICAgfQotICB9Ci19Ci0KLSNpZmRlZiBFTkFCTEVfQU5EUk9JRF9OVUxMX0NPTlZFUlQKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVJTlQzMjsKLQotI2RlZmluZSBCMChuKSAgICgobikgJiAweEZGKQotI2RlZmluZSBCMShuKSAgICgoKG4pID4+IDgpICYgMHhGRikKLSNkZWZpbmUgQjIobikgICAoKChuKSA+PiAxNikgJiAweEZGKQotI2RlZmluZSBCMyhuKSAgICgobikgPj4gMjQpCi0KLSNkZWZpbmUgUEFDSyhhLCBiLCBjLCBkKSAgICAoKGEpIHwgKChiKSA8PCA4KSB8ICgoYykgPDwgMTYpIHwgKChkKSA8PCAyNCkpCi0KLXN0YXRpYyBpbnQgcHRyX2lzX3F1YWQoY29uc3Qgdm9pZCogcCkKLXsKLSAgICByZXR1cm4gKCgoY29uc3QgY2hhciopcCAtIChjb25zdCBjaGFyKikwKSAmIDMpID09IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlxdWFkcyhjb25zdCBVSU5UMzIgaW5bXSwgVUlOVDMyIG91dDBbXSwgVUlOVDMyIG91dDFbXSwgVUlOVDMyIG91dDJbXSwgaW50IGNvbDQpCi17Ci0gICAgZG8gewotICAgICAgICBVSU5UMzIgc3JjMCA9ICppbisrOwotICAgICAgICBVSU5UMzIgc3JjMSA9ICppbisrOwotICAgICAgICBVSU5UMzIgc3JjMiA9ICppbisrOwotICAgICAgICAvLyBMRW5kaWFuCi0gICAgICAgICpvdXQwKysgPSBQQUNLKEIwKHNyYzApLCBCMyhzcmMwKSwgQjIoc3JjMSksIEIxKHNyYzIpKTsKLSAgICAgICAgKm91dDErKyA9IFBBQ0soQjEoc3JjMCksIEIwKHNyYzEpLCBCMyhzcmMxKSwgQjIoc3JjMikpOwotICAgICAgICAqb3V0MisrID0gUEFDSyhCMihzcmMwKSwgQjEoc3JjMSksIEIwKHNyYzIpLCBCMyhzcmMyKSk7Ci0gICAgfSB3aGlsZSAoLS1jb2w0ICE9IDApOwotfQotCi0jZW5kaWYKLQotLyoKLSAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIG11bHRpLWNvbXBvbmVudCBjb2xvcnNwYWNlcyB3aXRob3V0IGNvbnZlcnNpb24uCi0gKiBXZSBhc3N1bWUgaW5wdXRfY29tcG9uZW50cyA9PSBudW1fY29tcG9uZW50cy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW51bGxfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JICAgICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkgICAgICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKLXsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIHJlZ2lzdGVyIGludCBjaTsKLSAgaW50IG5jID0gY2luZm8tPm51bV9jb21wb25lbnRzOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOwotCi0jaWZkZWYgRU5BQkxFX0FORFJPSURfTlVMTF9DT05WRVJUCi0gICAgaWYgKDEgPT0gbnVtX3Jvd3MgJiYgMyA9PSBuYyAmJiBudW1fY29scyA+IDApIHsKLSAgICAgICAgSlNBTVBST1cgaW5wdHIgPSAqaW5wdXRfYnVmOwotICAgICAgICBKU0FNUFJPVyBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKLSAgICAgICAgSlNBTVBST1cgb3V0cHRyMSA9IG91dHB1dF9idWZbMV1bb3V0cHV0X3Jvd107Ci0gICAgICAgIEpTQU1QUk9XIG91dHB0cjIgPSBvdXRwdXRfYnVmWzJdW291dHB1dF9yb3ddOwotICAgICAgICAKLSAgICAgICAgaW50IGNvbCA9IG51bV9jb2xzOwotICAgICAgICBpbnQgY29sNCA9IGNvbCA+PiAyOwotICAgICAgICBpZiAoY29sNCA+IDAgJiYgcHRyX2lzX3F1YWQoaW5wdHIpICYmIHB0cl9pc19xdWFkKG91dHB0cjApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBwdHJfaXNfcXVhZChvdXRwdHIxKSAmJiBwdHJfaXNfcXVhZChvdXRwdHIyKSkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb25zdCBVSU5UMzIqIGluID0gKGNvbnN0IFVJTlQzMiopaW5wdHI7Ci0gICAgICAgICAgICBVSU5UMzIqIG91dDAgPSAoVUlOVDMyKilvdXRwdHIwOwotICAgICAgICAgICAgVUlOVDMyKiBvdXQxID0gKFVJTlQzMiopb3V0cHRyMTsKLSAgICAgICAgICAgIFVJTlQzMiogb3V0MiA9IChVSU5UMzIqKW91dHB0cjI7Ci0gICAgICAgICAgICBjb3B5cXVhZHMoaW4sIG91dDAsIG91dDEsIG91dDIsIGNvbDQpOwotICAgICAgICAgICAgY29sICY9IDM7Ci0gICAgICAgICAgICBpZiAoMCA9PSBjb2wpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY29sNCA8PD0gMjsKLSAgICAgICAgICAgIGlucHRyICs9IGNvbDQgKiAzOyAgLyogd2UgcmVhZCB0aGlzIDMgdGltZXMgcGVyIGluIGNvcHlxdWFkcyAqLwotICAgICAgICAgICAgb3V0cHRyMCArPSBjb2w0OwotICAgICAgICAgICAgb3V0cHRyMSArPSBjb2w0OwotICAgICAgICAgICAgb3V0cHRyMiArPSBjb2w0OwotICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIHRvIHdoaWxlLWxvb3AgKi8KLSAgICAgICAgfQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAqb3V0cHRyMCsrID0gKmlucHRyKys7Ci0gICAgICAgICAgICAqb3V0cHRyMSsrID0gKmlucHRyKys7Ci0gICAgICAgICAgICAqb3V0cHRyMisrID0gKmlucHRyKys7Ci0gICAgICAgIH0gd2hpbGUgKC0tY29sICE9IDApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotU0xPVzoKLSNlbmRpZgotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgLyogSXQgc2VlbXMgZmFzdGVzdCB0byBtYWtlIGEgc2VwYXJhdGUgcGFzcyBmb3IgZWFjaCBjb21wb25lbnQuICovCi0gICAgZm9yIChjaSA9IDA7IGNpIDwgbmM7IGNpKyspIHsKLSAgICAgIGlucHRyID0gKmlucHV0X2J1ZjsKLSAgICAgIG91dHB0ciA9IG91dHB1dF9idWZbY2ldW291dHB1dF9yb3ddOwotICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKLQlvdXRwdHJbY29sXSA9IGlucHRyW2NpXTsgLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLwotCWlucHRyICs9IG5jOwotICAgICAgfQotICAgIH0KLSAgICBpbnB1dF9idWYrKzsKLSAgICBvdXRwdXRfcm93Kys7Ci0gIH0KLX0KLQotCi0vKgotICogRW1wdHkgbWV0aG9kIGZvciBzdGFydF9wYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotbnVsbF9tZXRob2QgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBubyB3b3JrIG5lZWRlZCAqLwotfQotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgaW5wdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfY29sb3JfY29udmVydGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0OwotCi0gIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9jb2xvcl9jb252ZXJ0ZXIpKTsKLSAgY2luZm8tPmNjb252ZXJ0ID0gKHN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciAqKSBjY29udmVydDsKLSAgLyogc2V0IHN0YXJ0X3Bhc3MgdG8gbnVsbCBtZXRob2QgdW50aWwgd2UgZmluZCBvdXQgZGlmZmVyZW50bHkgKi8KLSAgY2NvbnZlcnQtPnB1Yi5zdGFydF9wYXNzID0gbnVsbF9tZXRob2Q7Ci0KLSAgLyogTWFrZSBzdXJlIGlucHV0X2NvbXBvbmVudHMgYWdyZWVzIHdpdGggaW5fY29sb3Jfc3BhY2UgKi8KLSAgc3dpdGNoIChjaW5mby0+aW5fY29sb3Jfc3BhY2UpIHsKLSAgY2FzZSBKQ1NfR1JBWVNDQUxFOgotICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSAxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfUkdCOgotI2lmIFJHQl9QSVhFTFNJWkUgIT0gMwotICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSBSR0JfUElYRUxTSVpFKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0jZW5kaWYgLyogZWxzZSBzaGFyZSBjb2RlIHdpdGggWUNiQ3IgKi8KLQotICBjYXNlIEpDU19ZQ2JDcjoKLSAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gMykKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX0NNWUs6Ci0gIGNhc2UgSkNTX1lDQ0s6Ci0gICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzICE9IDQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgkJCS8qIEpDU19VTktOT1dOIGNhbiBiZSBhbnl0aGluZyAqLwotICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyA8IDEpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIENoZWNrIG51bV9jb21wb25lbnRzLCBzZXQgY29udmVyc2lvbiBtZXRob2QgYmFzZWQgb24gcmVxdWVzdGVkIHNwYWNlICovCi0gIHN3aXRjaCAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKLSAgY2FzZSBKQ1NfR1JBWVNDQUxFOgotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKQotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheXNjYWxlX2NvbnZlcnQ7Ci0gICAgZWxzZSBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfZ3JheV9jb252ZXJ0OwotICAgIH0gZWxzZSBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlzY2FsZV9jb252ZXJ0OwotICAgIGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19SR0I6Ci0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19SR0IgJiYgUkdCX1BJWEVMU0laRSA9PSAzKQotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OwotICAgIGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19ZQ2JDcjoKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgewotICAgICAgY2NvbnZlcnQtPnB1Yi5zdGFydF9wYXNzID0gcmdiX3ljY19zdGFydDsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHJnYl95Y2NfY29udmVydDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpCi0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7Ci0gICAgZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX0NNWUs6Ci0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSA0KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19DTVlLKQotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OwotICAgIGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19ZQ0NLOgotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gNCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykgewotICAgICAgY2NvbnZlcnQtPnB1Yi5zdGFydF9wYXNzID0gcmdiX3ljY19zdGFydDsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGNteWtfeWNja19jb252ZXJ0OwotICAgIH0gZWxzZSBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19ZQ0NLKQotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OwotICAgIGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgkJCS8qIGFsbG93IG51bGwgY29udmVyc2lvbiBvZiBKQ1NfVU5LTk9XTiAqLwotICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSAhPSBjaW5mby0+aW5fY29sb3Jfc3BhY2UgfHwKLQljaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gY2luZm8tPmlucHV0X2NvbXBvbmVudHMpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OwotICAgIGJyZWFrOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY2RjdG1nci5jIGIvbGlianBlZ3R3cnAvamNkY3RtZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmYTc5Yi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY2RjdG1nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qCi0gKiBqY2RjdG1nci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZvcndhcmQtRENUIG1hbmFnZW1lbnQgbG9naWMuCi0gKiBUaGlzIGNvZGUgc2VsZWN0cyBhIHBhcnRpY3VsYXIgRENUIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQsCi0gKiBhbmQgaXQgcGVyZm9ybXMgcmVsYXRlZCBob3VzZWtlZXBpbmcgY2hvcmVzIGluY2x1ZGluZyBjb2VmZmljaWVudAotICogcXVhbnRpemF0aW9uLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0KLS8qIFByaXZhdGUgc3Vib2JqZWN0IGZvciB0aGlzIG1vZHVsZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIERDVCByb3V0aW5lIGFjdHVhbGx5IGluIHVzZSAqLwotICBmb3J3YXJkX0RDVF9tZXRob2RfcHRyIGRvX2RjdDsKLQotICAvKiBUaGUgYWN0dWFsIHBvc3QtRENUIGRpdmlzb3JzIC0tLSBub3QgaWRlbnRpY2FsIHRvIHRoZSBxdWFudCB0YWJsZQotICAgKiBlbnRyaWVzLCBiZWNhdXNlIG9mIHNjYWxpbmcgKGVzcGVjaWFsbHkgZm9yIGFuIHVubm9ybWFsaXplZCBEQ1QpLgotICAgKiBFYWNoIHRhYmxlIGlzIGdpdmVuIGluIG5vcm1hbCBhcnJheSBvcmRlci4KLSAgICovCi0gIERDVEVMRU0gKiBkaXZpc29yc1tOVU1fUVVBTlRfVEJMU107Ci0KLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gIC8qIFNhbWUgYXMgYWJvdmUgZm9yIHRoZSBmbG9hdGluZy1wb2ludCBjYXNlLiAqLwotICBmbG9hdF9EQ1RfbWV0aG9kX3B0ciBkb19mbG9hdF9kY3Q7Ci0gIEZBU1RfRkxPQVQgKiBmbG9hdF9kaXZpc29yc1tOVU1fUVVBTlRfVEJMU107Ci0jZW5kaWYKLX0gbXlfZmRjdF9jb250cm9sbGVyOwotCi10eXBlZGVmIG15X2ZkY3RfY29udHJvbGxlciAqIG15X2ZkY3RfcHRyOwotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KLSAqIFZlcmlmeSB0aGF0IGFsbCByZWZlcmVuY2VkIFEtdGFibGVzIGFyZSBwcmVzZW50LCBhbmQgc2V0IHVwCi0gKiB0aGUgZGl2aXNvciB0YWJsZSBmb3IgZWFjaCBvbmUuCi0gKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgRENUIG9mIGFsbCBjb21wb25lbnRzIGlzIGRvbmUgZHVyaW5nCi0gKiB0aGUgZmlyc3QgcGFzcywgZXZlbiBpZiBvbmx5IHNvbWUgY29tcG9uZW50cyB3aWxsIGJlIG91dHB1dCBpbiB0aGUKLSAqIGZpcnN0IHNjYW4uICBIZW5jZSBhbGwgY29tcG9uZW50cyBzaG91bGQgYmUgZXhhbWluZWQgaGVyZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfZmRjdG1nciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2ZkY3RfcHRyIGZkY3QgPSAobXlfZmRjdF9wdHIpIGNpbmZvLT5mZGN0OwotICBpbnQgY2ksIHF0YmxubywgaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSlFVQU5UX1RCTCAqIHF0Ymw7Ci0gIERDVEVMRU0gKiBkdGJsOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgcXRibG5vID0gY29tcHB0ci0+cXVhbnRfdGJsX25vOwotICAgIC8qIE1ha2Ugc3VyZSBzcGVjaWZpZWQgcXVhbnRpemF0aW9uIHRhYmxlIGlzIHByZXNlbnQgKi8KLSAgICBpZiAocXRibG5vIDwgMCB8fCBxdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKLQljaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSA9PSBOVUxMKQotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHF0Ymxubyk7Ci0gICAgcXRibCA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dOwotICAgIC8qIENvbXB1dGUgZGl2aXNvcnMgZm9yIHRoaXMgcXVhbnQgdGFibGUgKi8KLSAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3Igc2FtZSB0YWJsZSwgYnV0IGl0J3Mgbm90IGEgYmlnIGRlYWwgKi8KLSAgICBzd2l0Y2ggKGNpbmZvLT5kY3RfbWV0aG9kKSB7Ci0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotICAgIGNhc2UgSkRDVF9JU0xPVzoKLSAgICAgIC8qIEZvciBMTCZNIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcmF3IHF1YW50aXphdGlvbgotICAgICAgICogY29lZmZpY2llbnRzIG11bHRpcGxpZWQgYnkgOCAodG8gY291bnRlcmFjdCBzY2FsaW5nKS4KLSAgICAgICAqLwotICAgICAgaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgewotCWZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPSAoRENURUxFTSAqKQotCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICBEQ1RTSVpFMiAqIFNJWkVPRihEQ1RFTEVNKSk7Ci0gICAgICB9Ci0gICAgICBkdGJsID0gZmRjdC0+ZGl2aXNvcnNbcXRibG5vXTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0JZHRibFtpXSA9ICgoRENURUxFTSkgcXRibC0+cXVhbnR2YWxbaV0pIDw8IDM7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSAgICBjYXNlIEpEQ1RfSUZBU1Q6Ci0gICAgICB7Ci0JLyogRm9yIEFBJk4gSURDVCBtZXRob2QsIGRpdmlzb3JzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KLQkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKLQkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQotCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKLQkgKiBXZSBhcHBseSBhIGZ1cnRoZXIgc2NhbGUgZmFjdG9yIG9mIDguCi0JICovCi0jZGVmaW5lIENPTlNUX0JJVFMgMTQKLQlzdGF0aWMgY29uc3QgSU5UMTYgYWFuc2NhbGVzW0RDVFNJWkUyXSA9IHsKLQkgIC8qIHByZWNvbXB1dGVkIHZhbHVlcyBzY2FsZWQgdXAgYnkgMTQgYml0cyAqLwotCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAotCSAgMjI3MjUsIDMxNTIxLCAyOTY5MiwgMjY3MjIsIDIyNzI1LCAxNzg1NSwgMTIyOTksICA2MjcwLAotCSAgMjE0MDcsIDI5NjkyLCAyNzk2OSwgMjUxNzIsIDIxNDA3LCAxNjgxOSwgMTE1ODUsICA1OTA2LAotCSAgMTkyNjYsIDI2NzIyLCAyNTE3MiwgMjI2NTQsIDE5MjY2LCAxNTEzNywgMTA0MjYsICA1MzE1LAotCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAotCSAgMTI4NzMsIDE3ODU1LCAxNjgxOSwgMTUxMzcsIDEyODczLCAxMDExNCwgIDY5NjcsICAzNTUyLAotCSAgIDg4NjcsIDEyMjk5LCAxMTU4NSwgMTA0MjYsICA4ODY3LCAgNjk2NywgIDQ3OTksICAyNDQ2LAotCSAgIDQ1MjAsICA2MjcwLCAgNTkwNiwgIDUzMTUsICA0NTIwLCAgMzU1MiwgIDI0NDYsICAxMjQ3Ci0JfTsKLQlTSElGVF9URU1QUwotCi0JaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgewotCSAgZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9IChEQ1RFTEVNICopCi0JICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJCURDVFNJWkUyICogU0laRU9GKERDVEVMRU0pKTsKLQl9Ci0JZHRibCA9IGZkY3QtPmRpdmlzb3JzW3F0Ymxub107Ci0JZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLQkgIGR0YmxbaV0gPSAoRENURUxFTSkKLQkgICAgREVTQ0FMRShNVUxUSVBMWTE2VjE2KChJTlQzMikgcXRibC0+cXVhbnR2YWxbaV0sCi0JCQkJICAoSU5UMzIpIGFhbnNjYWxlc1tpXSksCi0JCSAgICBDT05TVF9CSVRTLTMpOwotCX0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICAgIGNhc2UgSkRDVF9GTE9BVDoKLSAgICAgIHsKLQkvKiBGb3IgZmxvYXQgQUEmTiBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgotCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQotCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCi0JICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNwotCSAqIFdlIGFwcGx5IGEgZnVydGhlciBzY2FsZSBmYWN0b3Igb2YgOC4KLQkgKiBXaGF0J3MgYWN0dWFsbHkgc3RvcmVkIGlzIDEvZGl2aXNvciBzbyB0aGF0IHRoZSBpbm5lciBsb29wIGNhbgotCSAqIHVzZSBhIG11bHRpcGxpY2F0aW9uIHJhdGhlciB0aGFuIGEgZGl2aXNpb24uCi0JICovCi0JRkFTVF9GTE9BVCAqIGZkdGJsOwotCWludCByb3csIGNvbDsKLQlzdGF0aWMgY29uc3QgZG91YmxlIGFhbnNjYWxlZmFjdG9yW0RDVFNJWkVdID0gewotCSAgMS4wLCAxLjM4NzAzOTg0NSwgMS4zMDY1NjI5NjUsIDEuMTc1ODc1NjAyLAotCSAgMS4wLCAwLjc4NTY5NDk1OCwgMC41NDExOTYxMDAsIDAuMjc1ODk5Mzc5Ci0JfTsKLQotCWlmIChmZGN0LT5mbG9hdF9kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKLQkgIGZkY3QtPmZsb2F0X2Rpdmlzb3JzW3F0Ymxub10gPSAoRkFTVF9GTE9BVCAqKQotCSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCQlEQ1RTSVpFMiAqIFNJWkVPRihGQVNUX0ZMT0FUKSk7Ci0JfQotCWZkdGJsID0gZmRjdC0+ZmxvYXRfZGl2aXNvcnNbcXRibG5vXTsKLQlpID0gMDsKLQlmb3IgKHJvdyA9IDA7IHJvdyA8IERDVFNJWkU7IHJvdysrKSB7Ci0JICBmb3IgKGNvbCA9IDA7IGNvbCA8IERDVFNJWkU7IGNvbCsrKSB7Ci0JICAgIGZkdGJsW2ldID0gKEZBU1RfRkxPQVQpCi0JICAgICAgKDEuMCAvICgoKGRvdWJsZSkgcXRibC0+cXVhbnR2YWxbaV0gKgotCQkgICAgICAgYWFuc2NhbGVmYWN0b3Jbcm93XSAqIGFhbnNjYWxlZmFjdG9yW2NvbF0gKiA4LjApKSk7Ci0JICAgIGkrKzsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogUGVyZm9ybSBmb3J3YXJkIERDVCBvbiBvbmUgb3IgbW9yZSBibG9ja3Mgb2YgYSBjb21wb25lbnQuCi0gKgotICogVGhlIGlucHV0IHNhbXBsZXMgYXJlIHRha2VuIGZyb20gdGhlIHNhbXBsZV9kYXRhW10gYXJyYXkgc3RhcnRpbmcgYXQKLSAqIHBvc2l0aW9uIHN0YXJ0X3Jvdy9zdGFydF9jb2wsIGFuZCBtb3ZpbmcgdG8gdGhlIHJpZ2h0IGZvciBhbnkgYWRkaXRpb25hbAotICogYmxvY2tzLiBUaGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gY29lZl9ibG9ja3NbXS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZvcndhcmRfRENUIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JICAgICBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKQkxPQ0tST1cgY29lZl9ibG9ja3MsCi0JICAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCi0JICAgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpCi0vKiBUaGlzIHZlcnNpb24gaXMgdXNlZCBmb3IgaW50ZWdlciBEQ1QgaW1wbGVtZW50YXRpb25zLiAqLwotewotICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyBpdCB0aWdodGx5LiAqLwotICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKLSAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkb19kY3QgPSBmZGN0LT5kb19kY3Q7Ci0gIERDVEVMRU0gKiBkaXZpc29ycyA9IGZkY3QtPmRpdmlzb3JzW2NvbXBwdHItPnF1YW50X3RibF9ub107Ci0gIERDVEVMRU0gd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogd29yayBhcmVhIGZvciBGRENUIHN1YnJvdXRpbmUgKi8KLSAgSkRJTUVOU0lPTiBiaTsKLQotICBzYW1wbGVfZGF0YSArPSBzdGFydF9yb3c7CS8qIGZvbGQgaW4gdGhlIHZlcnRpY2FsIG9mZnNldCBvbmNlICovCi0KLSAgZm9yIChiaSA9IDA7IGJpIDwgbnVtX2Jsb2NrczsgYmkrKywgc3RhcnRfY29sICs9IERDVFNJWkUpIHsKLSAgICAvKiBMb2FkIGRhdGEgaW50byB3b3Jrc3BhY2UsIGFwcGx5aW5nIHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLwotICAgIHsgcmVnaXN0ZXIgRENURUxFTSAqd29ya3NwYWNlcHRyOwotICAgICAgcmVnaXN0ZXIgSlNBTVBST1cgZWxlbXB0cjsKLSAgICAgIHJlZ2lzdGVyIGludCBlbGVtcjsKLQotICAgICAgd29ya3NwYWNlcHRyID0gd29ya3NwYWNlOwotICAgICAgZm9yIChlbGVtciA9IDA7IGVsZW1yIDwgRENUU0laRTsgZWxlbXIrKykgewotCWVsZW1wdHIgPSBzYW1wbGVfZGF0YVtlbGVtcl0gKyBzdGFydF9jb2w7Ci0jaWYgRENUU0laRSA9PSA4CQkvKiB1bnJvbGwgdGhlIGlubmVyIGxvb3AgKi8KLQkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKLQkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKLQkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKLQkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKLQkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKLQkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKLQkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKLQkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKLSNlbHNlCi0JeyByZWdpc3RlciBpbnQgZWxlbWM7Ci0JICBmb3IgKGVsZW1jID0gRENUU0laRTsgZWxlbWMgPiAwOyBlbGVtYy0tKSB7Ci0JICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOwotCSAgfQotCX0KLSNlbmRpZgotICAgICAgfQotICAgIH0KLQotICAgIC8qIFBlcmZvcm0gdGhlIERDVCAqLwotICAgICgqZG9fZGN0KSAod29ya3NwYWNlKTsKLQotICAgIC8qIFF1YW50aXplL2Rlc2NhbGUgdGhlIGNvZWZmaWNpZW50cywgYW5kIHN0b3JlIGludG8gY29lZl9ibG9ja3NbXSAqLwotICAgIHsgcmVnaXN0ZXIgRENURUxFTSB0ZW1wLCBxdmFsOwotICAgICAgcmVnaXN0ZXIgaW50IGk7Ci0gICAgICByZWdpc3RlciBKQ09FRlBUUiBvdXRwdXRfcHRyID0gY29lZl9ibG9ja3NbYmldOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotCXF2YWwgPSBkaXZpc29yc1tpXTsKLQl0ZW1wID0gd29ya3NwYWNlW2ldOwotCS8qIERpdmlkZSB0aGUgY29lZmZpY2llbnQgdmFsdWUgYnkgcXZhbCwgZW5zdXJpbmcgcHJvcGVyIHJvdW5kaW5nLgotCSAqIFNpbmNlIEMgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHJvdW5kaW5nIGZvciBuZWdhdGl2ZQotCSAqIHF1b3RpZW50cywgd2UgaGF2ZSB0byBmb3JjZSB0aGUgZGl2aWRlbmQgcG9zaXRpdmUgZm9yIHBvcnRhYmlsaXR5LgotCSAqCi0JICogSW4gbW9zdCBmaWxlcywgYXQgbGVhc3QgaGFsZiBvZiB0aGUgb3V0cHV0IHZhbHVlcyB3aWxsIGJlIHplcm8KLQkgKiAoYXQgZGVmYXVsdCBxdWFudGl6YXRpb24gc2V0dGluZ3MsIG1vcmUgbGlrZSB0aHJlZS1xdWFydGVycy4uLikKLQkgKiBzbyB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhpcyBjYXNlIGlzIGZhc3QuICBPbiBtYW55IG1hY2hpbmVzLAotCSAqIGEgY29tcGFyaXNvbiBpcyBlbm91Z2ggY2hlYXBlciB0aGFuIGEgZGl2aWRlIHRvIG1ha2UgYSBzcGVjaWFsIHRlc3QKLQkgKiBhIHdpbi4gIFNpbmNlIGJvdGggaW5wdXRzIHdpbGwgYmUgbm9ubmVnYXRpdmUsIHdlIG5lZWQgb25seSB0ZXN0Ci0JICogZm9yIGEgPCBiIHRvIGRpc2NvdmVyIHdoZXRoZXIgYS9iIGlzIDAuCi0JICogSWYgeW91ciBtYWNoaW5lJ3MgZGl2aXNpb24gaXMgZmFzdCBlbm91Z2gsIGRlZmluZSBGQVNUX0RJVklERS4KLQkgKi8KLSNpZmRlZiBGQVNUX0RJVklERQotI2RlZmluZSBESVZJREVfQlkoYSxiKQlhIC89IGIKLSNlbHNlCi0jZGVmaW5lIERJVklERV9CWShhLGIpCWlmIChhID49IGIpIGEgLz0gYjsgZWxzZSBhID0gMAotI2VuZGlmCi0JaWYgKHRlbXAgPCAwKSB7Ci0JICB0ZW1wID0gLXRlbXA7Ci0JICB0ZW1wICs9IHF2YWw+PjE7CS8qIGZvciByb3VuZGluZyAqLwotCSAgRElWSURFX0JZKHRlbXAsIHF2YWwpOwotCSAgdGVtcCA9IC10ZW1wOwotCX0gZWxzZSB7Ci0JICB0ZW1wICs9IHF2YWw+PjE7CS8qIGZvciByb3VuZGluZyAqLwotCSAgRElWSURFX0JZKHRlbXAsIHF2YWwpOwotCX0KLQlvdXRwdXRfcHRyW2ldID0gKEpDT0VGKSB0ZW1wOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0KLU1FVEhPRERFRih2b2lkKQotZm9yd2FyZF9EQ1RfZmxvYXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAotCQkgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCi0JCSAgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykKLS8qIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGZvciBmbG9hdGluZy1wb2ludCBEQ1QgaW1wbGVtZW50YXRpb25zLiAqLwotewotICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyBpdCB0aWdodGx5LiAqLwotICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKLSAgZmxvYXRfRENUX21ldGhvZF9wdHIgZG9fZGN0ID0gZmRjdC0+ZG9fZmxvYXRfZGN0OwotICBGQVNUX0ZMT0FUICogZGl2aXNvcnMgPSBmZGN0LT5mbG9hdF9kaXZpc29yc1tjb21wcHRyLT5xdWFudF90Ymxfbm9dOwotICBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMl07IC8qIHdvcmsgYXJlYSBmb3IgRkRDVCBzdWJyb3V0aW5lICovCi0gIEpESU1FTlNJT04gYmk7Ci0KLSAgc2FtcGxlX2RhdGEgKz0gc3RhcnRfcm93OwkvKiBmb2xkIGluIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb25jZSAqLwotCi0gIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBEQ1RTSVpFKSB7Ci0gICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KLSAgICB7IHJlZ2lzdGVyIEZBU1RfRkxPQVQgKndvcmtzcGFjZXB0cjsKLSAgICAgIHJlZ2lzdGVyIEpTQU1QUk9XIGVsZW1wdHI7Ci0gICAgICByZWdpc3RlciBpbnQgZWxlbXI7Ci0KLSAgICAgIHdvcmtzcGFjZXB0ciA9IHdvcmtzcGFjZTsKLSAgICAgIGZvciAoZWxlbXIgPSAwOyBlbGVtciA8IERDVFNJWkU7IGVsZW1yKyspIHsKLQllbGVtcHRyID0gc2FtcGxlX2RhdGFbZWxlbXJdICsgc3RhcnRfY29sOwotI2lmIERDVFNJWkUgPT0gOAkJLyogdW5yb2xsIHRoZSBpbm5lciBsb29wICovCi0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotI2Vsc2UKLQl7IHJlZ2lzdGVyIGludCBlbGVtYzsKLQkgIGZvciAoZWxlbWMgPSBEQ1RTSVpFOyBlbGVtYyA+IDA7IGVsZW1jLS0pIHsKLQkgICAgKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpCi0JICAgICAgKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkgIH0KLQl9Ci0jZW5kaWYKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBQZXJmb3JtIHRoZSBEQ1QgKi8KLSAgICAoKmRvX2RjdCkgKHdvcmtzcGFjZSk7Ci0KLSAgICAvKiBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2tzW10gKi8KLSAgICB7IHJlZ2lzdGVyIEZBU1RfRkxPQVQgdGVtcDsKLSAgICAgIHJlZ2lzdGVyIGludCBpOwotICAgICAgcmVnaXN0ZXIgSkNPRUZQVFIgb3V0cHV0X3B0ciA9IGNvZWZfYmxvY2tzW2JpXTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLQkvKiBBcHBseSB0aGUgcXVhbnRpemF0aW9uIGFuZCBzY2FsaW5nIGZhY3RvciAqLwotCXRlbXAgPSB3b3Jrc3BhY2VbaV0gKiBkaXZpc29yc1tpXTsKLQkvKiBSb3VuZCB0byBuZWFyZXN0IGludGVnZXIuCi0JICogU2luY2UgQyBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2Ygcm91bmRpbmcgZm9yIG5lZ2F0aXZlCi0JICogcXVvdGllbnRzLCB3ZSBoYXZlIHRvIGZvcmNlIHRoZSBkaXZpZGVuZCBwb3NpdGl2ZSBmb3IgcG9ydGFiaWxpdHkuCi0JICogVGhlIG1heGltdW0gY29lZmZpY2llbnQgc2l6ZSBpcyArLTE2SyAoZm9yIDEyLWJpdCBkYXRhKSwgc28gdGhpcwotCSAqIGNvZGUgc2hvdWxkIHdvcmsgZm9yIGVpdGhlciAxNi1iaXQgb3IgMzItYml0IGludHMuCi0JICovCi0Jb3V0cHV0X3B0cltpXSA9IChKQ09FRikgKChpbnQpICh0ZW1wICsgKEZBU1RfRkxPQVQpIDE2Mzg0LjUpIC0gMTYzODQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0jZW5kaWYgLyogRENUX0ZMT0FUX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsaXplIEZEQ1QgbWFuYWdlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2ZvcndhcmRfZGN0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfZmRjdF9wdHIgZmRjdDsKLSAgaW50IGk7Ci0KLSAgZmRjdCA9IChteV9mZGN0X3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9mZGN0X2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPmZkY3QgPSAoc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgKikgZmRjdDsKLSAgZmRjdC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2ZkY3RtZ3I7Ci0KLSAgc3dpdGNoIChjaW5mby0+ZGN0X21ldGhvZCkgewotI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKLSAgY2FzZSBKRENUX0lTTE9XOgotICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUOwotICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pc2xvdzsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSAgY2FzZSBKRENUX0lGQVNUOgotICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUOwotICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pZmFzdDsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgY2FzZSBKRENUX0ZMT0FUOgotICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUX2Zsb2F0OwotICAgIGZkY3QtPmRvX2Zsb2F0X2RjdCA9IGpwZWdfZmRjdF9mbG9hdDsKLSAgICBicmVhazsKLSNlbmRpZgotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIE1hcmsgZGl2aXNvciB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKLSAgICBmZGN0LT5kaXZpc29yc1tpXSA9IE5VTEw7Ci0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICAgIGZkY3QtPmZsb2F0X2Rpdmlzb3JzW2ldID0gTlVMTDsKLSNlbmRpZgotICB9Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY2h1ZmYuYyBiL2xpYmpwZWd0d3JwL2pjaHVmZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM1MjUwLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjaHVmZi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTA5ICswLDAgQEAKLS8qCi0gKiBqY2h1ZmYuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZyByb3V0aW5lcy4KLSAqCi0gKiBNdWNoIG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaGFzIHRvIGRvIHdpdGggc3VwcG9ydGluZyBvdXRwdXQgc3VzcGVuc2lvbi4KLSAqIElmIHRoZSBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZSBkZW1hbmRzIHN1c3BlbnNpb24sIHdlIHdhbnQgdG8gYmUgYWJsZSB0bwotICogYmFjayB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgTUNVLiAgVG8gZG8gdGhpcywgd2UgY29weSBzdGF0ZQotICogdmFyaWFibGVzIGludG8gbG9jYWwgd29ya2luZyBzdG9yYWdlLCBhbmQgdXBkYXRlIHRoZW0gYmFjayB0byB0aGUKLSAqIHBlcm1hbmVudCBKUEVHIG9iamVjdHMgb25seSB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhbiBNQ1UuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpjaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpjcGh1ZmYuYyAqLwotCi0KLS8qIEV4cGFuZGVkIGVudHJvcHkgZW5jb2RlciBvYmplY3QgZm9yIEh1ZmZtYW4gZW5jb2RpbmcuCi0gKgotICogVGhlIHNhdmFibGVfc3RhdGUgc3VicmVjb3JkIGNvbnRhaW5zIGZpZWxkcyB0aGF0IGNoYW5nZSB3aXRoaW4gYW4gTUNVLAotICogYnV0IG11c3Qgbm90IGJlIHVwZGF0ZWQgcGVybWFuZW50bHkgdW50aWwgd2UgY29tcGxldGUgdGhlIE1DVS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIElOVDMyIHB1dF9idWZmZXI7CQkvKiBjdXJyZW50IGJpdC1hY2N1bXVsYXRpb24gYnVmZmVyICovCi0gIGludCBwdXRfYml0czsJCQkvKiAjIG9mIGJpdHMgbm93IGluIGl0ICovCi0gIGludCBsYXN0X2RjX3ZhbFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIGxhc3QgREMgY29lZiBmb3IgZWFjaCBjb21wb25lbnQgKi8KLX0gc2F2YWJsZV9zdGF0ZTsKLQotLyogVGhpcyBtYWNybyBpcyB0byB3b3JrIGFyb3VuZCBjb21waWxlcnMgd2l0aCBtaXNzaW5nIG9yIGJyb2tlbgotICogc3RydWN0dXJlIGFzc2lnbm1lbnQuICBZb3UnbGwgbmVlZCB0byBmaXggdGhpcyBjb2RlIGlmIHlvdSBoYXZlCi0gKiBzdWNoIGEgY29tcGlsZXIgYW5kIHlvdSBjaGFuZ2UgTUFYX0NPTVBTX0lOX1NDQU4uCi0gKi8KLQotI2lmbmRlZiBOT19TVFJVQ1RfQVNTSUdOCi0jZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgICgoZGVzdCkgPSAoc3JjKSkKLSNlbHNlCi0jaWYgTUFYX0NPTVBTX0lOX1NDQU4gPT0gNAotI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICBcCi0JKChkZXN0KS5wdXRfYnVmZmVyID0gKHNyYykucHV0X2J1ZmZlciwgXAotCSAoZGVzdCkucHV0X2JpdHMgPSAoc3JjKS5wdXRfYml0cywgXAotCSAoZGVzdCkubGFzdF9kY192YWxbMF0gPSAoc3JjKS5sYXN0X2RjX3ZhbFswXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbMV0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsxXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbMl0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsyXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbM10gPSAoc3JjKS5sYXN0X2RjX3ZhbFszXSkKLSNlbmRpZgotI2VuZGlmCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgc2F2YWJsZV9zdGF0ZSBzYXZlZDsJCS8qIEJpdCBidWZmZXIgJiBEQyBzdGF0ZSBhdCBzdGFydCBvZiBNQ1UgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIE5PVCBsb2FkZWQgaW50byBsb2NhbCB3b3JraW5nIHN0YXRlLiAqLwotICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KLSAgaW50IG5leHRfcmVzdGFydF9udW07CQkvKiBuZXh0IHJlc3RhcnQgbnVtYmVyIHRvIHdyaXRlICgwLTcpICovCi0KLSAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgKHRoZXNlIHdvcmtzcGFjZXMgaGF2ZSBpbWFnZSBsaWZlc3BhbikgKi8KLSAgY19kZXJpdmVkX3RibCAqIGRjX2Rlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKLSAgY19kZXJpdmVkX3RibCAqIGFjX2Rlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKLQotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAkvKiBTdGF0aXN0aWNzIHRhYmxlcyBmb3Igb3B0aW1pemF0aW9uICovCi0gIGxvbmcgKiBkY19jb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOwotICBsb25nICogYWNfY291bnRfcHRyc1tOVU1fSFVGRl9UQkxTXTsKLSNlbmRpZgotfSBodWZmX2VudHJvcHlfZW5jb2RlcjsKLQotdHlwZWRlZiBodWZmX2VudHJvcHlfZW5jb2RlciAqIGh1ZmZfZW50cm9weV9wdHI7Ci0KLS8qIFdvcmtpbmcgc3RhdGUgd2hpbGUgd3JpdGluZyBhbiBNQ1UuCi0gKiBUaGlzIHN0cnVjdCBjb250YWlucyBhbGwgdGhlIGZpZWxkcyB0aGF0IGFyZSBuZWVkZWQgYnkgc3Vicm91dGluZXMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBKT0NURVQgKiBuZXh0X291dHB1dF9ieXRlOwkvKiA9PiBuZXh0IGJ5dGUgdG8gd3JpdGUgaW4gYnVmZmVyICovCi0gIHNpemVfdCBmcmVlX2luX2J1ZmZlcjsJLyogIyBvZiBieXRlIHNwYWNlcyByZW1haW5pbmcgaW4gYnVmZmVyICovCi0gIHNhdmFibGVfc3RhdGUgY3VyOwkJLyogQ3VycmVudCBiaXQgYnVmZmVyICYgREMgc3RhdGUgKi8KLSAgal9jb21wcmVzc19wdHIgY2luZm87CQkvKiBkdW1wX2J1ZmZlciBuZWVkcyBhY2Nlc3MgdG8gdGhpcyAqLwotfSB3b3JraW5nX3N0YXRlOwotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9odWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCUpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19odWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLU1FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X2dhdGhlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19nYXRoZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotI2VuZGlmCi0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4uCi0gKiBJZiBnYXRoZXJfc3RhdGlzdGljcyBpcyBUUlVFLCB3ZSBkbyBub3Qgb3V0cHV0IGFueXRoaW5nIGR1cmluZyB0aGUgc2NhbiwKLSAqIGp1c3QgY291bnQgdGhlIEh1ZmZtYW4gc3ltYm9scyB1c2VkIGFuZCBnZW5lcmF0ZSBIdWZmbWFuIGNvZGUgdGFibGVzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19odWZmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBnYXRoZXJfc3RhdGlzdGljcykKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgY2ksIGRjdGJsLCBhY3RibDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0KLSAgaWYgKGdhdGhlcl9zdGF0aXN0aWNzKSB7Ci0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0gICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X2dhdGhlcjsKLSAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19nYXRoZXI7Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9odWZmOwotICAgIGVudHJvcHktPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX2h1ZmY7Ci0gIH0KLQotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgZGN0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87Ci0gICAgYWN0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87Ci0gICAgaWYgKGdhdGhlcl9zdGF0aXN0aWNzKSB7Ci0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0gICAgICAvKiBDaGVjayBmb3IgaW52YWxpZCB0YWJsZSBpbmRleGVzICovCi0gICAgICAvKiAobWFrZV9jX2Rlcml2ZWRfdGJsIGRvZXMgdGhpcyBpbiB0aGUgb3RoZXIgcGF0aCkgKi8KLSAgICAgIGlmIChkY3RibCA8IDAgfHwgZGN0YmwgPj0gTlVNX0hVRkZfVEJMUykKLQlFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCBkY3RibCk7Ci0gICAgICBpZiAoYWN0YmwgPCAwIHx8IGFjdGJsID49IE5VTV9IVUZGX1RCTFMpCi0JRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgYWN0YmwpOwotICAgICAgLyogQWxsb2NhdGUgYW5kIHplcm8gdGhlIHN0YXRpc3RpY3MgdGFibGVzICovCi0gICAgICAvKiBOb3RlIHRoYXQganBlZ19nZW5fb3B0aW1hbF90YWJsZSBleHBlY3RzIDI1NyBlbnRyaWVzIGluIGVhY2ggdGFibGUhICovCi0gICAgICBpZiAoZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0gPT0gTlVMTCkKLQllbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSA9IChsb25nICopCi0JICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICAgIDI1NyAqIFNJWkVPRihsb25nKSk7Ci0gICAgICBNRU1aRVJPKGVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdLCAyNTcgKiBTSVpFT0YobG9uZykpOwotICAgICAgaWYgKGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdID09IE5VTEwpCi0JZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0gPSAobG9uZyAqKQotCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOwotICAgICAgTUVNWkVSTyhlbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSwgMjU3ICogU0laRU9GKGxvbmcpKTsKLSNlbmRpZgotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBDb21wdXRlIGRlcml2ZWQgdmFsdWVzIGZvciBIdWZmbWFuIHRhYmxlcyAqLwotICAgICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIGEgdGFibGUsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUgKi8KLSAgICAgIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsKGNpbmZvLCBUUlVFLCBkY3RibCwKLQkJCSAgICAgICYgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2RjdGJsXSk7Ci0gICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgRkFMU0UsIGFjdGJsLAotCQkJICAgICAgJiBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbYWN0YmxdKTsKLSAgICB9Ci0gICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCi0gICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKLSAgfQotCi0gIC8qIEluaXRpYWxpemUgYml0IGJ1ZmZlciB0byBlbXB0eSAqLwotICBlbnRyb3B5LT5zYXZlZC5wdXRfYnVmZmVyID0gMDsKLSAgZW50cm9weS0+c2F2ZWQucHV0X2JpdHMgPSAwOwotCi0gIC8qIEluaXRpYWxpemUgcmVzdGFydCBzdHVmZiAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtID0gMDsKLX0KLQotCi0vKgotICogQ29tcHV0ZSB0aGUgZGVyaXZlZCB2YWx1ZXMgZm9yIGEgSHVmZm1hbiB0YWJsZS4KLSAqIFRoaXMgcm91dGluZSBhbHNvIHBlcmZvcm1zIHNvbWUgdmFsaWRhdGlvbiBjaGVja3Mgb24gdGhlIHRhYmxlLgotICoKLSAqIE5vdGUgdGhpcyBpcyBhbHNvIHVzZWQgYnkgamNwaHVmZi5jLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19tYWtlX2NfZGVyaXZlZF90YmwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKLQkJCSBjX2Rlcml2ZWRfdGJsICoqIHBkdGJsKQotewotICBKSFVGRl9UQkwgKmh0Ymw7Ci0gIGNfZGVyaXZlZF90YmwgKmR0Ymw7Ci0gIGludCBwLCBpLCBsLCBsYXN0cCwgc2ksIG1heHN5bWJvbDsKLSAgY2hhciBodWZmc2l6ZVsyNTddOwotICB1bnNpZ25lZCBpbnQgaHVmZmNvZGVbMjU3XTsKLSAgdW5zaWduZWQgaW50IGNvZGU7Ci0KLSAgLyogTm90ZSB0aGF0IGh1ZmZzaXplW10gYW5kIGh1ZmZjb2RlW10gYXJlIGZpbGxlZCBpbiBjb2RlLWxlbmd0aCBvcmRlciwKLSAgICogcGFyYWxsZWxpbmcgdGhlIG9yZGVyIG9mIHRoZSBzeW1ib2xzIHRoZW1zZWx2ZXMgaW4gaHRibC0+aHVmZnZhbFtdLgotICAgKi8KLQotICAvKiBGaW5kIHRoZSBpbnB1dCBIdWZmbWFuIHRhYmxlICovCi0gIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX0hVRkZfVEJMUykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7Ci0gIGh0YmwgPQotICAgIGlzREMgPyBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0Ymxub10gOiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0Ymxub107Ci0gIGlmIChodGJsID09IE5VTEwpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsbm8pOwotCi0gIC8qIEFsbG9jYXRlIGEgd29ya3NwYWNlIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLiAqLwotICBpZiAoKnBkdGJsID09IE5VTEwpCi0gICAgKnBkdGJsID0gKGNfZGVyaXZlZF90YmwgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YoY19kZXJpdmVkX3RibCkpOwotICBkdGJsID0gKnBkdGJsOwotICAKLSAgLyogRmlndXJlIEMuMTogbWFrZSB0YWJsZSBvZiBIdWZmbWFuIGNvZGUgbGVuZ3RoIGZvciBlYWNoIHN5bWJvbCAqLwotCi0gIHAgPSAwOwotICBmb3IgKGwgPSAxOyBsIDw9IDE2OyBsKyspIHsKLSAgICBpID0gKGludCkgaHRibC0+Yml0c1tsXTsKLSAgICBpZiAoaSA8IDAgfHwgcCArIGkgPiAyNTYpCS8qIHByb3RlY3QgYWdhaW5zdCB0YWJsZSBvdmVycnVuICovCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKLSAgICB3aGlsZSAoaS0tKQotICAgICAgaHVmZnNpemVbcCsrXSA9IChjaGFyKSBsOwotICB9Ci0gIGh1ZmZzaXplW3BdID0gMDsKLSAgbGFzdHAgPSBwOwotICAKLSAgLyogRmlndXJlIEMuMjogZ2VuZXJhdGUgdGhlIGNvZGVzIHRoZW1zZWx2ZXMgKi8KLSAgLyogV2UgYWxzbyB2YWxpZGF0ZSB0aGF0IHRoZSBjb3VudHMgcmVwcmVzZW50IGEgbGVnYWwgSHVmZm1hbiBjb2RlIHRyZWUuICovCi0KLSAgY29kZSA9IDA7Ci0gIHNpID0gaHVmZnNpemVbMF07Ci0gIHAgPSAwOwotICB3aGlsZSAoaHVmZnNpemVbcF0pIHsKLSAgICB3aGlsZSAoKChpbnQpIGh1ZmZzaXplW3BdKSA9PSBzaSkgewotICAgICAgaHVmZmNvZGVbcCsrXSA9IGNvZGU7Ci0gICAgICBjb2RlKys7Ci0gICAgfQotICAgIC8qIGNvZGUgaXMgbm93IDEgbW9yZSB0aGFuIHRoZSBsYXN0IGNvZGUgdXNlZCBmb3IgY29kZWxlbmd0aCBzaTsgYnV0Ci0gICAgICogaXQgbXVzdCBzdGlsbCBmaXQgaW4gc2kgYml0cywgc2luY2Ugbm8gY29kZSBpcyBhbGxvd2VkIHRvIGJlIGFsbCBvbmVzLgotICAgICAqLwotICAgIGlmICgoKElOVDMyKSBjb2RlKSA+PSAoKChJTlQzMikgMSkgPDwgc2kpKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0gICAgY29kZSA8PD0gMTsKLSAgICBzaSsrOwotICB9Ci0gIAotICAvKiBGaWd1cmUgQy4zOiBnZW5lcmF0ZSBlbmNvZGluZyB0YWJsZXMgKi8KLSAgLyogVGhlc2UgYXJlIGNvZGUgYW5kIHNpemUgaW5kZXhlZCBieSBzeW1ib2wgdmFsdWUgKi8KLQotICAvKiBTZXQgYWxsIGNvZGVsZXNzIHN5bWJvbHMgdG8gaGF2ZSBjb2RlIGxlbmd0aCAwOwotICAgKiB0aGlzIGxldHMgdXMgZGV0ZWN0IGR1cGxpY2F0ZSBWQUwgZW50cmllcyBoZXJlLCBhbmQgbGF0ZXIKLSAgICogYWxsb3dzIGVtaXRfYml0cyB0byBkZXRlY3QgYW55IGF0dGVtcHQgdG8gZW1pdCBzdWNoIHN5bWJvbHMuCi0gICAqLwotICBNRU1aRVJPKGR0YmwtPmVodWZzaSwgU0laRU9GKGR0YmwtPmVodWZzaSkpOwotCi0gIC8qIFRoaXMgaXMgYWxzbyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gY2hlY2sgZm9yIG91dC1vZi1yYW5nZQotICAgKiBhbmQgZHVwbGljYXRlZCBWQUwgZW50cmllcy4gIFdlIGFsbG93IDAuLjI1NSBmb3IgQUMgc3ltYm9scwotICAgKiBidXQgb25seSAwLi4xNSBmb3IgREMuICAoV2UgY291bGQgY29uc3RyYWluIHRoZW0gZnVydGhlcgotICAgKiBiYXNlZCBvbiBkYXRhIGRlcHRoIGFuZCBtb2RlLCBidXQgdGhpcyBzZWVtcyBlbm91Z2guKQotICAgKi8KLSAgbWF4c3ltYm9sID0gaXNEQyA/IDE1IDogMjU1OwotCi0gIGZvciAocCA9IDA7IHAgPCBsYXN0cDsgcCsrKSB7Ci0gICAgaSA9IGh0YmwtPmh1ZmZ2YWxbcF07Ci0gICAgaWYgKGkgPCAwIHx8IGkgPiBtYXhzeW1ib2wgfHwgZHRibC0+ZWh1ZnNpW2ldKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0gICAgZHRibC0+ZWh1ZmNvW2ldID0gaHVmZmNvZGVbcF07Ci0gICAgZHRibC0+ZWh1ZnNpW2ldID0gaHVmZnNpemVbcF07Ci0gIH0KLX0KLQotCi0vKiBPdXRwdXR0aW5nIGJ5dGVzIHRvIHRoZSBmaWxlICovCi0KLS8qIEVtaXQgYSBieXRlLCB0YWtpbmcgJ2FjdGlvbicgaWYgbXVzdCBzdXNwZW5kLiAqLwotI2RlZmluZSBlbWl0X2J5dGUoc3RhdGUsdmFsLGFjdGlvbikgIFwKLQl7ICooc3RhdGUpLT5uZXh0X291dHB1dF9ieXRlKysgPSAoSk9DVEVUKSAodmFsKTsgIFwKLQkgIGlmICgtLShzdGF0ZSktPmZyZWVfaW5fYnVmZmVyID09IDApICBcCi0JICAgIGlmICghIGR1bXBfYnVmZmVyKHN0YXRlKSkgIFwKLQkgICAgICB7IGFjdGlvbjsgfSB9Ci0KLQotTE9DQUwoYm9vbGVhbikKLWR1bXBfYnVmZmVyICh3b3JraW5nX3N0YXRlICogc3RhdGUpCi0vKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlcjsgcmV0dXJuIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0UgaWYgbXVzdCBzdXNwZW5kICovCi17Ci0gIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqIGRlc3QgPSBzdGF0ZS0+Y2luZm8tPmRlc3Q7Ci0KLSAgaWYgKCEgKCpkZXN0LT5lbXB0eV9vdXRwdXRfYnVmZmVyKSAoc3RhdGUtPmNpbmZvKSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qIEFmdGVyIGEgc3VjY2Vzc2Z1bCBidWZmZXIgZHVtcCwgbXVzdCByZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KLSAgc3RhdGUtPm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBzdGF0ZS0+ZnJlZV9pbl9idWZmZXIgPSBkZXN0LT5mcmVlX2luX2J1ZmZlcjsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyogT3V0cHV0dGluZyBiaXRzIHRvIHRoZSBmaWxlICovCi0KLS8qIE9ubHkgdGhlIHJpZ2h0IDI0IGJpdHMgb2YgcHV0X2J1ZmZlciBhcmUgdXNlZDsgdGhlIHZhbGlkIGJpdHMgYXJlCi0gKiBsZWZ0LWp1c3RpZmllZCBpbiB0aGlzIHBhcnQuICBBdCBtb3N0IDE2IGJpdHMgY2FuIGJlIHBhc3NlZCB0byBlbWl0X2JpdHMKLSAqIGluIG9uZSBjYWxsLCBhbmQgd2UgbmV2ZXIgcmV0YWluIG1vcmUgdGhhbiA3IGJpdHMgaW4gcHV0X2J1ZmZlcgotICogYmV0d2VlbiBjYWxscywgc28gMjQgYml0cyBhcmUgc3VmZmljaWVudC4KLSAqLwotCi1JTkxJTkUKLUxPQ0FMKGJvb2xlYW4pCi1lbWl0X2JpdHMgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCBzaXplKQotLyogRW1pdCBzb21lIGJpdHM7IHJldHVybiBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIGlmIG11c3Qgc3VzcGVuZCAqLwotewotICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyB0aWdodGx5LiAqLwotICByZWdpc3RlciBJTlQzMiBwdXRfYnVmZmVyID0gKElOVDMyKSBjb2RlOwotICByZWdpc3RlciBpbnQgcHV0X2JpdHMgPSBzdGF0ZS0+Y3VyLnB1dF9iaXRzOwotCi0gIC8qIGlmIHNpemUgaXMgMCwgY2FsbGVyIHVzZWQgYW4gaW52YWxpZCBIdWZmbWFuIHRhYmxlIGVudHJ5ICovCi0gIGlmIChzaXplID09IDApCi0gICAgRVJSRVhJVChzdGF0ZS0+Y2luZm8sIEpFUlJfSFVGRl9NSVNTSU5HX0NPREUpOwotCi0gIHB1dF9idWZmZXIgJj0gKCgoSU5UMzIpIDEpPDxzaXplKSAtIDE7IC8qIG1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIGNvZGUgKi8KLSAgCi0gIHB1dF9iaXRzICs9IHNpemU7CQkvKiBuZXcgbnVtYmVyIG9mIGJpdHMgaW4gYnVmZmVyICovCi0gIAotICBwdXRfYnVmZmVyIDw8PSAyNCAtIHB1dF9iaXRzOyAvKiBhbGlnbiBpbmNvbWluZyBiaXRzICovCi0KLSAgcHV0X2J1ZmZlciB8PSBzdGF0ZS0+Y3VyLnB1dF9idWZmZXI7IC8qIGFuZCBtZXJnZSB3aXRoIG9sZCBidWZmZXIgY29udGVudHMgKi8KLSAgCi0gIHdoaWxlIChwdXRfYml0cyA+PSA4KSB7Ci0gICAgaW50IGMgPSAoaW50KSAoKHB1dF9idWZmZXIgPj4gMTYpICYgMHhGRik7Ci0gICAgCi0gICAgZW1pdF9ieXRlKHN0YXRlLCBjLCByZXR1cm4gRkFMU0UpOwotICAgIGlmIChjID09IDB4RkYpIHsJCS8qIG5lZWQgdG8gc3R1ZmYgYSB6ZXJvIGJ5dGU/ICovCi0gICAgICBlbWl0X2J5dGUoc3RhdGUsIDAsIHJldHVybiBGQUxTRSk7Ci0gICAgfQotICAgIHB1dF9idWZmZXIgPDw9IDg7Ci0gICAgcHV0X2JpdHMgLT0gODsKLSAgfQotCi0gIHN0YXRlLT5jdXIucHV0X2J1ZmZlciA9IHB1dF9idWZmZXI7IC8qIHVwZGF0ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KLSAgc3RhdGUtPmN1ci5wdXRfYml0cyA9IHB1dF9iaXRzOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1mbHVzaF9iaXRzICh3b3JraW5nX3N0YXRlICogc3RhdGUpCi17Ci0gIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgMHg3RiwgNykpIC8qIGZpbGwgYW55IHBhcnRpYWwgYnl0ZSB3aXRoIG9uZXMgKi8KLSAgICByZXR1cm4gRkFMU0U7Ci0gIHN0YXRlLT5jdXIucHV0X2J1ZmZlciA9IDA7CS8qIGFuZCByZXNldCBiaXQtYnVmZmVyIHRvIGVtcHR5ICovCi0gIHN0YXRlLT5jdXIucHV0X2JpdHMgPSAwOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKiBFbmNvZGUgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KLQotTE9DQUwoYm9vbGVhbikKLWVuY29kZV9vbmVfYmxvY2sgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgSkNPRUZQVFIgYmxvY2ssIGludCBsYXN0X2RjX3ZhbCwKLQkJICBjX2Rlcml2ZWRfdGJsICpkY3RibCwgY19kZXJpdmVkX3RibCAqYWN0YmwpCi17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wLCB0ZW1wMjsKLSAgcmVnaXN0ZXIgaW50IG5iaXRzOwotICByZWdpc3RlciBpbnQgaywgciwgaTsKLSAgCi0gIC8qIEVuY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSBwZXIgc2VjdGlvbiBGLjEuMi4xICovCi0gIAotICB0ZW1wID0gdGVtcDIgPSBibG9ja1swXSAtIGxhc3RfZGNfdmFsOwotCi0gIGlmICh0ZW1wIDwgMCkgewotICAgIHRlbXAgPSAtdGVtcDsJCS8qIHRlbXAgaXMgYWJzIHZhbHVlIG9mIGlucHV0ICovCi0gICAgLyogRm9yIGEgbmVnYXRpdmUgaW5wdXQsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGlucHV0KSAqLwotICAgIC8qIFRoaXMgY29kZSBhc3N1bWVzIHdlIGFyZSBvbiBhIHR3bydzIGNvbXBsZW1lbnQgbWFjaGluZSAqLwotICAgIHRlbXAyLS07Ci0gIH0KLSAgCi0gIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KLSAgbmJpdHMgPSAwOwotICB3aGlsZSAodGVtcCkgewotICAgIG5iaXRzKys7Ci0gICAgdGVtcCA+Pj0gMTsKLSAgfQotICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcy4KLSAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KLSAgICovCi0gIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMrMSkKLSAgICBFUlJFWElUKHN0YXRlLT5jaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOwotICAKLSAgLyogRW1pdCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLwotICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGRjdGJsLT5laHVmY29bbmJpdHNdLCBkY3RibC0+ZWh1ZnNpW25iaXRzXSkpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLwotICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KLSAgaWYgKG5iaXRzKQkJCS8qIGVtaXRfYml0cyByZWplY3RzIGNhbGxzIHdpdGggc2l6ZSAwICovCi0gICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCAodW5zaWduZWQgaW50KSB0ZW1wMiwgbmJpdHMpKQotICAgICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIEVuY29kZSB0aGUgQUMgY29lZmZpY2llbnRzIHBlciBzZWN0aW9uIEYuMS4yLjIgKi8KLSAgCi0gIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCi0gIAotICBmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgewotICAgIGlmICgodGVtcCA9IGJsb2NrW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0pID09IDApIHsKLSAgICAgIHIrKzsKLSAgICB9IGVsc2UgewotICAgICAgLyogaWYgcnVuIGxlbmd0aCA+IDE1LCBtdXN0IGVtaXQgc3BlY2lhbCBydW4tbGVuZ3RoLTE2IGNvZGVzICgweEYwKSAqLwotICAgICAgd2hpbGUgKHIgPiAxNSkgewotCWlmICghIGVtaXRfYml0cyhzdGF0ZSwgYWN0YmwtPmVodWZjb1sweEYwXSwgYWN0YmwtPmVodWZzaVsweEYwXSkpCi0JICByZXR1cm4gRkFMU0U7Ci0JciAtPSAxNjsKLSAgICAgIH0KLQotICAgICAgdGVtcDIgPSB0ZW1wOwotICAgICAgaWYgKHRlbXAgPCAwKSB7Ci0JdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KLQkvKiBUaGlzIGNvZGUgYXNzdW1lcyB3ZSBhcmUgb24gYSB0d28ncyBjb21wbGVtZW50IG1hY2hpbmUgKi8KLQl0ZW1wMi0tOwotICAgICAgfQotICAgICAgCi0gICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gICAgICBuYml0cyA9IDE7CQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLwotICAgICAgd2hpbGUgKCh0ZW1wID4+PSAxKSkKLQluYml0cysrOwotICAgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMgKi8KLSAgICAgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMpCi0JRVJSRVhJVChzdGF0ZS0+Y2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKLSAgICAgIAotICAgICAgLyogRW1pdCBIdWZmbWFuIHN5bWJvbCBmb3IgcnVuIGxlbmd0aCAvIG51bWJlciBvZiBiaXRzICovCi0gICAgICBpID0gKHIgPDwgNCkgKyBuYml0czsKLSAgICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgYWN0YmwtPmVodWZjb1tpXSwgYWN0YmwtPmVodWZzaVtpXSkpCi0JcmV0dXJuIEZBTFNFOwotCi0gICAgICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KLSAgICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLwotICAgICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCAodW5zaWduZWQgaW50KSB0ZW1wMiwgbmJpdHMpKQotCXJldHVybiBGQUxTRTsKLSAgICAgIAotICAgICAgciA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgdGhlIGxhc3QgY29lZihzKSB3ZXJlIHplcm8sIGVtaXQgYW4gZW5kLW9mLWJsb2NrIGNvZGUgKi8KLSAgaWYgKHIgPiAwKQotICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgYWN0YmwtPmVodWZjb1swXSwgYWN0YmwtPmVodWZzaVswXSkpCi0gICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEVtaXQgYSByZXN0YXJ0IG1hcmtlciAmIHJlc3luY2hyb25pemUgcHJlZGljdGlvbnMuCi0gKi8KLQotTE9DQUwoYm9vbGVhbikKLWVtaXRfcmVzdGFydCAod29ya2luZ19zdGF0ZSAqIHN0YXRlLCBpbnQgcmVzdGFydF9udW0pCi17Ci0gIGludCBjaTsKLQotICBpZiAoISBmbHVzaF9iaXRzKHN0YXRlKSkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgZW1pdF9ieXRlKHN0YXRlLCAweEZGLCByZXR1cm4gRkFMU0UpOwotICBlbWl0X2J5dGUoc3RhdGUsIEpQRUdfUlNUMCArIHJlc3RhcnRfbnVtLCByZXR1cm4gRkFMU0UpOwotCi0gIC8qIFJlLWluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBzdGF0ZS0+Y2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCi0gICAgc3RhdGUtPmN1ci5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotCi0gIC8qIFRoZSByZXN0YXJ0IGNvdW50ZXIgaXMgbm90IHVwZGF0ZWQgdW50aWwgd2Ugc3VjY2Vzc2Z1bGx5IHdyaXRlIHRoZSBNQ1UuICovCi0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEVuY29kZSBhbmQgb3V0cHV0IG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZW5jb2RlX21jdV9odWZmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICB3b3JraW5nX3N0YXRlIHN0YXRlOwotICBpbnQgYmxrbiwgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICBzdGF0ZS5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIHN0YXRlLmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotICBBU1NJR05fU1RBVEUoc3RhdGUuY3VyLCBlbnRyb3B5LT5zYXZlZCk7Ci0gIHN0YXRlLmNpbmZvID0gY2luZm87Ci0KLSAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBlbWl0X3Jlc3RhcnQoJnN0YXRlLCBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKSkKLQlyZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBFbmNvZGUgdGhlIE1DVSBkYXRhIGJsb2NrcyAqLwotICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgIGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOwotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgaWYgKCEgZW5jb2RlX29uZV9ibG9jaygmc3RhdGUsCi0JCQkgICBNQ1VfZGF0YVtibGtuXVswXSwgc3RhdGUuY3VyLmxhc3RfZGNfdmFsW2NpXSwKLQkJCSAgIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5kY190Ymxfbm9dLAotCQkJICAgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmFjX3RibF9ub10pKQotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8qIFVwZGF0ZSBsYXN0X2RjX3ZhbCAqLwotICAgIHN0YXRlLmN1ci5sYXN0X2RjX3ZhbFtjaV0gPSBNQ1VfZGF0YVtibGtuXVswXVswXTsKLSAgfQotCi0gIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLwotICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IHN0YXRlLm5leHRfb3V0cHV0X2J5dGU7Ci0gIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IHN0YXRlLmZyZWVfaW5fYnVmZmVyOwotICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlLmN1cik7Ci0KLSAgLyogVXBkYXRlIHJlc3RhcnQtaW50ZXJ2YWwgc3RhdGUgdG9vICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7Ci0gICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSsrOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSAmPSA3OwotICAgIH0KLSAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzc19odWZmIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICB3b3JraW5nX3N0YXRlIHN0YXRlOwotCi0gIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAuLi4gZmx1c2hfYml0cyBuZWVkcyBpdCAqLwotICBzdGF0ZS5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIHN0YXRlLmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotICBBU1NJR05fU1RBVEUoc3RhdGUuY3VyLCBlbnRyb3B5LT5zYXZlZCk7Ci0gIHN0YXRlLmNpbmZvID0gY2luZm87Ci0KLSAgLyogRmx1c2ggb3V0IHRoZSBsYXN0IGRhdGEgKi8KLSAgaWYgKCEgZmx1c2hfYml0cygmc3RhdGUpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKLQotICAvKiBVcGRhdGUgc3RhdGUgKi8KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBzdGF0ZS5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBzdGF0ZS5mcmVlX2luX2J1ZmZlcjsKLSAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZS5jdXIpOwotfQotCi0KLS8qCi0gKiBIdWZmbWFuIGNvZGluZyBvcHRpbWl6YXRpb24uCi0gKgotICogV2UgZmlyc3Qgc2NhbiB0aGUgc3VwcGxpZWQgZGF0YSBhbmQgY291bnQgdGhlIG51bWJlciBvZiB1c2VzIG9mIGVhY2ggc3ltYm9sCi0gKiB0aGF0IGlzIHRvIGJlIEh1ZmZtYW4tY29kZWQuIChUaGlzIHByb2Nlc3MgTVVTVCBhZ3JlZSB3aXRoIHRoZSBjb2RlIGFib3ZlLikKLSAqIFRoZW4gd2UgYnVpbGQgYSBIdWZmbWFuIGNvZGluZyB0cmVlIGZvciB0aGUgb2JzZXJ2ZWQgY291bnRzLgotICogU3ltYm9scyB3aGljaCBhcmUgbm90IG5lZWRlZCBhdCBhbGwgZm9yIHRoZSBwYXJ0aWN1bGFyIGltYWdlIGFyZSBub3QKLSAqIGFzc2lnbmVkIGFueSBjb2RlLCB3aGljaCBzYXZlcyBzcGFjZSBpbiB0aGUgREhUIG1hcmtlciBhcyB3ZWxsIGFzIGluCi0gKiB0aGUgY29tcHJlc3NlZCBkYXRhLgotICovCi0KLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLQotCi0vKiBQcm9jZXNzIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCi0KLUxPQ0FMKHZvaWQpCi1odGVzdF9vbmVfYmxvY2sgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQ09FRlBUUiBibG9jaywgaW50IGxhc3RfZGNfdmFsLAotCQkgbG9uZyBkY19jb3VudHNbXSwgbG9uZyBhY19jb3VudHNbXSkKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIHJlZ2lzdGVyIGludCBuYml0czsKLSAgcmVnaXN0ZXIgaW50IGssIHI7Ci0gIAotICAvKiBFbmNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgcGVyIHNlY3Rpb24gRi4xLjIuMSAqLwotICAKLSAgdGVtcCA9IGJsb2NrWzBdIC0gbGFzdF9kY192YWw7Ci0gIGlmICh0ZW1wIDwgMCkKLSAgICB0ZW1wID0gLXRlbXA7Ci0gIAotICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gIG5iaXRzID0gMDsKLSAgd2hpbGUgKHRlbXApIHsKLSAgICBuYml0cysrOwotICAgIHRlbXAgPj49IDE7Ci0gIH0KLSAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCi0gICAqIFNpbmNlIHdlJ3JlIGVuY29kaW5nIGEgZGlmZmVyZW5jZSwgdGhlIHJhbmdlIGxpbWl0IGlzIHR3aWNlIGFzIG11Y2guCi0gICAqLwotICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOwotCi0gIC8qIENvdW50IHRoZSBIdWZmbWFuIHN5bWJvbCBmb3IgdGhlIG51bWJlciBvZiBiaXRzICovCi0gIGRjX2NvdW50c1tuYml0c10rKzsKLSAgCi0gIC8qIEVuY29kZSB0aGUgQUMgY29lZmZpY2llbnRzIHBlciBzZWN0aW9uIEYuMS4yLjIgKi8KLSAgCi0gIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCi0gIAotICBmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgewotICAgIGlmICgodGVtcCA9IGJsb2NrW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0pID09IDApIHsKLSAgICAgIHIrKzsKLSAgICB9IGVsc2UgewotICAgICAgLyogaWYgcnVuIGxlbmd0aCA+IDE1LCBtdXN0IGVtaXQgc3BlY2lhbCBydW4tbGVuZ3RoLTE2IGNvZGVzICgweEYwKSAqLwotICAgICAgd2hpbGUgKHIgPiAxNSkgewotCWFjX2NvdW50c1sweEYwXSsrOwotCXIgLT0gMTY7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KLSAgICAgIGlmICh0ZW1wIDwgMCkKLQl0ZW1wID0gLXRlbXA7Ci0gICAgICAKLSAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KLSAgICAgIG5iaXRzID0gMTsJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIDEgYml0ICovCi0gICAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQotCW5iaXRzKys7Ci0gICAgICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcyAqLwotICAgICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7Ci0gICAgICAKLSAgICAgIC8qIENvdW50IEh1ZmZtYW4gc3ltYm9sIGZvciBydW4gbGVuZ3RoIC8gbnVtYmVyIG9mIGJpdHMgKi8KLSAgICAgIGFjX2NvdW50c1sociA8PCA0KSArIG5iaXRzXSsrOwotICAgICAgCi0gICAgICByID0gMDsKLSAgICB9Ci0gIH0KLQotICAvKiBJZiB0aGUgbGFzdCBjb2VmKHMpIHdlcmUgemVybywgZW1pdCBhbiBlbmQtb2YtYmxvY2sgY29kZSAqLwotICBpZiAociA+IDApCi0gICAgYWNfY291bnRzWzBdKys7Ci19Ci0KLQotLyoKLSAqIFRyaWFsLWVuY29kZSBvbmUgTUNVJ3Mgd29ydGggb2YgSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4KLSAqIE5vIGRhdGEgaXMgYWN0dWFsbHkgb3V0cHV0LCBzbyBubyBzdXNwZW5zaW9uIHJldHVybiBpcyBwb3NzaWJsZS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfZ2F0aGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgYmxrbiwgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIC8qIFRha2UgY2FyZSBvZiByZXN0YXJ0IGludGVydmFscyBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKLSAgICAgIC8qIFJlLWluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCi0JZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKLSAgICAgIC8qIFVwZGF0ZSByZXN0YXJ0IHN0YXRlICovCi0gICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICAgIH0KLSAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotICB9Ci0KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGh0ZXN0X29uZV9ibG9jayhjaW5mbywgTUNVX2RhdGFbYmxrbl1bMF0sIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSwKLQkJICAgIGVudHJvcHktPmRjX2NvdW50X3B0cnNbY29tcHB0ci0+ZGNfdGJsX25vXSwKLQkJICAgIGVudHJvcHktPmFjX2NvdW50X3B0cnNbY29tcHB0ci0+YWNfdGJsX25vXSk7Ci0gICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gTUNVX2RhdGFbYmxrbl1bMF1bMF07Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogR2VuZXJhdGUgdGhlIGJlc3QgSHVmZm1hbiBjb2RlIHRhYmxlIGZvciB0aGUgZ2l2ZW4gY291bnRzLCBmaWxsIGh0YmwuCi0gKiBOb3RlIHRoaXMgaXMgYWxzbyB1c2VkIGJ5IGpjcGh1ZmYuYy4KLSAqCi0gKiBUaGUgSlBFRyBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IG5vIHN5bWJvbCBiZSBhc3NpZ25lZCBhIGNvZGV3b3JkIG9mIGFsbAotICogb25lIGJpdHMgKHNvIHRoYXQgcGFkZGluZyBiaXRzIGFkZGVkIGF0IHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHNlZ21lbnQKLSAqIGNhbid0IGxvb2sgbGlrZSBhIHZhbGlkIGNvZGUpLiAgQmVjYXVzZSBvZiB0aGUgY2Fub25pY2FsIG9yZGVyaW5nIG9mCi0gKiBjb2Rld29yZHMsIHRoaXMganVzdCBtZWFucyB0aGF0IHRoZXJlIG11c3QgYmUgYW4gdW51c2VkIHNsb3QgaW4gdGhlCi0gKiBsb25nZXN0IGNvZGV3b3JkIGxlbmd0aCBjYXRlZ29yeS4gIFNlY3Rpb24gSy4yIG9mIHRoZSBKUEVHIHNwZWMgc3VnZ2VzdHMKLSAqIHJlc2VydmluZyBzdWNoIGEgc2xvdCBieSBwcmV0ZW5kaW5nIHRoYXQgc3ltYm9sIDI1NiBpcyBhIHZhbGlkIHN5bWJvbAotICogd2l0aCBjb3VudCAxLiAgSW4gdGhlb3J5IHRoYXQncyBub3Qgb3B0aW1hbDsgZ2l2aW5nIGl0IGNvdW50IHplcm8gYnV0Ci0gKiBpbmNsdWRpbmcgaXQgaW4gdGhlIHN5bWJvbCBzZXQgYW55d2F5IHNob3VsZCBnaXZlIGEgYmV0dGVyIEh1ZmZtYW4gY29kZS4KLSAqIEJ1dCB0aGUgdGhlb3JldGljYWxseSBiZXR0ZXIgY29kZSBhY3R1YWxseSBzZWVtcyB0byBjb21lIG91dCB3b3JzZSBpbgotICogcHJhY3RpY2UsIGJlY2F1c2UgaXQgcHJvZHVjZXMgbW9yZSBhbGwtb25lcyBieXRlcyAod2hpY2ggaW5jdXIgc3R1ZmZlZAotICogemVybyBieXRlcyBpbiB0aGUgZmluYWwgZmlsZSkuICBJbiBhbnkgY2FzZSB0aGUgZGlmZmVyZW5jZSBpcyB0aW55LgotICoKLSAqIFRoZSBKUEVHIHN0YW5kYXJkIHJlcXVpcmVzIEh1ZmZtYW4gY29kZXMgdG8gYmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMgbG9uZy4KLSAqIElmIHNvbWUgc3ltYm9scyBoYXZlIGEgdmVyeSBzbWFsbCBidXQgbm9uemVybyBwcm9iYWJpbGl0eSwgdGhlIEh1ZmZtYW4gdHJlZQotICogbXVzdCBiZSBhZGp1c3RlZCB0byBtZWV0IHRoZSBjb2RlIGxlbmd0aCByZXN0cmljdGlvbi4gIFdlIGN1cnJlbnRseSB1c2UKLSAqIHRoZSBhZGp1c3RtZW50IG1ldGhvZCBzdWdnZXN0ZWQgaW4gSlBFRyBzZWN0aW9uIEsuMi4gIFRoaXMgbWV0aG9kIGlzICpub3QqCi0gKiBvcHRpbWFsOyBpdCBtYXkgbm90IGNob29zZSB0aGUgYmVzdCBwb3NzaWJsZSBsaW1pdGVkLWxlbmd0aCBjb2RlLiAgQnV0Ci0gKiB0eXBpY2FsbHkgb25seSB2ZXJ5LWxvdy1mcmVxdWVuY3kgc3ltYm9scyB3aWxsIGJlIGdpdmVuIGxlc3MtdGhhbi1vcHRpbWFsCi0gKiBsZW5ndGhzLCBzbyB0aGUgY29kZSBpcyBhbG1vc3Qgb3B0aW1hbC4gIEV4cGVyaW1lbnRhbCBjb21wYXJpc29ucyBhZ2FpbnN0Ci0gKiBhbiBvcHRpbWFsIGxpbWl0ZWQtbGVuZ3RoLWNvZGUgYWxnb3JpdGhtIGluZGljYXRlIHRoYXQgdGhlIGRpZmZlcmVuY2UgaXMKLSAqIG1pY3Jvc2NvcGljIC0tLSB1c3VhbGx5IGxlc3MgdGhhbiBhIGh1bmRyZWR0aCBvZiBhIHBlcmNlbnQgb2YgdG90YWwgc2l6ZS4KLSAqIFNvIHRoZSBleHRyYSBjb21wbGV4aXR5IG9mIGFuIG9wdGltYWwgYWxnb3JpdGhtIGRvZXNuJ3Qgc2VlbSB3b3J0aHdoaWxlLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19nZW5fb3B0aW1hbF90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpIVUZGX1RCTCAqIGh0YmwsIGxvbmcgZnJlcVtdKQotewotI2RlZmluZSBNQVhfQ0xFTiAzMgkJLyogYXNzdW1lZCBtYXhpbXVtIGluaXRpYWwgY29kZSBsZW5ndGggKi8KLSAgVUlOVDggYml0c1tNQVhfQ0xFTisxXTsJLyogYml0c1trXSA9ICMgb2Ygc3ltYm9scyB3aXRoIGNvZGUgbGVuZ3RoIGsgKi8KLSAgaW50IGNvZGVzaXplWzI1N107CQkvKiBjb2Rlc2l6ZVtrXSA9IGNvZGUgbGVuZ3RoIG9mIHN5bWJvbCBrICovCi0gIGludCBvdGhlcnNbMjU3XTsJCS8qIG5leHQgc3ltYm9sIGluIGN1cnJlbnQgYnJhbmNoIG9mIHRyZWUgKi8KLSAgaW50IGMxLCBjMjsKLSAgaW50IHAsIGksIGo7Ci0gIGxvbmcgdjsKLQotICAvKiBUaGlzIGFsZ29yaXRobSBpcyBleHBsYWluZWQgaW4gc2VjdGlvbiBLLjIgb2YgdGhlIEpQRUcgc3RhbmRhcmQgKi8KLQotICBNRU1aRVJPKGJpdHMsIFNJWkVPRihiaXRzKSk7Ci0gIE1FTVpFUk8oY29kZXNpemUsIFNJWkVPRihjb2Rlc2l6ZSkpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU3OyBpKyspCi0gICAgb3RoZXJzW2ldID0gLTE7CQkvKiBpbml0IGxpbmtzIHRvIGVtcHR5ICovCi0gIAotICBmcmVxWzI1Nl0gPSAxOwkJLyogbWFrZSBzdXJlIDI1NiBoYXMgYSBub256ZXJvIGNvdW50ICovCi0gIC8qIEluY2x1ZGluZyB0aGUgcHNldWRvLXN5bWJvbCAyNTYgaW4gdGhlIEh1ZmZtYW4gcHJvY2VkdXJlIGd1YXJhbnRlZXMKLSAgICogdGhhdCBubyByZWFsIHN5bWJvbCBpcyBnaXZlbiBjb2RlLXZhbHVlIG9mIGFsbCBvbmVzLCBiZWNhdXNlIDI1NgotICAgKiB3aWxsIGJlIHBsYWNlZCBsYXN0IGluIHRoZSBsYXJnZXN0IGNvZGV3b3JkIGNhdGVnb3J5LgotICAgKi8KLQotICAvKiBIdWZmbWFuJ3MgYmFzaWMgYWxnb3JpdGhtIHRvIGFzc2lnbiBvcHRpbWFsIGNvZGUgbGVuZ3RocyB0byBzeW1ib2xzICovCi0KLSAgZm9yICg7OykgewotICAgIC8qIEZpbmQgdGhlIHNtYWxsZXN0IG5vbnplcm8gZnJlcXVlbmN5LCBzZXQgYzEgPSBpdHMgc3ltYm9sICovCi0gICAgLyogSW4gY2FzZSBvZiB0aWVzLCB0YWtlIHRoZSBsYXJnZXIgc3ltYm9sIG51bWJlciAqLwotICAgIGMxID0gLTE7Ci0gICAgdiA9IDEwMDAwMDAwMDBMOwotICAgIGZvciAoaSA9IDA7IGkgPD0gMjU2OyBpKyspIHsKLSAgICAgIGlmIChmcmVxW2ldICYmIGZyZXFbaV0gPD0gdikgewotCXYgPSBmcmVxW2ldOwotCWMxID0gaTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGaW5kIHRoZSBuZXh0IHNtYWxsZXN0IG5vbnplcm8gZnJlcXVlbmN5LCBzZXQgYzIgPSBpdHMgc3ltYm9sICovCi0gICAgLyogSW4gY2FzZSBvZiB0aWVzLCB0YWtlIHRoZSBsYXJnZXIgc3ltYm9sIG51bWJlciAqLwotICAgIGMyID0gLTE7Ci0gICAgdiA9IDEwMDAwMDAwMDBMOwotICAgIGZvciAoaSA9IDA7IGkgPD0gMjU2OyBpKyspIHsKLSAgICAgIGlmIChmcmVxW2ldICYmIGZyZXFbaV0gPD0gdiAmJiBpICE9IGMxKSB7Ci0JdiA9IGZyZXFbaV07Ci0JYzIgPSBpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIERvbmUgaWYgd2UndmUgbWVyZ2VkIGV2ZXJ5dGhpbmcgaW50byBvbmUgZnJlcXVlbmN5ICovCi0gICAgaWYgKGMyIDwgMCkKLSAgICAgIGJyZWFrOwotICAgIAotICAgIC8qIEVsc2UgbWVyZ2UgdGhlIHR3byBjb3VudHMvdHJlZXMgKi8KLSAgICBmcmVxW2MxXSArPSBmcmVxW2MyXTsKLSAgICBmcmVxW2MyXSA9IDA7Ci0KLSAgICAvKiBJbmNyZW1lbnQgdGhlIGNvZGVzaXplIG9mIGV2ZXJ5dGhpbmcgaW4gYzEncyB0cmVlIGJyYW5jaCAqLwotICAgIGNvZGVzaXplW2MxXSsrOwotICAgIHdoaWxlIChvdGhlcnNbYzFdID49IDApIHsKLSAgICAgIGMxID0gb3RoZXJzW2MxXTsKLSAgICAgIGNvZGVzaXplW2MxXSsrOwotICAgIH0KLSAgICAKLSAgICBvdGhlcnNbYzFdID0gYzI7CQkvKiBjaGFpbiBjMiBvbnRvIGMxJ3MgdHJlZSBicmFuY2ggKi8KLSAgICAKLSAgICAvKiBJbmNyZW1lbnQgdGhlIGNvZGVzaXplIG9mIGV2ZXJ5dGhpbmcgaW4gYzIncyB0cmVlIGJyYW5jaCAqLwotICAgIGNvZGVzaXplW2MyXSsrOwotICAgIHdoaWxlIChvdGhlcnNbYzJdID49IDApIHsKLSAgICAgIGMyID0gb3RoZXJzW2MyXTsKLSAgICAgIGNvZGVzaXplW2MyXSsrOwotICAgIH0KLSAgfQotCi0gIC8qIE5vdyBjb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgb2YgZWFjaCBjb2RlIGxlbmd0aCAqLwotICBmb3IgKGkgPSAwOyBpIDw9IDI1NjsgaSsrKSB7Ci0gICAgaWYgKGNvZGVzaXplW2ldKSB7Ci0gICAgICAvKiBUaGUgSlBFRyBzdGFuZGFyZCBzZWVtcyB0byB0aGluayB0aGF0IHRoaXMgY2FuJ3QgaGFwcGVuLCAqLwotICAgICAgLyogYnV0IEknbSBwYXJhbm9pZC4uLiAqLwotICAgICAgaWYgKGNvZGVzaXplW2ldID4gTUFYX0NMRU4pCi0JRVJSRVhJVChjaW5mbywgSkVSUl9IVUZGX0NMRU5fT1ZFUkZMT1cpOwotCi0gICAgICBiaXRzW2NvZGVzaXplW2ldXSsrOwotICAgIH0KLSAgfQotCi0gIC8qIEpQRUcgZG9lc24ndCBhbGxvdyBzeW1ib2xzIHdpdGggY29kZSBsZW5ndGhzIG92ZXIgMTYgYml0cywgc28gaWYgdGhlIHB1cmUKLSAgICogSHVmZm1hbiBwcm9jZWR1cmUgYXNzaWduZWQgYW55IHN1Y2ggbGVuZ3Rocywgd2UgbXVzdCBhZGp1c3QgdGhlIGNvZGluZy4KLSAgICogSGVyZSBpcyB3aGF0IHRoZSBKUEVHIHNwZWMgc2F5cyBhYm91dCBob3cgdGhpcyBuZXh0IGJpdCB3b3JrczoKLSAgICogU2luY2Ugc3ltYm9scyBhcmUgcGFpcmVkIGZvciB0aGUgbG9uZ2VzdCBIdWZmbWFuIGNvZGUsIHRoZSBzeW1ib2xzIGFyZQotICAgKiByZW1vdmVkIGZyb20gdGhpcyBsZW5ndGggY2F0ZWdvcnkgdHdvIGF0IGEgdGltZS4gIFRoZSBwcmVmaXggZm9yIHRoZSBwYWlyCi0gICAqICh3aGljaCBpcyBvbmUgYml0IHNob3J0ZXIpIGlzIGFsbG9jYXRlZCB0byBvbmUgb2YgdGhlIHBhaXI7IHRoZW4sCi0gICAqIHNraXBwaW5nIHRoZSBCSVRTIGVudHJ5IGZvciB0aGF0IHByZWZpeCBsZW5ndGgsIGEgY29kZSB3b3JkIGZyb20gdGhlIG5leHQKLSAgICogc2hvcnRlc3Qgbm9uemVybyBCSVRTIGVudHJ5IGlzIGNvbnZlcnRlZCBpbnRvIGEgcHJlZml4IGZvciB0d28gY29kZSB3b3JkcwotICAgKiBvbmUgYml0IGxvbmdlci4KLSAgICovCi0gIAotICBmb3IgKGkgPSBNQVhfQ0xFTjsgaSA+IDE2OyBpLS0pIHsKLSAgICB3aGlsZSAoYml0c1tpXSA+IDApIHsKLSAgICAgIGogPSBpIC0gMjsJCS8qIGZpbmQgbGVuZ3RoIG9mIG5ldyBwcmVmaXggdG8gYmUgdXNlZCAqLwotICAgICAgd2hpbGUgKGJpdHNbal0gPT0gMCkKLQlqLS07Ci0gICAgICAKLSAgICAgIGJpdHNbaV0gLT0gMjsJCS8qIHJlbW92ZSB0d28gc3ltYm9scyAqLwotICAgICAgYml0c1tpLTFdKys7CQkvKiBvbmUgZ29lcyBpbiB0aGlzIGxlbmd0aCAqLwotICAgICAgYml0c1tqKzFdICs9IDI7CQkvKiB0d28gbmV3IHN5bWJvbHMgaW4gdGhpcyBsZW5ndGggKi8KLSAgICAgIGJpdHNbal0tLTsJCS8qIHN5bWJvbCBvZiB0aGlzIGxlbmd0aCBpcyBub3cgYSBwcmVmaXggKi8KLSAgICB9Ci0gIH0KLQotICAvKiBSZW1vdmUgdGhlIGNvdW50IGZvciB0aGUgcHNldWRvLXN5bWJvbCAyNTYgZnJvbSB0aGUgbGFyZ2VzdCBjb2RlbGVuZ3RoICovCi0gIHdoaWxlIChiaXRzW2ldID09IDApCQkvKiBmaW5kIGxhcmdlc3QgY29kZWxlbmd0aCBzdGlsbCBpbiB1c2UgKi8KLSAgICBpLS07Ci0gIGJpdHNbaV0tLTsKLSAgCi0gIC8qIFJldHVybiBmaW5hbCBzeW1ib2wgY291bnRzIChvbmx5IGZvciBsZW5ndGhzIDAuLjE2KSAqLwotICBNRU1DT1BZKGh0YmwtPmJpdHMsIGJpdHMsIFNJWkVPRihodGJsLT5iaXRzKSk7Ci0gIAotICAvKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBzeW1ib2xzIHNvcnRlZCBieSBjb2RlIGxlbmd0aCAqLwotICAvKiBJdCdzIG5vdCByZWFsIGNsZWFyIHRvIG1lIHdoeSB3ZSBkb24ndCBuZWVkIHRvIGNvbnNpZGVyIHRoZSBjb2RlbGVuZ3RoCi0gICAqIGNoYW5nZXMgbWFkZSBhYm92ZSwgYnV0IHRoZSBKUEVHIHNwZWMgc2VlbXMgdG8gdGhpbmsgdGhpcyB3b3Jrcy4KLSAgICovCi0gIHAgPSAwOwotICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9DTEVOOyBpKyspIHsKLSAgICBmb3IgKGogPSAwOyBqIDw9IDI1NTsgaisrKSB7Ci0gICAgICBpZiAoY29kZXNpemVbal0gPT0gaSkgewotCWh0YmwtPmh1ZmZ2YWxbcF0gPSAoVUlOVDgpIGo7Ci0JcCsrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIFNldCBzZW50X3RhYmxlIEZBTFNFIHNvIHVwZGF0ZWQgdGFibGUgd2lsbCBiZSB3cml0dGVuIHRvIEpQRUcgZmlsZS4gKi8KLSAgaHRibC0+c2VudF90YWJsZSA9IEZBTFNFOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYSBzdGF0aXN0aWNzLWdhdGhlcmluZyBwYXNzIGFuZCBjcmVhdGUgdGhlIG5ldyBIdWZmbWFuIHRhYmxlcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9wYXNzX2dhdGhlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGNpLCBkY3RibCwgYWN0Ymw7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBKSFVGRl9UQkwgKipodGJscHRyOwotICBib29sZWFuIGRpZF9kY1tOVU1fSFVGRl9UQkxTXTsKLSAgYm9vbGVhbiBkaWRfYWNbTlVNX0hVRkZfVEJMU107Ci0KLSAgLyogSXQncyBpbXBvcnRhbnQgbm90IHRvIGFwcGx5IGpwZWdfZ2VuX29wdGltYWxfdGFibGUgbW9yZSB0aGFuIG9uY2UKLSAgICogcGVyIHRhYmxlLCBiZWNhdXNlIGl0IGNsb2JiZXJzIHRoZSBpbnB1dCBmcmVxdWVuY3kgY291bnRzIQotICAgKi8KLSAgTUVNWkVSTyhkaWRfZGMsIFNJWkVPRihkaWRfZGMpKTsKLSAgTUVNWkVSTyhkaWRfYWMsIFNJWkVPRihkaWRfYWMpKTsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgZGN0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87Ci0gICAgYWN0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87Ci0gICAgaWYgKCEgZGlkX2RjW2RjdGJsXSkgewotICAgICAgaHRibHB0ciA9ICYgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbZGN0YmxdOwotICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCi0JKmh0YmxwdHIgPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAganBlZ19nZW5fb3B0aW1hbF90YWJsZShjaW5mbywgKmh0YmxwdHIsIGVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdKTsKLSAgICAgIGRpZF9kY1tkY3RibF0gPSBUUlVFOwotICAgIH0KLSAgICBpZiAoISBkaWRfYWNbYWN0YmxdKSB7Ci0gICAgICBodGJscHRyID0gJiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1thY3RibF07Ci0gICAgICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKLQkqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKGNpbmZvLCAqaHRibHB0ciwgZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0pOwotICAgICAgZGlkX2FjW2FjdGJsXSA9IFRSVUU7Ci0gICAgfQotICB9Ci19Ci0KLQotI2VuZGlmIC8qIEVOVFJPUFlfT1BUX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfaHVmZl9lbmNvZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5OwotICBpbnQgaTsKLQotICBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YoaHVmZl9lbnRyb3B5X2VuY29kZXIpKTsKLSAgY2luZm8tPmVudHJvcHkgPSAoc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyICopIGVudHJvcHk7Ci0gIGVudHJvcHktPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19odWZmOwotCi0gIC8qIE1hcmsgdGFibGVzIHVuYWxsb2NhdGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbaV0gPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbaV0gPSBOVUxMOwotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICAgIGVudHJvcHktPmRjX2NvdW50X3B0cnNbaV0gPSBlbnRyb3B5LT5hY19jb3VudF9wdHJzW2ldID0gTlVMTDsKLSNlbmRpZgotICB9Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY2h1ZmYuaCBiL2xpYmpwZWd0d3JwL2pjaHVmZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTU5OWZjLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjaHVmZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIGpjaHVmZi5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciBIdWZmbWFuIGVudHJvcHkgZW5jb2Rpbmcgcm91dGluZXMKLSAqIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBzZXF1ZW50aWFsIGVuY29kZXIgKGpjaHVmZi5jKSBhbmQgdGhlCi0gKiBwcm9ncmVzc2l2ZSBlbmNvZGVyIChqY3BodWZmLmMpLiAgTm8gb3RoZXIgbW9kdWxlcyBuZWVkIHRvIHNlZSB0aGVzZS4KLSAqLwotCi0vKiBUaGUgbGVnYWwgcmFuZ2Ugb2YgYSBEQ1QgY29lZmZpY2llbnQgaXMKLSAqICAtMTAyNCAuLiArMTAyMyAgZm9yIDgtYml0IGRhdGE7Ci0gKiAtMTYzODQgLi4gKzE2MzgzIGZvciAxMi1iaXQgZGF0YS4KLSAqIEhlbmNlIHRoZSBtYWduaXR1ZGUgc2hvdWxkIGFsd2F5cyBmaXQgaW4gMTAgb3IgMTQgYml0cyByZXNwZWN0aXZlbHkuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIE1BWF9DT0VGX0JJVFMgMTAKLSNlbHNlCi0jZGVmaW5lIE1BWF9DT0VGX0JJVFMgMTQKLSNlbmRpZgotCi0vKiBEZXJpdmVkIGRhdGEgY29uc3RydWN0ZWQgZm9yIGVhY2ggSHVmZm1hbiB0YWJsZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBlaHVmY29bMjU2XTsJLyogY29kZSBmb3IgZWFjaCBzeW1ib2wgKi8KLSAgY2hhciBlaHVmc2lbMjU2XTsJCS8qIGxlbmd0aCBvZiBjb2RlIGZvciBlYWNoIHN5bWJvbCAqLwotICAvKiBJZiBubyBjb2RlIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgYSBzeW1ib2wgUywgZWh1ZnNpW1NdIGNvbnRhaW5zIDAgKi8KLX0gY19kZXJpdmVkX3RibDsKLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsCWpNa0NEZXJpdmVkCi0jZGVmaW5lIGpwZWdfZ2VuX29wdGltYWxfdGFibGUJakdlbk9wdFRibAotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotLyogRXhwYW5kIGEgSHVmZm1hbiB0YWJsZSBkZWZpbml0aW9uIGludG8gdGhlIGRlcml2ZWQgZm9ybWF0ICovCi1FWFRFUk4odm9pZCkganBlZ19tYWtlX2NfZGVyaXZlZF90YmwKLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKLQkgICAgIGNfZGVyaXZlZF90YmwgKiogcGR0YmwpKTsKLQotLyogR2VuZXJhdGUgYW4gb3B0aW1hbCB0YWJsZSBkZWZpbml0aW9uIGdpdmVuIHRoZSBzcGVjaWZpZWQgY291bnRzICovCi1FWFRFUk4odm9pZCkganBlZ19nZW5fb3B0aW1hbF90YWJsZQotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpIVUZGX1RCTCAqIGh0YmwsIGxvbmcgZnJlcVtdKSk7CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY2luaXQuYyBiL2xpYmpwZWd0d3JwL2pjaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZmZmUzLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIGpjaW5pdC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCi0gKiBUaGlzIHJvdXRpbmUgaXMgaW4gY2hhcmdlIG9mIHNlbGVjdGluZyB0aGUgbW9kdWxlcyB0byBiZSBleGVjdXRlZCBhbmQKLSAqIG1ha2luZyBhbiBpbml0aWFsaXphdGlvbiBjYWxsIHRvIGVhY2ggb25lLgotICoKLSAqIExvZ2ljYWxseSwgdGhpcyBjb2RlIGJlbG9uZ3MgaW4gamNtYXN0ZXIuYy4gIEl0J3Mgc3BsaXQgb3V0IGJlY2F1c2UKLSAqIGxpbmtpbmcgdGhpcyByb3V0aW5lIGltcGxpZXMgbGlua2luZyB0aGUgZW50aXJlIGNvbXByZXNzaW9uIGxpYnJhcnkuCi0gKiBGb3IgYSB0cmFuc2NvZGluZy1vbmx5IGFwcGxpY2F0aW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIGpjbWFzdGVyLmMKLSAqIHdpdGhvdXQgbGlua2luZyBpbiB0aGUgd2hvbGUgbGlicmFyeS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyoKLSAqIE1hc3RlciBzZWxlY3Rpb24gb2YgY29tcHJlc3Npb24gbW9kdWxlcy4KLSAqIFRoaXMgaXMgZG9uZSBvbmNlIGF0IHRoZSBzdGFydCBvZiBwcm9jZXNzaW5nIGFuIGltYWdlLiAgV2UgZGV0ZXJtaW5lCi0gKiB3aGljaCBtb2R1bGVzIHdpbGwgYmUgdXNlZCBhbmQgZ2l2ZSB0aGVtIGFwcHJvcHJpYXRlIGluaXRpYWxpemF0aW9uIGNhbGxzLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfY29tcHJlc3NfbWFzdGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgLyogSW5pdGlhbGl6ZSBtYXN0ZXIgY29udHJvbCAoaW5jbHVkZXMgcGFyYW1ldGVyIGNoZWNraW5nL3Byb2Nlc3NpbmcpICovCi0gIGppbml0X2NfbWFzdGVyX2NvbnRyb2woY2luZm8sIEZBTFNFIC8qIGZ1bGwgY29tcHJlc3Npb24gKi8pOwotCi0gIC8qIFByZXByb2Nlc3NpbmcgKi8KLSAgaWYgKCEgY2luZm8tPnJhd19kYXRhX2luKSB7Ci0gICAgamluaXRfY29sb3JfY29udmVydGVyKGNpbmZvKTsKLSAgICBqaW5pdF9kb3duc2FtcGxlcihjaW5mbyk7Ci0gICAgamluaXRfY19wcmVwX2NvbnRyb2xsZXIoY2luZm8sIEZBTFNFIC8qIG5ldmVyIG5lZWQgZnVsbCBidWZmZXIgaGVyZSAqLyk7Ci0gIH0KLSAgLyogRm9yd2FyZCBEQ1QgKi8KLSAgamluaXRfZm9yd2FyZF9kY3QoY2luZm8pOwotICAvKiBFbnRyb3B5IGVuY29kaW5nOiBlaXRoZXIgSHVmZm1hbiBvciBhcml0aG1ldGljIGNvZGluZy4gKi8KLSAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9BUklUSF9OT1RJTVBMKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgICAgamluaXRfcGh1ZmZfZW5jb2RlcihjaW5mbyk7Ci0jZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmCi0gICAgfSBlbHNlCi0gICAgICBqaW5pdF9odWZmX2VuY29kZXIoY2luZm8pOwotICB9Ci0KLSAgLyogTmVlZCBhIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyIGluIGFueSBtdWx0aS1wYXNzIG1vZGUuICovCi0gIGppbml0X2NfY29lZl9jb250cm9sbGVyKGNpbmZvLAotCQkoYm9vbGVhbikgKGNpbmZvLT5udW1fc2NhbnMgPiAxIHx8IGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpKTsKLSAgamluaXRfY19tYWluX2NvbnRyb2xsZXIoY2luZm8sIEZBTFNFIC8qIG5ldmVyIG5lZWQgZnVsbCBidWZmZXIgaGVyZSAqLyk7Ci0KLSAgamluaXRfbWFya2VyX3dyaXRlcihjaW5mbyk7Ci0KLSAgLyogV2UgY2FuIG5vdyB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSB2aXJ0dWFsIGFycmF5cy4gKi8KLSAgKCpjaW5mby0+bWVtLT5yZWFsaXplX3ZpcnRfYXJyYXlzKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotCi0gIC8qIFdyaXRlIHRoZSBkYXRhc3RyZWFtIGhlYWRlciAoU09JKSBpbW1lZGlhdGVseS4KLSAgICogRnJhbWUgYW5kIHNjYW4gaGVhZGVycyBhcmUgcG9zdHBvbmVkIHRpbGwgbGF0ZXIuCi0gICAqIFRoaXMgbGV0cyBhcHBsaWNhdGlvbiBpbnNlcnQgc3BlY2lhbCBtYXJrZXJzIGFmdGVyIHRoZSBTT0kuCi0gICAqLwotICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZpbGVfaGVhZGVyKSAoY2luZm8pOwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNtYWluY3QuYyBiL2xpYmpwZWd0d3JwL2pjbWFpbmN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViN2ZmMjEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNtYWluY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogamNtYWluY3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyIGZvciBjb21wcmVzc2lvbi4KLSAqIFRoZSBtYWluIGJ1ZmZlciBsaWVzIGJldHdlZW4gdGhlIHByZS1wcm9jZXNzb3IgYW5kIHRoZSBKUEVHCi0gKiBjb21wcmVzc29yIHByb3BlcjsgaXQgaG9sZHMgZG93bnNhbXBsZWQgZGF0YSBpbiB0aGUgSlBFRyBjb2xvcnNwYWNlLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBOb3RlOiBjdXJyZW50bHksIHRoZXJlIGlzIG5vIG9wZXJhdGluZyBtb2RlIGluIHdoaWNoIGEgZnVsbC1pbWFnZSBidWZmZXIKLSAqIGlzIG5lZWRlZCBhdCB0aGlzIHN0ZXAuICBJZiB0aGVyZSB3ZXJlLCB0aGF0IG1vZGUgY291bGQgbm90IGJlIHVzZWQgd2l0aAotICogInJhdyBkYXRhIiBpbnB1dCwgc2luY2UgdGhpcyBtb2R1bGUgaXMgYnlwYXNzZWQgaW4gdGhhdCBjYXNlLiAgSG93ZXZlciwKLSAqIHdlJ3ZlIGxlZnQgdGhlIGNvZGUgaGVyZSBmb3IgcG9zc2libGUgdXNlIGluIHNwZWNpYWwgYXBwbGljYXRpb25zLgotICovCi0jdW5kZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLQotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIEpESU1FTlNJT04gY3VyX2lNQ1Vfcm93OwkvKiBudW1iZXIgb2YgY3VycmVudCBpTUNVIHJvdyAqLwotICBKRElNRU5TSU9OIHJvd2dyb3VwX2N0cjsJLyogY291bnRzIHJvdyBncm91cHMgcmVjZWl2ZWQgaW4gaU1DVSByb3cgKi8KLSAgYm9vbGVhbiBzdXNwZW5kZWQ7CQkvKiByZW1lbWJlciBpZiB3ZSBzdXNwZW5kZWQgb3V0cHV0ICovCi0gIEpfQlVGX01PREUgcGFzc19tb2RlOwkJLyogY3VycmVudCBvcGVyYXRpbmcgbW9kZSAqLwotCi0gIC8qIElmIHVzaW5nIGp1c3QgYSBzdHJpcCBidWZmZXIsIHRoaXMgcG9pbnRzIHRvIHRoZSBlbnRpcmUgc2V0IG9mIGJ1ZmZlcnMKLSAgICogKHdlIGFsbG9jYXRlIG9uZSBmb3IgZWFjaCBjb21wb25lbnQpLiAgSW4gdGhlIGZ1bGwtaW1hZ2UgY2FzZSwgdGhpcwotICAgKiBwb2ludHMgdG8gdGhlIGN1cnJlbnRseSBhY2Nlc3NpYmxlIHN0cmlwcyBvZiB0aGUgdmlydHVhbCBhcnJheXMuCi0gICAqLwotICBKU0FNUEFSUkFZIGJ1ZmZlcltNQVhfQ09NUE9ORU5UU107Ci0KLSNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAotICAvKiBJZiB1c2luZyBmdWxsLWltYWdlIHN0b3JhZ2UsIHRoaXMgYXJyYXkgaG9sZHMgcG9pbnRlcnMgdG8gdmlydHVhbC1hcnJheQotICAgKiBjb250cm9sIGJsb2NrcyBmb3IgZWFjaCBjb21wb25lbnQuICBVbnVzZWQgaWYgbm90IGZ1bGwtaW1hZ2Ugc3RvcmFnZS4KLSAgICovCi0gIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2VbTUFYX0NPTVBPTkVOVFNdOwotI2VuZGlmCi19IG15X21haW5fY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9tYWluX2NvbnRyb2xsZXIgKiBteV9tYWluX3B0cjsKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbgotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAotCSAgICAgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKSk7Ci0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLU1FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfYnVmZmVyX21haW4KLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKLQkgICAgIEpESU1FTlNJT04gKmluX3Jvd19jdHIsIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkpOwotI2VuZGlmCi0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19tYWluIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCi17Ci0gIG15X21haW5fcHRyIG1haW5fcHRyID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLQotICAvKiBEbyBub3RoaW5nIGluIHJhdy1kYXRhIG1vZGUuICovCi0gIGlmIChjaW5mby0+cmF3X2RhdGFfaW4pCi0gICAgcmV0dXJuOwotCi0gIG1haW5fcHRyLT5jdXJfaU1DVV9yb3cgPSAwOwkvKiBpbml0aWFsaXplIGNvdW50ZXJzICovCi0gIG1haW5fcHRyLT5yb3dncm91cF9jdHIgPSAwOwotICBtYWluX3B0ci0+c3VzcGVuZGVkID0gRkFMU0U7Ci0gIG1haW5fcHRyLT5wYXNzX21vZGUgPSBwYXNzX21vZGU7CS8qIHNhdmUgbW9kZSBmb3IgdXNlIGJ5IHByb2Nlc3NfZGF0YSAqLwotCi0gIHN3aXRjaCAocGFzc19tb2RlKSB7Ci0gIGNhc2UgSkJVRl9QQVNTX1RIUlU6Ci0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLSAgICBpZiAobWFpbl9wdHItPndob2xlX2ltYWdlWzBdICE9IE5VTEwpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0jZW5kaWYKLSAgICBtYWluX3B0ci0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbjsKLSAgICBicmVhazsKLSNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAotICBjYXNlIEpCVUZfU0FWRV9TT1VSQ0U6Ci0gIGNhc2UgSkJVRl9DUkFOS19ERVNUOgotICBjYXNlIEpCVUZfU0FWRV9BTkRfUEFTUzoKLSAgICBpZiAobWFpbl9wdHItPndob2xlX2ltYWdlWzBdID09IE5VTEwpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgbWFpbl9wdHItPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfYnVmZmVyX21haW47Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEuCi0gKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyB0aGUgc2ltcGxlIHBhc3MtdGhyb3VnaCBtb2RlLAotICogd2hlcmUgd2UgaGF2ZSBvbmx5IGEgc3RyaXAgYnVmZmVyLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCi0JCQkgIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkKLXsKLSAgbXlfbWFpbl9wdHIgbWFpbl9wdHIgPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotCi0gIHdoaWxlIChtYWluX3B0ci0+Y3VyX2lNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgewotICAgIC8qIFJlYWQgaW5wdXQgZGF0YSBpZiB3ZSBoYXZlbid0IGZpbGxlZCB0aGUgbWFpbiBidWZmZXIgeWV0ICovCi0gICAgaWYgKG1haW5fcHRyLT5yb3dncm91cF9jdHIgPCBEQ1RTSVpFKQotICAgICAgKCpjaW5mby0+cHJlcC0+cHJlX3Byb2Nlc3NfZGF0YSkgKGNpbmZvLAotCQkJCQlpbnB1dF9idWYsIGluX3Jvd19jdHIsIGluX3Jvd3NfYXZhaWwsCi0JCQkJCW1haW5fcHRyLT5idWZmZXIsICZtYWluX3B0ci0+cm93Z3JvdXBfY3RyLAotCQkJCQkoSkRJTUVOU0lPTikgRENUU0laRSk7Ci0KLSAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgZnVsbCBpTUNVIHJvdyBidWZmZXJlZCwgcmV0dXJuIHRvIGFwcGxpY2F0aW9uIGZvcgotICAgICAqIG1vcmUgZGF0YS4gIE5vdGUgdGhhdCBwcmVwcm9jZXNzb3Igd2lsbCBhbHdheXMgcGFkIHRvIGZpbGwgdGhlIGlNQ1Ugcm93Ci0gICAgICogYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuCi0gICAgICovCi0gICAgaWYgKG1haW5fcHRyLT5yb3dncm91cF9jdHIgIT0gRENUU0laRSkKLSAgICAgIHJldHVybjsKLQotICAgIC8qIFNlbmQgdGhlIGNvbXBsZXRlZCByb3cgdG8gdGhlIGNvbXByZXNzb3IgKi8KLSAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5jb21wcmVzc19kYXRhKSAoY2luZm8sIG1haW5fcHRyLT5idWZmZXIpKSB7Ci0gICAgICAvKiBJZiBjb21wcmVzc29yIGRpZCBub3QgY29uc3VtZSB0aGUgd2hvbGUgcm93LCB0aGVuIHdlIG11c3QgbmVlZCB0bwotICAgICAgICogc3VzcGVuZCBwcm9jZXNzaW5nIGFuZCByZXR1cm4gdG8gdGhlIGFwcGxpY2F0aW9uLiAgSW4gdGhpcyBzaXR1YXRpb24KLSAgICAgICAqIHdlIHByZXRlbmQgd2UgZGlkbid0IHlldCBjb25zdW1lIHRoZSBsYXN0IGlucHV0IHJvdzsgb3RoZXJ3aXNlLCBpZgotICAgICAgICogaXQgaGFwcGVuZWQgdG8gYmUgdGhlIGxhc3Qgcm93IG9mIHRoZSBpbWFnZSwgdGhlIGFwcGxpY2F0aW9uIHdvdWxkCi0gICAgICAgKiB0aGluayB3ZSB3ZXJlIGRvbmUuCi0gICAgICAgKi8KLSAgICAgIGlmICghIG1haW5fcHRyLT5zdXNwZW5kZWQpIHsKLQkoKmluX3Jvd19jdHIpLS07Ci0JbWFpbl9wdHItPnN1c3BlbmRlZCA9IFRSVUU7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIC8qIFdlIGRpZCBmaW5pc2ggdGhlIHJvdy4gIFVuZG8gb3VyIGxpdHRsZSBzdXNwZW5zaW9uIGhhY2sgaWYgYSBwcmV2aW91cwotICAgICAqIGNhbGwgc3VzcGVuZGVkOyB0aGVuIG1hcmsgdGhlIG1haW4gYnVmZmVyIGVtcHR5LgotICAgICAqLwotICAgIGlmIChtYWluX3B0ci0+c3VzcGVuZGVkKSB7Ci0gICAgICAoKmluX3Jvd19jdHIpKys7Ci0gICAgICBtYWluX3B0ci0+c3VzcGVuZGVkID0gRkFMU0U7Ci0gICAgfQotICAgIG1haW5fcHRyLT5yb3dncm91cF9jdHIgPSAwOwotICAgIG1haW5fcHRyLT5jdXJfaU1DVV9yb3crKzsKLSAgfQotfQotCi0KLSNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEuCi0gKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBhbGwgb2YgdGhlIG1vZGVzIHRoYXQgdXNlIGEgZnVsbC1zaXplIGJ1ZmZlci4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXByb2Nlc3NfZGF0YV9idWZmZXJfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfY3RyLAotCQkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpCi17Ci0gIG15X21haW5fcHRyIG1haW5fcHRyID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBib29sZWFuIHdyaXRpbmcgPSAobWFpbl9wdHItPnBhc3NfbW9kZSAhPSBKQlVGX0NSQU5LX0RFU1QpOwotCi0gIHdoaWxlIChtYWluX3B0ci0+Y3VyX2lNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgewotICAgIC8qIFJlYWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVycyBpZiBhdCB0aGUgc3RhcnQgb2YgYW4gaU1DVSByb3cuICovCi0gICAgaWYgKG1haW5fcHRyLT5yb3dncm91cF9jdHIgPT0gMCkgewotICAgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgICBjaSsrLCBjb21wcHRyKyspIHsKLQltYWluX3B0ci0+YnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotCSAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBtYWluX3B0ci0+d2hvbGVfaW1hZ2VbY2ldLAotCSAgIG1haW5fcHRyLT5jdXJfaU1DVV9yb3cgKiAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpLAotCSAgIChKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpLCB3cml0aW5nKTsKLSAgICAgIH0KLSAgICAgIC8qIEluIGEgcmVhZCBwYXNzLCBwcmV0ZW5kIHdlIGp1c3QgcmVhZCBzb21lIHNvdXJjZSBkYXRhLiAqLwotICAgICAgaWYgKCEgd3JpdGluZykgewotCSppbl9yb3dfY3RyICs9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkU7Ci0JbWFpbl9wdHItPnJvd2dyb3VwX2N0ciA9IERDVFNJWkU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogSWYgYSB3cml0ZSBwYXNzLCByZWFkIGlucHV0IGRhdGEgdW50aWwgdGhlIGN1cnJlbnQgaU1DVSByb3cgaXMgZnVsbC4gKi8KLSAgICAvKiBOb3RlOiBwcmVwcm9jZXNzb3Igd2lsbCBwYWQgaWYgbmVjZXNzYXJ5IHRvIGZpbGwgdGhlIGxhc3QgaU1DVSByb3cuICovCi0gICAgaWYgKHdyaXRpbmcpIHsKLSAgICAgICgqY2luZm8tPnByZXAtPnByZV9wcm9jZXNzX2RhdGEpIChjaW5mbywKLQkJCQkJaW5wdXRfYnVmLCBpbl9yb3dfY3RyLCBpbl9yb3dzX2F2YWlsLAotCQkJCQltYWluX3B0ci0+YnVmZmVyLCAmbWFpbl9wdHItPnJvd2dyb3VwX2N0ciwKLQkJCQkJKEpESU1FTlNJT04pIERDVFNJWkUpOwotICAgICAgLyogUmV0dXJuIHRvIGFwcGxpY2F0aW9uIGlmIHdlIG5lZWQgbW9yZSBkYXRhIHRvIGZpbGwgdGhlIGlNQ1Ugcm93LiAqLwotICAgICAgaWYgKG1haW5fcHRyLT5yb3dncm91cF9jdHIgPCBEQ1RTSVpFKQotCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBFbWl0IGRhdGEsIHVubGVzcyB0aGlzIGlzIGEgc2luay1vbmx5IHBhc3MuICovCi0gICAgaWYgKG1haW5fcHRyLT5wYXNzX21vZGUgIT0gSkJVRl9TQVZFX1NPVVJDRSkgewotICAgICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+Y29tcHJlc3NfZGF0YSkgKGNpbmZvLCBtYWluX3B0ci0+YnVmZmVyKSkgewotCS8qIElmIGNvbXByZXNzb3IgZGlkIG5vdCBjb25zdW1lIHRoZSB3aG9sZSByb3csIHRoZW4gd2UgbXVzdCBuZWVkIHRvCi0JICogc3VzcGVuZCBwcm9jZXNzaW5nIGFuZCByZXR1cm4gdG8gdGhlIGFwcGxpY2F0aW9uLiAgSW4gdGhpcyBzaXR1YXRpb24KLQkgKiB3ZSBwcmV0ZW5kIHdlIGRpZG4ndCB5ZXQgY29uc3VtZSB0aGUgbGFzdCBpbnB1dCByb3c7IG90aGVyd2lzZSwgaWYKLQkgKiBpdCBoYXBwZW5lZCB0byBiZSB0aGUgbGFzdCByb3cgb2YgdGhlIGltYWdlLCB0aGUgYXBwbGljYXRpb24gd291bGQKLQkgKiB0aGluayB3ZSB3ZXJlIGRvbmUuCi0JICovCi0JaWYgKCEgbWFpbl9wdHItPnN1c3BlbmRlZCkgewotCSAgKCppbl9yb3dfY3RyKS0tOwotCSAgbWFpbl9wdHItPnN1c3BlbmRlZCA9IFRSVUU7Ci0JfQotCXJldHVybjsKLSAgICAgIH0KLSAgICAgIC8qIFdlIGRpZCBmaW5pc2ggdGhlIHJvdy4gIFVuZG8gb3VyIGxpdHRsZSBzdXNwZW5zaW9uIGhhY2sgaWYgYSBwcmV2aW91cwotICAgICAgICogY2FsbCBzdXNwZW5kZWQ7IHRoZW4gbWFyayB0aGUgbWFpbiBidWZmZXIgZW1wdHkuCi0gICAgICAgKi8KLSAgICAgIGlmIChtYWluX3B0ci0+c3VzcGVuZGVkKSB7Ci0JKCppbl9yb3dfY3RyKSsrOwotCW1haW5fcHRyLT5zdXNwZW5kZWQgPSBGQUxTRTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBJZiBnZXQgaGVyZSwgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGlNQ1Ugcm93LiAgTWFyayBidWZmZXIgZW1wdHkuICovCi0gICAgbWFpbl9wdHItPnJvd2dyb3VwX2N0ciA9IDA7Ci0gICAgbWFpbl9wdHItPmN1cl9pTUNVX3JvdysrOwotICB9Ci19Ci0KLSNlbmRpZiAvKiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsaXplIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9jX21haW5fY29udHJvbGxlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKLXsKLSAgbXlfbWFpbl9wdHIgbWFpbl9wdHI7Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICBtYWluX3B0ciA9IChteV9tYWluX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9tYWluX2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPm1haW4gPSAoc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgKikgbWFpbl9wdHI7Ci0gIG1haW5fcHRyLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfbWFpbjsKLQotICAvKiBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIGJ1ZmZlciBpbiByYXctZGF0YSBtb2RlLiAqLwotICBpZiAoY2luZm8tPnJhd19kYXRhX2luKQotICAgIHJldHVybjsKLQotICAvKiBDcmVhdGUgdGhlIGJ1ZmZlci4gIEl0IGhvbGRzIGRvd25zYW1wbGVkIGRhdGEsIHNvIGVhY2ggY29tcG9uZW50Ci0gICAqIG1heSBiZSBvZiBhIGRpZmZlcmVudCBzaXplLgotICAgKi8KLSAgaWYgKG5lZWRfZnVsbF9idWZmZXIpIHsKLSNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAotICAgIC8qIEFsbG9jYXRlIGEgZnVsbC1pbWFnZSB2aXJ0dWFsIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudCAqLwotICAgIC8qIE5vdGUgd2UgcGFkIHRoZSBib3R0b20gdG8gYSBtdWx0aXBsZSBvZiB0aGUgaU1DVSBoZWlnaHQgKi8KLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIG1haW5fcHRyLT53aG9sZV9pbWFnZVtjaV0gPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0JIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCi0JCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpICogRENUU0laRSwKLQkgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSkpOwotICAgIH0KLSNlbHNlCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLSAgICBtYWluX3B0ci0+d2hvbGVfaW1hZ2VbMF0gPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLwotI2VuZGlmCi0gICAgLyogQWxsb2NhdGUgYSBzdHJpcCBidWZmZXIgZm9yIGVhY2ggY29tcG9uZW50ICovCi0gICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgY2krKywgY29tcHB0cisrKSB7Ci0gICAgICBtYWluX3B0ci0+YnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCi0JIChKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjbWFya2VyLmMgYi9saWJqcGVndHdycC9qY21hcmtlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDFlNmM2Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjbWFya2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotLyoKLSAqIGpjbWFya2VyLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byB3cml0ZSBKUEVHIGRhdGFzdHJlYW0gbWFya2Vycy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotdHlwZWRlZiBlbnVtIHsJCQkvKiBKUEVHIG1hcmtlciBjb2RlcyAqLwotICBNX1NPRjAgID0gMHhjMCwKLSAgTV9TT0YxICA9IDB4YzEsCi0gIE1fU09GMiAgPSAweGMyLAotICBNX1NPRjMgID0gMHhjMywKLSAgCi0gIE1fU09GNSAgPSAweGM1LAotICBNX1NPRjYgID0gMHhjNiwKLSAgTV9TT0Y3ICA9IDB4YzcsCi0gIAotICBNX0pQRyAgID0gMHhjOCwKLSAgTV9TT0Y5ICA9IDB4YzksCi0gIE1fU09GMTAgPSAweGNhLAotICBNX1NPRjExID0gMHhjYiwKLSAgCi0gIE1fU09GMTMgPSAweGNkLAotICBNX1NPRjE0ID0gMHhjZSwKLSAgTV9TT0YxNSA9IDB4Y2YsCi0gIAotICBNX0RIVCAgID0gMHhjNCwKLSAgCi0gIE1fREFDICAgPSAweGNjLAotICAKLSAgTV9SU1QwICA9IDB4ZDAsCi0gIE1fUlNUMSAgPSAweGQxLAotICBNX1JTVDIgID0gMHhkMiwKLSAgTV9SU1QzICA9IDB4ZDMsCi0gIE1fUlNUNCAgPSAweGQ0LAotICBNX1JTVDUgID0gMHhkNSwKLSAgTV9SU1Q2ICA9IDB4ZDYsCi0gIE1fUlNUNyAgPSAweGQ3LAotICAKLSAgTV9TT0kgICA9IDB4ZDgsCi0gIE1fRU9JICAgPSAweGQ5LAotICBNX1NPUyAgID0gMHhkYSwKLSAgTV9EUVQgICA9IDB4ZGIsCi0gIE1fRE5MICAgPSAweGRjLAotICBNX0RSSSAgID0gMHhkZCwKLSAgTV9ESFAgICA9IDB4ZGUsCi0gIE1fRVhQICAgPSAweGRmLAotICAKLSAgTV9BUFAwICA9IDB4ZTAsCi0gIE1fQVBQMSAgPSAweGUxLAotICBNX0FQUDIgID0gMHhlMiwKLSAgTV9BUFAzICA9IDB4ZTMsCi0gIE1fQVBQNCAgPSAweGU0LAotICBNX0FQUDUgID0gMHhlNSwKLSAgTV9BUFA2ICA9IDB4ZTYsCi0gIE1fQVBQNyAgPSAweGU3LAotICBNX0FQUDggID0gMHhlOCwKLSAgTV9BUFA5ICA9IDB4ZTksCi0gIE1fQVBQMTAgPSAweGVhLAotICBNX0FQUDExID0gMHhlYiwKLSAgTV9BUFAxMiA9IDB4ZWMsCi0gIE1fQVBQMTMgPSAweGVkLAotICBNX0FQUDE0ID0gMHhlZSwKLSAgTV9BUFAxNSA9IDB4ZWYsCi0gIAotICBNX0pQRzAgID0gMHhmMCwKLSAgTV9KUEcxMyA9IDB4ZmQsCi0gIE1fQ09NICAgPSAweGZlLAotICAKLSAgTV9URU0gICA9IDB4MDEsCi0gIAotICBNX0VSUk9SID0gMHgxMDAKLX0gSlBFR19NQVJLRVI7Ci0KLQotLyogUHJpdmF0ZSBzdGF0ZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgdW5zaWduZWQgaW50IGxhc3RfcmVzdGFydF9pbnRlcnZhbDsgLyogbGFzdCBEUkkgdmFsdWUgZW1pdHRlZDsgMCBhZnRlciBTT0kgKi8KLX0gbXlfbWFya2VyX3dyaXRlcjsKLQotdHlwZWRlZiBteV9tYXJrZXJfd3JpdGVyICogbXlfbWFya2VyX3B0cjsKLQotCi0vKgotICogQmFzaWMgb3V0cHV0IHJvdXRpbmVzLgotICoKLSAqIE5vdGUgdGhhdCB3ZSBkbyBub3Qgc3VwcG9ydCBzdXNwZW5zaW9uIHdoaWxlIHdyaXRpbmcgYSBtYXJrZXIuCi0gKiBUaGVyZWZvcmUsIGFuIGFwcGxpY2F0aW9uIHVzaW5nIHN1c3BlbnNpb24gbXVzdCBlbnN1cmUgdGhhdCB0aGVyZSBpcwotICogZW5vdWdoIGJ1ZmZlciBzcGFjZSBmb3IgdGhlIGluaXRpYWwgbWFya2VycyAodHlwLiA2MDAtNzAwIGJ5dGVzKSBiZWZvcmUKLSAqIGNhbGxpbmcganBlZ19zdGFydF9jb21wcmVzcywgYW5kIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgdHJhaWxpbmcgRU9JCi0gKiAoYSBmZXcgYnl0ZXMpIGJlZm9yZSBjYWxsaW5nIGpwZWdfZmluaXNoX2NvbXByZXNzLiAgTXVsdGlwYXNzIGNvbXByZXNzaW9uCi0gKiBtb2RlcyBhcmUgbm90IHN1cHBvcnRlZCBhdCBhbGwgd2l0aCBzdXNwZW5zaW9uLCBzbyB0aG9zZSB0d28gYXJlIHRoZSBvbmx5Ci0gKiBwb2ludHMgd2hlcmUgbWFya2VycyB3aWxsIGJlIHdyaXR0ZW4uCi0gKi8KLQotTE9DQUwodm9pZCkKLWVtaXRfYnl0ZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpCi0vKiBFbWl0IGEgYnl0ZSAqLwotewotICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgKiBkZXN0ID0gY2luZm8tPmRlc3Q7Ci0KLSAgKihkZXN0LT5uZXh0X291dHB1dF9ieXRlKSsrID0gKEpPQ1RFVCkgdmFsOwotICBpZiAoLS1kZXN0LT5mcmVlX2luX2J1ZmZlciA9PSAwKSB7Ci0gICAgaWYgKCEgKCpkZXN0LT5lbXB0eV9vdXRwdXRfYnVmZmVyKSAoY2luZm8pKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOwotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWVtaXRfbWFya2VyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlBFR19NQVJLRVIgbWFyaykKLS8qIEVtaXQgYSBtYXJrZXIgY29kZSAqLwotewotICBlbWl0X2J5dGUoY2luZm8sIDB4RkYpOwotICBlbWl0X2J5dGUoY2luZm8sIChpbnQpIG1hcmspOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0XzJieXRlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWx1ZSkKLS8qIEVtaXQgYSAyLWJ5dGUgaW50ZWdlcjsgdGhlc2UgYXJlIGFsd2F5cyBNU0IgZmlyc3QgaW4gSlBFRyBmaWxlcyAqLwotewotICBlbWl0X2J5dGUoY2luZm8sICh2YWx1ZSA+PiA4KSAmIDB4RkYpOwotICBlbWl0X2J5dGUoY2luZm8sIHZhbHVlICYgMHhGRik7Ci19Ci0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIHdyaXRlIHNwZWNpZmljIG1hcmtlciB0eXBlcy4KLSAqLwotCi1MT0NBTChpbnQpCi1lbWl0X2RxdCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBpbmRleCkKLS8qIEVtaXQgYSBEUVQgbWFya2VyICovCi0vKiBSZXR1cm5zIHRoZSBwcmVjaXNpb24gdXNlZCAoMCA9IDhiaXRzLCAxID0gMTZiaXRzKSBmb3IgYmFzZWxpbmUgY2hlY2tpbmcgKi8KLXsKLSAgSlFVQU5UX1RCTCAqIHF0YmwgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbaW5kZXhdOwotICBpbnQgcHJlYzsKLSAgaW50IGk7Ci0KLSAgaWYgKHF0YmwgPT0gTlVMTCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19RVUFOVF9UQUJMRSwgaW5kZXgpOwotCi0gIHByZWMgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotICAgIGlmIChxdGJsLT5xdWFudHZhbFtpXSA+IDI1NSkKLSAgICAgIHByZWMgPSAxOwotICB9Ci0KLSAgaWYgKCEgcXRibC0+c2VudF90YWJsZSkgewotICAgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RRVCk7Ci0KLSAgICBlbWl0XzJieXRlcyhjaW5mbywgcHJlYyA/IERDVFNJWkUyKjIgKyAxICsgMiA6IERDVFNJWkUyICsgMSArIDIpOwotCi0gICAgZW1pdF9ieXRlKGNpbmZvLCBpbmRleCArIChwcmVjPDw0KSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotICAgICAgLyogVGhlIHRhYmxlIGVudHJpZXMgbXVzdCBiZSBlbWl0dGVkIGluIHppZ3phZyBvcmRlci4gKi8KLSAgICAgIHVuc2lnbmVkIGludCBxdmFsID0gcXRibC0+cXVhbnR2YWxbanBlZ19uYXR1cmFsX29yZGVyW2ldXTsKLSAgICAgIGlmIChwcmVjKQotCWVtaXRfYnl0ZShjaW5mbywgKGludCkgKHF2YWwgPj4gOCkpOwotICAgICAgZW1pdF9ieXRlKGNpbmZvLCAoaW50KSAocXZhbCAmIDB4RkYpKTsKLSAgICB9Ci0KLSAgICBxdGJsLT5zZW50X3RhYmxlID0gVFJVRTsKLSAgfQotCi0gIHJldHVybiBwcmVjOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2RodCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBpbmRleCwgYm9vbGVhbiBpc19hYykKLS8qIEVtaXQgYSBESFQgbWFya2VyICovCi17Ci0gIEpIVUZGX1RCTCAqIGh0Ymw7Ci0gIGludCBsZW5ndGgsIGk7Ci0gIAotICBpZiAoaXNfYWMpIHsKLSAgICBodGJsID0gY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOwotICAgIGluZGV4ICs9IDB4MTA7CQkvKiBvdXRwdXQgaW5kZXggaGFzIEFDIGJpdCBzZXQgKi8KLSAgfSBlbHNlIHsKLSAgICBodGJsID0gY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOwotICB9Ci0KLSAgaWYgKGh0YmwgPT0gTlVMTCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCBpbmRleCk7Ci0gIAotICBpZiAoISBodGJsLT5zZW50X3RhYmxlKSB7Ci0gICAgZW1pdF9tYXJrZXIoY2luZm8sIE1fREhUKTsKLSAgICAKLSAgICBsZW5ndGggPSAwOwotICAgIGZvciAoaSA9IDE7IGkgPD0gMTY7IGkrKykKLSAgICAgIGxlbmd0aCArPSBodGJsLT5iaXRzW2ldOwotICAgIAotICAgIGVtaXRfMmJ5dGVzKGNpbmZvLCBsZW5ndGggKyAyICsgMSArIDE2KTsKLSAgICBlbWl0X2J5dGUoY2luZm8sIGluZGV4KTsKLSAgICAKLSAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspCi0gICAgICBlbWl0X2J5dGUoY2luZm8sIGh0YmwtPmJpdHNbaV0pOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgIGVtaXRfYnl0ZShjaW5mbywgaHRibC0+aHVmZnZhbFtpXSk7Ci0gICAgCi0gICAgaHRibC0+c2VudF90YWJsZSA9IFRSVUU7Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9kYWMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRW1pdCBhIERBQyBtYXJrZXIgKi8KLS8qIFNpbmNlIHRoZSB1c2VmdWwgaW5mbyBpcyBzbyBzbWFsbCwgd2Ugd2FudCB0byBlbWl0IGFsbCB0aGUgdGFibGVzIGluICovCi0vKiBvbmUgREFDIG1hcmtlci4gIFRoZXJlZm9yZSB0aGlzIHJvdXRpbmUgZG9lcyBpdHMgb3duIHNjYW4gb2YgdGhlIHRhYmxlLiAqLwotewotI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAotICBjaGFyIGRjX2luX3VzZVtOVU1fQVJJVEhfVEJMU107Ci0gIGNoYXIgYWNfaW5fdXNlW05VTV9BUklUSF9UQkxTXTsKLSAgaW50IGxlbmd0aCwgaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKQotICAgIGRjX2luX3VzZVtpXSA9IGFjX2luX3VzZVtpXSA9IDA7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXTsKLSAgICBkY19pbl91c2VbY29tcHB0ci0+ZGNfdGJsX25vXSA9IDE7Ci0gICAgYWNfaW5fdXNlW2NvbXBwdHItPmFjX3RibF9ub10gPSAxOwotICB9Ci0gIAotICBsZW5ndGggPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykKLSAgICBsZW5ndGggKz0gZGNfaW5fdXNlW2ldICsgYWNfaW5fdXNlW2ldOwotICAKLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fREFDKTsKLSAgCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCBsZW5ndGgqMiArIDIpOwotICAKLSAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspIHsKLSAgICBpZiAoZGNfaW5fdXNlW2ldKSB7Ci0gICAgICBlbWl0X2J5dGUoY2luZm8sIGkpOwotICAgICAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+YXJpdGhfZGNfTFtpXSArIChjaW5mby0+YXJpdGhfZGNfVVtpXTw8NCkpOwotICAgIH0KLSAgICBpZiAoYWNfaW5fdXNlW2ldKSB7Ci0gICAgICBlbWl0X2J5dGUoY2luZm8sIGkgKyAweDEwKTsKLSAgICAgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmFyaXRoX2FjX0tbaV0pOwotICAgIH0KLSAgfQotI2VuZGlmIC8qIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAqLwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2RyaSAoal9jb21wcmVzc19wdHIgY2luZm8pCi0vKiBFbWl0IGEgRFJJIG1hcmtlciAqLwotewotICBlbWl0X21hcmtlcihjaW5mbywgTV9EUkkpOwotICAKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIDQpOwkvKiBmaXhlZCBsZW5ndGggKi8KLQotICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X3NvZiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpQRUdfTUFSS0VSIGNvZGUpCi0vKiBFbWl0IGEgU09GIG1hcmtlciAqLwotewotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIAotICBlbWl0X21hcmtlcihjaW5mbywgY29kZSk7Ci0gIAotICBlbWl0XzJieXRlcyhjaW5mbywgMyAqIGNpbmZvLT5udW1fY29tcG9uZW50cyArIDIgKyA1ICsgMSk7IC8qIGxlbmd0aCAqLwotCi0gIC8qIE1ha2Ugc3VyZSBpbWFnZSBpc24ndCBiaWdnZXIgdGhhbiBTT0YgZmllbGQgY2FuIGhhbmRsZSAqLwotICBpZiAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgPiA2NTUzNUwgfHwKLSAgICAgIChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggPiA2NTUzNUwpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfSU1BR0VfVE9PX0JJRywgKHVuc2lnbmVkIGludCkgNjU1MzUpOwotCi0gIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmRhdGFfcHJlY2lzaW9uKTsKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5pbWFnZV9oZWlnaHQpOwotICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPmltYWdlX3dpZHRoKTsKLQotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5udW1fY29tcG9uZW50cyk7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBlbWl0X2J5dGUoY2luZm8sIGNvbXBwdHItPmNvbXBvbmVudF9pZCk7Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA8PCA0KSArIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOwotICAgIGVtaXRfYnl0ZShjaW5mbywgY29tcHB0ci0+cXVhbnRfdGJsX25vKTsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X3NvcyAoal9jb21wcmVzc19wdHIgY2luZm8pCi0vKiBFbWl0IGEgU09TIG1hcmtlciAqLwotewotICBpbnQgaSwgdGQsIHRhOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICAKLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fU09TKTsKLSAgCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAyICogY2luZm8tPmNvbXBzX2luX3NjYW4gKyAyICsgMSArIDMpOyAvKiBsZW5ndGggKi8KLSAgCi0gIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmNvbXBzX2luX3NjYW4pOwotICAKLSAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9baV07Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCBjb21wcHRyLT5jb21wb25lbnRfaWQpOwotICAgIHRkID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIHRhID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotICAgICAgLyogUHJvZ3Jlc3NpdmUgbW9kZTogb25seSBEQyBvciBvbmx5IEFDIHRhYmxlcyBhcmUgdXNlZCBpbiBvbmUgc2NhbjsKLSAgICAgICAqIGZ1cnRoZXJtb3JlLCBIdWZmbWFuIGNvZGluZyBvZiBEQyByZWZpbmVtZW50IHVzZXMgbm8gdGFibGUgYXQgYWxsLgotICAgICAgICogV2UgZW1pdCAwIGZvciB1bnVzZWQgZmllbGQocyk7IHRoaXMgaXMgcmVjb21tZW5kZWQgYnkgdGhlIFAmTSB0ZXh0Ci0gICAgICAgKiBidXQgZG9lcyBub3Qgc2VlbSB0byBiZSBzcGVjaWZpZWQgaW4gdGhlIHN0YW5kYXJkLgotICAgICAgICovCi0gICAgICBpZiAoY2luZm8tPlNzID09IDApIHsKLQl0YSA9IDA7CQkJLyogREMgc2NhbiAqLwotCWlmIChjaW5mby0+QWggIT0gMCAmJiAhY2luZm8tPmFyaXRoX2NvZGUpCi0JICB0ZCA9IDA7CQkvKiBubyBEQyB0YWJsZSBlaXRoZXIgKi8KLSAgICAgIH0gZWxzZSB7Ci0JdGQgPSAwOwkJCS8qIEFDIHNjYW4gKi8KLSAgICAgIH0KLSAgICB9Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCAodGQgPDwgNCkgKyB0YSk7Ci0gIH0KLQotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5Tcyk7Ci0gIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPlNlKTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAoY2luZm8tPkFoIDw8IDQpICsgY2luZm8tPkFsKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9qZmlmX2FwcDAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRW1pdCBhIEpGSUYtY29tcGxpYW50IEFQUDAgbWFya2VyICovCi17Ci0gIC8qCi0gICAqIExlbmd0aCBvZiBBUFAwIGJsb2NrCSgyIGJ5dGVzKQotICAgKiBCbG9jayBJRAkJCSg0IGJ5dGVzIC0gQVNDSUkgIkpGSUYiKQotICAgKiBaZXJvIGJ5dGUJCQkoMSBieXRlIHRvIHRlcm1pbmF0ZSB0aGUgSUQgc3RyaW5nKQotICAgKiBWZXJzaW9uIE1ham9yLCBNaW5vcgkoMiBieXRlcyAtIG1ham9yIGZpcnN0KQotICAgKiBVbml0cwkJCSgxIGJ5dGUgLSAweDAwID0gbm9uZSwgMHgwMSA9IGluY2gsIDB4MDIgPSBjbSkKLSAgICogWGRwdQkJCSgyIGJ5dGVzIC0gZG90cyBwZXIgdW5pdCBob3Jpem9udGFsKQotICAgKiBZZHB1CQkJKDIgYnl0ZXMgLSBkb3RzIHBlciB1bml0IHZlcnRpY2FsKQotICAgKiBUaHVtYm5haWwgWCBzaXplCQkoMSBieXRlKQotICAgKiBUaHVtYm5haWwgWSBzaXplCQkoMSBieXRlKQotICAgKi8KLSAgCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX0FQUDApOwotICAKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIDIgKyA0ICsgMSArIDIgKyAxICsgMiArIDIgKyAxICsgMSk7IC8qIGxlbmd0aCAqLwotCi0gIGVtaXRfYnl0ZShjaW5mbywgMHg0QSk7CS8qIElkZW50aWZpZXI6IEFTQ0lJICJKRklGIiAqLwotICBlbWl0X2J5dGUoY2luZm8sIDB4NDYpOwotICBlbWl0X2J5dGUoY2luZm8sIDB4NDkpOwotICBlbWl0X2J5dGUoY2luZm8sIDB4NDYpOwotICBlbWl0X2J5dGUoY2luZm8sIDApOwotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24pOyAvKiBWZXJzaW9uIGZpZWxkcyAqLwotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24pOwotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5kZW5zaXR5X3VuaXQpOyAvKiBQaXhlbCBzaXplIGluZm9ybWF0aW9uICovCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+WF9kZW5zaXR5KTsKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5ZX2RlbnNpdHkpOwotICBlbWl0X2J5dGUoY2luZm8sIDApOwkJLyogTm8gdGh1bWJuYWlsIGltYWdlICovCi0gIGVtaXRfYnl0ZShjaW5mbywgMCk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWVtaXRfYWRvYmVfYXBwMTQgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRW1pdCBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgKi8KLXsKLSAgLyoKLSAgICogTGVuZ3RoIG9mIEFQUDE0IGJsb2NrCSgyIGJ5dGVzKQotICAgKiBCbG9jayBJRAkJCSg1IGJ5dGVzIC0gQVNDSUkgIkFkb2JlIikKLSAgICogVmVyc2lvbiBOdW1iZXIJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDEwMCkKLSAgICogRmxhZ3MwCQkJKDIgYnl0ZXMgLSBjdXJyZW50bHkgMCkKLSAgICogRmxhZ3MxCQkJKDIgYnl0ZXMgLSBjdXJyZW50bHkgMCkKLSAgICogQ29sb3IgdHJhbnNmb3JtCQkoMSBieXRlKQotICAgKgotICAgKiBBbHRob3VnaCBBZG9iZSBUTiA1MTE2IG1lbnRpb25zIFZlcnNpb24gPSAxMDEsIGFsbCB0aGUgQWRvYmUgZmlsZXMKLSAgICogbm93IGluIGNpcmN1bGF0aW9uIHNlZW0gdG8gdXNlIFZlcnNpb24gPSAxMDAsIHNvIHRoYXQncyB3aGF0IHdlIHdyaXRlLgotICAgKgotICAgKiBXZSB3cml0ZSB0aGUgY29sb3IgdHJhbnNmb3JtIGJ5dGUgYXMgMSBpZiB0aGUgSlBFRyBjb2xvciBzcGFjZSBpcwotICAgKiBZQ2JDciwgMiBpZiBpdCdzIFlDQ0ssIDAgb3RoZXJ3aXNlLiAgQWRvYmUncyBkZWZpbml0aW9uIGhhcyB0byBkbyB3aXRoCi0gICAqIHdoZXRoZXIgdGhlIGVuY29kZXIgcGVyZm9ybWVkIGEgdHJhbnNmb3JtYXRpb24sIHdoaWNoIGlzIHByZXR0eSB1c2VsZXNzLgotICAgKi8KLSAgCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX0FQUDE0KTsKLSAgCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAyICsgNSArIDIgKyAyICsgMiArIDEpOyAvKiBsZW5ndGggKi8KLQotICBlbWl0X2J5dGUoY2luZm8sIDB4NDEpOwkvKiBJZGVudGlmaWVyOiBBU0NJSSAiQWRvYmUiICovCi0gIGVtaXRfYnl0ZShjaW5mbywgMHg2NCk7Ci0gIGVtaXRfYnl0ZShjaW5mbywgMHg2Rik7Ci0gIGVtaXRfYnl0ZShjaW5mbywgMHg2Mik7Ci0gIGVtaXRfYnl0ZShjaW5mbywgMHg2NSk7Ci0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAxMDApOwkvKiBWZXJzaW9uICovCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAwKTsJLyogRmxhZ3MwICovCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAwKTsJLyogRmxhZ3MxICovCi0gIHN3aXRjaCAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCAxKTsJLyogQ29sb3IgdHJhbnNmb3JtID0gMSAqLwotICAgIGJyZWFrOwotICBjYXNlIEpDU19ZQ0NLOgotICAgIGVtaXRfYnl0ZShjaW5mbywgMik7CS8qIENvbG9yIHRyYW5zZm9ybSA9IDIgKi8KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBlbWl0X2J5dGUoY2luZm8sIDApOwkvKiBDb2xvciB0cmFuc2Zvcm0gPSAwICovCi0gICAgYnJlYWs7Ci0gIH0KLX0KLQotCi0vKgotICogVGhlc2Ugcm91dGluZXMgYWxsb3cgd3JpdGluZyBhbiBhcmJpdHJhcnkgbWFya2VyIHdpdGggcGFyYW1ldGVycy4KLSAqIFRoZSBvbmx5IGludGVuZGVkIHVzZSBpcyB0byBlbWl0IENPTSBvciBBUFBuIG1hcmtlcnMgYWZ0ZXIgY2FsbGluZwotICogd3JpdGVfZmlsZV9oZWFkZXIgYW5kIGJlZm9yZSBjYWxsaW5nIHdyaXRlX2ZyYW1lX2hlYWRlci4KLSAqIE90aGVyIHVzZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHByb2R1Y2UgZGVzaXJhYmxlIHJlc3VsdHMuCi0gKiBDb3VudGluZyB0aGUgcGFyYW1ldGVyIGJ5dGVzIHByb3Blcmx5IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX21hcmtlcl9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKLS8qIEVtaXQgYW4gYXJiaXRyYXJ5IG1hcmtlciBoZWFkZXIgKi8KLXsKLSAgaWYgKGRhdGFsZW4gPiAodW5zaWduZWQgaW50KSA2NTUzMykJCS8qIHNhZmV0eSBjaGVjayAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7Ci0KLSAgZW1pdF9tYXJrZXIoY2luZm8sIChKUEVHX01BUktFUikgbWFya2VyKTsKLQotICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgKGRhdGFsZW4gKyAyKSk7CS8qIHRvdGFsIGxlbmd0aCAqLwotfQotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX21hcmtlcl9ieXRlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkKLS8qIEVtaXQgb25lIGJ5dGUgb2YgbWFya2VyIHBhcmFtZXRlcnMgZm9sbG93aW5nIHdyaXRlX21hcmtlcl9oZWFkZXIgKi8KLXsKLSAgZW1pdF9ieXRlKGNpbmZvLCB2YWwpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBkYXRhc3RyZWFtIGhlYWRlci4KLSAqIFRoaXMgY29uc2lzdHMgb2YgYW4gU09JIGFuZCBvcHRpb25hbCBBUFBuIG1hcmtlcnMuCi0gKiBXZSByZWNvbW1lbmQgdXNlIG9mIHRoZSBKRklGIG1hcmtlciwgYnV0IG5vdCB0aGUgQWRvYmUgbWFya2VyLAotICogd2hlbiB1c2luZyBZQ2JDciBvciBncmF5c2NhbGUgZGF0YS4gIFRoZSBKRklGIG1hcmtlciBzaG91bGQgTk9UCi0gKiBiZSB1c2VkIGZvciBhbnkgb3RoZXIgSlBFRyBjb2xvcnNwYWNlLiAgVGhlIEFkb2JlIG1hcmtlciBpcyBoZWxwZnVsCi0gKiB0byBkaXN0aW5ndWlzaCBSR0IsIENNWUssIGFuZCBZQ0NLIGNvbG9yc3BhY2VzLgotICogTm90ZSB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiB3cml0ZSBhZGRpdGlvbmFsIGhlYWRlciBtYXJrZXJzIGFmdGVyCi0gKiBqcGVnX3N0YXJ0X2NvbXByZXNzIHJldHVybnMuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9maWxlX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7Ci0KLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fU09JKTsJLyogZmlyc3QgdGhlIFNPSSAqLwotCi0gIC8qIFNPSSBpcyBkZWZpbmVkIHRvIHJlc2V0IHJlc3RhcnQgaW50ZXJ2YWwgdG8gMCAqLwotICBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCA9IDA7Ci0KLSAgaWYgKGNpbmZvLT53cml0ZV9KRklGX2hlYWRlcikJLyogbmV4dCBhbiBvcHRpb25hbCBKRklGIEFQUDAgKi8KLSAgICBlbWl0X2pmaWZfYXBwMChjaW5mbyk7Ci0gIGlmIChjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyKSAvKiBuZXh0IGFuIG9wdGlvbmFsIEFkb2JlIEFQUDE0ICovCi0gICAgZW1pdF9hZG9iZV9hcHAxNChjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIFdyaXRlIGZyYW1lIGhlYWRlci4KLSAqIFRoaXMgY29uc2lzdHMgb2YgRFFUIGFuZCBTT0ZuIG1hcmtlcnMuCi0gKiBOb3RlIHRoYXQgd2UgZG8gbm90IGVtaXQgdGhlIFNPRiB1bnRpbCB3ZSBoYXZlIGVtaXR0ZWQgdGhlIERRVChzKS4KLSAqIFRoaXMgYXZvaWRzIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2l0aCBpbmNvcnJlY3QgaW1wbGVtZW50YXRpb25zIHRoYXQKLSAqIHRyeSB0byBlcnJvci1jaGVjayB0aGUgcXVhbnQgdGFibGUgbnVtYmVycyBhcyBzb29uIGFzIHRoZXkgc2VlIHRoZSBTT0YuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9mcmFtZV9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgY2ksIHByZWM7Ci0gIGJvb2xlYW4gaXNfYmFzZWxpbmU7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIAotICAvKiBFbWl0IERRVCBmb3IgZWFjaCBxdWFudGl6YXRpb24gdGFibGUuCi0gICAqIE5vdGUgdGhhdCBlbWl0X2RxdCgpIHN1cHByZXNzZXMgYW55IGR1cGxpY2F0ZSB0YWJsZXMuCi0gICAqLwotICBwcmVjID0gMDsKLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBwcmVjICs9IGVtaXRfZHF0KGNpbmZvLCBjb21wcHRyLT5xdWFudF90Ymxfbm8pOwotICB9Ci0gIC8qIG5vdyBwcmVjIGlzIG5vbnplcm8gaWZmIHRoZXJlIGFyZSBhbnkgMTYtYml0IHF1YW50IHRhYmxlcy4gKi8KLQotICAvKiBDaGVjayBmb3IgYSBub24tYmFzZWxpbmUgc3BlY2lmaWNhdGlvbi4KLSAgICogTm90ZSB3ZSBhc3N1bWUgdGhhdCBIdWZmbWFuIHRhYmxlIG51bWJlcnMgd29uJ3QgYmUgY2hhbmdlZCBsYXRlci4KLSAgICovCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSB8fCBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSB8fAotICAgICAgY2luZm8tPmRhdGFfcHJlY2lzaW9uICE9IDgpIHsKLSAgICBpc19iYXNlbGluZSA9IEZBTFNFOwotICB9IGVsc2UgewotICAgIGlzX2Jhc2VsaW5lID0gVFJVRTsKLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIGlmIChjb21wcHRyLT5kY190Ymxfbm8gPiAxIHx8IGNvbXBwdHItPmFjX3RibF9ubyA+IDEpCi0JaXNfYmFzZWxpbmUgPSBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHByZWMgJiYgaXNfYmFzZWxpbmUpIHsKLSAgICAgIGlzX2Jhc2VsaW5lID0gRkFMU0U7Ci0gICAgICAvKiBJZiBpdCdzIGJhc2VsaW5lIGV4Y2VwdCBmb3IgcXVhbnRpemVyIHNpemUsIHdhcm4gdGhlIHVzZXIgKi8KLSAgICAgIFRSQUNFTVMoY2luZm8sIDAsIEpUUkNfMTZCSVRfVEFCTEVTKTsKLSAgICB9Ci0gIH0KLQotICAvKiBFbWl0IHRoZSBwcm9wZXIgU09GIG1hcmtlciAqLwotICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKLSAgICBlbWl0X3NvZihjaW5mbywgTV9TT0Y5KTsJLyogU09GIGNvZGUgZm9yIGFyaXRobWV0aWMgY29kaW5nICovCi0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQotICAgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GMik7CS8qIFNPRiBjb2RlIGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuICovCi0gICAgZWxzZSBpZiAoaXNfYmFzZWxpbmUpCi0gICAgICBlbWl0X3NvZihjaW5mbywgTV9TT0YwKTsJLyogU09GIGNvZGUgZm9yIGJhc2VsaW5lIGltcGxlbWVudGF0aW9uICovCi0gICAgZWxzZQotICAgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GMSk7CS8qIFNPRiBjb2RlIGZvciBub24tYmFzZWxpbmUgSHVmZm1hbiBmaWxlICovCi0gIH0KLX0KLQotCi0vKgotICogV3JpdGUgc2NhbiBoZWFkZXIuCi0gKiBUaGlzIGNvbnNpc3RzIG9mIERIVCBvciBEQUMgbWFya2Vycywgb3B0aW9uYWwgRFJJLCBhbmQgU09TLgotICogQ29tcHJlc3NlZCBkYXRhIHdpbGwgYmUgd3JpdHRlbiBmb2xsb3dpbmcgdGhlIFNPUy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX3NjYW5faGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKLSAgaW50IGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7Ci0gICAgLyogRW1pdCBhcml0aCBjb25kaXRpb25pbmcgaW5mby4gIFdlIG1heSBoYXZlIHNvbWUgZHVwbGljYXRpb24KLSAgICAgKiBpZiB0aGUgZmlsZSBoYXMgbXVsdGlwbGUgc2NhbnMsIGJ1dCBpdCdzIHNvIHNtYWxsIGl0J3MgaGFyZGx5Ci0gICAgICogd29ydGggd29ycnlpbmcgYWJvdXQuCi0gICAgICovCi0gICAgZW1pdF9kYWMoY2luZm8pOwotICB9IGVsc2UgewotICAgIC8qIEVtaXQgSHVmZm1hbiB0YWJsZXMuCi0gICAgICogTm90ZSB0aGF0IGVtaXRfZGh0KCkgc3VwcHJlc3NlcyBhbnkgZHVwbGljYXRlIHRhYmxlcy4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykgewotICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldOwotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0JLyogUHJvZ3Jlc3NpdmUgbW9kZTogb25seSBEQyBvciBvbmx5IEFDIHRhYmxlcyBhcmUgdXNlZCBpbiBvbmUgc2NhbiAqLwotCWlmIChjaW5mby0+U3MgPT0gMCkgewotCSAgaWYgKGNpbmZvLT5BaCA9PSAwKQkvKiBEQyBuZWVkcyBubyB0YWJsZSBmb3IgcmVmaW5lbWVudCBzY2FuICovCi0JICAgIGVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5kY190Ymxfbm8sIEZBTFNFKTsKLQl9IGVsc2UgewotCSAgZW1pdF9kaHQoY2luZm8sIGNvbXBwdHItPmFjX3RibF9ubywgVFJVRSk7Ci0JfQotICAgICAgfSBlbHNlIHsKLQkvKiBTZXF1ZW50aWFsIG1vZGU6IG5lZWQgYm90aCBEQyBhbmQgQUMgdGFibGVzICovCi0JZW1pdF9kaHQoY2luZm8sIGNvbXBwdHItPmRjX3RibF9ubywgRkFMU0UpOwotCWVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5hY190Ymxfbm8sIFRSVUUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIEVtaXQgRFJJIGlmIHJlcXVpcmVkIC0tLSBub3RlIHRoYXQgRFJJIHZhbHVlIGNvdWxkIGNoYW5nZSBmb3IgZWFjaCBzY2FuLgotICAgKiBXZSBhdm9pZCB3YXN0aW5nIHNwYWNlIHdpdGggdW5uZWNlc3NhcnkgRFJJcywgaG93ZXZlci4KLSAgICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCAhPSBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCkgewotICAgIGVtaXRfZHJpKGNpbmZvKTsKLSAgICBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICB9Ci0KLSAgZW1pdF9zb3MoY2luZm8pOwotfQotCi0KLS8qCi0gKiBXcml0ZSBkYXRhc3RyZWFtIHRyYWlsZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9maWxlX3RyYWlsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBlbWl0X21hcmtlcihjaW5mbywgTV9FT0kpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBhbiBhYmJyZXZpYXRlZCB0YWJsZS1zcGVjaWZpY2F0aW9uIGRhdGFzdHJlYW0uCi0gKiBUaGlzIGNvbnNpc3RzIG9mIFNPSSwgRFFUIGFuZCBESFQgdGFibGVzLCBhbmQgRU9JLgotICogQW55IHRhYmxlIHRoYXQgaXMgZGVmaW5lZCBhbmQgbm90IG1hcmtlZCBzZW50X3RhYmxlID0gVFJVRSB3aWxsIGJlCi0gKiBlbWl0dGVkLiAgTm90ZSB0aGF0IGFsbCB0YWJsZXMgd2lsbCBiZSBtYXJrZWQgc2VudF90YWJsZSA9IFRSVUUgYXQgZXhpdC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX3RhYmxlc19vbmx5IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaW50IGk7Ci0KLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fU09JKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX1FVQU5UX1RCTFM7IGkrKykgewotICAgIGlmIChjaW5mby0+cXVhbnRfdGJsX3B0cnNbaV0gIT0gTlVMTCkKLSAgICAgICh2b2lkKSBlbWl0X2RxdChjaW5mbywgaSk7Ci0gIH0KLQotICBpZiAoISBjaW5mby0+YXJpdGhfY29kZSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICAgIGlmIChjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpXSAhPSBOVUxMKQotCWVtaXRfZGh0KGNpbmZvLCBpLCBGQUxTRSk7Ci0gICAgICBpZiAoY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaV0gIT0gTlVMTCkKLQllbWl0X2RodChjaW5mbywgaSwgVFJVRSk7Ci0gICAgfQotICB9Ci0KLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRU9JKTsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgbWFya2VyIHdyaXRlciBtb2R1bGUuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9tYXJrZXJfd3JpdGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFya2VyX3B0ciBtYXJrZXI7Ci0KLSAgLyogQ3JlYXRlIHRoZSBzdWJvYmplY3QgKi8KLSAgbWFya2VyID0gKG15X21hcmtlcl9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfbWFya2VyX3dyaXRlcikpOwotICBjaW5mby0+bWFya2VyID0gKHN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgKikgbWFya2VyOwotICAvKiBJbml0aWFsaXplIG1ldGhvZCBwb2ludGVycyAqLwotICBtYXJrZXItPnB1Yi53cml0ZV9maWxlX2hlYWRlciA9IHdyaXRlX2ZpbGVfaGVhZGVyOwotICBtYXJrZXItPnB1Yi53cml0ZV9mcmFtZV9oZWFkZXIgPSB3cml0ZV9mcmFtZV9oZWFkZXI7Ci0gIG1hcmtlci0+cHViLndyaXRlX3NjYW5faGVhZGVyID0gd3JpdGVfc2Nhbl9oZWFkZXI7Ci0gIG1hcmtlci0+cHViLndyaXRlX2ZpbGVfdHJhaWxlciA9IHdyaXRlX2ZpbGVfdHJhaWxlcjsKLSAgbWFya2VyLT5wdWIud3JpdGVfdGFibGVzX29ubHkgPSB3cml0ZV90YWJsZXNfb25seTsKLSAgbWFya2VyLT5wdWIud3JpdGVfbWFya2VyX2hlYWRlciA9IHdyaXRlX21hcmtlcl9oZWFkZXI7Ci0gIG1hcmtlci0+cHViLndyaXRlX21hcmtlcl9ieXRlID0gd3JpdGVfbWFya2VyX2J5dGU7Ci0gIC8qIEluaXRpYWxpemUgcHJpdmF0ZSBzdGF0ZSAqLwotICBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCA9IDA7Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY21hc3Rlci5jIGIvbGlianBlZ3R3cnAvamNtYXN0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiNDAyMC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY21hc3Rlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLS8qCi0gKiBqY21hc3Rlci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgbWFzdGVyIGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCi0gKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggcGFyYW1ldGVyIHZhbGlkYXRpb24sIGluaXRpYWwgc2V0dXAsCi0gKiBhbmQgaW50ZXItcGFzcyBjb250cm9sIChkZXRlcm1pbmluZyB0aGUgbnVtYmVyIG9mIHBhc3NlcyBhbmQgdGhlIHdvcmsgCi0gKiB0byBiZSBkb25lIGluIGVhY2ggcGFzcykuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIFByaXZhdGUgc3RhdGUgKi8KLQotdHlwZWRlZiBlbnVtIHsKLQltYWluX3Bhc3MsCQkvKiBpbnB1dCBkYXRhLCBhbHNvIGRvIGZpcnN0IG91dHB1dCBzdGVwICovCi0JaHVmZl9vcHRfcGFzcywJCS8qIEh1ZmZtYW4gY29kZSBvcHRpbWl6YXRpb24gcGFzcyAqLwotCW91dHB1dF9wYXNzCQkvKiBkYXRhIG91dHB1dCBwYXNzICovCi19IGNfcGFzc190eXBlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGNfcGFzc190eXBlIHBhc3NfdHlwZTsJLyogdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgcGFzcyAqLwotCi0gIGludCBwYXNzX251bWJlcjsJCS8qICMgb2YgcGFzc2VzIGNvbXBsZXRlZCAqLwotICBpbnQgdG90YWxfcGFzc2VzOwkJLyogdG90YWwgIyBvZiBwYXNzZXMgbmVlZGVkICovCi0KLSAgaW50IHNjYW5fbnVtYmVyOwkJLyogY3VycmVudCBpbmRleCBpbiBzY2FuX2luZm9bXSAqLwotfSBteV9jb21wX21hc3RlcjsKLQotdHlwZWRlZiBteV9jb21wX21hc3RlciAqIG15X21hc3Rlcl9wdHI7Ci0KLQotLyoKLSAqIFN1cHBvcnQgcm91dGluZXMgdGhhdCBkbyB2YXJpb3VzIGVzc2VudGlhbCBjYWxjdWxhdGlvbnMuCi0gKi8KLQotTE9DQUwodm9pZCkKLWluaXRpYWxfc2V0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgbWFzdGVyIHNlbGVjdGlvbiBwaGFzZSAqLwotewotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIGxvbmcgc2FtcGxlc3BlcnJvdzsKLSAgSkRJTUVOU0lPTiBqZF9zYW1wbGVzcGVycm93OwotCi0gIC8qIFNhbml0eSBjaGVjayBvbiBpbWFnZSBkaW1lbnNpb25zICovCi0gIGlmIChjaW5mby0+aW1hZ2VfaGVpZ2h0IDw9IDAgfHwgY2luZm8tPmltYWdlX3dpZHRoIDw9IDAKLSAgICAgIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyA8PSAwIHx8IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzIDw9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9FTVBUWV9JTUFHRSk7Ci0KLSAgLyogTWFrZSBzdXJlIGltYWdlIGlzbid0IGJpZ2dlciB0aGFuIEkgY2FuIGhhbmRsZSAqLwotICBpZiAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgPiAobG9uZykgSlBFR19NQVhfRElNRU5TSU9OIHx8Ci0gICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTikKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9JTUFHRV9UT09fQklHLCAodW5zaWduZWQgaW50KSBKUEVHX01BWF9ESU1FTlNJT04pOwotCi0gIC8qIFdpZHRoIG9mIGFuIGlucHV0IHNjYW5saW5lIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyBKRElNRU5TSU9OLiAqLwotICBzYW1wbGVzcGVycm93ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjaW5mby0+aW5wdXRfY29tcG9uZW50czsKLSAgamRfc2FtcGxlc3BlcnJvdyA9IChKRElNRU5TSU9OKSBzYW1wbGVzcGVycm93OwotICBpZiAoKGxvbmcpIGpkX3NhbXBsZXNwZXJyb3cgIT0gc2FtcGxlc3BlcnJvdykKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1dJRFRIX09WRVJGTE9XKTsKLQotICAvKiBGb3Igbm93LCBwcmVjaXNpb24gbXVzdCBtYXRjaCBjb21waWxlZC1pbiB2YWx1ZS4uLiAqLwotICBpZiAoY2luZm8tPmRhdGFfcHJlY2lzaW9uICE9IEJJVFNfSU5fSlNBTVBMRSkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJFQ0lTSU9OLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24pOwotCi0gIC8qIENoZWNrIHRoYXQgbnVtYmVyIG9mIGNvbXBvbmVudHMgd29uJ3QgZXhjZWVkIGludGVybmFsIGFycmF5IHNpemVzICovCi0gIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUE9ORU5UUykKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKLQkgICAgIE1BWF9DT01QT05FTlRTKTsKLQotICAvKiBDb21wdXRlIG1heGltdW0gc2FtcGxpbmcgZmFjdG9yczsgY2hlY2sgZmFjdG9yIHZhbGlkaXR5ICovCi0gIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IDE7Ci0gIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IDE7Ci0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IgfHwKLQljb21wcHRyLT52X3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfU0FNUExJTkcpOwotICAgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IsCi0JCQkJICAgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcik7Ci0gICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJCQkgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgfQotCi0gIC8qIENvbXB1dGUgZGltZW5zaW9ucyBvZiBjb21wb25lbnRzICovCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgLyogRmlsbCBpbiB0aGUgY29ycmVjdCBjb21wb25lbnRfaW5kZXggdmFsdWU7IGRvbid0IHJlbHkgb24gYXBwbGljYXRpb24gKi8KLSAgICBjb21wcHRyLT5jb21wb25lbnRfaW5kZXggPSBjaTsKLSAgICAvKiBGb3IgY29tcHJlc3Npb24sIHdlIG5ldmVyIGRvIERDVCBzY2FsaW5nLiAqLwotICAgIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7Ci0gICAgLyogU2l6ZSBpbiBEQ1QgYmxvY2tzICovCi0gICAgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKLQkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkpOwotICAgIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLQkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSkpOwotICAgIC8qIFNpemUgaW4gc2FtcGxlcyAqLwotICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKLQkJICAgIChsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpOwotICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7Ci0gICAgLyogTWFyayBjb21wb25lbnQgbmVlZGVkICh0aGlzIGZsYWcgaXNuJ3QgYWN0dWFsbHkgdXNlZCBmb3IgY29tcHJlc3Npb24pICovCi0gICAgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCA9IFRSVUU7Ci0gIH0KLQotICAvKiBDb21wdXRlIG51bWJlciBvZiBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93cyAobnVtYmVyIG9mIHRpbWVzIHRoYXQKLSAgICogbWFpbiBjb250cm9sbGVyIHdpbGwgY2FsbCBjb2VmZmljaWVudCBjb250cm9sbGVyKS4KLSAgICovCi0gIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgPSAoSkRJTUVOU0lPTikKLSAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAotCQkgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKLX0KLQotCi0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0KLUxPQ0FMKHZvaWQpCi12YWxpZGF0ZV9zY3JpcHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogVmVyaWZ5IHRoYXQgdGhlIHNjYW4gc2NyaXB0IGluIGNpbmZvLT5zY2FuX2luZm9bXSBpcyB2YWxpZDsgYWxzbwotICogZGV0ZXJtaW5lIHdoZXRoZXIgaXQgdXNlcyBwcm9ncmVzc2l2ZSBKUEVHLCBhbmQgc2V0IGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlLgotICovCi17Ci0gIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0cjsKLSAgaW50IHNjYW5ubywgbmNvbXBzLCBjaSwgY29lZmksIHRoaXNpOwotICBpbnQgU3MsIFNlLCBBaCwgQWw7Ci0gIGJvb2xlYW4gY29tcG9uZW50X3NlbnRbTUFYX0NPTVBPTkVOVFNdOwotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gIGludCAqIGxhc3RfYml0cG9zX3B0cjsKLSAgaW50IGxhc3RfYml0cG9zW01BWF9DT01QT05FTlRTXVtEQ1RTSVpFMl07Ci0gIC8qIC0xIHVudGlsIHRoYXQgY29lZmZpY2llbnQgaGFzIGJlZW4gc2VlbjsgdGhlbiBsYXN0IEFsIGZvciBpdCAqLwotI2VuZGlmCi0KLSAgaWYgKGNpbmZvLT5udW1fc2NhbnMgPD0gMCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU0NBTl9TQ1JJUFQsIDApOwotCi0gIC8qIEZvciBzZXF1ZW50aWFsIEpQRUcsIGFsbCBzY2FucyBtdXN0IGhhdmUgU3M9MCwgU2U9RENUU0laRTItMTsKLSAgICogZm9yIHByb2dyZXNzaXZlIEpQRUcsIG5vIHNjYW4gY2FuIGhhdmUgdGhpcy4KLSAgICovCi0gIHNjYW5wdHIgPSBjaW5mby0+c2Nhbl9pbmZvOwotICBpZiAoc2NhbnB0ci0+U3MgIT0gMCB8fCBzY2FucHRyLT5TZSAhPSBEQ1RTSVpFMi0xKSB7Ci0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSA9IFRSVUU7Ci0gICAgbGFzdF9iaXRwb3NfcHRyID0gJiBsYXN0X2JpdHBvc1swXVswXTsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIAotICAgICAgZm9yIChjb2VmaSA9IDA7IGNvZWZpIDwgRENUU0laRTI7IGNvZWZpKyspCi0JKmxhc3RfYml0cG9zX3B0cisrID0gLTE7Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gRkFMU0U7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSAKLSAgICAgIGNvbXBvbmVudF9zZW50W2NpXSA9IEZBTFNFOwotICB9Ci0KLSAgZm9yIChzY2Fubm8gPSAxOyBzY2Fubm8gPD0gY2luZm8tPm51bV9zY2Fuczsgc2NhbnB0cisrLCBzY2Fubm8rKykgewotICAgIC8qIFZhbGlkYXRlIGNvbXBvbmVudCBpbmRleGVzICovCi0gICAgbmNvbXBzID0gc2NhbnB0ci0+Y29tcHNfaW5fc2NhbjsKLSAgICBpZiAobmNvbXBzIDw9IDAgfHwgbmNvbXBzID4gTUFYX0NPTVBTX0lOX1NDQU4pCi0gICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIG5jb21wcywgTUFYX0NPTVBTX0lOX1NDQU4pOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgewotICAgICAgdGhpc2kgPSBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldOwotICAgICAgaWYgKHRoaXNpIDwgMCB8fCB0aGlzaSA+PSBjaW5mby0+bnVtX2NvbXBvbmVudHMpCi0JRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOwotICAgICAgLyogQ29tcG9uZW50cyBtdXN0IGFwcGVhciBpbiBTT0Ygb3JkZXIgd2l0aGluIGVhY2ggc2NhbiAqLwotICAgICAgaWYgKGNpID4gMCAmJiB0aGlzaSA8PSBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ktMV0pCi0JRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOwotICAgIH0KLSAgICAvKiBWYWxpZGF0ZSBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzICovCi0gICAgU3MgPSBzY2FucHRyLT5TczsKLSAgICBTZSA9IHNjYW5wdHItPlNlOwotICAgIEFoID0gc2NhbnB0ci0+QWg7Ci0gICAgQWwgPSBzY2FucHRyLT5BbDsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgICAgLyogVGhlIEpQRUcgc3BlYyBzaW1wbHkgZ2l2ZXMgdGhlIHJhbmdlcyAwLi4xMyBmb3IgQWggYW5kIEFsLCBidXQgdGhhdAotICAgICAgICogc2VlbXMgd3Jvbmc6IHRoZSB1cHBlciBib3VuZCBvdWdodCB0byBkZXBlbmQgb24gZGF0YSBwcmVjaXNpb24uCi0gICAgICAgKiBQZXJoYXBzIHRoZXkgcmVhbGx5IG1lYW50IDAuLk4rMSBmb3IgTi1iaXQgcHJlY2lzaW9uLgotICAgICAgICogSGVyZSB3ZSBhbGxvdyAwLi4xMCBmb3IgOC1iaXQgZGF0YTsgQWwgbGFyZ2VyIHRoYW4gMTAgcmVzdWx0cyBpbgotICAgICAgICogb3V0LW9mLXJhbmdlIHJlY29uc3RydWN0ZWQgREMgdmFsdWVzIGR1cmluZyB0aGUgZmlyc3QgREMgc2NhbiwKLSAgICAgICAqIHdoaWNoIG1pZ2h0IGNhdXNlIHByb2JsZW1zIGZvciBzb21lIGRlY29kZXJzLgotICAgICAgICovCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgTUFYX0FIX0FMIDEwCi0jZWxzZQotI2RlZmluZSBNQVhfQUhfQUwgMTMKLSNlbmRpZgotICAgICAgaWYgKFNzIDwgMCB8fCBTcyA+PSBEQ1RTSVpFMiB8fCBTZSA8IFNzIHx8IFNlID49IERDVFNJWkUyIHx8Ci0JICBBaCA8IDAgfHwgQWggPiBNQVhfQUhfQUwgfHwgQWwgPCAwIHx8IEFsID4gTUFYX0FIX0FMKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKLSAgICAgIGlmIChTcyA9PSAwKSB7Ci0JaWYgKFNlICE9IDApCQkvKiBEQyBhbmQgQUMgdG9nZXRoZXIgbm90IE9LICovCi0JICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7Ci0gICAgICB9IGVsc2UgewotCWlmIChuY29tcHMgIT0gMSkJLyogQUMgc2NhbnMgbXVzdCBiZSBmb3Igb25seSBvbmUgY29tcG9uZW50ICovCi0JICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspIHsKLQlsYXN0X2JpdHBvc19wdHIgPSAmIGxhc3RfYml0cG9zW3NjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV1dWzBdOwotCWlmIChTcyAhPSAwICYmIGxhc3RfYml0cG9zX3B0clswXSA8IDApIC8qIEFDIHdpdGhvdXQgcHJpb3IgREMgc2NhbiAqLwotCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOwotCWZvciAoY29lZmkgPSBTczsgY29lZmkgPD0gU2U7IGNvZWZpKyspIHsKLQkgIGlmIChsYXN0X2JpdHBvc19wdHJbY29lZmldIDwgMCkgewotCSAgICAvKiBmaXJzdCBzY2FuIG9mIHRoaXMgY29lZmZpY2llbnQgKi8KLQkgICAgaWYgKEFoICE9IDApCi0JICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOwotCSAgfSBlbHNlIHsKLQkgICAgLyogbm90IGZpcnN0IHNjYW4gKi8KLQkgICAgaWYgKEFoICE9IGxhc3RfYml0cG9zX3B0cltjb2VmaV0gfHwgQWwgIT0gQWgtMSkKLQkgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7Ci0JICB9Ci0JICBsYXN0X2JpdHBvc19wdHJbY29lZmldID0gQWw7Ci0JfQotICAgICAgfQotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEZvciBzZXF1ZW50aWFsIEpQRUcsIGFsbCBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzIG11c3QgYmUgdGhlc2U6ICovCi0gICAgICBpZiAoU3MgIT0gMCB8fCBTZSAhPSBEQ1RTSVpFMi0xIHx8IEFoICE9IDAgfHwgQWwgIT0gMCkKLQlFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7Ci0gICAgICAvKiBNYWtlIHN1cmUgY29tcG9uZW50cyBhcmUgbm90IHNlbnQgdHdpY2UgKi8KLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgewotCXRoaXNpID0gc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXTsKLQlpZiAoY29tcG9uZW50X3NlbnRbdGhpc2ldKQotCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOwotCWNvbXBvbmVudF9zZW50W3RoaXNpXSA9IFRSVUU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogTm93IHZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgZ290IHNlbnQuICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgLyogRm9yIHByb2dyZXNzaXZlIG1vZGUsIHdlIG9ubHkgY2hlY2sgdGhhdCBhdCBsZWFzdCBzb21lIERDIGRhdGEKLSAgICAgKiBnb3Qgc2VudCBmb3IgZWFjaCBjb21wb25lbnQ7IHRoZSBzcGVjIGRvZXMgbm90IHJlcXVpcmUgdGhhdCBhbGwgYml0cwotICAgICAqIG9mIGFsbCBjb2VmZmljaWVudHMgYmUgdHJhbnNtaXR0ZWQuICBXb3VsZCBpdCBiZSB3aXNlciB0byBlbmZvcmNlCi0gICAgICogdHJhbnNtaXNzaW9uIG9mIGFsbCBjb2VmZmljaWVudCBiaXRzPz8KLSAgICAgKi8KLSAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICAgIGlmIChsYXN0X2JpdHBvc1tjaV1bMF0gPCAwKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfTUlTU0lOR19EQVRBKTsKLSAgICB9Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICAgIGlmICghIGNvbXBvbmVudF9zZW50W2NpXSkKLQlFUlJFWElUKGNpbmZvLCBKRVJSX01JU1NJTkdfREFUQSk7Ci0gICAgfQotICB9Ci19Ci0KLSNlbmRpZiAvKiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KLQotCi1MT0NBTCh2b2lkKQotc2VsZWN0X3NjYW5fcGFyYW1ldGVycyAoal9jb21wcmVzc19wdHIgY2luZm8pCi0vKiBTZXQgdXAgdGhlIHNjYW4gcGFyYW1ldGVycyBmb3IgdGhlIGN1cnJlbnQgc2NhbiAqLwotewotICBpbnQgY2k7Ci0KLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgaWYgKGNpbmZvLT5zY2FuX2luZm8gIT0gTlVMTCkgewotICAgIC8qIFByZXBhcmUgZm9yIGN1cnJlbnQgc2NhbiAtLS0gdGhlIHNjcmlwdCBpcyBhbHJlYWR5IHZhbGlkYXRlZCAqLwotICAgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7Ci0gICAgY29uc3QganBlZ19zY2FuX2luZm8gKiBzY2FucHRyID0gY2luZm8tPnNjYW5faW5mbyArIG1hc3Rlci0+c2Nhbl9udW1iZXI7Ci0KLSAgICBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IHNjYW5wdHItPmNvbXBzX2luX3NjYW47Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgICAgY2luZm8tPmN1cl9jb21wX2luZm9bY2ldID0KLQkmY2luZm8tPmNvbXBfaW5mb1tzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldXTsKLSAgICB9Ci0gICAgY2luZm8tPlNzID0gc2NhbnB0ci0+U3M7Ci0gICAgY2luZm8tPlNlID0gc2NhbnB0ci0+U2U7Ci0gICAgY2luZm8tPkFoID0gc2NhbnB0ci0+QWg7Ci0gICAgY2luZm8tPkFsID0gc2NhbnB0ci0+QWw7Ci0gIH0KLSAgZWxzZQotI2VuZGlmCi0gIHsKLSAgICAvKiBQcmVwYXJlIGZvciBzaW5nbGUgc2VxdWVudGlhbC1KUEVHIHNjYW4gY29udGFpbmluZyBhbGwgY29tcG9uZW50cyAqLwotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUFNfSU5fU0NBTikKLSAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPm51bV9jb21wb25lbnRzLAotCSAgICAgICBNQVhfQ09NUFNfSU5fU0NBTik7Ci0gICAgY2luZm8tPmNvbXBzX2luX3NjYW4gPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgICBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0gPSAmY2luZm8tPmNvbXBfaW5mb1tjaV07Ci0gICAgfQotICAgIGNpbmZvLT5TcyA9IDA7Ci0gICAgY2luZm8tPlNlID0gRENUU0laRTItMTsKLSAgICBjaW5mby0+QWggPSAwOwotICAgIGNpbmZvLT5BbCA9IDA7Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotcGVyX3NjYW5fc2V0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgcHJvY2Vzc2luZyBhIEpQRUcgc2NhbiAqLwotLyogY2luZm8tPmNvbXBzX2luX3NjYW4gYW5kIGNpbmZvLT5jdXJfY29tcF9pbmZvW10gYXJlIGFscmVhZHkgc2V0ICovCi17Ci0gIGludCBjaSwgbWN1YmxrcywgdG1wOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICAKLSAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID09IDEpIHsKLSAgICAKLSAgICAvKiBOb25pbnRlcmxlYXZlZCAoc2luZ2xlLWNvbXBvbmVudCkgc2NhbiAqLwotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXTsKLSAgICAKLSAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLwotICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0gICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwotICAgIAotICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FuLCBhbHdheXMgb25lIGJsb2NrIHBlciBNQ1UgKi8KLSAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSAxOwotICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSAxOwotICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSAxOwotICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBEQ1RTSVpFOwotICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gMTsKLSAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbnMsIGl0IGlzIGNvbnZlbmllbnQgdG8gZGVmaW5lIGxhc3Rfcm93X2hlaWdodAotICAgICAqIGFzIHRoZSBudW1iZXIgb2YgYmxvY2sgcm93cyBwcmVzZW50IGluIHRoZSBsYXN0IGlNQ1Ugcm93LgotICAgICAqLwotICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgIGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCA9IHRtcDsKLSAgICAKLSAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCi0gICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAxOwotICAgIGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFswXSA9IDA7Ci0gICAgCi0gIH0gZWxzZSB7Ci0gICAgCi0gICAgLyogSW50ZXJsZWF2ZWQgKG11bHRpLWNvbXBvbmVudCkgc2NhbiAqLwotICAgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA8PSAwIHx8IGNpbmZvLT5jb21wc19pbl9zY2FuID4gTUFYX0NPTVBTX0lOX1NDQU4pCi0gICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5jb21wc19pbl9zY2FuLAotCSAgICAgICBNQVhfQ09NUFNfSU5fU0NBTik7Ci0gICAgCi0gICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KLSAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7Ci0gICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7Ci0gICAgCi0gICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAwOwotICAgIAotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgICAgLyogU2FtcGxpbmcgZmFjdG9ycyBnaXZlICMgb2YgYmxvY2tzIG9mIGNvbXBvbmVudCBpbiBlYWNoIE1DVSAqLwotICAgICAgY29tcHB0ci0+TUNVX3dpZHRoID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IGNvbXBwdHItPk1DVV93aWR0aCAqIGNvbXBwdHItPk1DVV9oZWlnaHQ7Ci0gICAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+TUNVX3dpZHRoICogRENUU0laRTsKLSAgICAgIC8qIEZpZ3VyZSBudW1iZXIgb2Ygbm9uLWR1bW15IGJsb2NrcyBpbiBsYXN0IE1DVSBjb2x1bW4gJiByb3cgKi8KLSAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgJSBjb21wcHRyLT5NQ1Vfd2lkdGgpOwotICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1Vfd2lkdGg7Ci0gICAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IHRtcDsKLSAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX2hlaWdodCk7Ci0gICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV9oZWlnaHQ7Ci0gICAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7Ci0gICAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCi0gICAgICBtY3VibGtzID0gY29tcHB0ci0+TUNVX2Jsb2NrczsKLSAgICAgIGlmIChjaW5mby0+YmxvY2tzX2luX01DVSArIG1jdWJsa3MgPiBDX01BWF9CTE9DS1NfSU5fTUNVKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX01DVV9TSVpFKTsKLSAgICAgIHdoaWxlIChtY3VibGtzLS0gPiAwKSB7Ci0JY2luZm8tPk1DVV9tZW1iZXJzaGlwW2NpbmZvLT5ibG9ja3NfaW5fTUNVKytdID0gY2k7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci0KLSAgLyogQ29udmVydCByZXN0YXJ0IHNwZWNpZmllZCBpbiByb3dzIHRvIGFjdHVhbCBNQ1UgY291bnQuICovCi0gIC8qIE5vdGUgdGhhdCBjb3VudCBtdXN0IGZpdCBpbiAxNiBiaXRzLCBzbyB3ZSBwcm92aWRlIGxpbWl0aW5nLiAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW5fcm93cyA+IDApIHsKLSAgICBsb25nIG5vbWluYWwgPSAobG9uZykgY2luZm8tPnJlc3RhcnRfaW5fcm93cyAqIChsb25nKSBjaW5mby0+TUNVc19wZXJfcm93OwotICAgIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gKHVuc2lnbmVkIGludCkgTUlOKG5vbWluYWwsIDY1NTM1TCk7Ci0gIH0KLX0KLQotCi0vKgotICogUGVyLXBhc3Mgc2V0dXAuCi0gKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGFzcy4gIFdlIGRldGVybWluZSB3aGljaCBtb2R1bGVzCi0gKiB3aWxsIGJlIGFjdGl2ZSBkdXJpbmcgdGhpcyBwYXNzIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUgc3RhcnRfcGFzcyBjYWxscy4KLSAqIFdlIGFsc28gc2V0IGlzX2xhc3RfcGFzcyB0byBpbmRpY2F0ZSB3aGV0aGVyIGFueSBtb3JlIHBhc3NlcyB3aWxsIGJlCi0gKiByZXF1aXJlZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXByZXBhcmVfZm9yX3Bhc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotCi0gIHN3aXRjaCAobWFzdGVyLT5wYXNzX3R5cGUpIHsKLSAgY2FzZSBtYWluX3Bhc3M6Ci0gICAgLyogSW5pdGlhbCBwYXNzOiB3aWxsIGNvbGxlY3QgaW5wdXQgZGF0YSwgYW5kIGRvIGVpdGhlciBIdWZmbWFuCi0gICAgICogb3B0aW1pemF0aW9uIG9yIGRhdGEgb3V0cHV0IGZvciB0aGUgZmlyc3Qgc2Nhbi4KLSAgICAgKi8KLSAgICBzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzKGNpbmZvKTsKLSAgICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7Ci0gICAgaWYgKCEgY2luZm8tPnJhd19kYXRhX2luKSB7Ci0gICAgICAoKmNpbmZvLT5jY29udmVydC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKLSAgICAgICgqY2luZm8tPmRvd25zYW1wbGUtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7Ci0gICAgICAoKmNpbmZvLT5wcmVwLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfUEFTU19USFJVKTsKLSAgICB9Ci0gICAgKCpjaW5mby0+ZmRjdC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKLSAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpOwotICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X3Bhc3MpIChjaW5mbywKLQkJCQkobWFzdGVyLT50b3RhbF9wYXNzZXMgPiAxID8KLQkJCQkgSkJVRl9TQVZFX0FORF9QQVNTIDogSkJVRl9QQVNTX1RIUlUpKTsKLSAgICAoKmNpbmZvLT5tYWluLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfUEFTU19USFJVKTsKLSAgICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykgewotICAgICAgLyogTm8gaW1tZWRpYXRlIGRhdGEgb3V0cHV0OyBwb3N0cG9uZSB3cml0aW5nIGZyYW1lL3NjYW4gaGVhZGVycyAqLwotICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgLyogV2lsbCB3cml0ZSBmcmFtZS9zY2FuIGhlYWRlcnMgYXQgZmlyc3QganBlZ193cml0ZV9zY2FubGluZXMgY2FsbCAqLwotICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBUUlVFOwotICAgIH0KLSAgICBicmVhazsKLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgY2FzZSBodWZmX29wdF9wYXNzOgotICAgIC8qIERvIEh1ZmZtYW4gb3B0aW1pemF0aW9uIGZvciBhIHNjYW4gYWZ0ZXIgdGhlIGZpcnN0IG9uZS4gKi8KLSAgICBzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzKGNpbmZvKTsKLSAgICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7Ci0gICAgaWYgKGNpbmZvLT5TcyAhPSAwIHx8IGNpbmZvLT5BaCA9PSAwIHx8IGNpbmZvLT5hcml0aF9jb2RlKSB7Ci0gICAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIFRSVUUpOwotICAgICAgKCpjaW5mby0+Y29lZi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX0NSQU5LX0RFU1QpOwotICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvKiBTcGVjaWFsIGNhc2U6IEh1ZmZtYW4gREMgcmVmaW5lbWVudCBzY2FucyBuZWVkIG5vIEh1ZmZtYW4gdGFibGUKLSAgICAgKiBhbmQgdGhlcmVmb3JlIHdlIGNhbiBza2lwIHRoZSBvcHRpbWl6YXRpb24gcGFzcyBmb3IgdGhlbS4KLSAgICAgKi8KLSAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOwotICAgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKLSAgICAvKkZBTExUSFJPVUdIKi8KLSNlbmRpZgotICBjYXNlIG91dHB1dF9wYXNzOgotICAgIC8qIERvIGEgZGF0YS1vdXRwdXQgcGFzcy4gKi8KLSAgICAvKiBXZSBuZWVkIG5vdCByZXBlYXQgcGVyLXNjYW4gc2V0dXAgaWYgcHJpb3Igb3B0aW1pemF0aW9uIHBhc3MgZGlkIGl0LiAqLwotICAgIGlmICghIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpIHsKLSAgICAgIHNlbGVjdF9zY2FuX3BhcmFtZXRlcnMoY2luZm8pOwotICAgICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOwotICAgIH0KLSAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIEZBTFNFKTsKLSAgICAoKmNpbmZvLT5jb2VmLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7Ci0gICAgLyogV2UgZW1pdCBmcmFtZS9zY2FuIGhlYWRlcnMgbm93ICovCi0gICAgaWYgKG1hc3Rlci0+c2Nhbl9udW1iZXIgPT0gMCkKLSAgICAgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZnJhbWVfaGVhZGVyKSAoY2luZm8pOwotICAgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfc2Nhbl9oZWFkZXIpIChjaW5mbyk7Ci0gICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0gIH0KLQotICBtYXN0ZXItPnB1Yi5pc19sYXN0X3Bhc3MgPSAobWFzdGVyLT5wYXNzX251bWJlciA9PSBtYXN0ZXItPnRvdGFsX3Bhc3Nlcy0xKTsKLQotICAvKiBTZXQgdXAgcHJvZ3Jlc3MgbW9uaXRvcidzIHBhc3MgaW5mbyBpZiBwcmVzZW50ICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGNpbmZvLT5wcm9ncmVzcy0+Y29tcGxldGVkX3Bhc3NlcyA9IG1hc3Rlci0+cGFzc19udW1iZXI7Ci0gICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgPSBtYXN0ZXItPnRvdGFsX3Bhc3NlczsKLSAgfQotfQotCi0KLS8qCi0gKiBTcGVjaWFsIHN0YXJ0LW9mLXBhc3MgaG9vay4KLSAqIFRoaXMgaXMgY2FsbGVkIGJ5IGpwZWdfd3JpdGVfc2NhbmxpbmVzIGlmIGNhbGxfcGFzc19zdGFydHVwIGlzIFRSVUUuCi0gKiBJbiBzaW5nbGUtcGFzcyBwcm9jZXNzaW5nLCB3ZSBuZWVkIHRoaXMgaG9vayBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8KLSAqIHdyaXRlIGZyYW1lL3NjYW4gaGVhZGVycyBkdXJpbmcganBlZ19zdGFydF9jb21wcmVzczsgd2Ugd2FudCB0byBsZXQgdGhlCi0gKiBhcHBsaWNhdGlvbiB3cml0ZSBDT00gbWFya2VycyBldGMuIGJldHdlZW4ganBlZ19zdGFydF9jb21wcmVzcyBhbmQgdGhlCi0gKiBqcGVnX3dyaXRlX3NjYW5saW5lcyBsb29wLgotICogSW4gbXVsdGktcGFzcyBwcm9jZXNzaW5nLCB0aGlzIHJvdXRpbmUgaXMgbm90IHVzZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wYXNzX3N0YXJ0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCA9IEZBTFNFOyAvKiByZXNldCBmbGFnIHNvIGNhbGwgb25seSBvbmNlICovCi0KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9mcmFtZV9oZWFkZXIpIChjaW5mbyk7Ci0gICgqY2luZm8tPm1hcmtlci0+d3JpdGVfc2Nhbl9oZWFkZXIpIChjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCBlbmQgb2YgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9wYXNzX21hc3RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7Ci0KLSAgLyogVGhlIGVudHJvcHkgY29kZXIgYWx3YXlzIG5lZWRzIGFuIGVuZC1vZi1wYXNzIGNhbGwsCi0gICAqIGVpdGhlciB0byBhbmFseXplIHN0YXRpc3RpY3Mgb3IgdG8gZmx1c2ggaXRzIG91dHB1dCBidWZmZXIuCi0gICAqLwotICAoKmNpbmZvLT5lbnRyb3B5LT5maW5pc2hfcGFzcykgKGNpbmZvKTsKLQotICAvKiBVcGRhdGUgc3RhdGUgZm9yIG5leHQgcGFzcyAqLwotICBzd2l0Y2ggKG1hc3Rlci0+cGFzc190eXBlKSB7Ci0gIGNhc2UgbWFpbl9wYXNzOgotICAgIC8qIG5leHQgcGFzcyBpcyBlaXRoZXIgb3V0cHV0IG9mIHNjYW4gMCAoYWZ0ZXIgb3B0aW1pemF0aW9uKQotICAgICAqIG9yIG91dHB1dCBvZiBzY2FuIDEgKGlmIG5vIG9wdGltaXphdGlvbikuCi0gICAgICovCi0gICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKLSAgICBpZiAoISBjaW5mby0+b3B0aW1pemVfY29kaW5nKQotICAgICAgbWFzdGVyLT5zY2FuX251bWJlcisrOwotICAgIGJyZWFrOwotICBjYXNlIGh1ZmZfb3B0X3Bhc3M6Ci0gICAgLyogbmV4dCBwYXNzIGlzIGFsd2F5cyBvdXRwdXQgb2YgY3VycmVudCBzY2FuICovCi0gICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKLSAgICBicmVhazsKLSAgY2FzZSBvdXRwdXRfcGFzczoKLSAgICAvKiBuZXh0IHBhc3MgaXMgZWl0aGVyIG9wdGltaXphdGlvbiBvciBvdXRwdXQgb2YgbmV4dCBzY2FuICovCi0gICAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpCi0gICAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IGh1ZmZfb3B0X3Bhc3M7Ci0gICAgbWFzdGVyLT5zY2FuX251bWJlcisrOwotICAgIGJyZWFrOwotICB9Ci0KLSAgbWFzdGVyLT5wYXNzX251bWJlcisrOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIG1hc3RlciBjb21wcmVzc2lvbiBjb250cm9sLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfY19tYXN0ZXJfY29udHJvbCAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gdHJhbnNjb2RlX29ubHkpCi17Ci0gIG15X21hc3Rlcl9wdHIgbWFzdGVyOwotCi0gIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihteV9jb21wX21hc3RlcikpOwotICBjaW5mby0+bWFzdGVyID0gKHN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyICopIG1hc3RlcjsKLSAgbWFzdGVyLT5wdWIucHJlcGFyZV9mb3JfcGFzcyA9IHByZXBhcmVfZm9yX3Bhc3M7Ci0gIG1hc3Rlci0+cHViLnBhc3Nfc3RhcnR1cCA9IHBhc3Nfc3RhcnR1cDsKLSAgbWFzdGVyLT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19tYXN0ZXI7Ci0gIG1hc3Rlci0+cHViLmlzX2xhc3RfcGFzcyA9IEZBTFNFOwotCi0gIC8qIFZhbGlkYXRlIHBhcmFtZXRlcnMsIGRldGVybWluZSBkZXJpdmVkIHZhbHVlcyAqLwotICBpbml0aWFsX3NldHVwKGNpbmZvKTsKLQotICBpZiAoY2luZm8tPnNjYW5faW5mbyAhPSBOVUxMKSB7Ci0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gICAgdmFsaWRhdGVfc2NyaXB0KGNpbmZvKTsKLSNlbHNlCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgPSBGQUxTRTsKLSAgICBjaW5mby0+bnVtX3NjYW5zID0gMTsKLSAgfQotCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkJLyogIFRFTVBPUkFSWSBIQUNLID8/PyAqLwotICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOyAvKiBhc3N1bWUgZGVmYXVsdCB0YWJsZXMgbm8gZ29vZCBmb3IgcHJvZ3Jlc3NpdmUgbW9kZSAqLwotCi0gIC8qIEluaXRpYWxpemUgbXkgcHJpdmF0ZSBzdGF0ZSAqLwotICBpZiAodHJhbnNjb2RlX29ubHkpIHsKLSAgICAvKiBubyBtYWluIHBhc3MgaW4gdHJhbnNjb2RpbmcgKi8KLSAgICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykKLSAgICAgIG1hc3Rlci0+cGFzc190eXBlID0gaHVmZl9vcHRfcGFzczsKLSAgICBlbHNlCi0gICAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOwotICB9IGVsc2UgewotICAgIC8qIGZvciBub3JtYWwgY29tcHJlc3Npb24sIGZpcnN0IHBhc3MgaXMgYWx3YXlzIHRoaXMgdHlwZTogKi8KLSAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG1haW5fcGFzczsKLSAgfQotICBtYXN0ZXItPnNjYW5fbnVtYmVyID0gMDsKLSAgbWFzdGVyLT5wYXNzX251bWJlciA9IDA7Ci0gIGlmIChjaW5mby0+b3B0aW1pemVfY29kaW5nKQotICAgIG1hc3Rlci0+dG90YWxfcGFzc2VzID0gY2luZm8tPm51bV9zY2FucyAqIDI7Ci0gIGVsc2UKLSAgICBtYXN0ZXItPnRvdGFsX3Bhc3NlcyA9IGNpbmZvLT5udW1fc2NhbnM7Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29tYXBpLmMgYi9saWJqcGVndHdycC9qY29tYXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMWZhNzUuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNvbWFwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBqY29tYXBpLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2Ugcm91dGluZXMgdGhhdCBhcmUgdXNlZCBmb3IgYm90aAotICogY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qCi0gKiBBYm9ydCBwcm9jZXNzaW5nIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbiwKLSAqIGJ1dCBkb24ndCBkZXN0cm95IHRoZSBvYmplY3QgaXRzZWxmLgotICoKLSAqIEZvciB0aGlzLCB3ZSBtZXJlbHkgY2xlYW4gdXAgYWxsIHRoZSBub25wZXJtYW5lbnQgbWVtb3J5IHBvb2xzLgotICogTm90ZSB0aGF0IHRlbXAgZmlsZXMgKHZpcnR1YWwgYXJyYXlzKSBhcmUgbm90IGFsbG93ZWQgdG8gYmVsb25nIHRvCi0gKiB0aGUgcGVybWFuZW50IHBvb2wsIHNvIHdlIHdpbGwgYmUgYWJsZSB0byBjbG9zZSBhbGwgdGVtcCBmaWxlcyBoZXJlLgotICogQ2xvc2luZyBhIGRhdGEgc291cmNlIG9yIGRlc3RpbmF0aW9uLCBpZiBuZWNlc3NhcnksIGlzIHRoZSBhcHBsaWNhdGlvbidzCi0gKiByZXNwb25zaWJpbGl0eS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfYWJvcnQgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgaW50IHBvb2w7Ci0KLSAgLyogRG8gbm90aGluZyBpZiBjYWxsZWQgb24gYSBub3QtaW5pdGlhbGl6ZWQgb3IgZGVzdHJveWVkIEpQRUcgb2JqZWN0LiAqLwotICBpZiAoY2luZm8tPm1lbSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBSZWxlYXNpbmcgcG9vbHMgaW4gcmV2ZXJzZSBvcmRlciBtaWdodCBoZWxwIGF2b2lkIGZyYWdtZW50YXRpb24KLSAgICogd2l0aCBzb21lIChicmFpbi1kYW1hZ2VkKSBtYWxsb2MgbGlicmFyaWVzLgotICAgKi8KLSAgZm9yIChwb29sID0gSlBPT0xfTlVNUE9PTFMtMTsgcG9vbCA+IEpQT09MX1BFUk1BTkVOVDsgcG9vbC0tKSB7Ci0gICAgKCpjaW5mby0+bWVtLT5mcmVlX3Bvb2wpIChjaW5mbywgcG9vbCk7Ci0gIH0KLQotICAvKiBSZXNldCBvdmVyYWxsIHN0YXRlIGZvciBwb3NzaWJsZSByZXVzZSBvZiBvYmplY3QgKi8KLSAgaWYgKGNpbmZvLT5pc19kZWNvbXByZXNzb3IpIHsKLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUQVJUOwotICAgIC8qIFRyeSB0byBrZWVwIGFwcGxpY2F0aW9uIGZyb20gYWNjZXNzaW5nIG5vdy1kZWxldGVkIG1hcmtlciBsaXN0LgotICAgICAqIEEgYml0IGtsdWRneSB0byBkbyBpdCBoZXJlLCBidXQgdGhpcyBpcyB0aGUgbW9zdCBjZW50cmFsIHBsYWNlLgotICAgICAqLwotICAgICgoal9kZWNvbXByZXNzX3B0cikgY2luZm8pLT5tYXJrZXJfbGlzdCA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9TVEFSVDsKLSAgfQotfQotCi0KLS8qCi0gKiBEZXN0cnVjdGlvbiBvZiBhIEpQRUcgb2JqZWN0LgotICoKLSAqIEV2ZXJ5dGhpbmcgZ2V0cyBkZWFsbG9jYXRlZCBleGNlcHQgdGhlIG1hc3RlciBqcGVnX2NvbXByZXNzX3N0cnVjdCBpdHNlbGYKLSAqIGFuZCB0aGUgZXJyb3IgbWFuYWdlciBzdHJ1Y3QuICBCb3RoIG9mIHRoZXNlIGFyZSBzdXBwbGllZCBieSB0aGUgYXBwbGljYXRpb24KLSAqIGFuZCBtdXN0IGJlIGZyZWVkLCBpZiBuZWNlc3NhcnksIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIChPZnRlbiB0aGV5IGFyZSBvbgotICogdGhlIHN0YWNrIGFuZCBzbyBkb24ndCBuZWVkIHRvIGJlIGZyZWVkIGFueXdheS4pCi0gKiBDbG9zaW5nIGEgZGF0YSBzb3VyY2Ugb3IgZGVzdGluYXRpb24sIGlmIG5lY2Vzc2FyeSwgaXMgdGhlIGFwcGxpY2F0aW9uJ3MKLSAqIHJlc3BvbnNpYmlsaXR5LgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19kZXN0cm95IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIC8qIFdlIG5lZWQgb25seSB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byByZWxlYXNlIGV2ZXJ5dGhpbmcuICovCi0gIC8qIE5COiBtZW0gcG9pbnRlciBpcyBOVUxMIGlmIG1lbW9yeSBtZ3IgZmFpbGVkIHRvIGluaXRpYWxpemUuICovCi0gIGlmIChjaW5mby0+bWVtICE9IE5VTEwpCi0gICAgKCpjaW5mby0+bWVtLT5zZWxmX2Rlc3RydWN0KSAoY2luZm8pOwotICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIGJlIHNhZmUgaWYganBlZ19kZXN0cm95IGlzIGNhbGxlZCB0d2ljZSAqLwotICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gMDsJLyogbWFyayBpdCBkZXN0cm95ZWQgKi8KLX0KLQotCi0vKgotICogQ29udmVuaWVuY2Ugcm91dGluZXMgZm9yIGFsbG9jYXRpbmcgcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcy4KLSAqIChXb3VsZCBqdXRpbHMuYyBiZSBhIG1vcmUgcmVhc29uYWJsZSBwbGFjZSB0byBwdXQgdGhlc2U/KQotICovCi0KLUdMT0JBTChKUVVBTlRfVEJMICopCi1qcGVnX2FsbG9jX3F1YW50X3RhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIEpRVUFOVF9UQkwgKnRibDsKLQotICB0YmwgPSAoSlFVQU5UX1RCTCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpIChjaW5mbywgSlBPT0xfUEVSTUFORU5ULCBTSVpFT0YoSlFVQU5UX1RCTCkpOwotICB0YmwtPnNlbnRfdGFibGUgPSBGQUxTRTsJLyogbWFrZSBzdXJlIHRoaXMgaXMgZmFsc2UgaW4gYW55IG5ldyB0YWJsZSAqLwotICByZXR1cm4gdGJsOwotfQotCi0KLUdMT0JBTChKSFVGRl9UQkwgKikKLWpwZWdfYWxsb2NfaHVmZl90YWJsZSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBKSFVGRl9UQkwgKnRibDsKLQotICB0YmwgPSAoSkhVRkZfVEJMICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsIFNJWkVPRihKSFVGRl9UQkwpKTsKLSAgdGJsLT5zZW50X3RhYmxlID0gRkFMU0U7CS8qIG1ha2Ugc3VyZSB0aGlzIGlzIGZhbHNlIGluIGFueSBuZXcgdGFibGUgKi8KLSAgcmV0dXJuIHRibDsKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjb25maWcuYmNjIGIvbGlianBlZ3R3cnAvamNvbmZpZy5iY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YzUzZmYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNvbmZpZy5iY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBqY29uZmlnLmJjYyAtLS0gamNvbmZpZy5oIGZvciBCb3JsYW5kIEMgKFR1cmJvIEMpIG9uIE1TLURPUyBvciBPUy8yLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI2lmZGVmIF9fTVNET1NfXwotI2RlZmluZSBORUVEX0ZBUl9QT0lOVEVSUwkvKiBmb3Igc21hbGwgb3IgbWVkaXVtIG1lbW9yeSBtb2RlbCAqLwotI2VuZGlmCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCS8qIHRoaXMgYXNzdW1lcyB5b3UgaGF2ZSAtdy1zdHUgaW4gQ0ZMQUdTICovCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2lmZGVmIF9fTVNET1NfXwotI2RlZmluZSBVU0VfTVNET1NfTUVNTUdSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbWRvcy5jICovCi0jZGVmaW5lIE1BWF9BTExPQ19DSFVOSyA2NTUyMEwJLyogTWF4aW11bSByZXF1ZXN0IHRvIG1hbGxvYygpICovCi0jZGVmaW5lIFVTRV9GTUVNCQkvKiBCb3JsYW5kIGhhcyBfZm1lbWNweSgpIGFuZCBfZm1lbXNldCgpICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIEJvcmxhbmQgaGFzIHNldG1vZGUoKSAqLwotI2lmZGVmIF9fTVNET1NfXwotI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbWRvcy5jICovCi0jZW5kaWYKLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29uZmlnLmNmZyBiL2xpYmpwZWd0d3JwL2pjb25maWcuY2ZnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmEwNGZhLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjb25maWcuY2ZnCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyogamNvbmZpZy5jZmcgLS0tIHNvdXJjZSBmaWxlIGVkaXRlZCBieSBjb25maWd1cmUgc2NyaXB0ICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jdW5kZWYgSEFWRV9QUk9UT1RZUEVTCi0jdW5kZWYgSEFWRV9VTlNJR05FRF9DSEFSCi0jdW5kZWYgSEFWRV9VTlNJR05FRF9TSE9SVAotI3VuZGVmIHZvaWQKLSN1bmRlZiBjb25zdAotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSN1bmRlZiBIQVZFX1NURERFRl9ICi0jdW5kZWYgSEFWRV9TVERMSUJfSAotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0jdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3UgZ2V0IHdhcm5pbmdzIGFib3V0IHVuZGVmaW5lZCBzdHJ1Y3R1cmVzLiAqLwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLSN1bmRlZiBJTkxJTkUKLS8qIFRoZXNlIGFyZSBmb3IgY29uZmlndXJpbmcgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICovCi0jdW5kZWYgREVGQVVMVF9NQVhfTUVNCi0jdW5kZWYgTk9fTUtURU1QCi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0jdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuICovCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29uZmlnLmRqIGIvbGlianBlZ3R3cnAvamNvbmZpZy5kagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1OWE5ZC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY29uZmlnLmRqCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogamNvbmZpZy5kaiAtLS0gamNvbmZpZy5oIGZvciBESkdQUCAoRGVsb3JpZSdzIEdOVSBDIHBvcnQpIG9uIE1TLURPUy4gKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotLyogI2RlZmluZSBjb25zdCAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiBESkdQUCB1c2VzIGZsYXQgMzItYml0IGFkZHJlc3NpbmcgKi8KLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIG9wdGlvbmFsICovCi0jZGVmaW5lIFVTRV9TRVRNT0RFCQkvKiBOZWVkZWQgdG8gbWFrZSBvbmUtZmlsZSBzdHlsZSB3b3JrIGluIERKR1BQICovCi0jdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1uYW1lLmMgKi8KLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29uZmlnLmRvYyBiL2xpYmpwZWd0d3JwL2pjb25maWcuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMThkMWMwLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjb25maWcuZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBqY29uZmlnLmRvYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk0LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgYXJlIHJlcXVpcmVkIHRvCi0gKiBjdXN0b21pemUgdGhlIEpQRUcgc29mdHdhcmUgZm9yIGEgcGFydGljdWxhciBzeXN0ZW0uCi0gKgotICogVGhlIGFjdHVhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGEgcGFydGljdWxhciBpbnN0YWxsYXRpb24gYXJlIHN0b3JlZAotICogaW4gamNvbmZpZy5oLiAgT24gbWFueSBtYWNoaW5lcywgamNvbmZpZy5oIGNhbiBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseQotICogb3IgY29waWVkIGZyb20gb25lIG9mIHRoZSAiY2FubmVkIiBqY29uZmlnIGZpbGVzIHRoYXQgd2Ugc3VwcGx5LiAgQnV0IGlmCi0gKiB5b3UgbmVlZCB0byBnZW5lcmF0ZSBhIGpjb25maWcuaCBmaWxlIGJ5IGhhbmQsIHRoaXMgZmlsZSB0ZWxscyB5b3UgaG93LgotICoKLSAqIERPIE5PVCBFRElUIFRISVMgRklMRSAtLS0gSVQgV09OJ1QgQUNDT01QTElTSCBBTllUSElORy4KLSAqIEVESVQgQSBDT1BZIE5BTUVEIEpDT05GSUcuSC4KLSAqLwotCi0KLS8qCi0gKiBUaGVzZSBzeW1ib2xzIGluZGljYXRlIHRoZSBwcm9wZXJ0aWVzIG9mIHlvdXIgbWFjaGluZSBvciBjb21waWxlci4KLSAqICNkZWZpbmUgdGhlIHN5bWJvbCBpZiB5ZXMsICN1bmRlZiBpdCBpZiBuby4KLSAqLwotCi0vKiBEb2VzIHlvdXIgY29tcGlsZXIgc3VwcG9ydCBmdW5jdGlvbiBwcm90b3R5cGVzPwotICogKElmIG5vdCwgeW91IGFsc28gbmVlZCB0byB1c2UgYW5zaTJrbnIsIHNlZSBpbnN0YWxsLmRvYykKLSAqLwotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLQotLyogRG9lcyB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgdGhlIGRlY2xhcmF0aW9uICJ1bnNpZ25lZCBjaGFyIiA/Ci0gKiBIb3cgYWJvdXQgInVuc2lnbmVkIHNob3J0IiA/Ci0gKi8KLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLQotLyogRGVmaW5lICJ2b2lkIiBhcyAiY2hhciIgaWYgeW91ciBjb21waWxlciBkb2Vzbid0IGtub3cgYWJvdXQgdHlwZSB2b2lkLgotICogTk9URTogYmUgc3VyZSB0byBkZWZpbmUgdm9pZCBzdWNoIHRoYXQgInZvaWQgKiIgcmVwcmVzZW50cyB0aGUgbW9zdCBnZW5lcmFsCi0gKiBwb2ludGVyIHR5cGUsIGUuZy4sIHRoYXQgcmV0dXJuZWQgYnkgbWFsbG9jKCkuCi0gKi8KLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0KLS8qIERlZmluZSAiY29uc3QiIGFzIGVtcHR5IGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBrbm93IHRoZSAiY29uc3QiIGtleXdvcmQuCi0gKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgYW4gb3JkaW5hcnkgImNoYXIiIHR5cGUgaXMgdW5zaWduZWQuCi0gKiBJZiB5b3UncmUgbm90IHN1cmUsIGxlYXZpbmcgaXQgdW5kZWZpbmVkIHdpbGwgd29yayBhdCBzb21lIGNvc3QgaW4gc3BlZWQuCi0gKiBJZiB5b3UgZGVmaW5lZCBIQVZFX1VOU0lHTkVEX0NIQVIgdGhlbiB0aGUgc3BlZWQgZGlmZmVyZW5jZSBpcyBtaW5pbWFsLgotICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgYW4gQU5TSS1jb25mb3JtaW5nIDxzdGRkZWYuaD4gZmlsZS4KLSAqLwotI2RlZmluZSBIQVZFX1NURERFRl9ICi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGhhcyBhbiBBTlNJLWNvbmZvcm1pbmcgPHN0ZGxpYi5oPiBmaWxlLgotICovCi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBhbiBBTlNJL1N5c1YgPHN0cmluZy5oPiwKLSAqIGJ1dCBkb2VzIGhhdmUgYSBCU0Qtc3R5bGUgPHN0cmluZ3MuaD4uCi0gKi8KLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdHlwZWRlZiBzaXplX3QgaW4gYW55IG9mIHRoZQotICogQU5TSS1zdGFuZGFyZCBwbGFjZXMgKHN0ZGRlZi5oLCBzdGRsaWIuaCwgb3Igc3RkaW8uaCksIGJ1dCBwbGFjZXMgaXQgaW4KLSAqIDxzeXMvdHlwZXMuaD4gaW5zdGVhZC4KLSAqLwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLQotLyogRm9yIDgweDg2IG1hY2hpbmVzLCB5b3UgbmVlZCB0byBkZWZpbmUgTkVFRF9GQVJfUE9JTlRFUlMsCi0gKiB1bmxlc3MgeW91IGFyZSB1c2luZyBhIGxhcmdlLWRhdGEgbWVtb3J5IG1vZGVsIG9yIDgwMzg2IGZsYXQtbWVtb3J5IG1vZGUuCi0gKiBPbiBsZXNzIGJyYWluLWRhbWFnZWQgQ1BVcyB0aGlzIHN5bWJvbCBtdXN0IG5vdCBiZSBkZWZpbmVkLgotICogKERlZmluaW5nIHRoaXMgc3ltYm9sIGNhdXNlcyBsYXJnZSBkYXRhIHN0cnVjdHVyZXMgdG8gYmUgcmVmZXJlbmNlZCB0aHJvdWdoCi0gKiAiZmFyIiBwb2ludGVycyBhbmQgdG8gYmUgYWxsb2NhdGVkIHdpdGggYSBzcGVjaWFsIHZlcnNpb24gb2YgbWFsbG9jLikKLSAqLwotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdXIgbGlua2VyIG5lZWRzIGdsb2JhbCBuYW1lcyB0byBiZSB1bmlxdWUgaW4gbGVzcwotICogdGhhbiB0aGUgZmlyc3QgMTUgY2hhcmFjdGVycy4KLSAqLwotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLQotLyogQWx0aG91Z2ggYSByZWFsIEFOU0kgQyBjb21waWxlciBjYW4gZGVhbCBwZXJmZWN0bHkgd2VsbCB3aXRoIHBvaW50ZXJzIHRvCi0gKiB1bnNwZWNpZmllZCBzdHJ1Y3R1cmVzIChzZWUgImluY29tcGxldGUgdHlwZXMiIGluIHRoZSBzcGVjKSwgYSBmZXcgcHJlLUFOU0kKLSAqIGFuZCBwc2V1ZG8tQU5TSSBjb21waWxlcnMgZ2V0IGNvbmZ1c2VkLiAgVG8ga2VlcCBvbmUgb2YgdGhlc2UgYm96b3MgaGFwcHksCi0gKiBkZWZpbmUgSU5DT01QTEVURV9UWVBFU19CUk9LRU4uICBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCB1bmxlc3MgeW91Ci0gKiBhY3R1YWxseSBnZXQgIm1pc3Npbmcgc3RydWN0dXJlIGRlZmluaXRpb24iIHdhcm5pbmdzIG9yIGVycm9ycyB3aGlsZQotICogY29tcGlsaW5nIHRoZSBKUEVHIGNvZGUuCi0gKi8KLSN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYWZmZWN0IGNvZGUgc2VsZWN0aW9uIHdpdGhpbiB0aGUgSlBFRyBsaWJyYXJ5LAotICogYnV0IHRoZXkgZG9uJ3QgbmVlZCB0byBiZSB2aXNpYmxlIHRvIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeS4KLSAqIFRvIG1pbmltaXplIGFwcGxpY2F0aW9uIG5hbWVzcGFjZSBwb2xsdXRpb24sIHRoZSBzeW1ib2xzIHdvbid0IGJlCi0gKiBkZWZpbmVkIHVubGVzcyBKUEVHX0lOVEVSTkFMUyBoYXMgYmVlbiBkZWZpbmVkLgotICovCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGltcGxlbWVudHMgIj4+IiBvbiBzaWduZWQgdmFsdWVzIGFzIGEgbG9naWNhbAotICogKHVuc2lnbmVkKSBzaGlmdDsgbGVhdmUgaXQgdW5kZWZpbmVkIGlmICI+PiIgaXMgYSBzaWduZWQgKGFyaXRobWV0aWMpIHNoaWZ0LAotICogd2hpY2ggaXMgdGhlIG5vcm1hbCBhbmQgcmF0aW9uYWwgZGVmaW5pdGlvbi4KLSAqLwotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0KLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLQotLyoKLSAqIFRoZSByZW1haW5pbmcgb3B0aW9ucyBkbyBub3QgYWZmZWN0IHRoZSBKUEVHIGxpYnJhcnkgcHJvcGVyLAotICogYnV0IG9ubHkgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgY2pwZWcvZGpwZWcgKHNlZSBjanBlZy5jLCBkanBlZy5jKS4KLSAqIE90aGVyIGFwcGxpY2F0aW9ucyBjYW4gaWdub3JlIHRoZXNlLgotICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLS8qIFRoZXNlIGRlZmluZXMgaW5kaWNhdGUgd2hpY2ggaW1hZ2UgKG5vbi1KUEVHKSBmaWxlIGZvcm1hdHMgYXJlIGFsbG93ZWQuICovCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHRvIG5hbWUgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG9uIHRoZSBjb21tYW5kCi0gKiBsaW5lLCByYXRoZXIgdGhhbiB1c2luZyBzdGRvdXQgYW5kIG9wdGlvbmFsbHkgc3RkaW4uICBZb3UgTVVTVCBkbyB0aGlzIGlmCi0gKiB5b3VyIHN5c3RlbSBjYW4ndCBjb3BlIHdpdGggYmluYXJ5IEkvTyB0byBzdGRpbi9zdGRvdXQuICBTZWUgY29tbWVudHMgYXQKLSAqIGhlYWQgb2YgY2pwZWcuYyBvciBkanBlZy5jLgotICovCi0jdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gbmVlZHMgZXhwbGljaXQgY2xlYW51cCBvZiB0ZW1wb3JhcnkgZmlsZXMuCi0gKiBUaGlzIGlzIGNydWNpYWwgdW5kZXIgTVMtRE9TLCB3aGVyZSB0aGUgdGVtcG9yYXJ5ICJmaWxlcyIgbWF5IGJlIGFyZWFzCi0gKiBvZiBleHRlbmRlZCBtZW1vcnk7IG9uIG1vc3Qgb3RoZXIgc3lzdGVtcyBpdCdzIG5vdCBhcyBpbXBvcnRhbnQuCi0gKi8KLSN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCi0KLS8qIEJ5IGRlZmF1bHQsIHdlIG9wZW4gaW1hZ2UgZmlsZXMgd2l0aCBmb3BlbiguLi4sInJiIikgb3IgZm9wZW4oLi4uLCJ3YiIpLgotICogVGhpcyBpcyBuZWNlc3Nhcnkgb24gc3lzdGVtcyB0aGF0IGRpc3Rpbmd1aXNoIHRleHQgZmlsZXMgZnJvbSBiaW5hcnkgZmlsZXMsCi0gKiBhbmQgaXMgaGFybWxlc3Mgb24gbW9zdCBzeXN0ZW1zIHRoYXQgZG9uJ3QuICBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhlIHJhcmUKLSAqIHN5c3RlbXMgdGhhdCBjb21wbGFpbnMgYWJvdXQgdGhlICJiIiBzcGVjLCBkZWZpbmUgdGhpcyBzeW1ib2wuCi0gKi8KLSN1bmRlZiBET05UX1VTRV9CX01PREUKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgcGVyY2VudC1kb25lIHByb2dyZXNzIHJlcG9ydHMgZnJvbSBjanBlZy9kanBlZy4KLSAqLwotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAotCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29uZmlnLmggYi9saWJqcGVndHdycC9qY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YTk4MTcuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qIGFuZHJvaWQgamNvbmZpZy5oICovCi0vKgotICogamNvbmZpZy5kb2MKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB0bwotICogY3VzdG9taXplIHRoZSBKUEVHIHNvZnR3YXJlIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtLgotICoKLSAqIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhIHBhcnRpY3VsYXIgaW5zdGFsbGF0aW9uIGFyZSBzdG9yZWQKLSAqIGluIGpjb25maWcuaC4gIE9uIG1hbnkgbWFjaGluZXMsIGpjb25maWcuaCBjYW4gYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkKLSAqIG9yIGNvcGllZCBmcm9tIG9uZSBvZiB0aGUgImNhbm5lZCIgamNvbmZpZyBmaWxlcyB0aGF0IHdlIHN1cHBseS4gIEJ1dCBpZgotICogeW91IG5lZWQgdG8gZ2VuZXJhdGUgYSBqY29uZmlnLmggZmlsZSBieSBoYW5kLCB0aGlzIGZpbGUgdGVsbHMgeW91IGhvdy4KLSAqCi0gKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLS0tIElUIFdPTidUIEFDQ09NUExJU0ggQU5ZVEhJTkcuCi0gKiBFRElUIEEgQ09QWSBOQU1FRCBKQ09ORklHLkguCi0gKi8KLQotCi0vKgotICogVGhlc2Ugc3ltYm9scyBpbmRpY2F0ZSB0aGUgcHJvcGVydGllcyBvZiB5b3VyIG1hY2hpbmUgb3IgY29tcGlsZXIuCi0gKiAjZGVmaW5lIHRoZSBzeW1ib2wgaWYgeWVzLCAjdW5kZWYgaXQgaWYgbm8uCi0gKi8KLQotLyogRG9lcyB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcz8KLSAqIChJZiBub3QsIHlvdSBhbHNvIG5lZWQgdG8gdXNlIGFuc2kya25yLCBzZWUgaW5zdGFsbC5kb2MpCi0gKi8KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0KLS8qIERvZXMgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBkZWNsYXJhdGlvbiAidW5zaWduZWQgY2hhciIgPwotICogSG93IGFib3V0ICJ1bnNpZ25lZCBzaG9ydCIgPwotICovCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0KLS8qIERlZmluZSAidm9pZCIgYXMgImNoYXIiIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBrbm93IGFib3V0IHR5cGUgdm9pZC4KLSAqIE5PVEU6IGJlIHN1cmUgdG8gZGVmaW5lIHZvaWQgc3VjaCB0aGF0ICJ2b2lkICoiIHJlcHJlc2VudHMgdGhlIG1vc3QgZ2VuZXJhbAotICogcG9pbnRlciB0eXBlLCBlLmcuLCB0aGF0IHJldHVybmVkIGJ5IG1hbGxvYygpLgotICovCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotCi0vKiBEZWZpbmUgImNvbnN0IiBhcyBlbXB0eSBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qga25vdyB0aGUgImNvbnN0IiBrZXl3b3JkLgotICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0KLS8qIERlZmluZSB0aGlzIGlmIGFuIG9yZGluYXJ5ICJjaGFyIiB0eXBlIGlzIHVuc2lnbmVkLgotICogSWYgeW91J3JlIG5vdCBzdXJlLCBsZWF2aW5nIGl0IHVuZGVmaW5lZCB3aWxsIHdvcmsgYXQgc29tZSBjb3N0IGluIHNwZWVkLgotICogSWYgeW91IGRlZmluZWQgSEFWRV9VTlNJR05FRF9DSEFSIHRoZW4gdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMgbWluaW1hbC4KLSAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gaGFzIGFuIEFOU0ktY29uZm9ybWluZyA8c3RkZGVmLmg+IGZpbGUuCi0gKi8KLSNkZWZpbmUgSEFWRV9TVERERUZfSAotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgYW4gQU5TSS1jb25mb3JtaW5nIDxzdGRsaWIuaD4gZmlsZS4KLSAqLwotI2RlZmluZSBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYW4gQU5TSS9TeXNWIDxzdHJpbmcuaD4sCi0gKiBidXQgZG9lcyBoYXZlIGEgQlNELXN0eWxlIDxzdHJpbmdzLmg+LgotICovCi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHR5cGVkZWYgc2l6ZV90IGluIGFueSBvZiB0aGUKLSAqIEFOU0ktc3RhbmRhcmQgcGxhY2VzIChzdGRkZWYuaCwgc3RkbGliLmgsIG9yIHN0ZGlvLmgpLCBidXQgcGxhY2VzIGl0IGluCi0gKiA8c3lzL3R5cGVzLmg+IGluc3RlYWQuCi0gKi8KLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0KLS8qIEZvciA4MHg4NiBtYWNoaW5lcywgeW91IG5lZWQgdG8gZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTLAotICogdW5sZXNzIHlvdSBhcmUgdXNpbmcgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCBvciA4MDM4NiBmbGF0LW1lbW9yeSBtb2RlLgotICogT24gbGVzcyBicmFpbi1kYW1hZ2VkIENQVXMgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgZGVmaW5lZC4KLSAqIChEZWZpbmluZyB0aGlzIHN5bWJvbCBjYXVzZXMgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIHRvIGJlIHJlZmVyZW5jZWQgdGhyb3VnaAotICogImZhciIgcG9pbnRlcnMgYW5kIHRvIGJlIGFsbG9jYXRlZCB3aXRoIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIG1hbGxvYy4pCi0gKi8KLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3VyIGxpbmtlciBuZWVkcyBnbG9iYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIGxlc3MKLSAqIHRoYW4gdGhlIGZpcnN0IDE1IGNoYXJhY3RlcnMuCi0gKi8KLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0KLS8qIEFsdGhvdWdoIGEgcmVhbCBBTlNJIEMgY29tcGlsZXIgY2FuIGRlYWwgcGVyZmVjdGx5IHdlbGwgd2l0aCBwb2ludGVycyB0bwotICogdW5zcGVjaWZpZWQgc3RydWN0dXJlcyAoc2VlICJpbmNvbXBsZXRlIHR5cGVzIiBpbiB0aGUgc3BlYyksIGEgZmV3IHByZS1BTlNJCi0gKiBhbmQgcHNldWRvLUFOU0kgY29tcGlsZXJzIGdldCBjb25mdXNlZC4gIFRvIGtlZXAgb25lIG9mIHRoZXNlIGJvem9zIGhhcHB5LAotICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdQotICogYWN0dWFsbHkgZ2V0ICJtaXNzaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uIiB3YXJuaW5ncyBvciBlcnJvcnMgd2hpbGUKLSAqIGNvbXBpbGluZyB0aGUgSlBFRyBjb2RlLgotICovCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotCi0vKgotICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFmZmVjdCBjb2RlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIEpQRUcgbGlicmFyeSwKLSAqIGJ1dCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCi0gKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQotICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgaGFzIGJlZW4gZGVmaW5lZC4KLSAqLwotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciBpbXBsZW1lbnRzICI+PiIgb24gc2lnbmVkIHZhbHVlcyBhcyBhIGxvZ2ljYWwKLSAqICh1bnNpZ25lZCkgc2hpZnQ7IGxlYXZlIGl0IHVuZGVmaW5lZCBpZiAiPj4iIGlzIGEgc2lnbmVkIChhcml0aG1ldGljKSBzaGlmdCwKLSAqIHdoaWNoIGlzIHRoZSBub3JtYWwgYW5kIHJhdGlvbmFsIGRlZmluaXRpb24uCi0gKi8KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0KLS8qCi0gKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgZG8gbm90IGFmZmVjdCB0aGUgSlBFRyBsaWJyYXJ5IHByb3BlciwKLSAqIGJ1dCBvbmx5IHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnIChzZWUgY2pwZWcuYywgZGpwZWcuYykuCi0gKiBPdGhlciBhcHBsaWNhdGlvbnMgY2FuIGlnbm9yZSB0aGVzZS4KLSAqLwotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0vKiBUaGVzZSBkZWZpbmVzIGluZGljYXRlIHdoaWNoIGltYWdlIChub24tSlBFRykgZmlsZSBmb3JtYXRzIGFyZSBhbGxvd2VkLiAqLwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBuYW1lIGJvdGggaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBvbiB0aGUgY29tbWFuZAotICogbGluZSwgcmF0aGVyIHRoYW4gdXNpbmcgc3Rkb3V0IGFuZCBvcHRpb25hbGx5IHN0ZGluLiAgWW91IE1VU1QgZG8gdGhpcyBpZgotICogeW91ciBzeXN0ZW0gY2FuJ3QgY29wZSB3aXRoIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LiAgU2VlIGNvbW1lbnRzIGF0Ci0gKiBoZWFkIG9mIGNqcGVnLmMgb3IgZGpwZWcuYy4KLSAqLwotI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIG5lZWRzIGV4cGxpY2l0IGNsZWFudXAgb2YgdGVtcG9yYXJ5IGZpbGVzLgotICogVGhpcyBpcyBjcnVjaWFsIHVuZGVyIE1TLURPUywgd2hlcmUgdGhlIHRlbXBvcmFyeSAiZmlsZXMiIG1heSBiZSBhcmVhcwotICogb2YgZXh0ZW5kZWQgbWVtb3J5OyBvbiBtb3N0IG90aGVyIHN5c3RlbXMgaXQncyBub3QgYXMgaW1wb3J0YW50LgotICovCi0jdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotCi0vKiBCeSBkZWZhdWx0LCB3ZSBvcGVuIGltYWdlIGZpbGVzIHdpdGggZm9wZW4oLi4uLCJyYiIpIG9yIGZvcGVuKC4uLiwid2IiKS4KLSAqIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCB0ZXh0IGZpbGVzIGZyb20gYmluYXJ5IGZpbGVzLAotICogYW5kIGlzIGhhcm1sZXNzIG9uIG1vc3Qgc3lzdGVtcyB0aGF0IGRvbid0LiAgSWYgeW91IGhhdmUgb25lIG9mIHRoZSByYXJlCi0gKiBzeXN0ZW1zIHRoYXQgY29tcGxhaW5zIGFib3V0IHRoZSAiYiIgc3BlYywgZGVmaW5lIHRoaXMgc3ltYm9sLgotICovCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuCi0gKi8KLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQKLQotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNvbmZpZy5tYWMgYi9saWJqcGVndHdycC9qY29uZmlnLm1hYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlM2VmZS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY29uZmlnLm1hYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIGpjb25maWcubWFjIC0tLSBqY29uZmlnLmggZm9yIENvZGVXYXJyaW9yIG9uIEFwcGxlIE1hY2ludG9zaCAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2RlZmluZSBVU0VfTUFDX01FTU1HUgkJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtbWFjLmMgKi8KLQotI2RlZmluZSBBTElHTl9UWVBFIGxvbmcJCS8qIE5lZWRlZCBmb3IgNjgweDAgTWFjcyAqLwotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI2RlZmluZSBVU0VfQ0NPTU1BTkQJCS8qIENvbW1hbmQgbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLwotI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQkvKiBCaW5hcnkgSS9PIHRocnUgc3RkaW4vc3Rkb3V0IGRvZXNuJ3Qgd29yayAqLwotCi0jdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjb25maWcubWFueCBiL2xpYmpwZWd0d3JwL2pjb25maWcubWFueApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkMGQwMC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY29uZmlnLm1hbngKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBqY29uZmlnLm1hbnggLS0tIGpjb25maWcuaCBmb3IgQW1pZ2Egc3lzdGVtcyB1c2luZyBNYW54IEF6dGVjIEMgdmVyIDUueC4gKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotLyogI2RlZmluZSBjb25zdCAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0KLSNkZWZpbmUgVEVNUF9ESVJFQ1RPUlkgIkpQRUdUTVA6IgkvKiByZWNvbW1lbmRlZCBzZXR0aW5nIGZvciBBbWlnYSAqLwotCi0jZGVmaW5lIFNIT1JUeFNIT1JUXzMyCQkvKiBwcm9kdWNlcyBiZXR0ZXIgRENUIGNvZGUgd2l0aCBBenRlYyBDICovCi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0jZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0jZGVmaW5lIE5FRURfU0lHTkFMX0NBVENIRVIKLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNkZWZpbmUgc2lnbmFsX2NhdGNoZXIgX2Fib3J0CS8qIGhhY2sgZm9yIEF6dGVjIEMgbmFtaW5nIHJlcXVpcmVtZW50cyAqLwotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNvbmZpZy5tYzYgYi9saWJqcGVndHdycC9qY29uZmlnLm1jNgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1MDgyZC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY29uZmlnLm1jNgorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIGpjb25maWcubWM2IC0tLSBqY29uZmlnLmggZm9yIE1pY3Jvc29mdCBDIG9uIE1TLURPUywgdmVyc2lvbiA2LjAwQSAmIHVwLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI2RlZmluZSBORUVEX0ZBUl9QT0lOVEVSUwkvKiBmb3Igc21hbGwgb3IgbWVkaXVtIG1lbW9yeSBtb2RlbCAqLwotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0KLSNkZWZpbmUgVVNFX01TRE9TX01FTU1HUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLwotCi0jZGVmaW5lIE1BWF9BTExPQ19DSFVOSyA2NTUyMEwJLyogTWF4aW11bSByZXF1ZXN0IHRvIG1hbGxvYygpICovCi0KLSNkZWZpbmUgVVNFX0ZNRU0JCS8qIE1pY3Jvc29mdCBoYXMgX2ZtZW1jcHkoKSBhbmQgX2ZtZW1zZXQoKSAqLwotCi0jZGVmaW5lIE5FRURfRkhFQVBNSU4JCS8qIGZhciBoZWFwIG1hbmFnZW1lbnQgcm91dGluZXMgYXJlIGJyb2tlbiAqLwotCi0jZGVmaW5lIFNIT1JUeExDT05TVF8zMgkJLyogZW5hYmxlIGNvbXBpbGVyLXNwZWNpZmljIERDVCBvcHRpbWl6YXRpb24gKi8KLS8qIE5vdGU6IHRoZSBhYm92ZSBkZWZpbmUgaXMga25vd24gdG8gaW1wcm92ZSB0aGUgY29kZSB3aXRoIE1pY3Jvc29mdCBDIDYuMDBBLgotICogSSBkbyBub3Qga25vdyB3aGV0aGVyIGl0IGlzIGdvb2QgZm9yIGxhdGVyIGNvbXBpbGVyIHZlcnNpb25zLgotICogUGxlYXNlIHJlcG9ydCBhbnkgaW5mbyBvbiB0aGlzIHBvaW50IHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQuCi0gKi8KLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE1pY3Jvc29mdCBoYXMgc2V0bW9kZSgpICovCi0jZGVmaW5lIE5FRURfU0lHTkFMX0NBVENIRVIJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtZG9zLmMgKi8KLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29uZmlnLnNhcyBiL2xpYmpwZWd0d3JwL2pjb25maWcuc2FzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmRhYzIyLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjb25maWcuc2FzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogamNvbmZpZy5zYXMgLS0tIGpjb25maWcuaCBmb3IgQW1pZ2Egc3lzdGVtcyB1c2luZyBTQVMgQyA2LjAgYW5kIHVwLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2RlZmluZSBURU1QX0RJUkVDVE9SWSAiSlBFR1RNUDoiCS8qIHJlY29tbWVuZGVkIHNldHRpbmcgZm9yIEFtaWdhICovCi0KLSNkZWZpbmUgTk9fTUtURU1QCQkvKiBTQVMgQyBkb2Vzbid0IGhhdmUgbWt0ZW1wKCkgKi8KLQotI2RlZmluZSBTSE9SVHhTSE9SVF8zMgkJLyogcHJvZHVjZXMgYmV0dGVyIERDVCBjb2RlIHdpdGggU0FTIEMgKi8KLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjb25maWcuc3QgYi9saWJqcGVndHdycC9qY29uZmlnLnN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDIxYjdhLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjb25maWcuc3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBqY29uZmlnLnN0IC0tLSBqY29uZmlnLmggZm9yIEF0YXJpIFNUL1NURS9UVCB1c2luZyBQdXJlIEMgb3IgVHVyYm8gQy4gKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotLyogI2RlZmluZSBjb25zdCAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUgSU5DT01QTEVURV9UWVBFU19CUk9LRU4JLyogc3VwcHJlc3MgdW5kZWZpbmVkLXN0cnVjdHVyZSB3YXJuaW5ncyAqLwotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0KLSNkZWZpbmUgQUxJR05fVFlQRSAgbG9uZwkvKiBhcHBhcmVudGx5IGRvdWJsZSBpcyBhIHdlaXJkIHNpemU/ICovCi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0jZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIG9wdGlvbmFsIC0tIHVuZGVmIGlmIHlvdSBsaWtlIFVuaXggc3R5bGUgKi8KLS8qIE5vdGU6IGlmIHlvdSB1bmRlZiBUV09fRklMRV9DT01NQU5ETElORSwgeW91IG1heSBuZWVkIHRvIGRlZmluZQotICogVVNFX1NFVE1PREUuICBTb21lIEF0YXJpIGNvbXBpbGVycyByZXF1aXJlIGl0LCBzb21lIGRvIG5vdC4KLSAqLwotI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCS8qIG5lZWRlZCBpZiB5b3UgdXNlIGptZW1uYW1lLmMgKi8KLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29uZmlnLnZjIGIvbGlianBlZ3R3cnAvamNvbmZpZy52YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyOTFjNy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY29uZmlnLnZjCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogamNvbmZpZy52YyAtLS0gamNvbmZpZy5oIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBvbiBXaW5kb3dzIDk1IG9yIE5ULiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIHdlIHByZXN1bWUgYSAzMi1iaXQgZmxhdCBtZW1vcnkgbW9kZWwgKi8KLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20gKi8KLSNpZm5kZWYgX19SUENORFJfSF9fCQkvKiBkb24ndCBjb25mbGljdCBpZiBycGNuZHIuaCBhbHJlYWR5IHJlYWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBib29sZWFuOwotI2VuZGlmCi0jZGVmaW5lIEhBVkVfQk9PTEVBTgkJLyogcHJldmVudCBqbW9yZWNmZy5oIGZyb20gcmVkZWZpbmluZyBpdCAqLwotCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogb3B0aW9uYWwgKi8KLSNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE1pY3Jvc29mdCBoYXMgc2V0bW9kZSgpICovCi0jdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjb25maWcudm1zIGIvbGlianBlZ3R3cnAvamNvbmZpZy52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YTZmZmIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNvbmZpZy52bXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBqY29uZmlnLnZtcyAtLS0gamNvbmZpZy5oIGZvciB1c2Ugb24gRGlnaXRhbCBWTVMuICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jZGVmaW5lIEhBVkVfU1REREVGX0gKLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0jdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQkvKiBOZWVkZWQgb24gVk1TICovCi0jdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjb25maWcud2F0IGIvbGlianBlZ3R3cnAvamNvbmZpZy53YXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzU0NWIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNvbmZpZy53YXQKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBqY29uZmlnLndhdCAtLS0gamNvbmZpZy5oIGZvciBXYXRjb20gQy9DKysgb24gTVMtRE9TIG9yIE9TLzIuICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSNkZWZpbmUgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIFdhdGNvbSB1c2VzIGZsYXQgMzItYml0IGFkZHJlc3NpbmcgKi8KLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIG9wdGlvbmFsICovCi0jZGVmaW5lIFVTRV9TRVRNT0RFCQkvKiBOZWVkZWQgdG8gbWFrZSBvbmUtZmlsZSBzdHlsZSB3b3JrIGluIFdhdGNvbSAqLwotI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtbmFtZS5jICovCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLwotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNwYXJhbS5jIGIvbGlianBlZ3R3cnAvamNwYXJhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGRjZjYxLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjcGFyYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDYxNCArMCwwIEBACi0vKgotICogamNwYXJhbS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgb3B0aW9uYWwgZGVmYXVsdC1zZXR0aW5nIGNvZGUgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCi0gKiBBcHBsaWNhdGlvbnMgZG8gbm90IGhhdmUgdG8gdXNlIHRoaXMgZmlsZSwgYnV0IHRob3NlIHRoYXQgZG9uJ3QgdXNlIGl0Ci0gKiBtdXN0IGtub3cgYSBsb3QgbW9yZSBhYm91dCB0aGUgaW5uYXJkcyBvZiB0aGUgSlBFRyBjb2RlLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICogUXVhbnRpemF0aW9uIHRhYmxlIHNldHVwIHJvdXRpbmVzCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2FkZF9xdWFudF90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCi0JCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCi0JCSAgICAgIGludCBzY2FsZV9mYWN0b3IsIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCi0vKiBEZWZpbmUgYSBxdWFudGl6YXRpb24gdGFibGUgZXF1YWwgdG8gdGhlIGJhc2ljX3RhYmxlIHRpbWVzCi0gKiBhIHNjYWxlIGZhY3RvciAoZ2l2ZW4gYXMgYSBwZXJjZW50YWdlKS4KLSAqIElmIGZvcmNlX2Jhc2VsaW5lIGlzIFRSVUUsIHRoZSBjb21wdXRlZCBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcwotICogYXJlIGxpbWl0ZWQgdG8gMS4uMjU1IGZvciBKUEVHIGJhc2VsaW5lIGNvbXBhdGliaWxpdHkuCi0gKi8KLXsKLSAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOwotICBpbnQgaTsKLSAgbG9uZyB0ZW1wOwotCi0gIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotCi0gIGlmICh3aGljaF90YmwgPCAwIHx8IHdoaWNoX3RibCA+PSBOVU1fUVVBTlRfVEJMUykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9EUVRfSU5ERVgsIHdoaWNoX3RibCk7Ci0KLSAgcXRibHB0ciA9ICYgY2luZm8tPnF1YW50X3RibF9wdHJzW3doaWNoX3RibF07Ci0KLSAgaWYgKCpxdGJscHRyID09IE5VTEwpCi0gICAgKnF0YmxwdHIgPSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotICAgIHRlbXAgPSAoKGxvbmcpIGJhc2ljX3RhYmxlW2ldICogc2NhbGVfZmFjdG9yICsgNTBMKSAvIDEwMEw7Ci0gICAgLyogbGltaXQgdGhlIHZhbHVlcyB0byB0aGUgdmFsaWQgcmFuZ2UgKi8KLSAgICBpZiAodGVtcCA8PSAwTCkgdGVtcCA9IDFMOwotICAgIGlmICh0ZW1wID4gMzI3NjdMKSB0ZW1wID0gMzI3NjdMOyAvKiBtYXggcXVhbnRpemVyIG5lZWRlZCBmb3IgMTIgYml0cyAqLwotICAgIGlmIChmb3JjZV9iYXNlbGluZSAmJiB0ZW1wID4gMjU1TCkKLSAgICAgIHRlbXAgPSAyNTVMOwkJLyogbGltaXQgdG8gYmFzZWxpbmUgcmFuZ2UgaWYgcmVxdWVzdGVkICovCi0gICAgKCpxdGJscHRyKS0+cXVhbnR2YWxbaV0gPSAoVUlOVDE2KSB0ZW1wOwotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBzZW50X3RhYmxlIEZBTFNFIHNvIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byBKUEVHIGZpbGUuICovCi0gICgqcXRibHB0ciktPnNlbnRfdGFibGUgPSBGQUxTRTsKLX0KLQotCi1HTE9CQUwodm9pZCkKLWpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHNjYWxlX2ZhY3RvciwKLQkJCSBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzCi0gKiBhbmQgYSBzdHJhaWdodCBwZXJjZW50YWdlLXNjYWxpbmcgcXVhbGl0eSBzY2FsZS4gIEluIG1vc3QgY2FzZXMgaXQncyBiZXR0ZXIKLSAqIHRvIHVzZSBqcGVnX3NldF9xdWFsaXR5IChiZWxvdyk7IHRoaXMgZW50cnkgcG9pbnQgaXMgcHJvdmlkZWQgZm9yCi0gKiBhcHBsaWNhdGlvbnMgdGhhdCBpbnNpc3Qgb24gYSBsaW5lYXIgcGVyY2VudGFnZSBzY2FsaW5nLgotICovCi17Ci0gIC8qIFRoZXNlIGFyZSB0aGUgc2FtcGxlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gSlBFRyBzcGVjIHNlY3Rpb24gSy4xLgotICAgKiBUaGUgc3BlYyBzYXlzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBwcm9kdWNlICJnb29kIiBxdWFsaXR5LCBhbmQKLSAgICogd2hlbiBkaXZpZGVkIGJ5IDIsICJ2ZXJ5IGdvb2QiIHF1YWxpdHkuCi0gICAqLwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0ZF9sdW1pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKLSAgICAxNiwgIDExLCAgMTAsICAxNiwgIDI0LCAgNDAsICA1MSwgIDYxLAotICAgIDEyLCAgMTIsICAxNCwgIDE5LCAgMjYsICA1OCwgIDYwLCAgNTUsCi0gICAgMTQsICAxMywgIDE2LCAgMjQsICA0MCwgIDU3LCAgNjksICA1NiwKLSAgICAxNCwgIDE3LCAgMjIsICAyOSwgIDUxLCAgODcsICA4MCwgIDYyLAotICAgIDE4LCAgMjIsICAzNywgIDU2LCAgNjgsIDEwOSwgMTAzLCAgNzcsCi0gICAgMjQsICAzNSwgIDU1LCAgNjQsICA4MSwgMTA0LCAxMTMsICA5MiwKLSAgICA0OSwgIDY0LCAgNzgsICA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAotICAgIDcyLCAgOTIsICA5NSwgIDk4LCAxMTIsIDEwMCwgMTAzLCAgOTkKLSAgfTsKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGRfY2hyb21pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKLSAgICAxNywgIDE4LCAgMjQsICA0NywgIDk5LCAgOTksICA5OSwgIDk5LAotICAgIDE4LCAgMjEsICAyNiwgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgMjQsICAyNiwgIDU2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICA0NywgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTkKLSAgfTsKLQotICAvKiBTZXQgdXAgdHdvIHF1YW50aXphdGlvbiB0YWJsZXMgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2FsaW5nICovCi0gIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCAwLCBzdGRfbHVtaW5hbmNlX3F1YW50X3RibCwKLQkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOwotICBqcGVnX2FkZF9xdWFudF90YWJsZShjaW5mbywgMSwgc3RkX2Nocm9taW5hbmNlX3F1YW50X3RibCwKLQkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOwotfQotCi0KLUdMT0JBTChpbnQpCi1qcGVnX3F1YWxpdHlfc2NhbGluZyAoaW50IHF1YWxpdHkpCi0vKiBDb252ZXJ0IGEgdXNlci1zcGVjaWZpZWQgcXVhbGl0eSByYXRpbmcgdG8gYSBwZXJjZW50YWdlIHNjYWxpbmcgZmFjdG9yCi0gKiBmb3IgYW4gdW5kZXJseWluZyBxdWFudGl6YXRpb24gdGFibGUsIHVzaW5nIG91ciByZWNvbW1lbmRlZCBzY2FsaW5nIGN1cnZlLgotICogVGhlIGlucHV0ICdxdWFsaXR5JyBmYWN0b3Igc2hvdWxkIGJlIDAgKHRlcnJpYmxlKSB0byAxMDAgKHZlcnkgZ29vZCkuCi0gKi8KLXsKLSAgLyogU2FmZXR5IGxpbWl0IG9uIHF1YWxpdHkgZmFjdG9yLiAgQ29udmVydCAwIHRvIDEgdG8gYXZvaWQgemVybyBkaXZpZGUuICovCi0gIGlmIChxdWFsaXR5IDw9IDApIHF1YWxpdHkgPSAxOwotICBpZiAocXVhbGl0eSA+IDEwMCkgcXVhbGl0eSA9IDEwMDsKLQotICAvKiBUaGUgYmFzaWMgdGFibGUgaXMgdXNlZCBhcy1pcyAoc2NhbGluZyAxMDApIGZvciBhIHF1YWxpdHkgb2YgNTAuCi0gICAqIFF1YWxpdGllcyA1MC4uMTAwIGFyZSBjb252ZXJ0ZWQgdG8gc2NhbGluZyBwZXJjZW50YWdlIDIwMCAtIDIqUTsKLSAgICogbm90ZSB0aGF0IGF0IFE9MTAwIHRoZSBzY2FsaW5nIGlzIDAsIHdoaWNoIHdpbGwgY2F1c2UganBlZ19hZGRfcXVhbnRfdGFibGUKLSAgICogdG8gbWFrZSBhbGwgdGhlIHRhYmxlIGVudHJpZXMgMSAoaGVuY2UsIG1pbmltdW0gcXVhbnRpemF0aW9uIGxvc3MpLgotICAgKiBRdWFsaXRpZXMgMS4uNTAgYXJlIGNvbnZlcnRlZCB0byBzY2FsaW5nIHBlcmNlbnRhZ2UgNTAwMC9RLgotICAgKi8KLSAgaWYgKHF1YWxpdHkgPCA1MCkKLSAgICBxdWFsaXR5ID0gNTAwMCAvIHF1YWxpdHk7Ci0gIGVsc2UKLSAgICBxdWFsaXR5ID0gMjAwIC0gcXVhbGl0eSoyOwotCi0gIHJldHVybiBxdWFsaXR5OwotfQotCi0KLUdMT0JBTCh2b2lkKQotanBlZ19zZXRfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzLgotICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgcXVhbGl0eS1hZGp1c3RpbmcgZW50cnkgcG9pbnQgZm9yIHR5cGljYWwgdXNlcgotICogaW50ZXJmYWNlczsgb25seSB0aG9zZSB3aG8gd2FudCBkZXRhaWxlZCBjb250cm9sIG92ZXIgcXVhbnRpemF0aW9uIHRhYmxlcwotICogd291bGQgdXNlIHRoZSBwcmVjZWRpbmcgdGhyZWUgcm91dGluZXMgZGlyZWN0bHkuCi0gKi8KLXsKLSAgLyogQ29udmVydCB1c2VyIDAtMTAwIHJhdGluZyB0byBwZXJjZW50YWdlIHNjYWxpbmcgKi8KLSAgcXVhbGl0eSA9IGpwZWdfcXVhbGl0eV9zY2FsaW5nKHF1YWxpdHkpOwotCi0gIC8qIFNldCB1cCBzdGFuZGFyZCBxdWFsaXR5IHRhYmxlcyAqLwotICBqcGVnX3NldF9saW5lYXJfcXVhbGl0eShjaW5mbywgcXVhbGl0eSwgZm9yY2VfYmFzZWxpbmUpOwotfQotCi0KLS8qCi0gKiBIdWZmbWFuIHRhYmxlIHNldHVwIHJvdXRpbmVzCi0gKi8KLQotTE9DQUwodm9pZCkKLWFkZF9odWZmX3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJSkhVRkZfVEJMICoqaHRibHB0ciwgY29uc3QgVUlOVDggKmJpdHMsIGNvbnN0IFVJTlQ4ICp2YWwpCi0vKiBEZWZpbmUgYSBIdWZmbWFuIHRhYmxlICovCi17Ci0gIGludCBuc3ltYm9scywgbGVuOwotCi0gIGlmICgqaHRibHB0ciA9PSBOVUxMKQotICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBDb3B5IHRoZSBudW1iZXItb2Ytc3ltYm9scy1vZi1lYWNoLWNvZGUtbGVuZ3RoIGNvdW50cyAqLwotICBNRU1DT1BZKCgqaHRibHB0ciktPmJpdHMsIGJpdHMsIFNJWkVPRigoKmh0YmxwdHIpLT5iaXRzKSk7Ci0KLSAgLyogVmFsaWRhdGUgdGhlIGNvdW50cy4gIFdlIGRvIHRoaXMgaGVyZSBtYWlubHkgc28gd2UgY2FuIGNvcHkgdGhlIHJpZ2h0Ci0gICAqIG51bWJlciBvZiBzeW1ib2xzIGZyb20gdGhlIHZhbFtdIGFycmF5LCB3aXRob3V0IHJpc2tpbmcgbWFyY2hpbmcgb2ZmCi0gICAqIHRoZSBlbmQgb2YgbWVtb3J5LiAgamNodWZmLmMgd2lsbCBkbyBhIG1vcmUgdGhvcm91Z2ggdGVzdCBsYXRlci4KLSAgICovCi0gIG5zeW1ib2xzID0gMDsKLSAgZm9yIChsZW4gPSAxOyBsZW4gPD0gMTY7IGxlbisrKQotICAgIG5zeW1ib2xzICs9IGJpdHNbbGVuXTsKLSAgaWYgKG5zeW1ib2xzIDwgMSB8fCBuc3ltYm9scyA+IDI1NikKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKLQotICBNRU1DT1BZKCgqaHRibHB0ciktPmh1ZmZ2YWwsIHZhbCwgbnN5bWJvbHMgKiBTSVpFT0YoVUlOVDgpKTsKLQotICAvKiBJbml0aWFsaXplIHNlbnRfdGFibGUgRkFMU0Ugc28gdGFibGUgd2lsbCBiZSB3cml0dGVuIHRvIEpQRUcgZmlsZS4gKi8KLSAgKCpodGJscHRyKS0+c2VudF90YWJsZSA9IEZBTFNFOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1zdGRfaHVmZl90YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogU2V0IHVwIHRoZSBzdGFuZGFyZCBIdWZmbWFuIHRhYmxlcyAoY2YuIEpQRUcgc3RhbmRhcmQgc2VjdGlvbiBLLjMpICovCi0vKiBJTVBPUlRBTlQ6IHRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbiEgKi8KLXsKLSAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfbHVtaW5hbmNlWzE3XSA9Ci0gICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMSwgNSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwotICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2RjX2x1bWluYW5jZVtdID0KLSAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSB9OwotICAKLSAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfY2hyb21pbmFuY2VbMTddID0KLSAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH07Ci0gIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfZGNfY2hyb21pbmFuY2VbXSA9Ci0gICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEgfTsKLSAgCi0gIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2x1bWluYW5jZVsxN10gPQotICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDIsIDEsIDMsIDMsIDIsIDQsIDMsIDUsIDUsIDQsIDQsIDAsIDAsIDEsIDB4N2QgfTsKLSAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9hY19sdW1pbmFuY2VbXSA9Ci0gICAgeyAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAotICAgICAgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywKLSAgICAgIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4YTEsIDB4MDgsCi0gICAgICAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAotICAgICAgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwKLSAgICAgIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCi0gICAgICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAotICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwKLSAgICAgIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksCi0gICAgICAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAotICAgICAgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwKLSAgICAgIDB4N2EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksCi0gICAgICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAotICAgICAgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywKLSAgICAgIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsCi0gICAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LAotICAgICAgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwKLSAgICAgIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTEsIDB4ZTIsCi0gICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLAotICAgICAgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKLSAgICAgIDB4ZjksIDB4ZmEgfTsKLSAgCi0gIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2Nocm9taW5hbmNlWzE3XSA9Ci0gICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMHg3NyB9OwotICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2FjX2Nocm9taW5hbmNlW10gPQotICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwKLSAgICAgIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsCi0gICAgICAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAotICAgICAgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwKLSAgICAgIDB4MTUsIDB4NjIsIDB4NzIsIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsCi0gICAgICAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI2LAotICAgICAgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKLSAgICAgIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsCi0gICAgICAweDQ5LCAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAotICAgICAgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwKLSAgICAgIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCi0gICAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAotICAgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwKLSAgICAgIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsCi0gICAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LAotICAgICAgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywKLSAgICAgIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsCi0gICAgICAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAotICAgICAgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwKLSAgICAgIDB4ZWEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCi0gICAgICAweGY5LCAweGZhIH07Ci0gIAotICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzBdLAotCQkgYml0c19kY19sdW1pbmFuY2UsIHZhbF9kY19sdW1pbmFuY2UpOwotICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5hY19odWZmX3RibF9wdHJzWzBdLAotCQkgYml0c19hY19sdW1pbmFuY2UsIHZhbF9hY19sdW1pbmFuY2UpOwotICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzFdLAotCQkgYml0c19kY19jaHJvbWluYW5jZSwgdmFsX2RjX2Nocm9taW5hbmNlKTsKLSAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1sxXSwKLQkJIGJpdHNfYWNfY2hyb21pbmFuY2UsIHZhbF9hY19jaHJvbWluYW5jZSk7Ci19Ci0KLQotLyoKLSAqIERlZmF1bHQgcGFyYW1ldGVyIHNldHVwIGZvciBjb21wcmVzc2lvbi4KLSAqCi0gKiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBjaG9vc2UgdG8gdXNlIHRoaXMgcm91dGluZSBtdXN0IGRvIHRoZWlyCi0gKiBvd24gc2V0dXAgb2YgYWxsIHRoZXNlIHBhcmFtZXRlcnMuICBBbHRlcm5hdGVseSwgeW91IGNhbiBjYWxsIHRoaXMKLSAqIHRvIGVzdGFibGlzaCBkZWZhdWx0cyBhbmQgdGhlbiBhbHRlciBwYXJhbWV0ZXJzIHNlbGVjdGl2ZWx5LiAgVGhpcwotICogaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoIHNpbmNlLCBpZiB3ZSBhZGQgYW55IG5ldyBwYXJhbWV0ZXJzLAotICogeW91ciBjb2RlIHdpbGwgc3RpbGwgd29yayAodGhleSdsbCBiZSBzZXQgdG8gcmVhc29uYWJsZSBkZWZhdWx0cykuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3NldF9kZWZhdWx0cyAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGludCBpOwotCi0gIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotCi0gIC8qIEFsbG9jYXRlIGNvbXBfaW5mbyBhcnJheSBsYXJnZSBlbm91Z2ggZm9yIG1heGltdW0gY29tcG9uZW50IGNvdW50LgotICAgKiBBcnJheSBpcyBtYWRlIHBlcm1hbmVudCBpbiBjYXNlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNvbXByZXNzCi0gICAqIG11bHRpcGxlIGltYWdlcyBhdCBzYW1lIHBhcmFtIHNldHRpbmdzLgotICAgKi8KLSAgaWYgKGNpbmZvLT5jb21wX2luZm8gPT0gTlVMTCkKLSAgICBjaW5mby0+Y29tcF9pbmZvID0gKGpwZWdfY29tcG9uZW50X2luZm8gKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAotCQkJCSAgTUFYX0NPTVBPTkVOVFMgKiBTSVpFT0YoanBlZ19jb21wb25lbnRfaW5mbykpOwotCi0gIC8qIEluaXRpYWxpemUgZXZlcnl0aGluZyBub3QgZGVwZW5kZW50IG9uIHRoZSBjb2xvciBzcGFjZSAqLwotCi0gIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IEJJVFNfSU5fSlNBTVBMRTsKLSAgLyogU2V0IHVwIHR3byBxdWFudGl6YXRpb24gdGFibGVzIHVzaW5nIGRlZmF1bHQgcXVhbGl0eSBvZiA3NSAqLwotICBqcGVnX3NldF9xdWFsaXR5KGNpbmZvLCA3NSwgVFJVRSk7Ci0gIC8qIFNldCB1cCB0d28gSHVmZm1hbiB0YWJsZXMgKi8KLSAgc3RkX2h1ZmZfdGFibGVzKGNpbmZvKTsKLQotICAvKiBJbml0aWFsaXplIGRlZmF1bHQgYXJpdGhtZXRpYyBjb2RpbmcgY29uZGl0aW9uaW5nICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7Ci0gICAgY2luZm8tPmFyaXRoX2RjX0xbaV0gPSAwOwotICAgIGNpbmZvLT5hcml0aF9kY19VW2ldID0gMTsKLSAgICBjaW5mby0+YXJpdGhfYWNfS1tpXSA9IDU7Ci0gIH0KLQotICAvKiBEZWZhdWx0IGlzIG5vIG11bHRpcGxlLXNjYW4gb3V0cHV0ICovCi0gIGNpbmZvLT5zY2FuX2luZm8gPSBOVUxMOwotICBjaW5mby0+bnVtX3NjYW5zID0gMDsKLQotICAvKiBFeHBlY3Qgbm9ybWFsIHNvdXJjZSBpbWFnZSwgbm90IHJhdyBkb3duc2FtcGxlZCBkYXRhICovCi0gIGNpbmZvLT5yYXdfZGF0YV9pbiA9IEZBTFNFOwotCi0gIC8qIFVzZSBIdWZmbWFuIGNvZGluZywgbm90IGFyaXRobWV0aWMgY29kaW5nLCBieSBkZWZhdWx0ICovCi0gIGNpbmZvLT5hcml0aF9jb2RlID0gRkFMU0U7Ci0KLSAgLyogQnkgZGVmYXVsdCwgZG9uJ3QgZG8gZXh0cmEgcGFzc2VzIHRvIG9wdGltaXplIGVudHJvcHkgY29kaW5nICovCi0gIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBGQUxTRTsKLSAgLyogVGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbi4KLSAgICogSWYgdGhlIHByZWNpc2lvbiBpcyBoaWdoZXIsIGZvcmNlIG9wdGltaXphdGlvbiBvbiBzbyB0aGF0IHVzYWJsZQotICAgKiB0YWJsZXMgd2lsbCBiZSBjb21wdXRlZC4gIFRoaXMgdGVzdCBjYW4gYmUgcmVtb3ZlZCBpZiBkZWZhdWx0IHRhYmxlcwotICAgKiBhcmUgc3VwcGxpZWQgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBkZXNpcmVkIHByZWNpc2lvbi4KLSAgICovCi0gIGlmIChjaW5mby0+ZGF0YV9wcmVjaXNpb24gPiA4KQotICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOwotCi0gIC8qIEJ5IGRlZmF1bHQsIHVzZSB0aGUgc2ltcGxlciBub24tY29zaXRlZCBzYW1wbGluZyBhbGlnbm1lbnQgKi8KLSAgY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcgPSBGQUxTRTsKLQotICAvKiBObyBpbnB1dCBzbW9vdGhpbmcgKi8KLSAgY2luZm8tPnNtb290aGluZ19mYWN0b3IgPSAwOwotCi0gIC8qIERDVCBhbGdvcml0aG0gcHJlZmVyZW5jZSAqLwotICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfREVGQVVMVDsKLQotICAvKiBObyByZXN0YXJ0IG1hcmtlcnMgKi8KLSAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAwOwotICBjaW5mby0+cmVzdGFydF9pbl9yb3dzID0gMDsKLQotICAvKiBGaWxsIGluIGRlZmF1bHQgSkZJRiBtYXJrZXIgcGFyYW1ldGVycy4gIE5vdGUgdGhhdCB3aGV0aGVyIHRoZSBtYXJrZXIKLSAgICogd2lsbCBhY3R1YWxseSBiZSB3cml0dGVuIGlzIGRldGVybWluZWQgYnkganBlZ19zZXRfY29sb3JzcGFjZS4KLSAgICoKLSAgICogQnkgZGVmYXVsdCwgdGhlIGxpYnJhcnkgZW1pdHMgSkZJRiB2ZXJzaW9uIGNvZGUgMS4wMS4KLSAgICogQW4gYXBwbGljYXRpb24gdGhhdCB3YW50cyB0byBlbWl0IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBzaG91bGQgc2V0Ci0gICAqIEpGSUZfbWlub3JfdmVyc2lvbiB0byAyLiAgV2UgY291bGQgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCBqdXN0IGRlZmF1bHRpbmcKLSAgICogdG8gMS4wMiwgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBzb21lIGRlY29kZXJzIGluIHVzZSB0aGF0IHdpbGwgY29tcGxhaW4KLSAgICogYWJvdXQgdGhhdDsgc2F5aW5nIDEuMDEgc2hvdWxkIG1pbmltaXplIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuCi0gICAqLwotICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gMTsgLyogRGVmYXVsdCBKRklGIHZlcnNpb24gPSAxLjAxICovCi0gIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSAxOwotICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMDsJLyogUGl4ZWwgc2l6ZSBpcyB1bmtub3duIGJ5IGRlZmF1bHQgKi8KLSAgY2luZm8tPlhfZGVuc2l0eSA9IDE7CQkvKiBQaXhlbCBhc3BlY3QgcmF0aW8gaXMgc3F1YXJlIGJ5IGRlZmF1bHQgKi8KLSAgY2luZm8tPllfZGVuc2l0eSA9IDE7Ci0KLSAgLyogQ2hvb3NlIEpQRUcgY29sb3JzcGFjZSBiYXNlZCBvbiBpbnB1dCBzcGFjZSwgc2V0IGRlZmF1bHRzIGFjY29yZGluZ2x5ICovCi0KLSAganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoY2luZm8pOwotfQotCi0KLS8qCi0gKiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUgSlBFRyBjb2xvcnNwYWNlIGZvciBpbl9jb2xvcl9zcGFjZS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgc3dpdGNoIChjaW5mby0+aW5fY29sb3Jfc3BhY2UpIHsKLSAgY2FzZSBKQ1NfR1JBWVNDQUxFOgotICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19HUkFZU0NBTEUpOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19SR0I6Ci0gICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfQ01ZSzoKLSAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfQ01ZSyk7IC8qIEJ5IGRlZmF1bHQsIG5vIHRyYW5zbGF0aW9uICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX1lDQ0s6Ci0gICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDQ0spOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19VTktOT1dOOgotICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19VTktOT1dOKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKLSAgfQotfQotCi0KLS8qCi0gKiBTZXQgdGhlIEpQRUcgY29sb3JzcGFjZSwgYW5kIGNob29zZSBjb2xvcnNwYWNlLWRlcGVuZGVudCBkZWZhdWx0IHZhbHVlcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfc2V0X2NvbG9yc3BhY2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0NPTE9SX1NQQUNFIGNvbG9yc3BhY2UpCi17Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBpbnQgY2k7Ci0KLSNkZWZpbmUgU0VUX0NPTVAoaW5kZXgsaWQsaHNhbXAsdnNhbXAscXVhbnQsZGN0YmwsYWN0YmwpICBcCi0gIChjb21wcHRyID0gJmNpbmZvLT5jb21wX2luZm9baW5kZXhdLCBcCi0gICBjb21wcHRyLT5jb21wb25lbnRfaWQgPSAoaWQpLCBcCi0gICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yID0gKGhzYW1wKSwgXAotICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9ICh2c2FtcCksIFwKLSAgIGNvbXBwdHItPnF1YW50X3RibF9ubyA9IChxdWFudCksIFwKLSAgIGNvbXBwdHItPmRjX3RibF9ubyA9IChkY3RibCksIFwKLSAgIGNvbXBwdHItPmFjX3RibF9ubyA9IChhY3RibCkgKQotCi0gIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotCi0gIC8qIEZvciBhbGwgY29sb3JzcGFjZXMsIHdlIHVzZSBRIGFuZCBIdWZmIHRhYmxlcyAwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cywKLSAgICogdGFibGVzIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCi0gICAqLwotCi0gIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gY29sb3JzcGFjZTsKLQotICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBGQUxTRTsgLyogTm8gbWFya2VyIGZvciBub24tSkZJRiBjb2xvcnNwYWNlcyAqLwotICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gRkFMU0U7IC8qIHdyaXRlIG5vIEFkb2JlIG1hcmtlciBieSBkZWZhdWx0ICovCi0KLSAgc3dpdGNoIChjb2xvcnNwYWNlKSB7Ci0gIGNhc2UgSkNTX0dSQVlTQ0FMRToKLSAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCi0gICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMTsKLSAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSUQgMSAqLwotICAgIFNFVF9DT01QKDAsIDEsIDEsMSwgMCwgMCwwKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfUkdCOgotICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBSR0IgKi8KLSAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgPSAzOwotICAgIFNFVF9DT01QKDAsIDB4NTIgLyogJ1InICovLCAxLDEsIDAsIDAsMCk7Ci0gICAgU0VUX0NPTVAoMSwgMHg0NyAvKiAnRycgKi8sIDEsMSwgMCwgMCwwKTsKLSAgICBTRVRfQ09NUCgyLCAweDQyIC8qICdCJyAqLywgMSwxLCAwLCAwLDApOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19ZQ2JDcjoKLSAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCi0gICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMzsKLSAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSURzIDEsMiwzICovCi0gICAgLyogV2UgZGVmYXVsdCB0byAyeDIgc3Vic2FtcGxlcyBvZiBjaHJvbWluYW5jZSAqLwotICAgIFNFVF9DT01QKDAsIDEsIDIsMiwgMCwgMCwwKTsKLSAgICBTRVRfQ09NUCgxLCAyLCAxLDEsIDEsIDEsMSk7Ci0gICAgU0VUX0NPTVAoMiwgMywgMSwxLCAxLCAxLDEpOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19DTVlLOgotICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBDTVlLICovCi0gICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKLSAgICBTRVRfQ09NUCgwLCAweDQzIC8qICdDJyAqLywgMSwxLCAwLCAwLDApOwotICAgIFNFVF9DT01QKDEsIDB4NEQgLyogJ00nICovLCAxLDEsIDAsIDAsMCk7Ci0gICAgU0VUX0NPTVAoMiwgMHg1OSAvKiAnWScgKi8sIDEsMSwgMCwgMCwwKTsKLSAgICBTRVRfQ09NUCgzLCAweDRCIC8qICdLJyAqLywgMSwxLCAwLCAwLDApOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19ZQ0NLOgotICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBZQ0NLICovCi0gICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKLSAgICBTRVRfQ09NUCgwLCAxLCAyLDIsIDAsIDAsMCk7Ci0gICAgU0VUX0NPTVAoMSwgMiwgMSwxLCAxLCAxLDEpOwotICAgIFNFVF9DT01QKDIsIDMsIDEsMSwgMSwgMSwxKTsKLSAgICBTRVRfQ09NUCgzLCA0LCAyLDIsIDAsIDAsMCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX1VOS05PV046Ci0gICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gY2luZm8tPmlucHV0X2NvbXBvbmVudHM7Ci0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA8IDEgfHwgY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCi0gICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKLQkgICAgICAgTUFYX0NPTVBPTkVOVFMpOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgICAgU0VUX0NPTVAoY2ksIGNpLCAxLDEsIDAsIDAsMCk7Ci0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gIH0KLX0KLQotCi0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLQotTE9DQUwoanBlZ19zY2FuX2luZm8gKikKLWZpbGxfYV9zY2FuIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBjaSwKLQkgICAgIGludCBTcywgaW50IFNlLCBpbnQgQWgsIGludCBBbCkKLS8qIFN1cHBvcnQgcm91dGluZTogZ2VuZXJhdGUgb25lIHNjYW4gZm9yIHNwZWNpZmllZCBjb21wb25lbnQgKi8KLXsKLSAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7Ci0gIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFswXSA9IGNpOwotICBzY2FucHRyLT5TcyA9IFNzOwotICBzY2FucHRyLT5TZSA9IFNlOwotICBzY2FucHRyLT5BaCA9IEFoOwotICBzY2FucHRyLT5BbCA9IEFsOwotICBzY2FucHRyKys7Ci0gIHJldHVybiBzY2FucHRyOwotfQotCi1MT0NBTChqcGVnX3NjYW5faW5mbyAqKQotZmlsbF9zY2FucyAoanBlZ19zY2FuX2luZm8gKiBzY2FucHRyLCBpbnQgbmNvbXBzLAotCSAgICBpbnQgU3MsIGludCBTZSwgaW50IEFoLCBpbnQgQWwpCi0vKiBTdXBwb3J0IHJvdXRpbmU6IGdlbmVyYXRlIG9uZSBzY2FuIGZvciBlYWNoIGNvbXBvbmVudCAqLwotewotICBpbnQgY2k7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7Ci0gICAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7Ci0gICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4WzBdID0gY2k7Ci0gICAgc2NhbnB0ci0+U3MgPSBTczsKLSAgICBzY2FucHRyLT5TZSA9IFNlOwotICAgIHNjYW5wdHItPkFoID0gQWg7Ci0gICAgc2NhbnB0ci0+QWwgPSBBbDsKLSAgICBzY2FucHRyKys7Ci0gIH0KLSAgcmV0dXJuIHNjYW5wdHI7Ci19Ci0KLUxPQ0FMKGpwZWdfc2Nhbl9pbmZvICopCi1maWxsX2RjX3NjYW5zIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBuY29tcHMsIGludCBBaCwgaW50IEFsKQotLyogU3VwcG9ydCByb3V0aW5lOiBnZW5lcmF0ZSBpbnRlcmxlYXZlZCBEQyBzY2FuIGlmIHBvc3NpYmxlLCBlbHNlIE4gc2NhbnMgKi8KLXsKLSAgaW50IGNpOwotCi0gIGlmIChuY29tcHMgPD0gTUFYX0NPTVBTX0lOX1NDQU4pIHsKLSAgICAvKiBTaW5nbGUgaW50ZXJsZWF2ZWQgREMgc2NhbiAqLwotICAgIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSBuY29tcHM7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKQotICAgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXSA9IGNpOwotICAgIHNjYW5wdHItPlNzID0gc2NhbnB0ci0+U2UgPSAwOwotICAgIHNjYW5wdHItPkFoID0gQWg7Ci0gICAgc2NhbnB0ci0+QWwgPSBBbDsKLSAgICBzY2FucHRyKys7Ci0gIH0gZWxzZSB7Ci0gICAgLyogTm9uaW50ZXJsZWF2ZWQgREMgc2NhbiBmb3IgZWFjaCBjb21wb25lbnQgKi8KLSAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDAsIDAsIEFoLCBBbCk7Ci0gIH0KLSAgcmV0dXJuIHNjYW5wdHI7Ci19Ci0KLQotLyoKLSAqIENyZWF0ZSBhIHJlY29tbWVuZGVkIHByb2dyZXNzaXZlLUpQRUcgc2NyaXB0LgotICogY2luZm8tPm51bV9jb21wb25lbnRzIGFuZCBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSBtdXN0IGJlIGNvcnJlY3QuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGludCBuY29tcHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gIGludCBuc2NhbnM7Ci0gIGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0cjsKLQotICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLwotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICAvKiBGaWd1cmUgc3BhY2UgbmVlZGVkIGZvciBzY3JpcHQuICBDYWxjdWxhdGlvbiBtdXN0IG1hdGNoIGNvZGUgYmVsb3chICovCi0gIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKLSAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCi0gICAgbnNjYW5zID0gMTA7Ci0gIH0gZWxzZSB7Ci0gICAgLyogQWxsLXB1cnBvc2Ugc2NyaXB0IGZvciBvdGhlciBjb2xvciBzcGFjZXMuICovCi0gICAgaWYgKG5jb21wcyA+IE1BWF9DT01QU19JTl9TQ0FOKQotICAgICAgbnNjYW5zID0gNiAqIG5jb21wczsJLyogMiBEQyArIDQgQUMgc2NhbnMgcGVyIGNvbXBvbmVudCAqLwotICAgIGVsc2UKLSAgICAgIG5zY2FucyA9IDIgKyA0ICogbmNvbXBzOwkvKiAyIERDIHNjYW5zOyA0IEFDIHNjYW5zIHBlciBjb21wb25lbnQgKi8KLSAgfQotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBzY3JpcHQuCi0gICAqIFdlIG5lZWQgdG8gcHV0IGl0IGluIHRoZSBwZXJtYW5lbnQgcG9vbCBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBwZXJmb3JtcwotICAgKiBtdWx0aXBsZSBjb21wcmVzc2lvbnMgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2V0dGluZ3MuICBUbyBhdm9pZCBhIG1lbW9yeQotICAgKiBsZWFrIGlmIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGlzIGNhbGxlZCByZXBlYXRlZGx5IGZvciB0aGUgc2FtZSBKUEVHCi0gICAqIG9iamVjdCwgd2UgdHJ5IHRvIHJlLXVzZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzcGFjZSwgYW5kIHdlIGFsbG9jYXRlCi0gICAqIGVub3VnaCBzcGFjZSB0byBoYW5kbGUgWUNiQ3IgZXZlbiBpZiBpbml0aWFsbHkgYXNrZWQgZm9yIGdyYXlzY2FsZS4KLSAgICovCi0gIGlmIChjaW5mby0+c2NyaXB0X3NwYWNlID09IE5VTEwgfHwgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplIDwgbnNjYW5zKSB7Ci0gICAgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplID0gTUFYKG5zY2FucywgMTApOwotICAgIGNpbmZvLT5zY3JpcHRfc3BhY2UgPSAoanBlZ19zY2FuX2luZm8gKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAotCQkJY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplICogU0laRU9GKGpwZWdfc2Nhbl9pbmZvKSk7Ci0gIH0KLSAgc2NhbnB0ciA9IGNpbmZvLT5zY3JpcHRfc3BhY2U7Ci0gIGNpbmZvLT5zY2FuX2luZm8gPSBzY2FucHRyOwotICBjaW5mby0+bnVtX3NjYW5zID0gbnNjYW5zOwotCi0gIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKLSAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCi0gICAgLyogSW5pdGlhbCBEQyBzY2FuICovCi0gICAgc2NhbnB0ciA9IGZpbGxfZGNfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAwLCAxKTsKLSAgICAvKiBJbml0aWFsIEFDIHNjYW46IGdldCBzb21lIGx1bWEgZGF0YSBvdXQgaW4gYSBodXJyeSAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA1LCAwLCAyKTsKLSAgICAvKiBDaHJvbWEgZGF0YSBpcyB0b28gc21hbGwgdG8gYmUgd29ydGggZXhwZW5kaW5nIG1hbnkgc2NhbnMgb24gKi8KLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMiwgMSwgNjMsIDAsIDEpOwotICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAxLCAxLCA2MywgMCwgMSk7Ci0gICAgLyogQ29tcGxldGUgc3BlY3RyYWwgc2VsZWN0aW9uIGZvciBsdW1hIEFDICovCi0gICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDYsIDYzLCAwLCAyKTsKLSAgICAvKiBSZWZpbmUgbmV4dCBiaXQgb2YgbHVtYSBBQyAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA2MywgMiwgMSk7Ci0gICAgLyogRmluaXNoIERDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7Ci0gICAgLyogRmluaXNoIEFDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAyLCAxLCA2MywgMSwgMCk7Ci0gICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDEsIDEsIDYzLCAxLCAwKTsKLSAgICAvKiBMdW1hIGJvdHRvbSBiaXQgY29tZXMgbGFzdCBzaW5jZSBpdCdzIHVzdWFsbHkgbGFyZ2VzdCBzY2FuICovCi0gICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDEsIDYzLCAxLCAwKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBBbGwtcHVycG9zZSBzY3JpcHQgZm9yIG90aGVyIGNvbG9yIHNwYWNlcy4gKi8KLSAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmlyc3QgcGFzcyAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMCwgMSk7Ci0gICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA1LCAwLCAyKTsKLSAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDYsIDYzLCAwLCAyKTsKLSAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gc2Vjb25kIHBhc3MgKi8KLSAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDYzLCAyLCAxKTsKLSAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmluYWwgcGFzcyAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7Ci0gICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA2MywgMSwgMCk7Ci0gIH0KLSNpZmRlZiBORUVEU19BUk1fRVJSQVRBXzc1NDMxOV83NTQzMjAKLSAgYXNtIHZvbGF0aWxlICggInZtb3YgczAsczBcbiIgKTsKLSNlbmRpZgotCi19Ci0KLSNlbmRpZiAvKiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNwaHVmZi5jIGIvbGlianBlZ3R3cnAvamNwaHVmZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Y5MTc4Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjcGh1ZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDgzMyArMCwwIEBACi0vKgotICogamNwaHVmZi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nIHJvdXRpbmVzIGZvciBwcm9ncmVzc2l2ZSBKUEVHLgotICoKLSAqIFdlIGRvIG5vdCBzdXBwb3J0IG91dHB1dCBzdXNwZW5zaW9uIGluIHRoaXMgbW9kdWxlLCBzaW5jZSB0aGUgbGlicmFyeQotICogY3VycmVudGx5IGRvZXMgbm90IGFsbG93IG11bHRpcGxlLXNjYW4gZmlsZXMgdG8gYmUgd3JpdHRlbiB3aXRoIG91dHB1dAotICogc3VzcGVuc2lvbi4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamNodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamNodWZmLmMgKi8KLQotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0KLS8qIEV4cGFuZGVkIGVudHJvcHkgZW5jb2RlciBvYmplY3QgZm9yIHByb2dyZXNzaXZlIEh1ZmZtYW4gZW5jb2RpbmcuICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIE1vZGUgZmxhZzogVFJVRSBmb3Igb3B0aW1pemF0aW9uLCBGQUxTRSBmb3IgYWN0dWFsIGRhdGEgb3V0cHV0ICovCi0gIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3M7Ci0KLSAgLyogQml0LWxldmVsIGNvZGluZyBzdGF0dXMuCi0gICAqIG5leHRfb3V0cHV0X2J5dGUvZnJlZV9pbl9idWZmZXIgYXJlIGxvY2FsIGNvcGllcyBvZiBjaW5mby0+ZGVzdCBmaWVsZHMuCi0gICAqLwotICBKT0NURVQgKiBuZXh0X291dHB1dF9ieXRlOwkvKiA9PiBuZXh0IGJ5dGUgdG8gd3JpdGUgaW4gYnVmZmVyICovCi0gIHNpemVfdCBmcmVlX2luX2J1ZmZlcjsJLyogIyBvZiBieXRlIHNwYWNlcyByZW1haW5pbmcgaW4gYnVmZmVyICovCi0gIElOVDMyIHB1dF9idWZmZXI7CQkvKiBjdXJyZW50IGJpdC1hY2N1bXVsYXRpb24gYnVmZmVyICovCi0gIGludCBwdXRfYml0czsJCQkvKiAjIG9mIGJpdHMgbm93IGluIGl0ICovCi0gIGpfY29tcHJlc3NfcHRyIGNpbmZvOwkJLyogbGluayB0byBjaW5mbyAobmVlZGVkIGZvciBkdW1wX2J1ZmZlcikgKi8KLQotICAvKiBDb2Rpbmcgc3RhdHVzIGZvciBEQyBjb21wb25lbnRzICovCi0gIGludCBsYXN0X2RjX3ZhbFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIGxhc3QgREMgY29lZiBmb3IgZWFjaCBjb21wb25lbnQgKi8KLQotICAvKiBDb2Rpbmcgc3RhdHVzIGZvciBBQyBjb21wb25lbnRzICovCi0gIGludCBhY190Ymxfbm87CQkvKiB0aGUgdGFibGUgbnVtYmVyIG9mIHRoZSBzaW5nbGUgY29tcG9uZW50ICovCi0gIHVuc2lnbmVkIGludCBFT0JSVU47CQkvKiBydW4gbGVuZ3RoIG9mIEVPQnMgKi8KLSAgdW5zaWduZWQgaW50IEJFOwkJLyogIyBvZiBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgYmVmb3JlIE1DVSAqLwotICBjaGFyICogYml0X2J1ZmZlcjsJCS8qIGJ1ZmZlciBmb3IgY29ycmVjdGlvbiBiaXRzICgxIHBlciBjaGFyKSAqLwotICAvKiBwYWNraW5nIGNvcnJlY3Rpb24gYml0cyB0aWdodGx5IHdvdWxkIHNhdmUgc29tZSBzcGFjZSBidXQgY29zdCB0aW1lLi4uICovCi0KLSAgdW5zaWduZWQgaW50IHJlc3RhcnRzX3RvX2dvOwkvKiBNQ1VzIGxlZnQgaW4gdGhpcyByZXN0YXJ0IGludGVydmFsICovCi0gIGludCBuZXh0X3Jlc3RhcnRfbnVtOwkJLyogbmV4dCByZXN0YXJ0IG51bWJlciB0byB3cml0ZSAoMC03KSAqLwotCi0gIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pLgotICAgKiBTaW5jZSBhbnkgb25lIHNjYW4gY29kZXMgb25seSBEQyBvciBvbmx5IEFDLCB3ZSBvbmx5IG5lZWQgb25lIHNldAotICAgKiBvZiB0YWJsZXMsIG5vdCBvbmUgZm9yIERDIGFuZCBvbmUgZm9yIEFDLgotICAgKi8KLSAgY19kZXJpdmVkX3RibCAqIGRlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKLQotICAvKiBTdGF0aXN0aWNzIHRhYmxlcyBmb3Igb3B0aW1pemF0aW9uOyBhZ2Fpbiwgb25lIHNldCBpcyBlbm91Z2ggKi8KLSAgbG9uZyAqIGNvdW50X3B0cnNbTlVNX0hVRkZfVEJMU107Ci19IHBodWZmX2VudHJvcHlfZW5jb2RlcjsKLQotdHlwZWRlZiBwaHVmZl9lbnRyb3B5X2VuY29kZXIgKiBwaHVmZl9lbnRyb3B5X3B0cjsKLQotLyogTUFYX0NPUlJfQklUUyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhlIEFDIHJlZmluZW1lbnQgY29ycmVjdGlvbi1iaXQKLSAqIGJ1ZmZlciBjYW4gaG9sZC4gIExhcmdlciBzaXplcyBtYXkgc2xpZ2h0bHkgaW1wcm92ZSBjb21wcmVzc2lvbiwgYnV0Ci0gKiAxMDAwIGlzIGFscmVhZHkgd2VsbCBpbnRvIHRoZSByZWFsbSBvZiBvdmVya2lsbC4KLSAqIFRoZSBtaW5pbXVtIHNhZmUgc2l6ZSBpcyA2NCBiaXRzLgotICovCi0KLSNkZWZpbmUgTUFYX0NPUlJfQklUUyAgMTAwMAkvKiBNYXggIyBvZiBjb3JyZWN0aW9uIGJpdHMgSSBjYW4gYnVmZmVyICovCi0KLS8qIElSSUdIVF9TSElGVCBpcyBsaWtlIFJJR0hUX1NISUZULCBidXQgd29ya3Mgb24gaW50IHJhdGhlciB0aGFuIElOVDMyLgotICogV2UgYXNzdW1lIHRoYXQgaW50IHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkIGlmIElOVDMyIHJpZ2h0IHNoaWZ0IGlzLAotICogd2hpY2ggc2hvdWxkIGJlIHNhZmUuCi0gKi8KLQotI2lmZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0jZGVmaW5lIElTSElGVF9URU1QUwlpbnQgaXNoaWZ0X3RlbXA7Ci0jZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpICBcCi0JKChpc2hpZnRfdGVtcCA9ICh4KSkgPCAwID8gXAotCSAoaXNoaWZ0X3RlbXAgPj4gKHNoZnQpKSB8ICgofjApIDw8ICgxNi0oc2hmdCkpKSA6IFwKLQkgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkpCi0jZWxzZQotI2RlZmluZSBJU0hJRlRfVEVNUFMKLSNkZWZpbmUgSVJJR0hUX1NISUZUKHgsc2hmdCkJKCh4KSA+PiAoc2hmdCkpCi0jZW5kaWYKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0RDX2ZpcnN0IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9BQ19maXJzdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfRENfcmVmaW5lIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfQUNfcmVmaW5lIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKHZvaWQpIGZpbmlzaF9wYXNzX3BodWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLU1FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19nYXRoZXJfcGh1ZmYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuIHVzaW5nIHByb2dyZXNzaXZlIEpQRUcuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX3BodWZmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBnYXRoZXJfc3RhdGlzdGljcykKLXsgIAotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgYm9vbGVhbiBpc19EQ19iYW5kOwotICBpbnQgY2ksIHRibDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0KLSAgZW50cm9weS0+Y2luZm8gPSBjaW5mbzsKLSAgZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MgPSBnYXRoZXJfc3RhdGlzdGljczsKLQotICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKLQotICAvKiBXZSBhc3N1bWUgamNtYXN0ZXIuYyBhbHJlYWR5IHZhbGlkYXRlZCB0aGUgc2NhbiBwYXJhbWV0ZXJzLiAqLwotCi0gIC8qIFNlbGVjdCBleGVjdXRpb24gcm91dGluZXMgKi8KLSAgaWYgKGNpbmZvLT5BaCA9PSAwKSB7Ci0gICAgaWYgKGlzX0RDX2JhbmQpCi0gICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfRENfZmlyc3Q7Ci0gICAgZWxzZQotICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0FDX2ZpcnN0OwotICB9IGVsc2UgewotICAgIGlmIChpc19EQ19iYW5kKQotICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0RDX3JlZmluZTsKLSAgICBlbHNlIHsKLSAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9BQ19yZWZpbmU7Ci0gICAgICAvKiBBQyByZWZpbmVtZW50IG5lZWRzIGEgY29ycmVjdGlvbiBiaXQgYnVmZmVyICovCi0gICAgICBpZiAoZW50cm9weS0+Yml0X2J1ZmZlciA9PSBOVUxMKQotCWVudHJvcHktPmJpdF9idWZmZXIgPSAoY2hhciAqKQotCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICBNQVhfQ09SUl9CSVRTICogU0laRU9GKGNoYXIpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGdhdGhlcl9zdGF0aXN0aWNzKQotICAgIGVudHJvcHktPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX2dhdGhlcl9waHVmZjsKLSAgZWxzZQotICAgIGVudHJvcHktPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX3BodWZmOwotCi0gIC8qIE9ubHkgREMgY29lZmZpY2llbnRzIG1heSBiZSBpbnRlcmxlYXZlZCwgc28gY2luZm8tPmNvbXBzX2luX3NjYW4gPSAxCi0gICAqIGZvciBBQyBjb2VmZmljaWVudHMuCi0gICAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCi0gICAgZW50cm9weS0+bGFzdF9kY192YWxbY2ldID0gMDsKLSAgICAvKiBHZXQgdGFibGUgaW5kZXggKi8KLSAgICBpZiAoaXNfRENfYmFuZCkgewotICAgICAgaWYgKGNpbmZvLT5BaCAhPSAwKQkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCi0JY29udGludWU7Ci0gICAgICB0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVudHJvcHktPmFjX3RibF9ubyA9IHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKLSAgICB9Ci0gICAgaWYgKGdhdGhlcl9zdGF0aXN0aWNzKSB7Ci0gICAgICAvKiBDaGVjayBmb3IgaW52YWxpZCB0YWJsZSBpbmRleCAqLwotICAgICAgLyogKG1ha2VfY19kZXJpdmVkX3RibCBkb2VzIHRoaXMgaW4gdGhlIG90aGVyIHBhdGgpICovCi0gICAgICBpZiAodGJsIDwgMCB8fCB0YmwgPj0gTlVNX0hVRkZfVEJMUykKLSAgICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsKTsKLSAgICAgIC8qIEFsbG9jYXRlIGFuZCB6ZXJvIHRoZSBzdGF0aXN0aWNzIHRhYmxlcyAqLwotICAgICAgLyogTm90ZSB0aGF0IGpwZWdfZ2VuX29wdGltYWxfdGFibGUgZXhwZWN0cyAyNTcgZW50cmllcyBpbiBlYWNoIHRhYmxlISAqLwotICAgICAgaWYgKGVudHJvcHktPmNvdW50X3B0cnNbdGJsXSA9PSBOVUxMKQotCWVudHJvcHktPmNvdW50X3B0cnNbdGJsXSA9IChsb25nICopCi0JICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICAgIDI1NyAqIFNJWkVPRihsb25nKSk7Ci0gICAgICBNRU1aRVJPKGVudHJvcHktPmNvdW50X3B0cnNbdGJsXSwgMjU3ICogU0laRU9GKGxvbmcpKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogQ29tcHV0ZSBkZXJpdmVkIHZhbHVlcyBmb3IgSHVmZm1hbiB0YWJsZSAqLwotICAgICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIGEgdGFibGUsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUgKi8KLSAgICAgIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsKGNpbmZvLCBpc19EQ19iYW5kLCB0YmwsCi0JCQkgICAgICAmIGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdKTsKLSAgICB9Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIEFDIHN0dWZmICovCi0gIGVudHJvcHktPkVPQlJVTiA9IDA7Ci0gIGVudHJvcHktPkJFID0gMDsKLQotICAvKiBJbml0aWFsaXplIGJpdCBidWZmZXIgdG8gZW1wdHkgKi8KLSAgZW50cm9weS0+cHV0X2J1ZmZlciA9IDA7Ci0gIGVudHJvcHktPnB1dF9iaXRzID0gMDsKLQotICAvKiBJbml0aWFsaXplIHJlc3RhcnQgc3R1ZmYgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSA9IDA7Ci19Ci0KLQotLyogT3V0cHV0dGluZyBieXRlcyB0byB0aGUgZmlsZS4KLSAqIE5COiB0aGVzZSBtdXN0IGJlIGNhbGxlZCBvbmx5IHdoZW4gYWN0dWFsbHkgb3V0cHV0dGluZywKLSAqIHRoYXQgaXMsIGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzID09IEZBTFNFLgotICovCi0KLS8qIEVtaXQgYSBieXRlICovCi0jZGVmaW5lIGVtaXRfYnl0ZShlbnRyb3B5LHZhbCkgIFwKLQl7ICooZW50cm9weSktPm5leHRfb3V0cHV0X2J5dGUrKyA9IChKT0NURVQpICh2YWwpOyAgXAotCSAgaWYgKC0tKGVudHJvcHkpLT5mcmVlX2luX2J1ZmZlciA9PSAwKSAgXAotCSAgICBkdW1wX2J1ZmZlcihlbnRyb3B5KTsgfQotCi0KLUxPQ0FMKHZvaWQpCi1kdW1wX2J1ZmZlciAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSkKLS8qIEVtcHR5IHRoZSBvdXRwdXQgYnVmZmVyOyB3ZSBkbyBub3Qgc3VwcG9ydCBzdXNwZW5zaW9uIGluIHRoaXMgbW9kdWxlLiAqLwotewotICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgKiBkZXN0ID0gZW50cm9weS0+Y2luZm8tPmRlc3Q7Ci0KLSAgaWYgKCEgKCpkZXN0LT5lbXB0eV9vdXRwdXRfYnVmZmVyKSAoZW50cm9weS0+Y2luZm8pKQotICAgIEVSUkVYSVQoZW50cm9weS0+Y2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKLSAgLyogQWZ0ZXIgYSBzdWNjZXNzZnVsIGJ1ZmZlciBkdW1wLCBtdXN0IHJlc2V0IGJ1ZmZlciBwb2ludGVycyAqLwotICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBkZXN0LT5mcmVlX2luX2J1ZmZlcjsKLX0KLQotCi0vKiBPdXRwdXR0aW5nIGJpdHMgdG8gdGhlIGZpbGUgKi8KLQotLyogT25seSB0aGUgcmlnaHQgMjQgYml0cyBvZiBwdXRfYnVmZmVyIGFyZSB1c2VkOyB0aGUgdmFsaWQgYml0cyBhcmUKLSAqIGxlZnQtanVzdGlmaWVkIGluIHRoaXMgcGFydC4gIEF0IG1vc3QgMTYgYml0cyBjYW4gYmUgcGFzc2VkIHRvIGVtaXRfYml0cwotICogaW4gb25lIGNhbGwsIGFuZCB3ZSBuZXZlciByZXRhaW4gbW9yZSB0aGFuIDcgYml0cyBpbiBwdXRfYnVmZmVyCi0gKiBiZXR3ZWVuIGNhbGxzLCBzbyAyNCBiaXRzIGFyZSBzdWZmaWNpZW50LgotICovCi0KLUlOTElORQotTE9DQUwodm9pZCkKLWVtaXRfYml0cyAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSwgdW5zaWduZWQgaW50IGNvZGUsIGludCBzaXplKQotLyogRW1pdCBzb21lIGJpdHMsIHVubGVzcyB3ZSBhcmUgaW4gZ2F0aGVyIG1vZGUgKi8KLXsKLSAgLyogVGhpcyByb3V0aW5lIGlzIGhlYXZpbHkgdXNlZCwgc28gaXQncyB3b3J0aCBjb2RpbmcgdGlnaHRseS4gKi8KLSAgcmVnaXN0ZXIgSU5UMzIgcHV0X2J1ZmZlciA9IChJTlQzMikgY29kZTsKLSAgcmVnaXN0ZXIgaW50IHB1dF9iaXRzID0gZW50cm9weS0+cHV0X2JpdHM7Ci0KLSAgLyogaWYgc2l6ZSBpcyAwLCBjYWxsZXIgdXNlZCBhbiBpbnZhbGlkIEh1ZmZtYW4gdGFibGUgZW50cnkgKi8KLSAgaWYgKHNpemUgPT0gMCkKLSAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0hVRkZfTUlTU0lOR19DT0RFKTsKLQotICBpZiAoZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpCi0gICAgcmV0dXJuOwkJCS8qIGRvIG5vdGhpbmcgaWYgd2UncmUgb25seSBnZXR0aW5nIHN0YXRzICovCi0KLSAgcHV0X2J1ZmZlciAmPSAoKChJTlQzMikgMSk8PHNpemUpIC0gMTsgLyogbWFzayBvZmYgYW55IGV4dHJhIGJpdHMgaW4gY29kZSAqLwotICAKLSAgcHV0X2JpdHMgKz0gc2l6ZTsJCS8qIG5ldyBudW1iZXIgb2YgYml0cyBpbiBidWZmZXIgKi8KLSAgCi0gIHB1dF9idWZmZXIgPDw9IDI0IC0gcHV0X2JpdHM7IC8qIGFsaWduIGluY29taW5nIGJpdHMgKi8KLQotICBwdXRfYnVmZmVyIHw9IGVudHJvcHktPnB1dF9idWZmZXI7IC8qIGFuZCBtZXJnZSB3aXRoIG9sZCBidWZmZXIgY29udGVudHMgKi8KLQotICB3aGlsZSAocHV0X2JpdHMgPj0gOCkgewotICAgIGludCBjID0gKGludCkgKChwdXRfYnVmZmVyID4+IDE2KSAmIDB4RkYpOwotICAgIAotICAgIGVtaXRfYnl0ZShlbnRyb3B5LCBjKTsKLSAgICBpZiAoYyA9PSAweEZGKSB7CQkvKiBuZWVkIHRvIHN0dWZmIGEgemVybyBieXRlPyAqLwotICAgICAgZW1pdF9ieXRlKGVudHJvcHksIDApOwotICAgIH0KLSAgICBwdXRfYnVmZmVyIDw8PSA4OwotICAgIHB1dF9iaXRzIC09IDg7Ci0gIH0KLQotICBlbnRyb3B5LT5wdXRfYnVmZmVyID0gcHV0X2J1ZmZlcjsgLyogdXBkYXRlIHZhcmlhYmxlcyAqLwotICBlbnRyb3B5LT5wdXRfYml0cyA9IHB1dF9iaXRzOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1mbHVzaF9iaXRzIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5KQotewotICBlbWl0X2JpdHMoZW50cm9weSwgMHg3RiwgNyk7IC8qIGZpbGwgYW55IHBhcnRpYWwgYnl0ZSB3aXRoIG9uZXMgKi8KLSAgZW50cm9weS0+cHV0X2J1ZmZlciA9IDA7ICAgICAvKiBhbmQgcmVzZXQgYml0LWJ1ZmZlciB0byBlbXB0eSAqLwotICBlbnRyb3B5LT5wdXRfYml0cyA9IDA7Ci19Ci0KLQotLyoKLSAqIEVtaXQgKG9yIGp1c3QgY291bnQpIGEgSHVmZm1hbiBzeW1ib2wuCi0gKi8KLQotSU5MSU5FCi1MT0NBTCh2b2lkKQotZW1pdF9zeW1ib2wgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIGludCB0Ymxfbm8sIGludCBzeW1ib2wpCi17Ci0gIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKLSAgICBlbnRyb3B5LT5jb3VudF9wdHJzW3RibF9ub11bc3ltYm9sXSsrOwotICBlbHNlIHsKLSAgICBjX2Rlcml2ZWRfdGJsICogdGJsID0gZW50cm9weS0+ZGVyaXZlZF90YmxzW3RibF9ub107Ci0gICAgZW1pdF9iaXRzKGVudHJvcHksIHRibC0+ZWh1ZmNvW3N5bWJvbF0sIHRibC0+ZWh1ZnNpW3N5bWJvbF0pOwotICB9Ci19Ci0KLQotLyoKLSAqIEVtaXQgYml0cyBmcm9tIGEgY29ycmVjdGlvbiBiaXQgYnVmZmVyLgotICovCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2J1ZmZlcmVkX2JpdHMgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIGNoYXIgKiBidWZzdGFydCwKLQkJICAgIHVuc2lnbmVkIGludCBuYml0cykKLXsKLSAgaWYgKGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzKQotICAgIHJldHVybjsJCQkvKiBubyByZWFsIHdvcmsgKi8KLQotICB3aGlsZSAobmJpdHMgPiAwKSB7Ci0gICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpICgqYnVmc3RhcnQpLCAxKTsKLSAgICBidWZzdGFydCsrOwotICAgIG5iaXRzLS07Ci0gIH0KLX0KLQotCi0vKgotICogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gc3ltYm9sLgotICovCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2VvYnJ1biAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSkKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXAsIG5iaXRzOwotCi0gIGlmIChlbnRyb3B5LT5FT0JSVU4gPiAwKSB7CS8qIGlmIHRoZXJlIGlzIGFueSBwZW5kaW5nIEVPQlJVTiAqLwotICAgIHRlbXAgPSBlbnRyb3B5LT5FT0JSVU47Ci0gICAgbmJpdHMgPSAwOwotICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCi0gICAgICBuYml0cysrOwotICAgIC8qIHNhZmV0eSBjaGVjazogc2hvdWxkbid0IGhhcHBlbiBnaXZlbiBsaW1pdGVkIGNvcnJlY3Rpb24tYml0IGJ1ZmZlciAqLwotICAgIGlmIChuYml0cyA+IDE0KQotICAgICAgRVJSRVhJVChlbnRyb3B5LT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7Ci0KLSAgICBlbWl0X3N5bWJvbChlbnRyb3B5LCBlbnRyb3B5LT5hY190Ymxfbm8sIG5iaXRzIDw8IDQpOwotICAgIGlmIChuYml0cykKLSAgICAgIGVtaXRfYml0cyhlbnRyb3B5LCBlbnRyb3B5LT5FT0JSVU4sIG5iaXRzKTsKLQotICAgIGVudHJvcHktPkVPQlJVTiA9IDA7Ci0KLSAgICAvKiBFbWl0IGFueSBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgKi8KLSAgICBlbWl0X2J1ZmZlcmVkX2JpdHMoZW50cm9weSwgZW50cm9weS0+Yml0X2J1ZmZlciwgZW50cm9weS0+QkUpOwotICAgIGVudHJvcHktPkJFID0gMDsKLSAgfQotfQotCi0KLS8qCi0gKiBFbWl0IGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIHByZWRpY3Rpb25zLgotICovCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X3Jlc3RhcnQgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIGludCByZXN0YXJ0X251bSkKLXsKLSAgaW50IGNpOwotCi0gIGVtaXRfZW9icnVuKGVudHJvcHkpOwotCi0gIGlmICghIGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzKSB7Ci0gICAgZmx1c2hfYml0cyhlbnRyb3B5KTsKLSAgICBlbWl0X2J5dGUoZW50cm9weSwgMHhGRik7Ci0gICAgZW1pdF9ieXRlKGVudHJvcHksIEpQRUdfUlNUMCArIHJlc3RhcnRfbnVtKTsKLSAgfQotCi0gIGlmIChlbnRyb3B5LT5jaW5mby0+U3MgPT0gMCkgewotICAgIC8qIFJlLWluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGVudHJvcHktPmNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQotICAgICAgZW50cm9weS0+bGFzdF9kY192YWxbY2ldID0gMDsKLSAgfSBlbHNlIHsKLSAgICAvKiBSZS1pbml0aWFsaXplIGFsbCBBQy1yZWxhdGVkIGZpZWxkcyB0byAwICovCi0gICAgZW50cm9weS0+RU9CUlVOID0gMDsKLSAgICBlbnRyb3B5LT5CRSA9IDA7Ci0gIH0KLX0KLQotCi0vKgotICogTUNVIGVuY29kaW5nIGZvciBEQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCi0gKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1lbmNvZGVfbWN1X0RDX2ZpcnN0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIHJlZ2lzdGVyIGludCB0ZW1wLCB0ZW1wMjsKLSAgcmVnaXN0ZXIgaW50IG5iaXRzOwotICBpbnQgYmxrbiwgY2k7Ci0gIGludCBBbCA9IGNpbmZvLT5BbDsKLSAgSkJMT0NLUk9XIGJsb2NrOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgSVNISUZUX1RFTVBTCi0KLSAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCi0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7Ci0KLSAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9ja3MgKi8KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOwotICAgIGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOwotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0KLSAgICAvKiBDb21wdXRlIHRoZSBEQyB2YWx1ZSBhZnRlciB0aGUgcmVxdWlyZWQgcG9pbnQgdHJhbnNmb3JtIGJ5IEFsLgotICAgICAqIFRoaXMgaXMgc2ltcGx5IGFuIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQuCi0gICAgICovCi0gICAgdGVtcDIgPSBJUklHSFRfU0hJRlQoKGludCkgKCgqYmxvY2spWzBdKSwgQWwpOwotCi0gICAgLyogREMgZGlmZmVyZW5jZXMgYXJlIGZpZ3VyZWQgb24gdGhlIHBvaW50LXRyYW5zZm9ybWVkIHZhbHVlcy4gKi8KLSAgICB0ZW1wID0gdGVtcDIgLSBlbnRyb3B5LT5sYXN0X2RjX3ZhbFtjaV07Ci0gICAgZW50cm9weS0+bGFzdF9kY192YWxbY2ldID0gdGVtcDI7Ci0KLSAgICAvKiBFbmNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgcGVyIHNlY3Rpb24gRy4xLjIuMSAqLwotICAgIHRlbXAyID0gdGVtcDsKLSAgICBpZiAodGVtcCA8IDApIHsKLSAgICAgIHRlbXAgPSAtdGVtcDsJCS8qIHRlbXAgaXMgYWJzIHZhbHVlIG9mIGlucHV0ICovCi0gICAgICAvKiBGb3IgYSBuZWdhdGl2ZSBpbnB1dCwgd2FudCB0ZW1wMiA9IGJpdHdpc2UgY29tcGxlbWVudCBvZiBhYnMoaW5wdXQpICovCi0gICAgICAvKiBUaGlzIGNvZGUgYXNzdW1lcyB3ZSBhcmUgb24gYSB0d28ncyBjb21wbGVtZW50IG1hY2hpbmUgKi8KLSAgICAgIHRlbXAyLS07Ci0gICAgfQotICAgIAotICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KLSAgICBuYml0cyA9IDA7Ci0gICAgd2hpbGUgKHRlbXApIHsKLSAgICAgIG5iaXRzKys7Ci0gICAgICB0ZW1wID4+PSAxOwotICAgIH0KLSAgICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcy4KLSAgICAgKiBTaW5jZSB3ZSdyZSBlbmNvZGluZyBhIGRpZmZlcmVuY2UsIHRoZSByYW5nZSBsaW1pdCBpcyB0d2ljZSBhcyBtdWNoLgotICAgICAqLwotICAgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMrMSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKLSAgICAKLSAgICAvKiBDb3VudC9lbWl0IHRoZSBIdWZmbWFuLWNvZGVkIHN5bWJvbCBmb3IgdGhlIG51bWJlciBvZiBiaXRzICovCi0gICAgZW1pdF9zeW1ib2woZW50cm9weSwgY29tcHB0ci0+ZGNfdGJsX25vLCBuYml0cyk7Ci0gICAgCi0gICAgLyogRW1pdCB0aGF0IG51bWJlciBvZiBiaXRzIG9mIHRoZSB2YWx1ZSwgaWYgcG9zaXRpdmUsICovCi0gICAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCi0gICAgaWYgKG5iaXRzKQkJCS8qIGVtaXRfYml0cyByZWplY3RzIGNhbGxzIHdpdGggc2l6ZSAwICovCi0gICAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKTsKLSAgfQotCi0gIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gZW50cm9weS0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogVXBkYXRlIHJlc3RhcnQtaW50ZXJ2YWwgc3RhdGUgdG9vICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7Ci0gICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSsrOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSAmPSA3OwotICAgIH0KLSAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIE1DVSBlbmNvZGluZyBmb3IgQUMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAotICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZW5jb2RlX21jdV9BQ19maXJzdCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICByZWdpc3RlciBpbnQgdGVtcCwgdGVtcDI7Ci0gIHJlZ2lzdGVyIGludCBuYml0czsKLSAgcmVnaXN0ZXIgaW50IHIsIGs7Ci0gIGludCBTZSA9IGNpbmZvLT5TZTsKLSAgaW50IEFsID0gY2luZm8tPkFsOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0KLSAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCi0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7Ci0KLSAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9jayAqLwotICBibG9jayA9IE1DVV9kYXRhWzBdOwotCi0gIC8qIEVuY29kZSB0aGUgQUMgY29lZmZpY2llbnRzIHBlciBzZWN0aW9uIEcuMS4yLjIsIGZpZy4gRy4zICovCi0gIAotICByID0gMDsJCQkvKiByID0gcnVuIGxlbmd0aCBvZiB6ZXJvcyAqLwotICAgCi0gIGZvciAoayA9IGNpbmZvLT5TczsgayA8PSBTZTsgaysrKSB7Ci0gICAgaWYgKCh0ZW1wID0gKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXSkgPT0gMCkgewotICAgICAgcisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIC8qIFdlIG11c3QgYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSBieSBBbC4gIEZvciBBQyBjb2VmZmljaWVudHMgdGhpcwotICAgICAqIGlzIGFuIGludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0b3dhcmRzIDAuICBUbyBkbyB0aGlzIHBvcnRhYmx5Ci0gICAgICogaW4gQywgd2Ugc2hpZnQgYWZ0ZXIgb2J0YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZTsgc28gdGhlIGNvZGUgaXMKLSAgICAgKiBpbnRlcndvdmVuIHdpdGggZmluZGluZyB0aGUgYWJzIHZhbHVlICh0ZW1wKSBhbmQgb3V0cHV0IGJpdHMgKHRlbXAyKS4KLSAgICAgKi8KLSAgICBpZiAodGVtcCA8IDApIHsKLSAgICAgIHRlbXAgPSAtdGVtcDsJCS8qIHRlbXAgaXMgYWJzIHZhbHVlIG9mIGlucHV0ICovCi0gICAgICB0ZW1wID4+PSBBbDsJCS8qIGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gKi8KLSAgICAgIC8qIEZvciBhIG5lZ2F0aXZlIGNvZWYsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGNvZWYpICovCi0gICAgICB0ZW1wMiA9IH50ZW1wOwotICAgIH0gZWxzZSB7Ci0gICAgICB0ZW1wID4+PSBBbDsJCS8qIGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gKi8KLSAgICAgIHRlbXAyID0gdGVtcDsKLSAgICB9Ci0gICAgLyogV2F0Y2ggb3V0IGZvciBjYXNlIHRoYXQgbm9uemVybyBjb2VmIGlzIHplcm8gYWZ0ZXIgcG9pbnQgdHJhbnNmb3JtICovCi0gICAgaWYgKHRlbXAgPT0gMCkgewotICAgICAgcisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLyogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gKi8KLSAgICBpZiAoZW50cm9weS0+RU9CUlVOID4gMCkKLSAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOwotICAgIC8qIGlmIHJ1biBsZW5ndGggPiAxNSwgbXVzdCBlbWl0IHNwZWNpYWwgcnVuLWxlbmd0aC0xNiBjb2RlcyAoMHhGMCkgKi8KLSAgICB3aGlsZSAociA+IDE1KSB7Ci0gICAgICBlbWl0X3N5bWJvbChlbnRyb3B5LCBlbnRyb3B5LT5hY190Ymxfbm8sIDB4RjApOwotICAgICAgciAtPSAxNjsKLSAgICB9Ci0KLSAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gICAgbmJpdHMgPSAxOwkJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIDEgYml0ICovCi0gICAgd2hpbGUgKCh0ZW1wID4+PSAxKSkKLSAgICAgIG5iaXRzKys7Ci0gICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMgKi8KLSAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOwotCi0gICAgLyogQ291bnQvZW1pdCBIdWZmbWFuIHN5bWJvbCBmb3IgcnVuIGxlbmd0aCAvIG51bWJlciBvZiBiaXRzICovCi0gICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCAociA8PCA0KSArIG5iaXRzKTsKLQotICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLwotICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLwotICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSB0ZW1wMiwgbmJpdHMpOwotCi0gICAgciA9IDA7CQkJLyogcmVzZXQgemVybyBydW4gbGVuZ3RoICovCi0gIH0KLQotICBpZiAociA+IDApIHsJCQkvKiBJZiB0aGVyZSBhcmUgdHJhaWxpbmcgemVyb2VzLCAqLwotICAgIGVudHJvcHktPkVPQlJVTisrOwkJLyogY291bnQgYW4gRU9CICovCi0gICAgaWYgKGVudHJvcHktPkVPQlJVTiA9PSAweDdGRkYpCi0gICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsJLyogZm9yY2UgaXQgb3V0IHRvIGF2b2lkIG92ZXJmbG93ICovCi0gIH0KLQotICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgewotICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKLSAgICB9Ci0gICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLSAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBNQ1UgZW5jb2RpbmcgZm9yIERDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW4uCi0gKiBOb3RlOiB3ZSBhc3N1bWUgc3VjaCBzY2FucyBjYW4gYmUgbXVsdGktY29tcG9uZW50LCBhbHRob3VnaCB0aGUgc3BlYwotICogaXMgbm90IHZlcnkgY2xlYXIgb24gdGhlIHBvaW50LgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZW5jb2RlX21jdV9EQ19yZWZpbmUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIGludCBibGtuOwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIEpCTE9DS1JPVyBibG9jazsKLQotICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGVtaXRfcmVzdGFydChlbnRyb3B5LCBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKTsKLQotICAvKiBFbmNvZGUgdGhlIE1DVSBkYXRhIGJsb2NrcyAqLwotICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07Ci0KLSAgICAvKiBXZSBzaW1wbHkgZW1pdCB0aGUgQWwndGggYml0IG9mIHRoZSBEQyBjb2VmZmljaWVudCB2YWx1ZS4gKi8KLSAgICB0ZW1wID0gKCpibG9jaylbMF07Ci0gICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpICh0ZW1wID4+IEFsKSwgMSk7Ci0gIH0KLQotICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgewotICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKLSAgICB9Ci0gICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLSAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBNQ1UgZW5jb2RpbmcgZm9yIEFDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW4uCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1lbmNvZGVfbWN1X0FDX3JlZmluZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgcmVnaXN0ZXIgaW50IHIsIGs7Ci0gIGludCBFT0I7Ci0gIGNoYXIgKkJSX2J1ZmZlcjsKLSAgdW5zaWduZWQgaW50IEJSOwotICBpbnQgU2UgPSBjaW5mby0+U2U7Ci0gIGludCBBbCA9IGNpbmZvLT5BbDsKLSAgSkJMT0NLUk9XIGJsb2NrOwotICBpbnQgYWJzdmFsdWVzW0RDVFNJWkUyXTsKLQotICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGVtaXRfcmVzdGFydChlbnRyb3B5LCBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKTsKLQotICAvKiBFbmNvZGUgdGhlIE1DVSBkYXRhIGJsb2NrICovCi0gIGJsb2NrID0gTUNVX2RhdGFbMF07Ci0KLSAgLyogSXQgaXMgY29udmVuaWVudCB0byBtYWtlIGEgcHJlLXBhc3MgdG8gZGV0ZXJtaW5lIHRoZSB0cmFuc2Zvcm1lZAotICAgKiBjb2VmZmljaWVudHMnIGFic29sdXRlIHZhbHVlcyBhbmQgdGhlIEVPQiBwb3NpdGlvbi4KLSAgICovCi0gIEVPQiA9IDA7Ci0gIGZvciAoayA9IGNpbmZvLT5TczsgayA8PSBTZTsgaysrKSB7Ci0gICAgdGVtcCA9ICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV07Ci0gICAgLyogV2UgbXVzdCBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtIGJ5IEFsLiAgRm9yIEFDIGNvZWZmaWNpZW50cyB0aGlzCi0gICAgICogaXMgYW4gaW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvd2FyZHMgMC4gIFRvIGRvIHRoaXMgcG9ydGFibHkKLSAgICAgKiBpbiBDLCB3ZSBzaGlmdCBhZnRlciBvYnRhaW5pbmcgdGhlIGFic29sdXRlIHZhbHVlLgotICAgICAqLwotICAgIGlmICh0ZW1wIDwgMCkKLSAgICAgIHRlbXAgPSAtdGVtcDsJCS8qIHRlbXAgaXMgYWJzIHZhbHVlIG9mIGlucHV0ICovCi0gICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCi0gICAgYWJzdmFsdWVzW2tdID0gdGVtcDsJLyogc2F2ZSBhYnMgdmFsdWUgZm9yIG1haW4gcGFzcyAqLwotICAgIGlmICh0ZW1wID09IDEpCi0gICAgICBFT0IgPSBrOwkJCS8qIEVPQiA9IGluZGV4IG9mIGxhc3QgbmV3bHktbm9uemVybyBjb2VmICovCi0gIH0KLQotICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBHLjEuMi4zLCBmaWcuIEcuNyAqLwotICAKLSAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KLSAgQlIgPSAwOwkJCS8qIEJSID0gY291bnQgb2YgYnVmZmVyZWQgYml0cyBhZGRlZCBub3cgKi8KLSAgQlJfYnVmZmVyID0gZW50cm9weS0+Yml0X2J1ZmZlciArIGVudHJvcHktPkJFOyAvKiBBcHBlbmQgYml0cyB0byBidWZmZXIgKi8KLQotICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgewotICAgIGlmICgodGVtcCA9IGFic3ZhbHVlc1trXSkgPT0gMCkgewotICAgICAgcisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLyogRW1pdCBhbnkgcmVxdWlyZWQgWlJMcywgYnV0IG5vdCBpZiB0aGV5IGNhbiBiZSBmb2xkZWQgaW50byBFT0IgKi8KLSAgICB3aGlsZSAociA+IDE1ICYmIGsgPD0gRU9CKSB7Ci0gICAgICAvKiBlbWl0IGFueSBwZW5kaW5nIEVPQlJVTiBhbmQgdGhlIEJFIGNvcnJlY3Rpb24gYml0cyAqLwotICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0gICAgICAvKiBFbWl0IFpSTCAqLwotICAgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCAweEYwKTsKLSAgICAgIHIgLT0gMTY7Ci0gICAgICAvKiBFbWl0IGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyB0aGF0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIFpSTCAqLwotICAgICAgZW1pdF9idWZmZXJlZF9iaXRzKGVudHJvcHksIEJSX2J1ZmZlciwgQlIpOwotICAgICAgQlJfYnVmZmVyID0gZW50cm9weS0+Yml0X2J1ZmZlcjsgLyogQkUgYml0cyBhcmUgZ29uZSBub3cgKi8KLSAgICAgIEJSID0gMDsKLSAgICB9Ci0KLSAgICAvKiBJZiB0aGUgY29lZiB3YXMgcHJldmlvdXNseSBub256ZXJvLCBpdCBvbmx5IG5lZWRzIGEgY29ycmVjdGlvbiBiaXQuCi0gICAgICogTk9URTogYSBzdHJhaWdodCB0cmFuc2xhdGlvbiBvZiB0aGUgc3BlYydzIGZpZ3VyZSBHLjcgd291bGQgc3VnZ2VzdAotICAgICAqIHRoYXQgd2UgYWxzbyBuZWVkIHRvIHRlc3QgciA+IDE1LiAgQnV0IGlmIHIgPiAxNSwgd2UgY2FuIG9ubHkgZ2V0IGhlcmUKLSAgICAgKiBpZiBrID4gRU9CLCB3aGljaCBpbXBsaWVzIHRoYXQgdGhpcyBjb2VmZmljaWVudCBpcyBub3QgMS4KLSAgICAgKi8KLSAgICBpZiAodGVtcCA+IDEpIHsKLSAgICAgIC8qIFRoZSBjb3JyZWN0aW9uIGJpdCBpcyB0aGUgbmV4dCBiaXQgb2YgdGhlIGFic29sdXRlIHZhbHVlLiAqLwotICAgICAgQlJfYnVmZmVyW0JSKytdID0gKGNoYXIpICh0ZW1wICYgMSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvKiBFbWl0IGFueSBwZW5kaW5nIEVPQlJVTiBhbmQgdGhlIEJFIGNvcnJlY3Rpb24gYml0cyAqLwotICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOwotCi0gICAgLyogQ291bnQvZW1pdCBIdWZmbWFuIHN5bWJvbCBmb3IgcnVuIGxlbmd0aCAvIG51bWJlciBvZiBiaXRzICovCi0gICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCAociA8PCA0KSArIDEpOwotCi0gICAgLyogRW1pdCBvdXRwdXQgYml0IGZvciBuZXdseS1ub256ZXJvIGNvZWYgKi8KLSAgICB0ZW1wID0gKCgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0gPCAwKSA/IDAgOiAxOwotICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSB0ZW1wLCAxKTsKLQotICAgIC8qIEVtaXQgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIHRoYXQgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb2RlICovCi0gICAgZW1pdF9idWZmZXJlZF9iaXRzKGVudHJvcHksIEJSX2J1ZmZlciwgQlIpOwotICAgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXI7IC8qIEJFIGJpdHMgYXJlIGdvbmUgbm93ICovCi0gICAgQlIgPSAwOwotICAgIHIgPSAwOwkJCS8qIHJlc2V0IHplcm8gcnVuIGxlbmd0aCAqLwotICB9Ci0KLSAgaWYgKHIgPiAwIHx8IEJSID4gMCkgewkvKiBJZiB0aGVyZSBhcmUgdHJhaWxpbmcgemVyb2VzLCAqLwotICAgIGVudHJvcHktPkVPQlJVTisrOwkJLyogY291bnQgYW4gRU9CICovCi0gICAgZW50cm9weS0+QkUgKz0gQlI7CQkvKiBjb25jYXQgbXkgY29ycmVjdGlvbiBiaXRzIHRvIG9sZGVyIG9uZXMgKi8KLSAgICAvKiBXZSBmb3JjZSBvdXQgdGhlIEVPQiBpZiB3ZSByaXNrIGVpdGhlcjoKLSAgICAgKiAxLiBvdmVyZmxvdyBvZiB0aGUgRU9CIGNvdW50ZXI7Ci0gICAgICogMi4gb3ZlcmZsb3cgb2YgdGhlIGNvcnJlY3Rpb24gYml0IGJ1ZmZlciBkdXJpbmcgdGhlIG5leHQgTUNVLgotICAgICAqLwotICAgIGlmIChlbnRyb3B5LT5FT0JSVU4gPT0gMHg3RkZGIHx8IGVudHJvcHktPkJFID4gKE1BWF9DT1JSX0JJVFMtRENUU0laRTIrMSkpCi0gICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLSAgfQotCi0gIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gZW50cm9weS0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogVXBkYXRlIHJlc3RhcnQtaW50ZXJ2YWwgc3RhdGUgdG9vICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7Ci0gICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSsrOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSAmPSA3OwotICAgIH0KLSAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIGEgSHVmZm1hbi1jb21wcmVzc2VkIHByb2dyZXNzaXZlIHNjYW4uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzc19waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8pCi17ICAgCi0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotCi0gIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogRmx1c2ggb3V0IGFueSBidWZmZXJlZCBkYXRhICovCi0gIGVtaXRfZW9icnVuKGVudHJvcHkpOwotICBmbHVzaF9iaXRzKGVudHJvcHkpOwotCi0gIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gZW50cm9weS0+ZnJlZV9pbl9idWZmZXI7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhIHN0YXRpc3RpY3MtZ2F0aGVyaW5nIHBhc3MgYW5kIGNyZWF0ZSB0aGUgbmV3IEh1ZmZtYW4gdGFibGVzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX3Bhc3NfZ2F0aGVyX3BodWZmIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGJvb2xlYW4gaXNfRENfYmFuZDsKLSAgaW50IGNpLCB0Ymw7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBKSFVGRl9UQkwgKipodGJscHRyOwotICBib29sZWFuIGRpZFtOVU1fSFVGRl9UQkxTXTsKLQotICAvKiBGbHVzaCBvdXQgYnVmZmVyZWQgZGF0YSAoYWxsIHdlIGNhcmUgYWJvdXQgaXMgY291bnRpbmcgdGhlIEVPQiBzeW1ib2wpICovCi0gIGVtaXRfZW9icnVuKGVudHJvcHkpOwotCi0gIGlzX0RDX2JhbmQgPSAoY2luZm8tPlNzID09IDApOwotCi0gIC8qIEl0J3MgaW1wb3J0YW50IG5vdCB0byBhcHBseSBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIG1vcmUgdGhhbiBvbmNlCi0gICAqIHBlciB0YWJsZSwgYmVjYXVzZSBpdCBjbG9iYmVycyB0aGUgaW5wdXQgZnJlcXVlbmN5IGNvdW50cyEKLSAgICovCi0gIE1FTVpFUk8oZGlkLCBTSVpFT0YoZGlkKSk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGlmIChpc19EQ19iYW5kKSB7Ci0gICAgICBpZiAoY2luZm8tPkFoICE9IDApCS8qIERDIHJlZmluZW1lbnQgbmVlZHMgbm8gdGFibGUgKi8KLQljb250aW51ZTsKLSAgICAgIHRibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKLSAgICB9IGVsc2UgewotICAgICAgdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIH0KLSAgICBpZiAoISBkaWRbdGJsXSkgewotICAgICAgaWYgKGlzX0RDX2JhbmQpCi0gICAgICAgIGh0YmxwdHIgPSAmIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW3RibF07Ci0gICAgICBlbHNlCi0gICAgICAgIGh0YmxwdHIgPSAmIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW3RibF07Ci0gICAgICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKLSAgICAgICAgKmh0YmxwdHIgPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAganBlZ19nZW5fb3B0aW1hbF90YWJsZShjaW5mbywgKmh0YmxwdHIsIGVudHJvcHktPmNvdW50X3B0cnNbdGJsXSk7Ci0gICAgICBkaWRbdGJsXSA9IFRSVUU7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGVudHJvcHkgZW5jb2RpbmcuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9waHVmZl9lbmNvZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weTsKLSAgaW50IGk7Ci0KLSAgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihwaHVmZl9lbnRyb3B5X2VuY29kZXIpKTsKLSAgY2luZm8tPmVudHJvcHkgPSAoc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyICopIGVudHJvcHk7Ci0gIGVudHJvcHktPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19waHVmZjsKLQotICAvKiBNYXJrIHRhYmxlcyB1bmFsbG9jYXRlZCAqLwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgZW50cm9weS0+ZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKLSAgICBlbnRyb3B5LT5jb3VudF9wdHJzW2ldID0gTlVMTDsKLSAgfQotICBlbnRyb3B5LT5iaXRfYnVmZmVyID0gTlVMTDsJLyogbmVlZGVkIG9ubHkgaW4gQUMgcmVmaW5lbWVudCBzY2FuICovCi19Ci0KLSNlbmRpZiAvKiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNwcmVwY3QuYyBiL2xpYmpwZWd0d3JwL2pjcHJlcGN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOTMzMzMuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNwcmVwY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKgotICogamNwcmVwY3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb21wcmVzc2lvbiBwcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCi0gKiBUaGlzIGNvbnRyb2xsZXIgbWFuYWdlcyB0aGUgY29sb3IgY29udmVyc2lvbiwgZG93bnNhbXBsaW5nLAotICogYW5kIGVkZ2UgZXhwYW5zaW9uIHN0ZXBzLgotICoKLSAqIE1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBpcyBhc3NvY2lhdGVkIHdpdGggYnVmZmVyaW5nIGlucHV0IHJvd3MKLSAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBkb3duc2FtcGxlci4gIFNlZSB0aGUgY29tbWVudHMgYXQgdGhlIGhlYWQgb2YKLSAqIGpjc2FtcGxlLmMgZm9yIHRoZSBkb3duc2FtcGxlcidzIG5lZWRzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBBdCBwcmVzZW50LCBqY3NhbXBsZS5jIGNhbiByZXF1ZXN0IGNvbnRleHQgcm93cyBvbmx5IGZvciBzbW9vdGhpbmcuCi0gKiBJbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCBhbHNvIG5lZWQgY29udGV4dCByb3dzIGZvciBDQ0lSNjAxIHNhbXBsaW5nCi0gKiBvciBvdGhlciBtb3JlLWNvbXBsZXggZG93bnNhbXBsaW5nIHByb2NlZHVyZXMuICBUaGUgY29kZSB0byBzdXBwb3J0Ci0gKiBjb250ZXh0IHJvd3Mgc2hvdWxkIGJlIGNvbXBpbGVkIG9ubHkgaWYgbmVlZGVkLgotICovCi0jaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAotI2RlZmluZSBDT05URVhUX1JPV1NfU1VQUE9SVEVECi0jZW5kaWYKLQotCi0vKgotICogRm9yIHRoZSBzaW1wbGUgKG5vLWNvbnRleHQtcm93KSBjYXNlLCB3ZSBqdXN0IG5lZWQgdG8gYnVmZmVyIG9uZQotICogcm93IGdyb3VwJ3Mgd29ydGggb2YgcGl4ZWxzIGZvciB0aGUgZG93bnNhbXBsaW5nIHN0ZXAuICBBdCB0aGUgYm90dG9tIG9mCi0gKiB0aGUgaW1hZ2UsIHdlIHBhZCB0byBhIGZ1bGwgcm93IGdyb3VwIGJ5IHJlcGxpY2F0aW5nIHRoZSBsYXN0IHBpeGVsIHJvdy4KLSAqIFRoZSBkb3duc2FtcGxlcidzIGxhc3Qgb3V0cHV0IHJvdyBpcyB0aGVuIHJlcGxpY2F0ZWQgaWYgbmVlZGVkIHRvIHBhZAotICogb3V0IHRvIGEgZnVsbCBpTUNVIHJvdy4KLSAqCi0gKiBXaGVuIHByb3ZpZGluZyBjb250ZXh0IHJvd3MsIHdlIG11c3QgYnVmZmVyIHRocmVlIHJvdyBncm91cHMnIHdvcnRoIG9mCi0gKiBwaXhlbHMuICBUaHJlZSByb3cgZ3JvdXBzIGFyZSBwaHlzaWNhbGx5IGFsbG9jYXRlZCwgYnV0IHRoZSByb3cgcG9pbnRlcgotICogYXJyYXlzIGFyZSBtYWRlIGZpdmUgcm93IGdyb3VwcyBoaWdoLCB3aXRoIHRoZSBleHRyYSBwb2ludGVycyBhYm92ZSBhbmQKLSAqIGJlbG93ICJ3cmFwcGluZyBhcm91bmQiIHRvIHBvaW50IHRvIHRoZSBsYXN0IGFuZCBmaXJzdCByZWFsIHJvdyBncm91cHMuCi0gKiBUaGlzIGFsbG93cyB0aGUgZG93bnNhbXBsZXIgdG8gYWNjZXNzIHRoZSBwcm9wZXIgY29udGV4dCByb3dzLgotICogQXQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgY3JlYXRlIGR1bW15IGNvbnRleHQgcm93cyBieQotICogY29weWluZyB0aGUgZmlyc3Qgb3IgbGFzdCByZWFsIHBpeGVsIHJvdy4gIFRoaXMgY29weWluZyBjb3VsZCBiZSBhdm9pZGVkCi0gKiBieSBwb2ludGVyIGhhY2tpbmcgYXMgaXMgZG9uZSBpbiBqZG1haW5jdC5jLCBidXQgaXQgZG9lc24ndCBzZWVtIHdvcnRoIHRoZQotICogdHJvdWJsZSBvbiB0aGUgY29tcHJlc3Npb24gc2lkZS4KLSAqLwotCi0KLS8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogRG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlci4gIFRoaXMgYnVmZmVyIGhvbGRzIGNvbG9yLWNvbnZlcnRlZCBkYXRhCi0gICAqIHVudGlsIHdlIGhhdmUgZW5vdWdoIHRvIGRvIGEgZG93bnNhbXBsZSBzdGVwLgotICAgKi8KLSAgSlNBTVBBUlJBWSBjb2xvcl9idWZbTUFYX0NPTVBPTkVOVFNdOwotCi0gIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIHNvdXJjZSBpbWFnZSAqLwotICBpbnQgbmV4dF9idWZfcm93OwkJLyogaW5kZXggb2YgbmV4dCByb3cgdG8gc3RvcmUgaW4gY29sb3JfYnVmICovCi0KLSNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECS8qIG9ubHkgbmVlZGVkIGZvciBjb250ZXh0IGNhc2UgKi8KLSAgaW50IHRoaXNfcm93X2dyb3VwOwkJLyogc3RhcnRpbmcgcm93IGluZGV4IG9mIGdyb3VwIHRvIHByb2Nlc3MgKi8KLSAgaW50IG5leHRfYnVmX3N0b3A7CQkvKiBkb3duc2FtcGxlIHdoZW4gd2UgcmVhY2ggdGhpcyBpbmRleCAqLwotI2VuZGlmCi19IG15X3ByZXBfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9wcmVwX2NvbnRyb2xsZXIgKiBteV9wcmVwX3B0cjsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX3ByZXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKLXsKLSAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7Ci0KLSAgaWYgKHBhc3NfbW9kZSAhPSBKQlVGX1BBU1NfVEhSVSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLwotICBwcmVwLT5yb3dzX3RvX2dvID0gY2luZm8tPmltYWdlX2hlaWdodDsKLSAgLyogTWFyayB0aGUgY29udmVyc2lvbiBidWZmZXIgZW1wdHkgKi8KLSAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKLSNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECi0gIC8qIFByZXNldCBhZGRpdGlvbmFsIHN0YXRlIHZhcmlhYmxlcyBmb3IgY29udGV4dCBtb2RlLgotICAgKiBUaGVzZSBhcmVuJ3QgdXNlZCBpbiBub24tY29udGV4dCBtb2RlLCBzbyB3ZSBuZWVkbid0IHRlc3Qgd2hpY2ggbW9kZS4KLSAgICovCi0gIHByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKLSAgLyogU2V0IG5leHRfYnVmX3N0b3AgdG8gc3RvcCBhZnRlciB0d28gcm93IGdyb3VwcyBoYXZlIGJlZW4gcmVhZCBpbi4gKi8KLSAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IDIgKiBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0jZW5kaWYKLX0KLQotCi0vKgotICogRXhwYW5kIGFuIGltYWdlIHZlcnRpY2FsbHkgZnJvbSBoZWlnaHQgaW5wdXRfcm93cyB0byBoZWlnaHQgb3V0cHV0X3Jvd3MsCi0gKiBieSBkdXBsaWNhdGluZyB0aGUgYm90dG9tIHJvdy4KLSAqLwotCi1MT0NBTCh2b2lkKQotZXhwYW5kX2JvdHRvbV9lZGdlIChKU0FNUEFSUkFZIGltYWdlX2RhdGEsIEpESU1FTlNJT04gbnVtX2NvbHMsCi0JCSAgICBpbnQgaW5wdXRfcm93cywgaW50IG91dHB1dF9yb3dzKQotewotICByZWdpc3RlciBpbnQgcm93OwotCi0gIGZvciAocm93ID0gaW5wdXRfcm93czsgcm93IDwgb3V0cHV0X3Jvd3M7IHJvdysrKSB7Ci0gICAgamNvcHlfc2FtcGxlX3Jvd3MoaW1hZ2VfZGF0YSwgaW5wdXRfcm93cy0xLCBpbWFnZV9kYXRhLCByb3csCi0JCSAgICAgIDEsIG51bV9jb2xzKTsKLSAgfQotfQotCi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2ltcGxlIG5vLWNvbnRleHQgY2FzZS4KLSAqCi0gKiBQcmVwcm9jZXNzb3Igb3V0cHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAotICogaXMgZGVmaW5lZCB0byBiZSB2X3NhbXBfZmFjdG9yIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LgotICogRG93bnNhbXBsaW5nIHdpbGwgcHJvZHVjZSB0aGlzIG11Y2ggZGF0YSBmcm9tIGVhY2ggbWF4X3Zfc2FtcF9mYWN0b3IKLSAqIGlucHV0IHJvd3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcmVfcHJvY2Vzc19kYXRhIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKLQkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCi0JCSAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKLQkJICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQotewotICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKLSAgaW50IG51bXJvd3MsIGNpOwotICBKRElNRU5TSU9OIGlucm93czsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0KLSAgd2hpbGUgKCppbl9yb3dfY3RyIDwgaW5fcm93c19hdmFpbCAmJgotCSAqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgewotICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCi0gICAgaW5yb3dzID0gaW5fcm93c19hdmFpbCAtICppbl9yb3dfY3RyOwotICAgIG51bXJvd3MgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLSBwcmVwLT5uZXh0X2J1Zl9yb3c7Ci0gICAgbnVtcm93cyA9IChpbnQpIE1JTigoSkRJTUVOU0lPTikgbnVtcm93cywgaW5yb3dzKTsKLSAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKLQkJCQkgICAgICAgcHJlcC0+Y29sb3JfYnVmLAotCQkJCSAgICAgICAoSkRJTUVOU0lPTikgcHJlcC0+bmV4dF9idWZfcm93LAotCQkJCSAgICAgICBudW1yb3dzKTsKLSAgICAqaW5fcm93X2N0ciArPSBudW1yb3dzOwotICAgIHByZXAtPm5leHRfYnVmX3JvdyArPSBudW1yb3dzOwotICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKLSAgICAvKiBJZiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KLSAgICBpZiAocHJlcC0+cm93c190b19nbyA9PSAwICYmCi0JcHJlcC0+bmV4dF9idWZfcm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7Ci0gICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLQlleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAotCQkJICAgcHJlcC0+bmV4dF9idWZfcm93LCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOwotICAgICAgfQotICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotICAgIH0KLSAgICAvKiBJZiB3ZSd2ZSBmaWxsZWQgdGhlIGNvbnZlcnNpb24gYnVmZmVyLCBlbXB0eSBpdC4gKi8KLSAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93ID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgICAgKCpjaW5mby0+ZG93bnNhbXBsZS0+ZG93bnNhbXBsZSkgKGNpbmZvLAotCQkJCQlwcmVwLT5jb2xvcl9idWYsIChKRElNRU5TSU9OKSAwLAotCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOwotICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKLSAgICAgICgqb3V0X3Jvd19ncm91cF9jdHIpKys7Ci0gICAgfQotICAgIC8qIElmIGF0IGJvdHRvbSBvZiBpbWFnZSwgcGFkIHRoZSBvdXRwdXQgdG8gYSBmdWxsIGlNQ1UgaGVpZ2h0LgotICAgICAqIE5vdGUgd2UgYXNzdW1lIHRoZSBjYWxsZXIgaXMgcHJvdmlkaW5nIGEgb25lLWlNQ1UtaGVpZ2h0IG91dHB1dCBidWZmZXIhCi0gICAgICovCi0gICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gMCAmJgotCSpvdXRfcm93X2dyb3VwX2N0ciA8IG91dF9yb3dfZ3JvdXBzX2F2YWlsKSB7Ci0gICAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSAgIGNpKyssIGNvbXBwdHIrKykgewotCWV4cGFuZF9ib3R0b21fZWRnZShvdXRwdXRfYnVmW2NpXSwKLQkJCSAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCi0JCQkgICAoaW50KSAoKm91dF9yb3dfZ3JvdXBfY3RyICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCi0JCQkgICAoaW50KSAob3V0X3Jvd19ncm91cHNfYXZhaWwgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSk7Ci0gICAgICB9Ci0gICAgICAqb3V0X3Jvd19ncm91cF9jdHIgPSBvdXRfcm93X2dyb3Vwc19hdmFpbDsKLSAgICAgIGJyZWFrOwkJCS8qIGNhbiBleGl0IG91dGVyIGxvb3Agd2l0aG91dCB0ZXN0ICovCi0gICAgfQotICB9Ci19Ci0KLQotI2lmZGVmIENPTlRFWFRfUk9XU19TVVBQT1JURUQKLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBjb250ZXh0IGNhc2UuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcmVfcHJvY2Vzc19jb250ZXh0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKLQkJICAgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCi0JCSAgICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKLQkJICAgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQotewotICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKLSAgaW50IG51bXJvd3MsIGNpOwotICBpbnQgYnVmX2hlaWdodCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIDM7Ci0gIEpESU1FTlNJT04gaW5yb3dzOwotCi0gIHdoaWxlICgqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgewotICAgIGlmICgqaW5fcm93X2N0ciA8IGluX3Jvd3NfYXZhaWwpIHsKLSAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCi0gICAgICBpbnJvd3MgPSBpbl9yb3dzX2F2YWlsIC0gKmluX3Jvd19jdHI7Ci0gICAgICBudW1yb3dzID0gcHJlcC0+bmV4dF9idWZfc3RvcCAtIHByZXAtPm5leHRfYnVmX3JvdzsKLSAgICAgIG51bXJvd3MgPSAoaW50KSBNSU4oKEpESU1FTlNJT04pIG51bXJvd3MsIGlucm93cyk7Ci0gICAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKLQkJCQkJIHByZXAtPmNvbG9yX2J1ZiwKLQkJCQkJIChKRElNRU5TSU9OKSBwcmVwLT5uZXh0X2J1Zl9yb3csCi0JCQkJCSBudW1yb3dzKTsKLSAgICAgIC8qIFBhZCBhdCB0b3Agb2YgaW1hZ2UsIGlmIGZpcnN0IHRpbWUgdGhyb3VnaCAqLwotICAgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gY2luZm8tPmltYWdlX2hlaWdodCkgewotCWZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotCSAgaW50IHJvdzsKLQkgIGZvciAocm93ID0gMTsgcm93IDw9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcjsgcm93KyspIHsKLQkgICAgamNvcHlfc2FtcGxlX3Jvd3MocHJlcC0+Y29sb3JfYnVmW2NpXSwgMCwKLQkJCSAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0sIC1yb3csCi0JCQkgICAgICAxLCBjaW5mby0+aW1hZ2Vfd2lkdGgpOwotCSAgfQotCX0KLSAgICAgIH0KLSAgICAgICppbl9yb3dfY3RyICs9IG51bXJvd3M7Ci0gICAgICBwcmVwLT5uZXh0X2J1Zl9yb3cgKz0gbnVtcm93czsKLSAgICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKLSAgICB9IGVsc2UgewotICAgICAgLyogUmV0dXJuIGZvciBtb3JlIGRhdGEsIHVubGVzcyB3ZSBhcmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuICovCi0gICAgICBpZiAocHJlcC0+cm93c190b19nbyAhPSAwKQotCWJyZWFrOwotICAgICAgLyogV2hlbiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KLSAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPCBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7Ci0JZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0JICBleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAotCQkJICAgICBwcmVwLT5uZXh0X2J1Zl9yb3csIHByZXAtPm5leHRfYnVmX3N0b3ApOwotCX0KLQlwcmVwLT5uZXh0X2J1Zl9yb3cgPSBwcmVwLT5uZXh0X2J1Zl9zdG9wOwotICAgICAgfQotICAgIH0KLSAgICAvKiBJZiB3ZSd2ZSBnb3R0ZW4gZW5vdWdoIGRhdGEsIGRvd25zYW1wbGUgYSByb3cgZ3JvdXAuICovCi0gICAgaWYgKHByZXAtPm5leHRfYnVmX3JvdyA9PSBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7Ci0gICAgICAoKmNpbmZvLT5kb3duc2FtcGxlLT5kb3duc2FtcGxlKSAoY2luZm8sCi0JCQkJCXByZXAtPmNvbG9yX2J1ZiwKLQkJCQkJKEpESU1FTlNJT04pIHByZXAtPnRoaXNfcm93X2dyb3VwLAotCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOwotICAgICAgKCpvdXRfcm93X2dyb3VwX2N0cikrKzsKLSAgICAgIC8qIEFkdmFuY2UgcG9pbnRlcnMgd2l0aCB3cmFwYXJvdW5kIGFzIG5lY2Vzc2FyeS4gKi8KLSAgICAgIHByZXAtPnRoaXNfcm93X2dyb3VwICs9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKLSAgICAgIGlmIChwcmVwLT50aGlzX3Jvd19ncm91cCA+PSBidWZfaGVpZ2h0KQotCXByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKLSAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPj0gYnVmX2hlaWdodCkKLQlwcmVwLT5uZXh0X2J1Zl9yb3cgPSAwOwotICAgICAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IHByZXAtPm5leHRfYnVmX3JvdyArIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogQ3JlYXRlIHRoZSB3cmFwcGVkLWFyb3VuZCBkb3duc2FtcGxpbmcgaW5wdXQgYnVmZmVyIG5lZWRlZCBmb3IgY29udGV4dCBtb2RlLgotICovCi0KLUxPQ0FMKHZvaWQpCi1jcmVhdGVfY29udGV4dF9idWZmZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKLSAgaW50IHJncm91cF9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gIGludCBjaSwgaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIEpTQU1QQVJSQVkgdHJ1ZV9idWZmZXIsIGZha2VfYnVmZmVyOwotCi0gIC8qIEdyYWIgZW5vdWdoIHNwYWNlIGZvciBmYWtlIHJvdyBwb2ludGVycyBmb3IgYWxsIHRoZSBjb21wb25lbnRzOwotICAgKiB3ZSBuZWVkIGZpdmUgcm93IGdyb3Vwcycgd29ydGggb2YgcG9pbnRlcnMgZm9yIGVhY2ggY29tcG9uZW50LgotICAgKi8KLSAgZmFrZV9idWZmZXIgPSAoSlNBTVBBUlJBWSkKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCShjaW5mby0+bnVtX2NvbXBvbmVudHMgKiA1ICogcmdyb3VwX2hlaWdodCkgKgotCQkJCVNJWkVPRihKU0FNUFJPVykpOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgLyogQWxsb2NhdGUgdGhlIGFjdHVhbCBidWZmZXIgc3BhY2UgKDMgcm93IGdyb3VwcykgZm9yIHRoaXMgY29tcG9uZW50LgotICAgICAqIFdlIG1ha2UgdGhlIGJ1ZmZlciB3aWRlIGVub3VnaCB0byBhbGxvdyB0aGUgZG93bnNhbXBsZXIgdG8gZWRnZS1leHBhbmQKLSAgICAgKiBob3Jpem9udGFsbHkgd2l0aGluIHRoZSBidWZmZXIsIGlmIGl0IHNvIGNob29zZXMuCi0gICAgICovCi0gICAgdHJ1ZV9idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgKEpESU1FTlNJT04pICgoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUgKgotCQkgICAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCi0gICAgICAgKEpESU1FTlNJT04pICgzICogcmdyb3VwX2hlaWdodCkpOwotICAgIC8qIENvcHkgdHJ1ZSBidWZmZXIgcm93IHBvaW50ZXJzIGludG8gdGhlIG1pZGRsZSBvZiB0aGUgZmFrZSByb3cgYXJyYXkgKi8KLSAgICBNRU1DT1BZKGZha2VfYnVmZmVyICsgcmdyb3VwX2hlaWdodCwgdHJ1ZV9idWZmZXIsCi0JICAgIDMgKiByZ3JvdXBfaGVpZ2h0ICogU0laRU9GKEpTQU1QUk9XKSk7Ci0gICAgLyogRmlsbCBpbiB0aGUgYWJvdmUgYW5kIGJlbG93IHdyYXBhcm91bmQgcG9pbnRlcnMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwX2hlaWdodDsgaSsrKSB7Ci0gICAgICBmYWtlX2J1ZmZlcltpXSA9IHRydWVfYnVmZmVyWzIgKiByZ3JvdXBfaGVpZ2h0ICsgaV07Ci0gICAgICBmYWtlX2J1ZmZlcls0ICogcmdyb3VwX2hlaWdodCArIGldID0gdHJ1ZV9idWZmZXJbaV07Ci0gICAgfQotICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSBmYWtlX2J1ZmZlciArIHJncm91cF9oZWlnaHQ7Ci0gICAgZmFrZV9idWZmZXIgKz0gNSAqIHJncm91cF9oZWlnaHQ7IC8qIHBvaW50IHRvIHNwYWNlIGZvciBuZXh0IGNvbXBvbmVudCAqLwotICB9Ci19Ci0KLSNlbmRpZiAvKiBDT05URVhUX1JPV1NfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfY19wcmVwX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCi17Ci0gIG15X3ByZXBfcHRyIHByZXA7Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0KLSAgaWYgKG5lZWRfZnVsbF9idWZmZXIpCQkvKiBzYWZldHkgY2hlY2sgKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0KLSAgcHJlcCA9IChteV9wcmVwX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9wcmVwX2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPnByZXAgPSAoc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgKikgcHJlcDsKLSAgcHJlcC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3ByZXA7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIGNvbG9yIGNvbnZlcnNpb24gYnVmZmVyLgotICAgKiBXZSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gYWxsb3cgdGhlIGRvd25zYW1wbGVyIHRvIGVkZ2UtZXhwYW5kCi0gICAqIGhvcml6b250YWxseSB3aXRoaW4gdGhlIGJ1ZmZlciwgaWYgaXQgc28gY2hvb3Nlcy4KLSAgICovCi0gIGlmIChjaW5mby0+ZG93bnNhbXBsZS0+bmVlZF9jb250ZXh0X3Jvd3MpIHsKLSAgICAvKiBTZXQgdXAgdG8gcHJvdmlkZSBjb250ZXh0IHJvd3MgKi8KLSNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECi0gICAgcHJlcC0+cHViLnByZV9wcm9jZXNzX2RhdGEgPSBwcmVfcHJvY2Vzc19jb250ZXh0OwotICAgIGNyZWF0ZV9jb250ZXh0X2J1ZmZlcihjaW5mbyk7Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIC8qIE5vIGNvbnRleHQsIGp1c3QgbWFrZSBpdCB0YWxsIGVub3VnaCBmb3Igb25lIHJvdyBncm91cCAqLwotICAgIHByZXAtPnB1Yi5wcmVfcHJvY2Vzc19kYXRhID0gcHJlX3Byb2Nlc3NfZGF0YTsKLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCSAoSkRJTUVOU0lPTikgKCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSAqCi0JCQljaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNzYW1wbGUuYyBiL2xpYmpwZWd0d3JwL2pjc2FtcGxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMmVjODcuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNzYW1wbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKgotICogamNzYW1wbGUuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGRvd25zYW1wbGluZyByb3V0aW5lcy4KLSAqCi0gKiBEb3duc2FtcGxpbmcgaW5wdXQgZGF0YSBpcyBjb3VudGVkIGluICJyb3cgZ3JvdXBzIi4gIEEgcm93IGdyb3VwCi0gKiBpcyBkZWZpbmVkIHRvIGJlIG1heF92X3NhbXBfZmFjdG9yIHBpeGVsIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQsCi0gKiBmcm9tIHdoaWNoIHRoZSBkb3duc2FtcGxlciBwcm9kdWNlcyB2X3NhbXBfZmFjdG9yIHNhbXBsZSByb3dzLgotICogQSBzaW5nbGUgcm93IGdyb3VwIGlzIHByb2Nlc3NlZCBpbiBlYWNoIGNhbGwgdG8gdGhlIGRvd25zYW1wbGVyIG1vZHVsZS4KLSAqCi0gKiBUaGUgZG93bnNhbXBsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVkZ2UtZXhwYW5zaW9uIG9mIGl0cyBvdXRwdXQgZGF0YQotICogdG8gZmlsbCBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgRENUIGJsb2NrcyBob3Jpem9udGFsbHkuICBUaGUgc291cmNlIGJ1ZmZlcgotICogbWF5IGJlIG1vZGlmaWVkIGlmIGl0IGlzIGhlbHBmdWwgZm9yIHRoaXMgcHVycG9zZSAodGhlIHNvdXJjZSBidWZmZXIgaXMKLSAqIGFsbG9jYXRlZCB3aWRlIGVub3VnaCB0byBjb3JyZXNwb25kIHRvIHRoZSBkZXNpcmVkIG91dHB1dCB3aWR0aCkuCi0gKiBUaGUgY2FsbGVyICh0aGUgcHJlcCBjb250cm9sbGVyKSBpcyByZXNwb25zaWJsZSBmb3IgdmVydGljYWwgcGFkZGluZy4KLSAqCi0gKiBUaGUgZG93bnNhbXBsZXIgbWF5IHJlcXVlc3QgImNvbnRleHQgcm93cyIgYnkgc2V0dGluZyBuZWVkX2NvbnRleHRfcm93cwotICogZHVyaW5nIHN0YXJ0dXAuICBJbiB0aGlzIGNhc2UsIHRoZSBpbnB1dCBhcnJheXMgd2lsbCBjb250YWluIGF0IGxlYXN0Ci0gKiBvbmUgcm93IGdyb3VwJ3Mgd29ydGggb2YgcGl4ZWxzIGFib3ZlIGFuZCBiZWxvdyB0aGUgcGFzc2VkLWluIGRhdGE7Ci0gKiB0aGUgY2FsbGVyIHdpbGwgY3JlYXRlIGR1bW15IHJvd3MgYXQgaW1hZ2UgdG9wIGFuZCBib3R0b20gYnkgcmVwbGljYXRpbmcKLSAqIHRoZSBmaXJzdCBvciBsYXN0IHJlYWwgcGl4ZWwgcm93LgotICoKLSAqIEFuIGV4Y2VsbGVudCByZWZlcmVuY2UgZm9yIGltYWdlIHJlc2FtcGxpbmcgaXMKLSAqICAgRGlnaXRhbCBJbWFnZSBXYXJwaW5nLCBHZW9yZ2UgV29sYmVyZywgMTk5MC4KLSAqICAgUHViLiBieSBJRUVFIENvbXB1dGVyIFNvY2lldHkgUHJlc3MsIExvcyBBbGFtaXRvcywgQ0EuIElTQk4gMC04MTg2LTg5NDQtNy4KLSAqCi0gKiBUaGUgZG93bnNhbXBsaW5nIGFsZ29yaXRobSB1c2VkIGhlcmUgaXMgYSBzaW1wbGUgYXZlcmFnZSBvZiB0aGUgc291cmNlCi0gKiBwaXhlbHMgY292ZXJlZCBieSB0aGUgb3V0cHV0IHBpeGVsLiAgVGhlIGhpLWZhbHV0aW4gc2FtcGxpbmcgbGl0ZXJhdHVyZQotICogcmVmZXJzIHRvIHRoaXMgYXMgYSAiYm94IGZpbHRlciIuICBJbiBnZW5lcmFsIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBib3gKLSAqIGZpbHRlciBhcmUgbm90IHZlcnkgZ29vZCwgYnV0IGZvciB0aGUgc3BlY2lmaWMgY2FzZXMgd2Ugbm9ybWFsbHkgdXNlICgxOjEKLSAqIGFuZCAyOjEgcmF0aW9zKSB0aGUgYm94IGlzIGVxdWl2YWxlbnQgdG8gYSAidHJpYW5nbGUgZmlsdGVyIiB3aGljaCBpcyBub3QKLSAqIG5lYXJseSBzbyBiYWQuICBJZiB5b3UgaW50ZW5kIHRvIHVzZSBvdGhlciBzYW1wbGluZyByYXRpb3MsIHlvdSdkIGJlIHdlbGwKLSAqIGFkdmlzZWQgdG8gaW1wcm92ZSB0aGlzIGNvZGUuCi0gKgotICogQSBzaW1wbGUgaW5wdXQtc21vb3RoaW5nIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQuICBUaGlzIGlzIG1haW5seSBpbnRlbmRlZAotICogZm9yIGNsZWFuaW5nIHVwIGNvbG9yLWRpdGhlcmVkIEdJRiBpbnB1dCBmaWxlcyAoaWYgeW91IGZpbmQgaXQgaW5hZGVxdWF0ZSwKLSAqIHdlIHN1Z2dlc3QgdXNpbmcgYW4gZXh0ZXJuYWwgZmlsdGVyaW5nIHByb2dyYW0gc3VjaCBhcyBwbm1jb252b2wpLiAgV2hlbgotICogZW5hYmxlZCwgZWFjaCBpbnB1dCBwaXhlbCBQIGlzIHJlcGxhY2VkIGJ5IGEgd2VpZ2h0ZWQgc3VtIG9mIGl0c2VsZiBhbmQgaXRzCi0gKiBlaWdodCBuZWlnaGJvcnMuICBQJ3Mgd2VpZ2h0IGlzIDEtOCpTRiBhbmQgZWFjaCBuZWlnaGJvcidzIHdlaWdodCBpcyBTRiwKLSAqIHdoZXJlIFNGID0gKHNtb290aGluZ19mYWN0b3IgLyAxMDI0KS4KLSAqIEN1cnJlbnRseSwgc21vb3RoaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGZvciAyaDJ2IHNhbXBsaW5nIGZhY3RvcnMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIFBvaW50ZXIgdG8gcm91dGluZSB0byBkb3duc2FtcGxlIGEgc2luZ2xlIGNvbXBvbmVudCAqLwotdHlwZWRlZiBKTUVUSE9EKHZvaWQsIGRvd25zYW1wbGUxX3B0ciwKLQkJKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkpOwotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIERvd25zYW1wbGluZyBtZXRob2QgcG9pbnRlcnMsIG9uZSBwZXIgY29tcG9uZW50ICovCi0gIGRvd25zYW1wbGUxX3B0ciBtZXRob2RzW01BWF9DT01QT05FTlRTXTsKLX0gbXlfZG93bnNhbXBsZXI7Ci0KLXR5cGVkZWYgbXlfZG93bnNhbXBsZXIgKiBteV9kb3duc2FtcGxlX3B0cjsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBkb3duc2FtcGxpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgZm9yIG5vdyAqLwotfQotCi0KLS8qCi0gKiBFeHBhbmQgYSBjb21wb25lbnQgaG9yaXpvbnRhbGx5IGZyb20gd2lkdGggaW5wdXRfY29scyB0byB3aWR0aCBvdXRwdXRfY29scywKLSAqIGJ5IGR1cGxpY2F0aW5nIHRoZSByaWdodG1vc3Qgc2FtcGxlcy4KLSAqLwotCi1MT0NBTCh2b2lkKQotZXhwYW5kX3JpZ2h0X2VkZ2UgKEpTQU1QQVJSQVkgaW1hZ2VfZGF0YSwgaW50IG51bV9yb3dzLAotCQkgICBKRElNRU5TSU9OIGlucHV0X2NvbHMsIEpESU1FTlNJT04gb3V0cHV0X2NvbHMpCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSBwaXh2YWw7Ci0gIHJlZ2lzdGVyIGludCBjb3VudDsKLSAgaW50IHJvdzsKLSAgaW50IG51bWNvbHMgPSAoaW50KSAob3V0cHV0X2NvbHMgLSBpbnB1dF9jb2xzKTsKLQotICBpZiAobnVtY29scyA+IDApIHsKLSAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgewotICAgICAgcHRyID0gaW1hZ2VfZGF0YVtyb3ddICsgaW5wdXRfY29sczsKLSAgICAgIHBpeHZhbCA9IHB0clstMV07CQkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCi0gICAgICBmb3IgKGNvdW50ID0gbnVtY29sczsgY291bnQgPiAwOyBjb3VudC0tKQotCSpwdHIrKyA9IHBpeHZhbDsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogRG8gZG93bnNhbXBsaW5nIGZvciBhIHdob2xlIHJvdyBncm91cCAoYWxsIGNvbXBvbmVudHMpLgotICoKLSAqIEluIHRoaXMgdmVyc2lvbiB3ZSBzaW1wbHkgZG93bnNhbXBsZSBlYWNoIGNvbXBvbmVudCBpbmRlcGVuZGVudGx5LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc2VwX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQlKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfaW5kZXgsCi0JCUpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3VwX2luZGV4KQotewotICBteV9kb3duc2FtcGxlX3B0ciBkb3duc2FtcGxlID0gKG15X2Rvd25zYW1wbGVfcHRyKSBjaW5mby0+ZG93bnNhbXBsZTsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgSlNBTVBBUlJBWSBpbl9wdHIsIG91dF9wdHI7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBpbl9wdHIgPSBpbnB1dF9idWZbY2ldICsgaW5fcm93X2luZGV4OwotICAgIG91dF9wdHIgPSBvdXRwdXRfYnVmW2NpXSArIChvdXRfcm93X2dyb3VwX2luZGV4ICogY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgKCpkb3duc2FtcGxlLT5tZXRob2RzW2NpXSkgKGNpbmZvLCBjb21wcHRyLCBpbl9wdHIsIG91dF9wdHIpOwotICB9Ci19Ci0KLQotLyoKLSAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KLSAqIE9uZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgYXJiaXRyYXJ5IGludGVncmFsIHNhbXBsaW5nIHJhdGlvcywgd2l0aG91dCBzbW9vdGhpbmcuCi0gKiBOb3RlIHRoYXQgdGhpcyB2ZXJzaW9uIGlzIG5vdCBhY3R1YWxseSB1c2VkIGZvciBjdXN0b21hcnkgc2FtcGxpbmcgcmF0aW9zLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaW50X2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQotewotICBpbnQgaW5yb3csIG91dHJvdywgaF9leHBhbmQsIHZfZXhwYW5kLCBudW1waXgsIG51bXBpeDIsIGgsIHY7Ci0gIEpESU1FTlNJT04gb3V0Y29sLCBvdXRjb2xfaDsJLyogb3V0Y29sX2ggPT0gb3V0Y29sKmhfZXhwYW5kICovCi0gIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOwotICBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICBJTlQzMiBvdXR2YWx1ZTsKLQotICBoX2V4cGFuZCA9IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAvIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7Ci0gIHZfZXhwYW5kID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yIC8gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgbnVtcGl4ID0gaF9leHBhbmQgKiB2X2V4cGFuZDsKLSAgbnVtcGl4MiA9IG51bXBpeC8yOwotCi0gIC8qIEV4cGFuZCBpbnB1dCBkYXRhIGVub3VnaCB0byBsZXQgYWxsIHRoZSBvdXRwdXQgc2FtcGxlcyBiZSBnZW5lcmF0ZWQKLSAgICogYnkgdGhlIHN0YW5kYXJkIGxvb3AuICBTcGVjaWFsLWNhc2luZyBwYWRkZWQgb3V0cHV0IHdvdWxkIGJlIG1vcmUKLSAgICogZWZmaWNpZW50LgotICAgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2UoaW5wdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAotCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIGhfZXhwYW5kKTsKLQotICBpbnJvdyA9IDA7Ci0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIGZvciAob3V0Y29sID0gMCwgb3V0Y29sX2ggPSAwOyBvdXRjb2wgPCBvdXRwdXRfY29sczsKLQkgb3V0Y29sKyssIG91dGNvbF9oICs9IGhfZXhwYW5kKSB7Ci0gICAgICBvdXR2YWx1ZSA9IDA7Ci0gICAgICBmb3IgKHYgPSAwOyB2IDwgdl9leHBhbmQ7IHYrKykgewotCWlucHRyID0gaW5wdXRfZGF0YVtpbnJvdyt2XSArIG91dGNvbF9oOwotCWZvciAoaCA9IDA7IGggPCBoX2V4cGFuZDsgaCsrKSB7Ci0JICBvdXR2YWx1ZSArPSAoSU5UMzIpIEdFVEpTQU1QTEUoKmlucHRyKyspOwotCX0KLSAgICAgIH0KLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG91dHZhbHVlICsgbnVtcGl4MikgLyBudW1waXgpOwotICAgIH0KLSAgICBpbnJvdyArPSB2X2V4cGFuZDsKLSAgfQotfQotCi0KLS8qCi0gKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCi0gKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgZnVsbC1zaXplIGNvbXBvbmVudCwKLSAqIHdpdGhvdXQgc21vb3RoaW5nLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZnVsbHNpemVfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKLXsKLSAgLyogQ29weSB0aGUgZGF0YSAqLwotICBqY29weV9zYW1wbGVfcm93cyhpbnB1dF9kYXRhLCAwLCBvdXRwdXRfZGF0YSwgMCwKLQkJICAgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwgY2luZm8tPmltYWdlX3dpZHRoKTsKLSAgLyogRWRnZS1leHBhbmQgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2Uob3V0cHV0X2RhdGEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSk7Ci19Ci0KLQotLyoKLSAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLAotICogd2l0aG91dCBzbW9vdGhpbmcuCi0gKgotICogQSBub3RlIGFib3V0IHRoZSAiYmlhcyIgY2FsY3VsYXRpb25zOiB3aGVuIHJvdW5kaW5nIGZyYWN0aW9uYWwgdmFsdWVzIHRvCi0gKiBpbnRlZ2VyLCB3ZSBkbyBub3Qgd2FudCB0byBhbHdheXMgcm91bmQgMC41IHVwIHRvIHRoZSBuZXh0IGludGVnZXIuCi0gKiBJZiB3ZSBkaWQgdGhhdCwgd2UnZCBpbnRyb2R1Y2UgYSBub3RpY2VhYmxlIGJpYXMgdG93YXJkcyBsYXJnZXIgdmFsdWVzLgotICogSW5zdGVhZCwgdGhpcyBjb2RlIGlzIGFycmFuZ2VkIHNvIHRoYXQgMC41IHdpbGwgYmUgcm91bmRlZCB1cCBvciBkb3duIGF0Ci0gKiBhbHRlcm5hdGUgcGl4ZWwgbG9jYXRpb25zIChhIHNpbXBsZSBvcmRlcmVkIGRpdGhlciBwYXR0ZXJuKS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjFfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQotewotICBpbnQgb3V0cm93OwotICBKRElNRU5TSU9OIG91dGNvbDsKLSAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIGludCBiaWFzOwotCi0gIC8qIEV4cGFuZCBpbnB1dCBkYXRhIGVub3VnaCB0byBsZXQgYWxsIHRoZSBvdXRwdXQgc2FtcGxlcyBiZSBnZW5lcmF0ZWQKLSAgICogYnkgdGhlIHN0YW5kYXJkIGxvb3AuICBTcGVjaWFsLWNhc2luZyBwYWRkZWQgb3V0cHV0IHdvdWxkIGJlIG1vcmUKLSAgICogZWZmaWNpZW50LgotICAgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2UoaW5wdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAotCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIDIpOwotCi0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIGlucHRyID0gaW5wdXRfZGF0YVtvdXRyb3ddOwotICAgIGJpYXMgPSAwOwkJCS8qIGJpYXMgPSAwLDEsMCwxLC4uLiBmb3Igc3VjY2Vzc2l2ZSBzYW1wbGVzICovCi0gICAgZm9yIChvdXRjb2wgPSAwOyBvdXRjb2wgPCBvdXRwdXRfY29sczsgb3V0Y29sKyspIHsKLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKEdFVEpTQU1QTEUoKmlucHRyKSArIEdFVEpTQU1QTEUoaW5wdHJbMV0pCi0JCQkgICAgICArIGJpYXMpID4+IDEpOwotICAgICAgYmlhcyBePSAxOwkJLyogMD0+MSwgMT0+MCAqLwotICAgICAgaW5wdHIgKz0gMjsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIHN0YW5kYXJkIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbCwKLSAqIHdpdGhvdXQgc21vb3RoaW5nLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2Ml9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCi17Ci0gIGludCBpbnJvdywgb3V0cm93OwotICBKRElNRU5TSU9OIG91dGNvbDsKLSAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIGludCBiaWFzOwotCi0gIC8qIEV4cGFuZCBpbnB1dCBkYXRhIGVub3VnaCB0byBsZXQgYWxsIHRoZSBvdXRwdXQgc2FtcGxlcyBiZSBnZW5lcmF0ZWQKLSAgICogYnkgdGhlIHN0YW5kYXJkIGxvb3AuICBTcGVjaWFsLWNhc2luZyBwYWRkZWQgb3V0cHV0IHdvdWxkIGJlIG1vcmUKLSAgICogZWZmaWNpZW50LgotICAgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2UoaW5wdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAotCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIDIpOwotCi0gIGlucm93ID0gMDsKLSAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgewotICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107Ci0gICAgaW5wdHIwID0gaW5wdXRfZGF0YVtpbnJvd107Ci0gICAgaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdysxXTsKLSAgICBiaWFzID0gMTsJCQkvKiBiaWFzID0gMSwyLDEsMiwuLi4gZm9yIHN1Y2Nlc3NpdmUgc2FtcGxlcyAqLwotICAgIGZvciAob3V0Y29sID0gMDsgb3V0Y29sIDwgb3V0cHV0X2NvbHM7IG91dGNvbCsrKSB7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKLQkJCSAgICAgIEdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSkKLQkJCSAgICAgICsgYmlhcykgPj4gMik7Ci0gICAgICBiaWFzIF49IDM7CQkvKiAxPT4yLCAyPT4xICovCi0gICAgICBpbnB0cjAgKz0gMjsgaW5wdHIxICs9IDI7Ci0gICAgfQotICAgIGlucm93ICs9IDI7Ci0gIH0KLX0KLQotCi0jaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAotCi0vKgotICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIHN0YW5kYXJkIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbCwKLSAqIHdpdGggc21vb3RoaW5nLiAgT25lIHJvdyBvZiBjb250ZXh0IGlzIHJlcXVpcmVkLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2Ml9zbW9vdGhfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkJSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQotewotICBpbnQgaW5yb3csIG91dHJvdzsKLSAgSkRJTUVOU0lPTiBjb2xjdHI7Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgYWJvdmVfcHRyLCBiZWxvd19wdHIsIG91dHB0cjsKLSAgSU5UMzIgbWVtYmVyc3VtLCBuZWlnaHN1bSwgbWVtYmVyc2NhbGUsIG5laWdoc2NhbGU7Ci0KLSAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAotICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQotICAgKiBlZmZpY2llbnQuCi0gICAqLwotICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhIC0gMSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICsgMiwKLQkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMgKiAyKTsKLQotICAvKiBXZSBkb24ndCBib3RoZXIgdG8gZm9ybSB0aGUgaW5kaXZpZHVhbCAic21vb3RoZWQiIGlucHV0IHBpeGVsIHZhbHVlczsKLSAgICogd2UgY2FuIGRpcmVjdGx5IGNvbXB1dGUgdGhlIG91dHB1dCB3aGljaCBpcyB0aGUgYXZlcmFnZSBvZiB0aGUgZm91cgotICAgKiBzbW9vdGhlZCB2YWx1ZXMuICBFYWNoIG9mIHRoZSBmb3VyIG1lbWJlciBwaXhlbHMgY29udHJpYnV0ZXMgYSBmcmFjdGlvbgotICAgKiAoMS04KlNGKSB0byBpdHMgb3duIHNtb290aGVkIGltYWdlIGFuZCBhIGZyYWN0aW9uIFNGIHRvIGVhY2ggb2YgdGhlIHRocmVlCi0gICAqIG90aGVyIHNtb290aGVkIHBpeGVscywgdGhlcmVmb3JlIGEgdG90YWwgZnJhY3Rpb24gKDEtNSpTRikvNCB0byB0aGUgZmluYWwKLSAgICogb3V0cHV0LiAgVGhlIGZvdXIgY29ybmVyLWFkamFjZW50IG5laWdoYm9yIHBpeGVscyBjb250cmlidXRlIGEgZnJhY3Rpb24KLSAgICogU0YgdG8ganVzdCBvbmUgc21vb3RoZWQgcGl4ZWwsIG9yIFNGLzQgdG8gdGhlIGZpbmFsIG91dHB1dDsgd2hpbGUgdGhlCi0gICAqIGVpZ2h0IGVkZ2UtYWRqYWNlbnQgbmVpZ2hib3JzIGNvbnRyaWJ1dGUgU0YgdG8gZWFjaCBvZiB0d28gc21vb3RoZWQKLSAgICogcGl4ZWxzLCBvciBTRi8yIG92ZXJhbGwuICBJbiBvcmRlciB0byB1c2UgaW50ZWdlciBhcml0aG1ldGljLCB0aGVzZQotICAgKiBmYWN0b3JzIGFyZSBzY2FsZWQgYnkgMl4xNiA9IDY1NTM2LgotICAgKiBBbHNvIHJlY2FsbCB0aGF0IFNGID0gc21vb3RoaW5nX2ZhY3RvciAvIDEwMjQuCi0gICAqLwotCi0gIG1lbWJlcnNjYWxlID0gMTYzODQgLSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDgwOyAvKiBzY2FsZWQgKDEtNSpTRikvNCAqLwotICBuZWlnaHNjYWxlID0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiAxNjsgLyogc2NhbGVkIFNGLzQgKi8KLQotICBpbnJvdyA9IDA7Ci0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIGlucHRyMCA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgIGlucHRyMSA9IGlucHV0X2RhdGFbaW5yb3crMV07Ci0gICAgYWJvdmVfcHRyID0gaW5wdXRfZGF0YVtpbnJvdy0xXTsKLSAgICBiZWxvd19wdHIgPSBpbnB1dF9kYXRhW2lucm93KzJdOwotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2x1bW46IHByZXRlbmQgY29sdW1uIC0xIGlzIHNhbWUgYXMgY29sdW1uIDAgKi8KLSAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKLQkJR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKTsKLSAgICBuZWlnaHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKwotCSAgICAgICBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMV0pICsKLQkgICAgICAgR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzJdKSArCi0JICAgICAgIEdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsyXSk7Ci0gICAgbmVpZ2hzdW0gKz0gbmVpZ2hzdW07Ci0gICAgbmVpZ2hzdW0gKz0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzJdKSArCi0JCUdFVEpTQU1QTEUoKmJlbG93X3B0cikgKyBHRVRKU0FNUExFKGJlbG93X3B0clsyXSk7Ci0gICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7Ci0gICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLSAgICBpbnB0cjAgKz0gMjsgaW5wdHIxICs9IDI7IGFib3ZlX3B0ciArPSAyOyBiZWxvd19wdHIgKz0gMjsKLQotICAgIGZvciAoY29sY3RyID0gb3V0cHV0X2NvbHMgLSAyOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgewotICAgICAgLyogc3VtIG9mIHBpeGVscyBkaXJlY3RseSBtYXBwZWQgdG8gdGhpcyBvdXRwdXQgZWxlbWVudCAqLwotICAgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCi0JCSAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKTsKLSAgICAgIC8qIHN1bSBvZiBlZGdlLW5laWdoYm9yIHBpeGVscyAqLwotICAgICAgbmVpZ2hzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMV0pICsKLQkJIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKyBHRVRKU0FNUExFKGJlbG93X3B0clsxXSkgKwotCQkgR0VUSlNBTVBMRShpbnB0cjBbLTFdKSArIEdFVEpTQU1QTEUoaW5wdHIwWzJdKSArCi0JCSBHRVRKU0FNUExFKGlucHRyMVstMV0pICsgR0VUSlNBTVBMRShpbnB0cjFbMl0pOwotICAgICAgLyogVGhlIGVkZ2UtbmVpZ2hib3JzIGNvdW50IHR3aWNlIGFzIG11Y2ggYXMgY29ybmVyLW5laWdoYm9ycyAqLwotICAgICAgbmVpZ2hzdW0gKz0gbmVpZ2hzdW07Ci0gICAgICAvKiBBZGQgaW4gdGhlIGNvcm5lci1uZWlnaGJvcnMgKi8KLSAgICAgIG5laWdoc3VtICs9IEdFVEpTQU1QTEUoYWJvdmVfcHRyWy0xXSkgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsyXSkgKwotCQkgIEdFVEpTQU1QTEUoYmVsb3dfcHRyWy0xXSkgKyBHRVRKU0FNUExFKGJlbG93X3B0clsyXSk7Ci0gICAgICAvKiBmb3JtIGZpbmFsIG91dHB1dCBzY2FsZWQgdXAgYnkgMl4xNiAqLwotICAgICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7Ci0gICAgICAvKiByb3VuZCwgZGVzY2FsZSBhbmQgb3V0cHV0IGl0ICovCi0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOwotICAgICAgaW5wdHIwICs9IDI7IGlucHRyMSArPSAyOyBhYm92ZV9wdHIgKz0gMjsgYmVsb3dfcHRyICs9IDI7Ci0gICAgfQotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBsYXN0IGNvbHVtbiAqLwotICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKwotCQlHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOwotICAgIG5laWdoc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzFdKSArCi0JICAgICAgIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKyBHRVRKU0FNUExFKGJlbG93X3B0clsxXSkgKwotCSAgICAgICBHRVRKU0FNUExFKGlucHRyMFstMV0pICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKLQkgICAgICAgR0VUSlNBTVBMRShpbnB0cjFbLTFdKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKTsKLSAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKLSAgICBuZWlnaHN1bSArPSBHRVRKU0FNUExFKGFib3ZlX3B0clstMV0pICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMV0pICsKLQkJR0VUSlNBTVBMRShiZWxvd19wdHJbLTFdKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKTsKLSAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKLSAgICAqb3V0cHRyID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLQotICAgIGlucm93ICs9IDI7Ci0gIH0KLX0KLQotCi0vKgotICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiBhIGZ1bGwtc2l6ZSBjb21wb25lbnQsCi0gKiB3aXRoIHNtb290aGluZy4gIE9uZSByb3cgb2YgY29udGV4dCBpcyByZXF1aXJlZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZ1bGxzaXplX3Ntb290aF9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0ciwKLQkJCSAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCi17Ci0gIGludCBvdXRyb3c7Ci0gIEpESU1FTlNJT04gY29sY3RyOwotICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIGFib3ZlX3B0ciwgYmVsb3dfcHRyLCBvdXRwdHI7Ci0gIElOVDMyIG1lbWJlcnN1bSwgbmVpZ2hzdW0sIG1lbWJlcnNjYWxlLCBuZWlnaHNjYWxlOwotICBpbnQgY29sc3VtLCBsYXN0Y29sc3VtLCBuZXh0Y29sc3VtOwotCi0gIC8qIEV4cGFuZCBpbnB1dCBkYXRhIGVub3VnaCB0byBsZXQgYWxsIHRoZSBvdXRwdXQgc2FtcGxlcyBiZSBnZW5lcmF0ZWQKLSAgICogYnkgdGhlIHN0YW5kYXJkIGxvb3AuICBTcGVjaWFsLWNhc2luZyBwYWRkZWQgb3V0cHV0IHdvdWxkIGJlIG1vcmUKLSAgICogZWZmaWNpZW50LgotICAgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2UoaW5wdXRfZGF0YSAtIDEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciArIDIsCi0JCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzKTsKLQotICAvKiBFYWNoIG9mIHRoZSBlaWdodCBuZWlnaGJvciBwaXhlbHMgY29udHJpYnV0ZXMgYSBmcmFjdGlvbiBTRiB0byB0aGUKLSAgICogc21vb3RoZWQgcGl4ZWwsIHdoaWxlIHRoZSBtYWluIHBpeGVsIGNvbnRyaWJ1dGVzICgxLTgqU0YpLiAgSW4gb3JkZXIKLSAgICogdG8gdXNlIGludGVnZXIgYXJpdGhtZXRpYywgdGhlc2UgZmFjdG9ycyBhcmUgbXVsdGlwbGllZCBieSAyXjE2ID0gNjU1MzYuCi0gICAqIEFsc28gcmVjYWxsIHRoYXQgU0YgPSBzbW9vdGhpbmdfZmFjdG9yIC8gMTAyNC4KLSAgICovCi0KLSAgbWVtYmVyc2NhbGUgPSA2NTUzNkwgLSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDUxMkw7IC8qIHNjYWxlZCAxLTgqU0YgKi8KLSAgbmVpZ2hzY2FsZSA9IGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogNjQ7IC8qIHNjYWxlZCBTRiAqLwotCi0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIGlucHRyID0gaW5wdXRfZGF0YVtvdXRyb3ddOwotICAgIGFib3ZlX3B0ciA9IGlucHV0X2RhdGFbb3V0cm93LTFdOwotICAgIGJlbG93X3B0ciA9IGlucHV0X2RhdGFbb3V0cm93KzFdOwotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2x1bW4gKi8KLSAgICBjb2xzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIrKykgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIrKykgKwotCSAgICAgR0VUSlNBTVBMRSgqaW5wdHIpOwotICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyKyspOwotICAgIG5leHRjb2xzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArCi0JCSBHRVRKU0FNUExFKCppbnB0cik7Ci0gICAgbmVpZ2hzdW0gPSBjb2xzdW0gKyAoY29sc3VtIC0gbWVtYmVyc3VtKSArIG5leHRjb2xzdW07Ci0gICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7Ci0gICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLSAgICBsYXN0Y29sc3VtID0gY29sc3VtOyBjb2xzdW0gPSBuZXh0Y29sc3VtOwotCi0gICAgZm9yIChjb2xjdHIgPSBvdXRwdXRfY29scyAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7Ci0gICAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cisrKTsKLSAgICAgIGFib3ZlX3B0cisrOyBiZWxvd19wdHIrKzsKLSAgICAgIG5leHRjb2xzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArCi0JCSAgIEdFVEpTQU1QTEUoKmlucHRyKTsKLSAgICAgIG5laWdoc3VtID0gbGFzdGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgbmV4dGNvbHN1bTsKLSAgICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLSAgICAgIGxhc3Rjb2xzdW0gPSBjb2xzdW07IGNvbHN1bSA9IG5leHRjb2xzdW07Ci0gICAgfQotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBsYXN0IGNvbHVtbiAqLwotICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyKTsKLSAgICBuZWlnaHN1bSA9IGxhc3Rjb2xzdW0gKyAoY29sc3VtIC0gbWVtYmVyc3VtKSArIGNvbHN1bTsKLSAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKLSAgICAqb3V0cHRyID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLQotICB9Ci19Ci0KLSNlbmRpZiAvKiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBkb3duc2FtcGxpbmcuCi0gKiBOb3RlIHRoYXQgd2UgbXVzdCBzZWxlY3QgYSByb3V0aW5lIGZvciBlYWNoIGNvbXBvbmVudC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2Rvd25zYW1wbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfZG93bnNhbXBsZV9wdHIgZG93bnNhbXBsZTsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgYm9vbGVhbiBzbW9vdGhvayA9IFRSVUU7Ci0KLSAgZG93bnNhbXBsZSA9IChteV9kb3duc2FtcGxlX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9kb3duc2FtcGxlcikpOwotICBjaW5mby0+ZG93bnNhbXBsZSA9IChzdHJ1Y3QganBlZ19kb3duc2FtcGxlciAqKSBkb3duc2FtcGxlOwotICBkb3duc2FtcGxlLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfZG93bnNhbXBsZTsKLSAgZG93bnNhbXBsZS0+cHViLmRvd25zYW1wbGUgPSBzZXBfZG93bnNhbXBsZTsKLSAgZG93bnNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gRkFMU0U7Ci0KLSAgaWYgKGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0NJUjYwMV9OT1RJTVBMKTsKLQotICAvKiBWZXJpZnkgd2UgY2FuIGhhbmRsZSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgYW5kIHNldCB1cCBtZXRob2QgcG9pbnRlcnMgKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKLQljb21wcHRyLT52X3NhbXBfZmFjdG9yID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLSAgICAgIGlmIChjaW5mby0+c21vb3RoaW5nX2ZhY3RvcikgewotCWRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gZnVsbHNpemVfc21vb3RoX2Rvd25zYW1wbGU7Ci0JZG93bnNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKLSAgICAgIH0gZWxzZQotI2VuZGlmCi0JZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBmdWxsc2l6ZV9kb3duc2FtcGxlOwotICAgIH0gZWxzZSBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIDIgPT0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICYmCi0JICAgICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPT0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7Ci0gICAgICBzbW9vdGhvayA9IEZBTFNFOwotICAgICAgZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYxX2Rvd25zYW1wbGU7Ci0gICAgfSBlbHNlIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKLQkgICAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIDIgPT0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7Ci0jaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAotICAgICAgaWYgKGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yKSB7Ci0JZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX3Ntb290aF9kb3duc2FtcGxlOwotCWRvd25zYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IFRSVUU7Ci0gICAgICB9IGVsc2UKLSNlbmRpZgotCWRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml9kb3duc2FtcGxlOwotICAgIH0gZWxzZSBpZiAoKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAlIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpID09IDAgJiYKLQkgICAgICAgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpID09IDApIHsKLSAgICAgIHNtb290aG9rID0gRkFMU0U7Ci0gICAgICBkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGludF9kb3duc2FtcGxlOwotICAgIH0gZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GUkFDVF9TQU1QTEVfTk9USU1QTCk7Ci0gIH0KLQotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLSAgaWYgKGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICYmICFzbW9vdGhvaykKLSAgICBUUkFDRU1TKGNpbmZvLCAwLCBKVFJDX1NNT09USF9OT1RJTVBMKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamN0cmFucy5jIGIvbGlianBlZ3R3cnAvamN0cmFucy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTc0ZWQxLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjdHJhbnMuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKgotICogamN0cmFucy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgbGlicmFyeSByb3V0aW5lcyBmb3IgdHJhbnNjb2RpbmcgY29tcHJlc3Npb24sCi0gKiB0aGF0IGlzLCB3cml0aW5nIHJhdyBEQ1QgY29lZmZpY2llbnQgYXJyYXlzIHRvIGFuIG91dHB1dCBKUEVHIGZpbGUuCi0gKiBUaGUgcm91dGluZXMgaW4gamNhcGltaW4uYyB3aWxsIGFsc28gYmUgbmVlZGVkIGJ5IGEgdHJhbnNjb2Rlci4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLUxPQ0FMKHZvaWQpIHRyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24KLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKLUxPQ0FMKHZvaWQpIHRyYW5zZW5jb2RlX2NvZWZfY29udHJvbGxlcgotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykpOwotCi0KLS8qCi0gKiBDb21wcmVzc2lvbiBpbml0aWFsaXphdGlvbiBmb3Igd3JpdGluZyByYXctY29lZmZpY2llbnQgZGF0YS4KLSAqIEJlZm9yZSBjYWxsaW5nIHRoaXMsIGFsbCBwYXJhbWV0ZXJzIGFuZCBhIGRhdGEgZGVzdGluYXRpb24gbXVzdCBiZSBzZXQgdXAuCi0gKiBDYWxsIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgdG8gYWN0dWFsbHkgd3JpdGUgdGhlIGRhdGEuCi0gKgotICogVGhlIG51bWJlciBvZiBwYXNzZWQgdmlydHVhbCBhcnJheXMgbXVzdCBtYXRjaCBjaW5mby0+bnVtX2NvbXBvbmVudHMuCi0gKiBOb3RlIHRoYXQgdGhlIHZpcnR1YWwgYXJyYXlzIG5lZWQgbm90IGJlIGZpbGxlZCBvciBldmVuIHJlYWxpemVkIGF0Ci0gKiB0aGUgdGltZSB3cml0ZV9jb2VmZmljaWVudHMgaXMgY2FsbGVkOyBpbmRlZWQsIGlmIHRoZSB2aXJ0dWFsIGFycmF5cwotICogd2VyZSByZXF1ZXN0ZWQgZnJvbSB0aGlzIGNvbXByZXNzaW9uIG9iamVjdCdzIG1lbW9yeSBtYW5hZ2VyLCB0aGV5Ci0gKiB0eXBpY2FsbHkgd2lsbCBiZSByZWFsaXplZCBkdXJpbmcgdGhpcyByb3V0aW5lIGFuZCBmaWxsZWQgYWZ0ZXJ3YXJkcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfd3JpdGVfY29lZmZpY2llbnRzIChqX2NvbXByZXNzX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgLyogTWFyayBhbGwgdGFibGVzIHRvIGJlIHdyaXR0ZW4gKi8KLSAganBlZ19zdXBwcmVzc190YWJsZXMoY2luZm8sIEZBTFNFKTsKLSAgLyogKFJlKWluaXRpYWxpemUgZXJyb3IgbWdyIGFuZCBkZXN0aW5hdGlvbiBtb2R1bGVzICovCi0gICgqY2luZm8tPmVyci0+cmVzZXRfZXJyb3JfbWdyKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAoKmNpbmZvLT5kZXN0LT5pbml0X2Rlc3RpbmF0aW9uKSAoY2luZm8pOwotICAvKiBQZXJmb3JtIG1hc3RlciBzZWxlY3Rpb24gb2YgYWN0aXZlIG1vZHVsZXMgKi8KLSAgdHJhbnNlbmNvZGVfbWFzdGVyX3NlbGVjdGlvbihjaW5mbywgY29lZl9hcnJheXMpOwotICAvKiBXYWl0IGZvciBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIGNhbGwgKi8KLSAgY2luZm8tPm5leHRfc2NhbmxpbmUgPSAwOwkvKiBzbyBqcGVnX3dyaXRlX21hcmtlciB3b3JrcyAqLwotICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gQ1NUQVRFX1dSQ09FRlM7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGNvbXByZXNzaW9uIG9iamVjdCB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycywKLSAqIHRoZW4gY29weSBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0IGFsbCBwYXJhbWV0ZXJzIG5lZWRlZCBmb3IgbG9zc2xlc3MKLSAqIHRyYW5zY29kaW5nLiAgUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB2YXJpZWQgd2l0aG91dCBsb3NzIChzdWNoIGFzCi0gKiBzY2FuIHNjcmlwdCBhbmQgSHVmZm1hbiBvcHRpbWl6YXRpb24pIGFyZSBsZWZ0IGluIHRoZWlyIGRlZmF1bHQgc3RhdGVzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKLQkJCSAgICAgICBqX2NvbXByZXNzX3B0ciBkc3RpbmZvKQotewotICBKUVVBTlRfVEJMICoqIHF0YmxwdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmluY29tcCwgKm91dGNvbXA7Ci0gIEpRVUFOVF9UQkwgKmNfcXVhbnQsICpzbG90X3F1YW50OwotICBpbnQgdGJsbm8sIGNpLCBjb2VmaTsKLQotICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLwotICBpZiAoZHN0aW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKLSAgICBFUlJFWElUMShkc3RpbmZvLCBKRVJSX0JBRF9TVEFURSwgZHN0aW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgLyogQ29weSBmdW5kYW1lbnRhbCBpbWFnZSBkaW1lbnNpb25zICovCi0gIGRzdGluZm8tPmltYWdlX3dpZHRoID0gc3JjaW5mby0+aW1hZ2Vfd2lkdGg7Ci0gIGRzdGluZm8tPmltYWdlX2hlaWdodCA9IHNyY2luZm8tPmltYWdlX2hlaWdodDsKLSAgZHN0aW5mby0+aW5wdXRfY29tcG9uZW50cyA9IHNyY2luZm8tPm51bV9jb21wb25lbnRzOwotICBkc3RpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IHNyY2luZm8tPmpwZWdfY29sb3Jfc3BhY2U7Ci0gIC8qIEluaXRpYWxpemUgYWxsIHBhcmFtZXRlcnMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KLSAganBlZ19zZXRfZGVmYXVsdHMoZHN0aW5mbyk7Ci0gIC8qIGpwZWdfc2V0X2RlZmF1bHRzIG1heSBjaG9vc2Ugd3JvbmcgY29sb3JzcGFjZSwgZWcgWUNiQ3IgaWYgaW5wdXQgaXMgUkdCLgotICAgKiBGaXggaXQgdG8gZ2V0IHRoZSByaWdodCBoZWFkZXIgbWFya2VycyBmb3IgdGhlIGltYWdlIGNvbG9yc3BhY2UuCi0gICAqLwotICBqcGVnX3NldF9jb2xvcnNwYWNlKGRzdGluZm8sIHNyY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpOwotICBkc3RpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IHNyY2luZm8tPmRhdGFfcHJlY2lzaW9uOwotICBkc3RpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nID0gc3JjaW5mby0+Q0NJUjYwMV9zYW1wbGluZzsKLSAgLyogQ29weSB0aGUgc291cmNlJ3MgcXVhbnRpemF0aW9uIHRhYmxlcy4gKi8KLSAgZm9yICh0YmxubyA9IDA7IHRibG5vIDwgTlVNX1FVQU5UX1RCTFM7IHRibG5vKyspIHsKLSAgICBpZiAoc3JjaW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dICE9IE5VTEwpIHsKLSAgICAgIHF0YmxwdHIgPSAmIGRzdGluZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXTsKLSAgICAgIGlmICgqcXRibHB0ciA9PSBOVUxMKQotCSpxdGJscHRyID0ganBlZ19hbGxvY19xdWFudF90YWJsZSgoal9jb21tb25fcHRyKSBkc3RpbmZvKTsKLSAgICAgIE1FTUNPUFkoKCpxdGJscHRyKS0+cXVhbnR2YWwsCi0JICAgICAgc3JjaW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dLT5xdWFudHZhbCwKLQkgICAgICBTSVpFT0YoKCpxdGJscHRyKS0+cXVhbnR2YWwpKTsKLSAgICAgICgqcXRibHB0ciktPnNlbnRfdGFibGUgPSBGQUxTRTsKLSAgICB9Ci0gIH0KLSAgLyogQ29weSB0aGUgc291cmNlJ3MgcGVyLWNvbXBvbmVudCBpbmZvLgotICAgKiBOb3RlIHdlIGFzc3VtZSBqcGVnX3NldF9kZWZhdWx0cyBoYXMgYWxsb2NhdGVkIHRoZSBkZXN0IGNvbXBfaW5mbyBhcnJheS4KLSAgICovCi0gIGRzdGluZm8tPm51bV9jb21wb25lbnRzID0gc3JjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gIGlmIChkc3RpbmZvLT5udW1fY29tcG9uZW50cyA8IDEgfHwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUE9ORU5UUykKLSAgICBFUlJFWElUMihkc3RpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHMsCi0JICAgICBNQVhfQ09NUE9ORU5UUyk7Ci0gIGZvciAoY2kgPSAwLCBpbmNvbXAgPSBzcmNpbmZvLT5jb21wX2luZm8sIG91dGNvbXAgPSBkc3RpbmZvLT5jb21wX2luZm87Ci0gICAgICAgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKywgaW5jb21wKyssIG91dGNvbXArKykgewotICAgIG91dGNvbXAtPmNvbXBvbmVudF9pZCA9IGluY29tcC0+Y29tcG9uZW50X2lkOwotICAgIG91dGNvbXAtPmhfc2FtcF9mYWN0b3IgPSBpbmNvbXAtPmhfc2FtcF9mYWN0b3I7Ci0gICAgb3V0Y29tcC0+dl9zYW1wX2ZhY3RvciA9IGluY29tcC0+dl9zYW1wX2ZhY3RvcjsKLSAgICBvdXRjb21wLT5xdWFudF90Ymxfbm8gPSBpbmNvbXAtPnF1YW50X3RibF9ubzsKLSAgICAvKiBNYWtlIHN1cmUgc2F2ZWQgcXVhbnRpemF0aW9uIHRhYmxlIGZvciBjb21wb25lbnQgbWF0Y2hlcyB0aGUgcXRhYmxlCi0gICAgICogc2xvdC4gIElmIG5vdCwgdGhlIGlucHV0IGZpbGUgcmUtdXNlZCB0aGlzIHF0YWJsZSBzbG90LgotICAgICAqIElKRyBlbmNvZGVyIGN1cnJlbnRseSBjYW5ub3QgZHVwbGljYXRlIHRoaXMuCi0gICAgICovCi0gICAgdGJsbm8gPSBvdXRjb21wLT5xdWFudF90Ymxfbm87Ci0gICAgaWYgKHRibG5vIDwgMCB8fCB0YmxubyA+PSBOVU1fUVVBTlRfVEJMUyB8fAotCXNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXSA9PSBOVUxMKQotICAgICAgRVJSRVhJVDEoZHN0aW5mbywgSkVSUl9OT19RVUFOVF9UQUJMRSwgdGJsbm8pOwotICAgIHNsb3RfcXVhbnQgPSBzcmNpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub107Ci0gICAgY19xdWFudCA9IGluY29tcC0+cXVhbnRfdGFibGU7Ci0gICAgaWYgKGNfcXVhbnQgIT0gTlVMTCkgewotICAgICAgZm9yIChjb2VmaSA9IDA7IGNvZWZpIDwgRENUU0laRTI7IGNvZWZpKyspIHsKLQlpZiAoY19xdWFudC0+cXVhbnR2YWxbY29lZmldICE9IHNsb3RfcXVhbnQtPnF1YW50dmFsW2NvZWZpXSkKLQkgIEVSUkVYSVQxKGRzdGluZm8sIEpFUlJfTUlTTUFUQ0hFRF9RVUFOVF9UQUJMRSwgdGJsbm8pOwotICAgICAgfQotICAgIH0KLSAgICAvKiBOb3RlOiB3ZSBkbyBub3QgY29weSB0aGUgc291cmNlJ3MgSHVmZm1hbiB0YWJsZSBhc3NpZ25tZW50czsKLSAgICAgKiBpbnN0ZWFkIHdlIHJlbHkgb24ganBlZ19zZXRfY29sb3JzcGFjZSB0byBoYXZlIG1hZGUgYSBzdWl0YWJsZSBjaG9pY2UuCi0gICAgICovCi0gIH0KLSAgLyogQWxzbyBjb3B5IEpGSUYgdmVyc2lvbiBhbmQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiwgaWYgYXZhaWxhYmxlLgotICAgKiBTdHJpY3RseSBzcGVha2luZyB0aGlzIGlzbid0ICJjcml0aWNhbCIgaW5mbywgYnV0IGl0J3MgbmVhcmx5Ci0gICAqIGFsd2F5cyBhcHByb3ByaWF0ZSB0byBjb3B5IGl0IGlmIGF2YWlsYWJsZS4gIEluIHBhcnRpY3VsYXIsCi0gICAqIGlmIHRoZSBhcHBsaWNhdGlvbiBjaG9vc2VzIHRvIGNvcHkgSkZJRiAxLjAyIGV4dGVuc2lvbiBtYXJrZXJzIGZyb20KLSAgICogdGhlIHNvdXJjZSBmaWxlLCB3ZSBuZWVkIHRvIGNvcHkgdGhlIHZlcnNpb24gdG8gbWFrZSBzdXJlIHdlIGRvbid0Ci0gICAqIGVtaXQgYSBmaWxlIHRoYXQgaGFzIDEuMDIgZXh0ZW5zaW9ucyBidXQgYSBjbGFpbWVkIHZlcnNpb24gb2YgMS4wMS4KLSAgICogV2Ugd2lsbCAqbm90KiwgaG93ZXZlciwgY29weSB2ZXJzaW9uIGluZm8gZnJvbSBtaXNsYWJlbGVkICIyLjAxIiBmaWxlcy4KLSAgICovCi0gIGlmIChzcmNpbmZvLT5zYXdfSkZJRl9tYXJrZXIpIHsKLSAgICBpZiAoc3JjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID09IDEpIHsKLSAgICAgIGRzdGluZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9IHNyY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbjsKLSAgICAgIGRzdGluZm8tPkpGSUZfbWlub3JfdmVyc2lvbiA9IHNyY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbjsKLSAgICB9Ci0gICAgZHN0aW5mby0+ZGVuc2l0eV91bml0ID0gc3JjaW5mby0+ZGVuc2l0eV91bml0OwotICAgIGRzdGluZm8tPlhfZGVuc2l0eSA9IHNyY2luZm8tPlhfZGVuc2l0eTsKLSAgICBkc3RpbmZvLT5ZX2RlbnNpdHkgPSBzcmNpbmZvLT5ZX2RlbnNpdHk7Ci0gIH0KLX0KLQotCi0vKgotICogTWFzdGVyIHNlbGVjdGlvbiBvZiBjb21wcmVzc2lvbiBtb2R1bGVzIGZvciB0cmFuc2NvZGluZy4KLSAqIFRoaXMgc3Vic3RpdHV0ZXMgZm9yIGpjaW5pdC5jJ3MgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGZ1bGwgY29tcHJlc3Nvci4KLSAqLwotCi1MT0NBTCh2b2lkKQotdHJhbnNlbmNvZGVfbWFzdGVyX3NlbGVjdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgICBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpCi17Ci0gIC8qIEFsdGhvdWdoIHdlIGRvbid0IGFjdHVhbGx5IHVzZSBpbnB1dF9jb21wb25lbnRzIGZvciB0cmFuc2NvZGluZywKLSAgICogamNtYXN0ZXIuYydzIGluaXRpYWxfc2V0dXAgd2lsbCBjb21wbGFpbiBpZiBpbnB1dF9jb21wb25lbnRzIGlzIDAuCi0gICAqLwotICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDE7Ci0gIC8qIEluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wgKGluY2x1ZGVzIHBhcmFtZXRlciBjaGVja2luZy9wcm9jZXNzaW5nKSAqLwotICBqaW5pdF9jX21hc3Rlcl9jb250cm9sKGNpbmZvLCBUUlVFIC8qIHRyYW5zY29kZSBvbmx5ICovKTsKLQotICAvKiBFbnRyb3B5IGVuY29kaW5nOiBlaXRoZXIgSHVmZm1hbiBvciBhcml0aG1ldGljIGNvZGluZy4gKi8KLSAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9BUklUSF9OT1RJTVBMKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgICAgamluaXRfcGh1ZmZfZW5jb2RlcihjaW5mbyk7Ci0jZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmCi0gICAgfSBlbHNlCi0gICAgICBqaW5pdF9odWZmX2VuY29kZXIoY2luZm8pOwotICB9Ci0KLSAgLyogV2UgbmVlZCBhIHNwZWNpYWwgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIuICovCi0gIHRyYW5zZW5jb2RlX2NvZWZfY29udHJvbGxlcihjaW5mbywgY29lZl9hcnJheXMpOwotCi0gIGppbml0X21hcmtlcl93cml0ZXIoY2luZm8pOwotCi0gIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCi0gICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBXcml0ZSB0aGUgZGF0YXN0cmVhbSBoZWFkZXIgKFNPSSwgSkZJRikgaW1tZWRpYXRlbHkuCi0gICAqIEZyYW1lIGFuZCBzY2FuIGhlYWRlcnMgYXJlIHBvc3Rwb25lZCB0aWxsIGxhdGVyLgotICAgKiBUaGlzIGxldHMgYXBwbGljYXRpb24gaW5zZXJ0IHNwZWNpYWwgbWFya2VycyBhZnRlciB0aGUgU09JLgotICAgKi8KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9maWxlX2hlYWRlcikgKGNpbmZvKTsKLX0KLQotCi0vKgotICogVGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlzIGEgc3BlY2lhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29lZmZpY2llbnQKLSAqIGJ1ZmZlciBjb250cm9sbGVyLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGpjY29lZmN0LmMsIGJ1dCBpdCBoYW5kbGVzIG9ubHkKLSAqIG91dHB1dCBmcm9tIHByZXN1cHBsaWVkIHZpcnR1YWwgYXJyYXlzLiAgRnVydGhlcm1vcmUsIHdlIGdlbmVyYXRlIGFueQotICogZHVtbXkgcGFkZGluZyBibG9ja3Mgb24tdGhlLWZseSByYXRoZXIgdGhhbiBleHBlY3RpbmcgdGhlbSB0byBiZSBwcmVzZW50Ci0gKiBpbiB0aGUgYXJyYXlzLgotICovCi0KLS8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgSkRJTUVOU0lPTiBpTUNVX3Jvd19udW07CS8qIGlNQ1Ugcm93ICMgd2l0aGluIGltYWdlICovCi0gIEpESU1FTlNJT04gbWN1X2N0cjsJCS8qIGNvdW50cyBNQ1VzIHByb2Nlc3NlZCBpbiBjdXJyZW50IHJvdyAqLwotICBpbnQgTUNVX3ZlcnRfb2Zmc2V0OwkJLyogY291bnRzIE1DVSByb3dzIHdpdGhpbiBpTUNVIHJvdyAqLwotICBpbnQgTUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwkvKiBudW1iZXIgb2Ygc3VjaCByb3dzIG5lZWRlZCAqLwotCi0gIC8qIFZpcnR1YWwgYmxvY2sgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LiAqLwotICBqdmlydF9iYXJyYXlfcHRyICogd2hvbGVfaW1hZ2U7Ci0KLSAgLyogV29ya3NwYWNlIGZvciBjb25zdHJ1Y3RpbmcgZHVtbXkgYmxvY2tzIGF0IHJpZ2h0L2JvdHRvbSBlZGdlcy4gKi8KLSAgSkJMT0NLUk9XIGR1bW15X2J1ZmZlcltDX01BWF9CTE9DS1NfSU5fTUNVXTsKLX0gbXlfY29lZl9jb250cm9sbGVyOwotCi10eXBlZGVmIG15X2NvZWZfY29udHJvbGxlciAqIG15X2NvZWZfcHRyOwotCi0KLUxPQ0FMKHZvaWQpCi1zdGFydF9pTUNVX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8pCi0vKiBSZXNldCB3aXRoaW4taU1DVS1yb3cgY291bnRlcnMgZm9yIGEgbmV3IHJvdyAqLwotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLQotICAvKiBJbiBhbiBpbnRlcmxlYXZlZCBzY2FuLCBhbiBNQ1Ugcm93IGlzIHRoZSBzYW1lIGFzIGFuIGlNQ1Ugcm93LgotICAgKiBJbiBhIG5vbmludGVybGVhdmVkIHNjYW4sIGFuIGlNQ1Ugcm93IGhhcyB2X3NhbXBfZmFjdG9yIE1DVSByb3dzLgotICAgKiBCdXQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHByb2Nlc3Mgb25seSB3aGF0J3MgbGVmdC4KLSAgICovCi0gIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA+IDEpIHsKLSAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSAxOwotICB9IGVsc2UgewotICAgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPCAoY2luZm8tPnRvdGFsX2lNQ1Vfcm93cy0xKSkKLSAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT52X3NhbXBfZmFjdG9yOwotICAgIGVsc2UKLSAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT5sYXN0X3Jvd19oZWlnaHQ7Ci0gIH0KLQotICBjb2VmLT5tY3VfY3RyID0gMDsKLSAgY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0gMDsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2NvZWYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0KLSAgaWYgKHBhc3NfbW9kZSAhPSBKQlVGX0NSQU5LX0RFU1QpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotCi0gIGNvZWYtPmlNQ1Vfcm93X251bSA9IDA7Ci0gIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEuCi0gKiBXZSBwcm9jZXNzIHRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KQotICogcGVyIGNhbGwsIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBzY2FuLgotICogVGhlIGRhdGEgaXMgb2J0YWluZWQgZnJvbSB0aGUgdmlydHVhbCBhcnJheXMgYW5kIGZlZCB0byB0aGUgZW50cm9weSBjb2Rlci4KLSAqIFJldHVybnMgVFJVRSBpZiB0aGUgaU1DVSByb3cgaXMgY29tcGxldGVkLCBGQUxTRSBpZiBzdXNwZW5kZWQuCi0gKgotICogTkI6IGlucHV0X2J1ZiBpcyBpZ25vcmVkOyBpdCBpcyBsaWtlbHkgdG8gYmUgYSBOVUxMIHBvaW50ZXIuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1jb21wcmVzc19vdXRwdXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KLSAgSkRJTUVOU0lPTiBsYXN0X01DVV9jb2wgPSBjaW5mby0+TUNVc19wZXJfcm93IC0gMTsKLSAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7Ci0gIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQsIGJsb2NrY250OwotICBKRElNRU5TSU9OIHN0YXJ0X2NvbDsKLSAgSkJMT0NLQVJSQVkgYnVmZmVyW01BWF9DT01QU19JTl9TQ0FOXTsKLSAgSkJMT0NLUk9XIE1DVV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07Ci0gIEpCTE9DS1JPVyBidWZmZXJfcHRyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlcnMgZm9yIHRoZSBjb21wb25lbnRzIHVzZWQgaW4gdGhpcyBzY2FuLiAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgYnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdLAotICAgICAgIGNvZWYtPmlNQ1Vfcm93X251bSAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0gICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKLSAgfQotCi0gIC8qIExvb3AgdG8gcHJvY2VzcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KLSAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwotICAgICAgIHlvZmZzZXQrKykgewotICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5tY3VfY3RyOyBNQ1VfY29sX251bSA8IGNpbmZvLT5NQ1VzX3Blcl9yb3c7Ci0JIE1DVV9jb2xfbnVtKyspIHsKLSAgICAgIC8qIENvbnN0cnVjdCBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVCBibG9ja3MgYmVsb25naW5nIHRvIHRoaXMgTUNVICovCi0gICAgICBibGtuID0gMDsJCQkvKiBpbmRleCBvZiBjdXJyZW50IERDVCBibG9jayB3aXRoaW4gTUNVICovCi0gICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotCWNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0Jc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfd2lkdGg7Ci0JYmxvY2tjbnQgPSAoTUNVX2NvbF9udW0gPCBsYXN0X01DVV9jb2wpID8gY29tcHB0ci0+TUNVX3dpZHRoCi0JCQkJCQk6IGNvbXBwdHItPmxhc3RfY29sX3dpZHRoOwotCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKLQkgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPCBsYXN0X2lNQ1Vfcm93IHx8Ci0JICAgICAgeWluZGV4K3lvZmZzZXQgPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKLQkgICAgLyogRmlsbCBpbiBwb2ludGVycyB0byByZWFsIGJsb2NrcyBpbiB0aGlzIHJvdyAqLwotCSAgICBidWZmZXJfcHRyID0gYnVmZmVyW2NpXVt5aW5kZXgreW9mZnNldF0gKyBzdGFydF9jb2w7Ci0JICAgIGZvciAoeGluZGV4ID0gMDsgeGluZGV4IDwgYmxvY2tjbnQ7IHhpbmRleCsrKQotCSAgICAgIE1DVV9idWZmZXJbYmxrbisrXSA9IGJ1ZmZlcl9wdHIrKzsKLQkgIH0gZWxzZSB7Ci0JICAgIC8qIEF0IGJvdHRvbSBvZiBpbWFnZSwgbmVlZCBhIHdob2xlIHJvdyBvZiBkdW1teSBibG9ja3MgKi8KLQkgICAgeGluZGV4ID0gMDsKLQkgIH0KLQkgIC8qIEZpbGwgaW4gYW55IGR1bW15IGJsb2NrcyBuZWVkZWQgaW4gdGhpcyByb3cuCi0JICAgKiBEdW1teSBibG9ja3MgYXJlIGZpbGxlZCBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gamNjb2VmY3QuYzoKLQkgICAqIGFsbCB6ZXJvZXMgaW4gdGhlIEFDIGVudHJpZXMsIERDIGVudHJpZXMgZXF1YWwgdG8gcHJldmlvdXMKLQkgICAqIGJsb2NrJ3MgREMgdmFsdWUuICBUaGUgaW5pdCByb3V0aW5lIGhhcyBhbHJlYWR5IHplcm9lZCB0aGUKLQkgICAqIEFDIGVudHJpZXMsIHNvIHdlIG5lZWQgb25seSBzZXQgdGhlIERDIGVudHJpZXMgY29ycmVjdGx5LgotCSAgICovCi0JICBmb3IgKDsgeGluZGV4IDwgY29tcHB0ci0+TUNVX3dpZHRoOyB4aW5kZXgrKykgewotCSAgICBNQ1VfYnVmZmVyW2Jsa25dID0gY29lZi0+ZHVtbXlfYnVmZmVyW2Jsa25dOwotCSAgICBNQ1VfYnVmZmVyW2Jsa25dWzBdWzBdID0gTUNVX2J1ZmZlcltibGtuLTFdWzBdWzBdOwotCSAgICBibGtuKys7Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgLyogVHJ5IHRvIHdyaXRlIHRoZSBNQ1UuICovCi0gICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5lbmNvZGVfbWN1KSAoY2luZm8sIE1DVV9idWZmZXIpKSB7Ci0JLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLwotCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7Ci0JY29lZi0+bWN1X2N0ciA9IE1DVV9jb2xfbnVtOwotI2lmZGVmIE5FRURTX0FSTV9FUlJBVEFfNzU0MzE5Xzc1NDMyMAotICAgIGFzbSB2b2xhdGlsZSAoICJ2bW92IHMwLHMwXG4iICk7Ci0jZW5kaWYKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KLSAgICBjb2VmLT5tY3VfY3RyID0gMDsKLSAgfQotICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLwotICBjb2VmLT5pTUNVX3Jvd19udW0rKzsKLSAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotI2lmZGVmIE5FRURTX0FSTV9FUlJBVEFfNzU0MzE5Xzc1NDMyMAotICBhc20gdm9sYXRpbGUgKCAidm1vdiBzMCxzMFxuIiApOwotI2VuZGlmCi0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIuCi0gKgotICogRWFjaCBwYXNzZWQgY29lZmZpY2llbnQgYXJyYXkgbXVzdCBiZSB0aGUgcmlnaHQgc2l6ZSBmb3IgdGhhdAotICogY29lZmZpY2llbnQ6IHdpZHRoX2luX2Jsb2NrcyB3aWRlIGFuZCBoZWlnaHRfaW5fYmxvY2tzIGhpZ2gsCi0gKiB3aXRoIHVuaXRoZWlnaHQgYXQgbGVhc3Qgdl9zYW1wX2ZhY3Rvci4KLSAqLwotCi1MT0NBTCh2b2lkKQotdHJhbnNlbmNvZGVfY29lZl9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKQotewotICBteV9jb2VmX3B0ciBjb2VmOwotICBKQkxPQ0tST1cgYnVmZmVyOwotICBpbnQgaTsKLQotICBjb2VmID0gKG15X2NvZWZfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X2NvZWZfY29udHJvbGxlcikpOwotICBjaW5mby0+Y29lZiA9IChzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciAqKSBjb2VmOwotICBjb2VmLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfY29lZjsKLSAgY29lZi0+cHViLmNvbXByZXNzX2RhdGEgPSBjb21wcmVzc19vdXRwdXQ7Ci0KLSAgLyogU2F2ZSBwb2ludGVyIHRvIHZpcnR1YWwgYXJyYXlzICovCi0gIGNvZWYtPndob2xlX2ltYWdlID0gY29lZl9hcnJheXM7Ci0KLSAgLyogQWxsb2NhdGUgYW5kIHByZS16ZXJvIHNwYWNlIGZvciBkdW1teSBEQ1QgYmxvY2tzLiAqLwotICBidWZmZXIgPSAoSkJMT0NLUk9XKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJQ19NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKLSAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBidWZmZXIsIENfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBDX01BWF9CTE9DS1NfSU5fTUNVOyBpKyspIHsKLSAgICBjb2VmLT5kdW1teV9idWZmZXJbaV0gPSBidWZmZXIgKyBpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZGFwaW1pbi5jIGIvbGlianBlZ3R3cnAvamRhcGltaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5NjA3ZS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZGFwaW1pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qCi0gKiBqZGFwaW1pbi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIGNvZGUgZm9yIHRoZSBkZWNvbXByZXNzaW9uIGhhbGYKLSAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJtaW5pbXVtIiBBUEkgcm91dGluZXMgdGhhdCBtYXkgYmUKLSAqIG5lZWRlZCBpbiBlaXRoZXIgdGhlIG5vcm1hbCBmdWxsLWRlY29tcHJlc3Npb24gY2FzZSBvciB0aGUKLSAqIHRyYW5zY29kaW5nLW9ubHkgY2FzZS4KLSAqCi0gKiBNb3N0IG9mIHRoZSByb3V0aW5lcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24KLSAqIGFyZSBpbiB0aGlzIGZpbGUgb3IgaW4gamRhcGlzdGQuYy4gIEJ1dCBhbHNvIHNlZSBqY29tYXBpLmMgZm9yIHJvdXRpbmVzCi0gKiBzaGFyZWQgYnkgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24sIGFuZCBqZHRyYW5zLmMgZm9yIHRoZSB0cmFuc2NvZGluZwotICogY2FzZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyoKLSAqIEluaXRpYWxpemF0aW9uIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdC4KLSAqIFRoZSBlcnJvciBtYW5hZ2VyIG11c3QgYWxyZWFkeSBiZSBzZXQgdXAgKGluIGNhc2UgbWVtb3J5IG1hbmFnZXIgZmFpbHMpLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19DcmVhdGVEZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpCi17Ci0gIGludCBpOwotCi0gIC8qIEd1YXJkIGFnYWluc3QgdmVyc2lvbiBtaXNtYXRjaGVzIGJldHdlZW4gbGlicmFyeSBhbmQgY2FsbGVyLiAqLwotICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIHNvIGpwZWdfZGVzdHJveSBrbm93cyBtZW0gbWdyIG5vdCBjYWxsZWQgKi8KLSAgaWYgKHZlcnNpb24gIT0gSlBFR19MSUJfVkVSU0lPTikKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfTElCX1ZFUlNJT04sIEpQRUdfTElCX1ZFUlNJT04sIHZlcnNpb24pOwotICBpZiAoc3RydWN0c2l6ZSAhPSBTSVpFT0Yoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QpKQotICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0JBRF9TVFJVQ1RfU0laRSwgCi0JICAgICAoaW50KSBTSVpFT0Yoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QpLCAoaW50KSBzdHJ1Y3RzaXplKTsKLQotICAvKiBGb3IgZGVidWdnaW5nIHB1cnBvc2VzLCB3ZSB6ZXJvIHRoZSB3aG9sZSBtYXN0ZXIgc3RydWN0dXJlLgotICAgKiBCdXQgdGhlIGFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IHNldCB0aGUgZXJyIHBvaW50ZXIsIGFuZCBtYXkgaGF2ZSBzZXQKLSAgICogY2xpZW50X2RhdGEsIHNvIHdlIGhhdmUgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aG9zZSBmaWVsZHMuCi0gICAqIE5vdGU6IGlmIGFwcGxpY2F0aW9uIGhhc24ndCBzZXQgY2xpZW50X2RhdGEsIHRvb2xzIGxpa2UgUHVyaWZ5IG1heQotICAgKiBjb21wbGFpbiBoZXJlLgotICAgKi8KLSAgewotICAgIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVyciA9IGNpbmZvLT5lcnI7Ci0gICAgdm9pZCAqIGNsaWVudF9kYXRhID0gY2luZm8tPmNsaWVudF9kYXRhOyAvKiBpZ25vcmUgUHVyaWZ5IGNvbXBsYWludCBoZXJlICovCi0gICAgTUVNWkVSTyhjaW5mbywgU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSk7Ci0gICAgY2luZm8tPmVyciA9IGVycjsKLSAgICBjaW5mby0+Y2xpZW50X2RhdGEgPSBjbGllbnRfZGF0YTsKLSAgfQotICBjaW5mby0+aXNfZGVjb21wcmVzc29yID0gVFJVRTsKLSAgY2luZm8tPnRpbGVfZGVjb2RlID0gRkFMU0U7Ci0KLSAgLyogSW5pdGlhbGl6ZSBhIG1lbW9yeSBtYW5hZ2VyIGluc3RhbmNlIGZvciB0aGlzIG9iamVjdCAqLwotICBqaW5pdF9tZW1vcnlfbWdyKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBaZXJvIG91dCBwb2ludGVycyB0byBwZXJtYW5lbnQgc3RydWN0dXJlcy4gKi8KLSAgY2luZm8tPnByb2dyZXNzID0gTlVMTDsKLSAgY2luZm8tPnNyYyA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspCi0gICAgY2luZm8tPnF1YW50X3RibF9wdHJzW2ldID0gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gPSBOVUxMOwotICAgIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKLSAgfQotCi0gIC8qIEluaXRpYWxpemUgbWFya2VyIHByb2Nlc3NvciBzbyBhcHBsaWNhdGlvbiBjYW4gb3ZlcnJpZGUgbWV0aG9kcwotICAgKiBmb3IgQ09NLCBBUFBuIG1hcmtlcnMgYmVmb3JlIGNhbGxpbmcganBlZ19yZWFkX2hlYWRlci4KLSAgICovCi0gIGNpbmZvLT5tYXJrZXJfbGlzdCA9IE5VTEw7Ci0gIGppbml0X21hcmtlcl9yZWFkZXIoY2luZm8pOwotCi0gIC8qIEFuZCBpbml0aWFsaXplIHRoZSBvdmVyYWxsIGlucHV0IGNvbnRyb2xsZXIuICovCi0gIGppbml0X2lucHV0X2NvbnRyb2xsZXIoY2luZm8pOwotCi0gIC8qIE9LLCBJJ20gcmVhZHkgKi8KLSAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVEFSVDsKLX0KLQotCi0vKgotICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0Ci0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAganBlZ19kZXN0cm95KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCi19Ci0KLQotLyoKLSAqIEFib3J0IHByb2Nlc3Npbmcgb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uLAotICogYnV0IGRvbid0IGRlc3Ryb3kgdGhlIG9iamVjdCBpdHNlbGYuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2Fib3J0X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOyAvKiB1c2UgY29tbW9uIHJvdXRpbmUgKi8KLX0KLQotCi0vKgotICogU2V0IGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgotICovCi0KLUxPQ0FMKHZvaWQpCi1kZWZhdWx0X2RlY29tcHJlc3NfcGFybXMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIEd1ZXNzIHRoZSBpbnB1dCBjb2xvcnNwYWNlLCBhbmQgc2V0IG91dHB1dCBjb2xvcnNwYWNlIGFjY29yZGluZ2x5LiAqLwotICAvKiAoV2lzaCBKUEVHIGNvbW1pdHRlZSBoYWQgcHJvdmlkZWQgYSByZWFsIHdheSB0byBzcGVjaWZ5IHRoaXMuLi4pICovCi0gIC8qIE5vdGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIG91ciBndWVzc2VzLiAqLwotICBzd2l0Y2ggKGNpbmZvLT5udW1fY29tcG9uZW50cykgewotICBjYXNlIDE6Ci0gICAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOwotICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOwotICAgIGJyZWFrOwotICAgIAotICBjYXNlIDM6Ci0gICAgaWYgKGNpbmZvLT5zYXdfSkZJRl9tYXJrZXIpIHsKLSAgICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBKRklGIGltcGxpZXMgWUNiQ3IgKi8KLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyKSB7Ci0gICAgICBzd2l0Y2ggKGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pIHsKLSAgICAgIGNhc2UgMDoKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19SR0I7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0JY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCVdBUk5NUzEoY2luZm8sIEpXUk5fQURPQkVfWEZPUk0sIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pOwotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgaXQncyBZQ2JDciAqLwotCWJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBTYXcgbm8gc3BlY2lhbCBtYXJrZXJzLCB0cnkgdG8gZ3Vlc3MgZnJvbSB0aGUgY29tcG9uZW50IElEcyAqLwotICAgICAgaW50IGNpZDAgPSBjaW5mby0+Y29tcF9pbmZvWzBdLmNvbXBvbmVudF9pZDsKLSAgICAgIGludCBjaWQxID0gY2luZm8tPmNvbXBfaW5mb1sxXS5jb21wb25lbnRfaWQ7Ci0gICAgICBpbnQgY2lkMiA9IGNpbmZvLT5jb21wX2luZm9bMl0uY29tcG9uZW50X2lkOwotCi0gICAgICBpZiAoY2lkMCA9PSAxICYmIGNpZDEgPT0gMiAmJiBjaWQyID09IDMpCi0JY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7IC8qIGFzc3VtZSBKRklGIHcvb3V0IG1hcmtlciAqLwotICAgICAgZWxzZSBpZiAoY2lkMCA9PSA4MiAmJiBjaWQxID09IDcxICYmIGNpZDIgPT0gNjYpCi0JY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOyAvKiBBU0NJSSAnUicsICdHJywgJ0InICovCi0gICAgICBlbHNlIHsKLQlUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19VTktOT1dOX0lEUywgY2lkMCwgY2lkMSwgY2lkMik7Ci0JY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7IC8qIGFzc3VtZSBpdCdzIFlDYkNyICovCi0gICAgICB9Ci0gICAgfQotICAgIC8qIEFsd2F5cyBndWVzcyBSR0IgaXMgcHJvcGVyIG91dHB1dCBjb2xvcnNwYWNlLiAqLwotICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOwotICAgIGJyZWFrOwotICAgIAotICBjYXNlIDQ6Ci0gICAgaWYgKGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyKSB7Ci0gICAgICBzd2l0Y2ggKGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pIHsKLSAgICAgIGNhc2UgMDoKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19DTVlLOwotCWJyZWFrOwotICAgICAgY2FzZSAyOgotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDQ0s7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCVdBUk5NUzEoY2luZm8sIEpXUk5fQURPQkVfWEZPUk0sIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pOwotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDQ0s7IC8qIGFzc3VtZSBpdCdzIFlDQ0sgKi8KLQlicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogTm8gc3BlY2lhbCBtYXJrZXJzLCBhc3N1bWUgc3RyYWlnaHQgQ01ZSy4gKi8KLSAgICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX0NNWUs7Ci0gICAgfQotICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKLSAgICBicmVhazsKLSAgICAKLSAgZGVmYXVsdDoKLSAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19VTktOT1dOOwotICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIFNldCBkZWZhdWx0cyBmb3Igb3RoZXIgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAqLwotICBjaW5mby0+c2NhbGVfbnVtID0gMTsJCS8qIDE6MSBzY2FsaW5nICovCi0gIGNpbmZvLT5zY2FsZV9kZW5vbSA9IDE7Ci0gIGNpbmZvLT5vdXRwdXRfZ2FtbWEgPSAxLjA7Ci0gIGNpbmZvLT5idWZmZXJlZF9pbWFnZSA9IEZBTFNFOwotICBjaW5mby0+cmF3X2RhdGFfb3V0ID0gRkFMU0U7Ci0gIGNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9ERUZBVUxUOwotICBjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyA9IFRSVUU7Ci0gIGNpbmZvLT5kb19ibG9ja19zbW9vdGhpbmcgPSBUUlVFOwotICBjaW5mby0+cXVhbnRpemVfY29sb3JzID0gRkFMU0U7Ci0gIC8qIFdlIHNldCB0aGVzZSBpbiBjYXNlIGFwcGxpY2F0aW9uIG9ubHkgc2V0cyBxdWFudGl6ZV9jb2xvcnMuICovCi0gIGNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfRlM7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0gIGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSA9IFRSVUU7Ci0jZWxzZQotICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKLSNlbmRpZgotICBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID0gMjU2OwotICBjaW5mby0+Y29sb3JtYXAgPSBOVUxMOwotICAvKiBJbml0aWFsaXplIGZvciBubyBtb2RlIGNoYW5nZSBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLiAqLwotICBjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50ID0gRkFMU0U7Ci0gIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgPSBGQUxTRTsKLSAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOwotfQotCi0KLS8qCi0gKiBEZWNvbXByZXNzaW9uIHN0YXJ0dXA6IHJlYWQgc3RhcnQgb2YgSlBFRyBkYXRhc3RyZWFtIHRvIHNlZSB3aGF0J3MgdGhlcmUuCi0gKiBOZWVkIG9ubHkgaW5pdGlhbGl6ZSBKUEVHIG9iamVjdCBhbmQgc3VwcGx5IGEgZGF0YSBzb3VyY2UgYmVmb3JlIGNhbGxpbmcuCi0gKgotICogVGhpcyByb3V0aW5lIHdpbGwgcmVhZCBhcyBmYXIgYXMgdGhlIGZpcnN0IFNPUyBtYXJrZXIgKGllLCBhY3R1YWwgc3RhcnQgb2YKLSAqIGNvbXByZXNzZWQgZGF0YSksIGFuZCB3aWxsIHNhdmUgYWxsIHRhYmxlcyBhbmQgcGFyYW1ldGVycyBpbiB0aGUgSlBFRwotICogb2JqZWN0LiAgSXQgd2lsbCBhbHNvIGluaXRpYWxpemUgdGhlIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyB0byBkZWZhdWx0Ci0gKiB2YWx1ZXMsIGFuZCBmaW5hbGx5IHJldHVybiBKUEVHX0hFQURFUl9PSy4gIE9uIHJldHVybiwgdGhlIGFwcGxpY2F0aW9uIG1heQotICogYWRqdXN0IHRoZSBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHRoZW4gY2FsbCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MuCi0gKiAoT3IsIGlmIHRoZSBhcHBsaWNhdGlvbiBvbmx5IHdhbnRlZCB0byBkZXRlcm1pbmUgdGhlIGltYWdlIHBhcmFtZXRlcnMsCi0gKiB0aGUgZGF0YSBuZWVkIG5vdCBiZSBkZWNvbXByZXNzZWQuICBJbiB0aGF0IGNhc2UsIGNhbGwganBlZ19hYm9ydCBvcgotICoganBlZ19kZXN0cm95IHRvIHJlbGVhc2UgYW55IHRlbXBvcmFyeSBzcGFjZS4pCi0gKiBJZiBhbiBhYmJyZXZpYXRlZCAodGFibGVzIG9ubHkpIGRhdGFzdHJlYW0gaXMgcHJlc2VudGVkLCB0aGUgcm91dGluZSB3aWxsCi0gKiByZXR1cm4gSlBFR19IRUFERVJfVEFCTEVTX09OTFkgdXBvbiByZWFjaGluZyBFT0kuICBUaGUgYXBwbGljYXRpb24gbWF5IHRoZW4KLSAqIHJlLXVzZSB0aGUgSlBFRyBvYmplY3QgdG8gcmVhZCB0aGUgYWJicmV2aWF0ZWQgaW1hZ2UgZGF0YXN0cmVhbShzKS4KLSAqIEl0IGlzIHVubmVjZXNzYXJ5IChidXQgT0spIHRvIGNhbGwganBlZ19hYm9ydCBpbiB0aGlzIGNhc2UuCi0gKiBUaGUgSlBFR19TVVNQRU5ERUQgcmV0dXJuIGNvZGUgb25seSBvY2N1cnMgaWYgdGhlIGRhdGEgc291cmNlIG1vZHVsZQotICogcmVxdWVzdHMgc3VzcGVuc2lvbiBvZiB0aGUgZGVjb21wcmVzc29yLiAgSW4gdGhpcyBjYXNlIHRoZSBhcHBsaWNhdGlvbgotICogc2hvdWxkIGxvYWQgbW9yZSBzb3VyY2UgZGF0YSBhbmQgdGhlbiByZS1jYWxsIGpwZWdfcmVhZF9oZWFkZXIgdG8gcmVzdW1lCi0gKiBwcm9jZXNzaW5nLgotICogSWYgYSBub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkIGFuZCByZXF1aXJlX2ltYWdlIGlzIFRSVUUsIHRoZW4gdGhlCi0gKiByZXR1cm4gY29kZSBuZWVkIG5vdCBiZSBpbnNwZWN0ZWQgc2luY2Ugb25seSBKUEVHX0hFQURFUl9PSyBpcyBwb3NzaWJsZS4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgbm93IGp1c3QgYSBmcm9udCBlbmQgdG8ganBlZ19jb25zdW1lX2lucHV0LCB3aXRoIHNvbWUKLSAqIGV4dHJhIGVycm9yIGNoZWNraW5nLgotICovCi0KLUdMT0JBTChpbnQpCi1qcGVnX3JlYWRfaGVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIHJlcXVpcmVfaW1hZ2UpCi17Ci0gIGludCByZXRjb2RlOwotCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9TVEFSVCAmJgotICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfSU5IRUFERVIpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICByZXRjb2RlID0ganBlZ19jb25zdW1lX2lucHV0KGNpbmZvKTsKLQotICBzd2l0Y2ggKHJldGNvZGUpIHsKLSAgY2FzZSBKUEVHX1JFQUNIRURfU09TOgotICAgIHJldGNvZGUgPSBKUEVHX0hFQURFUl9PSzsKLSAgICBicmVhazsKLSAgY2FzZSBKUEVHX1JFQUNIRURfRU9JOgotICAgIGlmIChyZXF1aXJlX2ltYWdlKQkJLyogQ29tcGxhaW4gaWYgYXBwbGljYXRpb24gd2FudGVkIGFuIGltYWdlICovCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PX0lNQUdFKTsKLSAgICAvKiBSZXNldCB0byBzdGFydCBzdGF0ZTsgaXQgd291bGQgYmUgc2FmZXIgdG8gcmVxdWlyZSB0aGUgYXBwbGljYXRpb24gdG8KLSAgICAgKiBjYWxsIGpwZWdfYWJvcnQsIGJ1dCB3ZSBjYW4ndCBjaGFuZ2UgaXQgbm93IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCi0gICAgICogQSBzaWRlIGVmZmVjdCBpcyB0byBmcmVlIGFueSB0ZW1wb3JhcnkgbWVtb3J5ICh0aGVyZSBzaG91bGRuJ3QgYmUgYW55KS4KLSAgICAgKi8KLSAgICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogc2V0cyBzdGF0ZSA9IERTVEFURV9TVEFSVCAqLwotICAgIHJldGNvZGUgPSBKUEVHX0hFQURFUl9UQUJMRVNfT05MWTsKLSAgICBicmVhazsKLSAgY2FzZSBKUEVHX1NVU1BFTkRFRDoKLSAgICAvKiBubyB3b3JrICovCi0gICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gcmV0Y29kZTsKLX0KLQotCi0vKgotICogQ29uc3VtZSBkYXRhIGluIGFkdmFuY2Ugb2Ygd2hhdCB0aGUgZGVjb21wcmVzc29yIHJlcXVpcmVzLgotICogVGhpcyBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIG9uY2UgdGhlIGRlY29tcHJlc3NvciBvYmplY3QgaGFzCi0gKiBiZWVuIGNyZWF0ZWQgYW5kIGEgZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0IHVwLgotICoKLSAqIFRoaXMgcm91dGluZSBpcyBlc3NlbnRpYWxseSBhIHN0YXRlIG1hY2hpbmUgdGhhdCBoYW5kbGVzIGEgY291cGxlCi0gKiBvZiBjcml0aWNhbCBzdGF0ZS10cmFuc2l0aW9uIGFjdGlvbnMsIG5hbWVseSBpbml0aWFsIHNldHVwIGFuZAotICogdHJhbnNpdGlvbiBmcm9tIGhlYWRlciBzY2FubmluZyB0byByZWFkeS1mb3Itc3RhcnRfZGVjb21wcmVzcy4KLSAqIEFsbCB0aGUgYWN0dWFsIGlucHV0IGlzIGRvbmUgdmlhIHRoZSBpbnB1dCBjb250cm9sbGVyJ3MgY29uc3VtZV9pbnB1dAotICogbWV0aG9kLgotICovCi0KLUdMT0JBTChpbnQpCi1qcGVnX2NvbnN1bWVfaW5wdXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGludCByZXRjb2RlID0gSlBFR19TVVNQRU5ERUQ7Ci0KLSAgLyogTkI6IGV2ZXJ5IHBvc3NpYmxlIERTVEFURSB2YWx1ZSBzaG91bGQgYmUgbGlzdGVkIGluIHRoaXMgc3dpdGNoICovCi0gIHN3aXRjaCAoY2luZm8tPmdsb2JhbF9zdGF0ZSkgewotICBjYXNlIERTVEFURV9TVEFSVDoKLSAgICAvKiBTdGFydC1vZi1kYXRhc3RyZWFtIGFjdGlvbnM6IHJlc2V0IGFwcHJvcHJpYXRlIG1vZHVsZXMgKi8KLSAgICAoKmNpbmZvLT5pbnB1dGN0bC0+cmVzZXRfaW5wdXRfY29udHJvbGxlcikgKGNpbmZvKTsKLSAgICAvKiBJbml0aWFsaXplIGFwcGxpY2F0aW9uJ3MgZGF0YSBzb3VyY2UgbW9kdWxlICovCi0gICAgKCpjaW5mby0+c3JjLT5pbml0X3NvdXJjZSkgKGNpbmZvKTsKLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX0lOSEVBREVSOwotICAgIC8qRkFMTFRIUk9VR0gqLwotICBjYXNlIERTVEFURV9JTkhFQURFUjoKLSAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpIChjaW5mbyk7Ci0gICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykgeyAvKiBGb3VuZCBTT1MsIHByZXBhcmUgdG8gZGVjb21wcmVzcyAqLwotICAgICAgLyogU2V0IHVwIGRlZmF1bHQgcGFyYW1ldGVycyBiYXNlZCBvbiBoZWFkZXIgZGF0YSAqLwotICAgICAgZGVmYXVsdF9kZWNvbXByZXNzX3Bhcm1zKGNpbmZvKTsKLSAgICAgIC8qIFNldCBnbG9iYWwgc3RhdGU6IHJlYWR5IGZvciBzdGFydF9kZWNvbXByZXNzICovCi0gICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1JFQURZOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBEU1RBVEVfUkVBRFk6Ci0gICAgLyogQ2FuJ3QgYWR2YW5jZSBwYXN0IGZpcnN0IFNPUyB1bnRpbCBzdGFydF9kZWNvbXByZXNzIGlzIGNhbGxlZCAqLwotICAgIHJldGNvZGUgPSBKUEVHX1JFQUNIRURfU09TOwotICAgIGJyZWFrOwotICBjYXNlIERTVEFURV9QUkVMT0FEOgotICBjYXNlIERTVEFURV9QUkVTQ0FOOgotICBjYXNlIERTVEFURV9TQ0FOTklORzoKLSAgY2FzZSBEU1RBVEVfUkFXX09LOgotICBjYXNlIERTVEFURV9CVUZJTUFHRToKLSAgY2FzZSBEU1RBVEVfQlVGUE9TVDoKLSAgY2FzZSBEU1RBVEVfU1RPUFBJTkc6Ci0gICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIH0KLSAgcmV0dXJuIHJldGNvZGU7Ci19Ci0KLQotLyoKLSAqIEhhdmUgd2UgZmluaXNoZWQgcmVhZGluZyB0aGUgaW5wdXQgZmlsZT8KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfaW5wdXRfY29tcGxldGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIENoZWNrIGZvciB2YWxpZCBqcGVnIG9iamVjdCAqLwotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA8IERTVEFURV9TVEFSVCB8fAotICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA+IERTVEFURV9TVE9QUElORykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICByZXR1cm4gY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZDsKLX0KLQotCi0vKgotICogSXMgdGhlcmUgbW9yZSB0aGFuIG9uZSBzY2FuPwotICovCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19oYXNfbXVsdGlwbGVfc2NhbnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIE9ubHkgdmFsaWQgYWZ0ZXIganBlZ19yZWFkX2hlYWRlciBjb21wbGV0ZXMgKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPCBEU1RBVEVfUkVBRFkgfHwKLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPiBEU1RBVEVfU1RPUFBJTkcpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgcmV0dXJuIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggSlBFRyBkZWNvbXByZXNzaW9uLgotICoKLSAqIFRoaXMgd2lsbCBub3JtYWxseSBqdXN0IHZlcmlmeSB0aGUgZmlsZSB0cmFpbGVyIGFuZCByZWxlYXNlIHRlbXAgc3RvcmFnZS4KLSAqCi0gKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgotICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCi0gKi8KLQotR0xPQkFMKGJvb2xlYW4pCi1qcGVnX2ZpbmlzaF9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpZiAoKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1NDQU5OSU5HIHx8Ci0gICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkFXX09LKSAmJiAhIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgewotICAgIC8qIFRlcm1pbmF0ZSBmaW5hbCBwYXNzIG9mIG5vbi1idWZmZXJlZCBtb2RlICovCi0jaWZkZWYgQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQotICAgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLSNlbmRpZgotICAgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lIDwgY2luZm8tPm91dHB1dF9oZWlnaHQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RPT19MSVRUTEVfREFUQSk7Ci0gICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfb3V0cHV0X3Bhc3MpIChjaW5mbyk7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVE9QUElORzsKLSAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9CVUZJTUFHRSkgewotICAgIC8qIEZpbmlzaGluZyBhZnRlciBhIGJ1ZmZlcmVkLWltYWdlIG9wZXJhdGlvbiAqLwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RPUFBJTkc7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU1RPUFBJTkcpIHsKLSAgICAvKiBTVE9QUElORyA9IHJlcGVhdCBjYWxsIGFmdGVyIGEgc3VzcGVuc2lvbiwgYW55dGhpbmcgZWxzZSBpcyBlcnJvciAqLwotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIH0KLSAgLyogUmVhZCB1bnRpbCBFT0kgKi8KLSNpZm5kZWYgQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQotICB3aGlsZSAoISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKSB7Ci0gICAgaWYgKCgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQotICAgICAgcmV0dXJuIEZBTFNFOwkJLyogU3VzcGVuZCwgY29tZSBiYWNrIGxhdGVyICovCi0gIH0KLSNlbmRpZgotICAvKiBEbyBmaW5hbCBjbGVhbnVwICovCi0gICgqY2luZm8tPnNyYy0+dGVybV9zb3VyY2UpIChjaW5mbyk7Ci0gIC8qIFdlIGNhbiB1c2UganBlZ19hYm9ydCB0byByZWxlYXNlIG1lbW9yeSBhbmQgcmVzZXQgZ2xvYmFsX3N0YXRlICovCi0gIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkYXBpc3RkLmMgYi9saWJqcGVndHdycC9qZGFwaXN0ZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTIzM2RmLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pkYXBpc3RkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoKLSAqIGpkYXBpc3RkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGRlY29tcHJlc3Npb24gaGFsZgotICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgInN0YW5kYXJkIiBBUEkgcm91dGluZXMgdGhhdCBhcmUKLSAqIHVzZWQgaW4gdGhlIG5vcm1hbCBmdWxsLWRlY29tcHJlc3Npb24gY2FzZS4gIFRoZXkgYXJlIG5vdCB1c2VkIGJ5IGEKLSAqIHRyYW5zY29kaW5nLW9ubHkgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgaWYgYW4gYXBwbGljYXRpb24gbGlua3MgaW4KLSAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcywgaXQgd2lsbCBlbmQgdXAgbGlua2luZyBpbiB0aGUgZW50aXJlIGRlY29tcHJlc3Nvci4KLSAqIFdlIHRodXMgbXVzdCBzZXBhcmF0ZSB0aGlzIGZpbGUgZnJvbSBqZGFwaW1pbi5jIHRvIGF2b2lkIGxpbmtpbmcgdGhlCi0gKiB3aG9sZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgaW50byBhIHRyYW5zY29kZXIuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1MT0NBTChib29sZWFuKSBvdXRwdXRfcGFzc19zZXR1cCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotCi0vKgotICogRGVjb21wcmVzc2lvbiBpbml0aWFsaXphdGlvbi4KLSAqIGpwZWdfcmVhZF9oZWFkZXIgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KLSAqCi0gKiBJZiBhIG11bHRpcGFzcyBvcGVyYXRpbmcgbW9kZSB3YXMgc2VsZWN0ZWQsIHRoaXMgd2lsbCBkbyBhbGwgYnV0IHRoZQotICogbGFzdCBwYXNzLCBhbmQgdGh1cyBtYXkgdGFrZSBhIGdyZWF0IGRlYWwgb2YgdGltZS4KLSAqCi0gKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgotICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCi0gKi8KLQotR0xPQkFMKGJvb2xlYW4pCi1qcGVnX3N0YXJ0X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgewotICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wsIHNlbGVjdCBhY3RpdmUgbW9kdWxlcyAqLwotICAgIGppbml0X21hc3Rlcl9kZWNvbXByZXNzKGNpbmZvKTsKLSAgICBpZiAoY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7Ci0gICAgICAvKiBObyBtb3JlIHdvcmsgaGVyZTsgZXhwZWN0aW5nIGpwZWdfc3RhcnRfb3V0cHV0IG5leHQgKi8KLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7Ci0gICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVMT0FEOwotICB9Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9QUkVMT0FEKSB7Ci0gICAgLyogSWYgZmlsZSBoYXMgbXVsdGlwbGUgc2NhbnMsIGFic29yYiB0aGVtIGFsbCBpbnRvIHRoZSBjb2VmIGJ1ZmZlciAqLwotICAgIGlmIChjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgewotI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICAgICAgZm9yICg7OykgewotCWludCByZXRjb2RlOwotCS8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KLQlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCi0JICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQkvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCi0JcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOwotCWlmIChyZXRjb2RlID09IEpQRUdfU1VTUEVOREVEKQotCSAgcmV0dXJuIEZBTFNFOwotCWlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCi0JICBicmVhazsKLQkvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KLQlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYKLQkgICAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKLQkgIGlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgewotCSAgICAvKiBqZG1hc3RlciB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KLQkgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ICs9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOwotCSAgfQotCX0KLSAgICAgIH0KLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCi0gICAgfQotICAgIGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgZmluYWwgcGFzcyAqLwotICByZXR1cm4gb3V0cHV0X3Bhc3Nfc2V0dXAoY2luZm8pOwotfQotCi0vKgotICogVGlsZSBkZWNvbXByZXNzaW9uIGluaXRpYWxpemF0aW9uLgotICoganBlZ19yZWFkX2hlYWRlciBtdXN0IGJlIGNvbXBsZXRlZCBiZWZvcmUgY2FsbGluZyB0aGlzLgotICovCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19zdGFydF90aWxlX2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgewotICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wsIHNlbGVjdCBhY3RpdmUgbW9kdWxlcyAqLwotICAgIGNpbmZvLT50aWxlX2RlY29kZSA9IFRSVUU7Ci0gICAgamluaXRfbWFzdGVyX2RlY29tcHJlc3MoY2luZm8pOwotICAgIGlmIChjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7Ci0gICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVMT0FEOwotICB9Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9QUkVMT0FEKSB7Ci0gICAgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKLSAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9QUkVTQ0FOKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIC8qIFBlcmZvcm0gYW55IGR1bW15IG91dHB1dCBwYXNzZXMsIGFuZCBzZXQgdXAgZm9yIHRoZSBmaW5hbCBwYXNzICovCi0gIHJldHVybiBvdXRwdXRfcGFzc19zZXR1cChjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIFNldCB1cCBmb3IgYW4gb3V0cHV0IHBhc3MsIGFuZCBwZXJmb3JtIGFueSBkdW1teSBwYXNzKGVzKSBuZWVkZWQuCi0gKiBDb21tb24gc3Vicm91dGluZSBmb3IganBlZ19zdGFydF9kZWNvbXByZXNzIGFuZCBqcGVnX3N0YXJ0X291dHB1dC4KLSAqIEVudHJ5OiBnbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFU0NBTiBvbmx5IGlmIHByZXZpb3VzbHkgc3VzcGVuZGVkLgotICogRXhpdDogSWYgZG9uZSwgcmV0dXJucyBUUlVFIGFuZCBzZXRzIGdsb2JhbF9zdGF0ZSBmb3IgcHJvcGVyIG91dHB1dCBtb2RlLgotICogICAgICAgSWYgc3VzcGVuZGVkLCByZXR1cm5zIEZBTFNFIGFuZCBzZXRzIGdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVTQ0FOLgotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1vdXRwdXRfcGFzc19zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1BSRVNDQU4pIHsKLSAgICAvKiBGaXJzdCBjYWxsOiBkbyBwYXNzIHNldHVwICovCi0gICAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcykgKGNpbmZvKTsKLSAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lID0gMDsKLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1BSRVNDQU47Ci0gIH0KLSAgLyogTG9vcCBvdmVyIGFueSByZXF1aXJlZCBkdW1teSBwYXNzZXMgKi8KLSAgd2hpbGUgKGNpbmZvLT5tYXN0ZXItPmlzX2R1bW15X3Bhc3MpIHsKLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLSAgICAvKiBDcmFuayB0aHJvdWdoIHRoZSBkdW1teSBwYXNzICovCi0gICAgd2hpbGUgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby0+b3V0cHV0X2hlaWdodCkgewotICAgICAgSkRJTUVOU0lPTiBsYXN0X3NjYW5saW5lOwotICAgICAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLwotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0JY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm91dHB1dF9zY2FubGluZTsKLQljaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQ7Ci0JKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICB9Ci0gICAgICAvKiBQcm9jZXNzIHNvbWUgZGF0YSAqLwotICAgICAgbGFzdF9zY2FubGluZSA9IGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7Ci0gICAgICAoKmNpbmZvLT5tYWluLT5wcm9jZXNzX2RhdGEpIChjaW5mbywgKEpTQU1QQVJSQVkpIE5VTEwsCi0JCQkJICAgICZjaW5mby0+b3V0cHV0X3NjYW5saW5lLCAoSkRJTUVOU0lPTikgMCk7Ci0gICAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA9PSBsYXN0X3NjYW5saW5lKQotCXJldHVybiBGQUxTRTsJCS8qIE5vIHByb2dyZXNzIG1hZGUsIG11c3Qgc3VzcGVuZCAqLwotICAgIH0KLSAgICAvKiBGaW5pc2ggdXAgZHVtbXkgcGFzcywgYW5kIHNldCB1cCBmb3IgYW5vdGhlciBvbmUgKi8KLSAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9vdXRwdXRfcGFzcykgKGNpbmZvKTsKLSAgICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX291dHB1dF9wYXNzKSAoY2luZm8pOwotICAgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPSAwOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCi0gIH0KLSAgLyogUmVhZHkgZm9yIGFwcGxpY2F0aW9uIHRvIGRyaXZlIG91dHB1dCBwYXNzIHRocm91Z2gKLSAgICoganBlZ19yZWFkX3NjYW5saW5lcyBvciBqcGVnX3JlYWRfcmF3X2RhdGEuCi0gICAqLwotICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gY2luZm8tPnJhd19kYXRhX291dCA/IERTVEFURV9SQVdfT0sgOiBEU1RBVEVfU0NBTk5JTkc7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBSZWFkIHNvbWUgc2NhbmxpbmVzIG9mIGRhdGEgZnJvbSB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBudW1iZXIgb2YgbGluZXMgYWN0dWFsbHkgcmVhZC4KLSAqIFRoaXMgbWF5IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIHJlcXVlc3RlZCBpbiBzZXZlcmFsIGNhc2VzLAotICogaW5jbHVkaW5nIGJvdHRvbSBvZiBpbWFnZSwgZGF0YSBzb3VyY2Ugc3VzcGVuc2lvbiwgYW5kIG9wZXJhdGluZwotICogbW9kZXMgdGhhdCBlbWl0IG11bHRpcGxlIHNjYW5saW5lcyBhdCBhIHRpbWUuCi0gKgotICogTm90ZTogd2Ugd2FybiBhYm91dCBleGNlc3MgY2FsbHMgdG8ganBlZ19yZWFkX3NjYW5saW5lcygpIHNpbmNlCi0gKiB0aGlzIGxpa2VseSBzaWduYWxzIGFuIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgZXJyb3IuICBIb3dldmVyLAotICogYW4gb3ZlcnNpemUgYnVmZmVyIChtYXhfbGluZXMgPiBzY2FubGluZXMgcmVtYWluaW5nKSBpcyBub3QgYW4gZXJyb3IuCi0gKi8KLQotR0xPQkFMKEpESU1FTlNJT04pCi1qcGVnX3JlYWRfc2NhbmxpbmVzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIHNjYW5saW5lcywKLQkJICAgICBKRElNRU5TSU9OIG1heF9saW5lcykKLXsKLSAgSkRJTUVOU0lPTiByb3dfY3RyOwotCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9TQ0FOTklORykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA+PSBjaW5mby0+b3V0cHV0X2hlaWdodCkgewotICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm91dHB1dF9zY2FubGluZTsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQ7Ci0gICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gIH0KLQotICAvKiBQcm9jZXNzIHNvbWUgZGF0YSAqLwotICByb3dfY3RyID0gMDsKLSAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIHNjYW5saW5lcywgJnJvd19jdHIsIG1heF9saW5lcyk7Ci0gIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgKz0gcm93X2N0cjsKLSAgcmV0dXJuIHJvd19jdHI7Ci19Ci0vKgotICogSW5pdGlhbGl6ZSB0aGUganBlZyBkZWNvZGVyIHRvIGRlY29tcHJlc3NpbmcgYSByZWN0YW5nbGUgd2l0aCBzaXplIG9mICh3aWR0aCwgaGVpZ2h0KQotICogYW5kIGl0cyB1cHBlci1sZWZ0IGNvcm5lciBsb2NhdGVkIGF0IChzdGFydF94LCBzdGFydF95KS4KLSAqIEFsaWduIHN0YXJ0X3ggYW5kIHN0YXJ0X3kgdG8gbXVsdGlwbGllcyBvZiBpTUNVIHdpZHRoIGFuZCBoZWlnaHQsIHJlc3BlY3RpdmVseS4KLSAqIEFsc28sIHRoZSBuZXcgcmVhZGVyIHBvc2l0aW9uIGFuZCBzYW1wbGVkIGltYWdlIHNpemUgd2lsbCBiZSByZXR1cm5lZCBpbgotICogKHN0YXJ0X3gsIHN0YXJ0X3kpIGFuZCAod2lkdGgsIGhlaWdodCksIHJlc3BlY3RpdmVseS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfaW5pdF9yZWFkX3RpbGVfc2NhbmxpbmUoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9pbmRleCAqaW5kZXgsCi0JCSAgICAgaW50ICpzdGFydF94LCBpbnQgKnN0YXJ0X3ksIGludCAqd2lkdGgsIGludCAqaGVpZ2h0KQotewotICAvLyBDYWxjdWxhdGVzIHRoZSBib3VuZGFyeSBvZiBpTUNVCi0gIGludCBsaW5lc19wZXJfaU1DVV9yb3cgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOwotICBpbnQgbGluZXNfcGVyX2lNQ1VfY29sID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRTsKLSAgaW50IHJvd19vZmZzZXQgPSAqc3RhcnRfeSAvIGxpbmVzX3Blcl9pTUNVX3JvdzsKLSAgaW50IGNvbF9sZWZ0X2JvdW5kYXJ5ID0gKCgqc3RhcnRfeCAvIGxpbmVzX3Blcl9pTUNVX2NvbCkKLSAgICAgICAgICAgIC8gaW5kZXgtPk1DVV9zYW1wbGVfc2l6ZSkgKiBpbmRleC0+TUNVX3NhbXBsZV9zaXplOwotICBpbnQgY29sX3JpZ2h0X2JvdW5kYXJ5ID0KLSAgICAgICAgICAgICAgICAgIGpkaXZfcm91bmRfdXAoKnN0YXJ0X3ggKyAqd2lkdGgsIGxpbmVzX3Blcl9pTUNVX2NvbCk7Ci0KLSAgY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5zX3RvX3NraXAgPQotICAgICAgKnN0YXJ0X3ggLyBsaW5lc19wZXJfaU1DVV9jb2wgLSBjb2xfbGVmdF9ib3VuZGFyeTsKLQotICAqaGVpZ2h0ID0gKCpzdGFydF95IC0gcm93X29mZnNldCAqIGxpbmVzX3Blcl9pTUNVX3JvdykgKyAqaGVpZ2h0OwotICAqc3RhcnRfeCA9IGNvbF9sZWZ0X2JvdW5kYXJ5ICogbGluZXNfcGVyX2lNQ1VfY29sOwotICAqc3RhcnRfeSA9IHJvd19vZmZzZXQgKiBsaW5lc19wZXJfaU1DVV9yb3c7Ci0gIGNpbmZvLT5pbWFnZV93aWR0aCA9IGptaW4oY2luZm8tPm9yaWdpbmFsX2ltYWdlX3dpZHRoLAotICAgICAgICAgIGNvbF9yaWdodF9ib3VuZGFyeSAqIGxpbmVzX3Blcl9pTUNVX2NvbCkgLQotICAgICAgICAgIGNvbF9sZWZ0X2JvdW5kYXJ5ICogbGluZXNfcGVyX2lNQ1VfY29sOwotICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgPSByb3dfb2Zmc2V0OwotICBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ID0gcm93X29mZnNldDsKLQotICAvLyBVcGRhdGVzIEpQRUcgZGVjb2RlciBwYXJhbWV0ZXIKLSAgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIoY2luZm8pOwotICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOwotICBqaW5pdF91cHNhbXBsZXIoY2luZm8pOwotICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX291dHB1dF9wYXNzKSAoY2luZm8pOwotICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCi0gICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvKTsKLSAgZWxzZQotICAgIGpwZWdfZGVjb21wcmVzc19wZXJfc2Nhbl9zZXR1cChjaW5mbyk7Ci0KLSAgaW50IHNhbXBsZV9zaXplID0gRENUU0laRSAvIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotCi0gICpoZWlnaHQgPSBqZGl2X3JvdW5kX3VwKCpoZWlnaHQsIHNhbXBsZV9zaXplKTsKLSAgKndpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgY2luZm8tPm91dHB1dF9zY2FubGluZSA9IGxpbmVzX3Blcl9pTUNVX3JvdyAqIHJvd19vZmZzZXQgLyBzYW1wbGVfc2l6ZTsKLSAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0ID0gY2luZm8tPmNvZWYtPmNvbnN1bWVfZGF0YTsKLSAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXggPQotICAgICAgY2luZm8tPmNvZWYtPmNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4OwotICBjaW5mby0+ZW50cm9weS0+aW5kZXggPSBpbmRleDsKLSAgY2luZm8tPmlucHV0X2lNQ1Vfcm93ID0gcm93X29mZnNldDsKLSAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyA9IHJvd19vZmZzZXQ7Ci0gIGNpbmZvLT5jb2VmLT5NQ1VfY29sdW1uX2xlZnRfYm91bmRhcnkgPSBjb2xfbGVmdF9ib3VuZGFyeTsKLSAgY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5fcmlnaHRfYm91bmRhcnkgPSBjb2xfcmlnaHRfYm91bmRhcnk7Ci0gIGNpbmZvLT5jb2VmLT5jb2x1bW5fbGVmdF9ib3VuZGFyeSA9Ci0gICAgICBjb2xfbGVmdF9ib3VuZGFyeSAvIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemU7Ci0gIGNpbmZvLT5jb2VmLT5jb2x1bW5fcmlnaHRfYm91bmRhcnkgPQotICAgICAgamRpdl9yb3VuZF91cChjb2xfcmlnaHRfYm91bmRhcnksIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemUpOwotfQotCi0vKgotICogUmVhZCBhIHNjYW5saW5lIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gKgotICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgYWN0dWFsbHkgcmVhZC4KLSAqLwotCi1HTE9CQUwoSkRJTUVOU0lPTikKLWpwZWdfcmVhZF90aWxlX3NjYW5saW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX2luZGV4ICppbmRleCwKLSAgICAgICAgSlNBTVBBUlJBWSBzY2FubGluZXMpCi17Ci0gIC8vIENhbGN1bGF0ZXMgdGhlIGJvdW5kYXJ5IG9mIGlNQ1UKLSAgaW50IGxpbmVzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkU7Ci0gIGludCBsaW5lc19wZXJfaU1DVV9jb2wgPSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOwotICBpbnQgc2FtcGxlX3NpemUgPSBEQ1RTSVpFIC8gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gIEpESU1FTlNJT04gcm93X2N0ciA9IDA7Ci0KLSAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0gICAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIHNjYW5saW5lcywgJnJvd19jdHIsIDEpOwotICB9IGVsc2UgewotICAgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lICUgKGxpbmVzX3Blcl9pTUNVX3JvdyAvIHNhbXBsZV9zaXplKSA9PSAwKSB7Ci0gICAgICAvLyBTZXQgdGhlIHJlYWQgaGVhZCB0byB0aGUgbmV4dCBpTUNVIHJvdwotICAgICAgaW50IGlNQ1Vfcm93X29mZnNldCA9IGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgLwotICAgICAgICAgICAgKGxpbmVzX3Blcl9pTUNVX3JvdyAvIHNhbXBsZV9zaXplKTsKLSAgICAgIGludCBvZmZzZXRfZGF0YV9jb2xfcG9zaXRpb24gPSBjaW5mby0+Y29lZi0+TUNVX2NvbHVtbl9sZWZ0X2JvdW5kYXJ5IC8KLSAgICAgICAgICAgIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemU7Ci0gICAgICBodWZmbWFuX29mZnNldF9kYXRhIG9mZnNldF9kYXRhID0KLSAgICAgICAgICBpbmRleC0+c2NhblswXS5vZmZzZXRbaU1DVV9yb3dfb2Zmc2V0XVtvZmZzZXRfZGF0YV9jb2xfcG9zaXRpb25dOwotICAgICAgKCpjaW5mby0+ZW50cm9weS0+Y29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcikgKGNpbmZvLCBvZmZzZXRfZGF0YSk7Ci0gICAgfQotICAgICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCAxKTsKLSAgfQotCi0gIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgKz0gcm93X2N0cjsKLSAgcmV0dXJuIHJvd19jdHI7Ci19Ci0KLS8qCi0gKiBBbHRlcm5hdGUgZW50cnkgcG9pbnQgdG8gcmVhZCByYXcgZGF0YS4KLSAqIFByb2Nlc3NlcyBleGFjdGx5IG9uZSBpTUNVIHJvdyBwZXIgY2FsbCwgdW5sZXNzIHN1c3BlbmRlZC4KLSAqLwotCi1HTE9CQUwoSkRJTUVOU0lPTikKLWpwZWdfcmVhZF9yYXdfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBkYXRhLAotCQkgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpCi17Ci0gIEpESU1FTlNJT04gbGluZXNfcGVyX2lNQ1Vfcm93OwotCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9SQVdfT0spCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPj0gY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKLSAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OwotICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICB9Ci0KLSAgLyogVmVyaWZ5IHRoYXQgYXQgbGVhc3Qgb25lIGlNQ1Ugcm93IGNhbiBiZSByZXR1cm5lZC4gKi8KLSAgbGluZXNfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gIGlmIChtYXhfbGluZXMgPCBsaW5lc19wZXJfaU1DVV9yb3cpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CVUZGRVJfU0laRSk7Ci0KLSAgLyogRGVjb21wcmVzcyBkaXJlY3RseSBpbnRvIHVzZXIncyBidWZmZXIuICovCi0gIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLCBkYXRhKSkKLSAgICByZXR1cm4gMDsJCQkvKiBzdXNwZW5zaW9uIGZvcmNlZCwgY2FuIGRvIG5vdGhpbmcgbW9yZSAqLwotCi0gIC8qIE9LLCB3ZSBwcm9jZXNzZWQgb25lIGlNQ1Ugcm93LiAqLwotICBjaW5mby0+b3V0cHV0X3NjYW5saW5lICs9IGxpbmVzX3Blcl9pTUNVX3JvdzsKLSAgcmV0dXJuIGxpbmVzX3Blcl9pTUNVX3JvdzsKLX0KLQotCi0vKiBBZGRpdGlvbmFsIGVudHJ5IHBvaW50cyBmb3IgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KLQotI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYW4gb3V0cHV0IHBhc3MgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfc3RhcnRfb3V0cHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgc2Nhbl9udW1iZXIpCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZJTUFHRSAmJgotICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICAvKiBMaW1pdCBzY2FuIG51bWJlciB0byB2YWxpZCByYW5nZSAqLwotICBpZiAoc2Nhbl9udW1iZXIgPD0gMCkKLSAgICBzY2FuX251bWJlciA9IDE7Ci0gIGlmIChjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkICYmCi0gICAgICBzY2FuX251bWJlciA+IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcikKLSAgICBzY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKLSAgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IHNjYW5fbnVtYmVyOwotICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgcmVhbCBwYXNzICovCi0gIHJldHVybiBvdXRwdXRfcGFzc19zZXR1cChjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhZnRlciBhbiBvdXRwdXQgcGFzcyBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLgotICoKLSAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuZGVkLiAgVGhlIHJldHVybiB2YWx1ZSBuZWVkIGJlIGluc3BlY3RlZCBvbmx5IGlmCi0gKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfZmluaXNoX291dHB1dCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TQ0FOTklORyB8fAotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JBV19PSykgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7Ci0gICAgLyogVGVybWluYXRlIHRoaXMgcGFzcy4gKi8KLSAgICAvKiBXZSBkbyBub3QgcmVxdWlyZSB0aGUgd2hvbGUgcGFzcyB0byBoYXZlIGJlZW4gY29tcGxldGVkLiAqLwotICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX291dHB1dF9wYXNzKSAoY2luZm8pOwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGUE9TVDsKLSAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZQT1NUKSB7Ci0gICAgLyogQlVGUE9TVCA9IHJlcGVhdCBjYWxsIGFmdGVyIGEgc3VzcGVuc2lvbiwgYW55dGhpbmcgZWxzZSBpcyBlcnJvciAqLwotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIH0KLSAgLyogUmVhZCBtYXJrZXJzIGxvb2tpbmcgZm9yIFNPUyBvciBFT0kgKi8KLSAgd2hpbGUgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA8PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyICYmCi0JICEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgewotICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKLSAgICAgIHJldHVybiBGQUxTRTsJCS8qIFN1c3BlbmQsIGNvbWUgYmFjayBsYXRlciAqLwotICB9Ci0gIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7Ci0gIHJldHVybiBUUlVFOwotfQotCi0jZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZGF0YWRzdC5jIGIvbGlianBlZ3R3cnAvamRhdGFkc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmNmZiMC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZGF0YWRzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiBqZGF0YWRzdC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgY29tcHJlc3Npb24gZGF0YSBkZXN0aW5hdGlvbiByb3V0aW5lcyBmb3IgdGhlIGNhc2Ugb2YKLSAqIGVtaXR0aW5nIEpQRUcgZGF0YSB0byBhIGZpbGUgKG9yIGFueSBzdGRpbyBzdHJlYW0pLiAgV2hpbGUgdGhlc2Ugcm91dGluZXMKLSAqIGFyZSBzdWZmaWNpZW50IGZvciBtb3N0IGFwcGxpY2F0aW9ucywgc29tZSB3aWxsIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50Ci0gKiBkZXN0aW5hdGlvbiBtYW5hZ2VyLgotICogSU1QT1JUQU5UOiB3ZSBhc3N1bWUgdGhhdCBmd3JpdGUoKSB3aWxsIGNvcnJlY3RseSB0cmFuc2NyaWJlIGFuIGFycmF5IG9mCi0gKiBKT0NURVRzIGludG8gOC1iaXQtd2lkZSBlbGVtZW50cyBvbiBleHRlcm5hbCBzdG9yYWdlLiAgSWYgY2hhciBpcyB3aWRlcgotICogdGhhbiA4IGJpdHMgb24geW91ciBtYWNoaW5lLCB5b3UgbWF5IG5lZWQgdG8gZG8gc29tZSB0d2Vha2luZy4KLSAqLwotCi0vKiB0aGlzIGlzIG5vdCBhIGNvcmUgbGlicmFyeSBtb2R1bGUsIHNvIGl0IGRvZXNuJ3QgZGVmaW5lIEpQRUdfSU5URVJOQUxTICovCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamVycm9yLmgiCi0KLQotLyogRXhwYW5kZWQgZGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIHN0ZGlvIG91dHB1dCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBGSUxFICogb3V0ZmlsZTsJCS8qIHRhcmdldCBzdHJlYW0gKi8KLSAgSk9DVEVUICogYnVmZmVyOwkJLyogc3RhcnQgb2YgYnVmZmVyICovCi19IG15X2Rlc3RpbmF0aW9uX21ncjsKLQotdHlwZWRlZiBteV9kZXN0aW5hdGlvbl9tZ3IgKiBteV9kZXN0X3B0cjsKLQotI2RlZmluZSBPVVRQVVRfQlVGX1NJWkUgIDQwOTYJLyogY2hvb3NlIGFuIGVmZmljaWVudGx5IGZ3cml0ZSdhYmxlIHNpemUgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBkZXN0aW5hdGlvbiAtLS0gY2FsbGVkIGJ5IGpwZWdfc3RhcnRfY29tcHJlc3MKLSAqIGJlZm9yZSBhbnkgZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaW5pdF9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2Rlc3RfcHRyIGRlc3QgPSAobXlfZGVzdF9wdHIpIGNpbmZvLT5kZXN0OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBvdXRwdXQgYnVmZmVyIC0tLSBpdCB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gZG9uZSB3aXRoIGltYWdlICovCi0gIGRlc3QtPmJ1ZmZlciA9IChKT0NURVQgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBPVVRQVVRfQlVGX1NJWkUgKiBTSVpFT0YoSk9DVEVUKSk7Ci0KLSAgZGVzdC0+cHViLm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0LT5idWZmZXI7Ci0gIGRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlciA9IE9VVFBVVF9CVUZfU0laRTsKLX0KLQotCi0vKgotICogRW1wdHkgdGhlIG91dHB1dCBidWZmZXIgLS0tIGNhbGxlZCB3aGVuZXZlciBidWZmZXIgZmlsbHMgdXAuCi0gKgotICogSW4gdHlwaWNhbCBhcHBsaWNhdGlvbnMsIHRoaXMgc2hvdWxkIHdyaXRlIHRoZSBlbnRpcmUgb3V0cHV0IGJ1ZmZlcgotICogKGlnbm9yaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIG5leHRfb3V0cHV0X2J5dGUgJiBmcmVlX2luX2J1ZmZlciksCi0gKiByZXNldCB0aGUgcG9pbnRlciAmIGNvdW50IHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLCBhbmQgcmV0dXJuIFRSVUUKLSAqIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuIGR1bXBlZC4KLSAqCi0gKiBJbiBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFibGUgdG8gc3VzcGVuZCBjb21wcmVzc2lvbiBkdWUgdG8gb3V0cHV0Ci0gKiBvdmVycnVuLCBhIEZBTFNFIHJldHVybiBpbmRpY2F0ZXMgdGhhdCB0aGUgYnVmZmVyIGNhbm5vdCBiZSBlbXB0aWVkIG5vdy4KLSAqIEluIHRoaXMgc2l0dWF0aW9uLCB0aGUgY29tcHJlc3NvciB3aWxsIHJldHVybiB0byBpdHMgY2FsbGVyIChwb3NzaWJseSB3aXRoCi0gKiBhbiBpbmRpY2F0aW9uIHRoYXQgaXQgaGFzIG5vdCBhY2NlcHRlZCBhbGwgdGhlIHN1cHBsaWVkIHNjYW5saW5lcykuICBUaGUKLSAqIGFwcGxpY2F0aW9uIHNob3VsZCByZXN1bWUgY29tcHJlc3Npb24gYWZ0ZXIgaXQgaGFzIG1hZGUgbW9yZSByb29tIGluIHRoZQotICogb3V0cHV0IGJ1ZmZlci4gIE5vdGUgdGhhdCB0aGVyZSBhcmUgc3Vic3RhbnRpYWwgcmVzdHJpY3Rpb25zIG9uIHRoZSB1c2Ugb2YKLSAqIHN1c3BlbnNpb24gLS0tIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KLSAqCi0gKiBXaGVuIHN1c3BlbmRpbmcsIHRoZSBjb21wcmVzc29yIHdpbGwgYmFjayB1cCB0byBhIGNvbnZlbmllbnQgcmVzdGFydCBwb2ludAotICogKHR5cGljYWxseSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgTUNVKS4gbmV4dF9vdXRwdXRfYnl0ZSAmIGZyZWVfaW5fYnVmZmVyCi0gKiBpbmRpY2F0ZSB3aGVyZSB0aGUgcmVzdGFydCBwb2ludCB3aWxsIGJlIGlmIHRoZSBjdXJyZW50IGNhbGwgcmV0dXJucyBGQUxTRS4KLSAqIERhdGEgYmV5b25kIHRoaXMgcG9pbnQgd2lsbCBiZSByZWdlbmVyYXRlZCBhZnRlciByZXN1bXB0aW9uLCBzbyBkbyBub3QKLSAqIHdyaXRlIGl0IG91dCB3aGVuIGVtcHR5aW5nIHRoZSBidWZmZXIgZXh0ZXJuYWxseS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVtcHR5X291dHB1dF9idWZmZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9kZXN0X3B0ciBkZXN0ID0gKG15X2Rlc3RfcHRyKSBjaW5mby0+ZGVzdDsKLQotICBpZiAoSkZXUklURShkZXN0LT5vdXRmaWxlLCBkZXN0LT5idWZmZXIsIE9VVFBVVF9CVUZfU0laRSkgIT0KLSAgICAgIChzaXplX3QpIE9VVFBVVF9CVUZfU0laRSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotCi0gIGRlc3QtPnB1Yi5uZXh0X291dHB1dF9ieXRlID0gZGVzdC0+YnVmZmVyOwotICBkZXN0LT5wdWIuZnJlZV9pbl9idWZmZXIgPSBPVVRQVVRfQlVGX1NJWkU7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIFRlcm1pbmF0ZSBkZXN0aW5hdGlvbiAtLS0gY2FsbGVkIGJ5IGpwZWdfZmluaXNoX2NvbXByZXNzCi0gKiBhZnRlciBhbGwgZGF0YSBoYXMgYmVlbiB3cml0dGVuLiAgVXN1YWxseSBuZWVkcyB0byBmbHVzaCBidWZmZXIuCi0gKgotICogTkI6ICpub3QqIGNhbGxlZCBieSBqcGVnX2Fib3J0IG9yIGpwZWdfZGVzdHJveTsgc3Vycm91bmRpbmcKLSAqIGFwcGxpY2F0aW9uIG11c3QgZGVhbCB3aXRoIGFueSBjbGVhbnVwIHRoYXQgc2hvdWxkIGhhcHBlbiBldmVuCi0gKiBmb3IgZXJyb3IgZXhpdC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXRlcm1fZGVzdGluYXRpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9kZXN0X3B0ciBkZXN0ID0gKG15X2Rlc3RfcHRyKSBjaW5mby0+ZGVzdDsKLSAgc2l6ZV90IGRhdGFjb3VudCA9IE9VVFBVVF9CVUZfU0laRSAtIGRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBXcml0ZSBhbnkgZGF0YSByZW1haW5pbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBpZiAoZGF0YWNvdW50ID4gMCkgewotICAgIGlmIChKRldSSVRFKGRlc3QtPm91dGZpbGUsIGRlc3QtPmJ1ZmZlciwgZGF0YWNvdW50KSAhPSBkYXRhY291bnQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotICB9Ci0gIGZmbHVzaChkZXN0LT5vdXRmaWxlKTsKLSAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBvdXRwdXQgZmlsZSBPSyAqLwotICBpZiAoZmVycm9yKGRlc3QtPm91dGZpbGUpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci19Ci0KLQotLyoKLSAqIFByZXBhcmUgZm9yIG91dHB1dCB0byBhIHN0ZGlvIHN0cmVhbS4KLSAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGFscmVhZHkgb3BlbmVkIHRoZSBzdHJlYW0sIGFuZCBpcyByZXNwb25zaWJsZQotICogZm9yIGNsb3NpbmcgaXQgYWZ0ZXIgZmluaXNoaW5nIGNvbXByZXNzaW9uLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19zdGRpb19kZXN0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIG91dGZpbGUpCi17Ci0gIG15X2Rlc3RfcHRyIGRlc3Q7Ci0KLSAgLyogVGhlIGRlc3RpbmF0aW9uIG9iamVjdCBpcyBtYWRlIHBlcm1hbmVudCBzbyB0aGF0IG11bHRpcGxlIEpQRUcgaW1hZ2VzCi0gICAqIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBzYW1lIGZpbGUgd2l0aG91dCByZS1leGVjdXRpbmcganBlZ19zdGRpb19kZXN0LgotICAgKiBUaGlzIG1ha2VzIGl0IGRhbmdlcm91cyB0byB1c2UgdGhpcyBtYW5hZ2VyIGFuZCBhIGRpZmZlcmVudCBkZXN0aW5hdGlvbgotICAgKiBtYW5hZ2VyIHNlcmlhbGx5IHdpdGggdGhlIHNhbWUgSlBFRyBvYmplY3QsIGJlY2F1c2UgdGhlaXIgcHJpdmF0ZSBvYmplY3QKLSAgICogc2l6ZXMgbWF5IGJlIGRpZmZlcmVudC4gIENhdmVhdCBwcm9ncmFtbWVyLgotICAgKi8KLSAgaWYgKGNpbmZvLT5kZXN0ID09IE5VTEwpIHsJLyogZmlyc3QgdGltZSBmb3IgdGhpcyBKUEVHIG9iamVjdD8gKi8KLSAgICBjaW5mby0+ZGVzdCA9IChzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAotCQkJCSAgU0laRU9GKG15X2Rlc3RpbmF0aW9uX21ncikpOwotICB9Ci0KLSAgZGVzdCA9IChteV9kZXN0X3B0cikgY2luZm8tPmRlc3Q7Ci0gIGRlc3QtPnB1Yi5pbml0X2Rlc3RpbmF0aW9uID0gaW5pdF9kZXN0aW5hdGlvbjsKLSAgZGVzdC0+cHViLmVtcHR5X291dHB1dF9idWZmZXIgPSBlbXB0eV9vdXRwdXRfYnVmZmVyOwotICBkZXN0LT5wdWIudGVybV9kZXN0aW5hdGlvbiA9IHRlcm1fZGVzdGluYXRpb247Ci0gIGRlc3QtPm91dGZpbGUgPSBvdXRmaWxlOwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRhdGFzcmMuYyBiL2xpYmpwZWd0d3JwL2pkYXRhc3JjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzc1MmIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRhdGFzcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKgotICogamRhdGFzcmMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlY29tcHJlc3Npb24gZGF0YSBzb3VyY2Ugcm91dGluZXMgZm9yIHRoZSBjYXNlIG9mCi0gKiByZWFkaW5nIEpQRUcgZGF0YSBmcm9tIGEgZmlsZSAob3IgYW55IHN0ZGlvIHN0cmVhbSkuICBXaGlsZSB0aGVzZSByb3V0aW5lcwotICogYXJlIHN1ZmZpY2llbnQgZm9yIG1vc3QgYXBwbGljYXRpb25zLCBzb21lIHdpbGwgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQKLSAqIHNvdXJjZSBtYW5hZ2VyLgotICogSU1QT1JUQU5UOiB3ZSBhc3N1bWUgdGhhdCBmcmVhZCgpIHdpbGwgY29ycmVjdGx5IHRyYW5zY3JpYmUgYW4gYXJyYXkgb2YKLSAqIEpPQ1RFVHMgZnJvbSA4LWJpdC13aWRlIGVsZW1lbnRzIG9uIGV4dGVybmFsIHN0b3JhZ2UuICBJZiBjaGFyIGlzIHdpZGVyCi0gKiB0aGFuIDggYml0cyBvbiB5b3VyIG1hY2hpbmUsIHlvdSBtYXkgbmVlZCB0byBkbyBzb21lIHR3ZWFraW5nLgotICovCi0KLS8qIHRoaXMgaXMgbm90IGEgY29yZSBsaWJyYXJ5IG1vZHVsZSwgc28gaXQgZG9lc24ndCBkZWZpbmUgSlBFR19JTlRFUk5BTFMgKi8KLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZXJyb3IuaCIKLQotCi0vKiBFeHBhbmRlZCBkYXRhIHNvdXJjZSBvYmplY3QgZm9yIHN0ZGlvIGlucHV0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfc291cmNlX21nciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBGSUxFICogaW5maWxlOwkJLyogc291cmNlIHN0cmVhbSAqLwotICBKT0NURVQgKiBidWZmZXI7CQkvKiBzdGFydCBvZiBidWZmZXIgKi8KLSAgYm9vbGVhbiBzdGFydF9vZl9maWxlOwkvKiBoYXZlIHdlIGdvdHRlbiBhbnkgZGF0YSB5ZXQ/ICovCi19IG15X3NvdXJjZV9tZ3I7Ci0KLXR5cGVkZWYgbXlfc291cmNlX21nciAqIG15X3NyY19wdHI7Ci0KLSNkZWZpbmUgSU5QVVRfQlVGX1NJWkUgIDQwOTYJLyogY2hvb3NlIGFuIGVmZmljaWVudGx5IGZyZWFkJ2FibGUgc2l6ZSAqLwotCi0KLS8qCi0gKiBJbml0aWFsaXplIHNvdXJjZSAtLS0gY2FsbGVkIGJ5IGpwZWdfcmVhZF9oZWFkZXIKLSAqIGJlZm9yZSBhbnkgZGF0YSBpcyBhY3R1YWxseSByZWFkLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaW5pdF9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X3NyY19wdHIgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7Ci0KLSAgLyogV2UgcmVzZXQgdGhlIGVtcHR5LWlucHV0LWZpbGUgZmxhZyBmb3IgZWFjaCBpbWFnZSwKLSAgICogYnV0IHdlIGRvbid0IGNsZWFyIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqIFRoaXMgaXMgY29ycmVjdCBiZWhhdmlvciBmb3IgcmVhZGluZyBhIHNlcmllcyBvZiBpbWFnZXMgZnJvbSBvbmUgc291cmNlLgotICAgKi8KLSAgc3JjLT5zdGFydF9vZl9maWxlID0gVFJVRTsKLX0KLQotCi0vKgotICogRmlsbCB0aGUgaW5wdXQgYnVmZmVyIC0tLSBjYWxsZWQgd2hlbmV2ZXIgYnVmZmVyIGlzIGVtcHRpZWQuCi0gKgotICogSW4gdHlwaWNhbCBhcHBsaWNhdGlvbnMsIHRoaXMgc2hvdWxkIHJlYWQgZnJlc2ggZGF0YSBpbnRvIHRoZSBidWZmZXIKLSAqIChpZ25vcmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiBuZXh0X2lucHV0X2J5dGUgJiBieXRlc19pbl9idWZmZXIpLAotICogcmVzZXQgdGhlIHBvaW50ZXIgJiBjb3VudCB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciwgYW5kIHJldHVybiBUUlVFCi0gKiBpbmRpY2F0aW5nIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiByZWxvYWRlZC4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8KLSAqIGZpbGwgdGhlIGJ1ZmZlciBlbnRpcmVseSwgb25seSB0byBvYnRhaW4gYXQgbGVhc3Qgb25lIG1vcmUgYnl0ZS4KLSAqCi0gKiBUaGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGFuIEVPRiByZXR1cm4uICBJZiB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuCi0gKiByZWFjaGVkLCB0aGUgcm91dGluZSBoYXMgYSBjaG9pY2Ugb2YgRVJSRVhJVCgpIG9yIGluc2VydGluZyBmYWtlIGRhdGEgaW50bwotICogdGhlIGJ1ZmZlci4gIEluIG1vc3QgY2FzZXMsIGdlbmVyYXRpbmcgYSB3YXJuaW5nIG1lc3NhZ2UgYW5kIGluc2VydGluZyBhCi0gKiBmYWtlIEVPSSBtYXJrZXIgaXMgdGhlIGJlc3QgY291cnNlIG9mIGFjdGlvbiAtLS0gdGhpcyB3aWxsIGFsbG93IHRoZQotICogZGVjb21wcmVzc29yIHRvIG91dHB1dCBob3dldmVyIG11Y2ggb2YgdGhlIGltYWdlIGlzIHRoZXJlLiAgSG93ZXZlciwKLSAqIHRoZSByZXN1bHRpbmcgZXJyb3IgbWVzc2FnZSBpcyBtaXNsZWFkaW5nIGlmIHRoZSByZWFsIHByb2JsZW0gaXMgYW4gZW1wdHkKLSAqIGlucHV0IGZpbGUsIHNvIHdlIGhhbmRsZSB0aGF0IGNhc2Ugc3BlY2lhbGx5LgotICoKLSAqIEluIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gYmUgYWJsZSB0byBzdXNwZW5kIGNvbXByZXNzaW9uIGR1ZSB0byBpbnB1dAotICogbm90IGJlaW5nIGF2YWlsYWJsZSB5ZXQsIGEgRkFMU0UgcmV0dXJuIGluZGljYXRlcyB0aGF0IG5vIG1vcmUgZGF0YSBjYW4gYmUKLSAqIG9idGFpbmVkIHJpZ2h0IG5vdywgYnV0IG1vcmUgbWF5IGJlIGZvcnRoY29taW5nIGxhdGVyLiAgSW4gdGhpcyBzaXR1YXRpb24sCi0gKiB0aGUgZGVjb21wcmVzc29yIHdpbGwgcmV0dXJuIHRvIGl0cyBjYWxsZXIgKHdpdGggYW4gaW5kaWNhdGlvbiBvZiB0aGUKLSAqIG51bWJlciBvZiBzY2FubGluZXMgaXQgaGFzIHJlYWQsIGlmIGFueSkuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHJlc3VtZQotICogZGVjb21wcmVzc2lvbiBhZnRlciBpdCBoYXMgbG9hZGVkIG1vcmUgZGF0YSBpbnRvIHRoZSBpbnB1dCBidWZmZXIuICBOb3RlCi0gKiB0aGF0IHRoZXJlIGFyZSBzdWJzdGFudGlhbCByZXN0cmljdGlvbnMgb24gdGhlIHVzZSBvZiBzdXNwZW5zaW9uIC0tLSBzZWUKLSAqIHRoZSBkb2N1bWVudGF0aW9uLgotICoKLSAqIFdoZW4gc3VzcGVuZGluZywgdGhlIGRlY29tcHJlc3NvciB3aWxsIGJhY2sgdXAgdG8gYSBjb252ZW5pZW50IHJlc3RhcnQgcG9pbnQKLSAqICh0eXBpY2FsbHkgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVSkuIG5leHRfaW5wdXRfYnl0ZSAmIGJ5dGVzX2luX2J1ZmZlcgotICogaW5kaWNhdGUgd2hlcmUgdGhlIHJlc3RhcnQgcG9pbnQgd2lsbCBiZSBpZiB0aGUgY3VycmVudCBjYWxsIHJldHVybnMgRkFMU0UuCi0gKiBEYXRhIGJleW9uZCB0aGlzIHBvaW50IG11c3QgYmUgcmVzY2FubmVkIGFmdGVyIHJlc3VtcHRpb24sIHNvIG1vdmUgaXQgdG8KLSAqIHRoZSBmcm9udCBvZiB0aGUgYnVmZmVyIHJhdGhlciB0aGFuIGRpc2NhcmRpbmcgaXQuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1maWxsX2lucHV0X2J1ZmZlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfc3JjX3B0ciBzcmMgPSAobXlfc3JjX3B0cikgY2luZm8tPnNyYzsKLSAgc2l6ZV90IG5ieXRlczsKLQotICBuYnl0ZXMgPSBKRlJFQUQoc3JjLT5pbmZpbGUsIHNyYy0+YnVmZmVyLCBJTlBVVF9CVUZfU0laRSk7Ci0KLSAgaWYgKG5ieXRlcyA8PSAwKSB7Ci0gICAgaWYgKHNyYy0+c3RhcnRfb2ZfZmlsZSkJLyogVHJlYXQgZW1wdHkgaW5wdXQgZmlsZSBhcyBmYXRhbCBlcnJvciAqLwotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FTVBUWSk7Ci0gICAgV0FSTk1TKGNpbmZvLCBKV1JOX0pQRUdfRU9GKTsKLSAgICAvKiBJbnNlcnQgYSBmYWtlIEVPSSBtYXJrZXIgKi8KLSAgICBzcmMtPmJ1ZmZlclswXSA9IChKT0NURVQpIDB4RkY7Ci0gICAgc3JjLT5idWZmZXJbMV0gPSAoSk9DVEVUKSBKUEVHX0VPSTsKLSAgICBuYnl0ZXMgPSAyOwotICB9Ci0KLSAgc3JjLT5wdWIubmV4dF9pbnB1dF9ieXRlID0gc3JjLT5idWZmZXI7Ci0gIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciA9IG5ieXRlczsKLSAgc3JjLT5zdGFydF9vZl9maWxlID0gRkFMU0U7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIFNraXAgZGF0YSAtLS0gdXNlZCB0byBza2lwIG92ZXIgYSBwb3RlbnRpYWxseSBsYXJnZSBhbW91bnQgb2YKLSAqIHVuaW50ZXJlc3RpbmcgZGF0YSAoc3VjaCBhcyBhbiBBUFBuIG1hcmtlcikuCi0gKgotICogV3JpdGVycyBvZiBzdXNwZW5kYWJsZS1pbnB1dCBhcHBsaWNhdGlvbnMgbXVzdCBub3RlIHRoYXQgc2tpcF9pbnB1dF9kYXRhCi0gKiBpcyBub3QgZ3JhbnRlZCB0aGUgcmlnaHQgdG8gZ2l2ZSBhIHN1c3BlbnNpb24gcmV0dXJuLiAgSWYgdGhlIHNraXAgZXh0ZW5kcwotICogYmV5b25kIHRoZSBkYXRhIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLCB0aGUgYnVmZmVyIGNhbiBiZSBtYXJrZWQgZW1wdHkgc28KLSAqIHRoYXQgdGhlIG5leHQgcmVhZCB3aWxsIGNhdXNlIGEgZmlsbF9pbnB1dF9idWZmZXIgY2FsbCB0aGF0IGNhbiBzdXNwZW5kLgotICogQXJyYW5naW5nIGZvciBhZGRpdGlvbmFsIGJ5dGVzIHRvIGJlIGRpc2NhcmRlZCBiZWZvcmUgcmVsb2FkaW5nIHRoZSBpbnB1dAotICogYnVmZmVyIGlzIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIncyBwcm9ibGVtLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc2tpcF9pbnB1dF9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykKLXsKLSAgbXlfc3JjX3B0ciBzcmMgPSAobXlfc3JjX3B0cikgY2luZm8tPnNyYzsKLQotICAvKiBKdXN0IGEgZHVtYiBpbXBsZW1lbnRhdGlvbiBmb3Igbm93LiAgQ291bGQgdXNlIGZzZWVrKCkgZXhjZXB0Ci0gICAqIGl0IGRvZXNuJ3Qgd29yayBvbiBwaXBlcy4gIE5vdCBjbGVhciB0aGF0IGJlaW5nIHNtYXJ0IGlzIHdvcnRoCi0gICAqIGFueSB0cm91YmxlIGFueXdheSAtLS0gbGFyZ2Ugc2tpcHMgYXJlIGluZnJlcXVlbnQuCi0gICAqLwotICBpZiAobnVtX2J5dGVzID4gMCkgewotICAgIHdoaWxlIChudW1fYnl0ZXMgPiAobG9uZykgc3JjLT5wdWIuYnl0ZXNfaW5fYnVmZmVyKSB7Ci0gICAgICBudW1fYnl0ZXMgLT0gKGxvbmcpIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlcjsKLSAgICAgICh2b2lkKSBmaWxsX2lucHV0X2J1ZmZlcihjaW5mbyk7Ci0gICAgICAvKiBub3RlIHdlIGFzc3VtZSB0aGF0IGZpbGxfaW5wdXRfYnVmZmVyIHdpbGwgbmV2ZXIgcmV0dXJuIEZBTFNFLAotICAgICAgICogc28gc3VzcGVuc2lvbiBuZWVkIG5vdCBiZSBoYW5kbGVkLgotICAgICAgICovCi0gICAgfQotICAgIHNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSArPSAoc2l6ZV90KSBudW1fYnl0ZXM7Ci0gICAgc3JjLT5wdWIuYnl0ZXNfaW5fYnVmZmVyIC09IChzaXplX3QpIG51bV9ieXRlczsKLSAgfQotfQotCi0KLS8qCi0gKiBBbiBhZGRpdGlvbmFsIG1ldGhvZCB0aGF0IGNhbiBiZSBwcm92aWRlZCBieSBkYXRhIHNvdXJjZSBtb2R1bGVzIGlzIHRoZQotICogcmVzeW5jX3RvX3Jlc3RhcnQgbWV0aG9kIGZvciBlcnJvciByZWNvdmVyeSBpbiB0aGUgcHJlc2VuY2Ugb2YgUlNUIG1hcmtlcnMuCi0gKiBGb3IgdGhlIG1vbWVudCwgdGhpcyBzb3VyY2UgbW9kdWxlIGp1c3QgdXNlcyB0aGUgZGVmYXVsdCByZXN5bmMgbWV0aG9kCi0gKiBwcm92aWRlZCBieSB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhhdCBtZXRob2QgYXNzdW1lcyB0aGF0IG5vIGJhY2t0cmFja2luZwotICogaXMgcG9zc2libGUuCi0gKi8KLQotCi0vKgotICogVGVybWluYXRlIHNvdXJjZSAtLS0gY2FsbGVkIGJ5IGpwZWdfZmluaXNoX2RlY29tcHJlc3MKLSAqIGFmdGVyIGFsbCBkYXRhIGhhcyBiZWVuIHJlYWQuICBPZnRlbiBhIG5vLW9wLgotICoKLSAqIE5COiAqbm90KiBjYWxsZWQgYnkganBlZ19hYm9ydCBvciBqcGVnX2Rlc3Ryb3k7IHN1cnJvdW5kaW5nCi0gKiBhcHBsaWNhdGlvbiBtdXN0IGRlYWwgd2l0aCBhbnkgY2xlYW51cCB0aGF0IHNob3VsZCBoYXBwZW4gZXZlbgotICogZm9yIGVycm9yIGV4aXQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi10ZXJtX3NvdXJjZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgLyogbm8gd29yayBuZWNlc3NhcnkgaGVyZSAqLwotfQotCi0KLS8qCi0gKiBQcmVwYXJlIGZvciBpbnB1dCBmcm9tIGEgc3RkaW8gc3RyZWFtLgotICogVGhlIGNhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBvcGVuZWQgdGhlIHN0cmVhbSwgYW5kIGlzIHJlc3BvbnNpYmxlCi0gKiBmb3IgY2xvc2luZyBpdCBhZnRlciBmaW5pc2hpbmcgZGVjb21wcmVzc2lvbi4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfc3RkaW9fc3JjIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQotewotICBteV9zcmNfcHRyIHNyYzsKLQotICAvKiBUaGUgc291cmNlIG9iamVjdCBhbmQgaW5wdXQgYnVmZmVyIGFyZSBtYWRlIHBlcm1hbmVudCBzbyB0aGF0IGEgc2VyaWVzCi0gICAqIG9mIEpQRUcgaW1hZ2VzIGNhbiBiZSByZWFkIGZyb20gdGhlIHNhbWUgZmlsZSBieSBjYWxsaW5nIGpwZWdfc3RkaW9fc3JjCi0gICAqIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCBvbmUuICAoSWYgd2UgZGlzY2FyZGVkIHRoZSBidWZmZXIgYXQgdGhlIGVuZCBvZgotICAgKiBvbmUgaW1hZ2UsIHdlJ2QgbGlrZWx5IGxvc2UgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IG9uZS4pCi0gICAqIFRoaXMgbWFrZXMgaXQgdW5zYWZlIHRvIHVzZSB0aGlzIG1hbmFnZXIgYW5kIGEgZGlmZmVyZW50IHNvdXJjZQotICAgKiBtYW5hZ2VyIHNlcmlhbGx5IHdpdGggdGhlIHNhbWUgSlBFRyBvYmplY3QuICBDYXZlYXQgcHJvZ3JhbW1lci4KLSAgICovCi0gIGlmIChjaW5mby0+c3JjID09IE5VTEwpIHsJLyogZmlyc3QgdGltZSBmb3IgdGhpcyBKUEVHIG9iamVjdD8gKi8KLSAgICBjaW5mby0+c3JjID0gKHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAotCQkJCSAgU0laRU9GKG15X3NvdXJjZV9tZ3IpKTsKLSAgICBzcmMgPSAobXlfc3JjX3B0cikgY2luZm8tPnNyYzsKLSAgICBzcmMtPmJ1ZmZlciA9IChKT0NURVQgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAotCQkJCSAgSU5QVVRfQlVGX1NJWkUgKiBTSVpFT0YoSk9DVEVUKSk7Ci0gIH0KLQotICBzcmMgPSAobXlfc3JjX3B0cikgY2luZm8tPnNyYzsKLSAgc3JjLT5wdWIuaW5pdF9zb3VyY2UgPSBpbml0X3NvdXJjZTsKLSAgc3JjLT5wdWIuZmlsbF9pbnB1dF9idWZmZXIgPSBmaWxsX2lucHV0X2J1ZmZlcjsKLSAgc3JjLT5wdWIuc2tpcF9pbnB1dF9kYXRhID0gc2tpcF9pbnB1dF9kYXRhOwotICBzcmMtPnB1Yi5yZXN5bmNfdG9fcmVzdGFydCA9IGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQ7IC8qIHVzZSBkZWZhdWx0IG1ldGhvZCAqLwotICBzcmMtPnB1Yi50ZXJtX3NvdXJjZSA9IHRlcm1fc291cmNlOwotICBzcmMtPmluZmlsZSA9IGluZmlsZTsKLSAgc3JjLT5wdWIuYnl0ZXNfaW5fYnVmZmVyID0gMDsgLyogZm9yY2VzIGZpbGxfaW5wdXRfYnVmZmVyIG9uIGZpcnN0IHJlYWQgKi8KLSAgc3JjLT5wdWIubmV4dF9pbnB1dF9ieXRlID0gTlVMTDsgLyogdW50aWwgYnVmZmVyIGxvYWRlZCAqLwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRjb2VmY3QuYyBiL2xpYmpwZWd0d3JwL2pkY29lZmN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Y2U1NmYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRjb2VmY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzggKzAsMCBAQAotLyoKLSAqIGpkY29lZmN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGRlY29tcHJlc3Npb24uCi0gKiBUaGlzIGNvbnRyb2xsZXIgaXMgdGhlIHRvcCBsZXZlbCBvZiB0aGUgSlBFRyBkZWNvbXByZXNzb3IgcHJvcGVyLgotICogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBsaWVzIGJldHdlZW4gZW50cm9weSBkZWNvZGluZyBhbmQgaW52ZXJzZS1EQ1Qgc3RlcHMuCi0gKgotICogSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgdGhpcyBjb250cm9sbGVyIGlzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbgotICogaW5wdXQtb3JpZW50ZWQgcHJvY2Vzc2luZyBhbmQgb3V0cHV0LW9yaWVudGVkIHByb2Nlc3NpbmcuCi0gKiBBbHNvLCB0aGUgaW5wdXQgc2lkZSAob25seSkgaXMgdXNlZCB3aGVuIHJlYWRpbmcgYSBmaWxlIGZvciB0cmFuc2NvZGluZy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLS8qIEJsb2NrIHNtb290aGluZyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIHByb2dyZXNzaXZlIEpQRUcsIHNvOiAqLwotI2lmbmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotI3VuZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKLSNlbmRpZgotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFRoZXNlIHZhcmlhYmxlcyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBpbnB1dCBzaWRlLiAqLwotICAvKiBjaW5mby0+aW5wdXRfaU1DVV9yb3cgaXMgYWxzbyB1c2VkIGZvciB0aGlzLiAqLwotICBKRElNRU5TSU9OIE1DVV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KLSAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KLSAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KLQotICAvKiBUaGUgb3V0cHV0IHNpZGUncyBsb2NhdGlvbiBpcyByZXByZXNlbnRlZCBieSBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93LiAqLwotCi0gIC8qIEluIHNpbmdsZS1wYXNzIG1vZGVzLCBpdCdzIHN1ZmZpY2llbnQgdG8gYnVmZmVyIGp1c3Qgb25lIE1DVS4KLSAgICogV2UgYWxsb2NhdGUgYSB3b3Jrc3BhY2Ugb2YgRF9NQVhfQkxPQ0tTX0lOX01DVSBjb2VmZmljaWVudCBibG9ja3MsCi0gICAqIGFuZCBsZXQgdGhlIGVudHJvcHkgZGVjb2RlciB3cml0ZSBpbnRvIHRoYXQgd29ya3NwYWNlIGVhY2ggdGltZS4KLSAgICogKE9uIDgweDg2LCB0aGUgd29ya3NwYWNlIGlzIEZBUiBldmVuIHRob3VnaCBpdCdzIG5vdCByZWFsbHkgdmVyeSBiaWc7Ci0gICAqIHRoaXMgaXMgdG8ga2VlcCB0aGUgbW9kdWxlIGludGVyZmFjZXMgdW5jaGFuZ2VkIHdoZW4gYSBsYXJnZSBjb2VmZmljaWVudAotICAgKiBidWZmZXIgaXMgbmVjZXNzYXJ5LikKLSAgICogSW4gbXVsdGktcGFzcyBtb2RlcywgdGhpcyBhcnJheSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgTUNVJ3MgYmxvY2tzCi0gICAqIHdpdGhpbiB0aGUgdmlydHVhbCBhcnJheXM7IGl0IGlzIHVzZWQgb25seSBieSB0aGUgaW5wdXQgc2lkZS4KLSAgICovCi0gIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotCi0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gIC8qIEluIG11bHRpLXBhc3MgbW9kZXMsIHdlIG5lZWQgYSB2aXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KLSAganZpcnRfYmFycmF5X3B0ciB3aG9sZV9pbWFnZVtNQVhfQ09NUE9ORU5UU107Ci0jZW5kaWYKLQotI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKLSAgLyogV2hlbiBkb2luZyBibG9jayBzbW9vdGhpbmcsIHdlIGxhdGNoIGNvZWZmaWNpZW50IEFsIHZhbHVlcyBoZXJlICovCi0gIGludCAqIGNvZWZfYml0c19sYXRjaDsKLSNkZWZpbmUgU0FWRURfQ09FRlMgIDYJCS8qIHdlIHNhdmUgY29lZl9iaXRzWzAuLjVdICovCi0jZW5kaWYKLX0gbXlfY29lZl9jb250cm9sbGVyOwotCi10eXBlZGVmIG15X2NvZWZfY29udHJvbGxlciAqIG15X2NvZWZfcHRyOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKGludCkgZGVjb21wcmVzc19vbmVwYXNzCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpKTsKLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLU1FVEhPRERFRihpbnQpIGRlY29tcHJlc3NfZGF0YQotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKSk7Ci0jZW5kaWYKLSNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi1MT0NBTChib29sZWFuKSBzbW9vdGhpbmdfb2sgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1NRVRIT0RERUYoaW50KSBkZWNvbXByZXNzX3Ntb290aF9kYXRhCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpKTsKLSNlbmRpZgotCi0KLUxPQ0FMKHZvaWQpCi1zdGFydF9pTUNVX3JvdyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFJlc2V0IHdpdGhpbi1pTUNVLXJvdyBjb3VudGVycyBmb3IgYSBuZXcgcm93IChpbnB1dCBzaWRlKSAqLwotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLQotICAvKiBJbiBhbiBpbnRlcmxlYXZlZCBzY2FuLCBhbiBNQ1Ugcm93IGlzIHRoZSBzYW1lIGFzIGFuIGlNQ1Ugcm93LgotICAgKiBJbiBhIG5vbmludGVybGVhdmVkIHNjYW4sIGFuIGlNQ1Ugcm93IGhhcyB2X3NhbXBfZmFjdG9yIE1DVSByb3dzLgotICAgKiBCdXQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHByb2Nlc3Mgb25seSB3aGF0J3MgbGVmdC4KLSAgICovCi0gIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA+IDEpIHsKLSAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSAxOwotICB9IGVsc2UgewotICAgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPCAoY2luZm8tPnRvdGFsX2lNQ1Vfcm93cy0xKSkKLSAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT52X3NhbXBfZmFjdG9yOwotICAgIGVsc2UKLSAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT5sYXN0X3Jvd19oZWlnaHQ7Ci0gIH0KLQotICBjb2VmLT5NQ1VfY3RyID0gMDsKLSAgY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0gMDsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYW4gaW5wdXQgcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfaW5wdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgY2luZm8tPmlucHV0X2lNQ1Vfcm93ID0gMDsKLSAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhbiBvdXRwdXQgcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfb3V0cHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0jaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLQotICAvKiBJZiBtdWx0aXBhc3MsIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRvIHVzZSBibG9jayBzbW9vdGhpbmcgb24gdGhpcyBwYXNzICovCi0gIGlmIChjb2VmLT5wdWIuY29lZl9hcnJheXMgIT0gTlVMTCkgewotICAgIGlmIChjaW5mby0+ZG9fYmxvY2tfc21vb3RoaW5nICYmIHNtb290aGluZ19vayhjaW5mbykpCi0gICAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19zbW9vdGhfZGF0YTsKLSAgICBlbHNlCi0gICAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19kYXRhOwotICB9Ci0jZW5kaWYKLSAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyA9IDA7Ci19Ci0KLQotLyoKLSAqIERlY29tcHJlc3MgYW5kIHJldHVybiBzb21lIGRhdGEgaW4gdGhlIHNpbmdsZS1wYXNzIGNhc2UuCi0gKiBBbHdheXMgYXR0ZW1wdHMgdG8gZW1pdCBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykuCi0gKiBJbnB1dCBhbmQgb3V0cHV0IG11c3QgcnVuIGluIGxvY2tzdGVwIHNpbmNlIHdlIGhhdmUgb25seSBhIG9uZS1NQ1UgYnVmZmVyLgotICogUmV0dXJuIHZhbHVlIGlzIEpQRUdfUk9XX0NPTVBMRVRFRCwgSlBFR19TQ0FOX0NPTVBMRVRFRCwgb3IgSlBFR19TVVNQRU5ERUQuCi0gKgotICogTkI6IG91dHB1dF9idWYgY29udGFpbnMgYSBwbGFuZSBmb3IgZWFjaCBjb21wb25lbnQgaW4gaW1hZ2UsCi0gKiB3aGljaCB3ZSBpbmRleCBhY2NvcmRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIFNPRiBwb3NpdGlvbi4KLSAqLwotCi1NRVRIT0RERUYoaW50KQotZGVjb21wcmVzc19vbmVwYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCi0gIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7Ci0gIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOwotICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0LCB1c2VmdWxfd2lkdGg7Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X3B0cjsKLSAgSkRJTUVOU0lPTiBzdGFydF9jb2wsIG91dHB1dF9jb2w7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIGludmVyc2VfRENUX21ldGhvZF9wdHIgaW52ZXJzZV9EQ1Q7Ci0KLSNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCi0gIGlmIChjaW5mby0+dGlsZV9kZWNvZGUpIHsKLSAgICBsYXN0X01DVV9jb2wgPQotICAgICAgICAoY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5fcmlnaHRfYm91bmRhcnkgLQotICAgICAgICAgY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5fbGVmdF9ib3VuZGFyeSkgLSAxOwotICB9Ci0jZW5kaWYKLQotICAvKiBMb29wIHRvIHByb2Nlc3MgYXMgbXVjaCBhcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KLSAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwotICAgICAgIHlvZmZzZXQrKykgewotICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8PSBsYXN0X01DVV9jb2w7Ci0JIE1DVV9jb2xfbnVtKyspIHsKLSAgICAgIC8qIFRyeSB0byBmZXRjaCBhbiBNQ1UuICBFbnRyb3B5IGRlY29kZXIgZXhwZWN0cyBidWZmZXIgdG8gYmUgemVyb2VkLiAqLwotICAgICAgaWYgKE1DVV9jb2xfbnVtIDwgKHVuc2lnbmVkIGludCljb2VmLT5wdWIuTUNVX2NvbHVtbnNfdG9fc2tpcCkgewotICAgICAgICAoKmNpbmZvLT5lbnRyb3B5LT5kZWNvZGVfbWN1X2Rpc2NhcmRfY29lZikgKGNpbmZvKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbMF0sCi0JCShzaXplX3QpIChjaW5mby0+YmxvY2tzX2luX01DVSAqIFNJWkVPRihKQkxPQ0spKSk7Ci0gICAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmRlY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKLQkgIC8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KLQkgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7Ci0JICBjb2VmLT5NQ1VfY3RyID0gTUNVX2NvbF9udW07Ci0JICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8qIERldGVybWluZSB3aGVyZSBkYXRhIHNob3VsZCBnbyBpbiBvdXRwdXRfYnVmIGFuZCBkbyB0aGUgSURDVCB0aGluZy4KLSAgICAgICAqIFdlIHNraXAgZHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBhbmQgYm90dG9tIGVkZ2VzIChidXQgYmxrbiBnZXRzCi0gICAgICAgKiBpbmNyZW1lbnRlZCBwYXN0IHRoZW0hKS4gIE5vdGUgdGhlIGlubmVyIGxvb3AgcmVsaWVzIG9uIGhhdmluZwotICAgICAgICogYWxsb2NhdGVkIHRoZSBNQ1VfYnVmZmVyW10gYmxvY2tzIHNlcXVlbnRpYWxseS4KLSAgICAgICAqLwotICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLQljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotCS8qIERvbid0IGJvdGhlciB0byBJRENUIGFuIHVuaW50ZXJlc3RpbmcgY29tcG9uZW50LiAqLwotCWlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpIHsKLQkgIGJsa24gKz0gY29tcHB0ci0+TUNVX2Jsb2NrczsKLQkgIGNvbnRpbnVlOwotCX0KLQlpbnZlcnNlX0RDVCA9IGNpbmZvLT5pZGN0LT5pbnZlcnNlX0RDVFtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdOwotCXVzZWZ1bF93aWR0aCA9IChNQ1VfY29sX251bSA8IGxhc3RfTUNVX2NvbCkgPyBjb21wcHRyLT5NQ1Vfd2lkdGgKLQkJCQkJCSAgICA6IGNvbXBwdHItPmxhc3RfY29sX3dpZHRoOwotCW91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0gKwotCSAgeW9mZnNldCAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKLQlzdGFydF9jb2wgPSBNQ1VfY29sX251bSAqIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGg7Ci0JZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgewotCSAgaWYgKGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8IGxhc3RfaU1DVV9yb3cgfHwKLQkgICAgICB5b2Zmc2V0K3lpbmRleCA8IGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCkgewotCSAgICBvdXRwdXRfY29sID0gc3RhcnRfY29sOwotCSAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IHVzZWZ1bF93aWR0aDsgeGluZGV4KyspIHsKLQkgICAgICAoKmludmVyc2VfRENUKSAoY2luZm8sIGNvbXBwdHIsCi0JCSAgICAgICAgKEpDT0VGUFRSKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24reGluZGV4XSwKLQkJICAgICAgICBvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKLQkgICAgICBvdXRwdXRfY29sICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKLQkgICAgfQotCSAgfQotCSAgYmxrbiArPSBjb21wcHRyLT5NQ1Vfd2lkdGg7Ci0JICBvdXRwdXRfcHRyICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKLQl9Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KLSAgICBjb2VmLT5NQ1VfY3RyID0gMDsKLSAgfQotICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLwotICBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93Kys7Ci0gIGlmICgrKyhjaW5mby0+aW5wdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgewotICAgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKLSAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOwotICB9Ci0gIC8qIENvbXBsZXRlZCB0aGUgc2NhbiAqLwotICAoKmNpbmZvLT5pbnB1dGN0bC0+ZmluaXNoX2lucHV0X3Bhc3MpIChjaW5mbyk7Ci0gIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOwotfQotCi0KLS8qCi0gKiBEdW1teSBjb25zdW1lLWlucHV0IHJvdXRpbmUgZm9yIHNpbmdsZS1wYXNzIG9wZXJhdGlvbi4KLSAqLwotCi1NRVRIT0RERUYoaW50KQotZHVtbXlfY29uc3VtZV9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7CS8qIEFsd2F5cyBpbmRpY2F0ZSBub3RoaW5nIHdhcyBkb25lICovCi19Ci0KLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLS8qCi0gKiBDb25zdW1lIGlucHV0IGRhdGEgYW5kIHN0b3JlIGl0IGluIHRoZSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlci4KLSAqIFdlIHJlYWQgYXMgbXVjaCBhcyBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykgcGVyIGNhbGwsCi0gKiBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KLSAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1JPV19DT01QTEVURUQsIEpQRUdfU0NBTl9DT01QTEVURUQsIG9yIEpQRUdfU1VTUEVOREVELgotICovCi0KLU1FVEhPRERFRihpbnQpCi1jb25zdW1lX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCi0gIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQ7Ci0gIEpESU1FTlNJT04gc3RhcnRfY29sOwotICBKQkxPQ0tBUlJBWSBidWZmZXJbTUFYX0NPTVBTX0lOX1NDQU5dOwotICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKLSAgICAgICBjaW5mby0+dGlsZV9kZWNvZGUgPyAwIDogY2luZm8tPmlucHV0X2lNQ1Vfcm93ICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLSAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7Ci0gICAgLyogTm90ZTogZW50cm9weSBkZWNvZGVyIGV4cGVjdHMgYnVmZmVyIHRvIGJlIHplcm9lZCwKLSAgICAgKiBidXQgdGhpcyBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIG1lbW9yeSBtYW5hZ2VyCi0gICAgICogYmVjYXVzZSB3ZSByZXF1ZXN0ZWQgYSBwcmUtemVyb2VkIGFycmF5LgotICAgICAqLwotICB9Ci0gIHVuc2lnbmVkIGludCBNQ1VzX3Blcl9yb3cgPSBjaW5mby0+TUNVc19wZXJfcm93OwotI2lmZGVmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKLSAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSkgewotICAgIGludCBpTUNVX3dpZHRoX1RvX01DVV93aWR0aDsKLSAgICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7Ci0gICAgICAvLyBJbnRlcmxlYXZlZAotICAgICAgaU1DVV93aWR0aF9Ub19NQ1Vfd2lkdGggPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBOb24taW50ZXJ2bGVhdmVkCi0gICAgICBpTUNVX3dpZHRoX1RvX01DVV93aWR0aCA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT5oX3NhbXBfZmFjdG9yOwotICAgIH0KLSAgICBNQ1VzX3Blcl9yb3cgPSBqbWluKE1DVXNfcGVyX3JvdywKLSAgICAgICAgKGNpbmZvLT5jb2VmLT5jb2x1bW5fcmlnaHRfYm91bmRhcnkgLSBjaW5mby0+Y29lZi0+Y29sdW1uX2xlZnRfYm91bmRhcnkpCi0gICAgICAgICogY2luZm8tPmVudHJvcHktPmluZGV4LT5NQ1Vfc2FtcGxlX3NpemUgKiBpTUNVX3dpZHRoX1RvX01DVV93aWR0aCk7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIExvb3AgdG8gcHJvY2VzcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KLSAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwotICAgICAgIHlvZmZzZXQrKykgewotICAgLy8gY29uZmlndXJlIGh1ZmZtYW4gZGVjb2RlcgotI2lmZGVmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKLSAgICBpZiAoY2luZm8tPnRpbGVfZGVjb2RlKSB7Ci0gICAgICBodWZmbWFuX3NjYW5faGVhZGVyIHNjYW5faGVhZGVyID0KLSAgICAgICAgICAgIGNpbmZvLT5lbnRyb3B5LT5pbmRleC0+c2NhbltjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXJdOwotICAgICAgaW50IGNvbF9vZmZzZXQgPSBjaW5mby0+Y29lZi0+Y29sdW1uX2xlZnRfYm91bmRhcnk7Ci0gICAgICAoKmNpbmZvLT5lbnRyb3B5LT5jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyKSAoY2luZm8sCi0gICAgICAgICAgICAgIHNjYW5faGVhZGVyLm9mZnNldFtjaW5mby0+aW5wdXRfaU1DVV9yb3ddCi0gICAgICAgICAgICAgIFtjb2xfb2Zmc2V0ICsgeW9mZnNldCAqIHNjYW5faGVhZGVyLk1DVXNfcGVyX3Jvd10pOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gemVybyBhbGwgYmxvY2tzCi0gICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPk1DVV9jdHI7IE1DVV9jb2xfbnVtIDwgTUNVc19wZXJfcm93OwotICAgICAgICAgIE1DVV9jb2xfbnVtKyspIHsKLSAgICAgIC8qIENvbnN0cnVjdCBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVCBibG9ja3MgYmVsb25naW5nIHRvIHRoaXMgTUNVICovCi0gICAgICBibGtuID0gMDsJCQkvKiBpbmRleCBvZiBjdXJyZW50IERDVCBibG9jayB3aXRoaW4gTUNVICovCi0gICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgICAgICBzdGFydF9jb2wgPSBNQ1VfY29sX251bSAqIGNvbXBwdHItPk1DVV93aWR0aDsKLSAgICAgICAgZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgewotICAgICAgICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbY2ldW3lpbmRleCt5b2Zmc2V0XSArIHN0YXJ0X2NvbDsKLSAgICAgICAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKLSAgICAgICAgICAgIGNvZWYtPk1DVV9idWZmZXJbYmxrbisrXSA9IGJ1ZmZlcl9wdHIrKzsKLSNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCi0gICAgICAgICAgICBpZiAoY2luZm8tPnRpbGVfZGVjb2RlICYmIGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA9PSAwKSB7Ci0gICAgICAgICAgICAgIC8vIG5lZWQgdG8gZG8gcHJlLXplcm8gb3Vyc2VsdmVzLgotICAgICAgICAgICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbYmxrbi0xXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpIChTSVpFT0YoSkJMT0NLKSkpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgLyogVHJ5IHRvIGZldGNoIHRoZSBNQ1UuICovCi0gICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5kZWNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7Ci0gICAgICAgIC8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KLSAgICAgICAgY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKLSAgICAgICAgY29lZi0+TUNVX2N0ciA9IE1DVV9jb2xfbnVtOwotICAgICAgICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KLSAgICBjb2VmLT5NQ1VfY3RyID0gMDsKLSAgfQotICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLwotICBpZiAoKysoY2luZm8tPmlucHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKLSAgICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci0gICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKLSAgfQotICAvKiBDb21wbGV0ZWQgdGhlIHNjYW4gKi8KLSAgKCpjaW5mby0+aW5wdXRjdGwtPmZpbmlzaF9pbnB1dF9wYXNzKSAoY2luZm8pOwotICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKLX0KLQotLyoKLSAqIENvbnN1bWUgaW5wdXQgZGF0YSBhbmQgc3RvcmUgaXQgaW4gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlci4KLSAqIFJlYWQgb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpIHBlciBjYWxsLgotICovCi0KLU1FVEhPRERFRihpbnQpCi1jb25zdW1lX2RhdGFfbXVsdGlfc2NhbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaHVmZm1hbl9pbmRleCAqaW5kZXggPSBjaW5mby0+ZW50cm9weS0+aW5kZXg7Ci0gIGludCBpLCByZXRjb2RlLCBjaTsKLSAgaW50IG1jdSA9IGNpbmZvLT5pbnB1dF9pTUNVX3JvdzsKLSAgamluaXRfcGh1ZmZfZGVjb2RlcihjaW5mbyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBpbmRleC0+c2Nhbl9jb3VudDsgaSsrKSB7Ci0gICAgKCpjaW5mby0+aW5wdXRjdGwtPmZpbmlzaF9pbnB1dF9wYXNzKSAoY2luZm8pOwotICAgIGpzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGNpbmZvLCBpbmRleC0+c2NhbltpXS5iaXRzdHJlYW1fb2Zmc2V0KTsKLSAgICBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ID0gbWN1OwotICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKLSAgICAvLyBDb25zdW1lIFNPUyBhbmQgREhUIGhlYWRlcnMKLSAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfbWFya2VycykgKGNpbmZvLCBpbmRleCwgaSk7Ci0gICAgY2luZm8tPmlucHV0X2lNQ1Vfcm93ID0gbWN1OwotICAgIGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA9IGk7Ci0gICAgY2luZm8tPmVudHJvcHktPmluZGV4ID0gaW5kZXg7Ci0gICAgLy8gQ29uc3VtZSBzY2FuIGJsb2NrIGRhdGEKLSAgICBjb25zdW1lX2RhdGEoY2luZm8pOwotICB9Ci0gIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA9IG1jdSArIDE7Ci0gIGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA9IDA7Ci0gIGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSAwOwotICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOwotfQotCi0vKgotICogU2FtZSBhcyBjb25zdW1lX2RhdGEsIGV4cGVjdCBmb3Igc2F2aW5nIHRoZSBIdWZmbWFuIGRlY29kZSBpbmZvcm1hdGlvbgotICogLSBiaXRzdHJlYW0gb2Zmc2V0IGFuZCBEQyBjb2VmZmljaWVudCB0byBpbmRleC4KLSAqLwotCi1NRVRIT0RERUYoaW50KQotY29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXhfYmFzZWxpbmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LCBpbnQgY3VycmVudF9zY2FuKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLSAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLwotICBpbnQgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0OwotICBKRElNRU5TSU9OIHN0YXJ0X2NvbDsKLSAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7Ci0KLSAgaHVmZm1hbl9zY2FuX2hlYWRlciAqc2Nhbl9oZWFkZXIgPSBpbmRleC0+c2NhbiArIGN1cnJlbnRfc2NhbjsKLSAgc2Nhbl9oZWFkZXItPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLQotICBzaXplX3QgYWxsb2NhdGVfc2l6ZSA9IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdwotICAgICAgKiBqZGl2X3JvdW5kX3VwKGNpbmZvLT5NQ1VzX3Blcl9yb3csIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemUpCi0gICAgICAqIHNpemVvZihodWZmbWFuX29mZnNldF9kYXRhKTsKLSAgc2Nhbl9oZWFkZXItPm9mZnNldFtjaW5mby0+aW5wdXRfaU1DVV9yb3ddID0KLSAgICAgICAgKGh1ZmZtYW5fb2Zmc2V0X2RhdGEqKW1hbGxvYyhhbGxvY2F0ZV9zaXplKTsKLSAgaW5kZXgtPm1lbV91c2VkICs9IGFsbG9jYXRlX3NpemU7Ci0KLSAgaHVmZm1hbl9vZmZzZXRfZGF0YSAqb2Zmc2V0X2RhdGEgPSBzY2FuX2hlYWRlci0+b2Zmc2V0W2NpbmZvLT5pbnB1dF9pTUNVX3Jvd107Ci0KLSAgLyogTG9vcCB0byBwcm9jZXNzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLwotICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7Ci0gICAgICAgeW9mZnNldCsrKSB7Ci0gICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPk1DVV9jdHI7IE1DVV9jb2xfbnVtIDwgY2luZm8tPk1DVXNfcGVyX3JvdzsKLQkgTUNVX2NvbF9udW0rKykgewotICAgICAgLy8gUmVjb3JkIGh1ZmZtYW4gYml0IG9mZnNldAotICAgICAgaWYgKE1DVV9jb2xfbnVtICUgaW5kZXgtPk1DVV9zYW1wbGVfc2l6ZSA9PSAwKSB7Ci0gICAgICAgICgqY2luZm8tPmVudHJvcHktPmdldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbikKLSAgICAgICAgICAgICAgICAoY2luZm8sIG9mZnNldF9kYXRhKTsKLSAgICAgICAgKytvZmZzZXRfZGF0YTsKLSAgICAgIH0KLQotICAgICAgLyogVHJ5IHRvIGZldGNoIHRoZSBNQ1UuICovCi0gICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5kZWNvZGVfbWN1X2Rpc2NhcmRfY29lZikgKGNpbmZvKSkgewotICAgICAgICAvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCi0gICAgICAgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7Ci0gICAgICAgIGNvZWYtPk1DVV9jdHIgPSBNQ1VfY29sX251bTsKLSAgICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgfQotICAgIH0KLSAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCi0gICAgY29lZi0+TUNVX2N0ciA9IDA7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KLSAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7Ci0gICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCi0gICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKLSAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Ci19Ci0KLS8qCi0gKiBTYW1lIGFzIGNvbnN1bWVfZGF0YSwgZXhwZWN0IGZvciBzYXZpbmcgdGhlIEh1ZmZtYW4gZGVjb2RlIGluZm9ybWF0aW9uCi0gKiAtIGJpdHN0cmVhbSBvZmZzZXQgYW5kIERDIGNvZWZmaWNpZW50IHRvIGluZGV4LgotICovCi0KLU1FVEhPRERFRihpbnQpCi1jb25zdW1lX2RhdGFfYnVpbGRfaHVmZm1hbl9pbmRleF9wcm9ncmVzc2l2ZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsIGludCBjdXJyZW50X3NjYW4pCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCi0gIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQ7Ci0gIEpESU1FTlNJT04gc3RhcnRfY29sOwotICBKQkxPQ0tBUlJBWSBidWZmZXJbTUFYX0NPTVBTX0lOX1NDQU5dOwotICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICBpbnQgZmFjdG9yID0gNDsgLy8gbWF4aW11bSBmYWN0b3IgaXMgNC4KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCi0gICAgZmFjdG9yID0gam1pbihmYWN0b3IsIGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXS0+aF9zYW1wX2ZhY3Rvcik7Ci0KLSAgaW50IHNhbXBsZV9zaXplID0gaW5kZXgtPk1DVV9zYW1wbGVfc2l6ZSAqIGZhY3RvcjsKLSAgaHVmZm1hbl9zY2FuX2hlYWRlciAqc2Nhbl9oZWFkZXIgPSBpbmRleC0+c2NhbiArIGN1cnJlbnRfc2NhbjsKLSAgc2Nhbl9oZWFkZXItPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLSAgc2Nhbl9oZWFkZXItPk1DVXNfcGVyX3JvdyA9IGpkaXZfcm91bmRfdXAoY2luZm8tPk1DVXNfcGVyX3Jvdywgc2FtcGxlX3NpemUpOwotICBzY2FuX2hlYWRlci0+Y29tcHNfaW5fc2NhbiA9IGNpbmZvLT5jb21wc19pbl9zY2FuOwotCi0gIHNpemVfdCBhbGxvY2F0ZV9zaXplID0gY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93Ci0gICAgICAqIHNjYW5faGVhZGVyLT5NQ1VzX3Blcl9yb3cgKiBzaXplb2YoaHVmZm1hbl9vZmZzZXRfZGF0YSk7Ci0gIHNjYW5faGVhZGVyLT5vZmZzZXRbY2luZm8tPmlucHV0X2lNQ1Vfcm93XSA9Ci0gICAgICAgIChodWZmbWFuX29mZnNldF9kYXRhKiltYWxsb2MoYWxsb2NhdGVfc2l6ZSk7Ci0gIGluZGV4LT5tZW1fdXNlZCArPSBhbGxvY2F0ZV9zaXplOwotCi0gIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldF9kYXRhID0gc2Nhbl9oZWFkZXItPm9mZnNldFtjaW5mby0+aW5wdXRfaU1DVV9yb3ddOwotCi0gIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlcnMgZm9yIHRoZSBjb21wb25lbnRzIHVzZWQgaW4gdGhpcyBzY2FuLiAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgYnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdLAotICAgICAgIDAsIC8vIE9ubHkgbmVlZCBvbmUgcm93IGJ1ZmZlcgotICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgfQotICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCi0gIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLSAgICAgICB5b2Zmc2V0KyspIHsKLSAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+TUNVX2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OwotCSBNQ1VfY29sX251bSsrKSB7Ci0gICAgICAvKiBGb3IgZWFjaCBNQ1UsIHdlIGxvb3AgdGhyb3VnaCBkaWZmZXJlbnQgY29sb3IgY29tcG9uZW50cy4KLSAgICAgICAqIFRoZW4sIGZvciBlYWNoIGNvbG9yIGNvbXBvbmVudCB3ZSB3aWxsIGdldCBhIGxpc3Qgb2YgcG9pbnRlcnMgdG8gRENUCi0gICAgICAgKiBibG9ja3MgaW4gdGhlIHZpcnR1YWwgYnVmZmVyLgotICAgICAgICovCi0gICAgICBibGtuID0gMDsgLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAgICAgc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfd2lkdGg7Ci0gICAgICAgIC8qIEdldCB0aGUgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGluCi0gICAgICAgICAqIHRoZSB2aXJ0dWFsIGJ1ZmZlciBpbiBhIGNvbG9yIGNvbXBvbmVudCBvZiB0aGUgTUNVLgotICAgICAgICAgKi8KLSAgICAgICAgZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgewotICAgICAgICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbY2ldW3lpbmRleCt5b2Zmc2V0XSArIHN0YXJ0X2NvbDsKLSAgICAgICAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKLSAgICAgICAgICAgIGNvZWYtPk1DVV9idWZmZXJbYmxrbisrXSA9IGJ1ZmZlcl9wdHIrKzsKLSAgICAgICAgICAgIGlmIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPT0gMCkgewotICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRvIHByZS16ZXJvIGJ5IG91cnNlbGYuCi0gICAgICAgICAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY29lZi0+TUNVX2J1ZmZlcltibGtuLTFdLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkgKFNJWkVPRihKQkxPQ0spKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBSZWNvcmQgaHVmZm1hbiBiaXQgb2Zmc2V0Ci0gICAgICBpZiAoTUNVX2NvbF9udW0gJSBzYW1wbGVfc2l6ZSA9PSAwKSB7Ci0gICAgICAgICgqY2luZm8tPmVudHJvcHktPmdldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbikKLSAgICAgICAgICAgICAgICAoY2luZm8sIG9mZnNldF9kYXRhKTsKLSAgICAgICAgKytvZmZzZXRfZGF0YTsKLSAgICAgIH0KLSAgICAgIC8qIFRyeSB0byBmZXRjaCB0aGUgTUNVLiAqLwotICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdSkgKGNpbmZvLCBjb2VmLT5NQ1VfYnVmZmVyKSkgewotCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KLQljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OwotCWNvZWYtPk1DVV9jdHIgPSBNQ1VfY29sX251bTsKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KLSAgICBjb2VmLT5NQ1VfY3RyID0gMDsKLSAgfQotICAoKmNpbmZvLT5lbnRyb3B5LT5nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24pCi0gICAgICAgIChjaW5mbywgJnNjYW5faGVhZGVyLT5wcmV2X01DVV9vZmZzZXQpOwotICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLwotICBpZiAoKysoY2luZm8tPmlucHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKLSAgICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci0gICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKLSAgfQotICAvKiBDb21wbGV0ZWQgdGhlIHNjYW4gKi8KLSAgKCpjaW5mby0+aW5wdXRjdGwtPmZpbmlzaF9pbnB1dF9wYXNzKSAoY2luZm8pOwotICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKLX0KLQotLyoKLSAqIERlY29tcHJlc3MgYW5kIHJldHVybiBzb21lIGRhdGEgaW4gdGhlIG11bHRpLXBhc3MgY2FzZS4KLSAqIEFsd2F5cyBhdHRlbXB0cyB0byBlbWl0IG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KS4KLSAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1JPV19DT01QTEVURUQsIEpQRUdfU0NBTl9DT01QTEVURUQsIG9yIEpQRUdfU1VTUEVOREVELgotICoKLSAqIE5COiBvdXRwdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLgotICovCi0KLU1FVEhPRERFRihpbnQpCi1kZWNvbXByZXNzX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOwotICBKRElNRU5TSU9OIGJsb2NrX251bTsKLSAgaW50IGNpLCBibG9ja19yb3csIGJsb2NrX3Jvd3M7Ci0gIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKLSAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X3B0cjsKLSAgSkRJTUVOU0lPTiBvdXRwdXRfY29sOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUOwotCi0gIC8qIEZvcmNlIHNvbWUgaW5wdXQgdG8gYmUgZG9uZSBpZiB3ZSBhcmUgZ2V0dGluZyBhaGVhZCBvZiB0aGUgaW5wdXQuICovCi0gIHdoaWxlIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPCBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyIHx8Ci0JIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPT0gY2luZm8tPm91dHB1dF9zY2FuX251bWJlciAmJgotCSAgY2luZm8tPmlucHV0X2lNQ1Vfcm93IDw9IGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cpKSB7Ci0gICAgaWYgKCgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KShjaW5mbykgPT0gSlBFR19TVVNQRU5ERUQpCi0gICAgICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gIH0KLQotICAvKiBPSywgb3V0cHV0IGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzLiAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIERvbid0IGJvdGhlciB0byBJRENUIGFuIHVuaW50ZXJlc3RpbmcgY29tcG9uZW50LiAqLwotICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpCi0gICAgICBjb250aW51ZTsKLSAgICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXIgZm9yIHRoaXMgY29tcG9uZW50LiAqLwotICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCi0gICAgICAgY2luZm8tPnRpbGVfZGVjb2RlID8gMCA6IGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0gICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCi0gICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93KQotICAgICAgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBOQjogY2FuJ3QgdXNlIGxhc3Rfcm93X2hlaWdodCBoZXJlOyBpdCBpcyBpbnB1dC1zaWRlLWRlcGVuZGVudCEgKi8KLSAgICAgIGJsb2NrX3Jvd3MgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOwotICAgICAgaWYgKGJsb2NrX3Jvd3MgPT0gMCkgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgfQotICAgIGludmVyc2VfRENUID0gY2luZm8tPmlkY3QtPmludmVyc2VfRENUW2NpXTsKLSAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZltjaV07Ci0gICAgaW50IHdpZHRoX2luX2Jsb2NrcyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKLSAgICBpbnQgc3RhcnRfYmxvY2sgPSAwOwotI2lmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKLSAgICBpZiAoY2luZm8tPnRpbGVfZGVjb2RlKSB7Ci0gICAgICAvLyB3aWR0aF9pbl9ibG9ja3MgZm9yIGEgY29tcG9uZW50IGRlcGVuZHMgb24gaXRzIGhfc2FtcF9mYWN0b3IuCi0gICAgICB3aWR0aF9pbl9ibG9ja3MgPSBqbWluKHdpZHRoX2luX2Jsb2NrcywKLSAgICAgICAgKGNpbmZvLT5jb2VmLT5NQ1VfY29sdW1uX3JpZ2h0X2JvdW5kYXJ5IC0KLSAgICAgICAgIGNpbmZvLT5jb2VmLT5NQ1VfY29sdW1uX2xlZnRfYm91bmRhcnkpICoKLSAgICAgICAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpOwotICAgICAgc3RhcnRfYmxvY2sgPSBjb2VmLT5wdWIuTUNVX2NvbHVtbnNfdG9fc2tpcCAqCi0gICAgICAgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwotICAgfQotI2VuZGlmCi0gICAgLyogTG9vcCBvdmVyIGFsbCBEQ1QgYmxvY2tzIHRvIGJlIHByb2Nlc3NlZC4gKi8KLSAgICBmb3IgKGJsb2NrX3JvdyA9IDA7IGJsb2NrX3JvdyA8IGJsb2NrX3Jvd3M7IGJsb2NrX3JvdysrKSB7Ci0gICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2Jsb2NrX3Jvd107Ci0gICAgICBvdXRwdXRfY29sID0gc3RhcnRfYmxvY2sgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgICBidWZmZXJfcHRyICs9IHN0YXJ0X2Jsb2NrOwotICAgICAgZm9yIChibG9ja19udW0gPSBzdGFydF9ibG9jazsgYmxvY2tfbnVtIDwgKHVuc2lnbmVkIGludCl3aWR0aF9pbl9ibG9ja3M7IGJsb2NrX251bSsrKSB7Ci0JKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLCAoSkNPRUZQVFIpIGJ1ZmZlcl9wdHIsCi0JCQlvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKLQlidWZmZXJfcHRyKys7Ci0Jb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgICB9Ci0gICAgICBvdXRwdXRfcHRyICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoKysoY2luZm8tPm91dHB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKQotICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7Ci0gIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOwotfQotCi0jZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCi0KLQotI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKLQotLyoKLSAqIFRoaXMgY29kZSBhcHBsaWVzIGludGVyYmxvY2sgc21vb3RoaW5nIGFzIGRlc2NyaWJlZCBieSBzZWN0aW9uIEsuOAotICogb2YgdGhlIEpQRUcgc3RhbmRhcmQ6IHRoZSBmaXJzdCA1IEFDIGNvZWZmaWNpZW50cyBhcmUgZXN0aW1hdGVkIGZyb20KLSAqIHRoZSBEQyB2YWx1ZXMgb2YgYSBEQ1QgYmxvY2sgYW5kIGl0cyA4IG5laWdoYm9yaW5nIGJsb2Nrcy4KLSAqIFdlIGFwcGx5IHNtb290aGluZyBvbmx5IGZvciBwcm9ncmVzc2l2ZSBKUEVHIGRlY29kaW5nLCBhbmQgb25seSBpZgotICogdGhlIGNvZWZmaWNpZW50cyBpdCBjYW4gZXN0aW1hdGUgYXJlIG5vdCB5ZXQga25vd24gdG8gZnVsbCBwcmVjaXNpb24uCi0gKi8KLQotLyogTmF0dXJhbC1vcmRlciBhcnJheSBwb3NpdGlvbnMgb2YgdGhlIGZpcnN0IDUgemlnemFnLW9yZGVyIGNvZWZmaWNpZW50cyAqLwotI2RlZmluZSBRMDFfUE9TICAxCi0jZGVmaW5lIFExMF9QT1MgIDgKLSNkZWZpbmUgUTIwX1BPUyAgMTYKLSNkZWZpbmUgUTExX1BPUyAgOQotI2RlZmluZSBRMDJfUE9TICAyCi0KLS8qCi0gKiBEZXRlcm1pbmUgd2hldGhlciBibG9jayBzbW9vdGhpbmcgaXMgYXBwbGljYWJsZSBhbmQgc2FmZS4KLSAqIFdlIGFsc28gbGF0Y2ggdGhlIGN1cnJlbnQgc3RhdGVzIG9mIHRoZSBjb2VmX2JpdHNbXSBlbnRyaWVzIGZvciB0aGUKLSAqIEFDIGNvZWZmaWNpZW50czsgb3RoZXJ3aXNlLCBpZiB0aGUgaW5wdXQgc2lkZSBvZiB0aGUgZGVjb21wcmVzc29yCi0gKiBhZHZhbmNlcyBpbnRvIGEgbmV3IHNjYW4sIHdlIG1pZ2h0IHRoaW5rIHRoZSBjb2VmZmljaWVudHMgYXJlIGtub3duCi0gKiBtb3JlIGFjY3VyYXRlbHkgdGhhbiB0aGV5IHJlYWxseSBhcmUuCi0gKi8KLQotTE9DQUwoYm9vbGVhbikKLXNtb290aGluZ19vayAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIGJvb2xlYW4gc21vb3RoaW5nX3VzZWZ1bCA9IEZBTFNFOwotICBpbnQgY2ksIGNvZWZpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBKUVVBTlRfVEJMICogcXRhYmxlOwotICBpbnQgKiBjb2VmX2JpdHM7Ci0gIGludCAqIGNvZWZfYml0c19sYXRjaDsKLQotICBpZiAoISBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSB8fCBjaW5mby0+Y29lZl9iaXRzID09IE5VTEwpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIEFsbG9jYXRlIGxhdGNoIGFyZWEgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICBpZiAoY29lZi0+Y29lZl9iaXRzX2xhdGNoID09IE5VTEwpCi0gICAgY29lZi0+Y29lZl9iaXRzX2xhdGNoID0gKGludCAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIGNpbmZvLT5udW1fY29tcG9uZW50cyAqCi0JCQkJICAoU0FWRURfQ09FRlMgKiBTSVpFT0YoaW50KSkpOwotICBjb2VmX2JpdHNfbGF0Y2ggPSBjb2VmLT5jb2VmX2JpdHNfbGF0Y2g7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBBbGwgY29tcG9uZW50cycgcXVhbnRpemF0aW9uIHZhbHVlcyBtdXN0IGFscmVhZHkgYmUgbGF0Y2hlZC4gKi8KLSAgICBpZiAoKHF0YWJsZSA9IGNvbXBwdHItPnF1YW50X3RhYmxlKSA9PSBOVUxMKQotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8qIFZlcmlmeSBEQyAmIGZpcnN0IDUgQUMgcXVhbnRpemVycyBhcmUgbm9uemVybyB0byBhdm9pZCB6ZXJvLWRpdmlkZS4gKi8KLSAgICBpZiAocXRhYmxlLT5xdWFudHZhbFswXSA9PSAwIHx8Ci0JcXRhYmxlLT5xdWFudHZhbFtRMDFfUE9TXSA9PSAwIHx8Ci0JcXRhYmxlLT5xdWFudHZhbFtRMTBfUE9TXSA9PSAwIHx8Ci0JcXRhYmxlLT5xdWFudHZhbFtRMjBfUE9TXSA9PSAwIHx8Ci0JcXRhYmxlLT5xdWFudHZhbFtRMTFfUE9TXSA9PSAwIHx8Ci0JcXRhYmxlLT5xdWFudHZhbFtRMDJfUE9TXSA9PSAwKQotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8qIERDIHZhbHVlcyBtdXN0IGJlIGF0IGxlYXN0IHBhcnRseSBrbm93biBmb3IgYWxsIGNvbXBvbmVudHMuICovCi0gICAgY29lZl9iaXRzID0gY2luZm8tPmNvZWZfYml0c1tjaV07Ci0gICAgaWYgKGNvZWZfYml0c1swXSA8IDApCi0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgLyogQmxvY2sgc21vb3RoaW5nIGlzIGhlbHBmdWwgaWYgc29tZSBBQyBjb2VmZmljaWVudHMgcmVtYWluIGluYWNjdXJhdGUuICovCi0gICAgZm9yIChjb2VmaSA9IDE7IGNvZWZpIDw9IDU7IGNvZWZpKyspIHsKLSAgICAgIGNvZWZfYml0c19sYXRjaFtjb2VmaV0gPSBjb2VmX2JpdHNbY29lZmldOwotICAgICAgaWYgKGNvZWZfYml0c1tjb2VmaV0gIT0gMCkKLQlzbW9vdGhpbmdfdXNlZnVsID0gVFJVRTsKLSAgICB9Ci0gICAgY29lZl9iaXRzX2xhdGNoICs9IFNBVkVEX0NPRUZTOwotICB9Ci0KLSAgcmV0dXJuIHNtb290aGluZ191c2VmdWw7Ci19Ci0KLQotLyoKLSAqIFZhcmlhbnQgb2YgZGVjb21wcmVzc19kYXRhIGZvciB1c2Ugd2hlbiBkb2luZyBibG9jayBzbW9vdGhpbmcuCi0gKi8KLQotTUVUSE9EREVGKGludCkKLWRlY29tcHJlc3Nfc21vb3RoX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOwotICBKRElNRU5TSU9OIGJsb2NrX251bSwgbGFzdF9ibG9ja19jb2x1bW47Ci0gIGludCBjaSwgYmxvY2tfcm93LCBibG9ja19yb3dzLCBhY2Nlc3Nfcm93czsKLSAgSkJMT0NLQVJSQVkgYnVmZmVyOwotICBKQkxPQ0tST1cgYnVmZmVyX3B0ciwgcHJldl9ibG9ja19yb3csIG5leHRfYmxvY2tfcm93OwotICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKLSAgYm9vbGVhbiBmaXJzdF9yb3csIGxhc3Rfcm93OwotICBKQkxPQ0sgd29ya3NwYWNlOwotICBpbnQgKmNvZWZfYml0czsKLSAgSlFVQU5UX1RCTCAqcXVhbnR0Ymw7Ci0gIElOVDMyIFEwMCxRMDEsUTAyLFExMCxRMTEsUTIwLCBudW07Ci0gIGludCBEQzEsREMyLERDMyxEQzQsREM1LERDNixEQzcsREM4LERDOTsKLSAgaW50IEFsLCBwcmVkOwotCi0gIC8qIEZvcmNlIHNvbWUgaW5wdXQgdG8gYmUgZG9uZSBpZiB3ZSBhcmUgZ2V0dGluZyBhaGVhZCBvZiB0aGUgaW5wdXQuICovCi0gIHdoaWxlIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPD0gY2luZm8tPm91dHB1dF9zY2FuX251bWJlciAmJgotCSAhIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQpIHsKLSAgICBpZiAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIpIHsKLSAgICAgIC8qIElmIGlucHV0IGlzIHdvcmtpbmcgb24gY3VycmVudCBzY2FuLCB3ZSBvcmRpbmFyaWx5IHdhbnQgaXQgdG8KLSAgICAgICAqIGhhdmUgY29tcGxldGVkIHRoZSBjdXJyZW50IHJvdy4gIEJ1dCBpZiBpbnB1dCBzY2FuIGlzIERDLAotICAgICAgICogd2Ugd2FudCBpdCB0byBrZWVwIG9uZSByb3cgYWhlYWQgc28gdGhhdCBuZXh0IGJsb2NrIHJvdydzIERDCi0gICAgICAgKiB2YWx1ZXMgYXJlIHVwIHRvIGRhdGUuCi0gICAgICAgKi8KLSAgICAgIEpESU1FTlNJT04gZGVsdGEgPSAoY2luZm8tPlNzID09IDApID8gMSA6IDA7Ci0gICAgICBpZiAoY2luZm8tPmlucHV0X2lNQ1Vfcm93ID4gY2luZm8tPm91dHB1dF9pTUNVX3JvdytkZWx0YSkKLQlicmVhazsKLSAgICB9Ci0gICAgaWYgKCgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KShjaW5mbykgPT0gSlBFR19TVVNQRU5ERUQpCi0gICAgICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gIH0KLQotICAvKiBPSywgb3V0cHV0IGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzLiAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIERvbid0IGJvdGhlciB0byBJRENUIGFuIHVuaW50ZXJlc3RpbmcgY29tcG9uZW50LiAqLwotICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpCi0gICAgICBjb250aW51ZTsKLSAgICAvKiBDb3VudCBub24tZHVtbXkgRENUIGJsb2NrIHJvd3MgaW4gdGhpcyBpTUNVIHJvdy4gKi8KLSAgICBpZiAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyA8IGxhc3RfaU1DVV9yb3cpIHsKLSAgICAgIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgICAgYWNjZXNzX3Jvd3MgPSBibG9ja19yb3dzICogMjsgLyogdGhpcyBhbmQgbmV4dCBpTUNVIHJvdyAqLwotICAgICAgbGFzdF9yb3cgPSBGQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgLyogTkI6IGNhbid0IHVzZSBsYXN0X3Jvd19oZWlnaHQgaGVyZTsgaXQgaXMgaW5wdXQtc2lkZS1kZXBlbmRlbnQhICovCi0gICAgICBibG9ja19yb3dzID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICAgIGlmIChibG9ja19yb3dzID09IDApIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgICAgYWNjZXNzX3Jvd3MgPSBibG9ja19yb3dzOyAvKiB0aGlzIGlNQ1Ugcm93IG9ubHkgKi8KLSAgICAgIGxhc3Rfcm93ID0gVFJVRTsKLSAgICB9Ci0gICAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVyIGZvciB0aGlzIGNvbXBvbmVudC4gKi8KLSAgICBpZiAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyA+IDApIHsKLSAgICAgIGFjY2Vzc19yb3dzICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IC8qIHByaW9yIGlNQ1Ugcm93IHRvbyAqLwotICAgICAgYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCi0JIChjaW5mby0+b3V0cHV0X2lNQ1Vfcm93IC0gMSkgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotCSAoSkRJTUVOU0lPTikgYWNjZXNzX3Jvd3MsIEZBTFNFKTsKLSAgICAgIGJ1ZmZlciArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwkvKiBwb2ludCB0byBjdXJyZW50IGlNQ1Ugcm93ICovCi0gICAgICBmaXJzdF9yb3cgPSBGQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCi0JIChKRElNRU5TSU9OKSAwLCAoSkRJTUVOU0lPTikgYWNjZXNzX3Jvd3MsIEZBTFNFKTsKLSAgICAgIGZpcnN0X3JvdyA9IFRSVUU7Ci0gICAgfQotICAgIC8qIEZldGNoIGNvbXBvbmVudC1kZXBlbmRlbnQgaW5mbyAqLwotICAgIGNvZWZfYml0cyA9IGNvZWYtPmNvZWZfYml0c19sYXRjaCArIChjaSAqIFNBVkVEX0NPRUZTKTsKLSAgICBxdWFudHRibCA9IGNvbXBwdHItPnF1YW50X3RhYmxlOwotICAgIFEwMCA9IHF1YW50dGJsLT5xdWFudHZhbFswXTsKLSAgICBRMDEgPSBxdWFudHRibC0+cXVhbnR2YWxbUTAxX1BPU107Ci0gICAgUTEwID0gcXVhbnR0YmwtPnF1YW50dmFsW1ExMF9QT1NdOwotICAgIFEyMCA9IHF1YW50dGJsLT5xdWFudHZhbFtRMjBfUE9TXTsKLSAgICBRMTEgPSBxdWFudHRibC0+cXVhbnR2YWxbUTExX1BPU107Ci0gICAgUTAyID0gcXVhbnR0YmwtPnF1YW50dmFsW1EwMl9QT1NdOwotICAgIGludmVyc2VfRENUID0gY2luZm8tPmlkY3QtPmludmVyc2VfRENUW2NpXTsKLSAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZltjaV07Ci0gICAgLyogTG9vcCBvdmVyIGFsbCBEQ1QgYmxvY2tzIHRvIGJlIHByb2Nlc3NlZC4gKi8KLSAgICBmb3IgKGJsb2NrX3JvdyA9IDA7IGJsb2NrX3JvdyA8IGJsb2NrX3Jvd3M7IGJsb2NrX3JvdysrKSB7Ci0gICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2Jsb2NrX3Jvd107Ci0gICAgICBpZiAoZmlyc3Rfcm93ICYmIGJsb2NrX3JvdyA9PSAwKQotCXByZXZfYmxvY2tfcm93ID0gYnVmZmVyX3B0cjsKLSAgICAgIGVsc2UKLQlwcmV2X2Jsb2NrX3JvdyA9IGJ1ZmZlcltibG9ja19yb3ctMV07Ci0gICAgICBpZiAobGFzdF9yb3cgJiYgYmxvY2tfcm93ID09IGJsb2NrX3Jvd3MtMSkKLQluZXh0X2Jsb2NrX3JvdyA9IGJ1ZmZlcl9wdHI7Ci0gICAgICBlbHNlCi0JbmV4dF9ibG9ja19yb3cgPSBidWZmZXJbYmxvY2tfcm93KzFdOwotICAgICAgLyogV2UgZmV0Y2ggdGhlIHN1cnJvdW5kaW5nIERDIHZhbHVlcyB1c2luZyBhIHNsaWRpbmctcmVnaXN0ZXIgYXBwcm9hY2guCi0gICAgICAgKiBJbml0aWFsaXplIGFsbCBuaW5lIGhlcmUgc28gYXMgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIG9uIG5hcnJvdyBwaWNzLgotICAgICAgICovCi0gICAgICBEQzEgPSBEQzIgPSBEQzMgPSAoaW50KSBwcmV2X2Jsb2NrX3Jvd1swXVswXTsKLSAgICAgIERDNCA9IERDNSA9IERDNiA9IChpbnQpIGJ1ZmZlcl9wdHJbMF1bMF07Ci0gICAgICBEQzcgPSBEQzggPSBEQzkgPSAoaW50KSBuZXh0X2Jsb2NrX3Jvd1swXVswXTsKLSAgICAgIG91dHB1dF9jb2wgPSAwOwotICAgICAgbGFzdF9ibG9ja19jb2x1bW4gPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgLSAxOwotICAgICAgZm9yIChibG9ja19udW0gPSAwOyBibG9ja19udW0gPD0gbGFzdF9ibG9ja19jb2x1bW47IGJsb2NrX251bSsrKSB7Ci0JLyogRmV0Y2ggY3VycmVudCBEQ1QgYmxvY2sgaW50byB3b3Jrc3BhY2Ugc28gd2UgY2FuIG1vZGlmeSBpdC4gKi8KLQlqY29weV9ibG9ja19yb3coYnVmZmVyX3B0ciwgKEpCTE9DS1JPVykgd29ya3NwYWNlLCAoSkRJTUVOU0lPTikgMSk7Ci0JLyogVXBkYXRlIERDIHZhbHVlcyAqLwotCWlmIChibG9ja19udW0gPCBsYXN0X2Jsb2NrX2NvbHVtbikgewotCSAgREMzID0gKGludCkgcHJldl9ibG9ja19yb3dbMV1bMF07Ci0JICBEQzYgPSAoaW50KSBidWZmZXJfcHRyWzFdWzBdOwotCSAgREM5ID0gKGludCkgbmV4dF9ibG9ja19yb3dbMV1bMF07Ci0JfQotCS8qIENvbXB1dGUgY29lZmZpY2llbnQgZXN0aW1hdGVzIHBlciBLLjguCi0JICogQW4gZXN0aW1hdGUgaXMgYXBwbGllZCBvbmx5IGlmIGNvZWZmaWNpZW50IGlzIHN0aWxsIHplcm8sCi0JICogYW5kIGlzIG5vdCBrbm93biB0byBiZSBmdWxseSBhY2N1cmF0ZS4KLQkgKi8KLQkvKiBBQzAxICovCi0JaWYgKChBbD1jb2VmX2JpdHNbMV0pICE9IDAgJiYgd29ya3NwYWNlWzFdID09IDApIHsKLQkgIG51bSA9IDM2ICogUTAwICogKERDNCAtIERDNik7Ci0JICBpZiAobnVtID49IDApIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEwMTw8NykgKyBudW0pIC8gKFEwMTw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgfSBlbHNlIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEwMTw8NykgLSBudW0pIC8gKFEwMTw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgICBwcmVkID0gLXByZWQ7Ci0JICB9Ci0JICB3b3Jrc3BhY2VbMV0gPSAoSkNPRUYpIHByZWQ7Ci0JfQotCS8qIEFDMTAgKi8KLQlpZiAoKEFsPWNvZWZfYml0c1syXSkgIT0gMCAmJiB3b3Jrc3BhY2VbOF0gPT0gMCkgewotCSAgbnVtID0gMzYgKiBRMDAgKiAoREMyIC0gREM4KTsKLQkgIGlmIChudW0gPj0gMCkgewotCSAgICBwcmVkID0gKGludCkgKCgoUTEwPDw3KSArIG51bSkgLyAoUTEwPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICB9IGVsc2UgewotCSAgICBwcmVkID0gKGludCkgKCgoUTEwPDw3KSAtIG51bSkgLyAoUTEwPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICAgIHByZWQgPSAtcHJlZDsKLQkgIH0KLQkgIHdvcmtzcGFjZVs4XSA9IChKQ09FRikgcHJlZDsKLQl9Ci0JLyogQUMyMCAqLwotCWlmICgoQWw9Y29lZl9iaXRzWzNdKSAhPSAwICYmIHdvcmtzcGFjZVsxNl0gPT0gMCkgewotCSAgbnVtID0gOSAqIFEwMCAqIChEQzIgKyBEQzggLSAyKkRDNSk7Ci0JICBpZiAobnVtID49IDApIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEyMDw8NykgKyBudW0pIC8gKFEyMDw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgfSBlbHNlIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEyMDw8NykgLSBudW0pIC8gKFEyMDw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgICBwcmVkID0gLXByZWQ7Ci0JICB9Ci0JICB3b3Jrc3BhY2VbMTZdID0gKEpDT0VGKSBwcmVkOwotCX0KLQkvKiBBQzExICovCi0JaWYgKChBbD1jb2VmX2JpdHNbNF0pICE9IDAgJiYgd29ya3NwYWNlWzldID09IDApIHsKLQkgIG51bSA9IDUgKiBRMDAgKiAoREMxIC0gREMzIC0gREM3ICsgREM5KTsKLQkgIGlmIChudW0gPj0gMCkgewotCSAgICBwcmVkID0gKGludCkgKCgoUTExPDw3KSArIG51bSkgLyAoUTExPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICB9IGVsc2UgewotCSAgICBwcmVkID0gKGludCkgKCgoUTExPDw3KSAtIG51bSkgLyAoUTExPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICAgIHByZWQgPSAtcHJlZDsKLQkgIH0KLQkgIHdvcmtzcGFjZVs5XSA9IChKQ09FRikgcHJlZDsKLQl9Ci0JLyogQUMwMiAqLwotCWlmICgoQWw9Y29lZl9iaXRzWzVdKSAhPSAwICYmIHdvcmtzcGFjZVsyXSA9PSAwKSB7Ci0JICBudW0gPSA5ICogUTAwICogKERDNCArIERDNiAtIDIqREM1KTsKLQkgIGlmIChudW0gPj0gMCkgewotCSAgICBwcmVkID0gKGludCkgKCgoUTAyPDw3KSArIG51bSkgLyAoUTAyPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICB9IGVsc2UgewotCSAgICBwcmVkID0gKGludCkgKCgoUTAyPDw3KSAtIG51bSkgLyAoUTAyPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICAgIHByZWQgPSAtcHJlZDsKLQkgIH0KLQkgIHdvcmtzcGFjZVsyXSA9IChKQ09FRikgcHJlZDsKLQl9Ci0JLyogT0ssIGRvIHRoZSBJRENUICovCi0JKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLCAoSkNPRUZQVFIpIHdvcmtzcGFjZSwKLQkJCW91dHB1dF9wdHIsIG91dHB1dF9jb2wpOwotCS8qIEFkdmFuY2UgZm9yIG5leHQgY29sdW1uICovCi0JREMxID0gREMyOyBEQzIgPSBEQzM7Ci0JREM0ID0gREM1OyBEQzUgPSBEQzY7Ci0JREM3ID0gREM4OyBEQzggPSBEQzk7Ci0JYnVmZmVyX3B0cisrLCBwcmV2X2Jsb2NrX3JvdysrLCBuZXh0X2Jsb2NrX3JvdysrOwotCW91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotICAgICAgfQotICAgICAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCsrKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykKLSAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOwotICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKLX0KLQotI2VuZGlmIC8qIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2RfY29lZl9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWY7Ci0KLSAgY29lZiA9IChteV9jb2VmX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9jb2VmX2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPmNvZWYgPSAoc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgKikgY29lZjsKLSAgY29lZi0+cHViLnN0YXJ0X2lucHV0X3Bhc3MgPSBzdGFydF9pbnB1dF9wYXNzOwotICBjb2VmLT5wdWIuc3RhcnRfb3V0cHV0X3Bhc3MgPSBzdGFydF9vdXRwdXRfcGFzczsKLSAgY29lZi0+cHViLmNvbHVtbl9sZWZ0X2JvdW5kYXJ5ID0gMDsKLSAgY29lZi0+cHViLmNvbHVtbl9yaWdodF9ib3VuZGFyeSA9IDA7Ci0gIGNvZWYtPnB1Yi5NQ1VfY29sdW1uc190b19za2lwID0gMDsKLSNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi0gIGNvZWYtPmNvZWZfYml0c19sYXRjaCA9IE5VTEw7Ci0jZW5kaWYKLQotI2lmZGVmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKLSAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSkgewotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotICAgICAgLyogQWxsb2NhdGUgb25lIGlNQ1Ugcm93IHZpcnR1YWwgYXJyYXksIGNvZWYtPndob2xlX2ltYWdlW2NpXSwKLSAgICAgICAqIGZvciBlYWNoIGNvbG9yIGNvbXBvbmVudCwgcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2YgaF9zYW1wX2ZhY3RvcgotICAgICAgICogRENUIGJsb2NrcyBpbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24uCi0gICAgICAgKi8KLSAgICAgIGludCBjaSwgYWNjZXNzX3Jvd3M7Ci0gICAgICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gICAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSAgIGNpKyssIGNvbXBwdHIrKykgewotICAgICAgICBhY2Nlc3Nfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgICAgIGNvZWYtPndob2xlX2ltYWdlW2NpXSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKLQkgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIFRSVUUsCi0JICAgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKLQkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgLy8gb25lIGlNQ1Ugcm93Ci0JICAgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzKTsKLSAgICAgIH0KLSAgICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGFfYnVpbGRfaHVmZm1hbl9pbmRleCA9Ci0gICAgICAgICAgICBjb25zdW1lX2RhdGFfYnVpbGRfaHVmZm1hbl9pbmRleF9wcm9ncmVzc2l2ZTsKLSAgICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGEgPSBjb25zdW1lX2RhdGFfbXVsdGlfc2NhbjsKLSAgICAgIGNvZWYtPnB1Yi5jb2VmX2FycmF5cyA9IGNvZWYtPndob2xlX2ltYWdlOyAvKiBsaW5rIHRvIHZpcnR1YWwgYXJyYXlzICovCi0gICAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19vbmVwYXNzOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBXZSBvbmx5IG5lZWQgYSBzaW5nbGUtTUNVIGJ1ZmZlci4gKi8KLSAgICAgIEpCTE9DS1JPVyBidWZmZXI7Ci0gICAgICBpbnQgaTsKLQotICAgICAgYnVmZmVyID0gKEpCTE9DS1JPVykKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBEX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOwotICAgICAgZm9yIChpID0gMDsgaSA8IERfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgewotICAgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2ldID0gYnVmZmVyICsgaTsKLSAgICAgIH0KLSAgICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGFfYnVpbGRfaHVmZm1hbl9pbmRleCA9Ci0gICAgICAgICAgICBjb25zdW1lX2RhdGFfYnVpbGRfaHVmZm1hbl9pbmRleF9iYXNlbGluZTsKLSAgICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGEgPSBkdW1teV9jb25zdW1lX2RhdGE7Ci0gICAgICBjb2VmLT5wdWIuY29lZl9hcnJheXMgPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLwotICAgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3Nfb25lcGFzczsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0jZW5kaWYKLQotICAvKiBDcmVhdGUgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlci4gKi8KLSAgaWYgKG5lZWRfZnVsbF9idWZmZXIpIHsKLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgICAvKiBBbGxvY2F0ZSBhIGZ1bGwtaW1hZ2UgdmlydHVhbCBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQsICovCi0gICAgLyogcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2Ygc2FtcF9mYWN0b3IgRENUIGJsb2NrcyBpbiBlYWNoIGRpcmVjdGlvbi4gKi8KLSAgICAvKiBOb3RlIHdlIGFzayBmb3IgYSBwcmUtemVyb2VkIGFycmF5LiAqLwotICAgIGludCBjaSwgYWNjZXNzX3Jvd3M7Ci0gICAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0JIGNpKyssIGNvbXBwdHIrKykgewotICAgICAgYWNjZXNzX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKLSAgICAgIC8qIElmIGJsb2NrIHNtb290aGluZyBjb3VsZCBiZSB1c2VkLCBuZWVkIGEgYmlnZ2VyIHdpbmRvdyAqLwotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQotCWFjY2Vzc19yb3dzICo9IDM7Ci0jZW5kaWYKLSAgICAgIGNvZWYtPndob2xlX2ltYWdlW2NpXSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBUUlVFLAotCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MsCi0JCQkJKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAotCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzKTsKLSAgICB9Ci0gICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YSA9IGNvbnN1bWVfZGF0YTsKLSAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19kYXRhOwotICAgIGNvZWYtPnB1Yi5jb2VmX2FycmF5cyA9IGNvZWYtPndob2xlX2ltYWdlOyAvKiBsaW5rIHRvIHZpcnR1YWwgYXJyYXlzICovCi0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIC8qIFdlIG9ubHkgbmVlZCBhIHNpbmdsZS1NQ1UgYnVmZmVyLiAqLwotICAgIEpCTE9DS1JPVyBidWZmZXI7Ci0gICAgaW50IGk7Ci0KLSAgICBidWZmZXIgPSAoSkJMT0NLUk9XKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJICBEX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOwotICAgIGZvciAoaSA9IDA7IGkgPCBEX01BWF9CTE9DS1NfSU5fTUNVOyBpKyspIHsKLSAgICAgIGNvZWYtPk1DVV9idWZmZXJbaV0gPSBidWZmZXIgKyBpOwotICAgIH0KLSAgICBjb2VmLT5wdWIuY29uc3VtZV9kYXRhID0gZHVtbXlfY29uc3VtZV9kYXRhOwotICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX29uZXBhc3M7Ci0gICAgY29lZi0+cHViLmNvZWZfYXJyYXlzID0gTlVMTDsgLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRjb2xvci5jIGIvbGlianBlZ3R3cnAvamRjb2xvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTY1MTllLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pkY29sb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDk3NiArMCwwIEBACi0vKgotICogamRjb2xvci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIG91dHB1dCBjb2xvcnNwYWNlIGNvbnZlcnNpb24gcm91dGluZXMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFByaXZhdGUgc3RhdGUgZm9yIFlDQy0+UkdCIGNvbnZlcnNpb24gKi8KLSAgaW50ICogQ3Jfcl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gUiBjb252ZXJzaW9uICovCi0gIGludCAqIENiX2JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEIgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENyX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIEcgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENiX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEcgY29udmVyc2lvbiAqLwotfSBteV9jb2xvcl9kZWNvbnZlcnRlcjsKLQotdHlwZWRlZiBteV9jb2xvcl9kZWNvbnZlcnRlciAqIG15X2Njb252ZXJ0X3B0cjsKLQotCi0jaWZkZWYgQU5EUk9JRF9SR0IKLQotLyogRGVjbGFyYXRpb25zIGZvciBvcmRlcmVkIGRpdGhlcmluZy4KLSAqIAotICogV2UgdXNlIDR4NCBvcmRlcmVkIGRpdGhlciBhcnJheSBwYWNrZWQgaW50byAzMiBiaXRzLiBUaGlzIGFycmF5IGlzCi0gKiBzdWZmaWNlbnQgZm9yIGRpdGhlcmluZyBSR0JfODg4IHRvIFJHQl81NjUuCi0gKi8KLQotI2RlZmluZSBESVRIRVJfTUFTSyAgICAgICAgIDB4MwotI2RlZmluZSBESVRIRVJfUk9UQVRFKHgpICAgICgoKHgpPDwyNCkgfCAoKCh4KT4+OCkmMHgwMEZGRkZGRikpCi1zdGF0aWMgY29uc3QgSU5UMzIgZGl0aGVyX21hdHJpeFs0XSA9IHsKLSAgMHgwMDA4MDIwQSwKLSAgMHgwQzA0MEUwNiwKLSAgMHgwMzBCMDEwOSwKLSAgMHgwRjA3MEQwNQotfTsKLQotI2VuZGlmCi0KLQotLyoqKioqKioqKioqKioqKiogWUNiQ3IgLT4gUkdCIGNvbnZlcnNpb246IG1vc3QgY29tbW9uIGNhc2UgKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBZQ2JDciBpcyBkZWZpbmVkIHBlciBDQ0lSIDYwMS0xLCBleGNlcHQgdGhhdCBDYiBhbmQgQ3IgYXJlCi0gKiBub3JtYWxpemVkIHRvIHRoZSByYW5nZSAwLi5NQVhKU0FNUExFIHJhdGhlciB0aGFuIC0wLjUgLi4gMC41LgotICogVGhlIGNvbnZlcnNpb24gZXF1YXRpb25zIHRvIGJlIGltcGxlbWVudGVkIGFyZSB0aGVyZWZvcmUKLSAqCVIgPSBZICAgICAgICAgICAgICAgICsgMS40MDIwMCAqIENyCi0gKglHID0gWSAtIDAuMzQ0MTQgKiBDYiAtIDAuNzE0MTQgKiBDcgotICoJQiA9IFkgKyAxLjc3MjAwICogQ2IKLSAqIHdoZXJlIENiIGFuZCBDciByZXByZXNlbnQgdGhlIGluY29taW5nIHZhbHVlcyBsZXNzIENFTlRFUkpTQU1QTEUuCi0gKiAoVGhlc2UgbnVtYmVycyBhcmUgZGVyaXZlZCBmcm9tIFRJRkYgNi4wIHNlY3Rpb24gMjEsIGRhdGVkIDMtSnVuZS05Mi4pCi0gKgotICogVG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYywgd2UgcmVwcmVzZW50IHRoZSBmcmFjdGlvbmFsIGNvbnN0YW50cwotICogYXMgaW50ZWdlcnMgc2NhbGVkIHVwIGJ5IDJeMTYgKGFib3V0IDQgZGlnaXRzIHByZWNpc2lvbik7IHdlIGhhdmUgdG8gZGl2aWRlCi0gKiB0aGUgcHJvZHVjdHMgYnkgMl4xNiwgd2l0aCBhcHByb3ByaWF0ZSByb3VuZGluZywgdG8gZ2V0IHRoZSBjb3JyZWN0IGFuc3dlci4KLSAqIE5vdGljZSB0aGF0IFksIGJlaW5nIGFuIGludGVncmFsIGlucHV0LCBkb2VzIG5vdCBjb250cmlidXRlIGFueSBmcmFjdGlvbgotICogc28gaXQgbmVlZCBub3QgcGFydGljaXBhdGUgaW4gdGhlIHJvdW5kaW5nLgotICoKLSAqIEZvciBldmVuIG1vcmUgc3BlZWQsIHdlIGF2b2lkIGRvaW5nIGFueSBtdWx0aXBsaWNhdGlvbnMgaW4gdGhlIGlubmVyIGxvb3AKLSAqIGJ5IHByZWNhbGN1bGF0aW5nIHRoZSBjb25zdGFudHMgdGltZXMgQ2IgYW5kIENyIGZvciBhbGwgcG9zc2libGUgdmFsdWVzLgotICogRm9yIDgtYml0IEpTQU1QTEVzIHRoaXMgaXMgdmVyeSByZWFzb25hYmxlIChvbmx5IDI1NiBlbnRyaWVzIHBlciB0YWJsZSk7Ci0gKiBmb3IgMTItYml0IHNhbXBsZXMgaXQgaXMgc3RpbGwgYWNjZXB0YWJsZS4gIEl0J3Mgbm90IHZlcnkgcmVhc29uYWJsZSBmb3IKLSAqIDE2LWJpdCBzYW1wbGVzLCBidXQgaWYgeW91IHdhbnQgbG9zc2xlc3Mgc3RvcmFnZSB5b3Ugc2hvdWxkbid0IGJlIGNoYW5naW5nCi0gKiBjb2xvcnNwYWNlIGFueXdheS4KLSAqIFRoZSBDcj0+UiBhbmQgQ2I9PkIgdmFsdWVzIGNhbiBiZSByb3VuZGVkIHRvIGludGVnZXJzIGluIGFkdmFuY2U7IHRoZQotICogdmFsdWVzIGZvciB0aGUgRyBjYWxjdWxhdGlvbiBhcmUgbGVmdCBzY2FsZWQgdXAsIHNpbmNlIHdlIG11c3QgYWRkIHRoZW0KLSAqIHRvZ2V0aGVyIGJlZm9yZSByb3VuZGluZy4KLSAqLwotCi0jZGVmaW5lIFNDQUxFQklUUwkxNgkvKiBzcGVlZGllc3QgcmlnaHQtc2hpZnQgb24gc29tZSBtYWNoaW5lcyAqLwotI2RlZmluZSBPTkVfSEFMRgkoKElOVDMyKSAxIDw8IChTQ0FMRUJJVFMtMSkpCi0jZGVmaW5lIEZJWCh4KQkJKChJTlQzMikgKCh4KSAqICgxTDw8U0NBTEVCSVRTKSArIDAuNSkpCi0KLQotLyoKLSAqIEluaXRpYWxpemUgdGFibGVzIGZvciBZQ0MtPlJHQiBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCi0gKi8KLQotTE9DQUwodm9pZCkKLWJ1aWxkX3ljY19yZ2JfdGFibGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKLSAgaW50IGk7Ci0gIElOVDMyIHg7Ci0gIFNISUZUX1RFTVBTCi0KLSAgY2NvbnZlcnQtPkNyX3JfdGFiID0gKGludCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNQVhKU0FNUExFKzEpICogU0laRU9GKGludCkpOwotICBjY29udmVydC0+Q2JfYl90YWIgPSAoaW50ICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7Ci0gIGNjb252ZXJ0LT5Dcl9nX3RhYiA9IChJTlQzMiAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNQVhKU0FNUExFKzEpICogU0laRU9GKElOVDMyKSk7Ci0gIGNjb252ZXJ0LT5DYl9nX3RhYiA9IChJTlQzMiAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNQVhKU0FNUExFKzEpICogU0laRU9GKElOVDMyKSk7Ci0KLSAgZm9yIChpID0gMCwgeCA9IC1DRU5URVJKU0FNUExFOyBpIDw9IE1BWEpTQU1QTEU7IGkrKywgeCsrKSB7Ci0gICAgLyogaSBpcyB0aGUgYWN0dWFsIGlucHV0IHBpeGVsIHZhbHVlLCBpbiB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSAqLwotICAgIC8qIFRoZSBDYiBvciBDciB2YWx1ZSB3ZSBhcmUgdGhpbmtpbmcgb2YgaXMgeCA9IGkgLSBDRU5URVJKU0FNUExFICovCi0gICAgLyogQ3I9PlIgdmFsdWUgaXMgbmVhcmVzdCBpbnQgdG8gMS40MDIwMCAqIHggKi8KLSAgICBjY29udmVydC0+Q3Jfcl90YWJbaV0gPSAoaW50KQotICAgICAgICAgICAgICAgICAgICBSSUdIVF9TSElGVChGSVgoMS40MDIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7Ci0gICAgLyogQ2I9PkIgdmFsdWUgaXMgbmVhcmVzdCBpbnQgdG8gMS43NzIwMCAqIHggKi8KLSAgICBjY29udmVydC0+Q2JfYl90YWJbaV0gPSAoaW50KQotICAgICAgICAgICAgICAgICAgICBSSUdIVF9TSElGVChGSVgoMS43NzIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7Ci0gICAgLyogQ3I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjcxNDE0ICogeCAqLwotICAgIGNjb252ZXJ0LT5Dcl9nX3RhYltpXSA9ICgtIEZJWCgwLjcxNDE0KSkgKiB4OwotICAgIC8qIENiPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC4zNDQxNCAqIHggKi8KLSAgICAvKiBXZSBhbHNvIGFkZCBpbiBPTkVfSEFMRiBzbyB0aGF0IG5lZWQgbm90IGRvIGl0IGluIGlubmVyIGxvb3AgKi8KLSAgICBjY29udmVydC0+Q2JfZ190YWJbaV0gPSAoLSBGSVgoMC4zNDQxNCkpICogeCArIE9ORV9IQUxGOwotICB9Ci0jaWZkZWYgTkVFRFNfQVJNX0VSUkFUQV83NTQzMTlfNzU0MzIwCi0gIGFzbSB2b2xhdGlsZSAoICJ2bW92IHMwLHMwXG4iICk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBjb2xvcnNwYWNlLgotICoKLSAqIE5vdGUgdGhhdCB3ZSBjaGFuZ2UgZnJvbSBub25pbnRlcmxlYXZlZCwgb25lLXBsYW5lLXBlci1jb21wb25lbnQgZm9ybWF0Ci0gKiB0byBpbnRlcmxlYXZlZC1waXhlbCBmb3JtYXQuICBUaGUgb3V0cHV0IGJ1ZmZlciBpcyB0aGVyZWZvcmUgdGhyZWUgdGltZXMKLSAqIGFzIHdpZGUgYXMgdGhlIGlucHV0IGJ1ZmZlci4KLSAqIEEgc3RhcnRpbmcgcm93IG9mZnNldCBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUgaW5wdXQgYnVmZmVyLiAgVGhlIGNhbGxlcgotICogY2FuIGVhc2lseSBhZGp1c3QgdGhlIHBhc3NlZCBvdXRwdXRfYnVmIHZhbHVlIHRvIGFjY29tbW9kYXRlIGFueSByb3cKLSAqIG9mZnNldCByZXF1aXJlZCBvbiB0aGF0IHNpZGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi15Y2NfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLSNpZmRlZiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNCi0vKgotICogQ29udmVydHMgWUNDLT5SR0I4ODggdXNpbmcgVmVOdW0gaW5zdHJ1Y3Rpb25zLgotICovCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKLSAgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKLSAgSlNBTVBST1cgb3V0cHRyOwotICBKRElNRU5TSU9OIHJvdzsKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IChKRElNRU5TSU9OKW51bV9yb3dzOyByb3crKykKLSAgewotICAgIGlucHRyMCAgICAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKLSAgICBpbnB0cjEgICAgID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIyICAgICA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOwotCi0gICAgaW5wdXRfcm93Kys7Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLQotICAgIHl2dXAyYmdyODg4X3ZlbnVtKChVSU5UOCopIGlucHRyMCwKLSAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjIsCi0gICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIxLAotICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIG91dHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICBjaW5mby0+b3V0cHV0X3dpZHRoKTsKLSAgfQotfQotI2Vsc2UKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLwotICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7Ci0gIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7Ci0gIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOwotICBTSElGVF9URU1QUwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKLSAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKLSAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKLSAgICBpbnB1dF9yb3crKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICB5ICA9IEdFVEpTQU1QTEUoaW5wdHIwW2NvbF0pOwotICAgICAgY2IgPSBHRVRKU0FNUExFKGlucHRyMVtjb2xdKTsKLSAgICAgIGNyID0gR0VUSlNBTVBMRShpbnB0cjJbY29sXSk7Ci0gICAgICAvKiBSYW5nZS1saW1pdGluZyBpcyBlc3NlbnRpYWwgZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgRENUIGxvc3Nlcy4gKi8KLSAgICAgIG91dHB0cltSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOwotICAgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRUJJVFMpKV07Ci0gICAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKLSAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOwotICAgIH0KLSAgfQotfQotI2VuZGlmIC8qIEFORFJPSURfSlBFR19VU0VfVkVOVU0gKi8KLQotI2lmZGVmIEFORFJPSURfUkdCCi1NRVRIT0RERUYodm9pZCkKLXljY19yZ2JhXzg4ODhfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLSAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotI2lmZGVmIEFORFJPSURfSlBFR19VU0VfVkVOVU0KLS8qCi0gKiBDb252ZXJ0cyBZQ0MtPlJHQkE4ODg4IHVzaW5nIFZlTnVtIGluc3RydWN0aW9ucy4KLSAqLwotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpTQU1QUk9XIG91dHB0cjsKLSAgSkRJTUVOU0lPTiByb3c7Ci0KLSAgZm9yIChyb3cgPSAwOyByb3cgPCAoSkRJTUVOU0lPTiludW1fcm93czsgcm93KyspCi0gIHsKLSAgICBpbnB0cjAgICAgID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIxICAgICA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMiAgICAgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKLSAgICBpbnB1dF9yb3crKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotCi0gICAgeXZ1cDJhYmdyODg4OF92ZW51bSgoVUlOVDgqKSBpbnB0cjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBvdXRwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaW5mby0+b3V0cHV0X3dpZHRoKTsKLSAgfQotfQotCi0jZWxzZQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIHJlZ2lzdGVyIGludCB5LCBjYiwgY3I7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKLSAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOwotICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOwotICAgIGlucHV0X3JvdysrOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKLSAgICAgIHkgID0gR0VUSlNBTVBMRShpbnB0cjBbY29sXSk7Ci0gICAgICBjYiA9IEdFVEpTQU1QTEUoaW5wdHIxW2NvbF0pOwotICAgICAgY3IgPSBHRVRKU0FNUExFKGlucHRyMltjb2xdKTsKLSAgICAgIC8qIFJhbmdlLWxpbWl0aW5nIGlzIGVzc2VudGlhbCBkdWUgdG8gbm9pc2UgaW50cm9kdWNlZCBieSBEQ1QgbG9zc2VzLiAqLwotICAgICAgb3V0cHRyW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgQ3JydGFiW2NyXV07Ci0gICAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFQklUUykpXTsKLSAgICAgIG91dHB0cltSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIENiYnRhYltjYl1dOwotICAgICAgb3V0cHRyW1JHQl9BTFBIQV0gPSAgMHhGRjsKLSAgICAgIG91dHB0ciArPSA0OwotICAgIH0KLSAgfQotfQotI2VuZGlmIC8qIEFORFJPSURfSlBFR19VU0VfVkVOVU0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi15Y2NfcmdiXzU2NV9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi0jaWYgZGVmaW5lZChBTkRST0lEX0pQRUdfVVNFX1ZFTlVNKQotLyoKLSAqIENvbnZlcnRzIFlDQy0+UkdCNTY1IHVzaW5nIFZlTnVtIGluc3RydWN0aW9ucy4KLSAqLwotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpTQU1QUk9XIG91dHB0cjsKLSAgSkRJTUVOU0lPTiByb3c7Ci0KLSAgZm9yIChyb3cgPSAwOyByb3cgPCAoSkRJTUVOU0lPTiludW1fcm93czsgcm93KyspCi0gIHsKLSAgICBpbnB0cjAgICAgID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIxICAgICA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMiAgICAgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKLSAgICBpbnB1dF9yb3crKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotCi0gICAgeXZ1cDJyZ2I1NjVfdmVudW0oKFVJTlQ4KikgaW5wdHIwLAotICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIGlucHRyMiwKLSAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4Kikgb3V0cHRyLAotICAgICAgICAgICAgICAgICAgICAgIGNpbmZvLT5vdXRwdXRfd2lkdGgpOwotICB9Ci19Ci0jZWxzZQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIHJlZ2lzdGVyIGludCB5LCBjYiwgY3I7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKLSAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOwotICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIElOVDMyIHJnYjsKLSAgICB1bnNpZ25lZCBpbnQgciwgZywgYjsKLSAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKLSAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKLSAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKLSAgICBpbnB1dF9yb3crKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIAotICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKLSAgICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKLSAgICAgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBDcnJ0YWJbY3JdXTsKLSAgICAgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpXTsKLSAgICAgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKLSAgICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7Ci0gICAgICAgIG91dHB0ciArPSAyOwotICAgICAgICBudW1fY29scy0tOwotICAgIH0KLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChudW1fY29scz4+MSk7IGNvbCsrKSB7Ci0gICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKLSAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7Ci0gICAgICByID0gcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOwotICAgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpXTsKLSAgICAgIGIgPSByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07Ci0gICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0KLSAgICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOwotICAgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKLSAgICAgIHIgPSByYW5nZV9saW1pdFt5ICsgQ3JydGFiW2NyXV07Ci0gICAgICBnID0gcmFuZ2VfbGltaXRbeSArICgoaW50KVJJR0hUX1NISUZUKENiZ3RhYltjYl0rQ3JndGFiW2NyXSwgU0NBTEVCSVRTKSldOwotICAgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKLSAgICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7Ci0gICAgICBXUklURV9UV09fQUxJR05FRF9QSVhFTFMob3V0cHRyLCByZ2IpOwotICAgICAgb3V0cHRyICs9IDQ7Ci0gICAgfQotICAgIGlmIChudW1fY29scyYxKSB7Ci0gICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCk7Ci0gICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7Ci0gICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7Ci0gICAgICByID0gcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOwotICAgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpXTsKLSAgICAgIGIgPSByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07Ci0gICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7Ci0gICAgfQotICB9Ci19Ci0jZW5kaWYgLyogQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXljY19yZ2JfNTY1RF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKLSAgcmVnaXN0ZXIgaW50IHksIGNiLCBjcjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KLSAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKLSAgcmVnaXN0ZXIgaW50ICogQ3JydGFiID0gY2NvbnZlcnQtPkNyX3JfdGFiOwotICByZWdpc3RlciBpbnQgKiBDYmJ0YWIgPSBjY29udmVydC0+Q2JfYl90YWI7Ci0gIHJlZ2lzdGVyIElOVDMyICogQ3JndGFiID0gY2NvbnZlcnQtPkNyX2dfdGFiOwotICByZWdpc3RlciBJTlQzMiAqIENiZ3RhYiA9IGNjb252ZXJ0LT5DYl9nX3RhYjsKLSAgSU5UMzIgZDAgPSBkaXRoZXJfbWF0cml4W2NpbmZvLT5vdXRwdXRfc2NhbmxpbmUgJiBESVRIRVJfTUFTS107Ci0gIFNISUZUX1RFTVBTCi0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIElOVDMyIHJnYjsKLSAgICB1bnNpZ25lZCBpbnQgciwgZywgYjsKLSAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKLSAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKLSAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKLSAgICBpbnB1dF9yb3crKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKLSAgICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKLSAgICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgQ3JydGFiW2NyXSwgZDApXTsKLSAgICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKSwgZDApXTsKLSAgICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgQ2JidGFiW2NiXSwgZDApXTsKLSAgICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7Ci0gICAgICAgIG91dHB0ciArPSAyOwotICAgICAgICBudW1fY29scy0tOwotICAgIH0KLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChudW1fY29scz4+MSk7IGNvbCsrKSB7Ci0gICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKLSAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7Ci0gICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBDcnJ0YWJbY3JdLCBkMCldOwotICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKSwgZDApXTsKLSAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIENiYnRhYltjYl0sIGQwKV07Ci0gICAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOwotICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLSAgICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgQ3JydGFiW2NyXSwgZDApXTsKLSAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArICgoaW50KVJJR0hUX1NISUZUKENiZ3RhYltjYl0rQ3JndGFiW2NyXSwgU0NBTEVCSVRTKSksIGQwKV07Ci0gICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBDYmJ0YWJbY2JdLCBkMCldOwotICAgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKLSAgICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7Ci0gICAgICBXUklURV9UV09fQUxJR05FRF9QSVhFTFMob3V0cHRyLCByZ2IpOwotICAgICAgb3V0cHRyICs9IDQ7Ci0gICAgfQotICAgIGlmIChudW1fY29scyYxKSB7Ci0gICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCk7Ci0gICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7Ci0gICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7Ci0gICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBDcnJ0YWJbY3JdLCBkMCldOwotICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKSwgZDApXTsKLSAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIENiYnRhYltjYl0sIGQwKV07Ci0gICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7Ci0gICAgfQotICB9Ci19Ci0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKiBDYXNlcyBvdGhlciB0aGFuIFlDYkNyIC0+IFJHQihBKSAqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEFORFJPSURfUkdCCi1NRVRIT0RERUYodm9pZCkKLXJnYl9yZ2JhXzg4ODhfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLSAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgU0hJRlRfVEVNUFMKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107Ci0gICAgaW5wdXRfcm93Kys7Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgewotICAgICAgKm91dHB0cisrID0gKmlucHRyMCsrOwotICAgICAgKm91dHB0cisrID0gKmlucHRyMSsrOwotICAgICAgKm91dHB0cisrID0gKmlucHRyMisrOwotICAgICAgKm91dHB0cisrID0gMHhGRjsKLSAgICB9Ci0gIH0KLX0KLQotTUVUSE9EREVGKHZvaWQpCi1yZ2JfcmdiXzU2NV9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotICBTSElGVF9URU1QUwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBJTlQzMiByZ2I7Ci0gICAgdW5zaWduZWQgaW50IHIsIGcsIGI7Ci0gICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107Ci0gICAgaW5wdXRfcm93Kys7Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLSAgICBpZiAoUEFDS19ORUVEX0FMSUdOTUVOVChvdXRwdHIpKSB7Ci0gICAgICAgIHIgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgICAgIGcgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgICAgIGIgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7Ci0gICAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOwotICAgICAgICBvdXRwdHIgKz0gMjsKLSAgICAgICAgbnVtX2NvbHMtLTsKLSAgICB9Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCAobnVtX2NvbHM+PjEpOyBjb2wrKykgewotICAgICAgciA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKLSAgICAgIGcgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgICBiID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgICAgciA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKLSAgICAgIGcgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgICBiID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKLSAgICAgIFdSSVRFX1RXT19BTElHTkVEX1BJWEVMUyhvdXRwdHIsIHJnYik7Ci0gICAgICBvdXRwdHIgKz0gNDsKLSAgICB9Ci0gICAgaWYgKG51bV9jb2xzJjEpIHsKLSAgICAgIHIgPSBHRVRKU0FNUExFKCppbnB0cjApOwotICAgICAgZyA9IEdFVEpTQU1QTEUoKmlucHRyMSk7Ci0gICAgICBiID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKLSAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKLSAgICB9Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXJnYl9yZ2JfNTY1RF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotICBJTlQzMiBkMCA9IGRpdGhlcl9tYXRyaXhbY2luZm8tPm91dHB1dF9zY2FubGluZSAmIERJVEhFUl9NQVNLXTsKLSAgU0hJRlRfVEVNUFMKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgSU5UMzIgcmdiOwotICAgIHVuc2lnbmVkIGludCByLCBnLCBiOwotICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOwotICAgIGlucHV0X3JvdysrOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7Ci0gICAgaWYgKFBBQ0tfTkVFRF9BTElHTk1FTlQob3V0cHRyKSkgewotICAgICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKEdFVEpTQU1QTEUoKmlucHRyMCsrKSwgZDApXTsKLSAgICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyhHRVRKU0FNUExFKCppbnB0cjErKyksIGQwKV07Ci0gICAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoR0VUSlNBTVBMRSgqaW5wdHIyKyspLCBkMCldOwotICAgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKLSAgICAgICAgb3V0cHRyICs9IDI7Ci0gICAgICAgIG51bV9jb2xzLS07Ci0gICAgfQotICAgIGZvciAoY29sID0gMDsgY29sIDwgKG51bV9jb2xzPj4xKTsgY29sKyspIHsKLSAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoR0VUSlNBTVBMRSgqaW5wdHIwKyspLCBkMCldOwotICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyhHRVRKU0FNUExFKCppbnB0cjErKyksIGQwKV07Ci0gICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKEdFVEpTQU1QTEUoKmlucHRyMisrKSwgZDApXTsKLSAgICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7Ci0gICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKEdFVEpTQU1QTEUoKmlucHRyMCsrKSwgZDApXTsKLSAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coR0VUSlNBTVBMRSgqaW5wdHIxKyspLCBkMCldOwotICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQihHRVRKU0FNUExFKCppbnB0cjIrKyksIGQwKV07Ci0gICAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOwotICAgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKLSAgICAgIFdSSVRFX1RXT19BTElHTkVEX1BJWEVMUyhvdXRwdHIsIHJnYik7Ci0gICAgICBvdXRwdHIgKz0gNDsKLSAgICB9Ci0gICAgaWYgKG51bV9jb2xzJjEpIHsKLSAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoR0VUSlNBTVBMRSgqaW5wdHIwKSwgZDApXTsKLSAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coR0VUSlNBTVBMRSgqaW5wdHIxKSwgZDApXTsKLSAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoR0VUSlNBTVBMRSgqaW5wdHIyKSwgZDApXTsKLSAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKLSAgICB9Ci0gIH0KLX0KLQotI2VuZGlmCi0KLS8qCi0gKiBDb2xvciBjb252ZXJzaW9uIGZvciBubyBjb2xvcnNwYWNlIGNoYW5nZToganVzdCBjb3B5IHRoZSBkYXRhLAotICogY29udmVydGluZyBmcm9tIHNlcGFyYXRlLXBsYW5lcyB0byBpbnRlcmxlYXZlZCByZXByZXNlbnRhdGlvbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW51bGxfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0JICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY291bnQ7Ci0gIHJlZ2lzdGVyIGludCBudW1fY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIGludCBjaTsKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgbnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICAgIGlucHRyID0gaW5wdXRfYnVmW2NpXVtpbnB1dF9yb3ddOwotICAgICAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXSArIGNpOwotICAgICAgZm9yIChjb3VudCA9IG51bV9jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKLQkqb3V0cHRyID0gKmlucHRyKys7CS8qIG5lZWRuJ3QgYm90aGVyIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KLQlvdXRwdHIgKz0gbnVtX2NvbXBvbmVudHM7Ci0gICAgICB9Ci0gICAgfQotICAgIGlucHV0X3JvdysrOwotICAgIG91dHB1dF9idWYrKzsKLSAgfQotfQotCi0KLS8qCi0gKiBDb2xvciBjb252ZXJzaW9uIGZvciBncmF5c2NhbGU6IGp1c3QgY29weSB0aGUgZGF0YS4KLSAqIFRoaXMgYWxzbyB3b3JrcyBmb3IgWUNiQ3IgLT4gZ3JheXNjYWxlIGNvbnZlcnNpb24sIGluIHdoaWNoCi0gKiB3ZSBqdXN0IGNvcHkgdGhlIFkgKGx1bWluYW5jZSkgY29tcG9uZW50IGFuZCBpZ25vcmUgY2hyb21pbmFuY2UuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1ncmF5c2NhbGVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLXsKLSAgamNvcHlfc2FtcGxlX3Jvd3MoaW5wdXRfYnVmWzBdLCAoaW50KSBpbnB1dF9yb3csIG91dHB1dF9idWYsIDAsCi0JCSAgICBudW1fcm93cywgY2luZm8tPm91dHB1dF93aWR0aCk7Ci19Ci0KLQotLyoKLSAqIENvbnZlcnQgZ3JheXNjYWxlIHRvIFJHQjoganVzdCBkdXBsaWNhdGUgdGhlIGdyYXlsZXZlbCB0aHJlZSB0aW1lcy4KLSAqIFRoaXMgaXMgcHJvdmlkZWQgdG8gc3VwcG9ydCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IHRvIGNvcGUKLSAqIHdpdGggZ3JheXNjYWxlIGFzIGEgc2VwYXJhdGUgY2FzZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWdyYXlfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCQkgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyID0gaW5wdXRfYnVmWzBdW2lucHV0X3JvdysrXTsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICAvKiBXZSBjYW4gZGlzcGVuc2Ugd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgb3V0cHRyW1JHQl9SRURdID0gb3V0cHRyW1JHQl9HUkVFTl0gPSBvdXRwdHJbUkdCX0JMVUVdID0gaW5wdHJbY29sXTsKLSAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOwotICAgIH0KLSAgfQotfQotCi0jaWZkZWYgQU5EUk9JRF9SR0IKLU1FVEhPRERFRih2b2lkKQotZ3JheV9yZ2JhXzg4ODhfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0gICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgaW5wdHIgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93KytdOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKLSAgICAgIC8qIFdlIGNhbiBkaXNwZW5zZSB3aXRoIEdFVEpTQU1QTEUoKSBoZXJlICovCi0gICAgICBvdXRwdHJbUkdCX1JFRF0gPSBvdXRwdHJbUkdCX0dSRUVOXSA9IG91dHB0cltSR0JfQkxVRV0gPSBpbnB0cltjb2xdOwotICAgICAgb3V0cHRyW1JHQl9BTFBIQV0gPSAweGZmOwotICAgICAgb3V0cHRyICs9IDQ7Ci0gICAgfQotICB9Ci19Ci0KLU1FVEhPRERFRih2b2lkKQotZ3JheV9yZ2JfNTY1X2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIElOVDMyIHJnYjsKLSAgICB1bnNpZ25lZCBpbnQgZzsKLSAgICBpbnB0ciA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3crK107Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLSAgICBpZiAoUEFDS19ORUVEX0FMSUdOTUVOVChvdXRwdHIpKSB7Ci0gICAgICAgIGcgPSAqaW5wdHIrKzsKLSAgICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUoZywgZywgZyk7Ci0gICAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKLSAgICAgICAgb3V0cHRyICs9IDI7Ci0gICAgICAgIG51bV9jb2xzLS07Ci0gICAgfQotICAgIGZvciAoY29sID0gMDsgY29sIDwgKG51bV9jb2xzPj4xKTsgY29sKyspIHsKLSAgICAgIGcgPSAqaW5wdHIrKzsKLSAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpOwotICAgICAgZyA9ICppbnB0cisrOwotICAgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUoZywgZywgZykpOwotICAgICAgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKG91dHB0ciwgcmdiKTsKLSAgICAgIG91dHB0ciArPSA0OwotICAgIH0KLSAgICBpZiAobnVtX2NvbHMmMSkgewotICAgICAgZyA9ICppbnB0cjsKLSAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpOwotICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOwotICAgIH0KLSAgfQotfQotCi1NRVRIT0RERUYodm9pZCkKLWdyYXlfcmdiXzU2NURfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0gICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgSU5UMzIgZDAgPSBkaXRoZXJfbWF0cml4W2NpbmZvLT5vdXRwdXRfc2NhbmxpbmUgJiBESVRIRVJfTUFTS107Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIElOVDMyIHJnYjsKLSAgICB1bnNpZ25lZCBpbnQgZzsKLSAgICBpbnB0ciA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3crK107Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLSAgICBpZiAoUEFDS19ORUVEX0FMSUdOTUVOVChvdXRwdHIpKSB7Ci0gICAgICAgIGcgPSAqaW5wdHIrKzsKLSAgICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihnLCBkMCldOwotICAgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKTsKLSAgICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOwotICAgICAgICBvdXRwdHIgKz0gMjsKLSAgICAgICAgbnVtX2NvbHMtLTsKLSAgICB9Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCAobnVtX2NvbHM+PjEpOyBjb2wrKykgewotICAgICAgZyA9ICppbnB0cisrOwotICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihnLCBkMCldOwotICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUoZywgZywgZyk7Ci0gICAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOwotICAgICAgZyA9ICppbnB0cisrOwotICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihnLCBkMCldOwotICAgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUoZywgZywgZykpOwotICAgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKLSAgICAgIFdSSVRFX1RXT19BTElHTkVEX1BJWEVMUyhvdXRwdHIsIHJnYik7Ci0gICAgICBvdXRwdHIgKz0gNDsKLSAgICB9Ci0gICAgaWYgKG51bV9jb2xzJjEpIHsKLSAgICAgIGcgPSAqaW5wdHI7Ci0gICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKGcsIGQwKV07Ci0gICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKTsKLSAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKLSAgICB9Ci0gIH0KLX0KLSNlbmRpZgotCi0vKgotICogQWRvYmUtc3R5bGUgWUNDSy0+Q01ZSyBjb252ZXJzaW9uLgotICogV2UgY29udmVydCBZQ2JDciB0byBSPTEtQywgRz0xLU0sIGFuZCBCPTEtWSB1c2luZyB0aGUgc2FtZQotICogY29udmVyc2lvbiBhcyBhYm92ZSwgd2hpbGUgcGFzc2luZyBLIChibGFjaykgdW5jaGFuZ2VkLgotICogV2UgYXNzdW1lIGJ1aWxkX3ljY19yZ2JfdGFibGUgaGFzIGJlZW4gY2FsbGVkLgotICovCi0KLU1FVEhPRERFRih2b2lkKQoteWNja19jbXlrX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLQkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKLSAgcmVnaXN0ZXIgaW50IHksIGNiLCBjcjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyLCBpbnB0cjM7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLwotICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7Ci0gIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7Ci0gIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOwotICBTSElGVF9URU1QUwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKLSAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKLSAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKLSAgICBpbnB0cjMgPSBpbnB1dF9idWZbM11baW5wdXRfcm93XTsKLSAgICBpbnB1dF9yb3crKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICB5ICA9IEdFVEpTQU1QTEUoaW5wdHIwW2NvbF0pOwotICAgICAgY2IgPSBHRVRKU0FNUExFKGlucHRyMVtjb2xdKTsKLSAgICAgIGNyID0gR0VUSlNBTVBMRShpbnB0cjJbY29sXSk7Ci0gICAgICAvKiBSYW5nZS1saW1pdGluZyBpcyBlc3NlbnRpYWwgZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgRENUIGxvc3Nlcy4gKi8KLSAgICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0W01BWEpTQU1QTEUgLSAoeSArIENycnRhYltjcl0pXTsgICAvKiByZWQgKi8KLSAgICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0W01BWEpTQU1QTEUgLSAoeSArICAgICAgICAgICAgICAgICAvKiBncmVlbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFQklUUykpKV07Ci0gICAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFtNQVhKU0FNUExFIC0gKHkgKyBDYmJ0YWJbY2JdKV07ICAgLyogYmx1ZSAqLwotICAgICAgLyogSyBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQgKi8KLSAgICAgIG91dHB0clszXSA9IGlucHRyM1tjb2xdOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUgaGVyZSAqLwotICAgICAgb3V0cHRyICs9IDQ7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIEVtcHR5IG1ldGhvZCBmb3Igc3RhcnRfcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfZGNvbG9yIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBubyB3b3JrIG5lZWRlZCAqLwotfQotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3Igb3V0cHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbi4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NvbG9yX2RlY29udmVydGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQ7Ci0gIGludCBjaTsKLQotICBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfY29sb3JfZGVjb252ZXJ0ZXIpKTsKLSAgY2luZm8tPmNjb252ZXJ0ID0gKHN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyICopIGNjb252ZXJ0OwotICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2Rjb2xvcjsKLQotICAvKiBNYWtlIHN1cmUgbnVtX2NvbXBvbmVudHMgYWdyZWVzIHdpdGgganBlZ19jb2xvcl9zcGFjZSAqLwotICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7Ci0gIGNhc2UgSkNTX0dSQVlTQ0FMRToKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDEpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX1JHQjoKLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19DTVlLOgotICBjYXNlIEpDU19ZQ0NLOgotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gNCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoJCQkvKiBKQ1NfVU5LTk9XTiBjYW4gYmUgYW55dGhpbmcgKi8KLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzIDwgMSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBTZXQgb3V0X2NvbG9yX2NvbXBvbmVudHMgYW5kIGNvbnZlcnNpb24gbWV0aG9kIGJhc2VkIG9uIHJlcXVlc3RlZCBzcGFjZS4KLSAgICogQWxzbyBjbGVhciB0aGUgY29tcG9uZW50X25lZWRlZCBmbGFncyBmb3IgYW55IHVudXNlZCBjb21wb25lbnRzLAotICAgKiBzbyB0aGF0IGVhcmxpZXIgcGlwZWxpbmUgc3RhZ2VzIGNhbiBhdm9pZCB1c2VsZXNzIGNvbXB1dGF0aW9uLgotICAgKi8KLQotICBzd2l0Y2ggKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UpIHsKLSAgY2FzZSBKQ1NfR1JBWVNDQUxFOgotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDE7Ci0gICAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUgfHwKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlzY2FsZV9jb252ZXJ0OwotICAgICAgLyogRm9yIGNvbG9yLT5ncmF5c2NhbGUgY29udmVyc2lvbiwgb25seSB0aGUgWSAoMCkgY29tcG9uZW50IGlzIG5lZWRlZCAqLwotICAgICAgZm9yIChjaSA9IDE7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKQotCWNpbmZvLT5jb21wX2luZm9bY2ldLmNvbXBvbmVudF9uZWVkZWQgPSBGQUxTRTsKLSAgICB9IGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19SR0I6Ci0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gUkdCX1BJWEVMU0laRTsKLSAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSB5Y2NfcmdiX2NvbnZlcnQ7Ci0jaWZuZGVmIEFORFJPSURfSlBFR19VU0VfVkVOVU0KLSAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOwotI2VuZGlmCi0gICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5X3JnYl9jb252ZXJ0OwotICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQiAmJiBSR0JfUElYRUxTSVpFID09IDMpIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICB9IGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBicmVhazsKLQotI2lmZGVmIEFORFJPSURfUkdCCi0gIGNhc2UgSkNTX1JHQkFfODg4ODoKLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSA0OwotICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY19yZ2JhXzg4ODhfY29udmVydDsKLSAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOwotICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgewotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheV9yZ2JhXzg4ODhfY29udmVydDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHJnYl9yZ2JhXzg4ODhfY29udmVydDsKLSAgICB9IGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19SR0JfNTY1OgotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IFJHQl9QSVhFTFNJWkU7Ci0gICAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX05PTkUpIHsKLSAgICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKLSAgICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNjX3JnYl81NjVfY29udmVydDsKLSNpZiAhZGVmaW5lZChBTkRST0lEX0pQRUdfVVNFX1ZFTlVNKQotICAgICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKLSNlbmRpZiAvKiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNICovCi0gICAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKLSAgICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheV9yZ2JfNTY1X2NvbnZlcnQ7Ci0gICAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLSAgICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gcmdiX3JnYl81NjVfY29udmVydDsKLSAgICAgIH0gZWxzZQotICAgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIG9ubHkgb3JkZXJlZCBkaXRoZXIgaXMgc3VwcG9ydGVkICovCi0gICAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7Ci0jaWYgZGVmaW5lZChBTkRST0lEX0pQRUdfVVNFX1ZFTlVNKQotICAgICAgICAvKiBVc2UgVmVOdW0gcm91dGluZSBldmVuIGlmIGRpdGhlcmluZyBvcHRpb24gaXMgc2VsZWN0ZWQuICovCi0gICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY19yZ2JfNTY1X2NvbnZlcnQ7Ci0jZWxzZQotICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSB5Y2NfcmdiXzU2NURfY29udmVydDsKLSAgICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7Ci0jZW5kaWYgLyogQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSAqLwotICAgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7Ci0gICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlfcmdiXzU2NURfY29udmVydDsKLSAgICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgewotICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfcmdiXzU2NURfY29udmVydDsKLSAgICAgIH0gZWxzZQotICAgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgfQotICAgIGJyZWFrOwotI2VuZGlmCi0gICAgCi0gIGNhc2UgSkNTX0NNWUs6Ci0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gNDsKLSAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDQ0spIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY2tfY215a19jb252ZXJ0OwotICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7Ci0gICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykgewotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OwotICAgIH0gZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgLyogUGVybWl0IG51bGwgY29udmVyc2lvbiB0byBzYW1lIG91dHB1dCBzcGFjZSAqLwotICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7Ci0gICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7Ci0gICAgfSBlbHNlCQkJLyogdW5zdXBwb3J0ZWQgbm9uLW51bGwgY29udmVyc2lvbiAqLwotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCi0gICAgY2luZm8tPm91dHB1dF9jb21wb25lbnRzID0gMTsgLyogc2luZ2xlIGNvbG9ybWFwcGVkIG91dHB1dCBjb21wb25lbnQgKi8KLSAgZWxzZQotICAgIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkY3QuaCBiL2xpYmpwZWd0d3JwL2pkY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOTJhMi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZGN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqIGpkY3QuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBpbmNsdWRlIGZpbGUgY29udGFpbnMgY29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGZvcndhcmQgYW5kCi0gKiBpbnZlcnNlIERDVCBtb2R1bGVzLiAgVGhlc2UgZGVjbGFyYXRpb25zIGFyZSBwcml2YXRlIHRvIHRoZSBEQ1QgbWFuYWdlcnMKLSAqIChqY2RjdG1nci5jLCBqZGRjdG1nci5jKSBhbmQgdGhlIGluZGl2aWR1YWwgRENUIGFsZ29yaXRobXMuCi0gKiBUaGUgaW5kaXZpZHVhbCBEQ1QgYWxnb3JpdGhtcyBhcmUga2VwdCBpbiBzZXBhcmF0ZSBmaWxlcyB0byBlYXNlIAotICogbWFjaGluZS1kZXBlbmRlbnQgdHVuaW5nIChlLmcuLCBhc3NlbWJseSBjb2RpbmcpLgotICovCi0KLQotLyoKLSAqIEEgZm9yd2FyZCBEQ1Qgcm91dGluZSBpcyBnaXZlbiBhIHBvaW50ZXIgdG8gYSB3b3JrIGFyZWEgb2YgdHlwZSBEQ1RFTEVNW107Ci0gKiB0aGUgRENUIGlzIHRvIGJlIHBlcmZvcm1lZCBpbi1wbGFjZSBpbiB0aGF0IGJ1ZmZlci4gIFR5cGUgRENURUxFTSBpcyBpbnQKLSAqIGZvciA4LWJpdCBzYW1wbGVzLCBJTlQzMiBmb3IgMTItYml0IHNhbXBsZXMuICAoTk9URTogRmxvYXRpbmctcG9pbnQgRENUCi0gKiBpbXBsZW1lbnRhdGlvbnMgdXNlIGFuIGFycmF5IG9mIHR5cGUgRkFTVF9GTE9BVCwgaW5zdGVhZC4pCi0gKiBUaGUgRENUIGlucHV0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgc2lnbmVkIChyYW5nZSArLUNFTlRFUkpTQU1QTEUpLgotICogVGhlIERDVCBvdXRwdXRzIGFyZSByZXR1cm5lZCBzY2FsZWQgdXAgYnkgYSBmYWN0b3Igb2YgODsgdGhleSB0aGVyZWZvcmUKLSAqIGhhdmUgYSByYW5nZSBvZiArLThLIGZvciA4LWJpdCBkYXRhLCArLTEyOEsgZm9yIDEyLWJpdCBkYXRhLiAgVGhpcwotICogY29udmVudGlvbiBpbXByb3ZlcyBhY2N1cmFjeSBpbiBpbnRlZ2VyIGltcGxlbWVudGF0aW9ucyBhbmQgc2F2ZXMgc29tZQotICogd29yayBpbiBmbG9hdGluZy1wb2ludCBvbmVzLgotICogUXVhbnRpemF0aW9uIG9mIHRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGlzIGRvbmUgYnkgamNkY3RtZ3IuYy4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLXR5cGVkZWYgaW50IERDVEVMRU07CQkvKiAxNiBvciAzMiBiaXRzIGlzIGZpbmUgKi8KLSNlbHNlCi10eXBlZGVmIElOVDMyIERDVEVMRU07CQkvKiBtdXN0IGhhdmUgMzIgYml0cyAqLwotI2VuZGlmCi0KLXR5cGVkZWYgSk1FVEhPRCh2b2lkLCBmb3J3YXJkX0RDVF9tZXRob2RfcHRyLCAoRENURUxFTSAqIGRhdGEpKTsKLXR5cGVkZWYgSk1FVEhPRCh2b2lkLCBmbG9hdF9EQ1RfbWV0aG9kX3B0ciwgKEZBU1RfRkxPQVQgKiBkYXRhKSk7Ci0KLQotLyoKLSAqIEFuIGludmVyc2UgRENUIHJvdXRpbmUgaXMgZ2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBpbnB1dCBKQkxPQ0sgYW5kIGEgcG9pbnRlcgotICogdG8gYW4gb3V0cHV0IHNhbXBsZSBhcnJheS4gIFRoZSByb3V0aW5lIG11c3QgZGVxdWFudGl6ZSB0aGUgaW5wdXQgZGF0YSBhcwotICogd2VsbCBhcyBwZXJmb3JtIHRoZSBJRENUOyBmb3IgZGVxdWFudGl6YXRpb24sIGl0IHVzZXMgdGhlIG11bHRpcGxpZXIgdGFibGUKLSAqIHBvaW50ZWQgdG8gYnkgY29tcHB0ci0+ZGN0X3RhYmxlLiAgVGhlIG91dHB1dCBkYXRhIGlzIHRvIGJlIHBsYWNlZCBpbnRvIHRoZQotICogc2FtcGxlIGFycmF5IHN0YXJ0aW5nIGF0IGEgc3BlY2lmaWVkIGNvbHVtbi4gIChBbnkgcm93IG9mZnNldCBuZWVkZWQgd2lsbAotICogYmUgYXBwbGllZCB0byB0aGUgYXJyYXkgcG9pbnRlciBiZWZvcmUgaXQgaXMgcGFzc2VkIHRvIHRoZSBJRENUIGNvZGUuKQotICogTm90ZSB0aGF0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBlbWl0dGVkIGJ5IHRoZSBJRENUIHJvdXRpbmUgaXMKLSAqIERDVF9zY2FsZWRfc2l6ZSAqIERDVF9zY2FsZWRfc2l6ZS4KLSAqLwotCi0vKiB0eXBlZGVmIGludmVyc2VfRENUX21ldGhvZF9wdHIgaXMgZGVjbGFyZWQgaW4ganBlZ2ludC5oICovCi0KLS8qCi0gKiBFYWNoIElEQ1Qgcm91dGluZSBoYXMgaXRzIG93biBpZGVhcyBhYm91dCB0aGUgYmVzdCBkY3RfdGFibGUgZWxlbWVudCB0eXBlLgotICovCi0KLXR5cGVkZWYgTVVMVElQTElFUiBJU0xPV19NVUxUX1RZUEU7IC8qIHNob3J0IG9yIGludCwgd2hpY2hldmVyIGlzIGZhc3RlciAqLwotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci10eXBlZGVmIE1VTFRJUExJRVIgSUZBU1RfTVVMVF9UWVBFOyAvKiAxNiBiaXRzIGlzIE9LLCB1c2Ugc2hvcnQgaWYgZmFzdGVyICovCi0jZGVmaW5lIElGQVNUX1NDQUxFX0JJVFMgIDIJLyogZnJhY3Rpb25hbCBiaXRzIGluIHNjYWxlIGZhY3RvcnMgKi8KLSNlbHNlCi10eXBlZGVmIElOVDMyIElGQVNUX01VTFRfVFlQRTsJLyogbmVlZCAzMiBiaXRzIGZvciBzY2FsZWQgcXVhbnRpemVycyAqLwotI2RlZmluZSBJRkFTVF9TQ0FMRV9CSVRTICAxMwkvKiBmcmFjdGlvbmFsIGJpdHMgaW4gc2NhbGUgZmFjdG9ycyAqLwotI2VuZGlmCi10eXBlZGVmIEZBU1RfRkxPQVQgRkxPQVRfTVVMVF9UWVBFOyAvKiBwcmVmZXJyZWQgZmxvYXRpbmcgdHlwZSAqLwotCi0KLS8qCi0gKiBFYWNoIElEQ1Qgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgcmFuZ2UtbGltaXRpbmcgaXRzIHJlc3VsdHMgYW5kCi0gKiBjb252ZXJ0aW5nIHRoZW0gdG8gdW5zaWduZWQgZm9ybSAoMC4uTUFYSlNBTVBMRSkuICBUaGUgcmF3IG91dHB1dHMgY291bGQKLSAqIGJlIHF1aXRlIGZhciBvdXQgb2YgcmFuZ2UgaWYgdGhlIGlucHV0IGRhdGEgaXMgY29ycnVwdCwgc28gYSBidWxsZXRwcm9vZgotICogcmFuZ2UtbGltaXRpbmcgc3RlcCBpcyByZXF1aXJlZC4gIFdlIHVzZSBhIG1hc2stYW5kLXRhYmxlLWxvb2t1cCBtZXRob2QKLSAqIHRvIGRvIHRoZSBjb21iaW5lZCBvcGVyYXRpb25zIHF1aWNrbHkuICBTZWUgdGhlIGNvbW1lbnRzIHdpdGgKLSAqIHByZXBhcmVfcmFuZ2VfbGltaXRfdGFibGUgKGluIGpkbWFzdGVyLmMpIGZvciBtb3JlIGluZm8uCi0gKi8KLQotI2RlZmluZSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKSAgKChjaW5mbyktPnNhbXBsZV9yYW5nZV9saW1pdCArIENFTlRFUkpTQU1QTEUpCi0KLSNkZWZpbmUgUkFOR0VfTUFTSyAgKE1BWEpTQU1QTEUgKiA0ICsgMykgLyogMiBiaXRzIHdpZGVyIHRoYW4gbGVnYWwgc2FtcGxlcyAqLwotCi0KLS8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLwotCi0jaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI2RlZmluZSBqcGVnX2ZkY3RfaXNsb3cJCWpGRGlzbG93Ci0jZGVmaW5lIGpwZWdfZmRjdF9pZmFzdAkJakZEaWZhc3QKLSNkZWZpbmUganBlZ19mZGN0X2Zsb2F0CQlqRkRmbG9hdAotI2RlZmluZSBqcGVnX2lkY3RfaXNsb3cJCWpSRGlzbG93Ci0jZGVmaW5lIGpwZWdfaWRjdF9pZmFzdAkJalJEaWZhc3QKLSNkZWZpbmUganBlZ19pZGN0X2Zsb2F0CQlqUkRmbG9hdAotI2RlZmluZSBqcGVnX2lkY3RfNHg0CQlqUkQ0eDQKLSNkZWZpbmUganBlZ19pZGN0XzJ4MgkJalJEMngyCi0jZGVmaW5lIGpwZWdfaWRjdF8xeDEJCWpSRDF4MQotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotLyogRXh0ZXJuIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGZvcndhcmQgYW5kIGludmVyc2UgRENUIHJvdXRpbmVzLiAqLwotCi1FWFRFUk4odm9pZCkganBlZ19mZGN0X2lzbG93IEpQUCgoRENURUxFTSAqIGRhdGEpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2ZkY3RfaWZhc3QgSlBQKChEQ1RFTEVNICogZGF0YSkpOwotRVhURVJOKHZvaWQpIGpwZWdfZmRjdF9mbG9hdCBKUFAoKEZBU1RfRkxPQVQgKiBkYXRhKSk7Ci0KLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfaXNsb3cKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOwotRVhURVJOKHZvaWQpIGpwZWdfaWRjdF9pZmFzdAotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci1FWFRFUk4odm9pZCkganBlZ19pZGN0X2Zsb2F0Ci0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfNHg0Ci0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfMngyCi0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfMXgxCi0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKLQotCi0vKgotICogTWFjcm9zIGZvciBoYW5kbGluZyBmaXhlZC1wb2ludCBhcml0aG1ldGljOyB0aGVzZSBhcmUgdXNlZCBieSBtYW55Ci0gKiBidXQgbm90IGFsbCBvZiB0aGUgRENUL0lEQ1QgbW9kdWxlcy4KLSAqCi0gKiBBbGwgdmFsdWVzIGFyZSBleHBlY3RlZCB0byBiZSBvZiB0eXBlIElOVDMyLgotICogRnJhY3Rpb25hbCBjb25zdGFudHMgYXJlIHNjYWxlZCBsZWZ0IGJ5IENPTlNUX0JJVFMgYml0cy4KLSAqIENPTlNUX0JJVFMgaXMgZGVmaW5lZCB3aXRoaW4gZWFjaCBtb2R1bGUgdXNpbmcgdGhlc2UgbWFjcm9zLAotICogYW5kIG1heSBkaWZmZXIgZnJvbSBvbmUgbW9kdWxlIHRvIHRoZSBuZXh0LgotICovCi0KLSNkZWZpbmUgT05FCSgoSU5UMzIpIDEpCi0jZGVmaW5lIENPTlNUX1NDQUxFIChPTkUgPDwgQ09OU1RfQklUUykKLQotLyogQ29udmVydCBhIHBvc2l0aXZlIHJlYWwgY29uc3RhbnQgdG8gYW4gaW50ZWdlciBzY2FsZWQgYnkgQ09OU1RfU0NBTEUuCi0gKiBDYXV0aW9uOiBzb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsCi0gKiB0aHVzIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgotICovCi0KLSNkZWZpbmUgRklYKHgpCSgoSU5UMzIpICgoeCkgKiBDT05TVF9TQ0FMRSArIDAuNSkpCi0KLS8qIERlc2NhbGUgYW5kIGNvcnJlY3RseSByb3VuZCBhbiBJTlQzMiB2YWx1ZSB0aGF0J3Mgc2NhbGVkIGJ5IE4gYml0cy4KLSAqIFdlIGFzc3VtZSBSSUdIVF9TSElGVCByb3VuZHMgdG93YXJkcyBtaW51cyBpbmZpbml0eSwgc28gYWRkaW5nCi0gKiB0aGUgZnVkZ2UgZmFjdG9yIGlzIGNvcnJlY3QgZm9yIGVpdGhlciBzaWduIG9mIFguCi0gKi8KLQotI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKCh4KSArIChPTkUgPDwgKChuKS0xKSksIG4pCi0KLS8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KLSAqIFRoaXMgbWFjcm8gaXMgdXNlZCBvbmx5IHdoZW4gdGhlIHR3byBpbnB1dHMgd2lsbCBhY3R1YWxseSBiZSBubyBtb3JlIHRoYW4KLSAqIDE2IGJpdHMgd2lkZSwgc28gdGhhdCBhIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhCi0gKiBmdWxsIDMyeDMyIG11bHRpcGx5LiAgVGhpcyBwcm92aWRlcyBhIHVzZWZ1bCBzcGVlZHVwIG9uIG1hbnkgbWFjaGluZXMuCi0gKiBVbmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZ5IGEgMTZ4MTYtPjMyIG11bHRpcGx5IHBvcnRhYmx5Ci0gKiBpbiBDLCBidXQgc29tZSBDIGNvbXBpbGVycyB3aWxsIGRvIHRoZSByaWdodCB0aGluZyBpZiB5b3UgcHJvdmlkZSB0aGUKLSAqIGNvcnJlY3QgY29tYmluYXRpb24gb2YgY2FzdHMuCi0gKi8KLQotI2lmZGVmIFNIT1JUeFNIT1JUXzMyCQkvKiBtYXkgd29yayBpZiAnaW50JyBpcyAzMiBiaXRzICovCi0jZGVmaW5lIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KSAgKCgoSU5UMTYpICh2YXIpKSAqICgoSU5UMTYpIChjb25zdCkpKQotI2VuZGlmCi0jaWZkZWYgU0hPUlR4TENPTlNUXzMyCQkvKiBrbm93biB0byB3b3JrIHdpdGggTWljcm9zb2Z0IEMgNi4wICovCi0jZGVmaW5lIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KSAgKCgoSU5UMTYpICh2YXIpKSAqICgoSU5UMzIpIChjb25zdCkpKQotI2VuZGlmCi0KLSNpZm5kZWYgTVVMVElQTFkxNkMxNgkJLyogZGVmYXVsdCBkZWZpbml0aW9uICovCi0jZGVmaW5lIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKLSNlbmRpZgotCi0vKiBTYW1lIGV4Y2VwdCBib3RoIGlucHV0cyBhcmUgdmFyaWFibGVzLiAqLwotCi0jaWZkZWYgU0hPUlR4U0hPUlRfMzIJCS8qIG1heSB3b3JrIGlmICdpbnQnIGlzIDMyIGJpdHMgKi8KLSNkZWZpbmUgTVVMVElQTFkxNlYxNih2YXIxLHZhcjIpICAoKChJTlQxNikgKHZhcjEpKSAqICgoSU5UMTYpICh2YXIyKSkpCi0jZW5kaWYKLQotI2lmbmRlZiBNVUxUSVBMWTE2VjE2CQkvKiBkZWZhdWx0IGRlZmluaXRpb24gKi8KLSNkZWZpbmUgTVVMVElQTFkxNlYxNih2YXIxLHZhcjIpICAoKHZhcjEpICogKHZhcjIpKQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZGRjdG1nci5jIGIvbGlianBlZ3R3cnAvamRkY3RtZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0YmZhNy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZGRjdG1nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qCi0gKiBqZGRjdG1nci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbnZlcnNlLURDVCBtYW5hZ2VtZW50IGxvZ2ljLgotICogVGhpcyBjb2RlIHNlbGVjdHMgYSBwYXJ0aWN1bGFyIElEQ1QgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCwKLSAqIGFuZCBpdCBwZXJmb3JtcyByZWxhdGVkIGhvdXNla2VlcGluZyBjaG9yZXMuICBObyBjb2RlIGluIHRoaXMgZmlsZQotICogaXMgZXhlY3V0ZWQgcGVyIElEQ1Qgc3RlcCwgb25seSBkdXJpbmcgb3V0cHV0IHBhc3Mgc2V0dXAuCi0gKgotICogTm90ZSB0aGF0IHRoZSBJRENUIHJvdXRpbmVzIGFyZSByZXNwb25zaWJsZSBmb3IgcGVyZm9ybWluZyBjb2VmZmljaWVudAotICogZGVxdWFudGl6YXRpb24gYXMgd2VsbCBhcyB0aGUgSURDVCBwcm9wZXIuICBUaGlzIG1vZHVsZSBzZXRzIHVwIHRoZQotICogZGVxdWFudGl6YXRpb24gbXVsdGlwbGllciB0YWJsZSBuZWVkZWQgYnkgdGhlIElEQ1Qgcm91dGluZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotI2lmZGVmIEFORFJPSURfQVJNVjZfSURDVAotICAjdW5kZWYgQU5EUk9JRF9BUk1WNl9JRENUCi0gICNpZmRlZiBfX2FybV9fCi0gICAgI2luY2x1ZGUgPG1hY2hpbmUvY3B1LWZlYXR1cmVzLmg+Ci0gICAgI2lmIF9fQVJNX0FSQ0hfXyA+PSA2Ci0gICAgICAjZGVmaW5lIEFORFJPSURfQVJNVjZfSURDVAotICAgICNlbHNlCi0gICAgICAjd2FybmluZyAiQU5EUk9JRF9BUk1WNl9JRENUIGlzIGRpc2FibGVkIgotICAgICNlbmRpZgotICAjZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgQU5EUk9JRF9BUk1WNl9JRENUCi0KLS8qIEludGVudGlvbmFsbHkgZGVjbGFyZSB0aGUgcHJvdG90eXBlIHdpdGggYXJndW1lbnRzIG9mIHByaW1pdGl2ZSB0eXBlcyBpbnN0ZWFkCi0gKiBvZiB0eXBlLWRlZmluZWQgb25lcy4gVGhpcyB3aWxsIGF0IGxlYXN0IGdlbmVyYXRlIHNvbWUgd2FybmluZ3MgaWYgam1vcmVjZmcuaAotICogaXMgY2hhbmdlZCBhbmQgYmVjb21lcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYXNzZW1ibHkgY29kZS4KLSAqLwotZXh0ZXJuIHZvaWQgYXJtdjZfaWRjdChzaG9ydCAqY29lZnMsIGludCAqcXVhbnMsIHVuc2lnbmVkIGNoYXIgKipyb3dzLCBpbnQgY29sKTsKLQotdm9pZCBqcGVnX2lkY3RfYXJtdjYgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKLQkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotewotICBJRkFTVF9NVUxUX1RZUEUgKmRjdF90YWJsZSA9IChJRkFTVF9NVUxUX1RZUEUgKiljb21wcHRyLT5kY3RfdGFibGU7Ci0gIGFybXY2X2lkY3QoY29lZl9ibG9jaywgZGN0X3RhYmxlLCBvdXRwdXRfYnVmLCBvdXRwdXRfY29sKTsKLX0KLQotI2VuZGlmCi0KLS8qCi0gKiBUaGUgZGVjb21wcmVzc29yIGlucHV0IHNpZGUgKGpkaW5wdXQuYykgc2F2ZXMgYXdheSB0aGUgYXBwcm9wcmlhdGUKLSAqIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgZWFjaCBjb21wb25lbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBzY2FuCi0gKiBpbnZvbHZpbmcgdGhhdCBjb21wb25lbnQuICAoVGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gY29ycmVjdGx5Ci0gKiBkZWNvZGUgZmlsZXMgdGhhdCByZXVzZSBRLXRhYmxlIHNsb3RzLikKLSAqIFdoZW4gd2UgYXJlIHJlYWR5IHRvIG1ha2UgYW4gb3V0cHV0IHBhc3MsIHRoZSBzYXZlZCBRLXRhYmxlIGlzIGNvbnZlcnRlZAotICogdG8gYSBtdWx0aXBsaWVyIHRhYmxlIHRoYXQgd2lsbCBhY3R1YWxseSBiZSB1c2VkIGJ5IHRoZSBJRENUIHJvdXRpbmUuCi0gKiBUaGUgbXVsdGlwbGllciB0YWJsZSBjb250ZW50cyBhcmUgSURDVC1tZXRob2QtZGVwZW5kZW50LiAgVG8gc3VwcG9ydAotICogYXBwbGljYXRpb24gY2hhbmdlcyBpbiBJRENUIG1ldGhvZCBiZXR3ZWVuIHNjYW5zLCB3ZSBjYW4gcmVtYWtlIHRoZQotICogbXVsdGlwbGllciB0YWJsZXMgaWYgbmVjZXNzYXJ5LgotICogSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgdGhlIGZpcnN0IG91dHB1dCBwYXNzIG1heSBvY2N1ciBiZWZvcmUgYW55IGRhdGEKLSAqIGhhcyBiZWVuIHNlZW4gZm9yIHNvbWUgY29tcG9uZW50cywgYW5kIHRodXMgYmVmb3JlIHRoZWlyIFEtdGFibGVzIGhhdmUKLSAqIGJlZW4gc2F2ZWQgYXdheS4gIFRvIGhhbmRsZSB0aGlzIGNhc2UsIG11bHRpcGxpZXIgdGFibGVzIGFyZSBwcmVzZXQKLSAqIHRvIHplcm9lczsgdGhlIHJlc3VsdCBvZiB0aGUgSURDVCB3aWxsIGJlIGEgbmV1dHJhbCBncmF5IGxldmVsLgotICovCi0KLQotLyogUHJpdmF0ZSBzdWJvYmplY3QgZm9yIHRoaXMgbW9kdWxlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogVGhpcyBhcnJheSBjb250YWlucyB0aGUgSURDVCBtZXRob2QgY29kZSB0aGF0IGVhY2ggbXVsdGlwbGllciB0YWJsZQotICAgKiBpcyBjdXJyZW50bHkgc2V0IHVwIGZvciwgb3IgLTEgaWYgaXQncyBub3QgeWV0IHNldCB1cC4KLSAgICogVGhlIGFjdHVhbCBtdWx0aXBsaWVyIHRhYmxlcyBhcmUgcG9pbnRlZCB0byBieSBkY3RfdGFibGUgaW4gdGhlCi0gICAqIHBlci1jb21wb25lbnQgY29tcF9pbmZvIHN0cnVjdHVyZXMuCi0gICAqLwotICBpbnQgY3VyX21ldGhvZFtNQVhfQ09NUE9ORU5UU107Ci19IG15X2lkY3RfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9pZGN0X2NvbnRyb2xsZXIgKiBteV9pZGN0X3B0cjsKLQotCi0vKiBBbGxvY2F0ZWQgbXVsdGlwbGllciB0YWJsZXM6IGJpZyBlbm91Z2ggZm9yIGFueSBzdXBwb3J0ZWQgdmFyaWFudCAqLwotCi10eXBlZGVmIHVuaW9uIHsKLSAgSVNMT1dfTVVMVF9UWVBFIGlzbG93X2FycmF5W0RDVFNJWkUyXTsKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gIElGQVNUX01VTFRfVFlQRSBpZmFzdF9hcnJheVtEQ1RTSVpFMl07Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gIEZMT0FUX01VTFRfVFlQRSBmbG9hdF9hcnJheVtEQ1RTSVpFMl07Ci0jZW5kaWYKLX0gbXVsdGlwbGllcl90YWJsZTsKLQotCi0vKiBUaGUgY3VycmVudCBzY2FsZWQtSURDVCByb3V0aW5lcyByZXF1aXJlIElTTE9XLXN0eWxlIG11bHRpcGxpZXIgdGFibGVzLAotICogc28gYmUgc3VyZSB0byBjb21waWxlIHRoYXQgY29kZSBpZiBlaXRoZXIgSVNMT1cgb3IgU0NBTElORyBpcyByZXF1ZXN0ZWQuCi0gKi8KLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0jZGVmaW5lIFBST1ZJREVfSVNMT1dfVEFCTEVTCi0jZWxzZQotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLSNkZWZpbmUgUFJPVklERV9JU0xPV19UQUJMRVMKLSNlbmRpZgotI2VuZGlmCi0KLQotLyoKLSAqIFByZXBhcmUgZm9yIGFuIG91dHB1dCBwYXNzLgotICogSGVyZSB3ZSBzZWxlY3QgdGhlIHByb3BlciBJRENUIHJvdXRpbmUgZm9yIGVhY2ggY29tcG9uZW50IGFuZCBidWlsZAotICogYSBtYXRjaGluZyBtdWx0aXBsaWVyIHRhYmxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfaWRjdF9wdHIgaWRjdCA9IChteV9pZGN0X3B0cikgY2luZm8tPmlkY3Q7Ci0gIGludCBjaSwgaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgaW50IG1ldGhvZCA9IDA7Ci0gIGludmVyc2VfRENUX21ldGhvZF9wdHIgbWV0aG9kX3B0ciA9IE5VTEw7Ci0gIEpRVUFOVF9UQkwgKiBxdGJsOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgLyogU2VsZWN0IHRoZSBwcm9wZXIgSURDVCByb3V0aW5lIGZvciB0aGlzIGNvbXBvbmVudCdzIHNjYWxpbmcgKi8KLSAgICBzd2l0Y2ggKGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgewotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLSAgICBjYXNlIDE6Ci0gICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzF4MTsKLSAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0cmVkIHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMngyOwotICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RyZWQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF80eDQ7Ci0gICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCi0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGNhc2UgRENUU0laRToKLSAgICAgIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKLSNpZmRlZiBBTkRST0lEX0FSTVY2X0lEQ1QKLSAgICAgIGNhc2UgSkRDVF9JU0xPVzoKLSAgICAgIGNhc2UgSkRDVF9JRkFTVDoKLQltZXRob2RfcHRyID0ganBlZ19pZGN0X2FybXY2OwotCW1ldGhvZCA9IEpEQ1RfSUZBU1Q7Ci0JYnJlYWs7Ci0jZWxzZSAvKiBBTkRST0lEX0FSTVY2X0lEQ1QgKi8KLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0gICAgICBjYXNlIEpEQ1RfSVNMT1c6Ci0JbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9pc2xvdzsKLQltZXRob2QgPSBKRENUX0lTTE9XOwotCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotICAgICAgY2FzZSBKRENUX0lGQVNUOgotI2lmZGVmIEFORFJPSURfSlBFR19VU0VfVkVOVU0KLSAgICAgICAgLyogVXNlIFZlTnVtIGltcGxlbWVudGF0aW9uIG9mIGpwZWdfaWRjdF9pc2xvdyBldmVuIGlmIGZhc3QgRENUIG9wdGlvbiBpcyBzZWxlY3RlZCAqLwotCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfaXNsb3c7Ci0JbWV0aG9kID0gSkRDVF9JU0xPVzsKLSNlbHNlCi0JbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9pZmFzdDsKLQltZXRob2QgPSBKRENUX0lGQVNUOwotI2VuZGlmIC8qIEFORFJPSURfSlBFR19VU0VfVkVOVU0gKi8KLQlicmVhazsKLSNlbmRpZgotI2VuZGlmIC8qIEFORFJPSURfQVJNVjZfSURDVCAqLwotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgICAgIGNhc2UgSkRDVF9GTE9BVDoKLQltZXRob2RfcHRyID0ganBlZ19pZGN0X2Zsb2F0OwotCW1ldGhvZCA9IEpEQ1RfRkxPQVQ7Ci0JYnJlYWs7Ci0jZW5kaWYKLSAgICAgIGRlZmF1bHQ6Ci0JRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotCWJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9EQ1RTSVpFLCBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlkY3QtPnB1Yi5pbnZlcnNlX0RDVFtjaV0gPSBtZXRob2RfcHRyOwotICAgIC8qIENyZWF0ZSBtdWx0aXBsaWVyIHRhYmxlIGZyb20gcXVhbnQgdGFibGUuCi0gICAgICogSG93ZXZlciwgd2UgY2FuIHNraXAgdGhpcyBpZiB0aGUgY29tcG9uZW50IGlzIHVuaW50ZXJlc3RpbmcKLSAgICAgKiBvciBpZiB3ZSBhbHJlYWR5IGJ1aWx0IHRoZSB0YWJsZS4gIEFsc28sIGlmIG5vIHF1YW50IHRhYmxlCi0gICAgICogaGFzIHlldCBiZWVuIHNhdmVkIGZvciB0aGUgY29tcG9uZW50LCB3ZSBsZWF2ZSB0aGUKLSAgICAgKiBtdWx0aXBsaWVyIHRhYmxlIGFsbC16ZXJvOyB3ZSdsbCBiZSByZWFkaW5nIHplcm9lcyBmcm9tIHRoZQotICAgICAqIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIncyBidWZmZXIgYW55d2F5LgotICAgICAqLwotICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQgfHwgaWRjdC0+Y3VyX21ldGhvZFtjaV0gPT0gbWV0aG9kKQotICAgICAgY29udGludWU7Ci0gICAgcXRibCA9IGNvbXBwdHItPnF1YW50X3RhYmxlOwotICAgIGlmIChxdGJsID09IE5VTEwpCQkvKiBoYXBwZW5zIGlmIG5vIGRhdGEgeWV0IGZvciBjb21wb25lbnQgKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIGlkY3QtPmN1cl9tZXRob2RbY2ldID0gbWV0aG9kOwotICAgIHN3aXRjaCAobWV0aG9kKSB7Ci0jaWZkZWYgUFJPVklERV9JU0xPV19UQUJMRVMKLSAgICBjYXNlIEpEQ1RfSVNMT1c6Ci0gICAgICB7Ci0JLyogRm9yIExMJk0gSURDVCBtZXRob2QsIG11bHRpcGxpZXJzIGFyZSBlcXVhbCB0byByYXcgcXVhbnRpemF0aW9uCi0JICogY29lZmZpY2llbnRzLCBidXQgYXJlIHN0b3JlZCBhcyBpbnRzIHRvIGVuc3VyZSBhY2Nlc3MgZWZmaWNpZW5jeS4KLQkgKi8KLQlJU0xPV19NVUxUX1RZUEUgKiBpc210YmwgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotCSAgaXNtdGJsW2ldID0gKElTTE9XX01VTFRfVFlQRSkgcXRibC0+cXVhbnR2YWxbaV07Ci0JfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gICAgY2FzZSBKRENUX0lGQVNUOgotICAgICAgewotCS8qIEZvciBBQSZOIElEQ1QgbWV0aG9kLCBtdWx0aXBsaWVycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCi0JICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCi0JICogICBzY2FsZWZhY3RvclswXSA9IDEKLQkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43Ci0JICogRm9yIGludGVnZXIgb3BlcmF0aW9uLCB0aGUgbXVsdGlwbGllciB0YWJsZSBpcyB0byBiZSBzY2FsZWQgYnkKLQkgKiBJRkFTVF9TQ0FMRV9CSVRTLgotCSAqLwotCUlGQVNUX01VTFRfVFlQRSAqIGlmbXRibCA9IChJRkFTVF9NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOwotI2lmZGVmIEFORFJPSURfQVJNVjZfSURDVAotCS8qIFByZWNvbXB1dGVkIHZhbHVlcyBzY2FsZWQgdXAgYnkgMTUgYml0cy4gKi8KLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2NhbGVzW0RDVFNJWkUyXSA9IHsKLQkgIDMyNzY4LCA0NTQ1MSwgNDI4MTMsIDM4NTMxLCAzMjc2OCwgMjU3NDYsIDE3NzM0LCAgOTA0MSwKLQkgIDQ1NDUxLCA2MzA0MiwgNTkzODQsIDUzNDQ0LCA0NTQ1MSwgMzU3MTAsIDI0NTk4LCAxMjU0MCwKLQkgIDQyODEzLCA1OTM4NCwgNTU5MzgsIDUwMzQzLCA0MjgxMywgMzM2MzgsIDIzMTcwLCAxMTgxMiwKLQkgIDM4NTMxLCA1MzQ0NCwgNTAzNDMsIDQ1MzA4LCAzODUzMSwgMzAyNzQsIDIwODUzLCAxMDYzMSwKLQkgIDMyNzY4LCA0NTQ1MSwgNDI4MTMsIDM4NTMxLCAzMjc2OCwgMjU3NDYsIDE3NzM0LCAgOTA0MSwKLQkgIDI1NzQ2LCAzNTcxMCwgMzM2MzgsIDMwMjc0LCAyNTc0NiwgMjAyMjgsIDEzOTMzLCAgNzEwMywKLQkgIDE3NzM0LCAyNDU5OCwgMjMxNzAsIDIwODUzLCAxNzczNCwgMTM5MzMsICA5NTk4LCAgNDg5MywKLQkgICA5MDQxLCAxMjU0MCwgMTE4MTIsIDEwNjMxLCAgOTA0MSwgIDcxMDMsICA0ODkzLCAgMjQ5NCwKLQl9OwotCS8qIEludmVyc2UgbWFwIG9mIFs3LCA1LCAxLCAzLCAwLCAyLCA0LCA2XS4gKi8KLQlzdGF0aWMgY29uc3QgY2hhciBvcmRlcnNbRENUU0laRV0gPSB7NCwgMiwgNSwgMywgNiwgMSwgNywgMH07Ci0JLyogUmVvcmRlciB0aGUgY29sdW1ucyBhZnRlciB0cmFuc3Bvc2luZy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7ICsraSkgewotCSAgaW50IGogPSAoKGkgJiA3KSA8PCAzKSArIG9yZGVyc1tpID4+IDNdOwotCSAgaWZtdGJsW2pdID0gKHF0YmwtPnF1YW50dmFsW2ldICogc2NhbGVzW2ldICsgMikgPj4gMjsKLQl9Ci0jZWxzZSAvKiBBTkRST0lEX0FSTVY2X0lEQ1QgKi8KLQotI2RlZmluZSBDT05TVF9CSVRTIDE0Ci0Jc3RhdGljIGNvbnN0IElOVDE2IGFhbnNjYWxlc1tEQ1RTSVpFMl0gPSB7Ci0JICAvKiBwcmVjb21wdXRlZCB2YWx1ZXMgc2NhbGVkIHVwIGJ5IDE0IGJpdHMgKi8KLQkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKLQkgIDIyNzI1LCAzMTUyMSwgMjk2OTIsIDI2NzIyLCAyMjcyNSwgMTc4NTUsIDEyMjk5LCAgNjI3MCwKLQkgIDIxNDA3LCAyOTY5MiwgMjc5NjksIDI1MTcyLCAyMTQwNywgMTY4MTksIDExNTg1LCAgNTkwNiwKLQkgIDE5MjY2LCAyNjcyMiwgMjUxNzIsIDIyNjU0LCAxOTI2NiwgMTUxMzcsIDEwNDI2LCAgNTMxNSwKLQkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKLQkgIDEyODczLCAxNzg1NSwgMTY4MTksIDE1MTM3LCAxMjg3MywgMTAxMTQsICA2OTY3LCAgMzU1MiwKLQkgICA4ODY3LCAxMjI5OSwgMTE1ODUsIDEwNDI2LCAgODg2NywgIDY5NjcsICA0Nzk5LCAgMjQ0NiwKLQkgICA0NTIwLCAgNjI3MCwgIDU5MDYsICA1MzE1LCAgNDUyMCwgIDM1NTIsICAyNDQ2LCAgMTI0NwotCX07Ci0JU0hJRlRfVEVNUFMKLQotCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0JICBpZm10YmxbaV0gPSAoSUZBU1RfTVVMVF9UWVBFKQotCSAgICBERVNDQUxFKE1VTFRJUExZMTZWMTYoKElOVDMyKSBxdGJsLT5xdWFudHZhbFtpXSwKLQkJCQkgIChJTlQzMikgYWFuc2NhbGVzW2ldKSwKLQkJICAgIENPTlNUX0JJVFMtSUZBU1RfU0NBTEVfQklUUyk7Ci0JfQotI2VuZGlmIC8qIEFORFJPSURfQVJNVjZfSURDVCAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gICAgY2FzZSBKRENUX0ZMT0FUOgotICAgICAgewotCS8qIEZvciBmbG9hdCBBQSZOIElEQ1QgbWV0aG9kLCBtdWx0aXBsaWVycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCi0JICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCi0JICogICBzY2FsZWZhY3RvclswXSA9IDEKLQkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43Ci0JICovCi0JRkxPQVRfTVVMVF9UWVBFICogZm10YmwgPSAoRkxPQVRfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLQlpbnQgcm93LCBjb2w7Ci0Jc3RhdGljIGNvbnN0IGRvdWJsZSBhYW5zY2FsZWZhY3RvcltEQ1RTSVpFXSA9IHsKLQkgIDEuMCwgMS4zODcwMzk4NDUsIDEuMzA2NTYyOTY1LCAxLjE3NTg3NTYwMiwKLQkgIDEuMCwgMC43ODU2OTQ5NTgsIDAuNTQxMTk2MTAwLCAwLjI3NTg5OTM3OQotCX07Ci0KLQlpID0gMDsKLQlmb3IgKHJvdyA9IDA7IHJvdyA8IERDVFNJWkU7IHJvdysrKSB7Ci0JICBmb3IgKGNvbCA9IDA7IGNvbCA8IERDVFNJWkU7IGNvbCsrKSB7Ci0JICAgIGZtdGJsW2ldID0gKEZMT0FUX01VTFRfVFlQRSkKLQkgICAgICAoKGRvdWJsZSkgcXRibC0+cXVhbnR2YWxbaV0gKgotCSAgICAgICBhYW5zY2FsZWZhY3Rvcltyb3ddICogYWFuc2NhbGVmYWN0b3JbY29sXSk7Ci0JICAgIGkrKzsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBJRENUIG1hbmFnZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9pbnZlcnNlX2RjdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfaWRjdF9wdHIgaWRjdDsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIGlkY3QgPSAobXlfaWRjdF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfaWRjdF9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5pZGN0ID0gKHN0cnVjdCBqcGVnX2ludmVyc2VfZGN0ICopIGlkY3Q7Ci0gIGlkY3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzczsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIEFsbG9jYXRlIGFuZCBwcmUtemVybyBhIG11bHRpcGxpZXIgdGFibGUgZm9yIGVhY2ggY29tcG9uZW50ICovCi0gICAgY29tcHB0ci0+ZGN0X3RhYmxlID0KLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YobXVsdGlwbGllcl90YWJsZSkpOwotICAgIE1FTVpFUk8oY29tcHB0ci0+ZGN0X3RhYmxlLCBTSVpFT0YobXVsdGlwbGllcl90YWJsZSkpOwotICAgIC8qIE1hcmsgbXVsdGlwbGllciB0YWJsZSBub3QgeWV0IHNldCB1cCBmb3IgYW55IG1ldGhvZCAqLwotICAgIGlkY3QtPmN1cl9tZXRob2RbY2ldID0gLTE7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkaHVmZi5jIGIvbGlianBlZ3R3cnAvamRodWZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNWQ0ZmQuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRodWZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTQgKzAsMCBAQAotLyoKLSAqIGpkaHVmZi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIHJvdXRpbmVzLgotICoKLSAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIGlucHV0IHN1c3BlbnNpb24uCi0gKiBJZiB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlIGRlbWFuZHMgc3VzcGVuc2lvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGJhY2sKLSAqIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UuICBUbyBkbyB0aGlzLCB3ZSBjb3B5IHN0YXRlIHZhcmlhYmxlcwotICogaW50byBsb2NhbCB3b3JraW5nIHN0b3JhZ2UsIGFuZCB1cGRhdGUgdGhlbSBiYWNrIHRvIHRoZSBwZXJtYW5lbnQKLSAqIHN0b3JhZ2Ugb25seSB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhbiBNQ1UuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpkcGh1ZmYuYyAqLwotCi1MT0NBTChib29sZWFuKSBwcm9jZXNzX3Jlc3RhcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pOwotCi0KLS8qCi0gKiBFeHBhbmRlZCBlbnRyb3B5IGRlY29kZXIgb2JqZWN0IGZvciBIdWZmbWFuIGRlY29kaW5nLgotICoKLSAqIFRoZSBzYXZhYmxlX3N0YXRlIHN1YnJlY29yZCBjb250YWlucyBmaWVsZHMgdGhhdCBjaGFuZ2Ugd2l0aGluIGFuIE1DVSwKLSAqIGJ1dCBtdXN0IG5vdCBiZSB1cGRhdGVkIHBlcm1hbmVudGx5IHVudGlsIHdlIGNvbXBsZXRlIHRoZSBNQ1UuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCi19IHNhdmFibGVfc3RhdGU7Ci0KLS8qIFRoaXMgbWFjcm8gaXMgdG8gd29yayBhcm91bmQgY29tcGlsZXJzIHdpdGggbWlzc2luZyBvciBicm9rZW4KLSAqIHN0cnVjdHVyZSBhc3NpZ25tZW50LiAgWW91J2xsIG5lZWQgdG8gZml4IHRoaXMgY29kZSBpZiB5b3UgaGF2ZQotICogc3VjaCBhIGNvbXBpbGVyIGFuZCB5b3UgY2hhbmdlIE1BWF9DT01QU19JTl9TQ0FOLgotICovCi0KLSNpZm5kZWYgTk9fU1RSVUNUX0FTU0lHTgotI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICAoKGRlc3QpID0gKHNyYykpCi0jZWxzZQotI2lmIE1BWF9DT01QU19JTl9TQ0FOID09IDQKLSNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgXAotCSgoZGVzdCkubGFzdF9kY192YWxbMF0gPSAoc3JjKS5sYXN0X2RjX3ZhbFswXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbMV0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsxXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbMl0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsyXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbM10gPSAoc3JjKS5sYXN0X2RjX3ZhbFszXSkKLSNlbmRpZgotI2VuZGlmCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBsb2FkZWQgaW50byBsb2NhbCB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgZWFjaCBNQ1UuCi0gICAqIEluIGNhc2Ugb2Ygc3VzcGVuc2lvbiwgd2UgZXhpdCBXSVRIT1VUIHVwZGF0aW5nIHRoZW0uCi0gICAqLwotICBiaXRyZWFkX3Blcm1fc3RhdGUgYml0c3RhdGU7CS8qIEJpdCBidWZmZXIgYXQgc3RhcnQgb2YgTUNVICovCi0gIHNhdmFibGVfc3RhdGUgc2F2ZWQ7CQkvKiBPdGhlciBzdGF0ZSBhdCBzdGFydCBvZiBNQ1UgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIE5PVCBsb2FkZWQgaW50byBsb2NhbCB3b3JraW5nIHN0YXRlLiAqLwotICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KLQotICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLwotICBkX2Rlcml2ZWRfdGJsICogZGNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwotICBkX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwotCi0gIC8qIFByZWNhbGN1bGF0ZWQgaW5mbyBzZXQgdXAgYnkgc3RhcnRfcGFzcyBmb3IgdXNlIGluIGRlY29kZV9tY3U6ICovCi0KLSAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgdG8gYmUgdXNlZCBmb3IgZWFjaCBibG9jayB3aXRoaW4gYW4gTUNVICovCi0gIGRfZGVyaXZlZF90YmwgKiBkY19jdXJfdGJsc1tEX01BWF9CTE9DS1NfSU5fTUNVXTsKLSAgZF9kZXJpdmVkX3RibCAqIGFjX2N1cl90YmxzW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotICAvKiBXaGV0aGVyIHdlIGNhcmUgYWJvdXQgdGhlIERDIGFuZCBBQyBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIGVhY2ggYmxvY2sgKi8KLSAgYm9vbGVhbiBkY19uZWVkZWRbRF9NQVhfQkxPQ0tTX0lOX01DVV07Ci0gIGJvb2xlYW4gYWNfbmVlZGVkW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotfSBodWZmX2VudHJvcHlfZGVjb2RlcjsKLQotdHlwZWRlZiBodWZmX2VudHJvcHlfZGVjb2RlciAqIGh1ZmZfZW50cm9weV9wdHI7Ci0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19odWZmX2RlY29kZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGNpLCBibGtuLCBkY3RibCwgYWN0Ymw7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIC8qIENoZWNrIHRoYXQgdGhlIHNjYW4gcGFyYW1ldGVycyBTcywgU2UsIEFoL0FsIGFyZSBPSyBmb3Igc2VxdWVudGlhbCBKUEVHLgotICAgKiBUaGlzIG91Z2h0IHRvIGJlIGFuIGVycm9yIGNvbmRpdGlvbiwgYnV0IHdlIG1ha2UgaXQgYSB3YXJuaW5nIGJlY2F1c2UKLSAgICogdGhlcmUgYXJlIHNvbWUgYmFzZWxpbmUgZmlsZXMgb3V0IHRoZXJlIHdpdGggYWxsIHplcm9lcyBpbiB0aGVzZSBieXRlcy4KLSAgICovCi0gIGlmIChjaW5mby0+U3MgIT0gMCB8fCBjaW5mby0+U2UgIT0gRENUU0laRTItMSB8fAotICAgICAgY2luZm8tPkFoICE9IDAgfHwgY2luZm8tPkFsICE9IDApCi0gICAgV0FSTk1TKGNpbmZvLCBKV1JOX05PVF9TRVFVRU5USUFMKTsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgZGN0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87Ci0gICAgYWN0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87Ci0gICAgLyogQ29tcHV0ZSBkZXJpdmVkIHZhbHVlcyBmb3IgSHVmZm1hbiB0YWJsZXMgKi8KLSAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3IgYSB0YWJsZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZSAqLwotICAgIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBUUlVFLCBkY3RibCwKLQkJCSAgICAmIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tkY3RibF0pOwotICAgIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBGQUxTRSwgYWN0YmwsCi0JCQkgICAgJiBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbYWN0YmxdKTsKLSAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICB9Ci0KLSAgLyogUHJlY2FsY3VsYXRlIGRlY29kaW5nIGluZm8gZm9yIGVhY2ggYmxvY2sgaW4gYW4gTUNVIG9mIHRoaXMgc2NhbiAqLwotICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgIGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOwotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgLyogUHJlY2FsY3VsYXRlIHdoaWNoIHRhYmxlIHRvIHVzZSBmb3IgZWFjaCBibG9jayAqLwotICAgIGVudHJvcHktPmRjX2N1cl90YmxzW2Jsa25dID0gZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmRjX3RibF9ub107Ci0gICAgZW50cm9weS0+YWNfY3VyX3RibHNbYmxrbl0gPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbY29tcHB0ci0+YWNfdGJsX25vXTsKLSAgICAvKiBEZWNpZGUgd2hldGhlciB3ZSByZWFsbHkgY2FyZSBhYm91dCB0aGUgY29lZmZpY2llbnQgdmFsdWVzICovCi0gICAgaWYgKGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpIHsKLSAgICAgIGVudHJvcHktPmRjX25lZWRlZFtibGtuXSA9IFRSVUU7Ci0gICAgICAvKiB3ZSBkb24ndCBuZWVkIHRoZSBBQ3MgaWYgcHJvZHVjaW5nIGEgMS84dGgtc2l6ZSBpbWFnZSAqLwotICAgICAgZW50cm9weS0+YWNfbmVlZGVkW2Jsa25dID0gKGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSA+IDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0gPSBlbnRyb3B5LT5hY19uZWVkZWRbYmxrbl0gPSBGQUxTRTsKLSAgICB9Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIGJpdHJlYWQgc3RhdGUgdmFyaWFibGVzICovCi0gIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCA9IDA7Ci0gIGVudHJvcHktPmJpdHN0YXRlLmdldF9idWZmZXIgPSAwOyAvKiB1bm5lY2Vzc2FyeSwgYnV0IGtlZXBzIFB1cmlmeSBxdWlldCAqLwotICBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEgPSBGQUxTRTsKLQotICAvKiBJbml0aWFsaXplIHJlc3RhcnQgY291bnRlciAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotfQotCi0KLS8qCi0gKiBDb21wdXRlIHRoZSBkZXJpdmVkIHZhbHVlcyBmb3IgYSBIdWZmbWFuIHRhYmxlLgotICogVGhpcyByb3V0aW5lIGFsc28gcGVyZm9ybXMgc29tZSB2YWxpZGF0aW9uIGNoZWNrcyBvbiB0aGUgdGFibGUuCi0gKgotICogTm90ZSB0aGlzIGlzIGFsc28gdXNlZCBieSBqZHBodWZmLmMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX21ha2VfZF9kZXJpdmVkX3RibCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCi0JCQkgZF9kZXJpdmVkX3RibCAqKiBwZHRibCkKLXsKLSAgSkhVRkZfVEJMICpodGJsOwotICBkX2Rlcml2ZWRfdGJsICpkdGJsOwotICBpbnQgcCwgaSwgbCwgc2ksIG51bXN5bWJvbHM7Ci0gIGludCBsb29rYml0cywgY3RyOwotICBjaGFyIGh1ZmZzaXplWzI1N107Ci0gIHVuc2lnbmVkIGludCBodWZmY29kZVsyNTddOwotICB1bnNpZ25lZCBpbnQgY29kZTsKLQotICAvKiBOb3RlIHRoYXQgaHVmZnNpemVbXSBhbmQgaHVmZmNvZGVbXSBhcmUgZmlsbGVkIGluIGNvZGUtbGVuZ3RoIG9yZGVyLAotICAgKiBwYXJhbGxlbGluZyB0aGUgb3JkZXIgb2YgdGhlIHN5bWJvbHMgdGhlbXNlbHZlcyBpbiBodGJsLT5odWZmdmFsW10uCi0gICAqLwotCi0gIC8qIEZpbmQgdGhlIGlucHV0IEh1ZmZtYW4gdGFibGUgKi8KLSAgaWYgKHRibG5vIDwgMCB8fCB0YmxubyA+PSBOVU1fSFVGRl9UQkxTKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKLSAgaHRibCA9Ci0gICAgaXNEQyA/IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW3RibG5vXSA6IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW3RibG5vXTsKLSAgaWYgKGh0YmwgPT0gTlVMTCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7Ci0KLSAgLyogQWxsb2NhdGUgYSB3b3Jrc3BhY2UgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28uICovCi0gIGlmICgqcGR0YmwgPT0gTlVMTCkKLSAgICAqcGR0YmwgPSAoZF9kZXJpdmVkX3RibCAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihkX2Rlcml2ZWRfdGJsKSk7Ci0gIGR0YmwgPSAqcGR0Ymw7Ci0gIGR0YmwtPnB1YiA9IGh0Ymw7CQkvKiBmaWxsIGluIGJhY2sgbGluayAqLwotICAKLSAgLyogRmlndXJlIEMuMTogbWFrZSB0YWJsZSBvZiBIdWZmbWFuIGNvZGUgbGVuZ3RoIGZvciBlYWNoIHN5bWJvbCAqLwotCi0gIHAgPSAwOwotICBmb3IgKGwgPSAxOyBsIDw9IDE2OyBsKyspIHsKLSAgICBpID0gKGludCkgaHRibC0+Yml0c1tsXTsKLSAgICBpZiAoaSA8IDAgfHwgcCArIGkgPiAyNTYpCS8qIHByb3RlY3QgYWdhaW5zdCB0YWJsZSBvdmVycnVuICovCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKLSAgICB3aGlsZSAoaS0tKQotICAgICAgaHVmZnNpemVbcCsrXSA9IChjaGFyKSBsOwotICB9Ci0gIGh1ZmZzaXplW3BdID0gMDsKLSAgbnVtc3ltYm9scyA9IHA7Ci0gIAotICAvKiBGaWd1cmUgQy4yOiBnZW5lcmF0ZSB0aGUgY29kZXMgdGhlbXNlbHZlcyAqLwotICAvKiBXZSBhbHNvIHZhbGlkYXRlIHRoYXQgdGhlIGNvdW50cyByZXByZXNlbnQgYSBsZWdhbCBIdWZmbWFuIGNvZGUgdHJlZS4gKi8KLSAgCi0gIGNvZGUgPSAwOwotICBzaSA9IGh1ZmZzaXplWzBdOwotICBwID0gMDsKLSAgd2hpbGUgKGh1ZmZzaXplW3BdKSB7Ci0gICAgd2hpbGUgKCgoaW50KSBodWZmc2l6ZVtwXSkgPT0gc2kpIHsKLSAgICAgIGh1ZmZjb2RlW3ArK10gPSBjb2RlOwotICAgICAgY29kZSsrOwotICAgIH0KLSAgICAvKiBjb2RlIGlzIG5vdyAxIG1vcmUgdGhhbiB0aGUgbGFzdCBjb2RlIHVzZWQgZm9yIGNvZGVsZW5ndGggc2k7IGJ1dAotICAgICAqIGl0IG11c3Qgc3RpbGwgZml0IGluIHNpIGJpdHMsIHNpbmNlIG5vIGNvZGUgaXMgYWxsb3dlZCB0byBiZSBhbGwgb25lcy4KLSAgICAgKi8KLSAgICBpZiAoKChJTlQzMikgY29kZSkgPj0gKCgoSU5UMzIpIDEpIDw8IHNpKSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOwotICAgIGNvZGUgPDw9IDE7Ci0gICAgc2krKzsKLSAgfQotCi0gIC8qIEZpZ3VyZSBGLjE1OiBnZW5lcmF0ZSBkZWNvZGluZyB0YWJsZXMgZm9yIGJpdC1zZXF1ZW50aWFsIGRlY29kaW5nICovCi0KLSAgcCA9IDA7Ci0gIGZvciAobCA9IDE7IGwgPD0gMTY7IGwrKykgewotICAgIGlmIChodGJsLT5iaXRzW2xdKSB7Ci0gICAgICAvKiB2YWxvZmZzZXRbbF0gPSBodWZmdmFsW10gaW5kZXggb2YgMXN0IHN5bWJvbCBvZiBjb2RlIGxlbmd0aCBsLAotICAgICAgICogbWludXMgdGhlIG1pbmltdW0gY29kZSBvZiBsZW5ndGggbAotICAgICAgICovCi0gICAgICBkdGJsLT52YWxvZmZzZXRbbF0gPSAoSU5UMzIpIHAgLSAoSU5UMzIpIGh1ZmZjb2RlW3BdOwotICAgICAgcCArPSBodGJsLT5iaXRzW2xdOwotICAgICAgZHRibC0+bWF4Y29kZVtsXSA9IGh1ZmZjb2RlW3AtMV07IC8qIG1heGltdW0gY29kZSBvZiBsZW5ndGggbCAqLwotICAgIH0gZWxzZSB7Ci0gICAgICBkdGJsLT5tYXhjb2RlW2xdID0gLTE7CS8qIC0xIGlmIG5vIGNvZGVzIG9mIHRoaXMgbGVuZ3RoICovCi0gICAgfQotICB9Ci0gIGR0YmwtPm1heGNvZGVbMTddID0gMHhGRkZGRkw7IC8qIGVuc3VyZXMganBlZ19odWZmX2RlY29kZSB0ZXJtaW5hdGVzICovCi0KLSAgLyogQ29tcHV0ZSBsb29rYWhlYWQgdGFibGVzIHRvIHNwZWVkIHVwIGRlY29kaW5nLgotICAgKiBGaXJzdCB3ZSBzZXQgYWxsIHRoZSB0YWJsZSBlbnRyaWVzIHRvIDAsIGluZGljYXRpbmcgInRvbyBsb25nIjsKLSAgICogdGhlbiB3ZSBpdGVyYXRlIHRocm91Z2ggdGhlIEh1ZmZtYW4gY29kZXMgdGhhdCBhcmUgc2hvcnQgZW5vdWdoIGFuZAotICAgKiBmaWxsIGluIGFsbCB0aGUgZW50cmllcyB0aGF0IGNvcnJlc3BvbmQgdG8gYml0IHNlcXVlbmNlcyBzdGFydGluZwotICAgKiB3aXRoIHRoYXQgY29kZS4KLSAgICovCi0KLSAgTUVNWkVSTyhkdGJsLT5sb29rX25iaXRzLCBTSVpFT0YoZHRibC0+bG9va19uYml0cykpOwotCi0gIHAgPSAwOwotICBmb3IgKGwgPSAxOyBsIDw9IEhVRkZfTE9PS0FIRUFEOyBsKyspIHsKLSAgICBmb3IgKGkgPSAxOyBpIDw9IChpbnQpIGh0YmwtPmJpdHNbbF07IGkrKywgcCsrKSB7Ci0gICAgICAvKiBsID0gY3VycmVudCBjb2RlJ3MgbGVuZ3RoLCBwID0gaXRzIGluZGV4IGluIGh1ZmZjb2RlW10gJiBodWZmdmFsW10uICovCi0gICAgICAvKiBHZW5lcmF0ZSBsZWZ0LWp1c3RpZmllZCBjb2RlIGZvbGxvd2VkIGJ5IGFsbCBwb3NzaWJsZSBiaXQgc2VxdWVuY2VzICovCi0gICAgICBsb29rYml0cyA9IGh1ZmZjb2RlW3BdIDw8IChIVUZGX0xPT0tBSEVBRC1sKTsKLSAgICAgIGZvciAoY3RyID0gMSA8PCAoSFVGRl9MT09LQUhFQUQtbCk7IGN0ciA+IDA7IGN0ci0tKSB7Ci0JZHRibC0+bG9va19uYml0c1tsb29rYml0c10gPSBsOwotCWR0YmwtPmxvb2tfc3ltW2xvb2tiaXRzXSA9IGh0YmwtPmh1ZmZ2YWxbcF07Ci0JbG9va2JpdHMrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBWYWxpZGF0ZSBzeW1ib2xzIGFzIGJlaW5nIHJlYXNvbmFibGUuCi0gICAqIEZvciBBQyB0YWJsZXMsIHdlIG1ha2Ugbm8gY2hlY2ssIGJ1dCBhY2NlcHQgYWxsIGJ5dGUgdmFsdWVzIDAuLjI1NS4KLSAgICogRm9yIERDIHRhYmxlcywgd2UgcmVxdWlyZSB0aGUgc3ltYm9scyB0byBiZSBpbiByYW5nZSAwLi4xNS4KLSAgICogKFRpZ2h0ZXIgYm91bmRzIGNvdWxkIGJlIGFwcGxpZWQgZGVwZW5kaW5nIG9uIHRoZSBkYXRhIGRlcHRoIGFuZCBtb2RlLAotICAgKiBidXQgdGhpcyBpcyBzdWZmaWNpZW50IHRvIGVuc3VyZSBzYWZlIGRlY29kaW5nLikKLSAgICovCi0gIGlmIChpc0RDKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bXN5bWJvbHM7IGkrKykgewotICAgICAgaW50IHN5bSA9IGh0YmwtPmh1ZmZ2YWxbaV07Ci0gICAgICBpZiAoc3ltIDwgMCB8fCBzeW0gPiAxNSkKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogT3V0LW9mLWxpbmUgY29kZSBmb3IgYml0IGZldGNoaW5nIChzaGFyZWQgd2l0aCBqZHBodWZmLmMpLgotICogU2VlIGpkaHVmZi5oIGZvciBpbmZvIGFib3V0IHVzYWdlLgotICogTm90ZTogY3VycmVudCB2YWx1ZXMgb2YgZ2V0X2J1ZmZlciBhbmQgYml0c19sZWZ0IGFyZSBwYXNzZWQgYXMgcGFyYW1ldGVycywKLSAqIGJ1dCBhcmUgcmV0dXJuZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIG9mIHRoZSBzdGF0ZSBzdHJ1Y3QuCi0gKgotICogT24gbW9zdCBtYWNoaW5lcyBNSU5fR0VUX0JJVFMgc2hvdWxkIGJlIDI1IHRvIGFsbG93IHRoZSBmdWxsIDMyLWJpdCB3aWR0aAotICogb2YgZ2V0X2J1ZmZlciB0byBiZSB1c2VkLiAgKE9uIG1hY2hpbmVzIHdpdGggd2lkZXIgd29yZHMsIGFuIGV2ZW4gbGFyZ2VyCi0gKiBidWZmZXIgY291bGQgYmUgdXNlZC4pICBIb3dldmVyLCBvbiBzb21lIG1hY2hpbmVzIDMyLWJpdCBzaGlmdHMgYXJlCi0gKiBxdWl0ZSBzbG93IGFuZCB0YWtlIHRpbWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgcGxhY2VzIHNoaWZ0ZWQuCi0gKiAoVGhpcyBpcyB0cnVlIHdpdGggbW9zdCBQQyBjb21waWxlcnMsIGZvciBpbnN0YW5jZS4pICBJbiB0aGlzIGNhc2UgaXQgbWF5Ci0gKiBiZSBhIHdpbiB0byBzZXQgTUlOX0dFVF9CSVRTIHRvIHRoZSBtaW5pbXVtIHZhbHVlIG9mIDE1LiAgVGhpcyByZWR1Y2VzIHRoZQotICogYXZlcmFnZSBzaGlmdCBkaXN0YW5jZSBhdCB0aGUgY29zdCBvZiBtb3JlIGNhbGxzIHRvIGpwZWdfZmlsbF9iaXRfYnVmZmVyLgotICovCi0KLSNpZmRlZiBTTE9XX1NISUZUXzMyCi0jZGVmaW5lIE1JTl9HRVRfQklUUyAgMTUJLyogbWluaW11bSBhbGxvd2FibGUgdmFsdWUgKi8KLSNlbHNlCi0jZGVmaW5lIE1JTl9HRVRfQklUUyAgKEJJVF9CVUZfU0laRS03KQotI2VuZGlmCi0KLQotR0xPQkFMKGJvb2xlYW4pCi1qcGVnX2ZpbGxfYml0X2J1ZmZlciAoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsCi0JCSAgICAgIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLCByZWdpc3RlciBpbnQgYml0c19sZWZ0LAotCQkgICAgICBpbnQgbmJpdHMpCi0vKiBMb2FkIHVwIHRoZSBiaXQgYnVmZmVyIHRvIGEgZGVwdGggb2YgYXQgbGVhc3QgbmJpdHMgKi8KLXsKLSAgLyogQ29weSBoZWF2aWx5IHVzZWQgc3RhdGUgZmllbGRzIGludG8gbG9jYWxzIChob3BlZnVsbHkgcmVnaXN0ZXJzKSAqLwotICByZWdpc3RlciBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGUgPSBzdGF0ZS0+bmV4dF9pbnB1dF9ieXRlOwotICByZWdpc3RlciBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyID0gc3RhdGUtPmJ5dGVzX2luX2J1ZmZlcjsKLSAgal9kZWNvbXByZXNzX3B0ciBjaW5mbyA9IHN0YXRlLT5jaW5mbzsKLQotICAvKiBBdHRlbXB0IHRvIGxvYWQgYXQgbGVhc3QgTUlOX0dFVF9CSVRTIGJpdHMgaW50byBnZXRfYnVmZmVyLiAqLwotICAvKiAoSXQgaXMgYXNzdW1lZCB0aGF0IG5vIHJlcXVlc3Qgd2lsbCBiZSBmb3IgbW9yZSB0aGFuIHRoYXQgbWFueSBiaXRzLikgKi8KLSAgLyogV2UgZmFpbCB0byBkbyBzbyBvbmx5IGlmIHdlIGhpdCBhIG1hcmtlciBvciBhcmUgZm9yY2VkIHRvIHN1c3BlbmQuICovCi0KLSAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsJLyogY2Fubm90IGFkdmFuY2UgcGFzdCBhIG1hcmtlciAqLwotICAgIHdoaWxlIChiaXRzX2xlZnQgPCBNSU5fR0VUX0JJVFMpIHsKLSAgICAgIHJlZ2lzdGVyIGludCBjOwotCi0gICAgICAvKiBBdHRlbXB0IHRvIHJlYWQgYSBieXRlICovCi0gICAgICBpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDApIHsKLQlpZiAoISAoKmNpbmZvLT5zcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKQotCSAgcmV0dXJuIEZBTFNFOwotCW5leHRfaW5wdXRfYnl0ZSA9IGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsKLQlieXRlc19pbl9idWZmZXIgPSBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXI7Ci0gICAgICB9Ci0gICAgICBieXRlc19pbl9idWZmZXItLTsKLSAgICAgIGMgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsKLQotICAgICAgLyogSWYgaXQncyAweEZGLCBjaGVjayBhbmQgZGlzY2FyZCBzdHVmZmVkIHplcm8gYnl0ZSAqLwotICAgICAgaWYgKGMgPT0gMHhGRikgewotCS8qIExvb3AgaGVyZSB0byBkaXNjYXJkIGFueSBwYWRkaW5nIEZGJ3Mgb24gdGVybWluYXRpbmcgbWFya2VyLAotCSAqIHNvIHRoYXQgd2UgY2FuIHNhdmUgYSB2YWxpZCB1bnJlYWRfbWFya2VyIHZhbHVlLiAgTk9URTogd2Ugd2lsbAotCSAqIGFjY2VwdCBtdWx0aXBsZSBGRidzIGZvbGxvd2VkIGJ5IGEgMCBhcyBtZWFuaW5nIGEgc2luZ2xlIEZGIGRhdGEKLQkgKiBieXRlLiAgVGhpcyBkYXRhIHBhdHRlcm4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQuCi0JICovCi0JZG8gewotCSAgaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7Ci0JICAgIGlmICghICgqY2luZm8tPnNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpCi0JICAgICAgcmV0dXJuIEZBTFNFOwotCSAgICBuZXh0X2lucHV0X2J5dGUgPSBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGU7Ci0JICAgIGJ5dGVzX2luX2J1ZmZlciA9IGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsKLQkgIH0KLQkgIGJ5dGVzX2luX2J1ZmZlci0tOwotCSAgYyA9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspOwotCX0gd2hpbGUgKGMgPT0gMHhGRik7Ci0KLQlpZiAoYyA9PSAwKSB7Ci0JICAvKiBGb3VuZCBGRi8wMCwgd2hpY2ggcmVwcmVzZW50cyBhbiBGRiBkYXRhIGJ5dGUgKi8KLQkgIGMgPSAweEZGOwotCX0gZWxzZSB7Ci0JICAvKiBPb3BzLCBpdCdzIGFjdHVhbGx5IGEgbWFya2VyIGluZGljYXRpbmcgZW5kIG9mIGNvbXByZXNzZWQgZGF0YS4KLQkgICAqIFNhdmUgdGhlIG1hcmtlciBjb2RlIGZvciBsYXRlciB1c2UuCi0JICAgKiBGaW5lIHBvaW50OiBpdCBtaWdodCBhcHBlYXIgdGhhdCB3ZSBzaG91bGQgc2F2ZSB0aGUgbWFya2VyIGludG8KLQkgICAqIGJpdHJlYWQgd29ya2luZyBzdGF0ZSwgbm90IHN0cmFpZ2h0IGludG8gcGVybWFuZW50IHN0YXRlLiAgQnV0Ci0JICAgKiBvbmNlIHdlIGhhdmUgaGl0IGEgbWFya2VyLCB3ZSBjYW5ub3QgbmVlZCB0byBzdXNwZW5kIHdpdGhpbiB0aGUKLQkgICAqIGN1cnJlbnQgTUNVLCBiZWNhdXNlIHdlIHdpbGwgcmVhZCBubyBtb3JlIGJ5dGVzIGZyb20gdGhlIGRhdGEKLQkgICAqIHNvdXJjZS4gIFNvIGl0IGlzIE9LIHRvIHVwZGF0ZSBwZXJtYW5lbnQgc3RhdGUgcmlnaHQgYXdheS4KLQkgICAqLwotCSAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSBjOwotCSAgLyogU2VlIGlmIHdlIG5lZWQgdG8gaW5zZXJ0IHNvbWUgZmFrZSB6ZXJvIGJpdHMuICovCi0JICBnb3RvIG5vX21vcmVfYnl0ZXM7Ci0JfQotICAgICAgfQotCi0gICAgICAvKiBPSywgbG9hZCBjIGludG8gZ2V0X2J1ZmZlciAqLwotICAgICAgZ2V0X2J1ZmZlciA9IChnZXRfYnVmZmVyIDw8IDgpIHwgYzsKLSAgICAgIGJpdHNfbGVmdCArPSA4OwotICAgIH0gLyogZW5kIHdoaWxlICovCi0gIH0gZWxzZSB7Ci0gIG5vX21vcmVfYnl0ZXM6Ci0gICAgLyogV2UgZ2V0IGhlcmUgaWYgd2UndmUgcmVhZCB0aGUgbWFya2VyIHRoYXQgdGVybWluYXRlcyB0aGUgY29tcHJlc3NlZAotICAgICAqIGRhdGEgc2VnbWVudC4gIFRoZXJlIHNob3VsZCBiZSBlbm91Z2ggYml0cyBpbiB0aGUgYnVmZmVyIHJlZ2lzdGVyCi0gICAgICogdG8gc2F0aXNmeSB0aGUgcmVxdWVzdDsgaWYgc28sIG5vIHByb2JsZW0uCi0gICAgICovCi0gICAgaWYgKG5iaXRzID4gYml0c19sZWZ0KSB7Ci0gICAgICAvKiBVaC1vaC4gIFJlcG9ydCBjb3JydXB0ZWQgZGF0YSB0byB1c2VyIGFuZCBzdHVmZiB6ZXJvZXMgaW50bwotICAgICAgICogdGhlIGRhdGEgc3RyZWFtLCBzbyB0aGF0IHdlIGNhbiBwcm9kdWNlIHNvbWUga2luZCBvZiBpbWFnZS4KLSAgICAgICAqIFdlIHVzZSBhIG5vbnZvbGF0aWxlIGZsYWcgdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgd2FybmluZyBtZXNzYWdlCi0gICAgICAgKiBhcHBlYXJzIHBlciBkYXRhIHNlZ21lbnQuCi0gICAgICAgKi8KLSAgICAgIGlmICghIGNpbmZvLT5lbnRyb3B5LT5pbnN1ZmZpY2llbnRfZGF0YSkgewotCVdBUk5NUyhjaW5mbywgSldSTl9ISVRfTUFSS0VSKTsKLQljaW5mby0+ZW50cm9weS0+aW5zdWZmaWNpZW50X2RhdGEgPSBUUlVFOwotICAgICAgfQotICAgICAgLyogRmlsbCB0aGUgYnVmZmVyIHdpdGggemVybyBiaXRzICovCi0gICAgICBnZXRfYnVmZmVyIDw8PSBNSU5fR0VUX0JJVFMgLSBiaXRzX2xlZnQ7Ci0gICAgICBiaXRzX2xlZnQgPSBNSU5fR0VUX0JJVFM7Ci0gICAgfQotICB9Ci0KLSAgLyogVW5sb2FkIHRoZSBsb2NhbCByZWdpc3RlcnMgKi8KLSAgc3RhdGUtPm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZTsKLSAgc3RhdGUtPmJ5dGVzX2luX2J1ZmZlciA9IGJ5dGVzX2luX2J1ZmZlcjsKLSAgc3RhdGUtPmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOwotICBzdGF0ZS0+Yml0c19sZWZ0ID0gYml0c19sZWZ0OwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBPdXQtb2YtbGluZSBjb2RlIGZvciBIdWZmbWFuIGNvZGUgZGVjb2RpbmcuCi0gKiBTZWUgamRodWZmLmggZm9yIGluZm8gYWJvdXQgdXNhZ2UuCi0gKi8KLQotR0xPQkFMKGludCkKLWpwZWdfaHVmZl9kZWNvZGUgKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLAotCQkgIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLCByZWdpc3RlciBpbnQgYml0c19sZWZ0LAotCQkgIGRfZGVyaXZlZF90YmwgKiBodGJsLCBpbnQgbWluX2JpdHMpCi17Ci0gIHJlZ2lzdGVyIGludCBsID0gbWluX2JpdHM7Ci0gIHJlZ2lzdGVyIElOVDMyIGNvZGU7Ci0KLSAgLyogSFVGRl9ERUNPREUgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgY29kZSBpcyBhdCBsZWFzdCBtaW5fYml0cyAqLwotICAvKiBiaXRzIGxvbmcsIHNvIGZldGNoIHRoYXQgbWFueSBiaXRzIGluIG9uZSBzd29vcC4gKi8KLQotICBDSEVDS19CSVRfQlVGRkVSKCpzdGF0ZSwgbCwgcmV0dXJuIC0xKTsKLSAgY29kZSA9IEdFVF9CSVRTKGwpOwotCi0gIC8qIENvbGxlY3QgdGhlIHJlc3Qgb2YgdGhlIEh1ZmZtYW4gY29kZSBvbmUgYml0IGF0IGEgdGltZS4gKi8KLSAgLyogVGhpcyBpcyBwZXIgRmlndXJlIEYuMTYgaW4gdGhlIEpQRUcgc3BlYy4gKi8KLQotICB3aGlsZSAoY29kZSA+IGh0YmwtPm1heGNvZGVbbF0pIHsKLSAgICBjb2RlIDw8PSAxOwotICAgIENIRUNLX0JJVF9CVUZGRVIoKnN0YXRlLCAxLCByZXR1cm4gLTEpOwotICAgIGNvZGUgfD0gR0VUX0JJVFMoMSk7Ci0gICAgbCsrOwotICB9Ci0KLSAgLyogVW5sb2FkIHRoZSBsb2NhbCByZWdpc3RlcnMgKi8KLSAgc3RhdGUtPmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOwotICBzdGF0ZS0+Yml0c19sZWZ0ID0gYml0c19sZWZ0OwotCi0gIC8qIFdpdGggZ2FyYmFnZSBpbnB1dCB3ZSBtYXkgcmVhY2ggdGhlIHNlbnRpbmVsIHZhbHVlIGwgPSAxNy4gKi8KLQotICBpZiAobCA+IDE2KSB7Ci0gICAgV0FSTk1TKHN0YXRlLT5jaW5mbywgSldSTl9IVUZGX0JBRF9DT0RFKTsKLSAgICByZXR1cm4gMDsJCQkvKiBmYWtlIGEgemVybyBhcyB0aGUgc2FmZXN0IHJlc3VsdCAqLwotICB9Ci0KLSAgcmV0dXJuIGh0YmwtPnB1Yi0+aHVmZnZhbFsgKGludCkgKGNvZGUgKyBodGJsLT52YWxvZmZzZXRbbF0pIF07Ci19Ci0KLQotLyoKLSAqIEZpZ3VyZSBGLjEyOiBleHRlbmQgc2lnbiBiaXQuCi0gKiBPbiBzb21lIG1hY2hpbmVzLCBhIHNoaWZ0IGFuZCBhZGQgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhIHRhYmxlIGxvb2t1cC4KLSAqLwotCi0jaWZkZWYgQVZPSURfVEFCTEVTCi0KLSNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8ICgxPDwoKHMpLTEpKSA/ICh4KSArICgoKC0xKTw8KHMpKSArIDEpIDogKHgpKQotCi0jZWxzZQotCi0jZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCBleHRlbmRfdGVzdFtzXSA/ICh4KSArIGV4dGVuZF9vZmZzZXRbc10gOiAoeCkpCi0KLXN0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX3Rlc3RbMTZdID0gICAvKiBlbnRyeSBuIGlzIDIqKihuLTEpICovCi0gIHsgMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCi0gICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwIH07Ci0KLXN0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX29mZnNldFsxNl0gPSAvKiBlbnRyeSBuIGlzICgtMSA8PCBuKSArIDEgKi8KLSAgeyAwLCAoKC0xKTw8MSkgKyAxLCAoKC0xKTw8MikgKyAxLCAoKC0xKTw8MykgKyAxLCAoKC0xKTw8NCkgKyAxLAotICAgICgoLTEpPDw1KSArIDEsICgoLTEpPDw2KSArIDEsICgoLTEpPDw3KSArIDEsICgoLTEpPDw4KSArIDEsCi0gICAgKCgtMSk8PDkpICsgMSwgKCgtMSk8PDEwKSArIDEsICgoLTEpPDwxMSkgKyAxLCAoKC0xKTw8MTIpICsgMSwKLSAgICAoKC0xKTw8MTMpICsgMSwgKCgtMSk8PDE0KSArIDEsICgoLTEpPDwxNSkgKyAxIH07Ci0KLSNlbmRpZiAvKiBBVk9JRF9UQUJMRVMgKi8KLQotCi0vKgotICogQ2hlY2sgZm9yIGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIGRlY29kZXIuCi0gKiBSZXR1cm5zIEZBTFNFIGlmIG11c3Qgc3VzcGVuZC4KLSAqLwotCi1MT0NBTChib29sZWFuKQotcHJvY2Vzc19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBjaTsKLQotICAvKiBUaHJvdyBhd2F5IGFueSB1bnVzZWQgYml0cyByZW1haW5pbmcgaW4gYml0IGJ1ZmZlcjsgKi8KLSAgLyogaW5jbHVkZSBhbnkgZnVsbCBieXRlcyBpbiBuZXh0X21hcmtlcidzIGNvdW50IG9mIGRpc2NhcmRlZCBieXRlcyAqLwotICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgKz0gZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0IC8gODsKLSAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKLQotICAvKiBBZHZhbmNlIHBhc3QgdGhlIFJTVG4gbWFya2VyICovCi0gIGlmICghICgqY2luZm8tPm1hcmtlci0+cmVhZF9yZXN0YXJ0X21hcmtlcikgKGNpbmZvKSkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQotICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0KLSAgLyogUmVzZXQgcmVzdGFydCBjb3VudGVyICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0KLSAgLyogUmVzZXQgb3V0LW9mLWRhdGEgZmxhZywgdW5sZXNzIHJlYWRfcmVzdGFydF9tYXJrZXIgbGVmdCB1cyBzbWFjayB1cAotICAgKiBhZ2FpbnN0IGEgbWFya2VyLiAgSW4gdGhhdCBjYXNlIHdlIHdpbGwgZW5kIHVwIHRyZWF0aW5nIHRoZSBuZXh0IGRhdGEKLSAgICogc2VnbWVudCBhcyBlbXB0eSwgYW5kIHdlIGNhbiBhdm9pZCBwcm9kdWNpbmcgYm9ndXMgb3V0cHV0IHBpeGVscyBieQotICAgKiBsZWF2aW5nIHRoZSBmbGFnIHNldC4KLSAgICovCi0gIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKQotICAgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKgotICogU2F2ZSB0aGUgY3VycmVudCBIdWZmbWFuIGRlb2NkZSBwb3NpdGlvbiBhbmQgdGhlIERDIGNvZWZmaWNpZW50cwotICogZm9yIGVhY2ggY29tcG9uZW50IGludG8gYml0c3RyZWFtX29mZnNldCBhbmQgZGNfaW5mb1tdLCByZXNwZWN0aXZlbHkuCi0gKi8KLU1FVEhPRERFRih2b2lkKQotZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldCkKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBzaG9ydCBpbnQgKmRjX2luZm8gPSBvZmZzZXQtPnByZXZfZGM7Ci0gIGludCBpOwotICBqcGVnX2dldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbihjaW5mbywgb2Zmc2V0KTsKLSAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKLSAgICBkY19pbmZvW2ldID0gZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbaV07Ci0gIH0KLX0KLQotLyoKLSAqIFNhdmUgdGhlIGN1cnJlbnQgSHVmZm1hbiBkZWNvZGVyIHBvc2l0aW9uIGFuZCB0aGUgYml0IGJ1ZmZlcgotICogaW50byBiaXRzdHJlYW1fb2Zmc2V0IGFuZCBnZXRfYnVmZmVyLCByZXNwZWN0aXZlbHkuCi0gKi8KLUdMT0JBTCh2b2lkKQotanBlZ19nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24oal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgaHVmZm1hbl9vZmZzZXRfZGF0YSAqb2Zmc2V0KQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgLy8gV2UgYXJlIGF0IHRoZSBlbmQgb2YgYSBkYXRhIHNlZ21lbnQKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCi0JcmV0dXJuOwotICB9Ci0KLSAgLy8gU2F2ZSByZXN0YXJ0c190b19nbyBhbmQgbmV4dF9yZXN0YXJ0X251bQotICBvZmZzZXQtPnJlc3RhcnRzX3RvX2dvID0gKHVuc2lnbmVkIHNob3J0KSBlbnRyb3B5LT5yZXN0YXJ0c190b19nbzsKLSAgb2Zmc2V0LT5uZXh0X3Jlc3RhcnRfbnVtID0gY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bTsKLQotICBvZmZzZXQtPmJpdHN0cmVhbV9vZmZzZXQgPQotICAgICAgKGpnZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGNpbmZvKSA8PCBMT0dfVFdPX0JJVF9CVUZfU0laRSkKLSAgICAgICsgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0OwotCi0gIG9mZnNldC0+Z2V0X2J1ZmZlciA9IGVudHJvcHktPmJpdHN0YXRlLmdldF9idWZmZXI7Ci19Ci0KLS8qCi0gKiBDb25maWd1cmUgdGhlIEh1ZmZtYW4gZGVjb2RlciB0byBkZWNvZGUgdGhlIGltYWdlCi0gKiBzdGFydGluZyBmcm9tIHRoZSBiaXRzdHJlYW0gcG9zaXRpb24gcmVjb3JkZWQgaW4gb2Zmc2V0LgotICovCi1NRVRIT0RERUYodm9pZCkKLWNvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9vZmZzZXRfZGF0YSBvZmZzZXQpCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgc2hvcnQgaW50ICpkY19pbmZvID0gb2Zmc2V0LnByZXZfZGM7Ci0gIGludCBpOwotICBqcGVnX2NvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIoY2luZm8sIG9mZnNldCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKSB7Ci0gICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbaV0gPSBkY19pbmZvW2ldOwotICB9Ci19Ci0KLS8qCi0gKiBDb25maWd1cmUgdGhlIEh1ZmZtYW4gZGVjb2RlciByZWFkZXIgcG9zaXRpb24gYW5kIGJpdCBidWZmZXIuCi0gKi8KLUdMT0JBTCh2b2lkKQotanBlZ19jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgb2Zmc2V0KQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0KLSAgLy8gUmVzdG9yZSByZXN0YXJ0c190b19nbyBhbmQgbmV4dF9yZXN0YXJ0X251bQotICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7Ci0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gb2Zmc2V0LnJlc3RhcnRzX3RvX2dvOwotICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtID0gb2Zmc2V0Lm5leHRfcmVzdGFydF9udW07Ci0KLSAgdW5zaWduZWQgaW50IGJpdHN0cmVhbV9vZmZzZXQgPSBvZmZzZXQuYml0c3RyZWFtX29mZnNldDsKLSAgaW50IGJsa24sIGk7Ci0KLSAgdW5zaWduZWQgaW50IGJ5dGVfb2Zmc2V0ID0gYml0c3RyZWFtX29mZnNldCA+PiBMT0dfVFdPX0JJVF9CVUZfU0laRTsKLSAgdW5zaWduZWQgaW50IGJpdF9pbl9iaXRfYnVmZmVyID0KLSAgICAgIGJpdHN0cmVhbV9vZmZzZXQgJiAoKDEgPDwgTE9HX1RXT19CSVRfQlVGX1NJWkUpIC0gMSk7Ci0KLSAganNldF9pbnB1dF9zdHJlYW1fcG9zaXRpb25fYml0KGNpbmZvLCBieXRlX29mZnNldCwKLSAgICAgICAgICBiaXRfaW5fYml0X2J1ZmZlciwgb2Zmc2V0LmdldF9idWZmZXIpOwotfQotCi0vKgotICogRGVjb2RlIGFuZCByZXR1cm4gb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCi0gKiBUaGUgY29lZmZpY2llbnRzIGFyZSByZW9yZGVyZWQgZnJvbSB6aWd6YWcgb3JkZXIgaW50byBuYXR1cmFsIGFycmF5IG9yZGVyLAotICogYnV0IGFyZSBub3QgZGVxdWFudGl6ZWQuCi0gKgotICogVGhlIGkndGggYmxvY2sgb2YgdGhlIE1DVSBpcyBzdG9yZWQgaW50byB0aGUgYmxvY2sgcG9pbnRlZCB0byBieQotICogTUNVX2RhdGFbaV0uICBXRSBBU1NVTUUgVEhJUyBBUkVBIEhBUyBCRUVOIFpFUk9FRCBCWSBUSEUgQ0FMTEVSLgotICogKFdob2xlc2FsZSB6ZXJvaW5nIGlzIHVzdWFsbHkgYSBsaXR0bGUgZmFzdGVyIHRoYW4gcmV0YWlsLi4uKQotICoKLSAqIFJldHVybnMgRkFMU0UgaWYgZGF0YSBzb3VyY2UgcmVxdWVzdGVkIHN1c3BlbnNpb24uICBJbiB0aGF0IGNhc2Ugbm8KLSAqIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcGVybWFuZW50IHN0YXRlLiAgKEV4Y2VwdGlvbjogc29tZSBvdXRwdXQKLSAqIGNvZWZmaWNpZW50cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYXNzaWduZWQuICBUaGlzIGlzIGhhcm1sZXNzIGZvcgotICogdGhpcyBtb2R1bGUsIHNpbmNlIHdlJ2xsIGp1c3QgcmUtYXNzaWduIHRoZW0gb24gdGhlIG5leHQgY2FsbC4pCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBibGtuOwotICBCSVRSRUFEX1NUQVRFX1ZBUlM7Ci0gIHNhdmFibGVfc3RhdGUgc3RhdGU7Ci0KLSAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCi0gICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgotICAgKi8KLSAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7Ci0gICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCi0gICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICBBU1NJR05fU1RBVEUoc3RhdGUsIGVudHJvcHktPnNhdmVkKTsKLQotICAgIC8qIE91dGVyIGxvb3AgaGFuZGxlcyBlYWNoIGJsb2NrIGluIHRoZSBNQ1UgKi8KLQotICAgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7Ci0gICAgICBKQkxPQ0tST1cgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKLSAgICAgIGRfZGVyaXZlZF90YmwgKiBkY3RibCA9IGVudHJvcHktPmRjX2N1cl90YmxzW2Jsa25dOwotICAgICAgZF9kZXJpdmVkX3RibCAqIGFjdGJsID0gZW50cm9weS0+YWNfY3VyX3RibHNbYmxrbl07Ci0gICAgICByZWdpc3RlciBpbnQgcywgaywgcjsKLQotICAgICAgLyogRGVjb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCi0KLSAgICAgIC8qIFNlY3Rpb24gRi4yLjIuMTogZGVjb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlICovCi0gICAgICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgZGN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwxKTsKLSAgICAgIGlmIChzKSB7Ci0JQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKLQlyID0gR0VUX0JJVFMocyk7Ci0JcyA9IEhVRkZfRVhURU5EKHIsIHMpOwotICAgICAgfQotCi0gICAgICBpZiAoZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dKSB7Ci0JLyogQ29udmVydCBEQyBkaWZmZXJlbmNlIHRvIGFjdHVhbCB2YWx1ZSwgdXBkYXRlIGxhc3RfZGNfdmFsICovCi0JaW50IGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOwotCXMgKz0gc3RhdGUubGFzdF9kY192YWxbY2ldOwotCXN0YXRlLmxhc3RfZGNfdmFsW2NpXSA9IHM7Ci0JLyogT3V0cHV0IHRoZSBEQyBjb2VmZmljaWVudCAoYXNzdW1lcyBqcGVnX25hdHVyYWxfb3JkZXJbMF0gPSAwKSAqLwotCSgqYmxvY2spWzBdID0gKEpDT0VGKSBzOwotICAgICAgfQotCi0gICAgICBpZiAoZW50cm9weS0+YWNfbmVlZGVkW2Jsa25dKSB7Ci0KLQkvKiBTZWN0aW9uIEYuMi4yLjI6IGRlY29kZSB0aGUgQUMgY29lZmZpY2llbnRzICovCi0JLyogU2luY2UgemVyb2VzIGFyZSBza2lwcGVkLCBvdXRwdXQgYXJlYSBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlaGFuZCAqLwotCWZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7Ci0JICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgYWN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwyKTsKLSAgICAgIAotCSAgciA9IHMgPj4gNDsKLQkgIHMgJj0gMTU7Ci0gICAgICAKLQkgIGlmIChzKSB7Ci0JICAgIGsgKz0gcjsKLQkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKLQkgICAgciA9IEdFVF9CSVRTKHMpOwotCSAgICBzID0gSFVGRl9FWFRFTkQociwgcyk7Ci0JICAgIC8qIE91dHB1dCBjb2VmZmljaWVudCBpbiBuYXR1cmFsIChkZXppZ3phZ2dlZCkgb3JkZXIuCi0JICAgICAqIE5vdGU6IHRoZSBleHRyYSBlbnRyaWVzIGluIGpwZWdfbmF0dXJhbF9vcmRlcltdIHdpbGwgc2F2ZSB1cwotCSAgICAgKiBpZiBrID49IERDVFNJWkUyLCB3aGljaCBjb3VsZCBoYXBwZW4gaWYgdGhlIGRhdGEgaXMgY29ycnVwdGVkLgotCSAgICAgKi8KLQkgICAgKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXSA9IChKQ09FRikgczsKLQkgIH0gZWxzZSB7Ci0JICAgIGlmIChyICE9IDE1KQotCSAgICAgIGJyZWFrOwotCSAgICBrICs9IDE1OwotCSAgfQotCX0KLQotICAgICAgfSBlbHNlIHsKLQotCS8qIFNlY3Rpb24gRi4yLjIuMjogZGVjb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgKi8KLQkvKiBJbiB0aGlzIHBhdGggd2UganVzdCBkaXNjYXJkIHRoZSB2YWx1ZXMgKi8KLQlmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgewotCSAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGFjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMyk7Ci0gICAgICAKLQkgIHIgPSBzID4+IDQ7Ci0JICBzICY9IDE1OwotICAgICAgCi0JICBpZiAocykgewotCSAgICBrICs9IHI7Ci0JICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JICAgIERST1BfQklUUyhzKTsKLQkgIH0gZWxzZSB7Ci0JICAgIGlmIChyICE9IDE1KQotCSAgICAgIGJyZWFrOwotCSAgICBrICs9IDE1OwotCSAgfQotCX0KLQotICAgICAgfQotICAgIH0KLQotICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLwotICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0gICAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZSk7Ci0gIH0KLQotICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCi0gKiBUaGUgcHJvcG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxjdWxhdGUgdGhlCi0gKiBkYXRhIGxlbmd0aCBvZiBvbmUgTUNVIGluIEh1ZmZtYW4tY29kZWQgZm9ybWF0LgotICogVGhlcmVmb3JlLCBhbGwgY29lZmZpY2llbnRzIGFyZSBkaXNjYXJkZWQuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X2Rpc2NhcmRfY29lZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgYmxrbjsKLSAgQklUUkVBRF9TVEFURV9WQVJTOwotICBzYXZhYmxlX3N0YXRlIHN0YXRlOwotCi0gIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKLQlyZXR1cm4gRkFMU0U7Ci0gIH0KLQotICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKLQotICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0gICAgQVNTSUdOX1NUQVRFKHN0YXRlLCBlbnRyb3B5LT5zYXZlZCk7Ci0KLSAgICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCi0KLSAgICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgICAgZF9kZXJpdmVkX3RibCAqIGRjdGJsID0gZW50cm9weS0+ZGNfY3VyX3RibHNbYmxrbl07Ci0gICAgICBkX2Rlcml2ZWRfdGJsICogYWN0YmwgPSBlbnRyb3B5LT5hY19jdXJfdGJsc1tibGtuXTsKLSAgICAgIHJlZ2lzdGVyIGludCBzLCBrLCByOwotCi0gICAgICAvKiBEZWNvZGUgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KLQotICAgICAgLyogU2VjdGlvbiBGLjIuMi4xOiBkZWNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgKi8KLSAgICAgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBkY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDEpOwotICAgICAgaWYgKHMpIHsKLQlDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOwotCXIgPSBHRVRfQklUUyhzKTsKLQlzID0gSFVGRl9FWFRFTkQociwgcyk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGRpc2NhcmQgYWxsIGNvZWZmaWNpZW50cyAqLwotICAgICAgaWYgKGVudHJvcHktPmRjX25lZWRlZFtibGtuXSkgewotCS8qIENvbnZlcnQgREMgZGlmZmVyZW5jZSB0byBhY3R1YWwgdmFsdWUsIHVwZGF0ZSBsYXN0X2RjX3ZhbCAqLwotCWludCBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLQlzICs9IHN0YXRlLmxhc3RfZGNfdmFsW2NpXTsKLQlzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOwotICAgICAgfQotICAgICAgZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKLSAgICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGFjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMyk7Ci0KLSAgICAgICAgciA9IHMgPj4gNDsKLSAgICAgICAgcyAmPSAxNTsKLQotICAgICAgICBpZiAocykgewotICAgICAgICAgIGsgKz0gcjsKLSAgICAgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOwotICAgICAgICAgIERST1BfQklUUyhzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAociAhPSAxNSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGsgKz0gMTU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUpOwotICB9Ci0KLSAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfaHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7Ci0gIGludCBpOwotCi0gIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihodWZmX2VudHJvcHlfZGVjb2RlcikpOwotICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKikgZW50cm9weTsKLSAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2h1ZmZfZGVjb2RlcjsKLSAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1OwotICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYgPSBkZWNvZGVfbWN1X2Rpc2NhcmRfY29lZjsKLSAgZW50cm9weS0+cHViLmNvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIgPSBjb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyOwotICBlbnRyb3B5LT5wdWIuZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uID0KLSAgICAgICAgZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uOwotICBlbnRyb3B5LT5wdWIuaW5kZXggPSBOVUxMOwotCi0gIC8qIE1hcmsgdGFibGVzIHVuYWxsb2NhdGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbaV0gPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbaV0gPSBOVUxMOwotICB9Ci19Ci0KLS8qCi0gKiBDYWxsIGFmdGVyIGpwZWdfcmVhZF9oZWFkZXIKLSAqLwotR0xPQkFMKHZvaWQpCi1qcGVnX2NyZWF0ZV9odWZmbWFuX2luZGV4KGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGh1ZmZtYW5faW5kZXggKmluZGV4KQotewotICBpbnQgaSwgczsKLSAgaW5kZXgtPnNjYW5fY291bnQgPSAxOwotICBpbmRleC0+dG90YWxfaU1DVV9yb3dzID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKLSAgaW5kZXgtPnNjYW4gPSAoaHVmZm1hbl9zY2FuX2hlYWRlciopbWFsbG9jKGluZGV4LT5zY2FuX2NvdW50Ci0gICAgICAgICAgKiBzaXplb2YoaHVmZm1hbl9zY2FuX2hlYWRlcikpOwotICBpbmRleC0+c2NhblswXS5vZmZzZXQgPSAoaHVmZm1hbl9vZmZzZXRfZGF0YSoqKW1hbGxvYyhjaW5mby0+dG90YWxfaU1DVV9yb3dzCi0gICAgICAgICAgKiBzaXplb2YoaHVmZm1hbl9vZmZzZXRfZGF0YSopKTsKLSAgaW5kZXgtPnNjYW5bMF0ucHJldl9NQ1Vfb2Zmc2V0LmJpdHN0cmVhbV9vZmZzZXQgPSAwOwotICBpbmRleC0+TUNVX3NhbXBsZV9zaXplID0gREVGQVVMVF9NQ1VfU0FNUExFX1NJWkU7Ci0KLSAgaW5kZXgtPm1lbV91c2VkID0gc2l6ZW9mKGh1ZmZtYW5fc2Nhbl9oZWFkZXIpCi0gICAgICArIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgKiBzaXplb2YoaHVmZm1hbl9vZmZzZXRfZGF0YSopOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZGVzdHJveV9odWZmbWFuX2luZGV4KGh1ZmZtYW5faW5kZXggKmluZGV4KQotewotICAgIGludCBpLCBqOwotICAgIGZvciAoaSA9IDA7IGkgPCBpbmRleC0+c2Nhbl9jb3VudDsgaSsrKSB7Ci0gICAgICAgIGZvcihqID0gMDsgaiA8IGluZGV4LT50b3RhbF9pTUNVX3Jvd3M7IGorKykgewotICAgICAgICAgICAgZnJlZShpbmRleC0+c2NhbltpXS5vZmZzZXRbal0pOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUoaW5kZXgtPnNjYW5baV0ub2Zmc2V0KTsKLSAgICB9Ci0gICAgZnJlZShpbmRleC0+c2Nhbik7Ci19Ci0KLS8qCi0gKiBTZXQgdGhlIHJlYWRlciBieXRlIHBvc2l0aW9uIHRvIG9mZnNldAotICovCi1HTE9CQUwodm9pZCkKLWpzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBvZmZzZXQpCi17Ci0gIGlmIChjaW5mby0+c3JjLT5zZWVrX2lucHV0X2RhdGEpIHsKLSAgICBjaW5mby0+c3JjLT5zZWVrX2lucHV0X2RhdGEoY2luZm8sIG9mZnNldCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyID0gY2luZm8tPnNyYy0+Y3VycmVudF9vZmZzZXQgLSBvZmZzZXQ7Ci0gICAgY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlID0gY2luZm8tPnNyYy0+c3RhcnRfaW5wdXRfYnl0ZSArIG9mZnNldDsKLSAgfQotfQotCi0vKgotICogU2V0IHRoZSByZWFkZXIgYnl0ZSBwb3NpdGlvbiB0byBvZmZzZXQgYW5kIGJpdCBwb3NpdGlvbiB0byBiaXRfbGVmdAotICogd2l0aCBiaXQgYnVmZmVyIHNldCB0byBidWYuCi0gKi8KLUdMT0JBTCh2b2lkKQotanNldF9pbnB1dF9zdHJlYW1fcG9zaXRpb25fYml0KGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgIGludCBieXRlX29mZnNldCwgaW50IGJpdF9sZWZ0LCBJTlQzMiBidWYpCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLQotICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSBiaXRfbGVmdDsKLSAgZW50cm9weS0+Yml0c3RhdGUuZ2V0X2J1ZmZlciA9IGJ1ZjsKLQotICBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihjaW5mbywgYnl0ZV9vZmZzZXQpOwotfQotCi0vKgotICogR2V0IHRoZSBjdXJyZW50IHJlYWRlciBieXRlIHBvc2l0aW9uLgotICovCi1HTE9CQUwoaW50KQotamdldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24oal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcmV0dXJuIGNpbmZvLT5zcmMtPmN1cnJlbnRfb2Zmc2V0IC0gY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyOwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRodWZmLmggYi9saWJqcGVndHdycC9qZGh1ZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2MGExMy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZGh1ZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogamRodWZmLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbnMgZm9yIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcwotICogdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gdGhlIHNlcXVlbnRpYWwgZGVjb2RlciAoamRodWZmLmMpIGFuZCB0aGUKLSAqIHByb2dyZXNzaXZlIGRlY29kZXIgKGpkcGh1ZmYuYykuICBObyBvdGhlciBtb2R1bGVzIG5lZWQgdG8gc2VlIHRoZXNlLgotICovCi0KLS8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLwotCi0jaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI2RlZmluZSBqcGVnX21ha2VfZF9kZXJpdmVkX3RibAlqTWtERGVyaXZlZAotI2RlZmluZSBqcGVnX2ZpbGxfYml0X2J1ZmZlcglqRmlsQml0QnVmCi0jZGVmaW5lIGpwZWdfaHVmZl9kZWNvZGUJakh1ZkRlY29kZQotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotCi0vKiBEZXJpdmVkIGRhdGEgY29uc3RydWN0ZWQgZm9yIGVhY2ggSHVmZm1hbiB0YWJsZSAqLwotCi0jZGVmaW5lIEhVRkZfTE9PS0FIRUFECTgJLyogIyBvZiBiaXRzIG9mIGxvb2thaGVhZCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIEJhc2ljIHRhYmxlczogKGVsZW1lbnQgWzBdIG9mIGVhY2ggYXJyYXkgaXMgdW51c2VkKSAqLwotICBJTlQzMiBtYXhjb2RlWzE4XTsJCS8qIGxhcmdlc3QgY29kZSBvZiBsZW5ndGggayAoLTEgaWYgbm9uZSkgKi8KLSAgLyogKG1heGNvZGVbMTddIGlzIGEgc2VudGluZWwgdG8gZW5zdXJlIGpwZWdfaHVmZl9kZWNvZGUgdGVybWluYXRlcykgKi8KLSAgSU5UMzIgdmFsb2Zmc2V0WzE3XTsJCS8qIGh1ZmZ2YWxbXSBvZmZzZXQgZm9yIGNvZGVzIG9mIGxlbmd0aCBrICovCi0gIC8qIHZhbG9mZnNldFtrXSA9IGh1ZmZ2YWxbXSBpbmRleCBvZiAxc3Qgc3ltYm9sIG9mIGNvZGUgbGVuZ3RoIGssIGxlc3MKLSAgICogdGhlIHNtYWxsZXN0IGNvZGUgb2YgbGVuZ3RoIGs7IHNvIGdpdmVuIGEgY29kZSBvZiBsZW5ndGggaywgdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgc3ltYm9sIGlzIGh1ZmZ2YWxbY29kZSArIHZhbG9mZnNldFtrXV0KLSAgICovCi0KLSAgLyogTGluayB0byBwdWJsaWMgSHVmZm1hbiB0YWJsZSAobmVlZGVkIG9ubHkgaW4ganBlZ19odWZmX2RlY29kZSkgKi8KLSAgSkhVRkZfVEJMICpwdWI7Ci0KLSAgLyogTG9va2FoZWFkIHRhYmxlczogaW5kZXhlZCBieSB0aGUgbmV4dCBIVUZGX0xPT0tBSEVBRCBiaXRzIG9mCi0gICAqIHRoZSBpbnB1dCBkYXRhIHN0cmVhbS4gIElmIHRoZSBuZXh0IEh1ZmZtYW4gY29kZSBpcyBubyBtb3JlCi0gICAqIHRoYW4gSFVGRl9MT09LQUhFQUQgYml0cyBsb25nLCB3ZSBjYW4gb2J0YWluIGl0cyBsZW5ndGggYW5kCi0gICAqIHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbCBkaXJlY3RseSBmcm9tIHRoZXNlIHRhYmxlcy4KLSAgICovCi0gIGludCBsb29rX25iaXRzWzE8PEhVRkZfTE9PS0FIRUFEXTsgLyogIyBiaXRzLCBvciAwIGlmIHRvbyBsb25nICovCi0gIFVJTlQ4IGxvb2tfc3ltWzE8PEhVRkZfTE9PS0FIRUFEXTsgLyogc3ltYm9sLCBvciB1bnVzZWQgKi8KLX0gZF9kZXJpdmVkX3RibDsKLQotLyogRXhwYW5kIGEgSHVmZm1hbiB0YWJsZSBkZWZpbml0aW9uIGludG8gdGhlIGRlcml2ZWQgZm9ybWF0ICovCi1FWFRFUk4odm9pZCkganBlZ19tYWtlX2RfZGVyaXZlZF90YmwKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAotCSAgICAgZF9kZXJpdmVkX3RibCAqKiBwZHRibCkpOwotCi0KLS8qCi0gKiBGZXRjaGluZyB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGlzIGEgdGltZS1jcml0aWNhbCBvcGVyYXRpb24KLSAqIGZvciB0aGUgSHVmZm1hbiBkZWNvZGVycy4gIFdlIGltcGxlbWVudCBpdCB3aXRoIGEgY29tYmluYXRpb24gb2YgaW5saW5lCi0gKiBtYWNyb3MgYW5kIG91dC1vZi1saW5lIHN1YnJvdXRpbmVzLiAgTm90ZSB0aGF0IE4gKHRoZSBudW1iZXIgb2YgYml0cwotICogZGVtYW5kZWQgYXQgb25lIHRpbWUpIG5ldmVyIGV4Y2VlZHMgMTUgZm9yIEpQRUcgdXNlLgotICoKLSAqIFdlIHJlYWQgc291cmNlIGJ5dGVzIGludG8gZ2V0X2J1ZmZlciBhbmQgZG9sZSBvdXQgYml0cyBhcyBuZWVkZWQuCi0gKiBJZiBnZXRfYnVmZmVyIGFscmVhZHkgY29udGFpbnMgZW5vdWdoIGJpdHMsIHRoZXkgYXJlIGZldGNoZWQgaW4tbGluZQotICogYnkgdGhlIG1hY3JvcyBDSEVDS19CSVRfQlVGRkVSIGFuZCBHRVRfQklUUy4gIFdoZW4gdGhlcmUgYXJlbid0IGVub3VnaAotICogYml0cywganBlZ19maWxsX2JpdF9idWZmZXIgaXMgY2FsbGVkOyBpdCB3aWxsIGF0dGVtcHQgdG8gZmlsbCBnZXRfYnVmZmVyCi0gKiBhcyBmdWxsIGFzIHBvc3NpYmxlIChub3QganVzdCB0byB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkOyB0aGlzCi0gKiBwcmVmZXRjaGluZyByZWR1Y2VzIHRoZSBvdmVyaGVhZCBjb3N0IG9mIGNhbGxpbmcganBlZ19maWxsX2JpdF9idWZmZXIpLgotICogTm90ZSB0aGF0IGpwZWdfZmlsbF9iaXRfYnVmZmVyIG1heSByZXR1cm4gRkFMU0UgdG8gaW5kaWNhdGUgc3VzcGVuc2lvbi4KLSAqIE9uIFRSVUUgcmV0dXJuLCBqcGVnX2ZpbGxfYml0X2J1ZmZlciBndWFyYW50ZWVzIHRoYXQgZ2V0X2J1ZmZlciBjb250YWlucwotICogYXQgbGVhc3QgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYml0cyAtLS0gZHVtbXkgemVyb2VzIGFyZSBpbnNlcnRlZCBpZgotICogbmVjZXNzYXJ5LgotICovCi0KLXR5cGVkZWYgSU5UMzIgYml0X2J1Zl90eXBlOwkvKiB0eXBlIG9mIGJpdC1leHRyYWN0aW9uIGJ1ZmZlciAqLwotI2RlZmluZSBCSVRfQlVGX1NJWkUgIDMyCS8qIHNpemUgb2YgYnVmZmVyIGluIGJpdHMgKi8KLSNkZWZpbmUgTE9HX1RXT19CSVRfQlVGX1NJWkUgIDUJLyogbG9nXzIoQklUX0JVRl9TSVpFKSAqLwotCi0vKiBJZiBsb25nIGlzID4gMzIgYml0cyBvbiB5b3VyIG1hY2hpbmUsIGFuZCBzaGlmdGluZy9tYXNraW5nIGxvbmdzIGlzCi0gKiByZWFzb25hYmx5IGZhc3QsIG1ha2luZyBiaXRfYnVmX3R5cGUgYmUgbG9uZyBhbmQgc2V0dGluZyBCSVRfQlVGX1NJWkUKLSAqIGFwcHJvcHJpYXRlbHkgc2hvdWxkIGJlIGEgd2luLiAgVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCBkZWZpbmUgdGhlIHNpemUKLSAqIHdpdGggc29tZXRoaW5nIGxpa2UgICNkZWZpbmUgQklUX0JVRl9TSVpFIChzaXplb2YoYml0X2J1Zl90eXBlKSo4KQotICogYmVjYXVzZSBub3QgYWxsIG1hY2hpbmVzIG1lYXN1cmUgc2l6ZW9mIGluIDgtYml0IGJ5dGVzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsJCS8qIEJpdHJlYWRpbmcgc3RhdGUgc2F2ZWQgYWNyb3NzIE1DVXMgKi8KLSAgYml0X2J1Zl90eXBlIGdldF9idWZmZXI7CS8qIGN1cnJlbnQgYml0LWV4dHJhY3Rpb24gYnVmZmVyICovCi0gIGludCBiaXRzX2xlZnQ7CQkvKiAjIG9mIHVudXNlZCBiaXRzIGluIGl0ICovCi19IGJpdHJlYWRfcGVybV9zdGF0ZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewkJLyogQml0cmVhZGluZyB3b3JraW5nIHN0YXRlIHdpdGhpbiBhbiBNQ1UgKi8KLSAgLyogQ3VycmVudCBkYXRhIHNvdXJjZSBsb2NhdGlvbiAqLwotICAvKiBXZSBuZWVkIGEgY29weSwgcmF0aGVyIHRoYW4gbXVuZ2luZyB0aGUgb3JpZ2luYWwsIGluIGNhc2Ugb2Ygc3VzcGVuc2lvbiAqLwotICBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGU7IC8qID0+IG5leHQgYnl0ZSB0byByZWFkIGZyb20gc291cmNlICovCi0gIHNpemVfdCBieXRlc19pbl9idWZmZXI7CS8qICMgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHNvdXJjZSBidWZmZXIgKi8KLSAgLyogQml0IGlucHV0IGJ1ZmZlciAtLS0gbm90ZSB0aGVzZSB2YWx1ZXMgYXJlIGtlcHQgaW4gcmVnaXN0ZXIgdmFyaWFibGVzLAotICAgKiBub3QgaW4gdGhpcyBzdHJ1Y3QsIGluc2lkZSB0aGUgaW5uZXIgbG9vcHMuCi0gICAqLwotICBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlcjsJLyogY3VycmVudCBiaXQtZXh0cmFjdGlvbiBidWZmZXIgKi8KLSAgaW50IGJpdHNfbGVmdDsJCS8qICMgb2YgdW51c2VkIGJpdHMgaW4gaXQgKi8KLSAgLyogUG9pbnRlciBuZWVkZWQgYnkganBlZ19maWxsX2JpdF9idWZmZXIuICovCi0gIGpfZGVjb21wcmVzc19wdHIgY2luZm87CS8qIGJhY2sgbGluayB0byBkZWNvbXByZXNzIG1hc3RlciByZWNvcmQgKi8KLX0gYml0cmVhZF93b3JraW5nX3N0YXRlOwotCi0vKiBNYWNyb3MgdG8gZGVjbGFyZSBhbmQgbG9hZC9zYXZlIGJpdHJlYWQgbG9jYWwgdmFyaWFibGVzLiAqLwotI2RlZmluZSBCSVRSRUFEX1NUQVRFX1ZBUlMgIFwKLQlyZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlcjsgIFwKLQlyZWdpc3RlciBpbnQgYml0c19sZWZ0OyAgXAotCWJpdHJlYWRfd29ya2luZ19zdGF0ZSBicl9zdGF0ZQotCi0jZGVmaW5lIEJJVFJFQURfTE9BRF9TVEFURShjaW5mb3AscGVybXN0YXRlKSAgXAotCWJyX3N0YXRlLmNpbmZvID0gY2luZm9wOyBcCi0JYnJfc3RhdGUubmV4dF9pbnB1dF9ieXRlID0gY2luZm9wLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsgXAotCWJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlciA9IGNpbmZvcC0+c3JjLT5ieXRlc19pbl9idWZmZXI7IFwKLQlnZXRfYnVmZmVyID0gcGVybXN0YXRlLmdldF9idWZmZXI7IFwKLQliaXRzX2xlZnQgPSBwZXJtc3RhdGUuYml0c19sZWZ0OwotCi0jZGVmaW5lIEJJVFJFQURfU0FWRV9TVEFURShjaW5mb3AscGVybXN0YXRlKSAgXAotCWNpbmZvcC0+c3JjLT5uZXh0X2lucHV0X2J5dGUgPSBicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGU7IFwKLQljaW5mb3AtPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyID0gYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyOyBcCi0JcGVybXN0YXRlLmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOyBcCi0JcGVybXN0YXRlLmJpdHNfbGVmdCA9IGJpdHNfbGVmdAotCi0vKgotICogVGhlc2UgbWFjcm9zIHByb3ZpZGUgdGhlIGluLWxpbmUgcG9ydGlvbiBvZiBiaXQgZmV0Y2hpbmcuCi0gKiBVc2UgQ0hFQ0tfQklUX0JVRkZFUiB0byBlbnN1cmUgdGhlcmUgYXJlIE4gYml0cyBpbiBnZXRfYnVmZmVyCi0gKiBiZWZvcmUgdXNpbmcgR0VUX0JJVFMsIFBFRUtfQklUUywgb3IgRFJPUF9CSVRTLgotICogVGhlIHZhcmlhYmxlcyBnZXRfYnVmZmVyIGFuZCBiaXRzX2xlZnQgYXJlIGFzc3VtZWQgdG8gYmUgbG9jYWxzLAotICogYnV0IHRoZSBzdGF0ZSBzdHJ1Y3QgbWlnaHQgbm90IGJlIChqcGVnX2h1ZmZfZGVjb2RlIG5lZWRzIHRoaXMpLgotICoJQ0hFQ0tfQklUX0JVRkZFUihzdGF0ZSxuLGFjdGlvbik7Ci0gKgkJRW5zdXJlIHRoZXJlIGFyZSBOIGJpdHMgaW4gZ2V0X2J1ZmZlcjsgaWYgc3VzcGVuZCwgdGFrZSBhY3Rpb24uCi0gKiAgICAgIHZhbCA9IEdFVF9CSVRTKG4pOwotICoJCUZldGNoIG5leHQgTiBiaXRzLgotICogICAgICB2YWwgPSBQRUVLX0JJVFMobik7Ci0gKgkJRmV0Y2ggbmV4dCBOIGJpdHMgd2l0aG91dCByZW1vdmluZyB0aGVtIGZyb20gdGhlIGJ1ZmZlci4KLSAqCURST1BfQklUUyhuKTsKLSAqCQlEaXNjYXJkIG5leHQgTiBiaXRzLgotICogVGhlIHZhbHVlIE4gc2hvdWxkIGJlIGEgc2ltcGxlIHZhcmlhYmxlLCBub3QgYW4gZXhwcmVzc2lvbiwgYmVjYXVzZSBpdAotICogaXMgZXZhbHVhdGVkIG11bHRpcGxlIHRpbWVzLgotICovCi0KLSNkZWZpbmUgQ0hFQ0tfQklUX0JVRkZFUihzdGF0ZSxuYml0cyxhY3Rpb24pIFwKLQl7IGlmIChiaXRzX2xlZnQgPCAobmJpdHMpKSB7ICBcCi0JICAgIGlmICghIGpwZWdfZmlsbF9iaXRfYnVmZmVyKCYoc3RhdGUpLGdldF9idWZmZXIsYml0c19sZWZ0LG5iaXRzKSkgIFwKLQkgICAgICB7IGFjdGlvbjsgfSAgXAotCSAgICBnZXRfYnVmZmVyID0gKHN0YXRlKS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSAoc3RhdGUpLmJpdHNfbGVmdDsgfSB9Ci0KLSNkZWZpbmUgR0VUX0JJVFMobmJpdHMpIFwKLQkoKChpbnQpIChnZXRfYnVmZmVyID4+IChiaXRzX2xlZnQgLT0gKG5iaXRzKSkpKSAmICgoMTw8KG5iaXRzKSktMSkpCi0KLSNkZWZpbmUgUEVFS19CSVRTKG5iaXRzKSBcCi0JKCgoaW50KSAoZ2V0X2J1ZmZlciA+PiAoYml0c19sZWZ0IC0gIChuYml0cykpKSkgJiAoKDE8PChuYml0cykpLTEpKQotCi0jZGVmaW5lIERST1BfQklUUyhuYml0cykgXAotCShiaXRzX2xlZnQgLT0gKG5iaXRzKSkKLQotLyogTG9hZCB1cCB0aGUgYml0IGJ1ZmZlciB0byBhIGRlcHRoIG9mIGF0IGxlYXN0IG5iaXRzICovCi1FWFRFUk4oYm9vbGVhbikganBlZ19maWxsX2JpdF9idWZmZXIKLQlKUFAoKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLCByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwKLQkgICAgIHJlZ2lzdGVyIGludCBiaXRzX2xlZnQsIGludCBuYml0cykpOwotCi0KLS8qCi0gKiBDb2RlIGZvciBleHRyYWN0aW5nIG5leHQgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZnJvbSBpbnB1dCBiaXQgc3RyZWFtLgotICogQWdhaW4sIHRoaXMgaXMgdGltZS1jcml0aWNhbCBhbmQgd2UgbWFrZSB0aGUgbWFpbiBwYXRocyBiZSBtYWNyb3MuCi0gKgotICogV2UgdXNlIGEgbG9va2FoZWFkIHRhYmxlIHRvIHByb2Nlc3MgY29kZXMgb2YgdXAgdG8gSFVGRl9MT09LQUhFQUQgYml0cwotICogd2l0aG91dCBsb29waW5nLiAgVXN1YWxseSwgbW9yZSB0aGFuIDk1JSBvZiB0aGUgSHVmZm1hbiBjb2RlcyB3aWxsIGJlIDgKLSAqIG9yIGZld2VyIGJpdHMgbG9uZy4gIFRoZSBmZXcgb3Zlcmxlbmd0aCBjb2RlcyBhcmUgaGFuZGxlZCB3aXRoIGEgbG9vcCwKLSAqIHdoaWNoIG5lZWQgbm90IGJlIGlubGluZSBjb2RlLgotICoKLSAqIE5vdGVzIGFib3V0IHRoZSBIVUZGX0RFQ09ERSBtYWNybzoKLSAqIDEuIE5lYXIgdGhlIGVuZCBvZiB0aGUgZGF0YSBzZWdtZW50LCB3ZSBtYXkgZmFpbCB0byBnZXQgZW5vdWdoIGJpdHMKLSAqICAgIGZvciBhIGxvb2thaGVhZC4gIEluIHRoYXQgY2FzZSwgd2UgZG8gaXQgdGhlIGhhcmQgd2F5LgotICogMi4gSWYgdGhlIGxvb2thaGVhZCB0YWJsZSBjb250YWlucyBubyBlbnRyeSwgdGhlIG5leHQgY29kZSBtdXN0IGJlCi0gKiAgICBtb3JlIHRoYW4gSFVGRl9MT09LQUhFQUQgYml0cyBsb25nLgotICogMy4ganBlZ19odWZmX2RlY29kZSByZXR1cm5zIC0xIGlmIGZvcmNlZCB0byBzdXNwZW5kLgotICovCi0KLSNkZWZpbmUgSFVGRl9ERUNPREUocmVzdWx0LHN0YXRlLGh0YmwsZmFpbGFjdGlvbixzbG93bGFiZWwpIFwKLXsgcmVnaXN0ZXIgaW50IG5iLCBsb29rOyBcCi0gIGlmIChiaXRzX2xlZnQgPCBIVUZGX0xPT0tBSEVBRCkgeyBcCi0gICAgaWYgKCEganBlZ19maWxsX2JpdF9idWZmZXIoJnN0YXRlLGdldF9idWZmZXIsYml0c19sZWZ0LCAwKSkge2ZhaWxhY3Rpb247fSBcCi0gICAgZ2V0X2J1ZmZlciA9IHN0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IHN0YXRlLmJpdHNfbGVmdDsgXAotICAgIGlmIChiaXRzX2xlZnQgPCBIVUZGX0xPT0tBSEVBRCkgeyBcCi0gICAgICBuYiA9IDE7IGdvdG8gc2xvd2xhYmVsOyBcCi0gICAgfSBcCi0gIH0gXAotICBsb29rID0gUEVFS19CSVRTKEhVRkZfTE9PS0FIRUFEKTsgXAotICBpZiAoKG5iID0gaHRibC0+bG9va19uYml0c1tsb29rXSkgIT0gMCkgeyBcCi0gICAgRFJPUF9CSVRTKG5iKTsgXAotICAgIHJlc3VsdCA9IGh0YmwtPmxvb2tfc3ltW2xvb2tdOyBcCi0gIH0gZWxzZSB7IFwKLSAgICBuYiA9IEhVRkZfTE9PS0FIRUFEKzE7IFwKLXNsb3dsYWJlbDogXAotICAgIGlmICgocmVzdWx0PWpwZWdfaHVmZl9kZWNvZGUoJnN0YXRlLGdldF9idWZmZXIsYml0c19sZWZ0LGh0YmwsbmIpKSA8IDApIFwKLQl7IGZhaWxhY3Rpb247IH0gXAotICAgIGdldF9idWZmZXIgPSBzdGF0ZS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSBzdGF0ZS5iaXRzX2xlZnQ7IFwKLSAgfSBcCi19Ci0KLS8qIE91dC1vZi1saW5lIGNhc2UgZm9yIEh1ZmZtYW4gY29kZSBmZXRjaGluZyAqLwotRVhURVJOKGludCkganBlZ19odWZmX2RlY29kZQotCUpQUCgoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLAotCSAgICAgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwgZF9kZXJpdmVkX3RibCAqIGh0YmwsIGludCBtaW5fYml0cykpOwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRpbnB1dC5jIGIvbGlianBlZ3R3cnAvamRpbnB1dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjYxYzFhLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pkaW5wdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vKgotICogamRpbnB1dC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgaW5wdXQgY29udHJvbCBsb2dpYyBmb3IgdGhlIEpQRUcgZGVjb21wcmVzc29yLgotICogVGhlc2Ugcm91dGluZXMgYXJlIGNvbmNlcm5lZCB3aXRoIGNvbnRyb2xsaW5nIHRoZSBkZWNvbXByZXNzb3IncyBpbnB1dAotICogcHJvY2Vzc2luZyAobWFya2VyIHJlYWRpbmcgYW5kIGNvZWZmaWNpZW50IGRlY29kaW5nKS4gIFRoZSBhY3R1YWwgaW5wdXQKLSAqIHJlYWRpbmcgaXMgZG9uZSBpbiBqZG1hcmtlci5jLCBqZGh1ZmYuYywgYW5kIGpkcGh1ZmYuYy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogUHJpdmF0ZSBzdGF0ZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgYm9vbGVhbiBpbmhlYWRlcnM7CQkvKiBUUlVFIHVudGlsIGZpcnN0IFNPUyBpcyByZWFjaGVkICovCi19IG15X2lucHV0X2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfaW5wdXRfY29udHJvbGxlciAqIG15X2lucHV0Y3RsX3B0cjsKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKGludCkgY29uc3VtZV9tYXJrZXJzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotTUVUSE9EREVGKGludCkgY29uc3VtZV9tYXJrZXJzX3dpdGhfaHVmZm1hbl9pbmRleCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LCBpbnQgY3VycmVudF9zY2FuKSk7Ci0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIGNhbGN1bGF0ZSB2YXJpb3VzIHF1YW50aXRpZXMgcmVsYXRlZCB0byB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UuCi0gKi8KLQotTE9DQUwodm9pZCkKLWluaXRpYWxfc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBDYWxsZWQgb25jZSwgd2hlbiBmaXJzdCBTT1MgbWFya2VyIGlzIHJlYWNoZWQgKi8KLXsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIC8qIE1ha2Ugc3VyZSBpbWFnZSBpc24ndCBiaWdnZXIgdGhhbiBJIGNhbiBoYW5kbGUgKi8KLSAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTiB8fAotICAgICAgKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04pCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfSU1BR0VfVE9PX0JJRywgKHVuc2lnbmVkIGludCkgSlBFR19NQVhfRElNRU5TSU9OKTsKLQotICAvKiBGb3Igbm93LCBwcmVjaXNpb24gbXVzdCBtYXRjaCBjb21waWxlZC1pbiB2YWx1ZS4uLiAqLwotICBpZiAoY2luZm8tPmRhdGFfcHJlY2lzaW9uICE9IEJJVFNfSU5fSlNBTVBMRSkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJFQ0lTSU9OLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24pOwotCi0gIC8qIENoZWNrIHRoYXQgbnVtYmVyIG9mIGNvbXBvbmVudHMgd29uJ3QgZXhjZWVkIGludGVybmFsIGFycmF5IHNpemVzICovCi0gIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUE9ORU5UUykKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKLQkgICAgIE1BWF9DT01QT05FTlRTKTsKLQotICAvKiBDb21wdXRlIG1heGltdW0gc2FtcGxpbmcgZmFjdG9yczsgY2hlY2sgZmFjdG9yIHZhbGlkaXR5ICovCi0gIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IDE7Ci0gIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IDE7Ci0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IgfHwKLQljb21wcHRyLT52X3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfU0FNUExJTkcpOwotICAgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IsCi0JCQkJICAgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcik7Ci0gICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJCQkgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgfQotCi0gIC8qIFdlIGluaXRpYWxpemUgRENUX3NjYWxlZF9zaXplIGFuZCBtaW5fRENUX3NjYWxlZF9zaXplIHRvIERDVFNJWkUuCi0gICAqIEluIHRoZSBmdWxsIGRlY29tcHJlc3NvciwgdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgamRtYXN0ZXIuYzsKLSAgICogYnV0IGluIHRoZSB0cmFuc2NvZGVyLCBqZG1hc3Rlci5jIGlzIG5vdCB1c2VkLCBzbyB3ZSBtdXN0IGRvIGl0IGhlcmUuCi0gICAqLwotICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7Ci0KLSAgLyogQ29tcHV0ZSBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHMgKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOwotICAgIC8qIFNpemUgaW4gRENUIGJsb2NrcyAqLwotICAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICAvKiBkb3duc2FtcGxlZF93aWR0aCBhbmQgZG93bnNhbXBsZWRfaGVpZ2h0IHdpbGwgYWxzbyBiZSBvdmVycmlkZGVuIGJ5Ci0gICAgICogamRtYXN0ZXIuYyBpZiB3ZSBhcmUgZG9pbmcgZnVsbCBkZWNvbXByZXNzaW9uLiAgVGhlIHRyYW5zY29kZXIgbGlicmFyeQotICAgICAqIGRvZXNuJ3QgdXNlIHRoZXNlIHZhbHVlcywgYnV0IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIG1pZ2h0LgotICAgICAqLwotICAgIC8qIFNpemUgaW4gc2FtcGxlcyAqLwotICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKLQkJICAgIChsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpOwotICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7Ci0gICAgLyogTWFyayBjb21wb25lbnQgbmVlZGVkLCB1bnRpbCBjb2xvciBjb252ZXJzaW9uIHNheXMgb3RoZXJ3aXNlICovCi0gICAgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCA9IFRSVUU7Ci0gICAgLyogTWFyayBubyBxdWFudGl6YXRpb24gdGFibGUgeWV0IHNhdmVkIGZvciBjb21wb25lbnQgKi8KLSAgICBjb21wcHRyLT5xdWFudF90YWJsZSA9IE5VTEw7Ci0gIH0KLQotICAvKiBDb21wdXRlIG51bWJlciBvZiBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93cy4gKi8KLSAgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyA9IChKRElNRU5TSU9OKQotICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCi0JCSAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSkpOwotCi0gIC8qIERlY2lkZSB3aGV0aGVyIGZpbGUgY29udGFpbnMgbXVsdGlwbGUgc2NhbnMgKi8KLSAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuIDwgY2luZm8tPm51bV9jb21wb25lbnRzIHx8IGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQotICAgIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zID0gVFJVRTsKLSAgZWxzZQotICAgIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7Ci0gIGNpbmZvLT5vcmlnaW5hbF9pbWFnZV93aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aDsKLX0KLQotTE9DQUwodm9pZCkKLXBlcl9zY2FuX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgcHJvY2Vzc2luZyBhIEpQRUcgc2NhbiAqLwotLyogY2luZm8tPmNvbXBzX2luX3NjYW4gYW5kIGNpbmZvLT5jdXJfY29tcF9pbmZvW10gd2VyZSBzZXQgZnJvbSBTT1MgbWFya2VyICovCi17Ci0gIGludCBjaSwgbWN1YmxrcywgdG1wOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICAKLSAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID09IDEpIHsKLSAgICAKLSAgICAvKiBOb25pbnRlcmxlYXZlZCAoc2luZ2xlLWNvbXBvbmVudCkgc2NhbiAqLwotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXTsKLSAgICAKLSAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLwotICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0gICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwotICAgIAotICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FuLCBhbHdheXMgb25lIGJsb2NrIHBlciBNQ1UgKi8KLSAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSAxOwotICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSAxOwotICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSAxOwotICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSAxOwotICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FucywgaXQgaXMgY29udmVuaWVudCB0byBkZWZpbmUgbGFzdF9yb3dfaGVpZ2h0Ci0gICAgICogYXMgdGhlIG51bWJlciBvZiBibG9jayByb3dzIHByZXNlbnQgaW4gdGhlIGxhc3QgaU1DVSByb3cuCi0gICAgICovCi0gICAgdG1wID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOwotICAgIAotICAgIC8qIFByZXBhcmUgYXJyYXkgZGVzY3JpYmluZyBNQ1UgY29tcG9zaXRpb24gKi8KLSAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDE7Ci0gICAgY2luZm8tPk1DVV9tZW1iZXJzaGlwWzBdID0gMDsKLSAgICAKLSAgfSBlbHNlIHsKLSAgICAKLSAgICAvKiBJbnRlcmxlYXZlZCAobXVsdGktY29tcG9uZW50KSBzY2FuICovCi0gICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuIDw9IDAgfHwgY2luZm8tPmNvbXBzX2luX3NjYW4gPiBNQVhfQ09NUFNfSU5fU0NBTikKLSAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPmNvbXBzX2luX3NjYW4sCi0JICAgICAgIE1BWF9DT01QU19JTl9TQ0FOKTsKLSAgICAKLSAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLwotICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwKLQkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKLSAgICBjaW5mby0+TUNVX3Jvd3NfaW5fc2NhbiA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwKLQkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKLSAgICAKLSAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDA7Ci0gICAgCi0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgICAvKiBTYW1wbGluZyBmYWN0b3JzIGdpdmUgIyBvZiBibG9ja3Mgb2YgY29tcG9uZW50IGluIGVhY2ggTUNVICovCi0gICAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwotICAgICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gY29tcHB0ci0+TUNVX3dpZHRoICogY29tcHB0ci0+TUNVX2hlaWdodDsKLSAgICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgICAvKiBGaWd1cmUgbnVtYmVyIG9mIG5vbi1kdW1teSBibG9ja3MgaW4gbGFzdCBNQ1UgY29sdW1uICYgcm93ICovCi0gICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX3dpZHRoKTsKLSAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX3dpZHRoOwotICAgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSB0bXA7Ci0jaWZkZWYgQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQotICAgICAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSkgewotICAgICAgICB0bXAgPSAoaW50KSAoamRpdl9yb3VuZF91cChjaW5mby0+aW1hZ2Vfd2lkdGgsIDgpCi0gICAgICAgICAgICAgICAgJSBjb21wcHRyLT5NQ1Vfd2lkdGgpOwotICAgICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV93aWR0aDsKLSAgICAgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSB0bXA7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgdG1wID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT5NQ1VfaGVpZ2h0KTsKLSAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX2hlaWdodDsKLSAgICAgIGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCA9IHRtcDsKLSAgICAgIC8qIFByZXBhcmUgYXJyYXkgZGVzY3JpYmluZyBNQ1UgY29tcG9zaXRpb24gKi8KLSAgICAgIG1jdWJsa3MgPSBjb21wcHRyLT5NQ1VfYmxvY2tzOwotICAgICAgaWYgKGNpbmZvLT5ibG9ja3NfaW5fTUNVICsgbWN1YmxrcyA+IERfTUFYX0JMT0NLU19JTl9NQ1UpCi0JRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTUNVX1NJWkUpOwotICAgICAgd2hpbGUgKG1jdWJsa3MtLSA+IDApIHsKLQljaW5mby0+TUNVX21lbWJlcnNoaXBbY2luZm8tPmJsb2Nrc19pbl9NQ1UrK10gPSBjaTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIH0KLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2RlY29tcHJlc3NfcGVyX3NjYW5fc2V0dXAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7Ci19Ci0KLQotCi0vKgotICogU2F2ZSBhd2F5IGEgY29weSBvZiB0aGUgUS10YWJsZSByZWZlcmVuY2VkIGJ5IGVhY2ggY29tcG9uZW50IHByZXNlbnQKLSAqIGluIHRoZSBjdXJyZW50IHNjYW4sIHVubGVzcyBhbHJlYWR5IHNhdmVkIGR1cmluZyBhIHByaW9yIHNjYW4uCi0gKgotICogSW4gYSBtdWx0aXBsZS1zY2FuIEpQRUcgZmlsZSwgdGhlIGVuY29kZXIgY291bGQgYXNzaWduIGRpZmZlcmVudCBjb21wb25lbnRzCi0gKiB0aGUgc2FtZSBRLXRhYmxlIHNsb3QgbnVtYmVyLCBidXQgY2hhbmdlIHRhYmxlIGRlZmluaXRpb25zIGJldHdlZW4gc2NhbnMKLSAqIHNvIHRoYXQgZWFjaCBjb21wb25lbnQgdXNlcyBhIGRpZmZlcmVudCBRLXRhYmxlLiAgKFRoZSBJSkcgZW5jb2RlciBpcyBub3QKLSAqIGN1cnJlbnRseSBjYXBhYmxlIG9mIGRvaW5nIHRoaXMsIGJ1dCBvdGhlciBlbmNvZGVycyBtaWdodC4pICBTaW5jZSB3ZSB3YW50Ci0gKiB0byBiZSBhYmxlIHRvIGRlcXVhbnRpemUgYWxsIHRoZSBjb21wb25lbnRzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHRoaXMKLSAqIG1lYW5zIHRoYXQgd2UgaGF2ZSB0byBzYXZlIGF3YXkgdGhlIHRhYmxlIGFjdHVhbGx5IHVzZWQgZm9yIGVhY2ggY29tcG9uZW50LgotICogV2UgZG8gdGhpcyBieSBjb3B5aW5nIHRoZSB0YWJsZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IHNjYW4gY29udGFpbmluZwotICogdGhlIGNvbXBvbmVudC4KLSAqIFRoZSBKUEVHIHNwZWMgcHJvaGliaXRzIHRoZSBlbmNvZGVyIGZyb20gY2hhbmdpbmcgdGhlIGNvbnRlbnRzIG9mIGEgUS10YWJsZQotICogc2xvdCBiZXR3ZWVuIHNjYW5zIG9mIGEgY29tcG9uZW50IHVzaW5nIHRoYXQgc2xvdC4gIElmIHRoZSBlbmNvZGVyIGRvZXMgc28KLSAqIGFueXdheSwgdGhpcyBkZWNvZGVyIHdpbGwgc2ltcGx5IHVzZSB0aGUgUS10YWJsZSB2YWx1ZXMgdGhhdCB3ZXJlIGN1cnJlbnQKLSAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgc2NhbiBmb3IgdGhlIGNvbXBvbmVudC4KLSAqCi0gKiBUaGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIGxvb2tzIG9ubHkgYXQgdGhlIHNhdmVkIHF1YW50IHRhYmxlcywKLSAqIG5vdCBhdCB0aGUgY3VycmVudCBRLXRhYmxlIHNsb3RzLgotICovCi0KLUxPQ0FMKHZvaWQpCi1sYXRjaF9xdWFudF90YWJsZXMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGludCBjaSwgcXRibG5vOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBKUVVBTlRfVEJMICogcXRibDsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgLyogTm8gd29yayBpZiB3ZSBhbHJlYWR5IHNhdmVkIFEtdGFibGUgZm9yIHRoaXMgY29tcG9uZW50ICovCi0gICAgaWYgKGNvbXBwdHItPnF1YW50X3RhYmxlICE9IE5VTEwpCi0gICAgICBjb250aW51ZTsKLSAgICAvKiBNYWtlIHN1cmUgc3BlY2lmaWVkIHF1YW50aXphdGlvbiB0YWJsZSBpcyBwcmVzZW50ICovCi0gICAgcXRibG5vID0gY29tcHB0ci0+cXVhbnRfdGJsX25vOwotICAgIGlmIChxdGJsbm8gPCAwIHx8IHF0YmxubyA+PSBOVU1fUVVBTlRfVEJMUyB8fAotCWNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dID09IE5VTEwpCi0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19RVUFOVF9UQUJMRSwgcXRibG5vKTsKLSAgICAvKiBPSywgc2F2ZSBhd2F5IHRoZSBxdWFudGl6YXRpb24gdGFibGUgKi8KLSAgICBxdGJsID0gKEpRVUFOVF9UQkwgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YoSlFVQU5UX1RCTCkpOwotICAgIE1FTUNPUFkocXRibCwgY2luZm8tPnF1YW50X3RibF9wdHJzW3F0Ymxub10sIFNJWkVPRihKUVVBTlRfVEJMKSk7Ci0gICAgY29tcHB0ci0+cXVhbnRfdGFibGUgPSBxdGJsOwotICB9Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGlucHV0IG1vZHVsZXMgdG8gcmVhZCBhIHNjYW4gb2YgY29tcHJlc3NlZCBkYXRhLgotICogVGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBpcyBkb25lIGJ5IGpkbWFzdGVyLmMgYWZ0ZXIgaW5pdGlhbGl6aW5nCi0gKiB0aGUgZW50aXJlIGRlY29tcHJlc3NvciAoZHVyaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcykuCi0gKiBTdWJzZXF1ZW50IGNhbGxzIGNvbWUgZnJvbSBjb25zdW1lX21hcmtlcnMsIGJlbG93LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfaW5wdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOwotICBsYXRjaF9xdWFudF90YWJsZXMoY2luZm8pOwotICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAoKmNpbmZvLT5jb2VmLT5zdGFydF9pbnB1dF9wYXNzKSAoY2luZm8pOwotICBjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQgPSBjaW5mby0+Y29lZi0+Y29uc3VtZV9kYXRhOwotICBjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXRfYnVpbGRfaHVmZm1hbl9pbmRleCA9Ci0gICAgICAgIGNpbmZvLT5jb2VmLT5jb25zdW1lX2RhdGFfYnVpbGRfaHVmZm1hbl9pbmRleDsKLX0KLQotCi0vKgotICogRmluaXNoIHVwIGFmdGVyIGlucHV0dGluZyBhIGNvbXByZXNzZWQtZGF0YSBzY2FuLgotICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgYWZ0ZXIgaXQncyByZWFkIGFsbAotICogdGhlIGV4cGVjdGVkIGRhdGEgb2YgdGhlIHNjYW4uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfaW5wdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0ID0gY29uc3VtZV9tYXJrZXJzOwotICBjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXRfYnVpbGRfaHVmZm1hbl9pbmRleCA9Ci0gICAgICAgIGNvbnN1bWVfbWFya2Vyc193aXRoX2h1ZmZtYW5faW5kZXg7Ci19Ci0KLQotTUVUSE9EREVGKGludCkKLWNvbnN1bWVfbWFya2Vyc193aXRoX2h1ZmZtYW5faW5kZXggKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LCBpbnQgY3VycmVudF9zY2FuKQotewotICAgIHJldHVybiBjb25zdW1lX21hcmtlcnMoY2luZm8pOwotfQotLyoKLSAqIFJlYWQgSlBFRyBtYXJrZXJzIGJlZm9yZSwgYmV0d2Vlbiwgb3IgYWZ0ZXIgY29tcHJlc3NlZC1kYXRhIHNjYW5zLgotICogQ2hhbmdlIHN0YXRlIGFzIG5lY2Vzc2FyeSB3aGVuIGEgbmV3IHNjYW4gaXMgcmVhY2hlZC4KLSAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1NVU1BFTkRFRCwgSlBFR19SRUFDSEVEX1NPUywgb3IgSlBFR19SRUFDSEVEX0VPSS4KLSAqCi0gKiBUaGUgY29uc3VtZV9pbnB1dCBtZXRob2QgcG9pbnRlciBwb2ludHMgZWl0aGVyIGhlcmUgb3IgdG8gdGhlCi0gKiBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgY29uc3VtZV9kYXRhIHJvdXRpbmUsIGRlcGVuZGluZyBvbiB3aGV0aGVyCi0gKiB3ZSBhcmUgcmVhZGluZyBhIGNvbXByZXNzZWQgZGF0YSBzZWdtZW50IG9yIGludGVyLXNlZ21lbnQgbWFya2Vycy4KLSAqLwotCi1NRVRIT0RERUYoaW50KQotY29uc3VtZV9tYXJrZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9pbnB1dGN0bF9wdHIgaW5wdXRjdGwgPSAobXlfaW5wdXRjdGxfcHRyKSBjaW5mby0+aW5wdXRjdGw7Ci0gIGludCB2YWw7Ci0KLSAgaWYgKGlucHV0Y3RsLT5wdWIuZW9pX3JlYWNoZWQpIC8qIEFmdGVyIGhpdHRpbmcgRU9JLCByZWFkIG5vIGZ1cnRoZXIgKi8KLSAgICByZXR1cm4gSlBFR19SRUFDSEVEX0VPSTsKLQotICB2YWwgPSAoKmNpbmZvLT5tYXJrZXItPnJlYWRfbWFya2VycykgKGNpbmZvKTsKLQotICBzd2l0Y2ggKHZhbCkgewotICBjYXNlIEpQRUdfUkVBQ0hFRF9TT1M6CS8qIEZvdW5kIFNPUyAqLwotICAgIGlmIChpbnB1dGN0bC0+aW5oZWFkZXJzKSB7CS8qIDFzdCBTT1MgKi8KLSAgICAgIGluaXRpYWxfc2V0dXAoY2luZm8pOwotICAgICAgaW5wdXRjdGwtPmluaGVhZGVycyA9IEZBTFNFOwotICAgICAgLyogTm90ZTogc3RhcnRfaW5wdXRfcGFzcyBtdXN0IGJlIGNhbGxlZCBieSBqZG1hc3Rlci5jCi0gICAgICAgKiBiZWZvcmUgYW55IG1vcmUgaW5wdXQgY2FuIGJlIGNvbnN1bWVkLiAgamRhcGltaW4uYyBpcwotICAgICAgICogcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyB0aGlzIHNlcXVlbmNpbmcuCi0gICAgICAgKi8KLSAgICB9IGVsc2UgewkJCS8qIDJuZCBvciBsYXRlciBTT1MgbWFya2VyICovCi0gICAgICBpZiAoISBpbnB1dGN0bC0+cHViLmhhc19tdWx0aXBsZV9zY2FucykKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0VPSV9FWFBFQ1RFRCk7IC8qIE9vcHMsIEkgd2Fzbid0IGV4cGVjdGluZyB0aGlzISAqLwotICAgICAgc3RhcnRfaW5wdXRfcGFzcyhjaW5mbyk7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIEpQRUdfUkVBQ0hFRF9FT0k6CS8qIEZvdW5kIEVPSSAqLwotICAgIGlucHV0Y3RsLT5wdWIuZW9pX3JlYWNoZWQgPSBUUlVFOwotICAgIGlmIChpbnB1dGN0bC0+aW5oZWFkZXJzKSB7CS8qIFRhYmxlcy1vbmx5IGRhdGFzdHJlYW0sIGFwcGFyZW50bHkgKi8KLSAgICAgIGlmIChjaW5mby0+bWFya2VyLT5zYXdfU09GKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfU09GX05PX1NPUyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFByZXZlbnQgaW5maW5pdGUgbG9vcCBpbiBjb2VmIGN0bHIncyBkZWNvbXByZXNzX2RhdGEgcm91dGluZQotICAgICAgICogaWYgdXNlciBzZXQgb3V0cHV0X3NjYW5fbnVtYmVyIGxhcmdlciB0aGFuIG51bWJlciBvZiBzY2Fucy4KLSAgICAgICAqLwotICAgICAgaWYgKGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPiBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIpCi0JY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlBFR19TVVNQRU5ERUQ6Ci0gICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gdmFsOwotfQotCi0KLS8qCi0gKiBSZXNldCBzdGF0ZSB0byBiZWdpbiBhIGZyZXNoIGRhdGFzdHJlYW0uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1yZXNldF9pbnB1dF9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9pbnB1dGN0bF9wdHIgaW5wdXRjdGwgPSAobXlfaW5wdXRjdGxfcHRyKSBjaW5mby0+aW5wdXRjdGw7Ci0KLSAgaW5wdXRjdGwtPnB1Yi5jb25zdW1lX2lucHV0ID0gY29uc3VtZV9tYXJrZXJzOwotICBpbnB1dGN0bC0+cHViLmNvbnN1bWVfaW5wdXRfYnVpbGRfaHVmZm1hbl9pbmRleCA9Ci0gICAgICAgIGNvbnN1bWVfbWFya2Vyc193aXRoX2h1ZmZtYW5faW5kZXg7Ci0gIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7IC8qICJ1bmtub3duIiB3b3VsZCBiZSBiZXR0ZXIgKi8KLSAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IEZBTFNFOwotICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gVFJVRTsKLSAgLyogUmVzZXQgb3RoZXIgbW9kdWxlcyAqLwotICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgKCpjaW5mby0+bWFya2VyLT5yZXNldF9tYXJrZXJfcmVhZGVyKSAoY2luZm8pOwotICAvKiBSZXNldCBwcm9ncmVzc2lvbiBzdGF0ZSAtLSB3b3VsZCBiZSBjbGVhbmVyIGlmIGVudHJvcHkgZGVjb2RlciBkaWQgdGhpcyAqLwotICBjaW5mby0+Y29lZl9iaXRzID0gTlVMTDsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgaW5wdXQgY29udHJvbGxlciBtb2R1bGUuCi0gKiBUaGlzIGlzIGNhbGxlZCBvbmx5IG9uY2UsIHdoZW4gdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IGlzIGNyZWF0ZWQuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9pbnB1dF9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9pbnB1dGN0bF9wdHIgaW5wdXRjdGw7Ci0KLSAgLyogQ3JlYXRlIHN1Ym9iamVjdCBpbiBwZXJtYW5lbnQgcG9vbCAqLwotICBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCi0JCQkJU0laRU9GKG15X2lucHV0X2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPmlucHV0Y3RsID0gKHN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgKikgaW5wdXRjdGw7Ci0gIC8qIEluaXRpYWxpemUgbWV0aG9kIHBvaW50ZXJzICovCi0gIGlucHV0Y3RsLT5wdWIuY29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKLSAgaW5wdXRjdGwtPnB1Yi5yZXNldF9pbnB1dF9jb250cm9sbGVyID0gcmVzZXRfaW5wdXRfY29udHJvbGxlcjsKLSAgaW5wdXRjdGwtPnB1Yi5zdGFydF9pbnB1dF9wYXNzID0gc3RhcnRfaW5wdXRfcGFzczsKLSAgaW5wdXRjdGwtPnB1Yi5maW5pc2hfaW5wdXRfcGFzcyA9IGZpbmlzaF9pbnB1dF9wYXNzOwotCi0gIGlucHV0Y3RsLT5wdWIuY29uc3VtZV9tYXJrZXJzID0gY29uc3VtZV9tYXJrZXJzX3dpdGhfaHVmZm1hbl9pbmRleDsKLSAgaW5wdXRjdGwtPnB1Yi5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXggPQotICAgICAgICBjb25zdW1lX21hcmtlcnNfd2l0aF9odWZmbWFuX2luZGV4OwotICAvKiBJbml0aWFsaXplIHN0YXRlOiBjYW4ndCB1c2UgcmVzZXRfaW5wdXRfY29udHJvbGxlciBzaW5jZSB3ZSBkb24ndAotICAgKiB3YW50IHRvIHRyeSB0byByZXNldCBvdGhlciBtb2R1bGVzIHlldC4KLSAgICovCi0gIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7IC8qICJ1bmtub3duIiB3b3VsZCBiZSBiZXR0ZXIgKi8KLSAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IEZBTFNFOwotICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkbWFpbmN0LmMgYi9saWJqcGVndHdycC9qZG1haW5jdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjcyMTdlLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pkbWFpbmN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLyoKLSAqIGpkbWFpbmN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciBmb3IgZGVjb21wcmVzc2lvbi4KLSAqIFRoZSBtYWluIGJ1ZmZlciBsaWVzIGJldHdlZW4gdGhlIEpQRUcgZGVjb21wcmVzc29yIHByb3BlciBhbmQgdGhlCi0gKiBwb3N0LXByb2Nlc3NvcjsgaXQgaG9sZHMgZG93bnNhbXBsZWQgZGF0YSBpbiB0aGUgSlBFRyBjb2xvcnNwYWNlLgotICoKLSAqIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgYnlwYXNzZWQgaW4gcmF3LWRhdGEgbW9kZSwgc2luY2UgdGhlIGFwcGxpY2F0aW9uCi0gKiBzdXBwbGllcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgbWFpbiBidWZmZXIgaW4gdGhhdCBjYXNlLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICogSW4gdGhlIGN1cnJlbnQgc3lzdGVtIGRlc2lnbiwgdGhlIG1haW4gYnVmZmVyIG5lZWQgbmV2ZXIgYmUgYSBmdWxsLWltYWdlCi0gKiBidWZmZXI7IGFueSBmdWxsLWhlaWdodCBidWZmZXJzIHdpbGwgYmUgZm91bmQgaW5zaWRlIHRoZSBjb2VmZmljaWVudCBvcgotICogcG9zdHByb2Nlc3NpbmcgY29udHJvbGxlcnMuICBOb25ldGhlbGVzcywgdGhlIG1haW4gY29udHJvbGxlciBpcyBub3QKLSAqIHRyaXZpYWwuICBJdHMgcmVzcG9uc2liaWxpdHkgaXMgdG8gcHJvdmlkZSBjb250ZXh0IHJvd3MgZm9yIHVwc2FtcGxpbmcvCi0gKiByZXNjYWxpbmcsIGFuZCBkb2luZyB0aGlzIGluIGFuIGVmZmljaWVudCBmYXNoaW9uIGlzIGEgYml0IHRyaWNreS4KLSAqCi0gKiBQb3N0cHJvY2Vzc29yIGlucHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAotICogaXMgZGVmaW5lZCB0byBiZSAodl9zYW1wX2ZhY3RvciAqIERDVF9zY2FsZWRfc2l6ZSAvIG1pbl9EQ1Rfc2NhbGVkX3NpemUpCi0gKiBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIChXZSByZXF1aXJlIERDVF9zY2FsZWRfc2l6ZSB2YWx1ZXMgdG8gYmUKLSAqIGNob3NlbiBzdWNoIHRoYXQgdGhlc2UgbnVtYmVycyBhcmUgaW50ZWdlcnMuICBJbiBwcmFjdGljZSBEQ1Rfc2NhbGVkX3NpemUKLSAqIHZhbHVlcyB3aWxsIGxpa2VseSBiZSBwb3dlcnMgb2YgdHdvLCBzbyB3ZSBhY3R1YWxseSBoYXZlIHRoZSBzdHJvbmdlcgotICogY29uZGl0aW9uIHRoYXQgRENUX3NjYWxlZF9zaXplIC8gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyBhbiBpbnRlZ2VyLikKLSAqIFVwc2FtcGxpbmcgd2lsbCB0eXBpY2FsbHkgcHJvZHVjZSBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbCByb3dzIGZyb20gZWFjaAotICogcm93IGdyb3VwICh0aW1lcyBhbnkgYWRkaXRpb25hbCBzY2FsZSBmYWN0b3IgdGhhdCB0aGUgdXBzYW1wbGVyIGlzCi0gKiBhcHBseWluZykuCi0gKgotICogVGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgd2lsbCBkZWxpdmVyIGRhdGEgdG8gdXMgb25lIGlNQ1Ugcm93IGF0IGEgdGltZTsKLSAqIGVhY2ggaU1DVSByb3cgY29udGFpbnMgdl9zYW1wX2ZhY3RvciAqIERDVF9zY2FsZWRfc2l6ZSBzYW1wbGUgcm93cywgb3IKLSAqIGV4YWN0bHkgbWluX0RDVF9zY2FsZWRfc2l6ZSByb3cgZ3JvdXBzLiAgKFRoaXMgYW1vdW50IG9mIGRhdGEgY29ycmVzcG9uZHMKLSAqIHRvIG9uZSByb3cgb2YgTUNVcyB3aGVuIHRoZSBpbWFnZSBpcyBmdWxseSBpbnRlcmxlYXZlZC4pICBOb3RlIHRoYXQgdGhlCi0gKiBudW1iZXIgb2Ygc2FtcGxlIHJvd3MgdmFyaWVzIGFjcm9zcyBjb21wb25lbnRzLCBidXQgdGhlIG51bWJlciBvZiByb3cKLSAqIGdyb3VwcyBkb2VzIG5vdC4gIFNvbWUgZ2FyYmFnZSBzYW1wbGUgcm93cyBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIGxhc3QgaU1DVQotICogcm93IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLgotICoKLSAqIERlcGVuZGluZyBvbiB0aGUgdmVydGljYWwgc2NhbGluZyBhbGdvcml0aG0gdXNlZCwgdGhlIHVwc2FtcGxlciBtYXkgbmVlZAotICogYWNjZXNzIHRvIHRoZSBzYW1wbGUgcm93KHMpIGFib3ZlIGFuZCBiZWxvdyBpdHMgY3VycmVudCBpbnB1dCByb3cgZ3JvdXAuCi0gKiBUaGUgdXBzYW1wbGVyIGlzIHJlcXVpcmVkIHRvIHNldCBuZWVkX2NvbnRleHRfcm93cyBUUlVFIGF0IGdsb2JhbCBzZWxlY3Rpb24KLSAqIHRpbWUgaWYgc28uICBXaGVuIG5lZWRfY29udGV4dF9yb3dzIGlzIEZBTFNFLCB0aGlzIGNvbnRyb2xsZXIgY2FuIHNpbXBseQotICogb2J0YWluIG9uZSBpTUNVIHJvdyBhdCBhIHRpbWUgZnJvbSB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBhbmQgZG9sZSBpdAotICogb3V0IGFzIHJvdyBncm91cHMgdG8gdGhlIHBvc3Rwcm9jZXNzb3IuCi0gKgotICogV2hlbiBuZWVkX2NvbnRleHRfcm93cyBpcyBUUlVFLCB0aGlzIGNvbnRyb2xsZXIgZ3VhcmFudGVlcyB0aGF0IHRoZSBidWZmZXIKLSAqIHBhc3NlZCB0byBwb3N0cHJvY2Vzc2luZyBjb250YWlucyBhdCBsZWFzdCBvbmUgcm93IGdyb3VwJ3Mgd29ydGggb2Ygc2FtcGxlcwotICogYWJvdmUgYW5kIGJlbG93IHRoZSByb3cgZ3JvdXAocykgYmVpbmcgcHJvY2Vzc2VkLiAgTm90ZSB0aGF0IHRoZSBjb250ZXh0Ci0gKiByb3dzICJhYm92ZSIgdGhlIGZpcnN0IHBhc3NlZCByb3cgZ3JvdXAgYXBwZWFyIGF0IG5lZ2F0aXZlIHJvdyBvZmZzZXRzIGluCi0gKiB0aGUgcGFzc2VkIGJ1ZmZlci4gIEF0IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHRoZSByZXF1aXJlZAotICogY29udGV4dCByb3dzIGFyZSBtYW51ZmFjdHVyZWQgYnkgZHVwbGljYXRpbmcgdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBzYW1wbGUKLSAqIHJvdzsgdGhpcyBhdm9pZHMgaGF2aW5nIHNwZWNpYWwgY2FzZXMgaW4gdGhlIHVwc2FtcGxpbmcgaW5uZXIgbG9vcHMuCi0gKgotICogVGhlIGFtb3VudCBvZiBjb250ZXh0IGlzIGZpeGVkIGF0IG9uZSByb3cgZ3JvdXAganVzdCBiZWNhdXNlIHRoYXQncyBhCi0gKiBjb252ZW5pZW50IG51bWJlciBmb3IgdGhpcyBjb250cm9sbGVyIHRvIHdvcmsgd2l0aC4gIFRoZSBleGlzdGluZwotICogdXBzYW1wbGVycyByZWFsbHkgb25seSBuZWVkIG9uZSBzYW1wbGUgcm93IG9mIGNvbnRleHQuICBBbiB1cHNhbXBsZXIKLSAqIHN1cHBvcnRpbmcgYXJiaXRyYXJ5IG91dHB1dCByZXNjYWxpbmcgbWlnaHQgd2lzaCBmb3IgbW9yZSB0aGFuIG9uZSByb3cKLSAqIGdyb3VwIG9mIGNvbnRleHQgd2hlbiBzaHJpbmtpbmcgdGhlIGltYWdlOyB0b3VnaCwgd2UgZG9uJ3QgaGFuZGxlIHRoYXQuCi0gKiAoVGhpcyBpcyBqdXN0aWZpZWQgYnkgdGhlIGFzc3VtcHRpb24gdGhhdCBkb3duc2l6aW5nIHdpbGwgYmUgaGFuZGxlZCBtb3N0bHkKLSAqIGJ5IGFkanVzdGluZyB0aGUgRENUX3NjYWxlZF9zaXplIHZhbHVlcywgc28gdGhhdCB0aGUgYWN0dWFsIHNjYWxlIGZhY3RvciBhdAotICogdGhlIHVwc2FtcGxlIHN0ZXAgbmVlZG4ndCBiZSBtdWNoIGxlc3MgdGhhbiBvbmUuKQotICoKLSAqIFRvIHByb3ZpZGUgdGhlIGRlc2lyZWQgY29udGV4dCwgd2UgaGF2ZSB0byByZXRhaW4gdGhlIGxhc3QgdHdvIHJvdyBncm91cHMKLSAqIG9mIG9uZSBpTUNVIHJvdyB3aGlsZSByZWFkaW5nIGluIHRoZSBuZXh0IGlNQ1Ugcm93LiAgKFRoZSBsYXN0IHJvdyBncm91cAotICogY2FuJ3QgYmUgcHJvY2Vzc2VkIHVudGlsIHdlIGhhdmUgYW5vdGhlciByb3cgZ3JvdXAgZm9yIGl0cyBiZWxvdy1jb250ZXh0LAotICogYW5kIHNvIHdlIGhhdmUgdG8gc2F2ZSB0aGUgbmV4dC10by1sYXN0IGdyb3VwIHRvbyBmb3IgaXRzIGFib3ZlLWNvbnRleHQuKQotICogV2UgY291bGQgZG8gdGhpcyBtb3N0IHNpbXBseSBieSBjb3B5aW5nIGRhdGEgYXJvdW5kIGluIG91ciBidWZmZXIsIGJ1dAotICogdGhhdCdkIGJlIHZlcnkgc2xvdy4gIFdlIGNhbiBhdm9pZCBjb3B5aW5nIGFueSBkYXRhIGJ5IGNyZWF0aW5nIGEgcmF0aGVyCi0gKiBzdHJhbmdlIHBvaW50ZXIgc3RydWN0dXJlLiAgSGVyZSdzIGhvdyBpdCB3b3Jrcy4gIFdlIGFsbG9jYXRlIGEgd29ya3NwYWNlCi0gKiBjb25zaXN0aW5nIG9mIE0rMiByb3cgZ3JvdXBzICh3aGVyZSBNID0gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyB0aGUgbnVtYmVyCi0gKiBvZiByb3cgZ3JvdXBzIHBlciBpTUNVIHJvdykuICBXZSBjcmVhdGUgdHdvIHNldHMgb2YgcmVkdW5kYW50IHBvaW50ZXJzIHRvCi0gKiB0aGUgd29ya3NwYWNlLiAgTGFiZWxpbmcgdGhlIHBoeXNpY2FsIHJvdyBncm91cHMgMCB0byBNKzEsIHRoZSBzeW50aGVzaXplZAotICogcG9pbnRlciBsaXN0cyBsb29rIGxpa2UgdGhpczoKLSAqICAgICAgICAgICAgICAgICAgIE0rMSAgICAgICAgICAgICAgICAgICAgICAgICAgTS0xCi0gKiBtYXN0ZXIgcG9pbnRlciAtLT4gMCAgICAgICAgIG1hc3RlciBwb2ludGVyIC0tPiAwCi0gKiAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0gKiAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotICogICAgICAgICAgICAgICAgICAgTS0zICAgICAgICAgICAgICAgICAgICAgICAgICBNLTMKLSAqICAgICAgICAgICAgICAgICAgIE0tMiAgICAgICAgICAgICAgICAgICAgICAgICAgIE0KLSAqICAgICAgICAgICAgICAgICAgIE0tMSAgICAgICAgICAgICAgICAgICAgICAgICAgTSsxCi0gKiAgICAgICAgICAgICAgICAgICAgTSAgICAgICAgICAgICAgICAgICAgICAgICAgIE0tMgotICogICAgICAgICAgICAgICAgICAgTSsxICAgICAgICAgICAgICAgICAgICAgICAgICBNLTEKLSAqICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSAqIFdlIHJlYWQgYWx0ZXJuYXRlIGlNQ1Ugcm93cyB1c2luZyBlYWNoIG1hc3RlciBwb2ludGVyOyB0aHVzIHRoZSBsYXN0IHR3bwotICogcm93IGdyb3VwcyBvZiB0aGUgcHJldmlvdXMgaU1DVSByb3cgcmVtYWluIHVuLW92ZXJ3cml0dGVuIGluIHRoZSB3b3Jrc3BhY2UuCi0gKiBUaGUgcG9pbnRlciBsaXN0cyBhcmUgc2V0IHVwIHNvIHRoYXQgdGhlIHJlcXVpcmVkIGNvbnRleHQgcm93cyBhcHBlYXIgdG8KLSAqIGJlIGFkamFjZW50IHRvIHRoZSBwcm9wZXIgcGxhY2VzIHdoZW4gd2UgcGFzcyB0aGUgcG9pbnRlciBsaXN0cyB0byB0aGUKLSAqIHVwc2FtcGxlci4KLSAqCi0gKiBUaGUgYWJvdmUgcGljdHVyZXMgZGVzY3JpYmUgdGhlIG5vcm1hbCBzdGF0ZSBvZiB0aGUgcG9pbnRlciBsaXN0cy4KLSAqIEF0IHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgZGlkZGxlIHRoZSBwb2ludGVyIGxpc3RzIHRvIGR1cGxpY2F0ZQotICogdGhlIGZpcnN0IG9yIGxhc3Qgc2FtcGxlIHJvdyBhcyBuZWNlc3NhcnkgKHRoaXMgaXMgY2hlYXBlciB0aGFuIGNvcHlpbmcKLSAqIHNhbXBsZSByb3dzIGFyb3VuZCkuCi0gKgotICogVGhpcyBzY2hlbWUgYnJlYWtzIGRvd24gaWYgTSA8IDIsIGllLCBtaW5fRENUX3NjYWxlZF9zaXplIGlzIDEuICBJbiB0aGF0Ci0gKiBzaXR1YXRpb24gZWFjaCBpTUNVIHJvdyBwcm92aWRlcyBvbmx5IG9uZSByb3cgZ3JvdXAgc28gdGhlIGJ1ZmZlcmluZyBsb2dpYwotICogbXVzdCBiZSBkaWZmZXJlbnQgKGVnLCB3ZSBtdXN0IHJlYWQgdHdvIGlNQ1Ugcm93cyBiZWZvcmUgd2UgY2FuIGVtaXQgdGhlCi0gKiBmaXJzdCByb3cgZ3JvdXApLiAgRm9yIG5vdywgd2Ugc2ltcGx5IGRvIG5vdCBzdXBwb3J0IHByb3ZpZGluZyBjb250ZXh0Ci0gKiByb3dzIHdoZW4gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyAxLiAgVGhhdCBjb21iaW5hdGlvbiBzZWVtcyB1bmxpa2VseSB0bwotICogYmUgd29ydGggcHJvdmlkaW5nIC0tLSBpZiBzb21lb25lIHdhbnRzIGEgMS84dGgtc2l6ZSBwcmV2aWV3LCB0aGV5IHByb2JhYmx5Ci0gKiB3YW50IGl0IHF1aWNrIGFuZCBkaXJ0eSwgc28gYSBjb250ZXh0LWZyZWUgdXBzYW1wbGVyIGlzIHN1ZmZpY2llbnQuCi0gKi8KLQotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFBvaW50ZXIgdG8gYWxsb2NhdGVkIHdvcmtzcGFjZSAoTSBvciBNKzIgcm93IGdyb3VwcykuICovCi0gIEpTQU1QQVJSQVkgYnVmZmVyW01BWF9DT01QT05FTlRTXTsKLQotICBib29sZWFuIGJ1ZmZlcl9mdWxsOwkJLyogSGF2ZSB3ZSBnb3R0ZW4gYW4gaU1DVSByb3cgZnJvbSBkZWNvZGVyPyAqLwotICBKRElNRU5TSU9OIHJvd2dyb3VwX2N0cjsJLyogY291bnRzIHJvdyBncm91cHMgb3V0cHV0IHRvIHBvc3Rwcm9jZXNzb3IgKi8KLQotICAvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGNvbnRleHQgY2FzZS4gKi8KLQotICAvKiBUaGVzZSBhcmUgdGhlIG1hc3RlciBwb2ludGVycyB0byB0aGUgZnVubnktb3JkZXIgcG9pbnRlciBsaXN0cy4gKi8KLSAgSlNBTVBJTUFHRSB4YnVmZmVyWzJdOwkvKiBwb2ludGVycyB0byB3ZWlyZCBwb2ludGVyIGxpc3RzICovCi0KLSAgaW50IHdoaWNocHRyOwkJCS8qIGluZGljYXRlcyB3aGljaCBwb2ludGVyIHNldCBpcyBub3cgaW4gdXNlICovCi0gIGludCBjb250ZXh0X3N0YXRlOwkJLyogcHJvY2Vzc19kYXRhIHN0YXRlIG1hY2hpbmUgc3RhdHVzICovCi0gIEpESU1FTlNJT04gcm93Z3JvdXBzX2F2YWlsOwkvKiByb3cgZ3JvdXBzIGF2YWlsYWJsZSB0byBwb3N0cHJvY2Vzc29yICovCi0gIEpESU1FTlNJT04gaU1DVV9yb3dfY3RyOwkvKiBjb3VudHMgaU1DVSByb3dzIHRvIGRldGVjdCBpbWFnZSB0b3AvYm90ICovCi19IG15X21haW5fY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9tYWluX2NvbnRyb2xsZXIgKiBteV9tYWluX3B0cjsKLQotLyogY29udGV4dF9zdGF0ZSB2YWx1ZXM6ICovCi0jZGVmaW5lIENUWF9QUkVQQVJFX0ZPUl9JTUNVCTAJLyogbmVlZCB0byBwcmVwYXJlIGZvciBNQ1Ugcm93ICovCi0jZGVmaW5lIENUWF9QUk9DRVNTX0lNQ1UJMQkvKiBmZWVkaW5nIGlNQ1UgdG8gcG9zdHByb2Nlc3NvciAqLwotI2RlZmluZSBDVFhfUE9TVFBPTkVEX1JPVwkyCS8qIGZlZWRpbmcgcG9zdHBvbmVkIHJvdyBncm91cCAqLwotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCi0JICAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9jb250ZXh0X21haW4KLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKLQkgICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLCBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi1NRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3QKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKLQkgICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLCBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Ci0jZW5kaWYKLQotCi1MT0NBTCh2b2lkKQotYWxsb2NfZnVubnlfcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGZ1bm55IHBvaW50ZXIgbGlzdHMuCi0gKiBUaGlzIGlzIGRvbmUgb25seSBvbmNlLCBub3Qgb25jZSBwZXIgcGFzcy4KLSAqLwotewotICBteV9tYWluX3B0ciBtYWluX3B0ciA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47Ci0gIGludCBjaSwgcmdyb3VwOwotICBpbnQgTSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBKU0FNUEFSUkFZIHhidWY7Ci0KLSAgLyogR2V0IHRvcC1sZXZlbCBzcGFjZSBmb3IgY29tcG9uZW50IGFycmF5IHBvaW50ZXJzLgotICAgKiBXZSBhbGxvYyBib3RoIGFycmF5cyB3aXRoIG9uZSBjYWxsIHRvIHNhdmUgYSBmZXcgY3ljbGVzLgotICAgKi8KLSAgbWFpbl9wdHItPnhidWZmZXJbMF0gPSAoSlNBTVBJTUFHRSkKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCWNpbmZvLT5udW1fY29tcG9uZW50cyAqIDIgKiBTSVpFT0YoSlNBTVBBUlJBWSkpOwotICBtYWluX3B0ci0+eGJ1ZmZlclsxXSA9IG1haW5fcHRyLT54YnVmZmVyWzBdICsgY2luZm8tPm51bV9jb21wb25lbnRzOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KLSAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCi0gICAgLyogR2V0IHNwYWNlIGZvciBwb2ludGVyIGxpc3RzIC0tLSBNKzQgcm93IGdyb3VwcyBpbiBlYWNoIGxpc3QuCi0gICAgICogV2UgYWxsb2MgYm90aCBwb2ludGVyIGxpc3RzIHdpdGggb25lIGNhbGwgdG8gc2F2ZSBhIGZldyBjeWNsZXMuCi0gICAgICovCi0gICAgeGJ1ZiA9IChKU0FNUEFSUkFZKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIDIgKiAocmdyb3VwICogKE0gKyA0KSkgKiBTSVpFT0YoSlNBTVBST1cpKTsKLSAgICB4YnVmICs9IHJncm91cDsJCS8qIHdhbnQgb25lIHJvdyBncm91cCBhdCBuZWdhdGl2ZSBvZmZzZXRzICovCi0gICAgbWFpbl9wdHItPnhidWZmZXJbMF1bY2ldID0geGJ1ZjsKLSAgICB4YnVmICs9IHJncm91cCAqIChNICsgNCk7Ci0gICAgbWFpbl9wdHItPnhidWZmZXJbMV1bY2ldID0geGJ1ZjsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1tYWtlX2Z1bm55X3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogQ3JlYXRlIHRoZSBmdW5ueSBwb2ludGVyIGxpc3RzIGRpc2N1c3NlZCBpbiB0aGUgY29tbWVudHMgYWJvdmUuCi0gKiBUaGUgYWN0dWFsIHdvcmtzcGFjZSBpcyBhbHJlYWR5IGFsbG9jYXRlZCAoaW4gbWFpbi0+YnVmZmVyKSwKLSAqIGFuZCB0aGUgc3BhY2UgZm9yIHRoZSBwb2ludGVyIGxpc3RzIGlzIGFsbG9jYXRlZCB0b28uCi0gKiBUaGlzIHJvdXRpbmUganVzdCBmaWxscyBpbiB0aGUgY3VyaW91c2x5IG9yZGVyZWQgbGlzdHMuCi0gKiBUaGlzIHdpbGwgYmUgcmVwZWF0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBhc3MuCi0gKi8KLXsKLSAgbXlfbWFpbl9wdHIgbWFpbl9wdHIgPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotICBpbnQgY2ksIGksIHJncm91cDsKLSAgaW50IE0gPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSlNBTVBBUlJBWSBidWYsIHhidWYwLCB4YnVmMTsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCi0gICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLwotICAgIHhidWYwID0gbWFpbl9wdHItPnhidWZmZXJbMF1bY2ldOwotICAgIHhidWYxID0gbWFpbl9wdHItPnhidWZmZXJbMV1bY2ldOwotICAgIC8qIEZpcnN0IGNvcHkgdGhlIHdvcmtzcGFjZSBwb2ludGVycyBhcy1pcyAqLwotICAgIGJ1ZiA9IG1haW5fcHRyLT5idWZmZXJbY2ldOwotICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXAgKiAoTSArIDIpOyBpKyspIHsKLSAgICAgIHhidWYwW2ldID0geGJ1ZjFbaV0gPSBidWZbaV07Ci0gICAgfQotICAgIC8qIEluIHRoZSBzZWNvbmQgbGlzdCwgcHV0IHRoZSBsYXN0IGZvdXIgcm93IGdyb3VwcyBpbiBzd2FwcGVkIG9yZGVyICovCi0gICAgZm9yIChpID0gMDsgaSA8IHJncm91cCAqIDI7IGkrKykgewotICAgICAgeGJ1ZjFbcmdyb3VwKihNLTIpICsgaV0gPSBidWZbcmdyb3VwKk0gKyBpXTsKLSAgICAgIHhidWYxW3Jncm91cCpNICsgaV0gPSBidWZbcmdyb3VwKihNLTIpICsgaV07Ci0gICAgfQotICAgIC8qIFRoZSB3cmFwYXJvdW5kIHBvaW50ZXJzIGF0IHRvcCBhbmQgYm90dG9tIHdpbGwgYmUgZmlsbGVkIGxhdGVyCi0gICAgICogKHNlZSBzZXRfd3JhcGFyb3VuZF9wb2ludGVycywgYmVsb3cpLiAgSW5pdGlhbGx5IHdlIHdhbnQgdGhlICJhYm92ZSIKLSAgICAgKiBwb2ludGVycyB0byBkdXBsaWNhdGUgdGhlIGZpcnN0IGFjdHVhbCBkYXRhIGxpbmUuICBUaGlzIG9ubHkgbmVlZHMKLSAgICAgKiB0byBoYXBwZW4gaW4geGJ1ZmZlclswXS4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwOyBpKyspIHsKLSAgICAgIHhidWYwW2kgLSByZ3JvdXBdID0geGJ1ZjBbMF07Ci0gICAgfQotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLXNldF93cmFwYXJvdW5kX3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogU2V0IHVwIHRoZSAid3JhcGFyb3VuZCIgcG9pbnRlcnMgYXQgdG9wIGFuZCBib3R0b20gb2YgdGhlIHBvaW50ZXIgbGlzdHMuCi0gKiBUaGlzIGNoYW5nZXMgdGhlIHBvaW50ZXIgbGlzdCBzdGF0ZSBmcm9tIHRvcC1vZi1pbWFnZSB0byB0aGUgbm9ybWFsIHN0YXRlLgotICovCi17Ci0gIG15X21haW5fcHRyIG1haW5fcHRyID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLSAgaW50IGNpLCBpLCByZ3JvdXA7Ci0gIGludCBNID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpTQU1QQVJSQVkgeGJ1ZjAsIHhidWYxOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KLSAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCi0gICAgeGJ1ZjAgPSBtYWluX3B0ci0+eGJ1ZmZlclswXVtjaV07Ci0gICAgeGJ1ZjEgPSBtYWluX3B0ci0+eGJ1ZmZlclsxXVtjaV07Ci0gICAgZm9yIChpID0gMDsgaSA8IHJncm91cDsgaSsrKSB7Ci0gICAgICB4YnVmMFtpIC0gcmdyb3VwXSA9IHhidWYwW3Jncm91cCooTSsxKSArIGldOwotICAgICAgeGJ1ZjFbaSAtIHJncm91cF0gPSB4YnVmMVtyZ3JvdXAqKE0rMSkgKyBpXTsKLSAgICAgIHhidWYwW3Jncm91cCooTSsyKSArIGldID0geGJ1ZjBbaV07Ci0gICAgICB4YnVmMVtyZ3JvdXAqKE0rMikgKyBpXSA9IHhidWYxW2ldOwotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1zZXRfYm90dG9tX3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogQ2hhbmdlIHRoZSBwb2ludGVyIGxpc3RzIHRvIGR1cGxpY2F0ZSB0aGUgbGFzdCBzYW1wbGUgcm93IGF0IHRoZSBib3R0b20KLSAqIG9mIHRoZSBpbWFnZS4gIHdoaWNocHRyIGluZGljYXRlcyB3aGljaCB4YnVmZmVyIGhvbGRzIHRoZSBmaW5hbCBpTUNVIHJvdy4KLSAqIEFsc28gc2V0cyByb3dncm91cHNfYXZhaWwgdG8gaW5kaWNhdGUgbnVtYmVyIG9mIG5vbmR1bW15IHJvdyBncm91cHMgaW4gcm93LgotICovCi17Ci0gIG15X21haW5fcHRyIG1haW5fcHRyID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLSAgaW50IGNpLCBpLCByZ3JvdXAsIGlNQ1VoZWlnaHQsIHJvd3NfbGVmdDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSlNBTVBBUlJBWSB4YnVmOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgLyogQ291bnQgc2FtcGxlIHJvd3MgaW4gb25lIGlNQ1Ugcm93IGFuZCBpbiBvbmUgcm93IGdyb3VwICovCi0gICAgaU1DVWhlaWdodCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgcmdyb3VwID0gaU1DVWhlaWdodCAvIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICAgIC8qIENvdW50IG5vbmR1bW15IHNhbXBsZSByb3dzIHJlbWFpbmluZyBmb3IgdGhpcyBjb21wb25lbnQgKi8KLSAgICByb3dzX2xlZnQgPSAoaW50KSAoY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ICUgKEpESU1FTlNJT04pIGlNQ1VoZWlnaHQpOwotICAgIGlmIChyb3dzX2xlZnQgPT0gMCkgcm93c19sZWZ0ID0gaU1DVWhlaWdodDsKLSAgICAvKiBDb3VudCBub25kdW1teSByb3cgZ3JvdXBzLiAgU2hvdWxkIGdldCBzYW1lIGFuc3dlciBmb3IgZWFjaCBjb21wb25lbnQsCi0gICAgICogc28gd2UgbmVlZCBvbmx5IGRvIGl0IG9uY2UuCi0gICAgICovCi0gICAgaWYgKGNpID09IDApIHsKLSAgICAgIG1haW5fcHRyLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKChyb3dzX2xlZnQtMSkgLyByZ3JvdXAgKyAxKTsKLSAgICB9Ci0gICAgLyogRHVwbGljYXRlIHRoZSBsYXN0IHJlYWwgc2FtcGxlIHJvdyByZ3JvdXAqMiB0aW1lczsgdGhpcyBwYWRzIG91dCB0aGUKLSAgICAgKiBsYXN0IHBhcnRpYWwgcm93Z3JvdXAgYW5kIGVuc3VyZXMgYXQgbGVhc3Qgb25lIGZ1bGwgcm93Z3JvdXAgb2YgY29udGV4dC4KLSAgICAgKi8KLSAgICB4YnVmID0gbWFpbl9wdHItPnhidWZmZXJbbWFpbl9wdHItPndoaWNocHRyXVtjaV07Ci0gICAgZm9yIChpID0gMDsgaSA8IHJncm91cCAqIDI7IGkrKykgewotICAgICAgeGJ1Zltyb3dzX2xlZnQgKyBpXSA9IHhidWZbcm93c19sZWZ0LTFdOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfbWFpbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCi17Ci0gIG15X21haW5fcHRyIG1haW5fcHRyID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLQotICBzd2l0Y2ggKHBhc3NfbW9kZSkgewotICBjYXNlIEpCVUZfUEFTU19USFJVOgotICAgIGlmIChjaW5mby0+dXBzYW1wbGUtPm5lZWRfY29udGV4dF9yb3dzKSB7Ci0gICAgICBtYWluX3B0ci0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9jb250ZXh0X21haW47Ci0gICAgICBtYWtlX2Z1bm55X3BvaW50ZXJzKGNpbmZvKTsgLyogQ3JlYXRlIHRoZSB4YnVmZmVyW10gbGlzdHMgKi8KLSAgICAgIG1haW5fcHRyLT53aGljaHB0ciA9IDA7CS8qIFJlYWQgZmlyc3QgaU1DVSByb3cgaW50byB4YnVmZmVyWzBdICovCi0gICAgICBtYWluX3B0ci0+Y29udGV4dF9zdGF0ZSA9IENUWF9QUkVQQVJFX0ZPUl9JTUNVOwotICAgICAgbWFpbl9wdHItPmlNQ1Vfcm93X2N0ciA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFNpbXBsZSBjYXNlIHdpdGggbm8gY29udGV4dCBuZWVkZWQgKi8KLSAgICAgIG1haW5fcHRyLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluOwotICAgIH0KLSAgICBtYWluX3B0ci0+YnVmZmVyX2Z1bGwgPSBGQUxTRTsJLyogTWFyayBidWZmZXIgZW1wdHkgKi8KLSAgICBtYWluX3B0ci0+cm93Z3JvdXBfY3RyID0gMDsKLSAgICBicmVhazsKLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLSAgY2FzZSBKQlVGX0NSQU5LX0RFU1Q6Ci0gICAgLyogRm9yIGxhc3QgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uLCBqdXN0IGNyYW5rIHRoZSBwb3N0cHJvY2Vzc29yICovCi0gICAgbWFpbl9wdHItPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfY3JhbmtfcG9zdDsKLSAgICBicmVhazsKLSNlbmRpZgotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YS4KLSAqIFRoaXMgaGFuZGxlcyB0aGUgc2ltcGxlIGNhc2Ugd2hlcmUgbm8gY29udGV4dCBpcyByZXF1aXJlZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJCSAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKLXsKLSAgbXlfbWFpbl9wdHIgbWFpbl9wdHIgPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotICBKRElNRU5TSU9OIHJvd2dyb3Vwc19hdmFpbDsKLQotICAvKiBSZWFkIGlucHV0IGRhdGEgaWYgd2UgaGF2ZW4ndCBmaWxsZWQgdGhlIG1haW4gYnVmZmVyIHlldCAqLwotICBpZiAoISBtYWluX3B0ci0+YnVmZmVyX2Z1bGwpIHsKLSAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5kZWNvbXByZXNzX2RhdGEpIChjaW5mbywgbWFpbl9wdHItPmJ1ZmZlcikpCi0gICAgICByZXR1cm47CQkJLyogc3VzcGVuc2lvbiBmb3JjZWQsIGNhbiBkbyBub3RoaW5nIG1vcmUgKi8KLSAgICBtYWluX3B0ci0+YnVmZmVyX2Z1bGwgPSBUUlVFOwkvKiBPSywgd2UgaGF2ZSBhbiBpTUNVIHJvdyB0byB3b3JrIHdpdGggKi8KLSAgfQotCi0gIC8qIFRoZXJlIGFyZSBhbHdheXMgbWluX0RDVF9zY2FsZWRfc2l6ZSByb3cgZ3JvdXBzIGluIGFuIGlNQ1Ugcm93LiAqLwotICByb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gIC8qIE5vdGU6IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCB3ZSBtYXkgcGFzcyBleHRyYSBnYXJiYWdlIHJvdyBncm91cHMKLSAgICogdG8gdGhlIHBvc3Rwcm9jZXNzb3IuICBUaGUgcG9zdHByb2Nlc3NvciBoYXMgdG8gY2hlY2sgZm9yIGJvdHRvbQotICAgKiBvZiBpbWFnZSBhbnl3YXkgKGF0IHJvdyByZXNvbHV0aW9uKSwgc28gbm8gcG9pbnQgaW4gdXMgZG9pbmcgaXQgdG9vLgotICAgKi8KLQotICAvKiBGZWVkIHRoZSBwb3N0cHJvY2Vzc29yICovCi0gICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW5fcHRyLT5idWZmZXIsCi0JCQkJICAgICAmbWFpbl9wdHItPnJvd2dyb3VwX2N0ciwgcm93Z3JvdXBzX2F2YWlsLAotCQkJCSAgICAgb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKLQotICAvKiBIYXMgcG9zdHByb2Nlc3NvciBjb25zdW1lZCBhbGwgdGhlIGRhdGEgeWV0PyBJZiBzbywgbWFyayBidWZmZXIgZW1wdHkgKi8KLSAgaWYgKG1haW5fcHRyLT5yb3dncm91cF9jdHIgPj0gcm93Z3JvdXBzX2F2YWlsKSB7Ci0gICAgbWFpbl9wdHItPmJ1ZmZlcl9mdWxsID0gRkFMU0U7Ci0gICAgbWFpbl9wdHItPnJvd2dyb3VwX2N0ciA9IDA7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEuCi0gKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgY29udGV4dCByb3dzIG11c3QgYmUgcHJvdmlkZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcm9jZXNzX2RhdGFfY29udGV4dF9tYWluIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJCSAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi17Ci0gIG15X21haW5fcHRyIG1haW5fcHRyID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLQotICAvKiBSZWFkIGlucHV0IGRhdGEgaWYgd2UgaGF2ZW4ndCBmaWxsZWQgdGhlIG1haW4gYnVmZmVyIHlldCAqLwotICBpZiAoISBtYWluX3B0ci0+YnVmZmVyX2Z1bGwpIHsKLSAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5kZWNvbXByZXNzX2RhdGEpIChjaW5mbywKLQkJCQkJICAgbWFpbl9wdHItPnhidWZmZXJbbWFpbl9wdHItPndoaWNocHRyXSkpCi0gICAgICByZXR1cm47CQkJLyogc3VzcGVuc2lvbiBmb3JjZWQsIGNhbiBkbyBub3RoaW5nIG1vcmUgKi8KLSAgICBtYWluX3B0ci0+YnVmZmVyX2Z1bGwgPSBUUlVFOwkvKiBPSywgd2UgaGF2ZSBhbiBpTUNVIHJvdyB0byB3b3JrIHdpdGggKi8KLSAgICBtYWluX3B0ci0+aU1DVV9yb3dfY3RyKys7CS8qIGNvdW50IHJvd3MgcmVjZWl2ZWQgKi8KLSAgfQotCi0gIC8qIFBvc3Rwcm9jZXNzb3IgdHlwaWNhbGx5IHdpbGwgbm90IHN3YWxsb3cgYWxsIHRoZSBpbnB1dCBkYXRhIGl0IGlzIGhhbmRlZAotICAgKiBpbiBvbmUgY2FsbCAoZHVlIHRvIGZpbGxpbmcgdGhlIG91dHB1dCBidWZmZXIgZmlyc3QpLiAgTXVzdCBiZSBwcmVwYXJlZAotICAgKiB0byBleGl0IGFuZCByZXN0YXJ0LiAgVGhpcyBzd2l0Y2ggbGV0cyB1cyBrZWVwIHRyYWNrIG9mIGhvdyBmYXIgd2UgZ290LgotICAgKiBOb3RlIHRoYXQgZWFjaCBjYXNlIGZhbGxzIHRocm91Z2ggdG8gdGhlIG5leHQgb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLgotICAgKi8KLSAgc3dpdGNoIChtYWluX3B0ci0+Y29udGV4dF9zdGF0ZSkgewotICBjYXNlIENUWF9QT1NUUE9ORURfUk9XOgotICAgIC8qIENhbGwgcG9zdHByb2Nlc3NvciB1c2luZyBwcmV2aW91c2x5IHNldCBwb2ludGVycyBmb3IgcG9zdHBvbmVkIHJvdyAqLwotICAgICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW5fcHRyLT54YnVmZmVyW21haW5fcHRyLT53aGljaHB0cl0sCi0JCQkmbWFpbl9wdHItPnJvd2dyb3VwX2N0ciwgbWFpbl9wdHItPnJvd2dyb3Vwc19hdmFpbCwKLQkJCW91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7Ci0gICAgaWYgKG1haW5fcHRyLT5yb3dncm91cF9jdHIgPCBtYWluX3B0ci0+cm93Z3JvdXBzX2F2YWlsKQotICAgICAgcmV0dXJuOwkJCS8qIE5lZWQgdG8gc3VzcGVuZCAqLwotICAgIG1haW5fcHRyLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BSRVBBUkVfRk9SX0lNQ1U7Ci0gICAgaWYgKCpvdXRfcm93X2N0ciA+PSBvdXRfcm93c19hdmFpbCkKLSAgICAgIHJldHVybjsJCQkvKiBQb3N0cHJvY2Vzc29yIGV4YWN0bHkgZmlsbGVkIG91dHB1dCBidWYgKi8KLSAgICAvKkZBTExUSFJPVUdIKi8KLSAgY2FzZSBDVFhfUFJFUEFSRV9GT1JfSU1DVToKLSAgICAvKiBQcmVwYXJlIHRvIHByb2Nlc3MgZmlyc3QgTS0xIHJvdyBncm91cHMgb2YgdGhpcyBpTUNVIHJvdyAqLwotICAgIG1haW5fcHRyLT5yb3dncm91cF9jdHIgPSAwOwotICAgIG1haW5fcHRyLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIC0gMSk7Ci0gICAgLyogQ2hlY2sgZm9yIGJvdHRvbSBvZiBpbWFnZTogaWYgc28sIHR3ZWFrIHBvaW50ZXJzIHRvICJkdXBsaWNhdGUiCi0gICAgICogdGhlIGxhc3Qgc2FtcGxlIHJvdywgYW5kIGFkanVzdCByb3dncm91cHNfYXZhaWwgdG8gaWdub3JlIHBhZGRpbmcgcm93cy4KLSAgICAgKi8KLSAgICBpZiAobWFpbl9wdHItPmlNQ1Vfcm93X2N0ciA9PSBjaW5mby0+dG90YWxfaU1DVV9yb3dzKQotICAgICAgc2V0X2JvdHRvbV9wb2ludGVycyhjaW5mbyk7Ci0gICAgbWFpbl9wdHItPmNvbnRleHRfc3RhdGUgPSBDVFhfUFJPQ0VTU19JTUNVOwotICAgIC8qRkFMTFRIUk9VR0gqLwotICBjYXNlIENUWF9QUk9DRVNTX0lNQ1U6Ci0gICAgLyogQ2FsbCBwb3N0cHJvY2Vzc29yIHVzaW5nIHByZXZpb3VzbHkgc2V0IHBvaW50ZXJzICovCi0gICAgKCpjaW5mby0+cG9zdC0+cG9zdF9wcm9jZXNzX2RhdGEpIChjaW5mbywgbWFpbl9wdHItPnhidWZmZXJbbWFpbl9wdHItPndoaWNocHRyXSwKLQkJCSZtYWluX3B0ci0+cm93Z3JvdXBfY3RyLCBtYWluX3B0ci0+cm93Z3JvdXBzX2F2YWlsLAotCQkJb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKLSAgICBpZiAobWFpbl9wdHItPnJvd2dyb3VwX2N0ciA8IG1haW5fcHRyLT5yb3dncm91cHNfYXZhaWwpCi0gICAgICByZXR1cm47CQkJLyogTmVlZCB0byBzdXNwZW5kICovCi0gICAgLyogQWZ0ZXIgdGhlIGZpcnN0IGlNQ1UsIGNoYW5nZSB3cmFwYXJvdW5kIHBvaW50ZXJzIHRvIG5vcm1hbCBzdGF0ZSAqLwotICAgIGlmIChtYWluX3B0ci0+aU1DVV9yb3dfY3RyID09IDEpCi0gICAgICBzZXRfd3JhcGFyb3VuZF9wb2ludGVycyhjaW5mbyk7Ci0gICAgLyogUHJlcGFyZSB0byBsb2FkIG5ldyBpTUNVIHJvdyB1c2luZyBvdGhlciB4YnVmZmVyIGxpc3QgKi8KLSAgICBtYWluX3B0ci0+d2hpY2hwdHIgXj0gMTsJLyogMD0+MSBvciAxPT4wICovCi0gICAgbWFpbl9wdHItPmJ1ZmZlcl9mdWxsID0gRkFMU0U7Ci0gICAgLyogU3RpbGwgbmVlZCB0byBwcm9jZXNzIGxhc3Qgcm93IGdyb3VwIG9mIHRoaXMgaU1DVSByb3csICovCi0gICAgLyogd2hpY2ggaXMgc2F2ZWQgYXQgaW5kZXggTSsxIG9mIHRoZSBvdGhlciB4YnVmZmVyICovCi0gICAgbWFpbl9wdHItPnJvd2dyb3VwX2N0ciA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAxKTsKLSAgICBtYWluX3B0ci0+cm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSArIDIpOwotICAgIG1haW5fcHRyLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BPU1RQT05FRF9ST1c7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEuCi0gKiBGaW5hbCBwYXNzIG9mIHR3by1wYXNzIHF1YW50aXphdGlvbjoganVzdCBjYWxsIHRoZSBwb3N0cHJvY2Vzc29yLgotICogU291cmNlIGRhdGEgd2lsbCBiZSB0aGUgcG9zdHByb2Nlc3NvciBjb250cm9sbGVyJ3MgaW50ZXJuYWwgYnVmZmVyLgotICovCi0KLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLQotTUVUSE9EREVGKHZvaWQpCi1wcm9jZXNzX2RhdGFfY3JhbmtfcG9zdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkJIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi17Ci0gICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIChKU0FNUElNQUdFKSBOVUxMLAotCQkJCSAgICAgKEpESU1FTlNJT04gKikgTlVMTCwgKEpESU1FTlNJT04pIDAsCi0JCQkJICAgICBvdXRwdXRfYnVmLCBvdXRfcm93X2N0ciwgb3V0X3Jvd3NfYXZhaWwpOwotfQotCi0jZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgbWFpbiBidWZmZXIgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2RfbWFpbl9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCi17Ci0gIG15X21haW5fcHRyIG1haW5fcHRyOwotICBpbnQgY2ksIHJncm91cCwgbmdyb3VwczsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICBtYWluX3B0ciA9IChteV9tYWluX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9tYWluX2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPm1haW4gPSAoc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgKikgbWFpbl9wdHI7Ci0gIG1haW5fcHRyLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfbWFpbjsKLQotICBpZiAobmVlZF9mdWxsX2J1ZmZlcikJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHdvcmtzcGFjZS4KLSAgICogbmdyb3VwcyBpcyB0aGUgbnVtYmVyIG9mIHJvdyBncm91cHMgd2UgbmVlZC4KLSAgICovCi0gIGlmIChjaW5mby0+dXBzYW1wbGUtPm5lZWRfY29udGV4dF9yb3dzKSB7Ci0gICAgaWYgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIDwgMikgLyogdW5zdXBwb3J0ZWQsIHNlZSBjb21tZW50cyBhYm92ZSAqLwotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RJTVBMKTsKLSAgICBhbGxvY19mdW5ueV9wb2ludGVycyhjaW5mbyk7IC8qIEFsbG9jIHNwYWNlIGZvciB4YnVmZmVyW10gbGlzdHMgKi8KLSAgICBuZ3JvdXBzID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAyOwotICB9IGVsc2UgewotICAgIG5ncm91cHMgPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAgfQotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KLSAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCi0gICAgbWFpbl9wdHItPmJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLQkJCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplLAotCQkJIChKRElNRU5TSU9OKSAocmdyb3VwICogbmdyb3VwcykpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZG1hcmtlci5jIGIvbGlianBlZ3R3cnAvamRtYXJrZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzMjk0MC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZG1hcmtlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM5NyArMCwwIEBACi0vKgotICogamRtYXJrZXIuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIGRlY29kZSBKUEVHIGRhdGFzdHJlYW0gbWFya2Vycy4KLSAqIE1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgYXJpc2VzIGZyb20gb3VyIGRlc2lyZSB0byBzdXBwb3J0IGlucHV0Ci0gKiBzdXNwZW5zaW9uOiBpZiBub3QgYWxsIG9mIHRoZSBkYXRhIGZvciBhIG1hcmtlciBpcyBhdmFpbGFibGUsCi0gKiB3ZSBtdXN0IGV4aXQgYmFjayB0byB0aGUgYXBwbGljYXRpb24uICBPbiByZXN1bXB0aW9uLCB3ZSByZXByb2Nlc3MKLSAqIHRoZSBtYXJrZXIuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLXR5cGVkZWYgZW51bSB7CQkJLyogSlBFRyBtYXJrZXIgY29kZXMgKi8KLSAgTV9TT0YwICA9IDB4YzAsCi0gIE1fU09GMSAgPSAweGMxLAotICBNX1NPRjIgID0gMHhjMiwKLSAgTV9TT0YzICA9IDB4YzMsCi0gIAotICBNX1NPRjUgID0gMHhjNSwKLSAgTV9TT0Y2ICA9IDB4YzYsCi0gIE1fU09GNyAgPSAweGM3LAotICAKLSAgTV9KUEcgICA9IDB4YzgsCi0gIE1fU09GOSAgPSAweGM5LAotICBNX1NPRjEwID0gMHhjYSwKLSAgTV9TT0YxMSA9IDB4Y2IsCi0gIAotICBNX1NPRjEzID0gMHhjZCwKLSAgTV9TT0YxNCA9IDB4Y2UsCi0gIE1fU09GMTUgPSAweGNmLAotICAKLSAgTV9ESFQgICA9IDB4YzQsCi0gIAotICBNX0RBQyAgID0gMHhjYywKLSAgCi0gIE1fUlNUMCAgPSAweGQwLAotICBNX1JTVDEgID0gMHhkMSwKLSAgTV9SU1QyICA9IDB4ZDIsCi0gIE1fUlNUMyAgPSAweGQzLAotICBNX1JTVDQgID0gMHhkNCwKLSAgTV9SU1Q1ICA9IDB4ZDUsCi0gIE1fUlNUNiAgPSAweGQ2LAotICBNX1JTVDcgID0gMHhkNywKLSAgCi0gIE1fU09JICAgPSAweGQ4LAotICBNX0VPSSAgID0gMHhkOSwKLSAgTV9TT1MgICA9IDB4ZGEsCi0gIE1fRFFUICAgPSAweGRiLAotICBNX0ROTCAgID0gMHhkYywKLSAgTV9EUkkgICA9IDB4ZGQsCi0gIE1fREhQICAgPSAweGRlLAotICBNX0VYUCAgID0gMHhkZiwKLSAgCi0gIE1fQVBQMCAgPSAweGUwLAotICBNX0FQUDEgID0gMHhlMSwKLSAgTV9BUFAyICA9IDB4ZTIsCi0gIE1fQVBQMyAgPSAweGUzLAotICBNX0FQUDQgID0gMHhlNCwKLSAgTV9BUFA1ICA9IDB4ZTUsCi0gIE1fQVBQNiAgPSAweGU2LAotICBNX0FQUDcgID0gMHhlNywKLSAgTV9BUFA4ICA9IDB4ZTgsCi0gIE1fQVBQOSAgPSAweGU5LAotICBNX0FQUDEwID0gMHhlYSwKLSAgTV9BUFAxMSA9IDB4ZWIsCi0gIE1fQVBQMTIgPSAweGVjLAotICBNX0FQUDEzID0gMHhlZCwKLSAgTV9BUFAxNCA9IDB4ZWUsCi0gIE1fQVBQMTUgPSAweGVmLAotICAKLSAgTV9KUEcwICA9IDB4ZjAsCi0gIE1fSlBHMTMgPSAweGZkLAotICBNX0NPTSAgID0gMHhmZSwKLSAgCi0gIE1fVEVNICAgPSAweDAxLAotICAKLSAgTV9FUlJPUiA9IDB4MTAwCi19IEpQRUdfTUFSS0VSOwotCi0KLS8qIFByaXZhdGUgc3RhdGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIEFwcGxpY2F0aW9uLW92ZXJyaWRhYmxlIG1hcmtlciBwcm9jZXNzaW5nIG1ldGhvZHMgKi8KLSAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCBwcm9jZXNzX0NPTTsKLSAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCBwcm9jZXNzX0FQUG5bMTZdOwotCi0gIC8qIExpbWl0IG9uIG1hcmtlciBkYXRhIGxlbmd0aCB0byBzYXZlIGZvciBlYWNoIG1hcmtlciB0eXBlICovCi0gIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXRfQ09NOwotICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0X0FQUG5bMTZdOwotCi0gIC8qIFN0YXR1cyBvZiBDT00vQVBQbiBtYXJrZXIgc2F2aW5nICovCi0gIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBjdXJfbWFya2VyOwkvKiBOVUxMIGlmIG5vdCBwcm9jZXNzaW5nIGEgbWFya2VyICovCi0gIHVuc2lnbmVkIGludCBieXRlc19yZWFkOwkJLyogZGF0YSBieXRlcyByZWFkIHNvIGZhciBpbiBtYXJrZXIgKi8KLSAgLyogTm90ZTogY3VyX21hcmtlciBpcyBub3QgbGlua2VkIGludG8gbWFya2VyX2xpc3QgdW50aWwgaXQncyBhbGwgcmVhZC4gKi8KLX0gbXlfbWFya2VyX3JlYWRlcjsKLQotdHlwZWRlZiBteV9tYXJrZXJfcmVhZGVyICogbXlfbWFya2VyX3B0cjsKLQotCi0vKgotICogTWFjcm9zIGZvciBmZXRjaGluZyBkYXRhIGZyb20gdGhlIGRhdGEgc291cmNlIG1vZHVsZS4KLSAqCi0gKiBBdCBhbGwgdGltZXMsIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSBhbmQgLT5ieXRlc19pbl9idWZmZXIgcmVmbGVjdAotICogdGhlIGN1cnJlbnQgcmVzdGFydCBwb2ludDsgd2UgdXBkYXRlIHRoZW0gb25seSB3aGVuIHdlIGhhdmUgcmVhY2hlZCBhCi0gKiBzdWl0YWJsZSBwbGFjZSB0byByZXN0YXJ0IGlmIGEgc3VzcGVuc2lvbiBvY2N1cnMuCi0gKi8KLQotLyogRGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBsb2NhbCBjb3BpZXMgb2YgaW5wdXQgcG9pbnRlci9jb3VudCAqLwotI2RlZmluZSBJTlBVVF9WQVJTKGNpbmZvKSAgXAotCXN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgKiBkYXRhc3JjID0gKGNpbmZvKS0+c3JjOyAgXAotCWNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZSA9IGRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZTsgIFwKLQlzaXplX3QgYnl0ZXNfaW5fYnVmZmVyID0gZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyCi0KLS8qIFVubG9hZCB0aGUgbG9jYWwgY29waWVzIC0tLSBkbyB0aGlzIG9ubHkgYXQgYSByZXN0YXJ0IGJvdW5kYXJ5ICovCi0jZGVmaW5lIElOUFVUX1NZTkMoY2luZm8pICBcCi0JKCBkYXRhc3JjLT5uZXh0X2lucHV0X2J5dGUgPSBuZXh0X2lucHV0X2J5dGUsICBcCi0JICBkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXIgKQotCi0vKiBSZWxvYWQgdGhlIGxvY2FsIGNvcGllcyAtLS0gdXNlZCBvbmx5IGluIE1BS0VfQllURV9BVkFJTCAqLwotI2RlZmluZSBJTlBVVF9SRUxPQUQoY2luZm8pICBcCi0JKCBuZXh0X2lucHV0X2J5dGUgPSBkYXRhc3JjLT5uZXh0X2lucHV0X2J5dGUsICBcCi0JICBieXRlc19pbl9idWZmZXIgPSBkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIgKQotCi0vKiBJbnRlcm5hbCBtYWNybyBmb3IgSU5QVVRfQllURSBhbmQgSU5QVVRfMkJZVEVTOiBtYWtlIGEgYnl0ZSBhdmFpbGFibGUuCi0gKiBOb3RlIHdlIGRvICpub3QqIGRvIElOUFVUX1NZTkMgYmVmb3JlIGNhbGxpbmcgZmlsbF9pbnB1dF9idWZmZXIsCi0gKiBidXQgd2UgbXVzdCByZWxvYWQgdGhlIGxvY2FsIGNvcGllcyBhZnRlciBhIHN1Y2Nlc3NmdWwgZmlsbC4KLSAqLwotI2RlZmluZSBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKSAgXAotCWlmIChieXRlc19pbl9idWZmZXIgPT0gMCkgeyAgXAotCSAgaWYgKCEgKCpkYXRhc3JjLT5maWxsX2lucHV0X2J1ZmZlcikgKGNpbmZvKSkgIFwKLQkgICAgeyBhY3Rpb247IH0gIFwKLQkgIElOUFVUX1JFTE9BRChjaW5mbyk7ICBcCi0JfQotCi0vKiBSZWFkIGEgYnl0ZSBpbnRvIHZhcmlhYmxlIFYuCi0gKiBJZiBtdXN0IHN1c3BlbmQsIHRha2UgdGhlIHNwZWNpZmllZCBhY3Rpb24gKHR5cGljYWxseSAicmV0dXJuIEZBTFNFIikuCi0gKi8KLSNkZWZpbmUgSU5QVVRfQllURShjaW5mbyxWLGFjdGlvbikgIFwKLQlNQUtFU1RNVCggTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbik7IFwKLQkJICBieXRlc19pbl9idWZmZXItLTsgXAotCQkgIFYgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsgKQotCi0vKiBBcyBhYm92ZSwgYnV0IHJlYWQgdHdvIGJ5dGVzIGludGVycHJldGVkIGFzIGFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyLgotICogViBzaG91bGQgYmUgZGVjbGFyZWQgdW5zaWduZWQgaW50IG9yIHBlcmhhcHMgSU5UMzIuCi0gKi8KLSNkZWZpbmUgSU5QVVRfMkJZVEVTKGNpbmZvLFYsYWN0aW9uKSAgXAotCU1BS0VTVE1UKCBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKTsgXAotCQkgIGJ5dGVzX2luX2J1ZmZlci0tOyBcCi0JCSAgViA9ICgodW5zaWduZWQgaW50KSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKSkgPDwgODsgXAotCQkgIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pOyBcCi0JCSAgYnl0ZXNfaW5fYnVmZmVyLS07IFwKLQkJICBWICs9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspOyApCi0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIHByb2Nlc3MgSlBFRyBtYXJrZXJzLgotICoKLSAqIEVudHJ5IGNvbmRpdGlvbjogSlBFRyBtYXJrZXIgaXRzZWxmIGhhcyBiZWVuIHJlYWQgYW5kIGl0cyBjb2RlIHNhdmVkCi0gKiAgIGluIGNpbmZvLT51bnJlYWRfbWFya2VyOyBpbnB1dCByZXN0YXJ0IHBvaW50IGlzIGp1c3QgYWZ0ZXIgdGhlIG1hcmtlci4KLSAqCi0gKiBFeGl0OiBpZiByZXR1cm4gVFJVRSwgaGF2ZSByZWFkIGFuZCBwcm9jZXNzZWQgYW55IHBhcmFtZXRlcnMsIGFuZCBoYXZlCi0gKiAgIHVwZGF0ZWQgdGhlIHJlc3RhcnQgcG9pbnQgdG8gcG9pbnQgYWZ0ZXIgdGhlIHBhcmFtZXRlcnMuCi0gKiAgIElmIHJldHVybiBGQUxTRSwgd2FzIGZvcmNlZCB0byBzdXNwZW5kIGJlZm9yZSByZWFjaGluZyBlbmQgb2YKLSAqICAgbWFya2VyIHBhcmFtZXRlcnM7IHJlc3RhcnQgcG9pbnQgaGFzIG5vdCBiZWVuIG1vdmVkLiAgU2FtZSByb3V0aW5lCi0gKiAgIHdpbGwgYmUgY2FsbGVkIGFnYWluIGFmdGVyIGFwcGxpY2F0aW9uIHN1cHBsaWVzIG1vcmUgaW5wdXQgZGF0YS4KLSAqCi0gKiBUaGlzIGFwcHJvYWNoIHRvIHN1c3BlbnNpb24gYXNzdW1lcyB0aGF0IGFsbCBvZiBhIG1hcmtlcidzIHBhcmFtZXRlcnMKLSAqIGNhbiBmaXQgaW50byBhIHNpbmdsZSBpbnB1dCBidWZmZXJsb2FkLiAgVGhpcyBzaG91bGQgaG9sZCBmb3IgIm5vcm1hbCIKLSAqIG1hcmtlcnMuICBTb21lIENPTS9BUFBuIG1hcmtlcnMgbWlnaHQgaGF2ZSBsYXJnZSBwYXJhbWV0ZXIgc2VnbWVudHMKLSAqIHRoYXQgbWlnaHQgbm90IGZpdC4gIElmIHdlIGFyZSBzaW1wbHkgZHJvcHBpbmcgc3VjaCBhIG1hcmtlciwgd2UgdXNlCi0gKiBza2lwX2lucHV0X2RhdGEgdG8gZ2V0IHBhc3QgaXQsIGFuZCB0aGVyZWJ5IHB1dCB0aGUgcHJvYmxlbSBvbiB0aGUKLSAqIHNvdXJjZSBtYW5hZ2VyJ3Mgc2hvdWxkZXJzLiAgSWYgd2UgYXJlIHNhdmluZyB0aGUgbWFya2VyJ3MgY29udGVudHMKLSAqIGludG8gbWVtb3J5LCB3ZSB1c2UgYSBzbGlnaHRseSBkaWZmZXJlbnQgY29udmVudGlvbjogd2hlbiBmb3JjZWQgdG8KLSAqIHN1c3BlbmQsIHRoZSBtYXJrZXIgcHJvY2Vzc29yIHVwZGF0ZXMgdGhlIHJlc3RhcnQgcG9pbnQgdG8gdGhlIGVuZCBvZgotICogd2hhdCBpdCdzIGNvbnN1bWVkIChpZSwgdGhlIGVuZCBvZiB0aGUgYnVmZmVyKSBiZWZvcmUgcmV0dXJuaW5nIEZBTFNFLgotICogT24gcmVzdW1wdGlvbiwgY2luZm8tPnVucmVhZF9tYXJrZXIgc3RpbGwgY29udGFpbnMgdGhlIG1hcmtlciBjb2RlLAotICogYnV0IHRoZSBkYXRhIHNvdXJjZSB3aWxsIHBvaW50IHRvIHRoZSBuZXh0IGNodW5rIG9mIG1hcmtlciBkYXRhLgotICogVGhlIG1hcmtlciBwcm9jZXNzb3IgbXVzdCByZXRhaW4gaW50ZXJuYWwgc3RhdGUgdG8gZGVhbCB3aXRoIHRoaXMuCi0gKgotICogTm90ZSB0aGF0IHdlIGRvbid0IGJvdGhlciB0byBhdm9pZCBkdXBsaWNhdGUgdHJhY2UgbWVzc2FnZXMgaWYgYQotICogc3VzcGVuc2lvbiBvY2N1cnMgd2l0aGluIG1hcmtlciBwYXJhbWV0ZXJzLiAgT3RoZXIgc2lkZSBlZmZlY3RzCi0gKiByZXF1aXJlIG1vcmUgY2FyZS4KLSAqLwotCi0KLUxPQ0FMKGJvb2xlYW4pCi1nZXRfc29pIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUHJvY2VzcyBhbiBTT0kgbWFya2VyICovCi17Ci0gIGludCBpOwotICAKLSAgVFJBQ0VNUyhjaW5mbywgMSwgSlRSQ19TT0kpOwotCi0gIGlmIChjaW5mby0+bWFya2VyLT5zYXdfU09JKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfU09JX0RVUExJQ0FURSk7Ci0KLSAgLyogUmVzZXQgYWxsIHBhcmFtZXRlcnMgdGhhdCBhcmUgZGVmaW5lZCB0byBiZSByZXNldCBieSBTT0kgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykgewotICAgIGNpbmZvLT5hcml0aF9kY19MW2ldID0gMDsKLSAgICBjaW5mby0+YXJpdGhfZGNfVVtpXSA9IDE7Ci0gICAgY2luZm8tPmFyaXRoX2FjX0tbaV0gPSA1OwotICB9Ci0gIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gMDsKLQotICAvKiBTZXQgaW5pdGlhbCBhc3N1bXB0aW9ucyBmb3IgY29sb3JzcGFjZSBldGMgKi8KLQotICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19VTktOT1dOOwotICBjaW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IEZBTFNFOyAvKiBBc3N1bWUgbm9uLUNDSVIgc2FtcGxpbmc/Pz8gKi8KLQotICBjaW5mby0+c2F3X0pGSUZfbWFya2VyID0gRkFMU0U7Ci0gIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSAxOyAvKiBzZXQgZGVmYXVsdCBKRklGIEFQUDAgdmFsdWVzICovCi0gIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSAxOwotICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMDsKLSAgY2luZm8tPlhfZGVuc2l0eSA9IDE7Ci0gIGNpbmZvLT5ZX2RlbnNpdHkgPSAxOwotICBjaW5mby0+c2F3X0Fkb2JlX21hcmtlciA9IEZBTFNFOwotICBjaW5mby0+QWRvYmVfdHJhbnNmb3JtID0gMDsKLQotICBjaW5mby0+bWFya2VyLT5zYXdfU09JID0gVFJVRTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotZ2V0X3NvZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc19wcm9nLCBib29sZWFuIGlzX2FyaXRoKQotLyogUHJvY2VzcyBhIFNPRm4gbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgaW50IGMsIGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgPSBpc19wcm9nOwotICBjaW5mby0+YXJpdGhfY29kZSA9IGlzX2FyaXRoOwotCi0gIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotCi0gIElOUFVUX0JZVEUoY2luZm8sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiwgcmV0dXJuIEZBTFNFKTsKLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBjaW5mby0+aW1hZ2VfaGVpZ2h0LCByZXR1cm4gRkFMU0UpOwotICBJTlBVVF8yQllURVMoY2luZm8sIGNpbmZvLT5pbWFnZV93aWR0aCwgcmV0dXJuIEZBTFNFKTsKLSAgSU5QVVRfQllURShjaW5mbywgY2luZm8tPm51bV9jb21wb25lbnRzLCByZXR1cm4gRkFMU0UpOwotCi0gIGxlbmd0aCAtPSA4OwotCi0gIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX1NPRiwgY2luZm8tPnVucmVhZF9tYXJrZXIsCi0JICAgKGludCkgY2luZm8tPmltYWdlX3dpZHRoLCAoaW50KSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAotCSAgIGNpbmZvLT5udW1fY29tcG9uZW50cyk7Ci0KLSAgaWYgKGNpbmZvLT5tYXJrZXItPnNhd19TT0YpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9TT0ZfRFVQTElDQVRFKTsKLQotICAvKiBXZSBkb24ndCBzdXBwb3J0IGZpbGVzIGluIHdoaWNoIHRoZSBpbWFnZSBoZWlnaHQgaXMgaW5pdGlhbGx5IHNwZWNpZmllZCAqLwotICAvKiBhcyAwIGFuZCBpcyBsYXRlciByZWRlZmluZWQgYnkgRE5MLiAgQXMgbG9uZyBhcyB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQsICAqLwotICAvKiBtaWdodCBhcyB3ZWxsIGhhdmUgYSBnZW5lcmFsIHNhbml0eSBjaGVjay4gKi8KLSAgaWYgKGNpbmZvLT5pbWFnZV9oZWlnaHQgPD0gMCB8fCBjaW5mby0+aW1hZ2Vfd2lkdGggPD0gMAotICAgICAgfHwgY2luZm8tPm51bV9jb21wb25lbnRzIDw9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9FTVBUWV9JTUFHRSk7Ci0KLSAgaWYgKGxlbmd0aCAhPSAoY2luZm8tPm51bV9jb21wb25lbnRzICogMykpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKLQotICBpZiAoY2luZm8tPmNvbXBfaW5mbyA9PSBOVUxMKQkvKiBkbyBvbmx5IG9uY2UsIGV2ZW4gaWYgc3VzcGVuZCAqLwotICAgIGNpbmZvLT5jb21wX2luZm8gPSAoanBlZ19jb21wb25lbnRfaW5mbyAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQotCQkJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCSBjaW5mby0+bnVtX2NvbXBvbmVudHMgKiBTSVpFT0YoanBlZ19jb21wb25lbnRfaW5mbykpOwotICAKLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBjb21wcHRyLT5jb21wb25lbnRfaW5kZXggPSBjaTsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBjb21wcHRyLT5jb21wb25lbnRfaWQsIHJldHVybiBGQUxTRSk7Ci0gICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKLSAgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yID0gKGMgPj4gNCkgJiAxNTsKLSAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yID0gKGMgICAgICkgJiAxNTsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBjb21wcHRyLT5xdWFudF90Ymxfbm8sIHJldHVybiBGQUxTRSk7Ci0KLSAgICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19TT0ZfQ09NUE9ORU5ULAotCSAgICAgY29tcHB0ci0+Y29tcG9uZW50X2lkLCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAotCSAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgY29tcHB0ci0+cXVhbnRfdGJsX25vKTsKLSAgfQotCi0gIGNpbmZvLT5tYXJrZXItPnNhd19TT0YgPSBUUlVFOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotZ2V0X3NvcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFByb2Nlc3MgYSBTT1MgbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgaW50IGksIGNpLCBuLCBjLCBjYzsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIGlmICghIGNpbmZvLT5tYXJrZXItPnNhd19TT0YpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9TT1NfTk9fU09GKTsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLQotICBJTlBVVF9CWVRFKGNpbmZvLCBuLCByZXR1cm4gRkFMU0UpOyAvKiBOdW1iZXIgb2YgY29tcG9uZW50cyAqLwotCi0gIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1NPUywgbik7Ci0KLSAgaWYgKGxlbmd0aCAhPSAobiAqIDIgKyA2KSB8fCBuIDwgMSB8fCBuID4gTUFYX0NPTVBTX0lOX1NDQU4pCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKLQotICBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IG47Ci0KLSAgLyogQ29sbGVjdCB0aGUgY29tcG9uZW50LXNwZWMgcGFyYW1ldGVycyAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBjYywgcmV0dXJuIEZBTFNFKTsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICAgIAotICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0JIGNpKyssIGNvbXBwdHIrKykgewotICAgICAgaWYgKGNjID09IGNvbXBwdHItPmNvbXBvbmVudF9pZCkKLQlnb3RvIGlkX2ZvdW5kOwotICAgIH0KLQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9DT01QT05FTlRfSUQsIGNjKTsKLQotICBpZF9mb3VuZDoKLQotICAgIGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldID0gY29tcHB0cjsKLSAgICBjb21wcHRyLT5kY190Ymxfbm8gPSAoYyA+PiA0KSAmIDE1OwotICAgIGNvbXBwdHItPmFjX3RibF9ubyA9IChjICAgICApICYgMTU7Ci0gICAgCi0gICAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfU09TX0NPTVBPTkVOVCwgY2MsCi0JICAgICBjb21wcHRyLT5kY190Ymxfbm8sIGNvbXBwdHItPmFjX3RibF9ubyk7Ci0gIH0KLQotICAvKiBDb2xsZWN0IHRoZSBhZGRpdGlvbmFsIHNjYW4gcGFyYW1ldGVycyBTcywgU2UsIEFoL0FsLiAqLwotICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICBjaW5mby0+U3MgPSBjOwotICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICBjaW5mby0+U2UgPSBjOwotICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICBjaW5mby0+QWggPSAoYyA+PiA0KSAmIDE1OwotICBjaW5mby0+QWwgPSAoYyAgICAgKSAmIDE1OwotCi0gIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX1NPU19QQVJBTVMsIGNpbmZvLT5TcywgY2luZm8tPlNlLAotCSAgIGNpbmZvLT5BaCwgY2luZm8tPkFsKTsKLQotICAvKiBQcmVwYXJlIHRvIHNjYW4gZGF0YSAmIHJlc3RhcnQgbWFya2VycyAqLwotICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtID0gMDsKLQotICAvKiBDb3VudCBhbm90aGVyIFNPUyBtYXJrZXIgKi8KLSAgY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyKys7Ci0KLSAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLSNpZmRlZiBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQKLQotTE9DQUwoYm9vbGVhbikKLWdldF9kYWMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBQcm9jZXNzIGEgREFDIG1hcmtlciAqLwotewotICBJTlQzMiBsZW5ndGg7Ci0gIGludCBpbmRleCwgdmFsOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLSAgbGVuZ3RoIC09IDI7Ci0gIAotICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgIElOUFVUX0JZVEUoY2luZm8sIGluZGV4LCByZXR1cm4gRkFMU0UpOwotICAgIElOUFVUX0JZVEUoY2luZm8sIHZhbCwgcmV0dXJuIEZBTFNFKTsKLQotICAgIGxlbmd0aCAtPSAyOwotCi0gICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfREFDLCBpbmRleCwgdmFsKTsKLQotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gKDIqTlVNX0FSSVRIX1RCTFMpKQotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfREFDX0lOREVYLCBpbmRleCk7Ci0KLSAgICBpZiAoaW5kZXggPj0gTlVNX0FSSVRIX1RCTFMpIHsgLyogZGVmaW5lIEFDIHRhYmxlICovCi0gICAgICBjaW5mby0+YXJpdGhfYWNfS1tpbmRleC1OVU1fQVJJVEhfVEJMU10gPSAoVUlOVDgpIHZhbDsKLSAgICB9IGVsc2UgewkJCS8qIGRlZmluZSBEQyB0YWJsZSAqLwotICAgICAgY2luZm8tPmFyaXRoX2RjX0xbaW5kZXhdID0gKFVJTlQ4KSAodmFsICYgMHgwRik7Ci0gICAgICBjaW5mby0+YXJpdGhfZGNfVVtpbmRleF0gPSAoVUlOVDgpICh2YWwgPj4gNCk7Ci0gICAgICBpZiAoY2luZm8tPmFyaXRoX2RjX0xbaW5kZXhdID4gY2luZm8tPmFyaXRoX2RjX1VbaW5kZXhdKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0RBQ19WQUxVRSwgdmFsKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobGVuZ3RoICE9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLSNlbHNlIC8qICEgRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVEICovCi0KLSNkZWZpbmUgZ2V0X2RhYyhjaW5mbykgIHNraXBfdmFyaWFibGUoY2luZm8pCi0KLSNlbmRpZiAvKiBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQgKi8KLQotCi1MT0NBTChib29sZWFuKQotZ2V0X2RodCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFByb2Nlc3MgYSBESFQgbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgVUlOVDggYml0c1sxN107Ci0gIFVJTlQ4IGh1ZmZ2YWxbMjU2XTsKLSAgaW50IGksIGluZGV4LCBjb3VudDsKLSAgSkhVRkZfVEJMICoqaHRibHB0cjsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0gIGxlbmd0aCAtPSAyOwotICAKLSAgd2hpbGUgKGxlbmd0aCA+IDE2KSB7Ci0gICAgSU5QVVRfQllURShjaW5mbywgaW5kZXgsIHJldHVybiBGQUxTRSk7Ci0KLSAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19ESFQsIGluZGV4KTsKLSAgICAgIAotICAgIGJpdHNbMF0gPSAwOwotICAgIGNvdW50ID0gMDsKLSAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspIHsKLSAgICAgIElOUFVUX0JZVEUoY2luZm8sIGJpdHNbaV0sIHJldHVybiBGQUxTRSk7Ci0gICAgICBjb3VudCArPSBiaXRzW2ldOwotICAgIH0KLQotICAgIGxlbmd0aCAtPSAxICsgMTY7Ci0KLSAgICBUUkFDRU1TOChjaW5mbywgMiwgSlRSQ19IVUZGQklUUywKLQkgICAgIGJpdHNbMV0sIGJpdHNbMl0sIGJpdHNbM10sIGJpdHNbNF0sCi0JICAgICBiaXRzWzVdLCBiaXRzWzZdLCBiaXRzWzddLCBiaXRzWzhdKTsKLSAgICBUUkFDRU1TOChjaW5mbywgMiwgSlRSQ19IVUZGQklUUywKLQkgICAgIGJpdHNbOV0sIGJpdHNbMTBdLCBiaXRzWzExXSwgYml0c1sxMl0sCi0JICAgICBiaXRzWzEzXSwgYml0c1sxNF0sIGJpdHNbMTVdLCBiaXRzWzE2XSk7Ci0KLSAgICAvKiBIZXJlIHdlIGp1c3QgZG8gbWluaW1hbCB2YWxpZGF0aW9uIG9mIHRoZSBjb3VudHMgdG8gYXZvaWQgd2Fsa2luZwotICAgICAqIG9mZiB0aGUgZW5kIG9mIG91ciB0YWJsZSBzcGFjZS4gIGpkaHVmZi5jIHdpbGwgY2hlY2sgbW9yZSBjYXJlZnVsbHkuCi0gICAgICovCi0gICAgaWYgKGNvdW50ID4gMjU2IHx8ICgoSU5UMzIpIGNvdW50KSA+IGxlbmd0aCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICBJTlBVVF9CWVRFKGNpbmZvLCBodWZmdmFsW2ldLCByZXR1cm4gRkFMU0UpOwotCi0gICAgbGVuZ3RoIC09IGNvdW50OwotCi0gICAgaWYgKGluZGV4ICYgMHgxMCkgewkJLyogQUMgdGFibGUgZGVmaW5pdGlvbiAqLwotICAgICAgaW5kZXggLT0gMHgxMDsKLSAgICAgIGh0YmxwdHIgPSAmY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOwotICAgIH0gZWxzZSB7CQkJLyogREMgdGFibGUgZGVmaW5pdGlvbiAqLwotICAgICAgaHRibHB0ciA9ICZjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpbmRleF07Ci0gICAgfQotCi0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBOVU1fSFVGRl9UQkxTKQotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfREhUX0lOREVYLCBpbmRleCk7Ci0KLSAgICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKLSAgICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgCi0gICAgTUVNQ09QWSgoKmh0YmxwdHIpLT5iaXRzLCBiaXRzLCBTSVpFT0YoKCpodGJscHRyKS0+Yml0cykpOwotICAgIE1FTUNPUFkoKCpodGJscHRyKS0+aHVmZnZhbCwgaHVmZnZhbCwgU0laRU9GKCgqaHRibHB0ciktPmh1ZmZ2YWwpKTsKLSAgfQotCi0gIGlmIChsZW5ndGggIT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotZ2V0X2RxdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFByb2Nlc3MgYSBEUVQgbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgaW50IG4sIGksIHByZWM7Ci0gIHVuc2lnbmVkIGludCB0bXA7Ci0gIEpRVUFOVF9UQkwgKnF1YW50X3B0cjsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0gIGxlbmd0aCAtPSAyOwotCi0gIHdoaWxlIChsZW5ndGggPiAwKSB7Ci0gICAgSU5QVVRfQllURShjaW5mbywgbiwgcmV0dXJuIEZBTFNFKTsKLSAgICBwcmVjID0gbiA+PiA0OwotICAgIG4gJj0gMHgwRjsKLQotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0RRVCwgbiwgcHJlYyk7Ci0KLSAgICBpZiAobiA+PSBOVU1fUVVBTlRfVEJMUykKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0RRVF9JTkRFWCwgbik7Ci0gICAgICAKLSAgICBpZiAoY2luZm8tPnF1YW50X3RibF9wdHJzW25dID09IE5VTEwpCi0gICAgICBjaW5mby0+cXVhbnRfdGJsX3B0cnNbbl0gPSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICBxdWFudF9wdHIgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbbl07Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotICAgICAgaWYgKHByZWMpCi0JSU5QVVRfMkJZVEVTKGNpbmZvLCB0bXAsIHJldHVybiBGQUxTRSk7Ci0gICAgICBlbHNlCi0JSU5QVVRfQllURShjaW5mbywgdG1wLCByZXR1cm4gRkFMU0UpOwotICAgICAgLyogV2UgY29udmVydCB0aGUgemlnemFnLW9yZGVyIHRhYmxlIHRvIG5hdHVyYWwgYXJyYXkgb3JkZXIuICovCi0gICAgICBxdWFudF9wdHItPnF1YW50dmFsW2pwZWdfbmF0dXJhbF9vcmRlcltpXV0gPSAoVUlOVDE2KSB0bXA7Ci0gICAgfQotCi0gICAgaWYgKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID49IDIpIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSArPSA4KSB7Ci0JVFJBQ0VNUzgoY2luZm8sIDIsIEpUUkNfUVVBTlRWQUxTLAotCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpXSwgICBxdWFudF9wdHItPnF1YW50dmFsW2krMV0sCi0JCSBxdWFudF9wdHItPnF1YW50dmFsW2krMl0sIHF1YW50X3B0ci0+cXVhbnR2YWxbaSszXSwKLQkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs0XSwgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzVdLAotCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzZdLCBxdWFudF9wdHItPnF1YW50dmFsW2krN10pOwotICAgICAgfQotICAgIH0KLQotICAgIGxlbmd0aCAtPSBEQ1RTSVpFMisxOwotICAgIGlmIChwcmVjKSBsZW5ndGggLT0gRENUU0laRTI7Ci0gIH0KLQotICBpZiAobGVuZ3RoICE9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotTE9DQUwoYm9vbGVhbikKLWdldF9kcmkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBQcm9jZXNzIGEgRFJJIG1hcmtlciAqLwotewotICBJTlQzMiBsZW5ndGg7Ci0gIHVuc2lnbmVkIGludCB0bXA7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotICAKLSAgaWYgKGxlbmd0aCAhPSA0KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCB0bXAsIHJldHVybiBGQUxTRSk7Ci0KLSAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfRFJJLCB0bXApOwotCi0gIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gdG1wOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogUm91dGluZXMgZm9yIHByb2Nlc3NpbmcgQVBQbiBhbmQgQ09NIG1hcmtlcnMuCi0gKiBUaGVzZSBhcmUgZWl0aGVyIHNhdmVkIGluIG1lbW9yeSBvciBkaXNjYXJkZWQsIHBlciBhcHBsaWNhdGlvbiByZXF1ZXN0LgotICogQVBQMCBhbmQgQVBQMTQgYXJlIHNwZWNpYWxseSBjaGVja2VkIHRvIHNlZSBpZiB0aGV5IGFyZQotICogSkZJRiBhbmQgQWRvYmUgbWFya2VycywgcmVzcGVjdGl2ZWx5LgotICovCi0KLSNkZWZpbmUgQVBQMF9EQVRBX0xFTgkxNAkvKiBMZW5ndGggb2YgaW50ZXJlc3RpbmcgZGF0YSBpbiBBUFAwICovCi0jZGVmaW5lIEFQUDE0X0RBVEFfTEVOCTEyCS8qIExlbmd0aCBvZiBpbnRlcmVzdGluZyBkYXRhIGluIEFQUDE0ICovCi0jZGVmaW5lIEFQUE5fREFUQV9MRU4JMTQJLyogTXVzdCBiZSB0aGUgbGFyZ2VzdCBvZiB0aGUgYWJvdmUhISAqLwotCi0KLUxPQ0FMKHZvaWQpCi1leGFtaW5lX2FwcDAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpPQ1RFVCBGQVIgKiBkYXRhLAotCSAgICAgIHVuc2lnbmVkIGludCBkYXRhbGVuLCBJTlQzMiByZW1haW5pbmcpCi0vKiBFeGFtaW5lIGZpcnN0IGZldyBieXRlcyBmcm9tIGFuIEFQUDAuCi0gKiBUYWtlIGFwcHJvcHJpYXRlIGFjdGlvbiBpZiBpdCBpcyBhIEpGSUYgbWFya2VyLgotICogZGF0YWxlbiBpcyAjIG9mIGJ5dGVzIGF0IGRhdGFbXSwgcmVtYWluaW5nIGlzIGxlbmd0aCBvZiByZXN0IG9mIG1hcmtlciBkYXRhLgotICovCi17Ci0gIElOVDMyIHRvdGFsbGVuID0gKElOVDMyKSBkYXRhbGVuICsgcmVtYWluaW5nOwotCi0gIGlmIChkYXRhbGVuID49IEFQUDBfREFUQV9MRU4gJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzBdKSA9PSAweDRBICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVsxXSkgPT0gMHg0NiAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMl0pID09IDB4NDkgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzNdKSA9PSAweDQ2ICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVs0XSkgPT0gMCkgewotICAgIC8qIEZvdW5kIEpGSUYgQVBQMCBtYXJrZXI6IHNhdmUgaW5mbyAqLwotICAgIGNpbmZvLT5zYXdfSkZJRl9tYXJrZXIgPSBUUlVFOwotICAgIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSBHRVRKT0NURVQoZGF0YVs1XSk7Ci0gICAgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbiA9IEdFVEpPQ1RFVChkYXRhWzZdKTsKLSAgICBjaW5mby0+ZGVuc2l0eV91bml0ID0gR0VUSk9DVEVUKGRhdGFbN10pOwotICAgIGNpbmZvLT5YX2RlbnNpdHkgPSAoR0VUSk9DVEVUKGRhdGFbOF0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbOV0pOwotICAgIGNpbmZvLT5ZX2RlbnNpdHkgPSAoR0VUSk9DVEVUKGRhdGFbMTBdKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzExXSk7Ci0gICAgLyogQ2hlY2sgdmVyc2lvbi4KLSAgICAgKiBNYWpvciB2ZXJzaW9uIG11c3QgYmUgMSwgYW55dGhpbmcgZWxzZSBzaWduYWxzIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UuCi0gICAgICogKFdlIHVzZWQgdG8gdHJlYXQgdGhpcyBhcyBhbiBlcnJvciwgYnV0IG5vdyBpdCdzIGEgbm9uZmF0YWwgd2FybmluZywKLSAgICAgKiBiZWNhdXNlIHNvbWUgYm96byBhdCBIaWphYWsgY291bGRuJ3QgcmVhZCB0aGUgc3BlYy4pCi0gICAgICogTWlub3IgdmVyc2lvbiBzaG91bGQgYmUgMC4uMiwgYnV0IHByb2Nlc3MgYW55d2F5IGlmIG5ld2VyLgotICAgICAqLwotICAgIGlmIChjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uICE9IDEpCi0gICAgICBXQVJOTVMyKGNpbmZvLCBKV1JOX0pGSUZfTUFKT1IsCi0JICAgICAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiwgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbik7Ci0gICAgLyogR2VuZXJhdGUgdHJhY2UgbWVzc2FnZXMgKi8KLSAgICBUUkFDRU1TNShjaW5mbywgMSwgSlRSQ19KRklGLAotCSAgICAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiwgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbiwKLQkgICAgIGNpbmZvLT5YX2RlbnNpdHksIGNpbmZvLT5ZX2RlbnNpdHksIGNpbmZvLT5kZW5zaXR5X3VuaXQpOwotICAgIC8qIFZhbGlkYXRlIHRodW1ibmFpbCBkaW1lbnNpb25zIGFuZCBpc3N1ZSBhcHByb3ByaWF0ZSBtZXNzYWdlcyAqLwotICAgIGlmIChHRVRKT0NURVQoZGF0YVsxMl0pIHwgR0VUSk9DVEVUKGRhdGFbMTNdKSkKLSAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0pGSUZfVEhVTUJOQUlMLAotCSAgICAgICBHRVRKT0NURVQoZGF0YVsxMl0pLCBHRVRKT0NURVQoZGF0YVsxM10pKTsKLSAgICB0b3RhbGxlbiAtPSBBUFAwX0RBVEFfTEVOOwotICAgIGlmICh0b3RhbGxlbiAhPQotCSgoSU5UMzIpR0VUSk9DVEVUKGRhdGFbMTJdKSAqIChJTlQzMilHRVRKT0NURVQoZGF0YVsxM10pICogKElOVDMyKSAzKSkKLSAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0pGSUZfQkFEVEhVTUJOQUlMU0laRSwgKGludCkgdG90YWxsZW4pOwotICB9IGVsc2UgaWYgKGRhdGFsZW4gPj0gNiAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMF0pID09IDB4NEEgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzFdKSA9PSAweDQ2ICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVsyXSkgPT0gMHg1OCAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbM10pID09IDB4NTggJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzRdKSA9PSAwKSB7Ci0gICAgLyogRm91bmQgSkZJRiAiSkZYWCIgZXh0ZW5zaW9uIEFQUDAgbWFya2VyICovCi0gICAgLyogVGhlIGxpYnJhcnkgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyB3aXRoIHRoZXNlLAotICAgICAqIGJ1dCB3ZSB0cnkgdG8gcHJvZHVjZSBhIGhlbHBmdWwgdHJhY2UgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBzd2l0Y2ggKEdFVEpPQ1RFVChkYXRhWzVdKSkgewotICAgIGNhc2UgMHgxMDoKLSAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1RIVU1CX0pQRUcsIChpbnQpIHRvdGFsbGVuKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgxMToKLSAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1RIVU1CX1BBTEVUVEUsIChpbnQpIHRvdGFsbGVuKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgxMzoKLSAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1RIVU1CX1JHQiwgKGludCkgdG90YWxsZW4pOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0pGSUZfRVhURU5TSU9OLAotCSAgICAgICBHRVRKT0NURVQoZGF0YVs1XSksIChpbnQpIHRvdGFsbGVuKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBTdGFydCBvZiBBUFAwIGRvZXMgbm90IG1hdGNoICJKRklGIiBvciAiSkZYWCIsIG9yIHRvbyBzaG9ydCAqLwotICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0FQUDAsIChpbnQpIHRvdGFsbGVuKTsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1leGFtaW5lX2FwcDE0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKT0NURVQgRkFSICogZGF0YSwKLQkgICAgICAgdW5zaWduZWQgaW50IGRhdGFsZW4sIElOVDMyIHJlbWFpbmluZykKLS8qIEV4YW1pbmUgZmlyc3QgZmV3IGJ5dGVzIGZyb20gYW4gQVBQMTQuCi0gKiBUYWtlIGFwcHJvcHJpYXRlIGFjdGlvbiBpZiBpdCBpcyBhbiBBZG9iZSBtYXJrZXIuCi0gKiBkYXRhbGVuIGlzICMgb2YgYnl0ZXMgYXQgZGF0YVtdLCByZW1haW5pbmcgaXMgbGVuZ3RoIG9mIHJlc3Qgb2YgbWFya2VyIGRhdGEuCi0gKi8KLXsKLSAgdW5zaWduZWQgaW50IHZlcnNpb24sIGZsYWdzMCwgZmxhZ3MxLCB0cmFuc2Zvcm07Ci0KLSAgaWYgKGRhdGFsZW4gPj0gQVBQMTRfREFUQV9MRU4gJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzBdKSA9PSAweDQxICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVsxXSkgPT0gMHg2NCAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMl0pID09IDB4NkYgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzNdKSA9PSAweDYyICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVs0XSkgPT0gMHg2NSkgewotICAgIC8qIEZvdW5kIEFkb2JlIEFQUDE0IG1hcmtlciAqLwotICAgIHZlcnNpb24gPSAoR0VUSk9DVEVUKGRhdGFbNV0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbNl0pOwotICAgIGZsYWdzMCA9IChHRVRKT0NURVQoZGF0YVs3XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVs4XSk7Ci0gICAgZmxhZ3MxID0gKEdFVEpPQ1RFVChkYXRhWzldKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzEwXSk7Ci0gICAgdHJhbnNmb3JtID0gR0VUSk9DVEVUKGRhdGFbMTFdKTsKLSAgICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19BRE9CRSwgdmVyc2lvbiwgZmxhZ3MwLCBmbGFnczEsIHRyYW5zZm9ybSk7Ci0gICAgY2luZm8tPnNhd19BZG9iZV9tYXJrZXIgPSBUUlVFOwotICAgIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0gPSAoVUlOVDgpIHRyYW5zZm9ybTsKLSAgfSBlbHNlIHsKLSAgICAvKiBTdGFydCBvZiBBUFAxNCBkb2VzIG5vdCBtYXRjaCAiQWRvYmUiLCBvciB0b28gc2hvcnQgKi8KLSAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19BUFAxNCwgKGludCkgKGRhdGFsZW4gKyByZW1haW5pbmcpKTsKLSAgfQotfQotCi0KLU1FVEhPRERFRihib29sZWFuKQotZ2V0X2ludGVyZXN0aW5nX2FwcG4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBQcm9jZXNzIGFuIEFQUDAgb3IgQVBQMTQgbWFya2VyIHdpdGhvdXQgc2F2aW5nIGl0ICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgSk9DVEVUIGJbQVBQTl9EQVRBX0xFTl07Ci0gIHVuc2lnbmVkIGludCBpLCBudW10b3JlYWQ7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotICBsZW5ndGggLT0gMjsKLQotICAvKiBnZXQgdGhlIGludGVyZXN0aW5nIHBhcnQgb2YgdGhlIG1hcmtlciBkYXRhICovCi0gIGlmIChsZW5ndGggPj0gQVBQTl9EQVRBX0xFTikKLSAgICBudW10b3JlYWQgPSBBUFBOX0RBVEFfTEVOOwotICBlbHNlIGlmIChsZW5ndGggPiAwKQotICAgIG51bXRvcmVhZCA9ICh1bnNpZ25lZCBpbnQpIGxlbmd0aDsKLSAgZWxzZQotICAgIG51bXRvcmVhZCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW10b3JlYWQ7IGkrKykKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBiW2ldLCByZXR1cm4gRkFMU0UpOwotICBsZW5ndGggLT0gbnVtdG9yZWFkOwotCi0gIC8qIHByb2Nlc3MgaXQgKi8KLSAgc3dpdGNoIChjaW5mby0+dW5yZWFkX21hcmtlcikgewotICBjYXNlIE1fQVBQMDoKLSAgICBleGFtaW5lX2FwcDAoY2luZm8sIChKT0NURVQgRkFSICopIGIsIG51bXRvcmVhZCwgbGVuZ3RoKTsKLSAgICBicmVhazsKLSAgY2FzZSBNX0FQUDE0OgotICAgIGV4YW1pbmVfYXBwMTQoY2luZm8sIChKT0NURVQgRkFSICopIGIsIG51bXRvcmVhZCwgbGVuZ3RoKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICAvKiBjYW4ndCBnZXQgaGVyZSB1bmxlc3MganBlZ19zYXZlX21hcmtlcnMgY2hvb3NlcyB3cm9uZyBwcm9jZXNzb3IgKi8KLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogc2tpcCBhbnkgcmVtYWluaW5nIGRhdGEgLS0gY291bGQgYmUgbG90cyAqLwotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgKCpjaW5mby0+c3JjLT5za2lwX2lucHV0X2RhdGEpIChjaW5mbywgKGxvbmcpIGxlbmd0aCk7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotI2lmZGVmIFNBVkVfTUFSS0VSU19TVVBQT1JURUQKLQotTUVUSE9EREVGKGJvb2xlYW4pCi1zYXZlX21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFNhdmUgYW4gQVBQbiBvciBDT00gbWFya2VyIGludG8gdGhlIG1hcmtlciBsaXN0ICovCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7Ci0gIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBjdXJfbWFya2VyID0gbWFya2VyLT5jdXJfbWFya2VyOwotICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZCwgZGF0YV9sZW5ndGg7Ci0gIEpPQ1RFVCBGQVIgKiBkYXRhOwotICBJTlQzMiBsZW5ndGggPSAwOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBpZiAoY3VyX21hcmtlciA9PSBOVUxMKSB7Ci0gICAgLyogYmVnaW4gcmVhZGluZyBhIG1hcmtlciAqLwotICAgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotICAgIGxlbmd0aCAtPSAyOwotICAgIGlmIChsZW5ndGggPj0gMCkgewkJLyogd2F0Y2ggb3V0IGZvciBib2d1cyBsZW5ndGggd29yZCAqLwotICAgICAgLyogZmlndXJlIG91dCBob3cgbXVjaCB3ZSB3YW50IHRvIHNhdmUgKi8KLSAgICAgIHVuc2lnbmVkIGludCBsaW1pdDsKLSAgICAgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAoaW50KSBNX0NPTSkKLQlsaW1pdCA9IG1hcmtlci0+bGVuZ3RoX2xpbWl0X0NPTTsKLSAgICAgIGVsc2UKLQlsaW1pdCA9IG1hcmtlci0+bGVuZ3RoX2xpbWl0X0FQUG5bY2luZm8tPnVucmVhZF9tYXJrZXIgLSAoaW50KSBNX0FQUDBdOwotICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpIGxlbmd0aCA8IGxpbWl0KQotCWxpbWl0ID0gKHVuc2lnbmVkIGludCkgbGVuZ3RoOwotICAgICAgLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIG1hcmtlciBpdGVtICovCi0gICAgICBjdXJfbWFya2VyID0gKGpwZWdfc2F2ZWRfbWFya2VyX3B0cikKLQkoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICBTSVpFT0Yoc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCkgKyBsaW1pdCk7Ci0gICAgICBjdXJfbWFya2VyLT5uZXh0ID0gTlVMTDsKLSAgICAgIGN1cl9tYXJrZXItPm1hcmtlciA9IChVSU5UOCkgY2luZm8tPnVucmVhZF9tYXJrZXI7Ci0gICAgICBjdXJfbWFya2VyLT5vcmlnaW5hbF9sZW5ndGggPSAodW5zaWduZWQgaW50KSBsZW5ndGg7Ci0gICAgICBjdXJfbWFya2VyLT5kYXRhX2xlbmd0aCA9IGxpbWl0OwotICAgICAgLyogZGF0YSBhcmVhIGlzIGp1c3QgYmV5b25kIHRoZSBqcGVnX21hcmtlcl9zdHJ1Y3QgKi8KLSAgICAgIGRhdGEgPSBjdXJfbWFya2VyLT5kYXRhID0gKEpPQ1RFVCBGQVIgKikgKGN1cl9tYXJrZXIgKyAxKTsKLSAgICAgIG1hcmtlci0+Y3VyX21hcmtlciA9IGN1cl9tYXJrZXI7Ci0gICAgICBtYXJrZXItPmJ5dGVzX3JlYWQgPSAwOwotICAgICAgYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICBkYXRhX2xlbmd0aCA9IGxpbWl0OwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBkZWFsIHdpdGggYm9ndXMgbGVuZ3RoIHdvcmQgKi8KLSAgICAgIGJ5dGVzX3JlYWQgPSBkYXRhX2xlbmd0aCA9IDA7Ci0gICAgICBkYXRhID0gTlVMTDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogcmVzdW1lIHJlYWRpbmcgYSBtYXJrZXIgKi8KLSAgICBieXRlc19yZWFkID0gbWFya2VyLT5ieXRlc19yZWFkOwotICAgIGRhdGFfbGVuZ3RoID0gY3VyX21hcmtlci0+ZGF0YV9sZW5ndGg7Ci0gICAgZGF0YSA9IGN1cl9tYXJrZXItPmRhdGEgKyBieXRlc19yZWFkOwotICB9Ci0KLSAgd2hpbGUgKGJ5dGVzX3JlYWQgPCBkYXRhX2xlbmd0aCkgewotICAgIElOUFVUX1NZTkMoY2luZm8pOwkJLyogbW92ZSB0aGUgcmVzdGFydCBwb2ludCB0byBoZXJlICovCi0gICAgbWFya2VyLT5ieXRlc19yZWFkID0gYnl0ZXNfcmVhZDsKLSAgICAvKiBJZiB0aGVyZSdzIG5vdCBhdCBsZWFzdCBvbmUgYnl0ZSBpbiBidWZmZXIsIHN1c3BlbmQgKi8KLSAgICBNQUtFX0JZVEVfQVZBSUwoY2luZm8sIHJldHVybiBGQUxTRSk7Ci0gICAgLyogQ29weSBieXRlcyB3aXRoIHJlYXNvbmFibGUgcmFwaWRpdHkgKi8KLSAgICB3aGlsZSAoYnl0ZXNfcmVhZCA8IGRhdGFfbGVuZ3RoICYmIGJ5dGVzX2luX2J1ZmZlciA+IDApIHsKLSAgICAgICpkYXRhKysgPSAqbmV4dF9pbnB1dF9ieXRlKys7Ci0gICAgICBieXRlc19pbl9idWZmZXItLTsKLSAgICAgIGJ5dGVzX3JlYWQrKzsKLSAgICB9Ci0gIH0KLQotICAvKiBEb25lIHJlYWRpbmcgd2hhdCB3ZSB3YW50IHRvIHJlYWQgKi8KLSAgaWYgKGN1cl9tYXJrZXIgIT0gTlVMTCkgewkvKiB3aWxsIGJlIE5VTEwgaWYgYm9ndXMgbGVuZ3RoIHdvcmQgKi8KLSAgICAvKiBBZGQgbmV3IG1hcmtlciB0byBlbmQgb2YgbGlzdCAqLwotICAgIGlmIChjaW5mby0+bWFya2VyX2xpc3QgPT0gTlVMTCkgewotICAgICAgY2luZm8tPm1hcmtlcl9saXN0ID0gY3VyX21hcmtlcjsKLSAgICB9IGVsc2UgewotICAgICAganBlZ19zYXZlZF9tYXJrZXJfcHRyIHByZXYgPSBjaW5mby0+bWFya2VyX2xpc3Q7Ci0gICAgICB3aGlsZSAocHJldi0+bmV4dCAhPSBOVUxMKQotCXByZXYgPSBwcmV2LT5uZXh0OwotICAgICAgcHJldi0+bmV4dCA9IGN1cl9tYXJrZXI7Ci0gICAgfQotICAgIC8qIFJlc2V0IHBvaW50ZXIgJiBjYWxjIHJlbWFpbmluZyBkYXRhIGxlbmd0aCAqLwotICAgIGRhdGEgPSBjdXJfbWFya2VyLT5kYXRhOwotICAgIGxlbmd0aCA9IGN1cl9tYXJrZXItPm9yaWdpbmFsX2xlbmd0aCAtIGRhdGFfbGVuZ3RoOwotICB9Ci0gIC8qIFJlc2V0IHRvIGluaXRpYWwgc3RhdGUgZm9yIG5leHQgbWFya2VyICovCi0gIG1hcmtlci0+Y3VyX21hcmtlciA9IE5VTEw7Ci0KLSAgLyogUHJvY2VzcyB0aGUgbWFya2VyIGlmIGludGVyZXN0aW5nOyBlbHNlIGp1c3QgbWFrZSBhIGdlbmVyaWMgdHJhY2UgbXNnICovCi0gIHN3aXRjaCAoY2luZm8tPnVucmVhZF9tYXJrZXIpIHsKLSAgY2FzZSBNX0FQUDA6Ci0gICAgZXhhbWluZV9hcHAwKGNpbmZvLCBkYXRhLCBkYXRhX2xlbmd0aCwgbGVuZ3RoKTsKLSAgICBicmVhazsKLSAgY2FzZSBNX0FQUDE0OgotICAgIGV4YW1pbmVfYXBwMTQoY2luZm8sIGRhdGEsIGRhdGFfbGVuZ3RoLCBsZW5ndGgpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX01JU0NfTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlciwKLQkgICAgIChpbnQpIChkYXRhX2xlbmd0aCArIGxlbmd0aCkpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogc2tpcCBhbnkgcmVtYWluaW5nIGRhdGEgLS0gY291bGQgYmUgbG90cyAqLwotICBJTlBVVF9TWU5DKGNpbmZvKTsJCS8qIGRvIGJlZm9yZSBza2lwX2lucHV0X2RhdGEgKi8KLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgKCpjaW5mby0+c3JjLT5za2lwX2lucHV0X2RhdGEpIChjaW5mbywgKGxvbmcpIGxlbmd0aCk7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLSNlbmRpZiAvKiBTQVZFX01BUktFUlNfU1VQUE9SVEVEICovCi0KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1za2lwX3ZhcmlhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogU2tpcCBvdmVyIGFuIHVua25vd24gb3IgdW5pbnRlcmVzdGluZyB2YXJpYWJsZS1sZW5ndGggbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0gIGxlbmd0aCAtPSAyOwotICAKLSAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfTUlTQ19NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyLCAoaW50KSBsZW5ndGgpOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwkJLyogZG8gYmVmb3JlIHNraXBfaW5wdXRfZGF0YSAqLwotICBpZiAobGVuZ3RoID4gMCkKLSAgICAoKmNpbmZvLT5zcmMtPnNraXBfaW5wdXRfZGF0YSkgKGNpbmZvLCAobG9uZykgbGVuZ3RoKTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogRmluZCB0aGUgbmV4dCBKUEVHIG1hcmtlciwgc2F2ZSBpdCBpbiBjaW5mby0+dW5yZWFkX21hcmtlci4KLSAqIFJldHVybnMgRkFMU0UgaWYgaGFkIHRvIHN1c3BlbmQgYmVmb3JlIHJlYWNoaW5nIGEgbWFya2VyOwotICogaW4gdGhhdCBjYXNlIGNpbmZvLT51bnJlYWRfbWFya2VyIGlzIHVuY2hhbmdlZC4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIHJlc3VsdCBtaWdodCBub3QgYmUgYSB2YWxpZCBtYXJrZXIgY29kZSwKLSAqIGJ1dCBpdCB3aWxsIG5ldmVyIGJlIDAgb3IgRkYuCi0gKi8KLQotTE9DQUwoYm9vbGVhbikKLW5leHRfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgYzsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgZm9yICg7OykgewotICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7Ci0gICAgLyogU2tpcCBhbnkgbm9uLUZGIGJ5dGVzLgotICAgICAqIFRoaXMgbWF5IGxvb2sgYSBiaXQgaW5lZmZpY2llbnQsIGJ1dCBpdCB3aWxsIG5vdCBvY2N1ciBpbiBhIHZhbGlkIGZpbGUuCi0gICAgICogV2Ugc3luYyBhZnRlciBlYWNoIGRpc2NhcmRlZCBieXRlIHNvIHRoYXQgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlCi0gICAgICogY2FuIGRpc2NhcmQgdGhlIGJ5dGUgZnJvbSBpdHMgYnVmZmVyLgotICAgICAqLwotICAgIHdoaWxlIChjICE9IDB4RkYpIHsKLSAgICAgIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcysrOwotICAgICAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gICAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICAgIH0KLSAgICAvKiBUaGlzIGxvb3Agc3dhbGxvd3MgYW55IGR1cGxpY2F0ZSBGRiBieXRlcy4gIEV4dHJhIEZGcyBhcmUgbGVnYWwgYXMKLSAgICAgKiBwYWQgYnl0ZXMsIHNvIGRvbid0IGNvdW50IHRoZW0gaW4gZGlzY2FyZGVkX2J5dGVzLiAgV2UgYXNzdW1lIHRoZXJlCi0gICAgICogd2lsbCBub3QgYmUgc28gbWFueSBjb25zZWN1dGl2ZSBGRiBieXRlcyBhcyB0byBvdmVyZmxvdyBhIHN1c3BlbmRpbmcKLSAgICAgKiBkYXRhIHNvdXJjZSdzIGlucHV0IGJ1ZmZlci4KLSAgICAgKi8KLSAgICBkbyB7Ci0gICAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICAgIH0gd2hpbGUgKGMgPT0gMHhGRik7Ci0gICAgaWYgKGMgIT0gMCkKLSAgICAgIGJyZWFrOwkJCS8qIGZvdW5kIGEgdmFsaWQgbWFya2VyLCBleGl0IGxvb3AgKi8KLSAgICAvKiBSZWFjaCBoZXJlIGlmIHdlIGZvdW5kIGEgc3R1ZmZlZC16ZXJvIGRhdGEgc2VxdWVuY2UgKEZGLzAwKS4KLSAgICAgKiBEaXNjYXJkIGl0IGFuZCBsb29wIGJhY2sgdG8gdHJ5IGFnYWluLgotICAgICAqLwotICAgIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyArPSAyOwotICAgIElOUFVUX1NZTkMoY2luZm8pOwotICB9Ci0KLSAgaWYgKGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyAhPSAwKSB7Ci0gICAgV0FSTk1TMihjaW5mbywgSldSTl9FWFRSQU5FT1VTX0RBVEEsIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcywgYyk7Ci0gICAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzID0gMDsKLSAgfQotCi0gIGNpbmZvLT51bnJlYWRfbWFya2VyID0gYzsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotTE9DQUwoYm9vbGVhbikKLWZpcnN0X21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIExpa2UgbmV4dF9tYXJrZXIsIGJ1dCB1c2VkIHRvIG9idGFpbiB0aGUgaW5pdGlhbCBTT0kgbWFya2VyLiAqLwotLyogRm9yIHRoaXMgbWFya2VyLCB3ZSBkbyBub3QgYWxsb3cgcHJlY2VkaW5nIGdhcmJhZ2Ugb3IgZmlsbDsgb3RoZXJ3aXNlLAotICogd2UgbWlnaHQgd2VsbCBzY2FuIGFuIGVudGlyZSBpbnB1dCBmaWxlIGJlZm9yZSByZWFsaXppbmcgaXQgYWluJ3QgSlBFRy4KLSAqIElmIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHByb2Nlc3Mgbm9uLUpGSUYgZmlsZXMsIGl0IG11c3Qgc2VlayB0byB0aGUKLSAqIFNPSSBiZWZvcmUgY2FsbGluZyB0aGUgSlBFRyBsaWJyYXJ5LgotICovCi17Ci0gIGludCBjLCBjMjsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKLSAgSU5QVVRfQllURShjaW5mbywgYzIsIHJldHVybiBGQUxTRSk7Ci0gIGlmIChjICE9IDB4RkYgfHwgYzIgIT0gKGludCkgTV9TT0kpCi0gICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfTk9fU09JLCBjLCBjMik7Ci0KLSAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSBjMjsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIFJlYWQgbWFya2VycyB1bnRpbCBTT1Mgb3IgRU9JLgotICoKLSAqIFJldHVybnMgc2FtZSBjb2RlcyBhcyBhcmUgZGVmaW5lZCBmb3IganBlZ19jb25zdW1lX2lucHV0OgotICogSlBFR19TVVNQRU5ERUQsIEpQRUdfUkVBQ0hFRF9TT1MsIG9yIEpQRUdfUkVBQ0hFRF9FT0kuCi0gKi8KLQotTUVUSE9EREVGKGludCkKLXJlYWRfbWFya2VycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgLyogT3V0ZXIgbG9vcCByZXBlYXRzIG9uY2UgZm9yIGVhY2ggbWFya2VyLiAqLwotICBmb3IgKDs7KSB7Ci0gICAgLyogQ29sbGVjdCB0aGUgbWFya2VyIHByb3BlciwgdW5sZXNzIHdlIGFscmVhZHkgZGlkLiAqLwotICAgIC8qIE5COiBmaXJzdF9tYXJrZXIoKSBlbmZvcmNlcyB0aGUgcmVxdWlyZW1lbnQgdGhhdCBTT0kgYXBwZWFyIGZpcnN0LiAqLwotICAgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7Ci0gICAgICBpZiAoISBjaW5mby0+bWFya2VyLT5zYXdfU09JKSB7Ci0JaWYgKCEgZmlyc3RfbWFya2VyKGNpbmZvKSkKLQkgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIH0gZWxzZSB7Ci0JaWYgKCEgbmV4dF9tYXJrZXIoY2luZm8pKQotCSAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogU2F2ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpc3QgbWFya2VyIGFmdGVyIFNPRi4KLSAgICAgKi8KLSAgICBpZiAoY2luZm8tPm1hcmtlci0+Y3VycmVudF9zb3NfbWFya2VyX3Bvc2l0aW9uID09IC0xKQotICAgICAgY2luZm8tPm1hcmtlci0+Y3VycmVudF9zb3NfbWFya2VyX3Bvc2l0aW9uID0KLSAgICAgICAgICBqZ2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihjaW5mbykgLSAyOwotCi0gICAgLyogQXQgdGhpcyBwb2ludCBjaW5mby0+dW5yZWFkX21hcmtlciBjb250YWlucyB0aGUgbWFya2VyIGNvZGUgYW5kIHRoZQotICAgICAqIGlucHV0IHBvaW50IGlzIGp1c3QgcGFzdCB0aGUgbWFya2VyIHByb3BlciwgYnV0IGJlZm9yZSBhbnkgcGFyYW1ldGVycy4KLSAgICAgKiBBIHN1c3BlbnNpb24gd2lsbCBjYXVzZSB1cyB0byByZXR1cm4gd2l0aCB0aGlzIHN0YXRlIHN0aWxsIHRydWUuCi0gICAgICovCi0gICAgc3dpdGNoIChjaW5mby0+dW5yZWFkX21hcmtlcikgewotICAgIGNhc2UgTV9TT0k6Ci0gICAgICBpZiAoISBnZXRfc29pKGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TT0YwOgkJLyogQmFzZWxpbmUgKi8KLSAgICBjYXNlIE1fU09GMToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KLSAgICAgIGlmICghIGdldF9zb2YoY2luZm8sIEZBTFNFLCBGQUxTRSkpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU09GMjoJCS8qIFByb2dyZXNzaXZlLCBIdWZmbWFuICovCi0gICAgICBjaW5mby0+bWFya2VyLT5jdXJyZW50X3Nvc19tYXJrZXJfcG9zaXRpb24gPSAtMTsKLSAgICAgIGlmICghIGdldF9zb2YoY2luZm8sIFRSVUUsIEZBTFNFKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TT0Y5OgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLwotICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgRkFMU0UsIFRSVUUpKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NPRjEwOgkJLyogUHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KLSAgICAgIGlmICghIGdldF9zb2YoY2luZm8sIFRSVUUsIFRSVUUpKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQ3VycmVudGx5IHVuc3VwcG9ydGVkIFNPRm4gdHlwZXMgKi8KLSAgICBjYXNlIE1fU09GMzoJCS8qIExvc3NsZXNzLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjU6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y2OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjc6CQkvKiBEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fSlBHOgkJCS8qIFJlc2VydmVkIGZvciBKUEVHIGV4dGVuc2lvbnMgKi8KLSAgICBjYXNlIE1fU09GMTE6CQkvKiBMb3NzbGVzcywgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxMzoJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE0OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE1OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBhcml0aG1ldGljICovCi0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9TT0ZfVU5TVVBQT1JURUQsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NPUzoKLSAgICAgIGlmICghIGdldF9zb3MoY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsJLyogcHJvY2Vzc2VkIHRoZSBtYXJrZXIgKi8KLSAgICAgIHJldHVybiBKUEVHX1JFQUNIRURfU09TOwotICAgIAotICAgIGNhc2UgTV9FT0k6Ci0gICAgICBUUkFDRU1TKGNpbmZvLCAxLCBKVFJDX0VPSSk7Ci0gICAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CS8qIHByb2Nlc3NlZCB0aGUgbWFya2VyICovCi0gICAgICByZXR1cm4gSlBFR19SRUFDSEVEX0VPSTsKLSAgICAgIAotICAgIGNhc2UgTV9EQUM6Ci0gICAgICBpZiAoISBnZXRfZGFjKGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTV9ESFQ6Ci0gICAgICBpZiAoISBnZXRfZGh0KGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTV9EUVQ6Ci0gICAgICBpZiAoISBnZXRfZHF0KGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTV9EUkk6Ci0gICAgICBpZiAoISBnZXRfZHJpKGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTV9BUFAwOgotICAgIGNhc2UgTV9BUFAxOgotICAgIGNhc2UgTV9BUFAyOgotICAgIGNhc2UgTV9BUFAzOgotICAgIGNhc2UgTV9BUFA0OgotICAgIGNhc2UgTV9BUFA1OgotICAgIGNhc2UgTV9BUFA2OgotICAgIGNhc2UgTV9BUFA3OgotICAgIGNhc2UgTV9BUFA4OgotICAgIGNhc2UgTV9BUFA5OgotICAgIGNhc2UgTV9BUFAxMDoKLSAgICBjYXNlIE1fQVBQMTE6Ci0gICAgY2FzZSBNX0FQUDEyOgotICAgIGNhc2UgTV9BUFAxMzoKLSAgICBjYXNlIE1fQVBQMTQ6Ci0gICAgY2FzZSBNX0FQUDE1OgotICAgICAgaWYgKCEgKCooKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXIpLT5wcm9jZXNzX0FQUG5bCi0JCWNpbmZvLT51bnJlYWRfbWFya2VyIC0gKGludCkgTV9BUFAwXSkgKGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTV9DT006Ci0gICAgICBpZiAoISAoKigobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlciktPnByb2Nlc3NfQ09NKSAoY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1JTVDA6CQkvKiB0aGVzZSBhcmUgYWxsIHBhcmFtZXRlcmxlc3MgKi8KLSAgICBjYXNlIE1fUlNUMToKLSAgICBjYXNlIE1fUlNUMjoKLSAgICBjYXNlIE1fUlNUMzoKLSAgICBjYXNlIE1fUlNUNDoKLSAgICBjYXNlIE1fUlNUNToKLSAgICBjYXNlIE1fUlNUNjoKLSAgICBjYXNlIE1fUlNUNzoKLSAgICBjYXNlIE1fVEVNOgotICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfUEFSTUxFU1NfTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlcik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ETkw6CQkJLyogSWdub3JlIEROTCAuLi4gcGVyaGFwcyB0aGUgd3JvbmcgdGhpbmcgKi8KLSAgICAgIGlmICghIHNraXBfdmFyaWFibGUoY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoJCQkvKiBtdXN0IGJlIERIUCwgRVhQLCBKUEduLCBvciBSRVNuICovCi0gICAgICAvKiBGb3Igbm93LCB3ZSB0cmVhdCB0aGUgcmVzZXJ2ZWQgbWFya2VycyBhcyBmYXRhbCBlcnJvcnMgc2luY2UgdGhleSBhcmUKLSAgICAgICAqIGxpa2VseSB0byBiZSB1c2VkIHRvIHNpZ25hbCBpbmNvbXBhdGlibGUgSlBFRyBQYXJ0IDMgZXh0ZW5zaW9ucy4KLSAgICAgICAqIE9uY2UgdGhlIEpQRUcgMyB2ZXJzaW9uLW51bWJlciBtYXJrZXIgaXMgd2VsbCBkZWZpbmVkLCB0aGlzIGNvZGUKLSAgICAgICAqIG91Z2h0IHRvIGNoYW5nZSEKLSAgICAgICAqLwotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVU5LTk9XTl9NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvKiBTdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIG1hcmtlciwgc28gcmVzZXQgc3RhdGUgdmFyaWFibGUgKi8KLSAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7Ci0gIH0gLyogZW5kIGxvb3AgKi8KLX0KLQotCi0vKgotICogUmVhZCBhIHJlc3RhcnQgbWFya2VyLCB3aGljaCBpcyBleHBlY3RlZCB0byBhcHBlYXIgbmV4dCBpbiB0aGUgZGF0YXN0cmVhbTsKLSAqIGlmIHRoZSBtYXJrZXIgaXMgbm90IHRoZXJlLCB0YWtlIGFwcHJvcHJpYXRlIHJlY292ZXJ5IGFjdGlvbi4KLSAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuc2lvbiBpcyByZXF1aXJlZC4KLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgZW50cm9weSBkZWNvZGVyIGFmdGVyIGl0IGhhcyByZWFkIGFuIGFwcHJvcHJpYXRlCi0gKiBudW1iZXIgb2YgTUNVcy4gIGNpbmZvLT51bnJlYWRfbWFya2VyIG1heSBiZSBub256ZXJvIGlmIHRoZSBlbnRyb3B5IGRlY29kZXIKLSAqIGhhcyBhbHJlYWR5IHJlYWQgYSBtYXJrZXIgZnJvbSB0aGUgZGF0YSBzb3VyY2UuICBVbmRlciBub3JtYWwgY29uZGl0aW9ucwotICogY2luZm8tPnVucmVhZF9tYXJrZXIgd2lsbCBiZSByZXNldCB0byAwIGJlZm9yZSByZXR1cm5pbmc7IGlmIG5vdCByZXNldCwKLSAqIGl0IGhvbGRzIGEgbWFya2VyIHdoaWNoIHRoZSBkZWNvZGVyIHdpbGwgYmUgdW5hYmxlIHRvIHJlYWQgcGFzdC4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLXJlYWRfcmVzdGFydF9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIE9idGFpbiBhIG1hcmtlciB1bmxlc3Mgd2UgYWxyZWFkeSBkaWQuICovCi0gIC8qIE5vdGUgdGhhdCBuZXh0X21hcmtlciB3aWxsIGNvbXBsYWluIGlmIGl0IHNraXBzIGFueSBkYXRhLiAqLwotICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkgewotICAgIGlmICghIG5leHRfbWFya2VyKGNpbmZvKSkKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PQotICAgICAgKChpbnQpIE1fUlNUMCArIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0pKSB7Ci0gICAgLyogTm9ybWFsIGNhc2UgLS0tIHN3YWxsb3cgdGhlIG1hcmtlciBhbmQgbGV0IGVudHJvcHkgZGVjb2RlciBjb250aW51ZSAqLwotICAgIFRSQUNFTVMxKGNpbmZvLCAzLCBKVFJDX1JTVCwgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSk7Ci0gICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwotICB9IGVsc2UgewotICAgIC8qIFVoLW9oLCB0aGUgcmVzdGFydCBtYXJrZXJzIGhhdmUgYmVlbiBtZXNzZWQgdXAuICovCi0gICAgLyogTGV0IHRoZSBkYXRhIHNvdXJjZSBtYW5hZ2VyIGRldGVybWluZSBob3cgdG8gcmVzeW5jLiAqLwotICAgIGlmICghICgqY2luZm8tPnNyYy0+cmVzeW5jX3RvX3Jlc3RhcnQpIChjaW5mbywKLQkJCQkJICAgIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0pKQotICAgICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogVXBkYXRlIG5leHQtcmVzdGFydCBzdGF0ZSAqLwotICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtID0gKGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0gKyAxKSAmIDc7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgcmVzeW5jX3RvX3Jlc3RhcnQgbWV0aG9kIGZvciBkYXRhIHNvdXJjZSBtYW5hZ2VycwotICogdG8gdXNlIGlmIHRoZXkgZG9uJ3QgaGF2ZSBhbnkgYmV0dGVyIGFwcHJvYWNoLiAgU29tZSBkYXRhIHNvdXJjZSBtYW5hZ2VycwotICogbWF5IGJlIGFibGUgdG8gYmFjayB1cCwgb3IgbWF5IGhhdmUgYWRkaXRpb25hbCBrbm93bGVkZ2UgYWJvdXQgdGhlIGRhdGEKLSAqIHdoaWNoIHBlcm1pdHMgYSBtb3JlIGludGVsbGlnZW50IHJlY292ZXJ5IHN0cmF0ZWd5OyBzdWNoIG1hbmFnZXJzIHdvdWxkCi0gKiBwcmVzdW1hYmx5IHN1cHBseSB0aGVpciBvd24gcmVzeW5jIG1ldGhvZC4KLSAqCi0gKiByZWFkX3Jlc3RhcnRfbWFya2VyIGNhbGxzIHJlc3luY190b19yZXN0YXJ0IGlmIGl0IGZpbmRzIGEgbWFya2VyIG90aGVyIHRoYW4KLSAqIHRoZSByZXN0YXJ0IG1hcmtlciBpdCB3YXMgZXhwZWN0aW5nLiAgKFRoaXMgY29kZSBpcyAqbm90KiB1c2VkIHVubGVzcwotICogYSBub256ZXJvIHJlc3RhcnQgaW50ZXJ2YWwgaGFzIGJlZW4gZGVjbGFyZWQuKSAgY2luZm8tPnVucmVhZF9tYXJrZXIgaXMKLSAqIHRoZSBtYXJrZXIgY29kZSBhY3R1YWxseSBmb3VuZCAobWlnaHQgYmUgYW55dGhpbmcsIGV4Y2VwdCAwIG9yIEZGKS4KLSAqIFRoZSBkZXNpcmVkIHJlc3RhcnQgbWFya2VyIG51bWJlciAoMC4uNykgaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLgotICogVGhpcyByb3V0aW5lIGlzIHN1cHBvc2VkIHRvIGFwcGx5IHdoYXRldmVyIGVycm9yIHJlY292ZXJ5IHN0cmF0ZWd5IHNlZW1zCi0gKiBhcHByb3ByaWF0ZSBpbiBvcmRlciB0byBwb3NpdGlvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBuZXh0IGRhdGEgc2VnbWVudC4KLSAqIE5vdGUgdGhhdCBjaW5mby0+dW5yZWFkX21hcmtlciBpcyB0cmVhdGVkIGFzIGEgbWFya2VyIGFwcGVhcmluZyBiZWZvcmUKLSAqIHRoZSBjdXJyZW50IGRhdGEtc291cmNlIGlucHV0IHBvaW50OyB1c3VhbGx5IGl0IHNob3VsZCBiZSByZXNldCB0byB6ZXJvCi0gKiBiZWZvcmUgcmV0dXJuaW5nLgotICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5zaW9uIGlzIHJlcXVpcmVkLgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgc3Vic3RhbnRpYWxseSBjb25zdHJhaW5lZCBieSB3YW50aW5nIHRvIHRyZWF0IHRoZQotICogaW5wdXQgYXMgYSBkYXRhIHN0cmVhbTsgdGhpcyBtZWFucyB3ZSBjYW4ndCBiYWNrIHVwLiAgVGhlcmVmb3JlLCB3ZSBoYXZlCi0gKiBvbmx5IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyB0byB3b3JrIHdpdGg6Ci0gKiAgIDEuIFNpbXBseSBkaXNjYXJkIHRoZSBtYXJrZXIgYW5kIGxldCB0aGUgZW50cm9weSBkZWNvZGVyIHJlc3VtZSBhdCBuZXh0Ci0gKiAgICAgIGJ5dGUgb2YgZmlsZS4KLSAqICAgMi4gUmVhZCBmb3J3YXJkIHVudGlsIHdlIGZpbmQgYW5vdGhlciBtYXJrZXIsIGRpc2NhcmRpbmcgaW50ZXJ2ZW5pbmcKLSAqICAgICAgZGF0YS4gIChJbiB0aGVvcnkgd2UgY291bGQgbG9vayBhaGVhZCB3aXRoaW4gdGhlIGN1cnJlbnQgYnVmZmVybG9hZCwKLSAqICAgICAgd2l0aG91dCBoYXZpbmcgdG8gZGlzY2FyZCBkYXRhIGlmIHdlIGRvbid0IGZpbmQgdGhlIGRlc2lyZWQgbWFya2VyLgotICogICAgICBUaGlzIGlkZWEgaXMgbm90IGltcGxlbWVudGVkIGhlcmUsIGluIHBhcnQgYmVjYXVzZSBpdCBtYWtlcyBiZWhhdmlvcgotICogICAgICBkZXBlbmRlbnQgb24gYnVmZmVyIHNpemUgYW5kIGNoYW5jZSBidWZmZXItYm91bmRhcnkgcG9zaXRpb25zLikKLSAqICAgMy4gTGVhdmUgdGhlIG1hcmtlciB1bnJlYWQgKGJ5IGZhaWxpbmcgdG8gemVybyBjaW5mby0+dW5yZWFkX21hcmtlcikuCi0gKiAgICAgIFRoaXMgd2lsbCBjYXVzZSB0aGUgZW50cm9weSBkZWNvZGVyIHRvIHByb2Nlc3MgYW4gZW1wdHkgZGF0YSBzZWdtZW50LAotICogICAgICBpbnNlcnRpbmcgZHVtbXkgemVyb2VzLCBhbmQgdGhlbiB3ZSB3aWxsIHJlcHJvY2VzcyB0aGUgbWFya2VyLgotICoKLSAqICMyIGlzIGFwcHJvcHJpYXRlIGlmIHdlIHRoaW5rIHRoZSBkZXNpcmVkIG1hcmtlciBsaWVzIGFoZWFkLCB3aGlsZSAjMyBpcwotICogYXBwcm9wcmlhdGUgaWYgdGhlIGZvdW5kIG1hcmtlciBpcyBhIGZ1dHVyZSByZXN0YXJ0IG1hcmtlciAoaW5kaWNhdGluZwotICogdGhhdCB3ZSBoYXZlIG1pc3NlZCB0aGUgZGVzaXJlZCByZXN0YXJ0IG1hcmtlciwgcHJvYmFibHkgYmVjYXVzZSBpdCBnb3QKLSAqIGNvcnJ1cHRlZCkuCi0gKiBXZSBhcHBseSAjMiBvciAjMyBpZiB0aGUgZm91bmQgbWFya2VyIGlzIGEgcmVzdGFydCBtYXJrZXIgbm8gbW9yZSB0aGFuCi0gKiB0d28gY291bnRzIGJlaGluZCBvciBhaGVhZCBvZiB0aGUgZXhwZWN0ZWQgb25lLiAgV2UgYWxzbyBhcHBseSAjMiBpZiB0aGUKLSAqIGZvdW5kIG1hcmtlciBpcyBub3QgYSBsZWdhbCBKUEVHIG1hcmtlciBjb2RlIChpdCdzIGNlcnRhaW5seSBib2d1cyBkYXRhKS4KLSAqIElmIHRoZSBmb3VuZCBtYXJrZXIgaXMgYSByZXN0YXJ0IG1hcmtlciBtb3JlIHRoYW4gMiBjb3VudHMgYXdheSwgd2UgZG8gIzEKLSAqICh0b28gbXVjaCByaXNrIHRoYXQgdGhlIG1hcmtlciBpcyBlcnJvbmVvdXM7IHdpdGggbHVjayB3ZSB3aWxsIGJlIGFibGUgdG8KLSAqIHJlc3luYyBhdCBzb21lIGZ1dHVyZSBwb2ludCkuCi0gKiBGb3IgYW55IHZhbGlkIG5vbi1yZXN0YXJ0IEpQRUcgbWFya2VyLCB3ZSBhcHBseSAjMy4gIFRoaXMga2VlcHMgdXMgZnJvbQotICogb3ZlcnJ1bm5pbmcgdGhlIGVuZCBvZiBhIHNjYW4uICBBbiBpbXBsZW1lbnRhdGlvbiBsaW1pdGVkIHRvIHNpbmdsZS1zY2FuCi0gKiBmaWxlcyBtaWdodCBmaW5kIGl0IGJldHRlciB0byBhcHBseSAjMiBmb3IgbWFya2VycyBvdGhlciB0aGFuIEVPSSwgc2luY2UKLSAqIGFueSBvdGhlciBtYXJrZXIgd291bGQgaGF2ZSB0byBiZSBib2d1cyBkYXRhIGluIHRoYXQgY2FzZS4KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBkZXNpcmVkKQotewotICBpbnQgbWFya2VyID0gY2luZm8tPnVucmVhZF9tYXJrZXI7Ci0gIGludCBhY3Rpb24gPSAxOwotICAKLSAgLyogQWx3YXlzIHB1dCB1cCBhIHdhcm5pbmcuICovCi0gIFdBUk5NUzIoY2luZm8sIEpXUk5fTVVTVF9SRVNZTkMsIG1hcmtlciwgZGVzaXJlZCk7Ci0gIAotICAvKiBPdXRlciBsb29wIGhhbmRsZXMgcmVwZWF0ZWQgZGVjaXNpb24gYWZ0ZXIgc2Nhbm5pbmcgZm9yd2FyZC4gKi8KLSAgZm9yICg7OykgewotICAgIGlmIChtYXJrZXIgPCAoaW50KSBNX1NPRjApCi0gICAgICBhY3Rpb24gPSAyOwkJLyogaW52YWxpZCBtYXJrZXIgKi8KLSAgICBlbHNlIGlmIChtYXJrZXIgPCAoaW50KSBNX1JTVDAgfHwgbWFya2VyID4gKGludCkgTV9SU1Q3KQotICAgICAgYWN0aW9uID0gMzsJCS8qIHZhbGlkIG5vbi1yZXN0YXJ0IG1hcmtlciAqLwotICAgIGVsc2UgewotICAgICAgaWYgKG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkKzEpICYgNykpIHx8Ci0JICBtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZCsyKSAmIDcpKSkKLQlhY3Rpb24gPSAzOwkJLyogb25lIG9mIHRoZSBuZXh0IHR3byBleHBlY3RlZCByZXN0YXJ0cyAqLwotICAgICAgZWxzZSBpZiAobWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQtMSkgJiA3KSkgfHwKLQkgICAgICAgbWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQtMikgJiA3KSkpCi0JYWN0aW9uID0gMjsJCS8qIGEgcHJpb3IgcmVzdGFydCwgc28gYWR2YW5jZSAqLwotICAgICAgZWxzZQotCWFjdGlvbiA9IDE7CQkvKiBkZXNpcmVkIHJlc3RhcnQgb3IgdG9vIGZhciBhd2F5ICovCi0gICAgfQotICAgIFRSQUNFTVMyKGNpbmZvLCA0LCBKVFJDX1JFQ09WRVJZX0FDVElPTiwgbWFya2VyLCBhY3Rpb24pOwotICAgIHN3aXRjaCAoYWN0aW9uKSB7Ci0gICAgY2FzZSAxOgotICAgICAgLyogRGlzY2FyZCBtYXJrZXIgYW5kIGxldCBlbnRyb3B5IGRlY29kZXIgcmVzdW1lIHByb2Nlc3NpbmcuICovCi0gICAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7Ci0gICAgICByZXR1cm4gVFJVRTsKLSAgICBjYXNlIDI6Ci0gICAgICAvKiBTY2FuIHRvIHRoZSBuZXh0IG1hcmtlciwgYW5kIHJlcGVhdCB0aGUgZGVjaXNpb24gbG9vcC4gKi8KLSAgICAgIGlmICghIG5leHRfbWFya2VyKGNpbmZvKSkKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICBtYXJrZXIgPSBjaW5mby0+dW5yZWFkX21hcmtlcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIC8qIFJldHVybiB3aXRob3V0IGFkdmFuY2luZyBwYXN0IHRoaXMgbWFya2VyLiAqLwotICAgICAgLyogRW50cm9weSBkZWNvZGVyIHdpbGwgYmUgZm9yY2VkIHRvIHByb2Nlc3MgYW4gZW1wdHkgc2VnbWVudC4gKi8KLSAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgfSAvKiBlbmQgbG9vcCAqLwotfQotCi0vKgotICogR2V0IHRoZSBwb3NpdGlvbiBmb3IgYWxsIFNPUyBtYXJrZXJzIGluIHRoZSBpbWFnZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWdldF9zb3NfbWFya2VyX3Bvc2l0aW9uKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGh1ZmZtYW5faW5kZXggKmluZGV4KQotewotICB1bnNpZ25lZCBjaGFyICpoZWFkOwotICBpbnQgY291bnQgPSAwOwotICBpbnQgcmV0Y29kZSA9IEpQRUdfUkVBQ0hFRF9TT1M7Ci0KLSAgd2hpbGUgKGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciA+IDApIHsKLSAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfU09TKSB7Ci0gICAgICBqcGVnX2NvbmZpZ3VyZV9odWZmbWFuX2luZGV4X3NjYW4oY2luZm8sIGluZGV4LCBjb3VudCsrLAotICAgICAgICAgICAgICBjaW5mby0+bWFya2VyLT5jdXJyZW50X3Nvc19tYXJrZXJfcG9zaXRpb24pOwotICAgICAgLy8gU2tpcHMgc2NhbiBjb250ZW50IHRvIHRoZSBuZXh0IG5vbi1SU1QgSlBFRyBtYXJrZXIuCi0gICAgICB3aGlsZShuZXh0X21hcmtlcihjaW5mbykgJiYKLSAgICAgICAgICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPj0gTV9SU1QwICYmIGNpbmZvLT51bnJlYWRfbWFya2VyIDw9IE1fUlNUNykKLSAgICAgICAgICA7Ci0gICAgICBjaW5mby0+bWFya2VyLT5jdXJyZW50X3Nvc19tYXJrZXJfcG9zaXRpb24gPQotICAgICAgICBqZ2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihjaW5mbykgLSAyOwotICAgICAgcmV0Y29kZSA9IHJlYWRfbWFya2VycyhjaW5mbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKgotICogUmVzZXQgbWFya2VyIHByb2Nlc3Npbmcgc3RhdGUgdG8gYmVnaW4gYSBmcmVzaCBkYXRhc3RyZWFtLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcmVzZXRfbWFya2VyX3JlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKLQotICBjaW5mby0+Y29tcF9pbmZvID0gTlVMTDsJCS8qIHVudGlsIGFsbG9jYXRlZCBieSBnZXRfc29mICovCi0gIGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA9IDA7CQkvKiBubyBTT1Mgc2VlbiB5ZXQgKi8KLSAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwkJLyogbm8gcGVuZGluZyBtYXJrZXIgKi8KLSAgbWFya2VyLT5wdWIuc2F3X1NPSSA9IEZBTFNFOwkJLyogc2V0IGludGVybmFsIHN0YXRlIHRvbyAqLwotICBtYXJrZXItPnB1Yi5zYXdfU09GID0gRkFMU0U7Ci0gIG1hcmtlci0+cHViLmRpc2NhcmRlZF9ieXRlcyA9IDA7Ci0gIG1hcmtlci0+Y3VyX21hcmtlciA9IE5VTEw7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIG1hcmtlciByZWFkZXIgbW9kdWxlLgotICogVGhpcyBpcyBjYWxsZWQgb25seSBvbmNlLCB3aGVuIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCBpcyBjcmVhdGVkLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfbWFya2VyX3JlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFya2VyX3B0ciBtYXJrZXI7Ci0gIGludCBpOwotCi0gIC8qIENyZWF0ZSBzdWJvYmplY3QgaW4gcGVybWFuZW50IHBvb2wgKi8KLSAgbWFya2VyID0gKG15X21hcmtlcl9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCi0JCQkJU0laRU9GKG15X21hcmtlcl9yZWFkZXIpKTsKLSAgY2luZm8tPm1hcmtlciA9IChzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyICopIG1hcmtlcjsKLSAgLyogSW5pdGlhbGl6ZSBwdWJsaWMgbWV0aG9kIHBvaW50ZXJzICovCi0gIG1hcmtlci0+cHViLnJlc2V0X21hcmtlcl9yZWFkZXIgPSByZXNldF9tYXJrZXJfcmVhZGVyOwotICBtYXJrZXItPnB1Yi5yZWFkX21hcmtlcnMgPSByZWFkX21hcmtlcnM7Ci0gIG1hcmtlci0+cHViLnJlYWRfcmVzdGFydF9tYXJrZXIgPSByZWFkX3Jlc3RhcnRfbWFya2VyOwotICBtYXJrZXItPnB1Yi5nZXRfc29zX21hcmtlcl9wb3NpdGlvbiA9IGdldF9zb3NfbWFya2VyX3Bvc2l0aW9uOwotICAvKiBJbml0aWFsaXplIENPTS9BUFBuIHByb2Nlc3NpbmcuCi0gICAqIEJ5IGRlZmF1bHQsIHdlIGV4YW1pbmUgYW5kIHRoZW4gZGlzY2FyZCBBUFAwIGFuZCBBUFAxNCwKLSAgICogYnV0IHNpbXBseSBkaXNjYXJkIENPTSBhbmQgYWxsIG90aGVyIEFQUG4uCi0gICAqLwotICBtYXJrZXItPnByb2Nlc3NfQ09NID0gc2tpcF92YXJpYWJsZTsKLSAgbWFya2VyLT5sZW5ndGhfbGltaXRfQ09NID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICBtYXJrZXItPnByb2Nlc3NfQVBQbltpXSA9IHNraXBfdmFyaWFibGU7Ci0gICAgbWFya2VyLT5sZW5ndGhfbGltaXRfQVBQbltpXSA9IDA7Ci0gIH0KLSAgbWFya2VyLT5wcm9jZXNzX0FQUG5bMF0gPSBnZXRfaW50ZXJlc3RpbmdfYXBwbjsKLSAgbWFya2VyLT5wcm9jZXNzX0FQUG5bMTRdID0gZ2V0X2ludGVyZXN0aW5nX2FwcG47Ci0gIC8qIFJlc2V0IG1hcmtlciBwcm9jZXNzaW5nIHN0YXRlICovCi0gIHJlc2V0X21hcmtlcl9yZWFkZXIoY2luZm8pOwotfQotCi0KLS8qCi0gKiBDb250cm9sIHNhdmluZyBvZiBDT00gYW5kIEFQUG4gbWFya2VycyBpbnRvIG1hcmtlcl9saXN0LgotICovCi0KLSNpZmRlZiBTQVZFX01BUktFUlNfU1VQUE9SVEVECi0KLUdMT0JBTCh2b2lkKQotanBlZ19zYXZlX21hcmtlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKLQkJICAgdW5zaWduZWQgaW50IGxlbmd0aF9saW1pdCkKLXsKLSAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKLSAgbG9uZyBtYXhsZW5ndGg7Ci0gIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QgcHJvY2Vzc29yOwotCi0gIC8qIExlbmd0aCBsaW1pdCBtdXN0bid0IGJlIGxhcmdlciB0aGFuIHdoYXQgd2UgY2FuIGFsbG9jYXRlCi0gICAqIChzaG91bGQgb25seSBiZSBhIGNvbmNlcm4gaW4gYSAxNi1iaXQgZW52aXJvbm1lbnQpLgotICAgKi8KLSAgbWF4bGVuZ3RoID0gY2luZm8tPm1lbS0+bWF4X2FsbG9jX2NodW5rIC0gU0laRU9GKHN0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QpOwotICBpZiAoKChsb25nKSBsZW5ndGhfbGltaXQpID4gbWF4bGVuZ3RoKQotICAgIGxlbmd0aF9saW1pdCA9ICh1bnNpZ25lZCBpbnQpIG1heGxlbmd0aDsKLQotICAvKiBDaG9vc2UgcHJvY2Vzc29yIHJvdXRpbmUgdG8gdXNlLgotICAgKiBBUFAwL0FQUDE0IGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMuCi0gICAqLwotICBpZiAobGVuZ3RoX2xpbWl0KSB7Ci0gICAgcHJvY2Vzc29yID0gc2F2ZV9tYXJrZXI7Ci0gICAgLyogSWYgc2F2aW5nIEFQUDAvQVBQMTQsIHNhdmUgYXQgbGVhc3QgZW5vdWdoIGZvciBvdXIgaW50ZXJuYWwgdXNlLiAqLwotICAgIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0FQUDAgJiYgbGVuZ3RoX2xpbWl0IDwgQVBQMF9EQVRBX0xFTikKLSAgICAgIGxlbmd0aF9saW1pdCA9IEFQUDBfREFUQV9MRU47Ci0gICAgZWxzZSBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAxNCAmJiBsZW5ndGhfbGltaXQgPCBBUFAxNF9EQVRBX0xFTikKLSAgICAgIGxlbmd0aF9saW1pdCA9IEFQUDE0X0RBVEFfTEVOOwotICB9IGVsc2UgewotICAgIHByb2Nlc3NvciA9IHNraXBfdmFyaWFibGU7Ci0gICAgLyogSWYgZGlzY2FyZGluZyBBUFAwL0FQUDE0LCB1c2Ugb3VyIHJlZ3VsYXIgb24tdGhlLWZseSBwcm9jZXNzb3IuICovCi0gICAgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMCB8fCBtYXJrZXJfY29kZSA9PSAoaW50KSBNX0FQUDE0KQotICAgICAgcHJvY2Vzc29yID0gZ2V0X2ludGVyZXN0aW5nX2FwcG47Ci0gIH0KLQotICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9DT00pIHsKLSAgICBtYXJrZXItPnByb2Nlc3NfQ09NID0gcHJvY2Vzc29yOwotICAgIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0NPTSA9IGxlbmd0aF9saW1pdDsKLSAgfSBlbHNlIGlmIChtYXJrZXJfY29kZSA+PSAoaW50KSBNX0FQUDAgJiYgbWFya2VyX2NvZGUgPD0gKGludCkgTV9BUFAxNSkgewotICAgIG1hcmtlci0+cHJvY2Vzc19BUFBuW21hcmtlcl9jb2RlIC0gKGludCkgTV9BUFAwXSA9IHByb2Nlc3NvcjsKLSAgICBtYXJrZXItPmxlbmd0aF9saW1pdF9BUFBuW21hcmtlcl9jb2RlIC0gKGludCkgTV9BUFAwXSA9IGxlbmd0aF9saW1pdDsKLSAgfSBlbHNlCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVU5LTk9XTl9NQVJLRVIsIG1hcmtlcl9jb2RlKTsKLX0KLQotI2VuZGlmIC8qIFNBVkVfTUFSS0VSU19TVVBQT1JURUQgKi8KLQotCi0vKgotICogSW5zdGFsbCBhIHNwZWNpYWwgcHJvY2Vzc2luZyBtZXRob2QgZm9yIENPTSBvciBBUFBuIG1hcmtlcnMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCi0JCQkgICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHJvdXRpbmUpCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7Ci0KLSAgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQ09NKQotICAgIG1hcmtlci0+cHJvY2Vzc19DT00gPSByb3V0aW5lOwotICBlbHNlIGlmIChtYXJrZXJfY29kZSA+PSAoaW50KSBNX0FQUDAgJiYgbWFya2VyX2NvZGUgPD0gKGludCkgTV9BUFAxNSkKLSAgICBtYXJrZXItPnByb2Nlc3NfQVBQblttYXJrZXJfY29kZSAtIChpbnQpIE1fQVBQMF0gPSByb3V0aW5lOwotICBlbHNlCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVU5LTk9XTl9NQVJLRVIsIG1hcmtlcl9jb2RlKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkbWFzdGVyLmMgYi9saWJqcGVndHdycC9qZG1hc3Rlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2RhNzU4Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pkbWFzdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODAgKzAsMCBAQAotLyoKLSAqIGpkbWFzdGVyLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBtYXN0ZXIgY29udHJvbCBsb2dpYyBmb3IgdGhlIEpQRUcgZGVjb21wcmVzc29yLgotICogVGhlc2Ugcm91dGluZXMgYXJlIGNvbmNlcm5lZCB3aXRoIHNlbGVjdGluZyB0aGUgbW9kdWxlcyB0byBiZSBleGVjdXRlZAotICogYW5kIHdpdGggZGV0ZXJtaW5pbmcgdGhlIG51bWJlciBvZiBwYXNzZXMgYW5kIHRoZSB3b3JrIHRvIGJlIGRvbmUgaW4gZWFjaAotICogcGFzcy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogUHJpdmF0ZSBzdGF0ZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgaW50IHBhc3NfbnVtYmVyOwkJLyogIyBvZiBwYXNzZXMgY29tcGxldGVkICovCi0KLSAgYm9vbGVhbiB1c2luZ19tZXJnZWRfdXBzYW1wbGU7IC8qIFRSVUUgaWYgdXNpbmcgbWVyZ2VkIHVwc2FtcGxlL2Njb252ZXJ0ICovCi0KLSAgLyogU2F2ZWQgcmVmZXJlbmNlcyB0byBpbml0aWFsaXplZCBxdWFudGl6ZXIgbW9kdWxlcywKLSAgICogaW4gY2FzZSB3ZSBuZWVkIHRvIHN3aXRjaCBtb2Rlcy4KLSAgICovCi0gIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqIHF1YW50aXplcl8xcGFzczsKLSAgc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICogcXVhbnRpemVyXzJwYXNzOwotfSBteV9kZWNvbXBfbWFzdGVyOwotCi10eXBlZGVmIG15X2RlY29tcF9tYXN0ZXIgKiBteV9tYXN0ZXJfcHRyOwotCi0KLS8qCi0gKiBEZXRlcm1pbmUgd2hldGhlciBtZXJnZWQgdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBzaG91bGQgYmUgdXNlZC4KLSAqIENSVUNJQUw6IHRoaXMgbXVzdCBtYXRjaCB0aGUgYWN0dWFsIGNhcGFiaWxpdGllcyBvZiBqZG1lcmdlLmMhCi0gKi8KLQotTE9DQUwoYm9vbGVhbikKLXVzZV9tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0jaWZkZWYgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQKLSAgLyogTWVyZ2luZyBpcyB0aGUgZXF1aXZhbGVudCBvZiBwbGFpbiBib3gtZmlsdGVyIHVwc2FtcGxpbmcgKi8KLSAgaWYgKGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nIHx8IGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nKQotICAgIHJldHVybiBGQUxTRTsKLQotI2lmZGVmIEFORFJPSURfUkdCCi0gIC8qIGpkbWVyZ2UuYyBvbmx5IHN1cHBvcnRzIFlDQz0+UkdCNTY1IGFuZCBZQ0M9PlJHQiBjb2xvciBjb252ZXJzaW9uICovCi0gIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSAhPSBKQ1NfWUNiQ3IgfHwgCi0gICAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMyB8fAotICAgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICE9IDMgfHwKLSAgICAgIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19SR0JfNTY1ICYmIAotICAgICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCKSkgewotICAgIHJldHVybiBGQUxTRTsKLSAgfQotI2Vsc2UKLSAgLyogamRtZXJnZS5jIG9ubHkgc3VwcG9ydHMgWUNDPT5SR0IgY29sb3IgY29udmVyc2lvbiAqLwotICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gSkNTX1lDYkNyIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzIHx8Ci0gICAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19SR0IgfHwKLSAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyAhPSBSR0JfUElYRUxTSVpFKQotICAgIHJldHVybiBGQUxTRTsKLSNlbmRpZgotCi0gIC8qIGFuZCBpdCBvbmx5IGhhbmRsZXMgMmgxdiBvciAyaDJ2IHNhbXBsaW5nIHJhdGlvcyAqLwotICBpZiAoY2luZm8tPmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yICE9IDIgfHwKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciAhPSAxIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgIT0gMSB8fAotICAgICAgY2luZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID4gIDIgfHwKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciAhPSAxIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgIT0gMSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qIGZ1cnRoZXJtb3JlLCBpdCBkb2Vzbid0IHdvcmsgaWYgd2UndmUgc2NhbGVkIHRoZSBJRENUcyBkaWZmZXJlbnRseSAqLwotICBpZiAoY2luZm8tPmNvbXBfaW5mb1swXS5EQ1Rfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgfHwKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0uRENUX3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLkRDVF9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qID8/PyBhbHNvIG5lZWQgdG8gdGVzdCBmb3IgdXBzYW1wbGUtdGltZSByZXNjYWxpbmcsIHdoZW4gJiBpZiBzdXBwb3J0ZWQgKi8KLSAgcmV0dXJuIFRSVUU7CQkJLyogYnkgZ29sbHksIGl0J2xsIHdvcmsuLi4gKi8KLSNlbHNlCi0gIHJldHVybiBGQUxTRTsKLSNlbmRpZgotfQotCi0KLS8qCi0gKiBDb21wdXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIGFuZCByZWxhdGVkIHZhbHVlcy4KLSAqIE5PVEU6IHRoaXMgaXMgZXhwb3J0ZWQgZm9yIHBvc3NpYmxlIHVzZSBieSBhcHBsaWNhdGlvbi4KLSAqIEhlbmNlIGl0IG11c3RuJ3QgZG8gYW55dGhpbmcgdGhhdCBjYW4ndCBiZSBkb25lIHR3aWNlLgotICogQWxzbyBub3RlIHRoYXQgaXQgbWF5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIG1hc3RlciBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQhCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBEbyBjb21wdXRhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGJlZm9yZSBtYXN0ZXIgc2VsZWN0aW9uIHBoYXNlICovCi17Ci0jaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0jZW5kaWYKLQotICAvKiBQcmV2ZW50IGFwcGxpY2F0aW9uIGZyb20gY2FsbGluZyBtZSBhdCB3cm9uZyB0aW1lcyAqLwotI2lmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKLSAgLy8gVGlsZSBiYXNlZCBkZWNvZGluZyBtYXkgY2FsbCB0aGlzIGZ1bmN0aW9uIHNldmVyYWwgdGltZXMuCi0gIGlmICghY2luZm8tPnRpbGVfZGVjb2RlKQotI2VuZGlmCi0gICAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1JFQURZKQotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLQotICAvKiBDb21wdXRlIGFjdHVhbCBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBhbmQgRENUIHNjYWxpbmcgY2hvaWNlcy4gKi8KLSAgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA4IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSkgewotICAgIC8qIFByb3ZpZGUgMS84IHNjYWxpbmcgKi8KLSAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsIDhMKTsKLSAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwgOEwpOwotICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gMTsKLSAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtICogNCA8PSBjaW5mby0+c2NhbGVfZGVub20pIHsKLSAgICAvKiBQcm92aWRlIDEvNCBzY2FsaW5nICovCi0gICAgY2luZm8tPm91dHB1dF93aWR0aCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCA0TCk7Ci0gICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDRMKTsKLSAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IDI7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDIgPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7Ci0gICAgLyogUHJvdmlkZSAxLzIgc2NhbGluZyAqLwotICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgMkwpOwotICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCAyTCk7Ci0gICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSA0OwotICB9IGVsc2UgewotICAgIC8qIFByb3ZpZGUgMS8xIHNjYWxpbmcgKi8KLSAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOwotICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodDsKLSAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7Ci0gIH0KLSAgLyogSW4gc2VsZWN0aW5nIHRoZSBhY3R1YWwgRENUIHNjYWxpbmcgZm9yIGVhY2ggY29tcG9uZW50LCB3ZSB0cnkgdG8KLSAgICogc2NhbGUgdXAgdGhlIGNocm9tYSBjb21wb25lbnRzIHZpYSBJRENUIHNjYWxpbmcgcmF0aGVyIHRoYW4gdXBzYW1wbGluZy4KLSAgICogVGhpcyBzYXZlcyB0aW1lIGlmIHRoZSB1cHNhbXBsZXIgZ2V0cyB0byB1c2UgMToxIHNjYWxpbmcuCi0gICAqIE5vdGUgdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgc3VwcG9ydGVkIERDVCBzY2FsaW5ncyBhcmUgcG93ZXJzIG9mIDIuCi0gICAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIGludCBzc2l6ZSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICAgIHdoaWxlIChzc2l6ZSA8IERDVFNJWkUgJiYKLQkgICAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIHNzaXplICogMiA8PQotCSAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkgJiYKLQkgICAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIHNzaXplICogMiA8PQotCSAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkpIHsKLSAgICAgIHNzaXplID0gc3NpemUgKiAyOwotICAgIH0KLSAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBzc2l6ZTsKLSAgfQotCi0gIC8qIFJlY29tcHV0ZSBkb3duc2FtcGxlZCBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHM7Ci0gICAqIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGtub3cgdGhlc2UgaWYgdXNpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuCi0gICAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIFNpemUgaW4gc2FtcGxlcywgYWZ0ZXIgSURDVCBzY2FsaW5nICovCi0gICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqCi0JCSAgICAobG9uZykgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpLAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7Ci0gICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICoKLQkJICAgIChsb25nKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSksCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgfQotCi0jZWxzZSAvKiAhSURDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLwotCi0gIC8qIEhhcmR3aXJlIGl0IHRvICJubyBzY2FsaW5nIiAqLwotICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOwotICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gIC8qIGpkaW5wdXQuYyBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBEQ1Rfc2NhbGVkX3NpemUgdG8gRENUU0laRSwKLSAgICogYW5kIGhhcyBjb21wdXRlZCB1bnNjYWxlZCBkb3duc2FtcGxlZF93aWR0aCBhbmQgZG93bnNhbXBsZWRfaGVpZ2h0LgotICAgKi8KLQotI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KLQotICAvKiBSZXBvcnQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gc2VsZWN0ZWQgY29sb3JzcGFjZS4gKi8KLSAgLyogUHJvYmFibHkgdGhpcyBzaG91bGQgYmUgaW4gdGhlIGNvbG9yIGNvbnZlcnNpb24gbW9kdWxlLi4uICovCi0gIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfUkdCOgotI2lmIFJHQl9QSVhFTFNJWkUgIT0gMwotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IFJHQl9QSVhFTFNJWkU7Ci0gICAgYnJlYWs7Ci0jZW5kaWYgLyogZWxzZSBzaGFyZSBjb2RlIHdpdGggWUNiQ3IgKi8KLSNpZmRlZiBBTkRST0lEX1JHQgotICBjYXNlIEpDU19SR0JfNTY1OgotI2VuZGlmCi0gIGNhc2UgSkNTX1lDYkNyOgotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDM7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX0NNWUs6Ci0gIGNhc2UgSkNTX1lDQ0s6Ci0jaWZkZWYgQU5EUk9JRF9SR0IKLSAgY2FzZSBKQ1NfUkdCQV84ODg4OgotI2VuZGlmCi0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gNDsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoJCQkvKiBlbHNlIG11c3QgYmUgc2FtZSBjb2xvcnNwYWNlIGFzIGluIGZpbGUgKi8KLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2luZm8tPm91dHB1dF9jb21wb25lbnRzID0gKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgPyAxIDoKLQkJCSAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyk7Ci0KLSAgLyogU2VlIGlmIHVwc2FtcGxlciB3aWxsIHdhbnQgdG8gZW1pdCBtb3JlIHRoYW4gb25lIHJvdyBhdCBhIHRpbWUgKi8KLSAgaWYgKHVzZV9tZXJnZWRfdXBzYW1wbGUoY2luZm8pKQotICAgIGNpbmZvLT5yZWNfb3V0YnVmX2hlaWdodCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKLSAgZWxzZQotICAgIGNpbmZvLT5yZWNfb3V0YnVmX2hlaWdodCA9IDE7Ci19Ci0KLQotLyoKLSAqIFNldmVyYWwgZGVjb21wcmVzc2lvbiBwcm9jZXNzZXMgbmVlZCB0byByYW5nZS1saW1pdCB2YWx1ZXMgdG8gdGhlIHJhbmdlCi0gKiAwLi5NQVhKU0FNUExFOyB0aGUgaW5wdXQgdmFsdWUgbWF5IGZhbGwgc29tZXdoYXQgb3V0c2lkZSB0aGlzIHJhbmdlCi0gKiBkdWUgdG8gbm9pc2UgaW50cm9kdWNlZCBieSBxdWFudGl6YXRpb24sIHJvdW5kb2ZmIGVycm9yLCBldGMuICBUaGVzZQotICogcHJvY2Vzc2VzIGFyZSBpbm5lciBsb29wcyBhbmQgbmVlZCB0byBiZSBhcyBmYXN0IGFzIHBvc3NpYmxlLiAgT24gbW9zdAotICogbWFjaGluZXMsIHBhcnRpY3VsYXJseSBDUFVzIHdpdGggcGlwZWxpbmVzIG9yIGluc3RydWN0aW9uIHByZWZldGNoLAotICogYSAoc3Vic2NyaXB0LWNoZWNrLWxlc3MpIEMgdGFibGUgbG9va3VwCi0gKgkJeCA9IHNhbXBsZV9yYW5nZV9saW1pdFt4XTsKLSAqIGlzIGZhc3RlciB0aGFuIGV4cGxpY2l0IHRlc3RzCi0gKgkJaWYgKHggPCAwKSAgeCA9IDA7Ci0gKgkJZWxzZSBpZiAoeCA+IE1BWEpTQU1QTEUpICB4ID0gTUFYSlNBTVBMRTsKLSAqIFRoZXNlIHByb2Nlc3NlcyBhbGwgdXNlIGEgY29tbW9uIHRhYmxlIHByZXBhcmVkIGJ5IHRoZSByb3V0aW5lIGJlbG93LgotICoKLSAqIEZvciBtb3N0IHN0ZXBzIHdlIGNhbiBtYXRoZW1hdGljYWxseSBndWFyYW50ZWUgdGhhdCB0aGUgaW5pdGlhbCB2YWx1ZQotICogb2YgeCBpcyB3aXRoaW4gTUFYSlNBTVBMRSsxIG9mIHRoZSBsZWdhbCByYW5nZSwgc28gYSB0YWJsZSBydW5uaW5nIGZyb20KLSAqIC0oTUFYSlNBTVBMRSsxKSB0byAyKk1BWEpTQU1QTEUrMSBpcyBzdWZmaWNpZW50LiAgQnV0IGZvciB0aGUgaW5pdGlhbAotICogbGltaXRpbmcgc3RlcCAoanVzdCBhZnRlciB0aGUgSURDVCksIGEgd2lsZGx5IG91dC1vZi1yYW5nZSB2YWx1ZSBpcwotICogcG9zc2libGUgaWYgdGhlIGlucHV0IGRhdGEgaXMgY29ycnVwdC4gIFRvIGF2b2lkIGFueSBjaGFuY2Ugb2YgaW5kZXhpbmcKLSAqIG9mZiB0aGUgZW5kIG9mIG1lbW9yeSBhbmQgZ2V0dGluZyBhIGJhZC1wb2ludGVyIHRyYXAsIHdlIHBlcmZvcm0gdGhlCi0gKiBwb3N0LUlEQ1QgbGltaXRpbmcgdGh1czoKLSAqCQl4ID0gcmFuZ2VfbGltaXRbeCAmIE1BU0tdOwotICogd2hlcmUgTUFTSyBpcyAyIGJpdHMgd2lkZXIgdGhhbiBsZWdhbCBzYW1wbGUgZGF0YSwgaWUgMTAgYml0cyBmb3IgOC1iaXQKLSAqIHNhbXBsZXMuICBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyB0aGlzIGlzIG1vcmUgdGhhbiBlbm91Z2ggcmFuZ2UgYW5kCi0gKiBhIGNvcnJlY3Qgb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkOyB3aXRoIGJvZ3VzIGlucHV0IGRhdGEgdGhlIG1hc2sgd2lsbAotICogY2F1c2Ugd3JhcGFyb3VuZCwgYW5kIHdlIHdpbGwgc2FmZWx5IGdlbmVyYXRlIGEgYm9ndXMtYnV0LWluLXJhbmdlIG91dHB1dC4KLSAqIEZvciB0aGUgcG9zdC1JRENUIHN0ZXAsIHdlIHdhbnQgdG8gY29udmVydCB0aGUgZGF0YSBmcm9tIHNpZ25lZCB0byB1bnNpZ25lZAotICogcmVwcmVzZW50YXRpb24gYnkgYWRkaW5nIENFTlRFUkpTQU1QTEUgYXQgdGhlIHNhbWUgdGltZSB0aGF0IHdlIGxpbWl0IGl0LgotICogU28gdGhlIHBvc3QtSURDVCBsaW1pdGluZyB0YWJsZSBlbmRzIHVwIGxvb2tpbmcgbGlrZSB0aGlzOgotICogICBDRU5URVJKU0FNUExFLENFTlRFUkpTQU1QTEUrMSwuLi4sTUFYSlNBTVBMRSwKLSAqICAgTUFYSlNBTVBMRSAocmVwZWF0IDIqKE1BWEpTQU1QTEUrMSktQ0VOVEVSSlNBTVBMRSB0aW1lcyksCi0gKiAgIDAgICAgICAgICAgKHJlcGVhdCAyKihNQVhKU0FNUExFKzEpLUNFTlRFUkpTQU1QTEUgdGltZXMpLAotICogICAwLDEsLi4uLENFTlRFUkpTQU1QTEUtMQotICogTmVnYXRpdmUgaW5wdXRzIHNlbGVjdCB2YWx1ZXMgZnJvbSB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgdGFibGUgYWZ0ZXIKLSAqIG1hc2tpbmcuCi0gKgotICogV2UgY2FuIHNhdmUgc29tZSBzcGFjZSBieSBvdmVybGFwcGluZyB0aGUgc3RhcnQgb2YgdGhlIHBvc3QtSURDVCB0YWJsZQotICogd2l0aCB0aGUgc2ltcGxlciByYW5nZSBsaW1pdGluZyB0YWJsZS4gIFRoZSBwb3N0LUlEQ1QgdGFibGUgYmVnaW5zIGF0Ci0gKiBzYW1wbGVfcmFuZ2VfbGltaXQgKyBDRU5URVJKU0FNUExFLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgdGFibGUgaXMgYWxsb2NhdGVkIGluIG5lYXIgZGF0YSBzcGFjZSBvbiBQQ3M7IGl0J3Mgc21hbGwKLSAqIGVub3VnaCBhbmQgdXNlZCBvZnRlbiBlbm91Z2ggdG8ganVzdGlmeSB0aGlzLgotICovCi0KLUxPQ0FMKHZvaWQpCi1wcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIHNhbXBsZV9yYW5nZV9saW1pdCB0YWJsZSAqLwotewotICBKU0FNUExFICogdGFibGU7Ci0gIGludCBpOwotCi0gIHRhYmxlID0gKEpTQU1QTEUgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkoNSAqIChNQVhKU0FNUExFKzEpICsgQ0VOVEVSSlNBTVBMRSkgKiBTSVpFT0YoSlNBTVBMRSkpOwotICB0YWJsZSArPSAoTUFYSlNBTVBMRSsxKTsJLyogYWxsb3cgbmVnYXRpdmUgc3Vic2NyaXB0cyBvZiBzaW1wbGUgdGFibGUgKi8KLSAgY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdCA9IHRhYmxlOwotICAvKiBGaXJzdCBzZWdtZW50IG9mICJzaW1wbGUiIHRhYmxlOiBsaW1pdFt4XSA9IDAgZm9yIHggPCAwICovCi0gIE1FTVpFUk8odGFibGUgLSAoTUFYSlNBTVBMRSsxKSwgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSlNBTVBMRSkpOwotICAvKiBNYWluIHBhcnQgb2YgInNpbXBsZSIgdGFibGU6IGxpbWl0W3hdID0geCAqLwotICBmb3IgKGkgPSAwOyBpIDw9IE1BWEpTQU1QTEU7IGkrKykKLSAgICB0YWJsZVtpXSA9IChKU0FNUExFKSBpOwotICB0YWJsZSArPSBDRU5URVJKU0FNUExFOwkvKiBQb2ludCB0byB3aGVyZSBwb3N0LUlEQ1QgdGFibGUgc3RhcnRzICovCi0gIC8qIEVuZCBvZiBzaW1wbGUgdGFibGUsIHJlc3Qgb2YgZmlyc3QgaGFsZiBvZiBwb3N0LUlEQ1QgdGFibGUgKi8KLSAgZm9yIChpID0gQ0VOVEVSSlNBTVBMRTsgaSA8IDIqKE1BWEpTQU1QTEUrMSk7IGkrKykKLSAgICB0YWJsZVtpXSA9IE1BWEpTQU1QTEU7Ci0gIC8qIFNlY29uZCBoYWxmIG9mIHBvc3QtSURDVCB0YWJsZSAqLwotICBNRU1aRVJPKHRhYmxlICsgKDIgKiAoTUFYSlNBTVBMRSsxKSksCi0JICAoMiAqIChNQVhKU0FNUExFKzEpIC0gQ0VOVEVSSlNBTVBMRSkgKiBTSVpFT0YoSlNBTVBMRSkpOwotICBNRU1DT1BZKHRhYmxlICsgKDQgKiAoTUFYSlNBTVBMRSsxKSAtIENFTlRFUkpTQU1QTEUpLAotCSAgY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdCwgQ0VOVEVSSlNBTVBMRSAqIFNJWkVPRihKU0FNUExFKSk7Ci19Ci0KLQotLyoKLSAqIE1hc3RlciBzZWxlY3Rpb24gb2YgZGVjb21wcmVzc2lvbiBtb2R1bGVzLgotICogVGhpcyBpcyBkb25lIG9uY2UgYXQganBlZ19zdGFydF9kZWNvbXByZXNzIHRpbWUuICBXZSBkZXRlcm1pbmUKLSAqIHdoaWNoIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUgaW5pdGlhbGl6YXRpb24gY2FsbHMuCi0gKiBXZSBhbHNvIGluaXRpYWxpemUgdGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlIHRvIGJlZ2luIGNvbnN1bWluZyBkYXRhLgotICoKLSAqIFNpbmNlIGpwZWdfcmVhZF9oZWFkZXIgaGFzIGZpbmlzaGVkLCB3ZSBrbm93IHdoYXQgaXMgaW4gdGhlIFNPRgotICogYW5kIChmaXJzdCkgU09TIG1hcmtlcnMuICBXZSBhbHNvIGhhdmUgYWxsIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIKLSAqIHNldHRpbmdzLgotICovCi0KLUxPQ0FMKHZvaWQpCi1tYXN0ZXJfc2VsZWN0aW9uIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotICBib29sZWFuIHVzZV9jX2J1ZmZlcjsKLSAgbG9uZyBzYW1wbGVzcGVycm93OwotICBKRElNRU5TSU9OIGpkX3NhbXBsZXNwZXJyb3c7Ci0KLSAgLyogSW5pdGlhbGl6ZSBkaW1lbnNpb25zIGFuZCBvdGhlciBzdHVmZiAqLwotICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOwotICBwcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlKGNpbmZvKTsKLQotICAvKiBXaWR0aCBvZiBhbiBvdXRwdXQgc2NhbmxpbmUgbXVzdCBiZSByZXByZXNlbnRhYmxlIGFzIEpESU1FTlNJT04uICovCi0gIHNhbXBsZXNwZXJyb3cgPSAobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCAqIChsb25nKSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7Ci0gIGpkX3NhbXBsZXNwZXJyb3cgPSAoSkRJTUVOU0lPTikgc2FtcGxlc3BlcnJvdzsKLSAgaWYgKChsb25nKSBqZF9zYW1wbGVzcGVycm93ICE9IHNhbXBsZXNwZXJyb3cpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBteSBwcml2YXRlIHN0YXRlICovCi0gIG1hc3Rlci0+cGFzc19udW1iZXIgPSAwOwotICBtYXN0ZXItPnVzaW5nX21lcmdlZF91cHNhbXBsZSA9IHVzZV9tZXJnZWRfdXBzYW1wbGUoY2luZm8pOwotCi0gIC8qIENvbG9yIHF1YW50aXplciBzZWxlY3Rpb24gKi8KLSAgbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3MgPSBOVUxMOwotICBtYXN0ZXItPnF1YW50aXplcl8ycGFzcyA9IE5VTEw7Ci0gIC8qIE5vIG1vZGUgY2hhbmdlcyBpZiBub3QgdXNpbmcgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KLSAgaWYgKCEgY2luZm8tPnF1YW50aXplX2NvbG9ycyB8fCAhIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgewotICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBGQUxTRTsKLSAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7Ci0gICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOwotICB9Ci0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7Ci0gICAgaWYgKGNpbmZvLT5yYXdfZGF0YV9vdXQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVElNUEwpOwotICAgIC8qIDItcGFzcyBxdWFudGl6ZXIgb25seSB3b3JrcyBpbiAzLWNvbXBvbmVudCBjb2xvciBzcGFjZS4gKi8KLSAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICE9IDMpIHsKLSAgICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBUUlVFOwotICAgICAgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCA9IEZBTFNFOwotICAgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOwotICAgICAgY2luZm8tPmNvbG9ybWFwID0gTlVMTDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5jb2xvcm1hcCAhPSBOVUxMKSB7Ci0gICAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gVFJVRTsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSkgewotICAgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IFRSVUU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBUUlVFOwotICAgIH0KLQotICAgIGlmIChjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50KSB7Ci0jaWZkZWYgUVVBTlRfMVBBU1NfU1VQUE9SVEVECi0gICAgICBqaW5pdF8xcGFzc19xdWFudGl6ZXIoY2luZm8pOwotICAgICAgbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3MgPSBjaW5mby0+Y3F1YW50aXplOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0KLQotICAgIC8qIFdlIHVzZSB0aGUgMi1wYXNzIGNvZGUgdG8gbWFwIHRvIGV4dGVybmFsIGNvbG9ybWFwcy4gKi8KLSAgICBpZiAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCB8fCBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50KSB7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0gICAgICBqaW5pdF8ycGFzc19xdWFudGl6ZXIoY2luZm8pOwotICAgICAgbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3MgPSBjaW5mby0+Y3F1YW50aXplOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0KLSAgICAvKiBJZiBib3RoIHF1YW50aXplcnMgYXJlIGluaXRpYWxpemVkLCB0aGUgMi1wYXNzIG9uZSBpcyBsZWZ0IGFjdGl2ZTsKLSAgICAgKiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3Igc3RhcnRpbmcgd2l0aCBxdWFudGl6YXRpb24gdG8gYW4gZXh0ZXJuYWwgbWFwLgotICAgICAqLwotICB9Ci0KLSAgLyogUG9zdC1wcm9jZXNzaW5nOiBpbiBwYXJ0aWN1bGFyLCBjb2xvciBjb252ZXJzaW9uIGZpcnN0ICovCi0gIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpIHsKLSAgICBpZiAobWFzdGVyLT51c2luZ19tZXJnZWRfdXBzYW1wbGUpIHsKLSNpZmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAotICAgICAgamluaXRfbWVyZ2VkX3Vwc2FtcGxlcihjaW5mbyk7IC8qIGRvZXMgY29sb3IgY29udmVyc2lvbiB0b28gKi8KLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIoY2luZm8pOwotICAgICAgamluaXRfdXBzYW1wbGVyKGNpbmZvKTsKLSAgICB9Ci0gICAgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIoY2luZm8sIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpOwotICB9Ci0gIC8qIEludmVyc2UgRENUICovCi0gIGppbml0X2ludmVyc2VfZGN0KGNpbmZvKTsKLSAgLyogRW50cm9weSBkZWNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0gZWxzZQotICAgICAgamluaXRfaHVmZl9kZWNvZGVyKGNpbmZvKTsKLSAgfQotCi0gIC8qIEluaXRpYWxpemUgcHJpbmNpcGFsIGJ1ZmZlciBjb250cm9sbGVycy4gKi8KLSAgdXNlX2NfYnVmZmVyID0gY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMgfHwgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlOwotICBqaW5pdF9kX2NvZWZfY29udHJvbGxlcihjaW5mbywgdXNlX2NfYnVmZmVyKTsKLQotICBpZiAoISBjaW5mby0+cmF3X2RhdGFfb3V0KQotICAgIGppbml0X2RfbWFpbl9jb250cm9sbGVyKGNpbmZvLCBGQUxTRSAvKiBuZXZlciBuZWVkIGZ1bGwgYnVmZmVyIGhlcmUgKi8pOwotCi0gIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCi0gICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBJbml0aWFsaXplIGlucHV0IHNpZGUgb2YgZGVjb21wcmVzc29yIHRvIGNvbnN1bWUgZmlyc3Qgc2Nhbi4gKi8KLSAgKCpjaW5mby0+aW5wdXRjdGwtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7Ci0KLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgLyogSWYganBlZ19zdGFydF9kZWNvbXByZXNzIHdpbGwgcmVhZCB0aGUgd2hvbGUgZmlsZSwgaW5pdGlhbGl6ZQotICAgKiBwcm9ncmVzcyBtb25pdG9yaW5nIGFwcHJvcHJpYXRlbHkuICBUaGUgaW5wdXQgc3RlcCBpcyBjb3VudGVkCi0gICAqIGFzIG9uZSBwYXNzLgotICAgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmICEgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlICYmCi0gICAgICBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgewotICAgIGludCBuc2NhbnM7Ci0gICAgLyogRXN0aW1hdGUgbnVtYmVyIG9mIHNjYW5zIHRvIHNldCBwYXNzX2xpbWl0LiAqLwotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotICAgICAgLyogQXJiaXRyYXJpbHkgZXN0aW1hdGUgMiBpbnRlcmxlYXZlZCBEQyBzY2FucyArIDMgQUMgc2NhbnMvY29tcG9uZW50LiAqLwotICAgICAgbnNjYW5zID0gMiArIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEZvciBhIG5vbnByb2dyZXNzaXZlIG11bHRpc2NhbiBmaWxlLCBlc3RpbWF0ZSAxIHNjYW4gcGVyIGNvbXBvbmVudC4gKi8KLSAgICAgIG5zY2FucyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICB9Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAwTDsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAqIG5zY2FuczsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSAwOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gKGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPyAzIDogMik7Ci0gICAgLyogQ291bnQgdGhlIGlucHV0IHBhc3MgYXMgZG9uZSAqLwotICAgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKLSAgfQotI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwotfQotCi0KLS8qCi0gKiBQZXItcGFzcyBzZXR1cC4KLSAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBvdXRwdXQgcGFzcy4gIFdlIGRldGVybWluZSB3aGljaAotICogbW9kdWxlcyB3aWxsIGJlIGFjdGl2ZSBkdXJpbmcgdGhpcyBwYXNzIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUKLSAqIHN0YXJ0X3Bhc3MgY2FsbHMuICBXZSBhbHNvIHNldCBpc19kdW1teV9wYXNzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhpcwotICogaXMgYSAicmVhbCIgb3V0cHV0IHBhc3Mgb3IgYSBkdW1teSBwYXNzIGZvciBjb2xvciBxdWFudGl6YXRpb24uCi0gKiAoSW4gdGhlIGxhdHRlciBjYXNlLCBqZGFwaXN0ZC5jIHdpbGwgY3JhbmsgdGhlIHBhc3MgdG8gY29tcGxldGlvbi4pCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKLQotICBpZiAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcykgewotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICAgIC8qIEZpbmFsIHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiAqLwotICAgIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsKLSAgICAoKmNpbmZvLT5jcXVhbnRpemUtPnN0YXJ0X3Bhc3MpIChjaW5mbywgRkFMU0UpOwotICAgICgqY2luZm8tPnBvc3QtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKLSAgICAoKmNpbmZvLT5tYWluLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KLSAgfSBlbHNlIHsKLSAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycyAmJiBjaW5mby0+Y29sb3JtYXAgPT0gTlVMTCkgewotICAgICAgLyogU2VsZWN0IG5ldyBxdWFudGl6YXRpb24gbWV0aG9kICovCi0gICAgICBpZiAoY2luZm8tPnR3b19wYXNzX3F1YW50aXplICYmIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpIHsKLQljaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3M7Ci0JbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IFRSVUU7Ci0gICAgICB9IGVsc2UgaWYgKGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQpIHsKLQljaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3M7Ci0gICAgICB9IGVsc2UgewotCUVSUkVYSVQoY2luZm8sIEpFUlJfTU9ERV9DSEFOR0UpOwotICAgICAgfQotICAgIH0KLSAgICAoKmNpbmZvLT5pZGN0LT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X291dHB1dF9wYXNzKSAoY2luZm8pOwotICAgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpIHsKLSAgICAgIGlmICghIG1hc3Rlci0+dXNpbmdfbWVyZ2VkX3Vwc2FtcGxlKQotCSgqY2luZm8tPmNjb252ZXJ0LT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAgICAgKCpjaW5mby0+dXBzYW1wbGUtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7Ci0gICAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKLQkoKmNpbmZvLT5jcXVhbnRpemUtPnN0YXJ0X3Bhc3MpIChjaW5mbywgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyk7Ci0gICAgICAoKmNpbmZvLT5wb3N0LT5zdGFydF9wYXNzKSAoY2luZm8sCi0JICAgIChtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID8gSkJVRl9TQVZFX0FORF9QQVNTIDogSkJVRl9QQVNTX1RIUlUpKTsKLSAgICAgICgqY2luZm8tPm1haW4tPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9QQVNTX1RIUlUpOwotICAgIH0KLSAgfQotCi0gIC8qIFNldCB1cCBwcm9ncmVzcyBtb25pdG9yJ3MgcGFzcyBpbmZvIGlmIHByZXNlbnQgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gbWFzdGVyLT5wYXNzX251bWJlcjsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IG1hc3Rlci0+cGFzc19udW1iZXIgKwotCQkJCSAgICAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA/IDIgOiAxKTsKLSAgICAvKiBJbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB3ZSBhc3N1bWUgb25lIG1vcmUgb3V0cHV0IHBhc3MgaWYgRU9JIG5vdAotICAgICAqIHlldCByZWFjaGVkLCBidXQgbm8gbW9yZSBwYXNzZXMgaWYgRU9JIGhhcyBiZWVuIHJlYWNoZWQuCi0gICAgICovCi0gICAgaWYgKGNpbmZvLT5idWZmZXJlZF9pbWFnZSAmJiAhIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQpIHsKLSAgICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzICs9IChjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID8gMiA6IDEpOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgZW5kIG9mIGFuIG91dHB1dCBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX291dHB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotCi0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQotICAgICgqY2luZm8tPmNxdWFudGl6ZS0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7Ci0gIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKLX0KLQotCi0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0KLS8qCi0gKiBTd2l0Y2ggdG8gYSBuZXcgZXh0ZXJuYWwgY29sb3JtYXAgYmV0d2VlbiBvdXRwdXQgcGFzc2VzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19uZXdfY29sb3JtYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7Ci0KLSAgLyogUHJldmVudCBhcHBsaWNhdGlvbiBmcm9tIGNhbGxpbmcgbWUgYXQgd3JvbmcgdGltZXMgKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0JVRklNQUdFKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgJiYgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCAmJgotICAgICAgY2luZm8tPmNvbG9ybWFwICE9IE5VTEwpIHsKLSAgICAvKiBTZWxlY3QgMi1wYXNzIHF1YW50aXplciBmb3IgZXh0ZXJuYWwgY29sb3JtYXAgdXNlICovCi0gICAgY2luZm8tPmNxdWFudGl6ZSA9IG1hc3Rlci0+cXVhbnRpemVyXzJwYXNzOwotICAgIC8qIE5vdGlmeSBxdWFudGl6ZXIgb2YgY29sb3JtYXAgY2hhbmdlICovCi0gICAgKCpjaW5mby0+Y3F1YW50aXplLT5uZXdfY29sb3JfbWFwKSAoY2luZm8pOwotICAgIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsgLyoganVzdCBpbiBjYXNlICovCi0gIH0gZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTU9ERV9DSEFOR0UpOwotfQotCi0jZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgbWFzdGVyIGRlY29tcHJlc3Npb24gY29udHJvbCBhbmQgc2VsZWN0IGFjdGl2ZSBtb2R1bGVzLgotICogVGhpcyBpcyBwZXJmb3JtZWQgYXQgdGhlIHN0YXJ0IG9mIGpwZWdfc3RhcnRfZGVjb21wcmVzcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X21hc3Rlcl9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlcjsKLQotICBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YobXlfZGVjb21wX21hc3RlcikpOwotICBjaW5mby0+bWFzdGVyID0gKHN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgKikgbWFzdGVyOwotICBtYXN0ZXItPnB1Yi5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcyA9IHByZXBhcmVfZm9yX291dHB1dF9wYXNzOwotICBtYXN0ZXItPnB1Yi5maW5pc2hfb3V0cHV0X3Bhc3MgPSBmaW5pc2hfb3V0cHV0X3Bhc3M7Ci0KLSAgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IEZBTFNFOwotCi0gIG1hc3Rlcl9zZWxlY3Rpb24oY2luZm8pOwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRtZXJnZS5jIGIvbGlianBlZ3R3cnAvamRtZXJnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzFmYmQzLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pkbWVyZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDkwMiArMCwwIEBACi0vKgotICogamRtZXJnZS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIG1lcmdlZCB1cHNhbXBsaW5nL2NvbG9yIGNvbnZlcnNpb24uCi0gKgotICogVGhpcyBmaWxlIGNvbWJpbmVzIGZ1bmN0aW9ucyBmcm9tIGpkc2FtcGxlLmMgYW5kIGpkY29sb3IuYzsKLSAqIHJlYWQgdGhvc2UgZmlsZXMgZmlyc3QgdG8gdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24uCi0gKgotICogV2hlbiB0aGUgY2hyb21hIGNvbXBvbmVudHMgYXJlIHRvIGJlIHVwc2FtcGxlZCBieSBzaW1wbGUgcmVwbGljYXRpb24KLSAqIChpZSwgYm94IGZpbHRlcmluZyksIHdlIGNhbiBzYXZlIHNvbWUgd29yayBpbiBjb2xvciBjb252ZXJzaW9uIGJ5Ci0gKiBjYWxjdWxhdGluZyBhbGwgdGhlIG91dHB1dCBwaXhlbHMgY29ycmVzcG9uZGluZyB0byBhIHBhaXIgb2YgY2hyb21hCi0gKiBzYW1wbGVzIGF0IG9uZSB0aW1lLiAgSW4gdGhlIGNvbnZlcnNpb24gZXF1YXRpb25zCi0gKglSID0gWSAgICAgICAgICAgKyBLMSAqIENyCi0gKglHID0gWSArIEsyICogQ2IgKyBLMyAqIENyCi0gKglCID0gWSArIEs0ICogQ2IKLSAqIG9ubHkgdGhlIFkgdGVybSB2YXJpZXMgYW1vbmcgdGhlIGdyb3VwIG9mIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIGEgcGFpcgotICogb2YgY2hyb21hIHNhbXBsZXMsIHNvIHRoZSByZXN0IG9mIHRoZSB0ZXJtcyBjYW4gYmUgY2FsY3VsYXRlZCBqdXN0IG9uY2UuCi0gKiBBdCB0eXBpY2FsIHNhbXBsaW5nIHJhdGlvcywgdGhpcyBlbGltaW5hdGVzIGhhbGYgb3IgdGhyZWUtcXVhcnRlcnMgb2YgdGhlCi0gKiBtdWx0aXBsaWNhdGlvbnMgbmVlZGVkIGZvciBjb2xvciBjb252ZXJzaW9uLgotICoKLSAqIFRoaXMgZmlsZSBjdXJyZW50bHkgcHJvdmlkZXMgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOgotICoJWUNiQ3IgPT4gUkdCIGNvbG9yIGNvbnZlcnNpb24gb25seS4KLSAqCVNhbXBsaW5nIHJhdGlvcyBvZiAyaDF2IG9yIDJoMnYuCi0gKglObyBzY2FsaW5nIG5lZWRlZCBhdCB1cHNhbXBsZSB0aW1lLgotICoJQ29ybmVyLWFsaWduZWQgKG5vbi1DQ0lSNjAxKSBzYW1wbGluZyBhbGlnbm1lbnQuCi0gKiBPdGhlciBzcGVjaWFsIGNhc2VzIGNvdWxkIGJlIGFkZGVkLCBidXQgaW4gbW9zdCBhcHBsaWNhdGlvbnMgdGhlc2UgYXJlCi0gKiB0aGUgb25seSBjb21tb24gY2FzZXMuICAoRm9yIHVuY29tbW9uIGNhc2VzIHdlIGZhbGwgYmFjayBvbiB0aGUgbW9yZQotICogZ2VuZXJhbCBjb2RlIGluIGpkc2FtcGxlLmMgYW5kIGpkY29sb3IuYy4pCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0jaWZkZWYgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQKLQotI2lmZGVmIEFORFJPSURfUkdCCi0KLS8qIERlY2xhcmF0aW9ucyBmb3Igb3JkZXJlZCBkaXRoZXJpbmcuCi0gKiAKLSAqIFdlIHVzZSA0eDQgb3JkZXJlZCBkaXRoZXIgYXJyYXkgcGFja2VkIGludG8gMzIgYml0cy4gVGhpcyBhcnJheSBpcwotICogc3VmZmljZW50IGZvciBkaXRoZXJpbmcgUkdCXzg4OCB0byBSR0JfNTY1LgotICovCi0KLSNkZWZpbmUgRElUSEVSX01BU0sgICAgICAgICAweDMKLSNkZWZpbmUgRElUSEVSX1JPVEFURSh4KSAgICAoKCh4KTw8MjQpIHwgKCgoeCk+PjgpJjB4MDBGRkZGRkYpKQotc3RhdGljIGNvbnN0IElOVDMyIGRpdGhlcl9tYXRyaXhbNF0gPSB7Ci0gIDB4MDAwODAyMEEsCi0gIDB4MEMwNDBFMDYsCi0gIDB4MDMwQjAxMDksCi0gIDB4MEYwNzBEMDUKLX07Ci0KLSNlbmRpZgotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX3Vwc2FtcGxlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBQb2ludGVyIHRvIHJvdXRpbmUgdG8gZG8gYWN0dWFsIHVwc2FtcGxpbmcvY29udmVyc2lvbiBvZiBvbmUgcm93IGdyb3VwICovCi0gIEpNRVRIT0Qodm9pZCwgdXBtZXRob2QsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKLQkJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikpOwotCi0gIC8qIFByaXZhdGUgc3RhdGUgZm9yIFlDQy0+UkdCIGNvbnZlcnNpb24gKi8KLSAgaW50ICogQ3Jfcl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gUiBjb252ZXJzaW9uICovCi0gIGludCAqIENiX2JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEIgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENyX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIEcgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENiX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEcgY29udmVyc2lvbiAqLwotCi0gIC8qIEZvciAyOjEgdmVydGljYWwgc2FtcGxpbmcsIHdlIHByb2R1Y2UgdHdvIG91dHB1dCByb3dzIGF0IGEgdGltZS4KLSAgICogV2UgbmVlZCBhICJzcGFyZSIgcm93IGJ1ZmZlciB0byBob2xkIHRoZSBzZWNvbmQgb3V0cHV0IHJvdyBpZiB0aGUKLSAgICogYXBwbGljYXRpb24gcHJvdmlkZXMganVzdCBhIG9uZS1yb3cgYnVmZmVyOyB3ZSBhbHNvIHVzZSB0aGUgc3BhcmUKLSAgICogdG8gZGlzY2FyZCB0aGUgZHVtbXkgbGFzdCByb3cgaWYgdGhlIGltYWdlIGhlaWdodCBpcyBvZGQuCi0gICAqLwotICBKU0FNUFJPVyBzcGFyZV9yb3c7Ci0gIGJvb2xlYW4gc3BhcmVfZnVsbDsJCS8qIFQgaWYgc3BhcmUgYnVmZmVyIGlzIG9jY3VwaWVkICovCi0KLSAgSkRJTUVOU0lPTiBvdXRfcm93X3dpZHRoOwkvKiBzYW1wbGVzIHBlciBvdXRwdXQgcm93ICovCi0gIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIGltYWdlICovCi19IG15X3Vwc2FtcGxlcjsKLQotdHlwZWRlZiBteV91cHNhbXBsZXIgKiBteV91cHNhbXBsZV9wdHI7Ci0KLSNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCi0jZGVmaW5lIE9ORV9IQUxGCSgoSU5UMzIpIDEgPDwgKFNDQUxFQklUUy0xKSkKLSNkZWZpbmUgRklYKHgpCQkoKElOVDMyKSAoKHgpICogKDFMPDxTQ0FMRUJJVFMpICsgMC41KSkKLQotCi0vKgotICogSW5pdGlhbGl6ZSB0YWJsZXMgZm9yIFlDQy0+UkdCIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KLSAqIFRoaXMgaXMgdGFrZW4gZGlyZWN0bHkgZnJvbSBqZGNvbG9yLmM7IHNlZSB0aGF0IGZpbGUgZm9yIG1vcmUgaW5mby4KLSAqLwotCi1MT0NBTCh2b2lkKQotYnVpbGRfeWNjX3JnYl90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICBpbnQgaTsKLSAgSU5UMzIgeDsKLSAgU0hJRlRfVEVNUFMKLQotICB1cHNhbXBsZS0+Q3Jfcl90YWIgPSAoaW50ICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKLSAgdXBzYW1wbGUtPkNiX2JfdGFiID0gKGludCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7Ci0gIHVwc2FtcGxlLT5Dcl9nX3RhYiA9IChJTlQzMiAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKLSAgdXBzYW1wbGUtPkNiX2dfdGFiID0gKElOVDMyICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOwotCi0gIGZvciAoaSA9IDAsIHggPSAtQ0VOVEVSSlNBTVBMRTsgaSA8PSBNQVhKU0FNUExFOyBpKyssIHgrKykgewotICAgIC8qIGkgaXMgdGhlIGFjdHVhbCBpbnB1dCBwaXhlbCB2YWx1ZSwgaW4gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgKi8KLSAgICAvKiBUaGUgQ2Igb3IgQ3IgdmFsdWUgd2UgYXJlIHRoaW5raW5nIG9mIGlzIHggPSBpIC0gQ0VOVEVSSlNBTVBMRSAqLwotICAgIC8qIENyPT5SIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNDAyMDAgKiB4ICovCi0gICAgdXBzYW1wbGUtPkNyX3JfdGFiW2ldID0gKGludCkKLQkJICAgIFJJR0hUX1NISUZUKEZJWCgxLjQwMjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKLSAgICAvKiBDYj0+QiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjc3MjAwICogeCAqLwotICAgIHVwc2FtcGxlLT5DYl9iX3RhYltpXSA9IChpbnQpCi0JCSAgICBSSUdIVF9TSElGVChGSVgoMS43NzIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7Ci0gICAgLyogQ3I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjcxNDE0ICogeCAqLwotICAgIHVwc2FtcGxlLT5Dcl9nX3RhYltpXSA9ICgtIEZJWCgwLjcxNDE0KSkgKiB4OwotICAgIC8qIENiPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC4zNDQxNCAqIHggKi8KLSAgICAvKiBXZSBhbHNvIGFkZCBpbiBPTkVfSEFMRiBzbyB0aGF0IG5lZWQgbm90IGRvIGl0IGluIGlubmVyIGxvb3AgKi8KLSAgICB1cHNhbXBsZS0+Q2JfZ190YWJbaV0gPSAoLSBGSVgoMC4zNDQxNCkpICogeCArIE9ORV9IQUxGOwotICB9Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGFuIHVwc2FtcGxpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0KLSAgLyogTWFyayB0aGUgc3BhcmUgYnVmZmVyIGVtcHR5ICovCi0gIHVwc2FtcGxlLT5zcGFyZV9mdWxsID0gRkFMU0U7Ci0gIC8qIEluaXRpYWxpemUgdG90YWwtaGVpZ2h0IGNvdW50ZXIgZm9yIGRldGVjdGluZyBib3R0b20gb2YgaW1hZ2UgKi8KLSAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gPSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLX0KLQotCi0vKgotICogQ29udHJvbCByb3V0aW5lIHRvIGRvIHVwc2FtcGxpbmcgKGFuZCBjb2xvciBjb252ZXJzaW9uKS4KLSAqCi0gKiBUaGUgY29udHJvbCByb3V0aW5lIGp1c3QgaGFuZGxlcyB0aGUgcm93IGJ1ZmZlcmluZyBjb25zaWRlcmF0aW9ucy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW1lcmdlZF8ydl91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi0vKiAyOjEgdmVydGljYWwgc2FtcGxpbmcgY2FzZTogbWF5IG5lZWQgYSBzcGFyZSByb3cuICovCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgSlNBTVBST1cgd29ya19wdHJzWzJdOwotICBKRElNRU5TSU9OIG51bV9yb3dzOwkJLyogbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgdG8gY2FsbGVyICovCi0KLSAgaWYgKHVwc2FtcGxlLT5zcGFyZV9mdWxsKSB7Ci0gICAgLyogSWYgd2UgaGF2ZSBhIHNwYXJlIHJvdyBzYXZlZCBmcm9tIGEgcHJldmlvdXMgY3ljbGUsIGp1c3QgcmV0dXJuIGl0LiAqLwotICAgICAgSkRJTUVOU0lPTiBzaXplID0gdXBzYW1wbGUtPm91dF9yb3dfd2lkdGg7Ci0jaWZkZWYgQU5EUk9JRF9SR0IKLSAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCXzU2NSkKLSAgICAgIHNpemUgPSBjaW5mby0+b3V0cHV0X3dpZHRoKjI7Ci0jZW5kaWYKLSAgICBqY29weV9zYW1wbGVfcm93cygmIHVwc2FtcGxlLT5zcGFyZV9yb3csIDAsIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsIDAsCi0JCSAgICAgIDEsIHNpemUpOwotCi0gICAgbnVtX3Jvd3MgPSAxOwotICAgIHVwc2FtcGxlLT5zcGFyZV9mdWxsID0gRkFMU0U7Ci0gIH0gZWxzZSB7Ci0gICAgLyogRmlndXJlIG51bWJlciBvZiByb3dzIHRvIHJldHVybiB0byBjYWxsZXIuICovCi0gICAgbnVtX3Jvd3MgPSAyOwotICAgIC8qIE5vdCBtb3JlIHRoYW4gdGhlIGRpc3RhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIGltYWdlLiAqLwotICAgIGlmIChudW1fcm93cyA+IHVwc2FtcGxlLT5yb3dzX3RvX2dvKQotICAgICAgbnVtX3Jvd3MgPSB1cHNhbXBsZS0+cm93c190b19nbzsKLSAgICAvKiBBbmQgbm90IG1vcmUgdGhhbiB3aGF0IHRoZSBjbGllbnQgY2FuIGFjY2VwdDogKi8KLSAgICBvdXRfcm93c19hdmFpbCAtPSAqb3V0X3Jvd19jdHI7Ci0gICAgaWYgKG51bV9yb3dzID4gb3V0X3Jvd3NfYXZhaWwpCi0gICAgICBudW1fcm93cyA9IG91dF9yb3dzX2F2YWlsOwotICAgIC8qIENyZWF0ZSBvdXRwdXQgcG9pbnRlciBhcnJheSBmb3IgdXBzYW1wbGVyLiAqLwotICAgIHdvcmtfcHRyc1swXSA9IG91dHB1dF9idWZbKm91dF9yb3dfY3RyXTsKLSAgICBpZiAobnVtX3Jvd3MgPiAxKSB7Ci0gICAgICB3b3JrX3B0cnNbMV0gPSBvdXRwdXRfYnVmWypvdXRfcm93X2N0ciArIDFdOwotICAgIH0gZWxzZSB7Ci0gICAgICB3b3JrX3B0cnNbMV0gPSB1cHNhbXBsZS0+c3BhcmVfcm93OwotICAgICAgdXBzYW1wbGUtPnNwYXJlX2Z1bGwgPSBUUlVFOwotICAgIH0KLSAgICAvKiBOb3cgZG8gdGhlIHVwc2FtcGxpbmcuICovCi0gICAgKCp1cHNhbXBsZS0+dXBtZXRob2QpIChjaW5mbywgaW5wdXRfYnVmLCAqaW5fcm93X2dyb3VwX2N0ciwgd29ya19wdHJzKTsKLSAgfQotCi0gIC8qIEFkanVzdCBjb3VudHMgKi8KLSAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOwotICB1cHNhbXBsZS0+cm93c190b19nbyAtPSBudW1fcm93czsKLSAgLyogV2hlbiB0aGUgYnVmZmVyIGlzIGVtcHRpZWQsIGRlY2xhcmUgdGhpcyBpbnB1dCByb3cgZ3JvdXAgY29uc3VtZWQgKi8KLSAgaWYgKCEgdXBzYW1wbGUtPnNwYXJlX2Z1bGwpCi0gICAgKCppbl9yb3dfZ3JvdXBfY3RyKSsrOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotbWVyZ2VkXzF2X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JCSAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKLS8qIDE6MSB2ZXJ0aWNhbCBzYW1wbGluZyBjYXNlOiBtdWNoIGVhc2llciwgbmV2ZXIgbmVlZCBhIHNwYXJlIHJvdy4gKi8KLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotCi0gIC8qIEp1c3QgZG8gdGhlIHVwc2FtcGxpbmcuICovCi0gICgqdXBzYW1wbGUtPnVwbWV0aG9kKSAoY2luZm8sIGlucHV0X2J1ZiwgKmluX3Jvd19ncm91cF9jdHIsCi0JCQkgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0cik7Ci0gIC8qIEFkanVzdCBjb3VudHMgKi8KLSAgKCpvdXRfcm93X2N0cikrKzsKLSAgKCppbl9yb3dfZ3JvdXBfY3RyKSsrOwotfQotCi0KLS8qCi0gKiBUaGVzZSBhcmUgdGhlIHJvdXRpbmVzIGludm9rZWQgYnkgdGhlIGNvbnRyb2wgcm91dGluZXMgdG8gZG8KLSAqIHRoZSBhY3R1YWwgdXBzYW1wbGluZy9jb252ZXJzaW9uLiAgT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCi0gKgotICogTm90ZTogc2luY2Ugd2UgbWF5IGJlIHdyaXRpbmcgZGlyZWN0bHkgaW50byBhcHBsaWNhdGlvbi1zdXBwbGllZCBidWZmZXJzLAotICogd2UgaGF2ZSB0byBiZSBob25lc3QgYWJvdXQgdGhlIG91dHB1dCB3aWR0aDsgd2UgY2FuJ3QgYXNzdW1lIHRoZSBidWZmZXIKLSAqIGhhcyBiZWVuIHJvdW5kZWQgdXAgdG8gYW4gZXZlbiB3aWR0aC4KLSAqLwotCi0KLS8qCi0gKiBVcHNhbXBsZSBhbmQgY29sb3IgY29udmVydCBmb3IgdGhlIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjFfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAotCQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCi0jaWZkZWYgQU5EUk9JRF9KUEVHX1VTRV9WRU5VTQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpTQU1QUk9XIG91dHB0cjsKLQotICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOwotICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdOwotCi0jaWZkZWYgQU5EUk9JRF9SR0IKLSAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQkFfODg4OCkgewotICAgIHl5dnVwMmFiZ3I4ODg4X3ZlbnVtKChVSU5UOCopIGlucHRyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIG91dHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaW5mby0+b3V0cHV0X3dpZHRoKTsKLSAgfSBlbHNlCi0jZW5kaWYKLSAgewotICAgIHl5dnVwMmJncjg4OF92ZW51bSgoVUlOVDgqKSBpbnB0cjAsCi0gICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIGlucHRyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBvdXRwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNpbmZvLT5vdXRwdXRfd2lkdGgpOwotICB9Ci19Ci0jZWxzZQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOwotICBpbnQgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpESU1FTlNJT04gY29sOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKLSAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOwotICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKLSAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7Ci0gIEpESU1FTlNJT04gcGl4ZWxXaWR0aCA9IFJHQl9QSVhFTFNJWkU7Ci0gIFNISUZUX1RFTVBTCi0KLSNpZmRlZiBBTkRST0lEX1JHQgotICBpZiAoKGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9PSA0KSAmJgotICAgICAgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQkFfODg4OCkpCi0gICAgIHBpeGVsV2lkdGggPSA0OyAgLy8gUkdCQSBwaXhlbCBzaXplCi0jZW5kaWYgLyogQU5EUk9JRF9SR0IgKi8KLQotICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOwotICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdOwotICAvKiBMb29wIGZvciBlYWNoIHBhaXIgb2Ygb3V0cHV0IHBpeGVscyAqLwotICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKLSAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCi0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7Ci0gICAgY3JlZCA9IENycnRhYltjcl07Ci0gICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7Ci0gICAgY2JsdWUgPSBDYmJ0YWJbY2JdOwotICAgIC8qIEZldGNoIDIgWSB2YWx1ZXMgYW5kIGVtaXQgMiBwaXhlbHMgKi8KLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKLSAgICBvdXRwdHJbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHJbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICBvdXRwdHIgKz0gcGl4ZWxXaWR0aDsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKLSAgICBvdXRwdHJbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHJbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICBvdXRwdHIgKz0gcGl4ZWxXaWR0aDsKLSAgfQotICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLwotICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKLSAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7Ci0gICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCk7Ci0gICAgb3V0cHRyW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgb3V0cHRyW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gIH0KLX0KLSNlbmRpZiAvKiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNICovCi0KLQotI2lmZGVmIEFORFJPSURfUkdCCi1NRVRIT0RERUYodm9pZCkKLWgydjFfbWVyZ2VkX3Vwc2FtcGxlXzU2NSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKLSAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQotI2lmIGRlZmluZWQoQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSkKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOwotICBKU0FNUFJPVyBvdXRwdHI7Ci0KLSAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHJdOwotICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXTsKLQotICB5eXZ1cDJyZ2I1NjVfdmVudW0oKFVJTlQ4KikgaW5wdHIwLAotICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIyLAotICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIxLAotICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4Kikgb3V0cHRyLAotICAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCk7Ci19Ci0jZWxzZQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOwotICBpbnQgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpESU1FTlNJT04gY29sOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKLSAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOwotICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKLSAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7Ci0gIHVuc2lnbmVkIGludCByLCBnLCBiOwotICBJTlQzMiByZ2I7Ci0gIFNISUZUX1RFTVBTCi0KLSAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHJdOwotICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXTsKLSAgLyogTG9vcCBmb3IgZWFjaCBwYWlyIG9mIG91dHB1dCBwaXhlbHMgKi8KLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLwotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICAvKiBGZXRjaCAyIFkgdmFsdWVzIGFuZCBlbWl0IDIgcGl4ZWxzICovCi0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOwotICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7Ci0gICAgV1JJVEVfVFdPX1BJWEVMUyhvdXRwdHIsIHJnYik7Ci0gICAgb3V0cHRyICs9IDQ7Ci0gIH0KLSAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KLSAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7Ci0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKLSAgICBjcmVkID0gQ3JydGFiW2NyXTsKLSAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKLSAgICBjYmx1ZSA9IENiYnRhYltjYl07Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjApOwotICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7Ci0gIH0KLX0KLSNlbmRpZiAvKiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNICovCi0KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYxX21lcmdlZF91cHNhbXBsZV81NjVEIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAotICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgcmVnaXN0ZXIgaW50IHksIGNyZWQsIGNncmVlbiwgY2JsdWU7Ci0gIGludCBjYiwgY3I7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0gIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KLSAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKLSAgaW50ICogQ3JydGFiID0gdXBzYW1wbGUtPkNyX3JfdGFiOwotICBpbnQgKiBDYmJ0YWIgPSB1cHNhbXBsZS0+Q2JfYl90YWI7Ci0gIElOVDMyICogQ3JndGFiID0gdXBzYW1wbGUtPkNyX2dfdGFiOwotICBJTlQzMiAqIENiZ3RhYiA9IHVwc2FtcGxlLT5DYl9nX3RhYjsKLSAgSkRJTUVOU0lPTiBjb2xfaW5kZXggPSAwOwotICBJTlQzMiBkMCA9IGRpdGhlcl9tYXRyaXhbY2luZm8tPm91dHB1dF9zY2FubGluZSAmIERJVEhFUl9NQVNLXTsKLSAgdW5zaWduZWQgaW50IHIsIGcsIGI7Ci0gIElOVDMyIHJnYjsKLSAgU0hJRlRfVEVNUFMKLQotICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOwotICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdOwotICAvKiBMb29wIGZvciBlYWNoIHBhaXIgb2Ygb3V0cHV0IHBpeGVscyAqLwotICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKLSAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCi0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7Ci0gICAgY3JlZCA9IENycnRhYltjcl07Ci0gICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7Ci0gICAgY2JsdWUgPSBDYmJ0YWJbY2JdOwotICAgIC8qIEZldGNoIDIgWSB2YWx1ZXMgYW5kIGVtaXQgMiBwaXhlbHMgKi8KLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKLSAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMCldOwotICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDApXTsKLSAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDApXTsKLSAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOwotICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKLSAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMCldOwotICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDApXTsKLSAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDApXTsKLSAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOwotICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7Ci0gICAgV1JJVEVfVFdPX1BJWEVMUyhvdXRwdHIsIHJnYik7Ci0gICAgb3V0cHRyICs9IDQ7Ci0gIH0KLSAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KLSAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7Ci0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKLSAgICBjcmVkID0gQ3JydGFiW2NyXTsKLSAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKLSAgICBjYmx1ZSA9IENiYnRhYltjYl07Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjApOwotICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQwKV07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMCldOwotICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMCldOwotICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7Ci0gIH0KLX0KLQotCi0jZW5kaWYKLQotLyoKLSAqIFVwc2FtcGxlIGFuZCBjb2xvciBjb252ZXJ0IGZvciB0aGUgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2Ml9tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCi0JCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKLSNpZmRlZiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMTsKLSAgSlNBTVBST1cgaW5wdHIwMCwgaW5wdHIwMSwgaW5wdHIxLCBpbnB0cjI7Ci0gIGlucHRyMDAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyXTsKLSAgaW5wdHIwMSA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjIgKyAxXTsKLSAgaW5wdHIxICA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgaW5wdHIyICA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF07Ci0gIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdOwotI2lmZGVmIEFORFJPSURfUkdCCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0JBXzg4ODgpIHsKLSAgICB5eXZ1cDJhYmdyODg4OF92ZW51bSgoVUlOVDgqKSBpbnB0cjAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIGlucHRyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4Kikgb3V0cHRyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaW5mby0+b3V0cHV0X3dpZHRoKTsKLSAgICB5eXZ1cDJhYmdyODg4OF92ZW51bSgoVUlOVDgqKSBpbnB0cjAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIGlucHRyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4Kikgb3V0cHRyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaW5mby0+b3V0cHV0X3dpZHRoKTsKLSAgfSBlbHNlCi0jZW5kaWYKLSAgewotICAgIHl5dnVwMmJncjg4OF92ZW51bSgoVUlOVDgqKSBpbnB0cjAwLAotICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjIsCi0gICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIGlucHRyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4Kikgb3V0cHRyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0KLSAgICB5eXZ1cDJiZ3I4ODhfdmVudW0oKFVJTlQ4KikgaW5wdHIwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIyLAotICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIG91dHB0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgIGNpbmZvLT5vdXRwdXRfd2lkdGgpOwotICB9Ci19Ci0jZWxzZQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOwotICBpbnQgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxOwotICBKU0FNUFJPVyBpbnB0cjAwLCBpbnB0cjAxLCBpbnB0cjEsIGlucHRyMjsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0gIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KLSAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKLSAgaW50ICogQ3JydGFiID0gdXBzYW1wbGUtPkNyX3JfdGFiOwotICBpbnQgKiBDYmJ0YWIgPSB1cHNhbXBsZS0+Q2JfYl90YWI7Ci0gIElOVDMyICogQ3JndGFiID0gdXBzYW1wbGUtPkNyX2dfdGFiOwotICBJTlQzMiAqIENiZ3RhYiA9IHVwc2FtcGxlLT5DYl9nX3RhYjsKLSAgSkRJTUVOU0lPTiBwaXhlbFdpZHRoID0gUkdCX1BJWEVMU0laRTsKLSAgU0hJRlRfVEVNUFMKLQotI2lmZGVmIEFORFJPSURfUkdCCi0gIGlmICgoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID09IDQpICYmCi0gICAgICAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCQV84ODg4KSkKLSAgICAgcGl4ZWxXaWR0aCA9IDQ7ICAvLyBSR0JBIHBpeGVsIHNpemUKLSNlbmRpZiAvKiBBTkRST0lEX1JHQiAqLwotCi0gIGlucHRyMDAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyXTsKLSAgaW5wdHIwMSA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjIgKyAxXTsKLSAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOwotICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07Ci0gIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdOwotICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXTsKLSAgLyogTG9vcCBmb3IgZWFjaCBncm91cCBvZiBvdXRwdXQgcGl4ZWxzICovCi0gIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aCA+PiAxOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIC8qIERvIHRoZSBjaHJvbWEgcGFydCBvZiB0aGUgY2FsY3VsYXRpb24gKi8KLSAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLSAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKLSAgICBjcmVkID0gQ3JydGFiW2NyXTsKLSAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKLSAgICBjYmx1ZSA9IENiYnRhYltjYl07Ci0gICAgLyogRmV0Y2ggNCBZIHZhbHVlcyBhbmQgZW1pdCA0IHBpeGVscyAqLwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKLSAgICBvdXRwdHIwW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cjBbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIG91dHB0cjBbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICBvdXRwdHIwICs9IHBpeGVsV2lkdGg7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOwotICAgIG91dHB0cjBbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgb3V0cHRyMFtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgb3V0cHRyMFtSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIG91dHB0cjAgKz0gcGl4ZWxXaWR0aDsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7Ci0gICAgb3V0cHRyMVtSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBvdXRwdHIxW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHIxW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgb3V0cHRyMSArPSBwaXhlbFdpZHRoOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKLSAgICBvdXRwdHIxW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cjFbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIG91dHB0cjFbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICBvdXRwdHIxICs9IHBpeGVsV2lkdGg7Ci0gIH0KLSAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KLSAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7Ci0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKLSAgICBjcmVkID0gQ3JydGFiW2NyXTsKLSAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKLSAgICBjYmx1ZSA9IENiYnRhYltjYl07Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKTsKLSAgICBvdXRwdHIwW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cjBbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIG91dHB0cjBbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDEpOwotICAgIG91dHB0cjFbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgb3V0cHRyMVtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgb3V0cHRyMVtSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICB9Ci19Ci0jZW5kaWYgLyogQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSAqLwotCi0KLSNpZmRlZiBBTkRST0lEX1JHQgotCi1NRVRIT0RERUYodm9pZCkKLWgydjJfbWVyZ2VkX3Vwc2FtcGxlXzU2NSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKLSAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQotI2lmIGRlZmluZWQoQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSkKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxOwotICBKU0FNUFJPVyBpbnB0cjAwLCBpbnB0cjAxLCBpbnB0cjEsIGlucHRyMjsKLSAgaW5wdHIwMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjJdOwotICBpbnB0cjAxID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMiArIDFdOwotICBpbnB0cjEgID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOwotICBpbnB0cjIgID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOwotICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXTsKLSAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV07Ci0KLSAgeXl2dXAycmdiNTY1X3ZlbnVtKChVSU5UOCopIGlucHRyMDAsCi0gICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjIsCi0gICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjEsCi0gICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBvdXRwdHIwLAotICAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0KLSAgeXl2dXAycmdiNTY1X3ZlbnVtKChVSU5UOCopIGlucHRyMDEsCi0gICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjIsCi0gICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjEsCi0gICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBvdXRwdHIxLAotICAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCk7Ci19Ci0jZWxzZQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOwotICBpbnQgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxOwotICBKU0FNUFJPVyBpbnB0cjAwLCBpbnB0cjAxLCBpbnB0cjEsIGlucHRyMjsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0gIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KLSAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKLSAgaW50ICogQ3JydGFiID0gdXBzYW1wbGUtPkNyX3JfdGFiOwotICBpbnQgKiBDYmJ0YWIgPSB1cHNhbXBsZS0+Q2JfYl90YWI7Ci0gIElOVDMyICogQ3JndGFiID0gdXBzYW1wbGUtPkNyX2dfdGFiOwotICBJTlQzMiAqIENiZ3RhYiA9IHVwc2FtcGxlLT5DYl9nX3RhYjsKLSAgdW5zaWduZWQgaW50IHIsIGcsIGI7Ci0gIElOVDMyIHJnYjsKLSAgU0hJRlRfVEVNUFMKLQotICBpbnB0cjAwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMl07Ci0gIGlucHRyMDEgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyICsgMV07Ci0gIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOwotICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXTsKLSAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV07Ci0gIC8qIExvb3AgZm9yIGVhY2ggZ3JvdXAgb2Ygb3V0cHV0IHBpeGVscyAqLwotICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKLSAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCi0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7Ci0gICAgY3JlZCA9IENycnRhYltjcl07Ci0gICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7Ci0gICAgY2JsdWUgPSBDYmJ0YWJbY2JdOwotICAgIC8qIEZldGNoIDQgWSB2YWx1ZXMgYW5kIGVtaXQgNCBwaXhlbHMgKi8KLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7Ci0gICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKLSAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOwotICAgIFdSSVRFX1RXT19QSVhFTFMob3V0cHRyMCwgcmdiKTsKLSAgICBvdXRwdHIwICs9IDQ7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOwotICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7Ci0gICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKLSAgICBXUklURV9UV09fUElYRUxTKG91dHB0cjEsIHJnYik7Ci0gICAgb3V0cHRyMSArPSA0OwotICB9Ci0gIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCi0gIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgewotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKLSAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7Ci0gICAgY3JlZCA9IENycnRhYltjcl07Ci0gICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7Ci0gICAgY2JsdWUgPSBDYmJ0YWJbY2JdOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCk7Ci0gICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgICooSU5UMTYqKW91dHB0cjAgPSByZ2I7Ci0gICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDEpOwotICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgKihJTlQxNiopb3V0cHRyMSA9IHJnYjsKLSAgfQotfQotI2VuZGlmIC8qIEFORFJPSURfSlBFR19VU0VfVkVOVU0gKi8KLQotCi1NRVRIT0RERUYodm9pZCkKLWgydjJfbWVyZ2VkX3Vwc2FtcGxlXzU2NUQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCi0gICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKLSAgaW50IGNiLCBjcjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMTsKLSAgSlNBTVBST1cgaW5wdHIwMCwgaW5wdHIwMSwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpESU1FTlNJT04gY29sOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKLSAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOwotICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKLSAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7Ci0gIEpESU1FTlNJT04gY29sX2luZGV4ID0gMDsKLSAgSU5UMzIgZDAgPSBkaXRoZXJfbWF0cml4W2NpbmZvLT5vdXRwdXRfc2NhbmxpbmUgJiBESVRIRVJfTUFTS107Ci0gIElOVDMyIGQxID0gZGl0aGVyX21hdHJpeFsoY2luZm8tPm91dHB1dF9zY2FubGluZSsxKSAmIERJVEhFUl9NQVNLXTsKLSAgdW5zaWduZWQgaW50IHIsIGcsIGI7Ci0gIElOVDMyIHJnYjsKLSAgU0hJRlRfVEVNUFMKLQotICBpbnB0cjAwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMl07Ci0gIGlucHRyMDEgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyICsgMV07Ci0gIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOwotICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXTsKLSAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV07Ci0gIC8qIExvb3AgZm9yIGVhY2ggZ3JvdXAgb2Ygb3V0cHV0IHBpeGVscyAqLwotICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKLSAgICAKLSAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCi0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7Ci0gICAgY3JlZCA9IENycnRhYltjcl07Ci0gICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7Ci0gICAgY2JsdWUgPSBDYmJ0YWJbY2JdOwotICAgIC8qIEZldGNoIDQgWSB2YWx1ZXMgYW5kIGVtaXQgNCBwaXhlbHMgKi8gICAgCi0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOwotICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQwKV07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMCldOwotICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMCldOwotICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7Ci0gICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKLSAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMSldOwotICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDEpXTsKLSAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDEpXTsKLSAgICBkMSA9IERJVEhFUl9ST1RBVEUoZDEpOwotICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7Ci0gICAgV1JJVEVfVFdPX1BJWEVMUyhvdXRwdHIwLCByZ2IpOwotICAgIG91dHB0cjAgKz0gNDsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7Ci0gICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDApXTsKLSAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQwKV07Ci0gICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQwKV07Ci0gICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKLSAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOwotICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQxKV07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMSldOwotICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMSldOwotICAgIGQxID0gRElUSEVSX1JPVEFURShkMSk7Ci0gICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKLSAgICBXUklURV9UV09fUElYRUxTKG91dHB0cjEsIHJnYik7Ci0gICAgb3V0cHRyMSArPSA0OwotICB9Ci0gIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCi0gIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgewotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKLSAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7Ci0gICAgY3JlZCA9IENycnRhYltjcl07Ci0gICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7Ci0gICAgY2JsdWUgPSBDYmJ0YWJbY2JdOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCk7Ci0gICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDApXTsKLSAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQwKV07Ci0gICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQwKV07Ci0gICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgICooSU5UMTYqKW91dHB0cjAgPSByZ2I7Ci0gICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDEpOwotICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDEpXTsKLSAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDEpXTsKLSAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMSldOwotICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgKihJTlQxNiopb3V0cHRyMSA9IHJnYjsKLSAgfQotfQotCi0jZW5kaWYKLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBtZXJnZWQgdXBzYW1wbGluZy9jb2xvciBjb252ZXJzaW9uLgotICoKLSAqIE5COiB0aGlzIGlzIGNhbGxlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXRlcm1pbmVkIGJ5IHVzZV9tZXJnZWRfdXBzYW1wbGUoKQotICogaW4gamRtYXN0ZXIuYy4gIFRoYXQgcm91dGluZSBNVVNUIGNvcnJlc3BvbmQgdG8gdGhlIGFjdHVhbCBjYXBhYmlsaXRpZXMKLSAqIG9mIHRoaXMgbW9kdWxlOyBubyBzYWZldHkgY2hlY2tzIGFyZSBtYWRlIGhlcmUuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9tZXJnZWRfdXBzYW1wbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGU7Ci0KLSAgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X3Vwc2FtcGxlcikpOwotICBjaW5mby0+dXBzYW1wbGUgPSAoc3RydWN0IGpwZWdfdXBzYW1wbGVyICopIHVwc2FtcGxlOwotICB1cHNhbXBsZS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX21lcmdlZF91cHNhbXBsZTsKLSAgdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IEZBTFNFOwotCi0gIHVwc2FtcGxlLT5vdXRfcm93X3dpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKLSAgCi0gIGlmIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPT0gMikgewotICAgIHVwc2FtcGxlLT5wdWIudXBzYW1wbGUgPSBtZXJnZWRfMnZfdXBzYW1wbGU7Ci0gICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2Ml9tZXJnZWRfdXBzYW1wbGU7Ci0jaWZkZWYgQU5EUk9JRF9SR0IKLSAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCXzU2NSkgewotI2lmICFkZWZpbmVkKEFORFJPSURfSlBFR19VU0VfVkVOVU0pCi0gICAgICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlICE9IEpESVRIRVJfTk9ORSkgewotICAgICAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYyX21lcmdlZF91cHNhbXBsZV81NjVEOwotICAgICAgfSBlbHNlCi0jZW5kaWYKLSAgICAgIHsKLSAgICAgICAgLyogSWYgVmVOdW0gcm91dGluZXMgYXJlIGVuYWJsZWQsIHVzZSBoMnYyX21lcmdlZF91cHNhbXBsZV81NjUKLSAgICAgICAgICogZnVuY3Rpb24gcmVnYXJkbGVzcyBvZiBkaXRoZXIgbW9kZS4gKi8KLSAgICAgICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfNTY1OwotICAgICAgfQotICAgIH0KLSNlbmRpZgotICAgIC8qIEFsbG9jYXRlIGEgc3BhcmUgcm93IGJ1ZmZlciAqLwotICAgIHVwc2FtcGxlLT5zcGFyZV9yb3cgPSAoSlNBTVBST1cpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkoc2l6ZV90KSAodXBzYW1wbGUtPm91dF9yb3dfd2lkdGggKiBTSVpFT0YoSlNBTVBMRSkpKTsKLSAgfSBlbHNlIHsKLSAgICB1cHNhbXBsZS0+cHViLnVwc2FtcGxlID0gbWVyZ2VkXzF2X3Vwc2FtcGxlOwotICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjFfbWVyZ2VkX3Vwc2FtcGxlOwotI2lmZGVmIEFORFJPSURfUkdCCi0gICAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQl81NjUpIHsKLSNpZm5kZWYgQU5EUk9JRF9KUEVHX1VTRV9WRU5VTQotICAgICAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSAhPSBKRElUSEVSX05PTkUpIHsKLSAgICAgICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2MV9tZXJnZWRfdXBzYW1wbGVfNTY1RDsKLSAgICAgIH0gZWxzZQotI2VuZGlmCi0gICAgICB7Ci0gICAgICAgIC8qIElmIFZlTnVtIHJvdXRpbmVzIGFyZSBlbmFibGVkLCB1c2UgaDJ2MV9tZXJnZWRfdXBzYW1wbGVfNTY1Ci0gICAgICAgICAqIGZ1bmN0aW9uIHJlZ2FyZGxlc3Mgb2YgZGl0aGVyIG1vZGUuICovCi0gICAgICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjFfbWVyZ2VkX3Vwc2FtcGxlXzU2NTsKLSAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBObyBzcGFyZSByb3cgbmVlZGVkICovCi0gICAgdXBzYW1wbGUtPnNwYXJlX3JvdyA9IE5VTEw7Ci0gIH0KLQotI2lmICFkZWZpbmVkKEFORFJPSURfSlBFR19VU0VfVkVOVU0pCi0gICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7Ci0jZW5kaWYKLSNpZmRlZiBORUVEU19BUk1fRVJSQVRBXzc1NDMxOV83NTQzMjAKLSAgYXNtIHZvbGF0aWxlICggInZtb3YgczAsczBcbiIgKTsKLSNlbmRpZgotfQotCi0jZW5kaWYgLyogVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkcGh1ZmYuYyBiL2xpYmpwZWd0d3JwL2pkcGh1ZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4NTZlMC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZHBodWZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzAgKzAsMCBAQAotLyoKLSAqIGpkcGh1ZmYuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KLSAqCi0gKiBNdWNoIG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaGFzIHRvIGRvIHdpdGggc3VwcG9ydGluZyBpbnB1dCBzdXNwZW5zaW9uLgotICogSWYgdGhlIGRhdGEgc291cmNlIG1vZHVsZSBkZW1hbmRzIHN1c3BlbnNpb24sIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBiYWNrCi0gKiB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgTUNVLiAgVG8gZG8gdGhpcywgd2UgY29weSBzdGF0ZSB2YXJpYWJsZXMKLSAqIGludG8gbG9jYWwgd29ya2luZyBzdG9yYWdlLCBhbmQgdXBkYXRlIHRoZW0gYmFjayB0byB0aGUgcGVybWFuZW50Ci0gKiBzdG9yYWdlIG9ubHkgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYW4gTUNVLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGh1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqZGh1ZmYuYyAqLwotCi0KLSNpZmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotCi0vKgotICogRXhwYW5kZWQgZW50cm9weSBkZWNvZGVyIG9iamVjdCBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBkZWNvZGluZy4KLSAqCi0gKiBUaGUgc2F2YWJsZV9zdGF0ZSBzdWJyZWNvcmQgY29udGFpbnMgZmllbGRzIHRoYXQgY2hhbmdlIHdpdGhpbiBhbiBNQ1UsCi0gKiBidXQgbXVzdCBub3QgYmUgdXBkYXRlZCBwZXJtYW5lbnRseSB1bnRpbCB3ZSBjb21wbGV0ZSB0aGUgTUNVLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IEVPQlJVTjsJCQkvKiByZW1haW5pbmcgRU9CcyBpbiBFT0JSVU4gKi8KLSAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsJLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLwotfSBzYXZhYmxlX3N0YXRlOwotCi0vKiBUaGlzIG1hY3JvIGlzIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVycyB3aXRoIG1pc3Npbmcgb3IgYnJva2VuCi0gKiBzdHJ1Y3R1cmUgYXNzaWdubWVudC4gIFlvdSdsbCBuZWVkIHRvIGZpeCB0aGlzIGNvZGUgaWYgeW91IGhhdmUKLSAqIHN1Y2ggYSBjb21waWxlciBhbmQgeW91IGNoYW5nZSBNQVhfQ09NUFNfSU5fU0NBTi4KLSAqLwotCi0jaWZuZGVmIE5PX1NUUlVDVF9BU1NJR04KLSNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgKChkZXN0KSA9IChzcmMpKQotI2Vsc2UKLSNpZiBNQVhfQ09NUFNfSU5fU0NBTiA9PSA0Ci0jZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgIFwKLQkoKGRlc3QpLkVPQlJVTiA9IChzcmMpLkVPQlJVTiwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbMF0gPSAoc3JjKS5sYXN0X2RjX3ZhbFswXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbMV0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsxXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbMl0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsyXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbM10gPSAoc3JjKS5sYXN0X2RjX3ZhbFszXSkKLSNlbmRpZgotI2VuZGlmCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBsb2FkZWQgaW50byBsb2NhbCB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgZWFjaCBNQ1UuCi0gICAqIEluIGNhc2Ugb2Ygc3VzcGVuc2lvbiwgd2UgZXhpdCBXSVRIT1VUIHVwZGF0aW5nIHRoZW0uCi0gICAqLwotICBiaXRyZWFkX3Blcm1fc3RhdGUgYml0c3RhdGU7CS8qIEJpdCBidWZmZXIgYXQgc3RhcnQgb2YgTUNVICovCi0gIHNhdmFibGVfc3RhdGUgc2F2ZWQ7CQkvKiBPdGhlciBzdGF0ZSBhdCBzdGFydCBvZiBNQ1UgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIE5PVCBsb2FkZWQgaW50byBsb2NhbCB3b3JraW5nIHN0YXRlLiAqLwotICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KLQotICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLwotICBkX2Rlcml2ZWRfdGJsICogZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwotCi0gIGRfZGVyaXZlZF90YmwgKiBhY19kZXJpdmVkX3RibDsgLyogYWN0aXZlIHRhYmxlIGR1cmluZyBhbiBBQyBzY2FuICovCi19IHBodWZmX2VudHJvcHlfZGVjb2RlcjsKLQotdHlwZWRlZiBwaHVmZl9lbnRyb3B5X2RlY29kZXIgKiBwaHVmZl9lbnRyb3B5X3B0cjsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0RDX2ZpcnN0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0FDX2ZpcnN0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0RDX3JlZmluZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfQUNfcmVmaW5lIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19waHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgYm9vbGVhbiBpc19EQ19iYW5kLCBiYWQ7Ci0gIGludCBjaSwgY29lZmksIHRibDsKLSAgaW50ICpjb2VmX2JpdF9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIGlzX0RDX2JhbmQgPSAoY2luZm8tPlNzID09IDApOwotCi0gIC8qIFZhbGlkYXRlIHNjYW4gcGFyYW1ldGVycyAqLwotICBiYWQgPSBGQUxTRTsKLSAgaWYgKGlzX0RDX2JhbmQpIHsKLSAgICBpZiAoY2luZm8tPlNlICE9IDApCi0gICAgICBiYWQgPSBUUlVFOwotICB9IGVsc2UgewotICAgIC8qIG5lZWQgbm90IGNoZWNrIFNzL1NlIDwgMCBzaW5jZSB0aGV5IGNhbWUgZnJvbSB1bnNpZ25lZCBieXRlcyAqLwotICAgIGlmIChjaW5mby0+U3MgPiBjaW5mby0+U2UgfHwgY2luZm8tPlNlID49IERDVFNJWkUyKQotICAgICAgYmFkID0gVFJVRTsKLSAgICAvKiBBQyBzY2FucyBtYXkgaGF2ZSBvbmx5IG9uZSBjb21wb25lbnQgKi8KLSAgICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gIT0gMSkKLSAgICAgIGJhZCA9IFRSVUU7Ci0gIH0KLSAgaWYgKGNpbmZvLT5BaCAhPSAwKSB7Ci0gICAgLyogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2NhbjogbXVzdCBoYXZlIEFsID0gQWgtMS4gKi8KLSAgICBpZiAoY2luZm8tPkFsICE9IGNpbmZvLT5BaC0xKQotICAgICAgYmFkID0gVFJVRTsKLSAgfQotICBpZiAoY2luZm8tPkFsID4gMTMpCQkvKiBuZWVkIG5vdCBjaGVjayBmb3IgPCAwICovCi0gICAgYmFkID0gVFJVRTsKLSAgLyogQXJndWFibHkgdGhlIG1heGltdW0gQWwgdmFsdWUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxMyBmb3IgOC1iaXQgcHJlY2lzaW9uLAotICAgKiBidXQgdGhlIHNwZWMgZG9lc24ndCBzYXkgc28sIGFuZCB3ZSB0cnkgdG8gYmUgbGliZXJhbCBhYm91dCB3aGF0IHdlCi0gICAqIGFjY2VwdC4gIE5vdGU6IGxhcmdlIEFsIHZhbHVlcyBjb3VsZCByZXN1bHQgaW4gb3V0LW9mLXJhbmdlIERDCi0gICAqIGNvZWZmaWNpZW50cyBkdXJpbmcgZWFybHkgc2NhbnMsIGxlYWRpbmcgdG8gYml6YXJyZSBkaXNwbGF5cyBkdWUgdG8KLSAgICogb3ZlcmZsb3dzIGluIHRoZSBJRENUIG1hdGguICBCdXQgd2Ugd29uJ3QgY3Jhc2guCi0gICAqLwotICBpZiAoYmFkKQotICAgIEVSUkVYSVQ0KGNpbmZvLCBKRVJSX0JBRF9QUk9HUkVTU0lPTiwKLQkgICAgIGNpbmZvLT5TcywgY2luZm8tPlNlLCBjaW5mby0+QWgsIGNpbmZvLT5BbCk7Ci0gIC8qIFVwZGF0ZSBwcm9ncmVzc2lvbiBzdGF0dXMsIGFuZCB2ZXJpZnkgdGhhdCBzY2FuIG9yZGVyIGlzIGxlZ2FsLgotICAgKiBOb3RlIHRoYXQgaW50ZXItc2NhbiBpbmNvbnNpc3RlbmNpZXMgYXJlIHRyZWF0ZWQgYXMgd2FybmluZ3MKLSAgICogbm90IGZhdGFsIGVycm9ycyAuLi4gbm90IGNsZWFyIGlmIHRoaXMgaXMgcmlnaHQgd2F5IHRvIGJlaGF2ZS4KLSAgICovCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgaW50IGNpbmRleCA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXS0+Y29tcG9uZW50X2luZGV4OwotICAgIGNvZWZfYml0X3B0ciA9ICYgY2luZm8tPmNvZWZfYml0c1tjaW5kZXhdWzBdOwotICAgIGlmICghaXNfRENfYmFuZCAmJiBjb2VmX2JpdF9wdHJbMF0gPCAwKSAvKiBBQyB3aXRob3V0IHByaW9yIERDIHNjYW4gKi8KLSAgICAgIFdBUk5NUzIoY2luZm8sIEpXUk5fQk9HVVNfUFJPR1JFU1NJT04sIGNpbmRleCwgMCk7Ci0gICAgZm9yIChjb2VmaSA9IGNpbmZvLT5TczsgY29lZmkgPD0gY2luZm8tPlNlOyBjb2VmaSsrKSB7Ci0gICAgICBpbnQgZXhwZWN0ZWQgPSAoY29lZl9iaXRfcHRyW2NvZWZpXSA8IDApID8gMCA6IGNvZWZfYml0X3B0cltjb2VmaV07Ci0gICAgICBpZiAoY2luZm8tPkFoICE9IGV4cGVjdGVkKQotCVdBUk5NUzIoY2luZm8sIEpXUk5fQk9HVVNfUFJPR1JFU1NJT04sIGNpbmRleCwgY29lZmkpOwotICAgICAgY29lZl9iaXRfcHRyW2NvZWZpXSA9IGNpbmZvLT5BbDsKLSAgICB9Ci0gIH0KLQotICAvKiBTZWxlY3QgTUNVIGRlY29kaW5nIHJvdXRpbmUgKi8KLSAgaWYgKGNpbmZvLT5BaCA9PSAwKSB7Ci0gICAgaWYgKGlzX0RDX2JhbmQpCi0gICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfRENfZmlyc3Q7Ci0gICAgZWxzZQotICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0FDX2ZpcnN0OwotICB9IGVsc2UgewotICAgIGlmIChpc19EQ19iYW5kKQotICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0RDX3JlZmluZTsKLSAgICBlbHNlCi0gICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfQUNfcmVmaW5lOwotICB9Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIC8qIE1ha2Ugc3VyZSByZXF1ZXN0ZWQgdGFibGVzIGFyZSBwcmVzZW50LCBhbmQgY29tcHV0ZSBkZXJpdmVkIHRhYmxlcy4KLSAgICAgKiBXZSBtYXkgYnVpbGQgc2FtZSBkZXJpdmVkIHRhYmxlIG1vcmUgdGhhbiBvbmNlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlLgotICAgICAqLwotICAgIGlmIChpc19EQ19iYW5kKSB7Ci0gICAgICBpZiAoY2luZm8tPkFoID09IDApIHsJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLwotCXRibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKLQlqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgdGJsLAotCQkJCSYgZW50cm9weS0+ZGVyaXZlZF90YmxzW3RibF0pOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87Ci0gICAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgRkFMU0UsIHRibCwKLQkJCSAgICAgICYgZW50cm9weS0+ZGVyaXZlZF90YmxzW3RibF0pOwotICAgICAgLyogcmVtZW1iZXIgdGhlIHNpbmdsZSBhY3RpdmUgdGFibGUgKi8KLSAgICAgIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsID0gZW50cm9weS0+ZGVyaXZlZF90YmxzW3RibF07Ci0gICAgfQotICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIGJpdHJlYWQgc3RhdGUgdmFyaWFibGVzICovCi0gIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCA9IDA7Ci0gIGVudHJvcHktPmJpdHN0YXRlLmdldF9idWZmZXIgPSAwOyAvKiB1bm5lY2Vzc2FyeSwgYnV0IGtlZXBzIFB1cmlmeSBxdWlldCAqLwotICBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEgPSBGQUxTRTsKLQotICAvKiBJbml0aWFsaXplIHByaXZhdGUgc3RhdGUgdmFyaWFibGVzICovCi0gIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IDA7Ci0KLSAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IGNvdW50ZXIgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLX0KLQotCi0vKgotICogRmlndXJlIEYuMTI6IGV4dGVuZCBzaWduIGJpdC4KLSAqIE9uIHNvbWUgbWFjaGluZXMsIGEgc2hpZnQgYW5kIGFkZCB3aWxsIGJlIGZhc3RlciB0aGFuIGEgdGFibGUgbG9va3VwLgotICovCi0KLSNpZmRlZiBBVk9JRF9UQUJMRVMKLQotI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgKDE8PCgocyktMSkpID8gKHgpICsgKCgoLTEpPDwocykpICsgMSkgOiAoeCkpCi0KLSNlbHNlCi0KLSNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8IGV4dGVuZF90ZXN0W3NdID8gKHgpICsgZXh0ZW5kX29mZnNldFtzXSA6ICh4KSkKLQotc3RhdGljIGNvbnN0IGludCBleHRlbmRfdGVzdFsxNl0gPSAgIC8qIGVudHJ5IG4gaXMgMioqKG4tMSkgKi8KLSAgeyAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwKLSAgICAweDAxMDAsIDB4MDIwMCwgMHgwNDAwLCAweDA4MDAsIDB4MTAwMCwgMHgyMDAwLCAweDQwMDAgfTsKLQotc3RhdGljIGNvbnN0IGludCBleHRlbmRfb2Zmc2V0WzE2XSA9IC8qIGVudHJ5IG4gaXMgKC0xIDw8IG4pICsgMSAqLwotICB7IDAsICgoLTEpPDwxKSArIDEsICgoLTEpPDwyKSArIDEsICgoLTEpPDwzKSArIDEsICgoLTEpPDw0KSArIDEsCi0gICAgKCgtMSk8PDUpICsgMSwgKCgtMSk8PDYpICsgMSwgKCgtMSk8PDcpICsgMSwgKCgtMSk8PDgpICsgMSwKLSAgICAoKC0xKTw8OSkgKyAxLCAoKC0xKTw8MTApICsgMSwgKCgtMSk8PDExKSArIDEsICgoLTEpPDwxMikgKyAxLAotICAgICgoLTEpPDwxMykgKyAxLCAoKC0xKTw8MTQpICsgMSwgKCgtMSk8PDE1KSArIDEgfTsKLQotI2VuZGlmIC8qIEFWT0lEX1RBQkxFUyAqLwotCi0KLS8qCi0gKiBDaGVjayBmb3IgYSByZXN0YXJ0IG1hcmtlciAmIHJlc3luY2hyb25pemUgZGVjb2Rlci4KLSAqIFJldHVybnMgRkFMU0UgaWYgbXVzdCBzdXNwZW5kLgotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1wcm9jZXNzX3Jlc3RhcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgY2k7Ci0KLSAgLyogVGhyb3cgYXdheSBhbnkgdW51c2VkIGJpdHMgcmVtYWluaW5nIGluIGJpdCBidWZmZXI7ICovCi0gIC8qIGluY2x1ZGUgYW55IGZ1bGwgYnl0ZXMgaW4gbmV4dF9tYXJrZXIncyBjb3VudCBvZiBkaXNjYXJkZWQgYnl0ZXMgKi8KLSAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICs9IGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCAvIDg7Ci0gIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCA9IDA7Ci0KLSAgLyogQWR2YW5jZSBwYXN0IHRoZSBSU1RuIG1hcmtlciAqLwotICBpZiAoISAoKmNpbmZvLT5tYXJrZXItPnJlYWRfcmVzdGFydF9tYXJrZXIpIChjaW5mbykpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIFJlLWluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKLSAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICAvKiBSZS1pbml0IEVPQiBydW4gY291bnQsIHRvbyAqLwotICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSAwOwotCi0gIC8qIFJlc2V0IHJlc3RhcnQgY291bnRlciAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotCi0gIC8qIFJlc2V0IG91dC1vZi1kYXRhIGZsYWcsIHVubGVzcyByZWFkX3Jlc3RhcnRfbWFya2VyIGxlZnQgdXMgc21hY2sgdXAKLSAgICogYWdhaW5zdCBhIG1hcmtlci4gIEluIHRoYXQgY2FzZSB3ZSB3aWxsIGVuZCB1cCB0cmVhdGluZyB0aGUgbmV4dCBkYXRhCi0gICAqIHNlZ21lbnQgYXMgZW1wdHksIGFuZCB3ZSBjYW4gYXZvaWQgcHJvZHVjaW5nIGJvZ3VzIG91dHB1dCBwaXhlbHMgYnkKLSAgICogbGVhdmluZyB0aGUgZmxhZyBzZXQuCi0gICAqLwotICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkKLSAgICBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEgPSBGQUxTRTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogSHVmZm1hbiBNQ1UgZGVjb2RpbmcuCi0gKiBFYWNoIG9mIHRoZXNlIHJvdXRpbmVzIGRlY29kZXMgYW5kIHJldHVybnMgb25lIE1DVSdzIHdvcnRoIG9mCi0gKiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLiAKLSAqIFRoZSBjb2VmZmljaWVudHMgYXJlIHJlb3JkZXJlZCBmcm9tIHppZ3phZyBvcmRlciBpbnRvIG5hdHVyYWwgYXJyYXkgb3JkZXIsCi0gKiBidXQgYXJlIG5vdCBkZXF1YW50aXplZC4KLSAqCi0gKiBUaGUgaSd0aCBibG9jayBvZiB0aGUgTUNVIGlzIHN0b3JlZCBpbnRvIHRoZSBibG9jayBwb2ludGVkIHRvIGJ5Ci0gKiBNQ1VfZGF0YVtpXS4gIFdFIEFTU1VNRSBUSElTIEFSRUEgSVMgSU5JVElBTExZIFpFUk9FRCBCWSBUSEUgQ0FMTEVSLgotICoKLSAqIFdlIHJldHVybiBGQUxTRSBpZiBkYXRhIHNvdXJjZSByZXF1ZXN0ZWQgc3VzcGVuc2lvbi4gIEluIHRoYXQgY2FzZSBubwotICogY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byBwZXJtYW5lbnQgc3RhdGUuICAoRXhjZXB0aW9uOiBzb21lIG91dHB1dAotICogY29lZmZpY2llbnRzIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBhc3NpZ25lZC4gIFRoaXMgaXMgaGFybWxlc3MgZm9yCi0gKiBzcGVjdHJhbCBzZWxlY3Rpb24sIHNpbmNlIHdlJ2xsIGp1c3QgcmUtYXNzaWduIHRoZW0gb24gdGhlIG5leHQgY2FsbC4KLSAqIFN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiBBQyByZWZpbmVtZW50IGhhcyB0byBiZSBtb3JlIGNhcmVmdWwsIGhvd2V2ZXIuKQotICovCi0KLS8qCi0gKiBNQ1UgZGVjb2RpbmcgZm9yIERDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKLSAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWRlY29kZV9tY3VfRENfZmlyc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17ICAgCi0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIHJlZ2lzdGVyIGludCBzLCByOwotICBpbnQgYmxrbiwgY2k7Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgQklUUkVBRF9TVEFURV9WQVJTOwotICBzYXZhYmxlX3N0YXRlIHN0YXRlOwotICBkX2Rlcml2ZWRfdGJsICogdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCi0JcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogSWYgd2UndmUgcnVuIG91dCBvZiBkYXRhLCBqdXN0IGxlYXZlIHRoZSBNQ1Ugc2V0IHRvIHplcm9lcy4KLSAgICogVGhpcyB3YXksIHdlIHJldHVybiB1bmlmb3JtIGdyYXkgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHNlZ21lbnQuCi0gICAqLwotICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKLQotICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0gICAgQVNTSUdOX1NUQVRFKHN0YXRlLCBlbnRyb3B5LT5zYXZlZCk7Ci0KLSAgICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCi0KLSAgICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKLSAgICAgIGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOwotICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAgIHRibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1tjb21wcHRyLT5kY190Ymxfbm9dOwotCi0gICAgICAvKiBEZWNvZGUgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KLQotICAgICAgLyogU2VjdGlvbiBGLjIuMi4xOiBkZWNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgKi8KLSAgICAgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwxKTsKLSAgICAgIGlmIChzKSB7Ci0JQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKLQlyID0gR0VUX0JJVFMocyk7Ci0JcyA9IEhVRkZfRVhURU5EKHIsIHMpOwotICAgICAgfQotCi0gICAgICAvKiBDb252ZXJ0IERDIGRpZmZlcmVuY2UgdG8gYWN0dWFsIHZhbHVlLCB1cGRhdGUgbGFzdF9kY192YWwgKi8KLSAgICAgIHMgKz0gc3RhdGUubGFzdF9kY192YWxbY2ldOwotICAgICAgc3RhdGUubGFzdF9kY192YWxbY2ldID0gczsKLSAgICAgIC8qIFNjYWxlIGFuZCBvdXRwdXQgdGhlIGNvZWZmaWNpZW50IChhc3N1bWVzIGpwZWdfbmF0dXJhbF9vcmRlclswXT0wKSAqLwotICAgICAgKCpibG9jaylbMF0gPSAoSkNPRUYpIChzIDw8IEFsKTsKLSAgICB9Ci0KLSAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUpOwotICB9Ci0KLSAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBNQ1UgZGVjb2RpbmcgZm9yIEFDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKLSAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWRlY29kZV9tY3VfQUNfZmlyc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17ICAgCi0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgU2UgPSBjaW5mby0+U2U7Ci0gIGludCBBbCA9IGNpbmZvLT5BbDsKLSAgcmVnaXN0ZXIgaW50IHMsIGssIHI7Ci0gIHVuc2lnbmVkIGludCBFT0JSVU47Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgQklUUkVBRF9TVEFURV9WQVJTOwotICBkX2Rlcml2ZWRfdGJsICogdGJsOwotCi0gIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKLQlyZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGp1c3QgbGVhdmUgdGhlIE1DVSBzZXQgdG8gemVyb2VzLgotICAgKiBUaGlzIHdheSwgd2UgcmV0dXJuIHVuaWZvcm0gZ3JheSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudC4KLSAgICovCi0gIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgewotCi0gICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlLgotICAgICAqIFdlIGNhbiBhdm9pZCBsb2FkaW5nL3NhdmluZyBiaXRyZWFkIHN0YXRlIGlmIGluIGFuIEVPQiBydW4uCi0gICAgICovCi0gICAgRU9CUlVOID0gZW50cm9weS0+c2F2ZWQuRU9CUlVOOwkvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLwotCi0gICAgLyogVGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIGJsb2NrIHBlciBNQ1UgKi8KLQotICAgIGlmIChFT0JSVU4gPiAwKQkJLyogaWYgaXQncyBhIGJhbmQgb2YgemVyb2VzLi4uICovCi0gICAgICBFT0JSVU4tLTsJCQkvKiAuLi5wcm9jZXNzIGl0IG5vdyAod2UgZG8gbm90aGluZykgKi8KLSAgICBlbHNlIHsKLSAgICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0gICAgICBibG9jayA9IE1DVV9kYXRhWzBdOwotICAgICAgdGJsID0gZW50cm9weS0+YWNfZGVyaXZlZF90Ymw7Ci0KLSAgICAgIGZvciAoayA9IGNpbmZvLT5TczsgayA8PSBTZTsgaysrKSB7Ci0JSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIHRibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDIpOwotCXIgPSBzID4+IDQ7Ci0JcyAmPSAxNTsKLQlpZiAocykgewotCSAgayArPSByOwotCSAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKLQkgIHIgPSBHRVRfQklUUyhzKTsKLQkgIHMgPSBIVUZGX0VYVEVORChyLCBzKTsKLQkgIC8qIFNjYWxlIGFuZCBvdXRwdXQgY29lZmZpY2llbnQgaW4gbmF0dXJhbCAoZGV6aWd6YWdnZWQpIG9yZGVyICovCi0JICAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dID0gKEpDT0VGKSAocyA8PCBBbCk7Ci0JfSBlbHNlIHsKLQkgIGlmIChyID09IDE1KSB7CS8qIFpSTCAqLwotCSAgICBrICs9IDE1OwkJLyogc2tpcCAxNSB6ZXJvZXMgaW4gYmFuZCAqLwotCSAgfSBlbHNlIHsJCS8qIEVPQnIsIHJ1biBsZW5ndGggaXMgMl5yICsgYXBwZW5kZWQgYml0cyAqLwotCSAgICBFT0JSVU4gPSAxIDw8IHI7Ci0JICAgIGlmIChyKSB7CQkvKiBFT0JyLCByID4gMCAqLwotCSAgICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHIsIHJldHVybiBGQUxTRSk7Ci0JICAgICAgciA9IEdFVF9CSVRTKHIpOwotCSAgICAgIEVPQlJVTiArPSByOwotCSAgICB9Ci0JICAgIEVPQlJVTi0tOwkJLyogdGhpcyBiYW5kIGlzIHByb2Nlc3NlZCBhdCB0aGlzIG1vbWVudCAqLwotCSAgICBicmVhazsJCS8qIGZvcmNlIGVuZC1vZi1iYW5kICovCi0JICB9Ci0JfQotICAgICAgfQotCi0gICAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIH0KLQotICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLwotICAgIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IEVPQlJVTjsJLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KLSAgfQotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGRlY29kaW5nIGZvciBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgotICogTm90ZTogd2UgYXNzdW1lIHN1Y2ggc2NhbnMgY2FuIGJlIG11bHRpLWNvbXBvbmVudCwgYWx0aG91Z2ggdGhlIHNwZWMKLSAqIGlzIG5vdCB2ZXJ5IGNsZWFyIG9uIHRoZSBwb2ludC4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWRlY29kZV9tY3VfRENfcmVmaW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoteyAgIAotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IHAxID0gMSA8PCBjaW5mby0+QWw7CS8qIDEgaW4gdGhlIGJpdCBwb3NpdGlvbiBiZWluZyBjb2RlZCAqLwotICBpbnQgYmxrbjsKLSAgSkJMT0NLUk9XIGJsb2NrOwotICBCSVRSRUFEX1NUQVRFX1ZBUlM7Ci0KLSAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIE5vdCB3b3J0aCB0aGUgY3ljbGVzIHRvIGNoZWNrIGluc3VmZmljaWVudF9kYXRhIGhlcmUsCi0gICAqIHNpbmNlIHdlIHdpbGwgbm90IGNoYW5nZSB0aGUgZGF0YSBhbnl3YXkgaWYgd2UgcmVhZCB6ZXJvZXMuCi0gICAqLwotCi0gIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotCi0gIC8qIE91dGVyIGxvb3AgaGFuZGxlcyBlYWNoIGJsb2NrIGluIHRoZSBNQ1UgKi8KLQotICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07Ci0KLSAgICAvKiBFbmNvZGVkIGRhdGEgaXMgc2ltcGx5IHRoZSBuZXh0IGJpdCBvZiB0aGUgdHdvJ3MtY29tcGxlbWVudCBEQyB2YWx1ZSAqLwotICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIHJldHVybiBGQUxTRSk7Ci0gICAgaWYgKEdFVF9CSVRTKDEpKQotICAgICAgKCpibG9jaylbMF0gfD0gcDE7Ci0gICAgLyogTm90ZTogc2luY2Ugd2UgdXNlIHw9LCByZXBlYXRpbmcgdGhlIGFzc2lnbm1lbnQgbGF0ZXIgaXMgc2FmZSAqLwotICB9Ci0KLSAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCi0gIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0KLSAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBNQ1UgZGVjb2RpbmcgZm9yIEFDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW4uCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X0FDX3JlZmluZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsgICAKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBTZSA9IGNpbmZvLT5TZTsKLSAgaW50IHAxID0gMSA8PCBjaW5mby0+QWw7CS8qIDEgaW4gdGhlIGJpdCBwb3NpdGlvbiBiZWluZyBjb2RlZCAqLwotICBpbnQgbTEgPSAoLTEpIDw8IGNpbmZvLT5BbDsJLyogLTEgaW4gdGhlIGJpdCBwb3NpdGlvbiBiZWluZyBjb2RlZCAqLwotICByZWdpc3RlciBpbnQgcywgaywgcjsKLSAgdW5zaWduZWQgaW50IEVPQlJVTjsKLSAgSkJMT0NLUk9XIGJsb2NrOwotICBKQ09FRlBUUiB0aGlzY29lZjsKLSAgQklUUkVBRF9TVEFURV9WQVJTOwotICBkX2Rlcml2ZWRfdGJsICogdGJsOwotICBpbnQgbnVtX25ld256OwotICBpbnQgbmV3bnpfcG9zW0RDVFNJWkUyXTsKLQotICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCi0JcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogSWYgd2UndmUgcnVuIG91dCBvZiBkYXRhLCBkb24ndCBtb2RpZnkgdGhlIE1DVS4KLSAgICovCi0gIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgewotCi0gICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCi0gICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICBFT0JSVU4gPSBlbnRyb3B5LT5zYXZlZC5FT0JSVU47IC8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCi0KLSAgICAvKiBUaGVyZSBpcyBhbHdheXMgb25seSBvbmUgYmxvY2sgcGVyIE1DVSAqLwotICAgIGJsb2NrID0gTUNVX2RhdGFbMF07Ci0gICAgdGJsID0gZW50cm9weS0+YWNfZGVyaXZlZF90Ymw7Ci0KLSAgICAvKiBJZiB3ZSBhcmUgZm9yY2VkIHRvIHN1c3BlbmQsIHdlIG11c3QgdW5kbyB0aGUgYXNzaWdubWVudHMgdG8gYW55IG5ld2x5Ci0gICAgICogbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGJsb2NrLCBiZWNhdXNlIG90aGVyd2lzZSB3ZSdkIGdldCBjb25mdXNlZAotICAgICAqIG5leHQgdGltZSBhYm91dCB3aGljaCBjb2VmZmljaWVudHMgd2VyZSBhbHJlYWR5IG5vbnplcm8uCi0gICAgICogQnV0IHdlIG5lZWQgbm90IHVuZG8gYWRkaXRpb24gb2YgYml0cyB0byBhbHJlYWR5LW5vbnplcm8gY29lZmZpY2llbnRzOwotICAgICAqIGluc3RlYWQsIHdlIGNhbiB0ZXN0IHRoZSBjdXJyZW50IGJpdCB0byBzZWUgaWYgd2UgYWxyZWFkeSBkaWQgaXQuCi0gICAgICovCi0gICAgbnVtX25ld256ID0gMDsKLQotICAgIC8qIGluaXRpYWxpemUgY29lZmZpY2llbnQgbG9vcCBjb3VudGVyIHRvIHN0YXJ0IG9mIGJhbmQgKi8KLSAgICBrID0gY2luZm8tPlNzOwotCi0gICAgaWYgKEVPQlJVTiA9PSAwKSB7Ci0gICAgICBmb3IgKDsgayA8PSBTZTsgaysrKSB7Ci0JSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIHRibCwgZ290byB1bmRvaXQsIGxhYmVsMyk7Ci0JciA9IHMgPj4gNDsKLQlzICY9IDE1OwotCWlmIChzKSB7Ci0JICBpZiAocyAhPSAxKQkJLyogc2l6ZSBvZiBuZXcgY29lZiBzaG91bGQgYWx3YXlzIGJlIDEgKi8KLQkgICAgV0FSTk1TKGNpbmZvLCBKV1JOX0hVRkZfQkFEX0NPREUpOwotCSAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgZ290byB1bmRvaXQpOwotCSAgaWYgKEdFVF9CSVRTKDEpKQotCSAgICBzID0gcDE7CQkvKiBuZXdseSBub256ZXJvIGNvZWYgaXMgcG9zaXRpdmUgKi8KLQkgIGVsc2UKLQkgICAgcyA9IG0xOwkJLyogbmV3bHkgbm9uemVybyBjb2VmIGlzIG5lZ2F0aXZlICovCi0JfSBlbHNlIHsKLQkgIGlmIChyICE9IDE1KSB7Ci0JICAgIEVPQlJVTiA9IDEgPDwgcjsJLyogRU9CciwgcnVuIGxlbmd0aCBpcyAyXnIgKyBhcHBlbmRlZCBiaXRzICovCi0JICAgIGlmIChyKSB7Ci0JICAgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgciwgZ290byB1bmRvaXQpOwotCSAgICAgIHIgPSBHRVRfQklUUyhyKTsKLQkgICAgICBFT0JSVU4gKz0gcjsKLQkgICAgfQotCSAgICBicmVhazsJCS8qIHJlc3Qgb2YgYmxvY2sgaXMgaGFuZGxlZCBieSBFT0IgbG9naWMgKi8KLQkgIH0KLQkgIC8qIG5vdGUgcyA9IDAgZm9yIHByb2Nlc3NpbmcgWlJMICovCi0JfQotCS8qIEFkdmFuY2Ugb3ZlciBhbHJlYWR5LW5vbnplcm8gY29lZnMgYW5kIHIgc3RpbGwtemVybyBjb2VmcywKLQkgKiBhcHBlbmRpbmcgY29ycmVjdGlvbiBiaXRzIHRvIHRoZSBub256ZXJvZXMuICBBIGNvcnJlY3Rpb24gYml0IGlzIDEKLQkgKiBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGNvZWZmaWNpZW50IG11c3QgYmUgaW5jcmVhc2VkLgotCSAqLwotCWRvIHsKLQkgIHRoaXNjb2VmID0gKmJsb2NrICsganBlZ19uYXR1cmFsX29yZGVyW2tdOwotCSAgaWYgKCp0aGlzY29lZiAhPSAwKSB7Ci0JICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKLQkgICAgaWYgKEdFVF9CSVRTKDEpKSB7Ci0JICAgICAgaWYgKCgqdGhpc2NvZWYgJiBwMSkgPT0gMCkgeyAvKiBkbyBub3RoaW5nIGlmIGFscmVhZHkgc2V0IGl0ICovCi0JCWlmICgqdGhpc2NvZWYgPj0gMCkKLQkJICAqdGhpc2NvZWYgKz0gcDE7Ci0JCWVsc2UKLQkJICAqdGhpc2NvZWYgKz0gbTE7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9IGVsc2UgewotCSAgICBpZiAoLS1yIDwgMCkKLQkgICAgICBicmVhazsJCS8qIHJlYWNoZWQgdGFyZ2V0IHplcm8gY29lZmZpY2llbnQgKi8KLQkgIH0KLQkgIGsrKzsKLQl9IHdoaWxlIChrIDw9IFNlKTsKLQlpZiAocykgewotCSAgaW50IHBvcyA9IGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKLQkgIC8qIE91dHB1dCBuZXdseSBub256ZXJvIGNvZWZmaWNpZW50ICovCi0JICAoKmJsb2NrKVtwb3NdID0gKEpDT0VGKSBzOwotCSAgLyogUmVtZW1iZXIgaXRzIHBvc2l0aW9uIGluIGNhc2Ugd2UgaGF2ZSB0byBzdXNwZW5kICovCi0JICBuZXduel9wb3NbbnVtX25ld256KytdID0gcG9zOwotCX0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoRU9CUlVOID4gMCkgewotICAgICAgLyogU2NhbiBhbnkgcmVtYWluaW5nIGNvZWZmaWNpZW50IHBvc2l0aW9ucyBhZnRlciB0aGUgZW5kLW9mLWJhbmQKLSAgICAgICAqICh0aGUgbGFzdCBuZXdseSBub256ZXJvIGNvZWZmaWNpZW50LCBpZiBhbnkpLiAgQXBwZW5kIGEgY29ycmVjdGlvbgotICAgICAgICogYml0IHRvIGVhY2ggYWxyZWFkeS1ub256ZXJvIGNvZWZmaWNpZW50LiAgQSBjb3JyZWN0aW9uIGJpdCBpcyAxCi0gICAgICAgKiBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGNvZWZmaWNpZW50IG11c3QgYmUgaW5jcmVhc2VkLgotICAgICAgICovCi0gICAgICBmb3IgKDsgayA8PSBTZTsgaysrKSB7Ci0JdGhpc2NvZWYgPSAqYmxvY2sgKyBqcGVnX25hdHVyYWxfb3JkZXJba107Ci0JaWYgKCp0aGlzY29lZiAhPSAwKSB7Ci0JICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCBnb3RvIHVuZG9pdCk7Ci0JICBpZiAoR0VUX0JJVFMoMSkpIHsKLQkgICAgaWYgKCgqdGhpc2NvZWYgJiBwMSkgPT0gMCkgeyAvKiBkbyBub3RoaW5nIGlmIGFscmVhZHkgY2hhbmdlZCBpdCAqLwotCSAgICAgIGlmICgqdGhpc2NvZWYgPj0gMCkKLQkJKnRoaXNjb2VmICs9IHAxOwotCSAgICAgIGVsc2UKLQkJKnRoaXNjb2VmICs9IG0xOwotCSAgICB9Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgLyogQ291bnQgb25lIGJsb2NrIGNvbXBsZXRlZCBpbiBFT0IgcnVuICovCi0gICAgICBFT0JSVU4tLTsKLSAgICB9Ci0KLSAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IEVPQlJVTjsgLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KLSAgfQotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLQotdW5kb2l0OgotICAvKiBSZS16ZXJvIGFueSBvdXRwdXQgY29lZmZpY2llbnRzIHRoYXQgd2UgbWFkZSBuZXdseSBub256ZXJvICovCi0gIHdoaWxlIChudW1fbmV3bnogPiAwKQotICAgICgqYmxvY2spW25ld256X3Bvc1stLW51bV9uZXduel1dID0gMDsKLQotICByZXR1cm4gRkFMU0U7Ci19Ci0KLS8qCi0gKiBTYXZlIHRoZSBjdXJyZW50IEh1ZmZtYW4gZGVjb2RlciBwb3NpdGlvbiBhbmQgdGhlIGJpdCBidWZmZXIKLSAqIGludG8gYml0c3RyZWFtX29mZnNldCBhbmQgZ2V0X2J1ZmZlciwgcmVzcGVjdGl2ZWx5LgotICovCi1HTE9CQUwodm9pZCkKLWpwZWdfZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uX3Byb2dyZXNzaXZlKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldCkKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgLy8gV2UgYXJlIGF0IHRoZSBlbmQgb2YgYSBkYXRhIHNlZ21lbnQKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCi0JcmV0dXJuOwotICB9Ci0KLSAgLy8gU2F2ZSByZXN0YXJ0c190b19nbyBhbmQgbmV4dF9yZXN0YXJ0X251bS4KLSAgb2Zmc2V0LT5yZXN0YXJ0c190b19nbyA9ICh1bnNpZ25lZCBzaG9ydCkgZW50cm9weS0+cmVzdGFydHNfdG9fZ287Ci0gIG9mZnNldC0+bmV4dF9yZXN0YXJ0X251bSA9IGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW07Ci0KLSAgb2Zmc2V0LT5iaXRzdHJlYW1fb2Zmc2V0ID0KLSAgICAgIChqZ2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihjaW5mbykgPDwgTE9HX1RXT19CSVRfQlVGX1NJWkUpCi0gICAgICArIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdDsKLQotICBvZmZzZXQtPmdldF9idWZmZXIgPSBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyOwotfQotCi0vKgotICogU2F2ZSB0aGUgY3VycmVudCBIdWZmbWFuIGRlb2NkZSBwb3NpdGlvbiBhbmQgdGhlIERDIGNvZWZmaWNpZW50cwotICogZm9yIGVhY2ggY29tcG9uZW50IGludG8gYml0c3RyZWFtX29mZnNldCBhbmQgZGNfaW5mb1tdLCByZXNwZWN0aXZlbHkuCi0gKi8KLU1FVEhPRERFRih2b2lkKQotZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldCkKLXsKLSAgaW50IGk7Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBqcGVnX2dldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbl9wcm9ncmVzc2l2ZShjaW5mbywgb2Zmc2V0KTsKLSAgb2Zmc2V0LT5FT0JSVU4gPSBlbnRyb3B5LT5zYXZlZC5FT0JSVU47Ci0gIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKQotICAgIG9mZnNldC0+cHJldl9kY1tpXSA9IGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2ldOwotfQotCi0vKgotICogQ29uZmlndXJlIHRoZSBIdWZmbWFuIGRlY29kZXIgcmVhZGVyIHBvc2l0aW9uIGFuZCBiaXQgYnVmZmVyLgotICovCi1HTE9CQUwodm9pZCkKLWpwZWdfY29uZmlndXJlX2h1ZmZtYW5fZGVjb2Rlcl9wcm9ncmVzc2l2ZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhIG9mZnNldCkKLXsKLQlwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLQotICAvLyBSZXN0b3JlIHJlc3RhcnRzX3RvX2dvIGFuZCBuZXh0X3Jlc3RhcnRfbnVtCi0gIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBvZmZzZXQucmVzdGFydHNfdG9fZ287Ci0gIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0gPSBvZmZzZXQubmV4dF9yZXN0YXJ0X251bTsKLQotICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX29mZnNldCA9IG9mZnNldC5iaXRzdHJlYW1fb2Zmc2V0OwotICBpbnQgYmxrbiwgaTsKLQotICB1bnNpZ25lZCBpbnQgYnl0ZV9vZmZzZXQgPSBiaXRzdHJlYW1fb2Zmc2V0ID4+IExPR19UV09fQklUX0JVRl9TSVpFOwotICB1bnNpZ25lZCBpbnQgYml0X2luX2JpdF9idWZmZXIgPQotICAgICAgYml0c3RyZWFtX29mZnNldCAmICgoMSA8PCBMT0dfVFdPX0JJVF9CVUZfU0laRSkgLSAxKTsKLQotICBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbl9iaXQoY2luZm8sIGJ5dGVfb2Zmc2V0LAotICAgICAgICAgIGJpdF9pbl9iaXRfYnVmZmVyLCBvZmZzZXQuZ2V0X2J1ZmZlcik7Ci19Ci0KLS8qCi0gKiBDb25maWd1cmUgdGhlIEh1ZmZtYW4gZGVjb2RlciB0byBkZWNvZGUgdGhlIGltYWdlCi0gKiBzdGFydGluZyBmcm9tIChpTUNVX3Jvd19vZmZzZXQsIGlNQ1VfY29sX29mZnNldCkuCi0gKi8KLU1FVEhPRERFRih2b2lkKQotY29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX29mZnNldF9kYXRhIG9mZnNldCkKLXsKLSAgaW50IGk7Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBqcGVnX2NvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXJfcHJvZ3Jlc3NpdmUoY2luZm8sIG9mZnNldCk7Ci0gIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IG9mZnNldC5FT0JSVU47Ci0gIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKQotICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2ldID0gb2Zmc2V0LnByZXZfZGNbaV07Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19jb25maWd1cmVfaHVmZm1hbl9pbmRleF9zY2FuKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LCBpbnQgc2Nhbl9ubywgaW50IG9mZnNldCkKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGlmIChzY2FuX25vID49IGluZGV4LT5zY2FuX2NvdW50KSB7Ci0gICAgaW5kZXgtPnNjYW4gPSByZWFsbG9jKGluZGV4LT5zY2FuLAotICAgICAgICAgICAgICAgICAgICAoc2Nhbl9ubyArIDEpICogc2l6ZW9mKGh1ZmZtYW5fc2Nhbl9oZWFkZXIpKTsKLSAgICBpbmRleC0+bWVtX3VzZWQgKz0gKHNjYW5fbm8gLSBpbmRleC0+c2Nhbl9jb3VudCArIDEpCi0gICAgICAqIChzaXplb2YoaHVmZm1hbl9zY2FuX2hlYWRlcikgKyBjaW5mby0+dG90YWxfaU1DVV9yb3dzCi0gICAgICAqIHNpemVvZihodWZmbWFuX29mZnNldF9kYXRhKikpOwotICAgIGluZGV4LT5zY2FuX2NvdW50ID0gc2Nhbl9ubyArIDE7Ci0gIH0KLSAgaW5kZXgtPnNjYW5bc2Nhbl9ub10ub2Zmc2V0ID0gKGh1ZmZtYW5fb2Zmc2V0X2RhdGEqKiltYWxsb2MoCi0gICAgICAgICAgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAqIHNpemVvZihodWZmbWFuX29mZnNldF9kYXRhKikpOwotICBpbmRleC0+c2NhbltzY2FuX25vXS5iaXRzdHJlYW1fb2Zmc2V0ID0gb2Zmc2V0OwotfQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHByb2dyZXNzaXZlIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZy4KLSAqLwotR0xPQkFMKHZvaWQpCi1qaW5pdF9waHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5OwotICBpbnQgKmNvZWZfYml0X3B0cjsKLSAgaW50IGNpLCBpOwotCi0gIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YocGh1ZmZfZW50cm9weV9kZWNvZGVyKSk7Ci0gIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciAqKSBlbnRyb3B5OwotICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfcGh1ZmZfZGVjb2RlcjsKLSAgZW50cm9weS0+cHViLmNvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIgPSBjb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyOwotICBlbnRyb3B5LT5wdWIuZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uID0KLSAgICAgICAgZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uOwotCi0gIC8qIE1hcmsgZGVyaXZlZCB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgewotICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7Ci0gIH0KLQotICAvKiBDcmVhdGUgcHJvZ3Jlc3Npb24gc3RhdHVzIHRhYmxlICovCi0gIGNpbmZvLT5jb2VmX2JpdHMgPSAoaW50ICgqKVtEQ1RTSVpFMl0pCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQljaW5mby0+bnVtX2NvbXBvbmVudHMqRENUU0laRTIqU0laRU9GKGludCkpOwotICBjb2VmX2JpdF9wdHIgPSAmIGNpbmZvLT5jb2VmX2JpdHNbMF1bMF07Ci0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgCi0gICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspCi0gICAgICAqY29lZl9iaXRfcHRyKysgPSAtMTsKLX0KLQotI2VuZGlmIC8qIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZHBvc3RjdC5jIGIvbGlianBlZ3R3cnAvamRwb3N0Y3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxNTYzZC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZHBvc3RjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBqZHBvc3RjdC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY29tcHJlc3Npb24gcG9zdHByb2Nlc3NpbmcgY29udHJvbGxlci4KLSAqIFRoaXMgY29udHJvbGxlciBtYW5hZ2VzIHRoZSB1cHNhbXBsaW5nLCBjb2xvciBjb252ZXJzaW9uLCBhbmQgY29sb3IKLSAqIHF1YW50aXphdGlvbi9yZWR1Y3Rpb24gc3RlcHM7IHNwZWNpZmljYWxseSwgaXQgY29udHJvbHMgdGhlIGJ1ZmZlcmluZwotICogYmV0d2VlbiB1cHNhbXBsZS9jb2xvciBjb252ZXJzaW9uIGFuZCBjb2xvciBxdWFudGl6YXRpb24vcmVkdWN0aW9uLgotICoKLSAqIElmIG5vIGNvbG9yIHF1YW50aXphdGlvbi9yZWR1Y3Rpb24gaXMgcmVxdWlyZWQsIHRoZW4gdGhpcyBtb2R1bGUgaGFzIG5vCi0gKiB3b3JrIHRvIGRvLCBhbmQgaXQganVzdCBoYW5kcyBvZmYgdG8gdGhlIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gY29kZS4KLSAqIEFuIGludGVncmF0ZWQgdXBzYW1wbGUvY29udmVydC9xdWFudGl6ZSBwcm9jZXNzIHdvdWxkIHJlcGxhY2UgdGhpcyBtb2R1bGUKLSAqIGVudGlyZWx5LgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIENvbG9yIHF1YW50aXphdGlvbiBzb3VyY2UgYnVmZmVyOiB0aGlzIGhvbGRzIG91dHB1dCBkYXRhIGZyb20KLSAgICogdGhlIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gc3RlcCB0byBiZSBwYXNzZWQgdG8gdGhlIHF1YW50aXplci4KLSAgICogRm9yIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiwgd2UgbmVlZCBhIGZ1bGwtaW1hZ2UgYnVmZmVyOwotICAgKiBmb3Igb25lLXBhc3Mgb3BlcmF0aW9uLCBhIHN0cmlwIGJ1ZmZlciBpcyBzdWZmaWNpZW50LgotICAgKi8KLSAganZpcnRfc2FycmF5X3B0ciB3aG9sZV9pbWFnZTsJLyogdmlydHVhbCBhcnJheSwgb3IgTlVMTCBpZiBvbmUtcGFzcyAqLwotICBKU0FNUEFSUkFZIGJ1ZmZlcjsJCS8qIHN0cmlwIGJ1ZmZlciwgb3IgY3VycmVudCBzdHJpcCBvZiB2aXJ0dWFsICovCi0gIEpESU1FTlNJT04gc3RyaXBfaGVpZ2h0OwkvKiBidWZmZXIgc2l6ZSBpbiByb3dzICovCi0gIC8qIGZvciB0d28tcGFzcyBtb2RlIG9ubHk6ICovCi0gIEpESU1FTlNJT04gc3RhcnRpbmdfcm93OwkvKiByb3cgIyBvZiBmaXJzdCByb3cgaW4gY3VycmVudCBzdHJpcCAqLwotICBKRElNRU5TSU9OIG5leHRfcm93OwkJLyogaW5kZXggb2YgbmV4dCByb3cgdG8gZmlsbC9lbXB0eSBpbiBzdHJpcCAqLwotfSBteV9wb3N0X2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfcG9zdF9jb250cm9sbGVyICogbXlfcG9zdF9wdHI7Ci0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRih2b2lkKSBwb3N0X3Byb2Nlc3NfMXBhc3MKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi1NRVRIT0RERUYodm9pZCkgcG9zdF9wcm9jZXNzX3ByZXBhc3MKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Ci1NRVRIT0RERUYodm9pZCkgcG9zdF9wcm9jZXNzXzJwYXNzCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCSAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotI2VuZGlmCi0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19kcG9zdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCi17Ci0gIG15X3Bvc3RfcHRyIHBvc3QgPSAobXlfcG9zdF9wdHIpIGNpbmZvLT5wb3N0OwotCi0gIHN3aXRjaCAocGFzc19tb2RlKSB7Ci0gIGNhc2UgSkJVRl9QQVNTX1RIUlU6Ci0gICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKLSAgICAgIC8qIFNpbmdsZS1wYXNzIHByb2Nlc3Npbmcgd2l0aCBjb2xvciBxdWFudGl6YXRpb24uICovCi0gICAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBwb3N0X3Byb2Nlc3NfMXBhc3M7Ci0gICAgICAvKiBXZSBjb3VsZCBiZSBkb2luZyBidWZmZXJlZC1pbWFnZSBvdXRwdXQgYmVmb3JlIHN0YXJ0aW5nIGEgMi1wYXNzCi0gICAgICAgKiBjb2xvciBxdWFudGl6YXRpb247IGluIHRoYXQgY2FzZSwgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIgZGlkIG5vdAotICAgICAgICogYWxsb2NhdGUgYSBzdHJpcCBidWZmZXIuICBVc2UgdGhlIHZpcnR1YWwtYXJyYXkgYnVmZmVyIGFzIHdvcmtzcGFjZS4KLSAgICAgICAqLwotICAgICAgaWYgKHBvc3QtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JcG9zdC0+YnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0JICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHBvc3QtPndob2xlX2ltYWdlLAotCSAgIChKRElNRU5TSU9OKSAwLCBwb3N0LT5zdHJpcF9oZWlnaHQsIFRSVUUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBGb3Igc2luZ2xlLXBhc3MgcHJvY2Vzc2luZyB3aXRob3V0IGNvbG9yIHF1YW50aXphdGlvbiwKLSAgICAgICAqIEkgaGF2ZSBubyB3b3JrIHRvIGRvOyBqdXN0IGNhbGwgdGhlIHVwc2FtcGxlciBkaXJlY3RseS4KLSAgICAgICAqLwotICAgICAgcG9zdC0+cHViLnBvc3RfcHJvY2Vzc19kYXRhID0gY2luZm8tPnVwc2FtcGxlLT51cHNhbXBsZTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0gIGNhc2UgSkJVRl9TQVZFX0FORF9QQVNTOgotICAgIC8qIEZpcnN0IHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiAqLwotICAgIGlmIChwb3N0LT53aG9sZV9pbWFnZSA9PSBOVUxMKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IHBvc3RfcHJvY2Vzc19wcmVwYXNzOwotICAgIGJyZWFrOwotICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKLSAgICAvKiBTZWNvbmQgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uICovCi0gICAgaWYgKHBvc3QtPndob2xlX2ltYWdlID09IE5VTEwpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgcG9zdC0+cHViLnBvc3RfcHJvY2Vzc19kYXRhID0gcG9zdF9wcm9jZXNzXzJwYXNzOwotICAgIGJyZWFrOwotI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBicmVhazsKLSAgfQotICBwb3N0LT5zdGFydGluZ19yb3cgPSBwb3N0LT5uZXh0X3JvdyA9IDA7Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBvbmUtcGFzcyAoc3RyaXAgYnVmZmVyKSBjYXNlLgotICogVGhpcyBpcyB1c2VkIGZvciBjb2xvciBwcmVjaXNpb24gcmVkdWN0aW9uIGFzIHdlbGwgYXMgb25lLXBhc3MgcXVhbnRpemF0aW9uLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcG9zdF9wcm9jZXNzXzFwYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JCSAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKLXsKLSAgbXlfcG9zdF9wdHIgcG9zdCA9IChteV9wb3N0X3B0cikgY2luZm8tPnBvc3Q7Ci0gIEpESU1FTlNJT04gbnVtX3Jvd3MsIG1heF9yb3dzOwotCi0gIC8qIEZpbGwgdGhlIGJ1ZmZlciwgYnV0IG5vdCBtb3JlIHRoYW4gd2hhdCB3ZSBjYW4gZHVtcCBvdXQgaW4gb25lIGdvLiAqLwotICAvKiBOb3RlIHdlIHJlbHkgb24gdGhlIHVwc2FtcGxlciB0byBkZXRlY3QgYm90dG9tIG9mIGltYWdlLiAqLwotICBtYXhfcm93cyA9IG91dF9yb3dzX2F2YWlsIC0gKm91dF9yb3dfY3RyOwotICBpZiAobWF4X3Jvd3MgPiBwb3N0LT5zdHJpcF9oZWlnaHQpCi0gICAgbWF4X3Jvd3MgPSBwb3N0LT5zdHJpcF9oZWlnaHQ7Ci0gIG51bV9yb3dzID0gMDsKLSAgKCpjaW5mby0+dXBzYW1wbGUtPnVwc2FtcGxlKSAoY2luZm8sCi0JCWlucHV0X2J1ZiwgaW5fcm93X2dyb3VwX2N0ciwgaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkJcG9zdC0+YnVmZmVyLCAmbnVtX3Jvd3MsIG1heF9yb3dzKTsKLSAgLyogUXVhbnRpemUgYW5kIGVtaXQgZGF0YS4gKi8KLSAgKCpjaW5mby0+Y3F1YW50aXplLT5jb2xvcl9xdWFudGl6ZSkgKGNpbmZvLAotCQlwb3N0LT5idWZmZXIsIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsIChpbnQpIG51bV9yb3dzKTsKLSAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOwotfQotCi0KLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBmaXJzdCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wb3N0X3Byb2Nlc3NfcHJlcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JCSAgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJICAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKLXsKLSAgbXlfcG9zdF9wdHIgcG9zdCA9IChteV9wb3N0X3B0cikgY2luZm8tPnBvc3Q7Ci0gIEpESU1FTlNJT04gb2xkX25leHRfcm93LCBudW1fcm93czsKLQotICAvKiBSZXBvc2l0aW9uIHZpcnR1YWwgYnVmZmVyIGlmIGF0IHN0YXJ0IG9mIHN0cmlwLiAqLwotICBpZiAocG9zdC0+bmV4dF9yb3cgPT0gMCkgewotICAgIHBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgcG9zdC0+d2hvbGVfaW1hZ2UsCi0JIHBvc3QtPnN0YXJ0aW5nX3JvdywgcG9zdC0+c3RyaXBfaGVpZ2h0LCBUUlVFKTsKLSAgfQotCi0gIC8qIFVwc2FtcGxlIHNvbWUgZGF0YSAodXAgdG8gYSBzdHJpcCBoZWlnaHQncyB3b3J0aCkuICovCi0gIG9sZF9uZXh0X3JvdyA9IHBvc3QtPm5leHRfcm93OwotICAoKmNpbmZvLT51cHNhbXBsZS0+dXBzYW1wbGUpIChjaW5mbywKLQkJaW5wdXRfYnVmLCBpbl9yb3dfZ3JvdXBfY3RyLCBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQlwb3N0LT5idWZmZXIsICZwb3N0LT5uZXh0X3JvdywgcG9zdC0+c3RyaXBfaGVpZ2h0KTsKLQotICAvKiBBbGxvdyBxdWFudGl6ZXIgdG8gc2NhbiBuZXcgZGF0YS4gIE5vIGRhdGEgaXMgZW1pdHRlZCwgKi8KLSAgLyogYnV0IHdlIGFkdmFuY2Ugb3V0X3Jvd19jdHIgc28gb3V0ZXIgbG9vcCBjYW4gdGVsbCB3aGVuIHdlJ3JlIGRvbmUuICovCi0gIGlmIChwb3N0LT5uZXh0X3JvdyA+IG9sZF9uZXh0X3JvdykgewotICAgIG51bV9yb3dzID0gcG9zdC0+bmV4dF9yb3cgLSBvbGRfbmV4dF9yb3c7Ci0gICAgKCpjaW5mby0+Y3F1YW50aXplLT5jb2xvcl9xdWFudGl6ZSkgKGNpbmZvLCBwb3N0LT5idWZmZXIgKyBvbGRfbmV4dF9yb3csCi0JCQkJCSAoSlNBTVBBUlJBWSkgTlVMTCwgKGludCkgbnVtX3Jvd3MpOwotICAgICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKLSAgfQotCi0gIC8qIEFkdmFuY2UgaWYgd2UgZmlsbGVkIHRoZSBzdHJpcC4gKi8KLSAgaWYgKHBvc3QtPm5leHRfcm93ID49IHBvc3QtPnN0cmlwX2hlaWdodCkgewotICAgIHBvc3QtPnN0YXJ0aW5nX3JvdyArPSBwb3N0LT5zdHJpcF9oZWlnaHQ7Ci0gICAgcG9zdC0+bmV4dF9yb3cgPSAwOwotICB9Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBzZWNvbmQgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcG9zdF9wcm9jZXNzXzJwYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JCSAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKLXsKLSAgbXlfcG9zdF9wdHIgcG9zdCA9IChteV9wb3N0X3B0cikgY2luZm8tPnBvc3Q7Ci0gIEpESU1FTlNJT04gbnVtX3Jvd3MsIG1heF9yb3dzOwotCi0gIC8qIFJlcG9zaXRpb24gdmlydHVhbCBidWZmZXIgaWYgYXQgc3RhcnQgb2Ygc3RyaXAuICovCi0gIGlmIChwb3N0LT5uZXh0X3JvdyA9PSAwKSB7Ci0gICAgcG9zdC0+YnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBwb3N0LT53aG9sZV9pbWFnZSwKLQkgcG9zdC0+c3RhcnRpbmdfcm93LCBwb3N0LT5zdHJpcF9oZWlnaHQsIEZBTFNFKTsKLSAgfQotCi0gIC8qIERldGVybWluZSBudW1iZXIgb2Ygcm93cyB0byBlbWl0LiAqLwotICBudW1fcm93cyA9IHBvc3QtPnN0cmlwX2hlaWdodCAtIHBvc3QtPm5leHRfcm93OyAvKiBhdmFpbGFibGUgaW4gc3RyaXAgKi8KLSAgbWF4X3Jvd3MgPSBvdXRfcm93c19hdmFpbCAtICpvdXRfcm93X2N0cjsgLyogYXZhaWxhYmxlIGluIG91dHB1dCBhcmVhICovCi0gIGlmIChudW1fcm93cyA+IG1heF9yb3dzKQotICAgIG51bV9yb3dzID0gbWF4X3Jvd3M7Ci0gIC8qIFdlIGhhdmUgdG8gY2hlY2sgYm90dG9tIG9mIGltYWdlIGhlcmUsIGNhbid0IGRlcGVuZCBvbiB1cHNhbXBsZXIuICovCi0gIG1heF9yb3dzID0gY2luZm8tPm91dHB1dF9oZWlnaHQgLSBwb3N0LT5zdGFydGluZ19yb3c7Ci0gIGlmIChudW1fcm93cyA+IG1heF9yb3dzKQotICAgIG51bV9yb3dzID0gbWF4X3Jvd3M7Ci0KLSAgLyogUXVhbnRpemUgYW5kIGVtaXQgZGF0YS4gKi8KLSAgKCpjaW5mby0+Y3F1YW50aXplLT5jb2xvcl9xdWFudGl6ZSkgKGNpbmZvLAotCQlwb3N0LT5idWZmZXIgKyBwb3N0LT5uZXh0X3Jvdywgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwKLQkJKGludCkgbnVtX3Jvd3MpOwotICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7Ci0KLSAgLyogQWR2YW5jZSBpZiB3ZSBmaWxsZWQgdGhlIHN0cmlwLiAqLwotICBwb3N0LT5uZXh0X3JvdyArPSBudW1fcm93czsKLSAgaWYgKHBvc3QtPm5leHRfcm93ID49IHBvc3QtPnN0cmlwX2hlaWdodCkgewotICAgIHBvc3QtPnN0YXJ0aW5nX3JvdyArPSBwb3N0LT5zdHJpcF9oZWlnaHQ7Ci0gICAgcG9zdC0+bmV4dF9yb3cgPSAwOwotICB9Ci19Ci0KLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBwb3N0cHJvY2Vzc2luZyBjb250cm9sbGVyLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfZF9wb3N0X2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKLXsKLSAgbXlfcG9zdF9wdHIgcG9zdDsKLQotICBwb3N0ID0gKG15X3Bvc3RfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X3Bvc3RfY29udHJvbGxlcikpOwotICBjaW5mby0+cG9zdCA9IChzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciAqKSBwb3N0OwotICBwb3N0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfZHBvc3Q7Ci0gIHBvc3QtPndob2xlX2ltYWdlID0gTlVMTDsJLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KLSAgcG9zdC0+YnVmZmVyID0gTlVMTDsJCS8qIGZsYWcgZm9yIG5vIHN0cmlwIGJ1ZmZlciAqLwotCi0gIC8qIENyZWF0ZSB0aGUgcXVhbnRpemF0aW9uIGJ1ZmZlciwgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7Ci0gICAgLyogVGhlIGJ1ZmZlciBzdHJpcCBoZWlnaHQgaXMgbWF4X3Zfc2FtcF9mYWN0b3IsIHdoaWNoIGlzIHR5cGljYWxseQotICAgICAqIGFuIGVmZmljaWVudCBudW1iZXIgb2Ygcm93cyBmb3IgdXBzYW1wbGluZyB0byByZXR1cm4uCi0gICAgICogKEluIHRoZSBwcmVzZW5jZSBvZiBvdXRwdXQgcmVzY2FsaW5nLCB3ZSBtaWdodCB3YW50IHRvIGJlIHNtYXJ0ZXI/KQotICAgICAqLwotICAgIHBvc3QtPnN0cmlwX2hlaWdodCA9IChKRElNRU5TSU9OKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gICAgaWYgKG5lZWRfZnVsbF9idWZmZXIpIHsKLSAgICAgIC8qIFR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbjogbmVlZCBmdWxsLWltYWdlIHN0b3JhZ2UuICovCi0gICAgICAvKiBXZSByb3VuZCB1cCB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gYSBtdWx0aXBsZSBvZiB0aGUgc3RyaXAgaGVpZ2h0LiAqLwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICAgICAgcG9zdC0+d2hvbGVfaW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0JIGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMsCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0LAotCQkJCShsb25nKSBwb3N0LT5zdHJpcF9oZWlnaHQpLAotCSBwb3N0LT5zdHJpcF9oZWlnaHQpOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KLSAgICB9IGVsc2UgewotICAgICAgLyogT25lLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uOiBqdXN0IG1ha2UgYSBzdHJpcCBidWZmZXIuICovCi0gICAgICBwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzLAotCSBwb3N0LT5zdHJpcF9oZWlnaHQpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRzYW1wbGUuYyBiL2xpYmpwZWd0d3JwL2pkc2FtcGxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZmZlZmIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRzYW1wbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vKgotICogamRzYW1wbGUuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHVwc2FtcGxpbmcgcm91dGluZXMuCi0gKgotICogVXBzYW1wbGluZyBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKLSAqIGlzIGRlZmluZWQgdG8gYmUgKHZfc2FtcF9mYWN0b3IgKiBEQ1Rfc2NhbGVkX3NpemUgLyBtaW5fRENUX3NjYWxlZF9zaXplKQotICogc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICBVcHNhbXBsaW5nIHdpbGwgbm9ybWFsbHkgcHJvZHVjZQotICogbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWwgcm93cyBmcm9tIGVhY2ggcm93IGdyb3VwIChidXQgdGhpcyBjb3VsZCB2YXJ5Ci0gKiBpZiB0aGUgdXBzYW1wbGVyIGlzIGFwcGx5aW5nIGEgc2NhbGUgZmFjdG9yIG9mIGl0cyBvd24pLgotICoKLSAqIEFuIGV4Y2VsbGVudCByZWZlcmVuY2UgZm9yIGltYWdlIHJlc2FtcGxpbmcgaXMKLSAqICAgRGlnaXRhbCBJbWFnZSBXYXJwaW5nLCBHZW9yZ2UgV29sYmVyZywgMTk5MC4KLSAqICAgUHViLiBieSBJRUVFIENvbXB1dGVyIFNvY2lldHkgUHJlc3MsIExvcyBBbGFtaXRvcywgQ0EuIElTQk4gMC04MTg2LTg5NDQtNy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogUG9pbnRlciB0byByb3V0aW5lIHRvIHVwc2FtcGxlIGEgc2luZ2xlIGNvbXBvbmVudCAqLwotdHlwZWRlZiBKTUVUSE9EKHZvaWQsIHVwc2FtcGxlMV9wdHIsCi0JCShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikpOwotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX3Vwc2FtcGxlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBDb2xvciBjb252ZXJzaW9uIGJ1ZmZlci4gIFdoZW4gdXNpbmcgc2VwYXJhdGUgdXBzYW1wbGluZyBhbmQgY29sb3IKLSAgICogY29udmVyc2lvbiBzdGVwcywgdGhpcyBidWZmZXIgaG9sZHMgb25lIHVwc2FtcGxlZCByb3cgZ3JvdXAgdW50aWwgaXQKLSAgICogaGFzIGJlZW4gY29sb3IgY29udmVydGVkIGFuZCBvdXRwdXQuCi0gICAqIE5vdGU6IHdlIGRvIG5vdCBhbGxvY2F0ZSBhbnkgc3RvcmFnZSBmb3IgY29tcG9uZW50KHMpIHdoaWNoIGFyZSBmdWxsLXNpemUsCi0gICAqIGllIGRvIG5vdCBuZWVkIHJlc2NhbGluZy4gIFRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IG9mIGNvbG9yX2J1ZltdIGlzCi0gICAqIHNpbXBseSBzZXQgdG8gcG9pbnQgdG8gdGhlIGlucHV0IGRhdGEgYXJyYXksIHRoZXJlYnkgYXZvaWRpbmcgY29weWluZy4KLSAgICovCi0gIEpTQU1QQVJSQVkgY29sb3JfYnVmW01BWF9DT01QT05FTlRTXTsKLQotICAvKiBQZXItY29tcG9uZW50IHVwc2FtcGxpbmcgbWV0aG9kIHBvaW50ZXJzICovCi0gIHVwc2FtcGxlMV9wdHIgbWV0aG9kc1tNQVhfQ09NUE9ORU5UU107Ci0KLSAgaW50IG5leHRfcm93X291dDsJCS8qIGNvdW50cyByb3dzIGVtaXR0ZWQgZnJvbSBjb2xvcl9idWYgKi8KLSAgSkRJTUVOU0lPTiByb3dzX3RvX2dvOwkvKiBjb3VudHMgcm93cyByZW1haW5pbmcgaW4gaW1hZ2UgKi8KLQotICAvKiBIZWlnaHQgb2YgYW4gaW5wdXQgcm93IGdyb3VwIGZvciBlYWNoIGNvbXBvbmVudC4gKi8KLSAgaW50IHJvd2dyb3VwX2hlaWdodFtNQVhfQ09NUE9ORU5UU107Ci0KLSAgLyogVGhlc2UgYXJyYXlzIHNhdmUgcGl4ZWwgZXhwYW5zaW9uIGZhY3RvcnMgc28gdGhhdCBpbnRfZXhwYW5kIG5lZWQgbm90Ci0gICAqIHJlY29tcHV0ZSB0aGVtIGVhY2ggdGltZS4gIFRoZXkgYXJlIHVudXNlZCBmb3Igb3RoZXIgdXBzYW1wbGluZyBtZXRob2RzLgotICAgKi8KLSAgVUlOVDggaF9leHBhbmRbTUFYX0NPTVBPTkVOVFNdOwotICBVSU5UOCB2X2V4cGFuZFtNQVhfQ09NUE9ORU5UU107Ci19IG15X3Vwc2FtcGxlcjsKLQotdHlwZWRlZiBteV91cHNhbXBsZXIgKiBteV91cHNhbXBsZV9wdHI7Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGFuIHVwc2FtcGxpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLQotICAvKiBNYXJrIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciBlbXB0eSAqLwotICB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotICAvKiBJbml0aWFsaXplIHRvdGFsLWhlaWdodCBjb3VudGVyIGZvciBkZXRlY3RpbmcgYm90dG9tIG9mIGltYWdlICovCi0gIHVwc2FtcGxlLT5yb3dzX3RvX2dvID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7Ci19Ci0KLQotLyoKLSAqIENvbnRyb2wgcm91dGluZSB0byBkbyB1cHNhbXBsaW5nIChhbmQgY29sb3IgY29udmVyc2lvbikuCi0gKgotICogSW4gdGhpcyB2ZXJzaW9uIHdlIHVwc2FtcGxlIGVhY2ggY29tcG9uZW50IGluZGVwZW5kZW50bHkuCi0gKiBXZSB1cHNhbXBsZSBvbmUgcm93IGdyb3VwIGludG8gdGhlIGNvbnZlcnNpb24gYnVmZmVyLCB0aGVuIGFwcGx5Ci0gKiBjb2xvciBjb252ZXJzaW9uIGEgcm93IGF0IGEgdGltZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXNlcF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkgICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkgICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIEpESU1FTlNJT04gbnVtX3Jvd3M7Ci0KLSAgLyogRmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIsIGlmIGl0J3MgZW1wdHkgKi8KLSAgaWYgKHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgPj0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7Ci0gICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgY2krKywgY29tcHB0cisrKSB7Ci0gICAgICAvKiBJbnZva2UgcGVyLWNvbXBvbmVudCB1cHNhbXBsZSBtZXRob2QuICBOb3RpY2Ugd2UgcGFzcyBhIFBPSU5URVIKLSAgICAgICAqIHRvIGNvbG9yX2J1ZltjaV0sIHNvIHRoYXQgZnVsbHNpemVfdXBzYW1wbGUgY2FuIGNoYW5nZSBpdC4KLSAgICAgICAqLwotICAgICAgKCp1cHNhbXBsZS0+bWV0aG9kc1tjaV0pIChjaW5mbywgY29tcHB0ciwKLQlpbnB1dF9idWZbY2ldICsgKCppbl9yb3dfZ3JvdXBfY3RyICogdXBzYW1wbGUtPnJvd2dyb3VwX2hlaWdodFtjaV0pLAotCXVwc2FtcGxlLT5jb2xvcl9idWYgKyBjaSk7Ci0gICAgfQotICAgIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgPSAwOwotICB9Ci0KLSAgLyogQ29sb3ItY29udmVydCBhbmQgZW1pdCByb3dzICovCi0KLSAgLyogSG93IG1hbnkgd2UgaGF2ZSBpbiB0aGUgYnVmZmVyOiAqLwotICBudW1fcm93cyA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yIC0gdXBzYW1wbGUtPm5leHRfcm93X291dCk7Ci0gIC8qIE5vdCBtb3JlIHRoYW4gdGhlIGRpc3RhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIGltYWdlLiAgTmVlZCB0aGlzIHRlc3QKLSAgICogaW4gY2FzZSB0aGUgaW1hZ2UgaGVpZ2h0IGlzIG5vdCBhIG11bHRpcGxlIG9mIG1heF92X3NhbXBfZmFjdG9yOgotICAgKi8KLSAgaWYgKG51bV9yb3dzID4gdXBzYW1wbGUtPnJvd3NfdG9fZ28pIAotICAgIG51bV9yb3dzID0gdXBzYW1wbGUtPnJvd3NfdG9fZ287Ci0gIC8qIEFuZCBub3QgbW9yZSB0aGFuIHdoYXQgdGhlIGNsaWVudCBjYW4gYWNjZXB0OiAqLwotICBvdXRfcm93c19hdmFpbCAtPSAqb3V0X3Jvd19jdHI7Ci0gIGlmIChudW1fcm93cyA+IG91dF9yb3dzX2F2YWlsKQotICAgIG51bV9yb3dzID0gb3V0X3Jvd3NfYXZhaWw7Ci0KLSAgKCpjaW5mby0+Y2NvbnZlcnQtPmNvbG9yX2NvbnZlcnQpIChjaW5mbywgdXBzYW1wbGUtPmNvbG9yX2J1ZiwKLQkJCQkgICAgIChKRElNRU5TSU9OKSB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0LAotCQkJCSAgICAgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwKLQkJCQkgICAgIChpbnQpIG51bV9yb3dzKTsKLQotICAvKiBBZGp1c3QgY291bnRzICovCi0gICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKLSAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gLT0gbnVtX3Jvd3M7Ci0gIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgKz0gbnVtX3Jvd3M7Ci0gIC8qIFdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0aWVkLCBkZWNsYXJlIHRoaXMgaW5wdXQgcm93IGdyb3VwIGNvbnN1bWVkICovCi0gIGlmICh1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID49IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikKLSAgICAoKmluX3Jvd19ncm91cF9jdHIpKys7Ci19Ci0KLQotLyoKLSAqIFRoZXNlIGFyZSB0aGUgcm91dGluZXMgaW52b2tlZCBieSBzZXBfdXBzYW1wbGUgdG8gdXBzYW1wbGUgcGl4ZWwgdmFsdWVzCi0gKiBvZiBhIHNpbmdsZSBjb21wb25lbnQuICBPbmUgcm93IGdyb3VwIGlzIHByb2Nlc3NlZCBwZXIgY2FsbC4KLSAqLwotCi0KLS8qCi0gKiBGb3IgZnVsbC1zaXplIGNvbXBvbmVudHMsIHdlIGp1c3QgbWFrZSBjb2xvcl9idWZbY2ldIHBvaW50IGF0IHRoZQotICogaW5wdXQgYnVmZmVyLCBhbmQgdGh1cyBhdm9pZCBjb3B5aW5nIGFueSBkYXRhLiAgTm90ZSB0aGF0IHRoaXMgaXMKLSAqIHNhZmUgb25seSBiZWNhdXNlIHNlcF91cHNhbXBsZSBkb2Vzbid0IGRlY2xhcmUgdGhlIGlucHV0IHJvdyBncm91cAotICogImNvbnN1bWVkIiB1bnRpbCB3ZSBhcmUgZG9uZSBjb2xvciBjb252ZXJ0aW5nIGFuZCBlbWl0dGluZyBpdC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZ1bGxzaXplX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQotewotICAqb3V0cHV0X2RhdGFfcHRyID0gaW5wdXRfZGF0YTsKLX0KLQotCi0vKgotICogVGhpcyBpcyBhIG5vLW9wIHZlcnNpb24gdXNlZCBmb3IgInVuaW50ZXJlc3RpbmciIGNvbXBvbmVudHMuCi0gKiBUaGVzZSBjb21wb25lbnRzIHdpbGwgbm90IGJlIHJlZmVyZW5jZWQgYnkgY29sb3IgY29udmVyc2lvbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW5vb3BfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gICpvdXRwdXRfZGF0YV9wdHIgPSBOVUxMOwkvKiBzYWZldHkgY2hlY2sgKi8KLX0KLQotCi0vKgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgYW55IGludGVncmFsIHNhbXBsaW5nIHJhdGlvcy4KLSAqIFRoaXMgaXMgbm90IHVzZWQgZm9yIHR5cGljYWwgSlBFRyBmaWxlcywgc28gaXQgbmVlZCBub3QgYmUgZmFzdC4KLSAqIE5vciwgZm9yIHRoYXQgbWF0dGVyLCBpcyBpdCBwYXJ0aWN1bGFybHkgYWNjdXJhdGU6IHRoZSBhbGdvcml0aG0gaXMKLSAqIHNpbXBsZSByZXBsaWNhdGlvbiBvZiB0aGUgaW5wdXQgcGl4ZWwgb250byB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQKLSAqIHBpeGVscy4gIFRoZSBoaS1mYWx1dGluIHNhbXBsaW5nIGxpdGVyYXR1cmUgcmVmZXJzIHRvIHRoaXMgYXMgYQotICogImJveCBmaWx0ZXIiLiAgQSBib3ggZmlsdGVyIHRlbmRzIHRvIGludHJvZHVjZSB2aXNpYmxlIGFydGlmYWN0cywKLSAqIHNvIGlmIHlvdSBhcmUgYWN0dWFsbHkgZ29pbmcgdG8gdXNlIDM6MSBvciA0OjEgc2FtcGxpbmcgcmF0aW9zCi0gKiB5b3Ugd291bGQgYmUgd2VsbCBhZHZpc2VkIHRvIGltcHJvdmUgdGhpcyBjb2RlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaW50X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgaW52YWx1ZTsKLSAgcmVnaXN0ZXIgaW50IGg7Ci0gIEpTQU1QUk9XIG91dGVuZDsKLSAgaW50IGhfZXhwYW5kLCB2X2V4cGFuZDsKLSAgaW50IGlucm93LCBvdXRyb3c7Ci0KLSAgaF9leHBhbmQgPSB1cHNhbXBsZS0+aF9leHBhbmRbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKLSAgdl9leHBhbmQgPSB1cHNhbXBsZS0+dl9leHBhbmRbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKLQotICBpbnJvdyA9IG91dHJvdyA9IDA7Ci0gIHdoaWxlIChvdXRyb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSAgICAvKiBHZW5lcmF0ZSBvbmUgb3V0cHV0IHJvdyB3aXRoIHByb3BlciBob3Jpem9udGFsIGV4cGFuc2lvbiAqLwotICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKLSAgICBvdXRlbmQgPSBvdXRwdHIgKyBjaW5mby0+b3V0cHV0X3dpZHRoOwotICAgIHdoaWxlIChvdXRwdHIgPCBvdXRlbmQpIHsKLSAgICAgIGludmFsdWUgPSAqaW5wdHIrKzsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgZm9yIChoID0gaF9leHBhbmQ7IGggPiAwOyBoLS0pIHsKLQkqb3V0cHRyKysgPSBpbnZhbHVlOwotICAgICAgfQotICAgIH0KLSAgICAvKiBHZW5lcmF0ZSBhbnkgYWRkaXRpb25hbCBvdXRwdXQgcm93cyBieSBkdXBsaWNhdGluZyB0aGUgZmlyc3Qgb25lICovCi0gICAgaWYgKHZfZXhwYW5kID4gMSkgewotICAgICAgamNvcHlfc2FtcGxlX3Jvd3Mob3V0cHV0X2RhdGEsIG91dHJvdywgb3V0cHV0X2RhdGEsIG91dHJvdysxLAotCQkJdl9leHBhbmQtMSwgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0gICAgfQotICAgIGlucm93Kys7Ci0gICAgb3V0cm93ICs9IHZfZXhwYW5kOwotICB9Ci19Ci0KLQotLyoKLSAqIEZhc3QgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCi0gKiBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjFfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7Ci0gIEpTQU1QUk9XIG91dGVuZDsKLSAgaW50IGlucm93OwotCi0gIGZvciAoaW5yb3cgPSAwOyBpbnJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsgaW5yb3crKykgewotICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbaW5yb3ddOwotICAgIG91dGVuZCA9IG91dHB0ciArIGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gICAgd2hpbGUgKG91dHB0ciA8IG91dGVuZCkgewotICAgICAgaW52YWx1ZSA9ICppbnB0cisrOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCi0gICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOwotICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogRmFzdCBwcm9jZXNzaW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbC4KLSAqIEl0J3Mgc3RpbGwgYSBib3ggZmlsdGVyLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2Ml91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgaW52YWx1ZTsKLSAgSlNBTVBST1cgb3V0ZW5kOwotICBpbnQgaW5yb3csIG91dHJvdzsKLQotICBpbnJvdyA9IG91dHJvdyA9IDA7Ci0gIHdoaWxlIChvdXRyb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107Ci0gICAgb3V0ZW5kID0gb3V0cHRyICsgY2luZm8tPm91dHB1dF93aWR0aDsKLSAgICB3aGlsZSAob3V0cHRyIDwgb3V0ZW5kKSB7Ci0gICAgICBpbnZhbHVlID0gKmlucHRyKys7CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KLSAgICAgICpvdXRwdHIrKyA9IGludmFsdWU7Ci0gICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOwotICAgIH0KLSAgICBqY29weV9zYW1wbGVfcm93cyhvdXRwdXRfZGF0YSwgb3V0cm93LCBvdXRwdXRfZGF0YSwgb3V0cm93KzEsCi0JCSAgICAgIDEsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOwotICAgIGlucm93Kys7Ci0gICAgb3V0cm93ICs9IDI7Ci0gIH0KLX0KLQotCi0vKgotICogRmFuY3kgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCi0gKgotICogVGhlIHVwc2FtcGxpbmcgYWxnb3JpdGhtIGlzIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gcGl4ZWwgY2VudGVycywKLSAqIGFsc28ga25vd24gYXMgYSAidHJpYW5nbGUgZmlsdGVyIi4gIFRoaXMgaXMgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbgotICogc3BlZWQgYW5kIHZpc3VhbCBxdWFsaXR5LiAgVGhlIGNlbnRlcnMgb2YgdGhlIG91dHB1dCBwaXhlbHMgYXJlIDEvNCBhbmQgMy80Ci0gKiBvZiB0aGUgd2F5IGJldHdlZW4gaW5wdXQgcGl4ZWwgY2VudGVycy4KLSAqCi0gKiBBIG5vdGUgYWJvdXQgdGhlICJiaWFzIiBjYWxjdWxhdGlvbnM6IHdoZW4gcm91bmRpbmcgZnJhY3Rpb25hbCB2YWx1ZXMgdG8KLSAqIGludGVnZXIsIHdlIGRvIG5vdCB3YW50IHRvIGFsd2F5cyByb3VuZCAwLjUgdXAgdG8gdGhlIG5leHQgaW50ZWdlci4KLSAqIElmIHdlIGRpZCB0aGF0LCB3ZSdkIGludHJvZHVjZSBhIG5vdGljZWFibGUgYmlhcyB0b3dhcmRzIGxhcmdlciB2YWx1ZXMuCi0gKiBJbnN0ZWFkLCB0aGlzIGNvZGUgaXMgYXJyYW5nZWQgc28gdGhhdCAwLjUgd2lsbCBiZSByb3VuZGVkIHVwIG9yIGRvd24gYXQKLSAqIGFsdGVybmF0ZSBwaXhlbCBsb2NhdGlvbnMgKGEgc2ltcGxlIG9yZGVyZWQgZGl0aGVyIHBhdHRlcm4pLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2MV9mYW5jeV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQotewotICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgaW50IGludmFsdWU7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sY3RyOwotICBpbnQgaW5yb3c7Ci0KLSAgZm9yIChpbnJvdyA9IDA7IGlucm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOyBpbnJvdysrKSB7Ci0gICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtpbnJvd107Ci0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2x1bW4gKi8KLSAgICBpbnZhbHVlID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7Ci0gICAgKm91dHB0cisrID0gKEpTQU1QTEUpIGludmFsdWU7Ci0gICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cikgKyAyKSA+PiAyKTsKLQotICAgIGZvciAoY29sY3RyID0gY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggLSAyOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgewotICAgICAgLyogR2VuZXJhbCBjYXNlOiAzLzQgKiBuZWFyZXIgcGl4ZWwgKyAxLzQgKiBmdXJ0aGVyIHBpeGVsICovCi0gICAgICBpbnZhbHVlID0gR0VUSlNBTVBMRSgqaW5wdHIrKykgKiAzOwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSArIEdFVEpTQU1QTEUoaW5wdHJbLTJdKSArIDEpID4+IDIpOwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSArIEdFVEpTQU1QTEUoKmlucHRyKSArIDIpID4+IDIpOwotICAgIH0KLQotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbGFzdCBjb2x1bW4gKi8KLSAgICBpbnZhbHVlID0gR0VUSlNBTVBMRSgqaW5wdHIpOwotICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKiAzICsgR0VUSlNBTVBMRShpbnB0clstMV0pICsgMSkgPj4gMik7Ci0gICAgKm91dHB0cisrID0gKEpTQU1QTEUpIGludmFsdWU7Ci0gIH0KLX0KLQotCi0vKgotICogRmFuY3kgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCi0gKiBBZ2FpbiBhIHRyaWFuZ2xlIGZpbHRlcjsgc2VlIGNvbW1lbnRzIGZvciBoMnYxIGNhc2UsIGFib3ZlLgotICoKLSAqIEl0IGlzIE9LIGZvciB1cyB0byByZWZlcmVuY2UgdGhlIGFkamFjZW50IGlucHV0IHJvd3MgYmVjYXVzZSB3ZSBkZW1hbmRlZAotICogY29udGV4dCBmcm9tIHRoZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyIChzZWUgaW5pdGlhbGl6YXRpb24gY29kZSkuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYyX2ZhbmN5X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgb3V0cHRyOwotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0gIHJlZ2lzdGVyIGludCB0aGlzY29sc3VtLCBsYXN0Y29sc3VtLCBuZXh0Y29sc3VtOwotI2Vsc2UKLSAgcmVnaXN0ZXIgSU5UMzIgdGhpc2NvbHN1bSwgbGFzdGNvbHN1bSwgbmV4dGNvbHN1bTsKLSNlbmRpZgotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbGN0cjsKLSAgaW50IGlucm93LCBvdXRyb3csIHY7Ci0KLSAgaW5yb3cgPSBvdXRyb3cgPSAwOwotICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7Ci0gICAgZm9yICh2ID0gMDsgdiA8IDI7IHYrKykgewotICAgICAgLyogaW5wdHIwIHBvaW50cyB0byBuZWFyZXN0IGlucHV0IHJvdywgaW5wdHIxIHBvaW50cyB0byBuZXh0IG5lYXJlc3QgKi8KLSAgICAgIGlucHRyMCA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgICAgaWYgKHYgPT0gMCkJCS8qIG5leHQgbmVhcmVzdCBpcyByb3cgYWJvdmUgKi8KLQlpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93LTFdOwotICAgICAgZWxzZQkJCS8qIG5leHQgbmVhcmVzdCBpcyByb3cgYmVsb3cgKi8KLQlpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOwotICAgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93KytdOwotCi0gICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLwotICAgICAgdGhpc2NvbHN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgICBuZXh0Y29sc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspICogMyArIEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiA0ICsgOCkgPj4gNCk7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIG5leHRjb2xzdW0gKyA3KSA+PiA0KTsKLSAgICAgIGxhc3Rjb2xzdW0gPSB0aGlzY29sc3VtOyB0aGlzY29sc3VtID0gbmV4dGNvbHN1bTsKLQotICAgICAgZm9yIChjb2xjdHIgPSBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7Ci0JLyogR2VuZXJhbCBjYXNlOiAzLzQgKiBuZWFyZXIgcGl4ZWwgKyAxLzQgKiBmdXJ0aGVyIHBpeGVsIGluIGVhY2ggKi8KLQkvKiBkaW1lbnNpb24sIHRodXMgOS8xNiwgMy8xNiwgMy8xNiwgMS8xNiBvdmVyYWxsICovCi0JbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0JKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBsYXN0Y29sc3VtICsgOCkgPj4gNCk7Ci0JKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBuZXh0Y29sc3VtICsgNykgPj4gNCk7Ci0JbGFzdGNvbHN1bSA9IHRoaXNjb2xzdW07IHRoaXNjb2xzdW0gPSBuZXh0Y29sc3VtOwotICAgICAgfQotCi0gICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCi0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIGxhc3Rjb2xzdW0gKyA4KSA+PiA0KTsKLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiA0ICsgNykgPj4gNCk7Ci0gICAgfQotICAgIGlucm93Kys7Ci0gIH0KLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHVwc2FtcGxpbmcuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF91cHNhbXBsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZTsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgYm9vbGVhbiBuZWVkX2J1ZmZlciwgZG9fZmFuY3k7Ci0gIGludCBoX2luX2dyb3VwLCB2X2luX2dyb3VwLCBoX291dF9ncm91cCwgdl9vdXRfZ3JvdXA7Ci0KLSAgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X3Vwc2FtcGxlcikpOwotICBjaW5mby0+dXBzYW1wbGUgPSAoc3RydWN0IGpwZWdfdXBzYW1wbGVyICopIHVwc2FtcGxlOwotICB1cHNhbXBsZS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3Vwc2FtcGxlOwotICB1cHNhbXBsZS0+cHViLnVwc2FtcGxlID0gc2VwX3Vwc2FtcGxlOwotICB1cHNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gRkFMU0U7IC8qIHVudGlsIHdlIGZpbmQgb3V0IGRpZmZlcmVudGx5ICovCi0KLSAgaWYgKGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nKQkvKiB0aGlzIGlzbid0IHN1cHBvcnRlZCAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0NJUjYwMV9OT1RJTVBMKTsKLQotICAvKiBqZG1haW5jdC5jIGRvZXNuJ3Qgc3VwcG9ydCBjb250ZXh0IHJvd3Mgd2hlbiBtaW5fRENUX3NjYWxlZF9zaXplID0gMSwKLSAgICogc28gZG9uJ3QgYXNrIGZvciBpdC4KLSAgICovCi0gIGRvX2ZhbmN5ID0gY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgJiYgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPiAxOwotCi0gIC8qIFZlcmlmeSB3ZSBjYW4gaGFuZGxlIHRoZSBzYW1wbGluZyBmYWN0b3JzLCBzZWxlY3QgcGVyLWNvbXBvbmVudCBtZXRob2RzLAotICAgKiBhbmQgY3JlYXRlIHN0b3JhZ2UgYXMgbmVlZGVkLgotICAgKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBDb21wdXRlIHNpemUgb2YgYW4gImlucHV0IGdyb3VwIiBhZnRlciBJRENUIHNjYWxpbmcuICBUaGlzIG1hbnkgc2FtcGxlcwotICAgICAqIGFyZSB0byBiZSBjb252ZXJ0ZWQgdG8gbWF4X2hfc2FtcF9mYWN0b3IgKiBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbHMuCi0gICAgICovCi0gICAgaF9pbl9ncm91cCA9IChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCi0JCSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAgICB2X2luX2dyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KLQkJIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICAgIGhfb3V0X2dyb3VwID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yOwotICAgIHZfb3V0X2dyb3VwID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotICAgIHVwc2FtcGxlLT5yb3dncm91cF9oZWlnaHRbY2ldID0gdl9pbl9ncm91cDsgLyogc2F2ZSBmb3IgdXNlIGxhdGVyICovCi0gICAgbmVlZF9idWZmZXIgPSBUUlVFOwotICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpIHsKLSAgICAgIC8qIERvbid0IGJvdGhlciB0byB1cHNhbXBsZSBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KLSAgICAgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IG5vb3BfdXBzYW1wbGU7Ci0gICAgICBuZWVkX2J1ZmZlciA9IEZBTFNFOwotICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCA9PSBoX291dF9ncm91cCAmJiB2X2luX2dyb3VwID09IHZfb3V0X2dyb3VwKSB7Ci0gICAgICAvKiBGdWxsc2l6ZSBjb21wb25lbnRzIGNhbiBiZSBwcm9jZXNzZWQgd2l0aG91dCBhbnkgd29yay4gKi8KLSAgICAgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGZ1bGxzaXplX3Vwc2FtcGxlOwotICAgICAgbmVlZF9idWZmZXIgPSBGQUxTRTsKLSAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgKiAyID09IGhfb3V0X2dyb3VwICYmCi0JICAgICAgIHZfaW5fZ3JvdXAgPT0gdl9vdXRfZ3JvdXApIHsKLSAgICAgIC8qIFNwZWNpYWwgY2FzZXMgZm9yIDJoMXYgdXBzYW1wbGluZyAqLwotICAgICAgaWYgKGRvX2ZhbmN5ICYmIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID4gMikKLQl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYxX2ZhbmN5X3Vwc2FtcGxlOwotICAgICAgZWxzZQotCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfdXBzYW1wbGU7Ci0gICAgfSBlbHNlIGlmIChoX2luX2dyb3VwICogMiA9PSBoX291dF9ncm91cCAmJgotCSAgICAgICB2X2luX2dyb3VwICogMiA9PSB2X291dF9ncm91cCkgewotICAgICAgLyogU3BlY2lhbCBjYXNlcyBmb3IgMmgydiB1cHNhbXBsaW5nICovCi0gICAgICBpZiAoZG9fZmFuY3kgJiYgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPiAyKSB7Ci0JdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml9mYW5jeV91cHNhbXBsZTsKLQl1cHNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKLSAgICAgIH0gZWxzZQotCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfdXBzYW1wbGU7Ci0gICAgfSBlbHNlIGlmICgoaF9vdXRfZ3JvdXAgJSBoX2luX2dyb3VwKSA9PSAwICYmCi0JICAgICAgICh2X291dF9ncm91cCAlIHZfaW5fZ3JvdXApID09IDApIHsKLSAgICAgIC8qIEdlbmVyaWMgaW50ZWdyYWwtZmFjdG9ycyB1cHNhbXBsaW5nIG1ldGhvZCAqLwotICAgICAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaW50X3Vwc2FtcGxlOwotICAgICAgdXBzYW1wbGUtPmhfZXhwYW5kW2NpXSA9IChVSU5UOCkgKGhfb3V0X2dyb3VwIC8gaF9pbl9ncm91cCk7Ci0gICAgICB1cHNhbXBsZS0+dl9leHBhbmRbY2ldID0gKFVJTlQ4KSAodl9vdXRfZ3JvdXAgLyB2X2luX2dyb3VwKTsKLSAgICB9IGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRlJBQ1RfU0FNUExFX05PVElNUEwpOwotICAgIGlmIChuZWVkX2J1ZmZlcikgewotICAgICAgdXBzYW1wbGUtPmNvbG9yX2J1ZltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoLAotCQkJCShsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpLAotCSAoSkRJTUVOU0lPTikgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkdHJhbnMuYyBiL2xpYmpwZWd0d3JwL2pkdHJhbnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2ZTE3MC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZHRyYW5zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoKLSAqIGpkdHJhbnMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGRlY29tcHJlc3Npb24sCi0gKiB0aGF0IGlzLCByZWFkaW5nIHJhdyBEQ1QgY29lZmZpY2llbnQgYXJyYXlzIGZyb20gYW4gaW5wdXQgSlBFRyBmaWxlLgotICogVGhlIHJvdXRpbmVzIGluIGpkYXBpbWluLmMgd2lsbCBhbHNvIGJlIG5lZWRlZCBieSBhIHRyYW5zY29kZXIuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1MT0NBTCh2b2lkKSB0cmFuc2RlY29kZV9tYXN0ZXJfc2VsZWN0aW9uIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0KLS8qCi0gKiBSZWFkIHRoZSBjb2VmZmljaWVudCBhcnJheXMgZnJvbSBhIEpQRUcgZmlsZS4KLSAqIGpwZWdfcmVhZF9oZWFkZXIgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KLSAqCi0gKiBUaGUgZW50aXJlIGltYWdlIGlzIHJlYWQgaW50byBhIHNldCBvZiB2aXJ0dWFsIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cywKLSAqIG9uZSBwZXIgY29tcG9uZW50LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mCi0gKiB2aXJ0dWFsLWFycmF5IGRlc2NyaXB0b3JzLiAgVGhlc2UgY2FuIGJlIG1hbmlwdWxhdGVkIGRpcmVjdGx5IHZpYSB0aGUKLSAqIEpQRUcgbWVtb3J5IG1hbmFnZXIsIG9yIGhhbmRlZCBvZmYgdG8ganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KLSAqIFRvIHJlbGVhc2UgdGhlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgdmlydHVhbCBhcnJheXMsIGNhbGwKLSAqIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSB3aGVuIGRvbmUgd2l0aCB0aGUgZGF0YS4KLSAqCi0gKiBBbiBhbHRlcm5hdGl2ZSB1c2FnZSBpcyB0byBzaW1wbHkgb2J0YWluIGFjY2VzcyB0byB0aGUgY29lZmZpY2llbnQgYXJyYXlzCi0gKiBkdXJpbmcgYSBidWZmZXJlZC1pbWFnZS1tb2RlIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uLiAgVGhpcyBpcyBhbGxvd2VkCi0gKiBhZnRlciBhbnkganBlZ19maW5pc2hfb3V0cHV0KCkgY2FsbC4gIFRoZSBhcnJheXMgY2FuIGJlIGFjY2Vzc2VkIHVudGlsCi0gKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgaXMgY2FsbGVkLiAgKE5vdGUgdGhhdCBhbnkgY2FsbCB0byB0aGUgbGlicmFyeQotICogbWF5IHJlcG9zaXRpb24gdGhlIGFycmF5cywgc28gZG9uJ3QgcmVseSBvbiBhY2Nlc3NfdmlydF9iYXJyYXkoKSByZXN1bHRzCi0gKiB0byBzdGF5IHZhbGlkIGFjcm9zcyBsaWJyYXJ5IGNhbGxzLikKLSAqCi0gKiBSZXR1cm5zIE5VTEwgaWYgc3VzcGVuZGVkLiAgVGhpcyBjYXNlIG5lZWQgYmUgY2hlY2tlZCBvbmx5IGlmCi0gKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4KLSAqLwotCi1HTE9CQUwoanZpcnRfYmFycmF5X3B0ciAqKQotanBlZ19yZWFkX2NvZWZmaWNpZW50cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JFQURZKSB7Ci0gICAgLyogRmlyc3QgY2FsbDogaW5pdGlhbGl6ZSBhY3RpdmUgbW9kdWxlcyAqLwotICAgIHRyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8pOwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfUkRDT0VGUzsKLSAgfQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkRDT0VGUykgewotICAgIC8qIEFic29yYiB3aG9sZSBmaWxlIGludG8gdGhlIGNvZWYgYnVmZmVyICovCi0gICAgZm9yICg7OykgewotICAgICAgaW50IHJldGNvZGU7Ci0gICAgICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCi0gICAgICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgLyogQWJzb3JiIHNvbWUgbW9yZSBpbnB1dCAqLwotICAgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOwotICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19TVVNQRU5ERUQpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX0VPSSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICAvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KLSAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCAmJgotCSAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKLSAgICAgICAgaWYgKCsrY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPj0gY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0KSB7Ci0JICAvKiBzdGFydHVwIHVuZGVyZXN0aW1hdGVkIG51bWJlciBvZiBzY2FuczsgcmF0Y2hldCB1cCBvbmUgc2NhbiAqLwotICAgICAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgKz0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLyogU2V0IHN0YXRlIHNvIHRoYXQganBlZ19maW5pc2hfZGVjb21wcmVzcyBkb2VzIHRoZSByaWdodCB0aGluZyAqLwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RPUFBJTkc7Ci0gIH0KLSAgLyogQXQgdGhpcyBwb2ludCB3ZSBzaG91bGQgYmUgaW4gc3RhdGUgRFNUQVRFX1NUT1BQSU5HIGlmIGJlaW5nIHVzZWQKLSAgICogc3RhbmRhbG9uZSwgb3IgaW4gc3RhdGUgRFNUQVRFX0JVRklNQUdFIGlmIGJlaW5nIGludm9rZWQgdG8gZ2V0IGFjY2VzcwotICAgKiB0byB0aGUgY29lZmZpY2llbnRzIGR1cmluZyBhIGZ1bGwgYnVmZmVyZWQtaW1hZ2UtbW9kZSBkZWNvbXByZXNzaW9uLgotICAgKi8KLSAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TVE9QUElORyB8fAotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX0JVRklNQUdFKSAmJiBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKLSAgICByZXR1cm4gY2luZm8tPmNvZWYtPmNvZWZfYXJyYXlzOwotICB9Ci0gIC8qIE9vcHMsIGltcHJvcGVyIHVzYWdlICovCi0gIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIHJldHVybiBOVUxMOwkJCS8qIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KLX0KLQotTE9DQUwoYm9vbGVhbikKLWpwZWdfYnVpbGRfaHVmZm1hbl9pbmRleF9wcm9ncmVzc2l2ZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCkKLXsKLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JFQURZKSB7Ci0gICAgcHJpbnRmKCJQcm9ncmVzc2l2ZSBNb2RlXG4iKTsKLSAgICAvKiBGaXJzdCBjYWxsOiBpbml0aWFsaXplIGFjdGl2ZSBtb2R1bGVzICovCi0gICAgdHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbihjaW5mbyk7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRENPRUZTOwotICB9Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRENPRUZTKSB7Ci0gICAgdW5zaWduZWQgaW50IG1jdTsKLSAgICBpbnQgaTsKLSAgICBjaW5mby0+bWFya2VyLT5nZXRfc29zX21hcmtlcl9wb3NpdGlvbihjaW5mbywgaW5kZXgpOwotCi0gICAgLyogQWJzb3JiIHdob2xlIGZpbGUgaW50byB0aGUgY29lZiBidWZmZXIgKi8KLSAgICBmb3IgKG1jdSA9IDA7IG1jdSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7IG1jdSsrKSB7Ci0gICAgICBpbnQgcmV0Y29kZSA9IDA7Ci0gICAgICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCi0gICAgICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgLyogQWJzb3JiIHNvbWUgbW9yZSBpbnB1dCAqLwotICAgICAgamluaXRfcGh1ZmZfZGVjb2RlcihjaW5mbyk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZXgtPnNjYW5fY291bnQ7IGkrKykgewotICAgICAgICAoKmNpbmZvLT5pbnB1dGN0bC0+ZmluaXNoX2lucHV0X3Bhc3MpIChjaW5mbyk7Ci0gICAgICAgIGpzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGNpbmZvLCBpbmRleC0+c2NhbltpXS5iaXRzdHJlYW1fb2Zmc2V0KTsKLSAgICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwotICAgICAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXRfYnVpbGRfaHVmZm1hbl9pbmRleCkKLSAgICAgICAgICAgICAgICAgICAgKGNpbmZvLCBpbmRleCwgaSk7Ci0gICAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA9IG1jdTsKLSAgICAgICAgaWYgKG1jdSAhPSAwKQotICAgICAgICAgICgqY2luZm8tPmVudHJvcHktPmNvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIpCi0gICAgICAgICAgICAgICAgKGNpbmZvLCBpbmRleC0+c2NhbltpXS5wcmV2X01DVV9vZmZzZXQpOwotICAgICAgICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSBpOwotICAgICAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXRfYnVpbGRfaHVmZm1hbl9pbmRleCkKLSAgICAgICAgICAgICAgICAgICAgKGNpbmZvLCBpbmRleCwgaSk7Ci0gICAgICB9Ci0gICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1NVU1BFTkRFRCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX0VPSSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICAvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KLSAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCAmJgotCSAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKLSAgICAgICAgaWYgKCsrY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPj0gY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0KSB7Ci0JICAvKiBzdGFydHVwIHVuZGVyZXN0aW1hdGVkIG51bWJlciBvZiBzY2FuczsgcmF0Y2hldCB1cCBvbmUgc2NhbiAqLwotICAgICAgICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCArPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOwotICB9Ci0gIC8qIEF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGJlIGluIHN0YXRlIERTVEFURV9TVE9QUElORyBpZiBiZWluZyB1c2VkCi0gICAqIHN0YW5kYWxvbmUsIG9yIGluIHN0YXRlIERTVEFURV9CVUZJTUFHRSBpZiBiZWluZyBpbnZva2VkIHRvIGdldCBhY2Nlc3MKLSAgICogdG8gdGhlIGNvZWZmaWNpZW50cyBkdXJpbmcgYSBmdWxsIGJ1ZmZlcmVkLWltYWdlLW1vZGUgZGVjb21wcmVzc2lvbi4KLSAgICovCi0gIGlmICgoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfU1RPUFBJTkcgfHwKLSAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9CVUZJTUFHRSkgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7Ci0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KLSAgLyogT29wcywgaW1wcm9wZXIgdXNhZ2UgKi8KLSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgcmV0dXJuIEZBTFNFOwkJCS8qIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KLX0KLQotTE9DQUwoYm9vbGVhbikKLWpwZWdfYnVpbGRfaHVmZm1hbl9pbmRleF9iYXNlbGluZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX2luZGV4ICppbmRleCkKLXsKLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JFQURZKSB7Ci0gICAgcHJpbnRmKCJCYXNlbGluZSBNb2RlXG4iKTsKLSAgICAvKiBGaXJzdCBjYWxsOiBpbml0aWFsaXplIGFjdGl2ZSBtb2R1bGVzICovCi0gICAgdHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbihjaW5mbyk7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRENPRUZTOwotICB9Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRENPRUZTKSB7Ci0gICAgLyogQWJzb3JiIHdob2xlIGZpbGUgaW50byB0aGUgY29lZiBidWZmZXIgKi8KLSAgICBmb3IgKDs7KSB7Ci0gICAgICBpbnQgcmV0Y29kZTsKLSAgICAgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KLSAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkKLSAgICAgICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICAvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCi0gICAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXRfYnVpbGRfaHVmZm1hbl9pbmRleCkKLSAgICAgICAgICAgICAgICAgICAgKGNpbmZvLCBpbmRleCwgMCk7Ci0gICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1NVU1BFTkRFRCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX0VPSSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1NDQU5fQ09NUExFVEVEKQotICAgICAgICBicmVhazsKLQotICAgICAgLyogQWR2YW5jZSBwcm9ncmVzcyBjb3VudGVyIGlmIGFwcHJvcHJpYXRlICovCi0gICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYKLQkgIChyZXRjb2RlID09IEpQRUdfUk9XX0NPTVBMRVRFRCB8fCByZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpKSB7Ci0gICAgICAgIGlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgewotCSAgLyogc3RhcnR1cCB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KLSAgICAgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ICs9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIFNldCBzdGF0ZSBzbyB0aGF0IGpwZWdfZmluaXNoX2RlY29tcHJlc3MgZG9lcyB0aGUgcmlnaHQgdGhpbmcgKi8KLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOwotICB9Ci0gIC8qIEF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGJlIGluIHN0YXRlIERTVEFURV9TVE9QUElORyBpZiBiZWluZyB1c2VkCi0gICAqIHN0YW5kYWxvbmUsIG9yIGluIHN0YXRlIERTVEFURV9CVUZJTUFHRSBpZiBiZWluZyBpbnZva2VkIHRvIGdldCBhY2Nlc3MKLSAgICogdG8gdGhlIGNvZWZmaWNpZW50cyBkdXJpbmcgYSBmdWxsIGJ1ZmZlcmVkLWltYWdlLW1vZGUgZGVjb21wcmVzc2lvbi4KLSAgICovCi0gIGlmICgoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfU1RPUFBJTkcgfHwKLSAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9CVUZJTUFHRSkgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7Ci0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KLSAgLyogT29wcywgaW1wcm9wZXIgdXNhZ2UgKi8KLSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgcmV0dXJuIEZBTFNFOwkJCS8qIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KLX0KLQotR0xPQkFMKGJvb2xlYW4pCi1qcGVnX2J1aWxkX2h1ZmZtYW5faW5kZXgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9pbmRleCAqaW5kZXgpCi17Ci0gICAgY2luZm8tPnRpbGVfZGVjb2RlID0gVFJVRTsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCi0gICAgICByZXR1cm4ganBlZ19idWlsZF9odWZmbWFuX2luZGV4X3Byb2dyZXNzaXZlKGNpbmZvLCBpbmRleCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGpwZWdfYnVpbGRfaHVmZm1hbl9pbmRleF9iYXNlbGluZShjaW5mbywgaW5kZXgpOwotfQotCi0vKgotICogTWFzdGVyIHNlbGVjdGlvbiBvZiBkZWNvbXByZXNzaW9uIG1vZHVsZXMgZm9yIHRyYW5zY29kaW5nLgotICogVGhpcyBzdWJzdGl0dXRlcyBmb3IgamRtYXN0ZXIuYydzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmdWxsIGRlY29tcHJlc3Nvci4KLSAqLwotCi1MT0NBTCh2b2lkKQotdHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgLyogVGhpcyBpcyBlZmZlY3RpdmVseSBhIGJ1ZmZlcmVkLWltYWdlIG9wZXJhdGlvbi4gKi8KLSAgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlID0gVFJVRTsKLQotICAvKiBFbnRyb3B5IGRlY29kaW5nOiBlaXRoZXIgSHVmZm1hbiBvciBhcml0aG1ldGljIGNvZGluZy4gKi8KLSAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9BUklUSF9OT1RJTVBMKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSNpZmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgICAgamluaXRfcGh1ZmZfZGVjb2RlcihjaW5mbyk7Ci0jZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSAgICAgIGppbml0X2h1ZmZfZGVjb2RlcihjaW5mbyk7Ci0gICAgfQotICB9Ci0KLSAgLyogQWx3YXlzIGdldCBhIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyLiAqLwotICBqaW5pdF9kX2NvZWZfY29udHJvbGxlcihjaW5mbywgVFJVRSk7Ci0KLSAgLyogV2UgY2FuIG5vdyB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSB2aXJ0dWFsIGFycmF5cy4gKi8KLSAgKCpjaW5mby0+bWVtLT5yZWFsaXplX3ZpcnRfYXJyYXlzKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotCi0gIC8qIEluaXRpYWxpemUgaW5wdXQgc2lkZSBvZiBkZWNvbXByZXNzb3IgdG8gY29uc3VtZSBmaXJzdCBzY2FuLiAqLwotICAoKmNpbmZvLT5pbnB1dGN0bC0+c3RhcnRfaW5wdXRfcGFzcykgKGNpbmZvKTsKLQotICAvKiBJbml0aWFsaXplIHByb2dyZXNzIG1vbml0b3JpbmcuICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGludCBuc2NhbnM7Ci0gICAgLyogRXN0aW1hdGUgbnVtYmVyIG9mIHNjYW5zIHRvIHNldCBwYXNzX2xpbWl0LiAqLwotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotICAgICAgLyogQXJiaXRyYXJpbHkgZXN0aW1hdGUgMiBpbnRlcmxlYXZlZCBEQyBzY2FucyArIDMgQUMgc2NhbnMvY29tcG9uZW50LiAqLwotICAgICAgbnNjYW5zID0gMiArIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgfSBlbHNlIGlmIChjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgewotICAgICAgLyogRm9yIGEgbm9ucHJvZ3Jlc3NpdmUgbXVsdGlzY2FuIGZpbGUsIGVzdGltYXRlIDEgc2NhbiBwZXIgY29tcG9uZW50LiAqLwotICAgICAgbnNjYW5zID0gY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgIH0gZWxzZSB7Ci0gICAgICBuc2NhbnMgPSAxOwotICAgIH0KLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IDBMOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzICogbnNjYW5zOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+Y29tcGxldGVkX3Bhc3NlcyA9IDA7Ci0gICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgPSAxOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZXJyb3IuYyBiL2xpYmpwZWd0d3JwL2plcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE3YmU4Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2plcnJvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qCi0gKiBqZXJyb3IuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHNpbXBsZSBlcnJvci1yZXBvcnRpbmcgYW5kIHRyYWNlLW1lc3NhZ2Ugcm91dGluZXMuCi0gKiBUaGVzZSBhcmUgc3VpdGFibGUgZm9yIFVuaXgtbGlrZSBzeXN0ZW1zIGFuZCBvdGhlcnMgd2hlcmUgd3JpdGluZyB0bwotICogc3RkZXJyIGlzIHRoZSByaWdodCB0aGluZyB0byBkby4gIE1hbnkgYXBwbGljYXRpb25zIHdpbGwgd2FudCB0byByZXBsYWNlCi0gKiBzb21lIG9yIGFsbCBvZiB0aGVzZSByb3V0aW5lcy4KLSAqCi0gKiBJZiB5b3UgZGVmaW5lIFVTRV9XSU5ET1dTX01FU1NBR0VCT1ggaW4gamNvbmZpZy5oIG9yIGluIHRoZSBtYWtlZmlsZSwKLSAqIHlvdSBnZXQgYSBXaW5kb3dzLXNwZWNpZmljIGhhY2sgdG8gZGlzcGxheSBlcnJvciBtZXNzYWdlcyBpbiBhIGRpYWxvZyBib3guCi0gKiBJdCBhaW4ndCBtdWNoLCBidXQgaXQgYmVhdHMgZHJvcHBpbmcgZXJyb3IgbWVzc2FnZXMgaW50byB0aGUgYml0IGJ1Y2tldCwKLSAqIHdoaWNoIGlzIHdoYXQgaGFwcGVucyB0byBvdXRwdXQgdG8gc3RkZXJyIHVuZGVyIG1vc3QgV2luZG93cyBDIGNvbXBpbGVycy4KLSAqCi0gKiBUaGVzZSByb3V0aW5lcyBhcmUgdXNlZCBieSBib3RoIHRoZSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjb2RlLgotICovCi0KLS8qIHRoaXMgaXMgbm90IGEgY29yZSBsaWJyYXJ5IG1vZHVsZSwgc28gaXQgZG9lc24ndCBkZWZpbmUgSlBFR19JTlRFUk5BTFMgKi8KLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqdmVyc2lvbi5oIgotI2luY2x1ZGUgImplcnJvci5oIgotCi0jaWZkZWYgVVNFX1dJTkRPV1NfTUVTU0FHRUJPWAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi0jaWZuZGVmIEVYSVRfRkFJTFVSRQkJLyogZGVmaW5lIGV4aXQoKSBjb2RlcyBpZiBub3QgcHJvdmlkZWQgKi8KLSNkZWZpbmUgRVhJVF9GQUlMVVJFICAxCi0jZW5kaWYKLQotCi0vKgotICogQ3JlYXRlIHRoZSBtZXNzYWdlIHN0cmluZyB0YWJsZS4KLSAqIFdlIGRvIHRoaXMgZnJvbSB0aGUgbWFzdGVyIG1lc3NhZ2UgbGlzdCBpbiBqZXJyb3IuaCBieSByZS1yZWFkaW5nCi0gKiBqZXJyb3IuaCB3aXRoIGEgc3VpdGFibGUgZGVmaW5pdGlvbiBmb3IgbWFjcm8gSk1FU1NBR0UuCi0gKiBUaGUgbWVzc2FnZSB0YWJsZSBpcyBtYWRlIGFuIGV4dGVybmFsIHN5bWJvbCBqdXN0IGluIGNhc2UgYW55IGFwcGxpY2F0aW9ucwotICogd2FudCB0byByZWZlciB0byBpdCBkaXJlY3RseS4KLSAqLwotCi0jaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI2RlZmluZSBqcGVnX3N0ZF9tZXNzYWdlX3RhYmxlCWpNc2dUYWJsZQotI2VuZGlmCi0KLSNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCXN0cmluZyAsCi0KLWNvbnN0IGNoYXIgKiBjb25zdCBqcGVnX3N0ZF9tZXNzYWdlX3RhYmxlW10gPSB7Ci0jaW5jbHVkZSAiamVycm9yLmgiCi0gIE5VTEwKLX07Ci0KLQotLyoKLSAqIEVycm9yIGV4aXQgaGFuZGxlcjogbXVzdCBub3QgcmV0dXJuIHRvIGNhbGxlci4KLSAqCi0gKiBBcHBsaWNhdGlvbnMgbWF5IG92ZXJyaWRlIHRoaXMgaWYgdGhleSB3YW50IHRvIGdldCBjb250cm9sIGJhY2sgYWZ0ZXIKLSAqIGFuIGVycm9yLiAgVHlwaWNhbGx5IG9uZSB3b3VsZCBsb25nam1wIHNvbWV3aGVyZSBpbnN0ZWFkIG9mIGV4aXRpbmcuCi0gKiBUaGUgc2V0am1wIGJ1ZmZlciBjYW4gYmUgbWFkZSBhIHByaXZhdGUgZmllbGQgd2l0aGluIGFuIGV4cGFuZGVkIGVycm9yCi0gKiBoYW5kbGVyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGUgaW5mbyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZQotICogaXMgc3RvcmVkIGluIHRoZSBlcnJvciBvYmplY3QsIHNvIHlvdSBjYW4gZ2VuZXJhdGUgdGhlIG1lc3NhZ2Ugbm93IG9yCi0gKiBsYXRlciwgYXQgeW91ciBjb252ZW5pZW5jZS4KLSAqIFlvdSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlIEpQRUcgb2JqZWN0IGlzIGNsZWFuZWQgdXAgKHdpdGgganBlZ19hYm9ydAotICogb3IganBlZ19kZXN0cm95KSBhdCBzb21lIHBvaW50LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZXJyb3JfZXhpdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBBbHdheXMgZGlzcGxheSB0aGUgbWVzc2FnZSAqLwotICAoKmNpbmZvLT5lcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOwotCi0gIC8qIExldCB0aGUgbWVtb3J5IG1hbmFnZXIgZGVsZXRlIGFueSB0ZW1wIGZpbGVzIGJlZm9yZSB3ZSBkaWUgKi8KLSAganBlZ19kZXN0cm95KGNpbmZvKTsKLQotICBleGl0KEVYSVRfRkFJTFVSRSk7Ci19Ci0KLQotLyoKLSAqIEFjdHVhbCBvdXRwdXQgb2YgYW4gZXJyb3Igb3IgdHJhY2UgbWVzc2FnZS4KLSAqIEFwcGxpY2F0aW9ucyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gc2VuZCBKUEVHIG1lc3NhZ2VzIHNvbWV3aGVyZQotICogb3RoZXIgdGhhbiBzdGRlcnIuCi0gKgotICogT24gV2luZG93cywgcHJpbnRpbmcgdG8gc3RkZXJyIGlzIGdlbmVyYWxseSBjb21wbGV0ZWx5IHVzZWxlc3MsCi0gKiBzbyB3ZSBwcm92aWRlIG9wdGlvbmFsIGNvZGUgdG8gcHJvZHVjZSBhbiBlcnJvci1kaWFsb2cgcG9wdXAuCi0gKiBNb3N0IFdpbmRvd3MgYXBwbGljYXRpb25zIHdpbGwgc3RpbGwgcHJlZmVyIHRvIG92ZXJyaWRlIHRoaXMgcm91dGluZSwKLSAqIGJ1dCBpZiB0aGV5IGRvbid0LCBpdCdsbCBkbyBzb21ldGhpbmcgYXQgbGVhc3QgbWFyZ2luYWxseSB1c2VmdWwuCi0gKgotICogTk9URTogdG8gdXNlIHRoZSBsaWJyYXJ5IGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoZQotICogQyBzdGRpbyBsaWJyYXJ5LCB5b3UgbWF5IGhhdmUgdG8gZGVsZXRlIHRoZSBjYWxsIHRvIGZwcmludGYoKSBlbnRpcmVseSwKLSAqIG5vdCBqdXN0IG5vdCB1c2UgdGhpcyByb3V0aW5lLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotb3V0cHV0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgY2hhciBidWZmZXJbSk1TR19MRU5HVEhfTUFYXTsKLQotICAvKiBDcmVhdGUgdGhlIG1lc3NhZ2UgKi8KLSAgKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkgKGNpbmZvLCBidWZmZXIpOwotCi0jaWZkZWYgVVNFX1dJTkRPV1NfTUVTU0FHRUJPWAotICAvKiBEaXNwbGF5IGl0IGluIGEgbWVzc2FnZSBkaWFsb2cgYm94ICovCi0gIE1lc3NhZ2VCb3goR2V0QWN0aXZlV2luZG93KCksIGJ1ZmZlciwgIkpQRUcgTGlicmFyeSBFcnJvciIsCi0JICAgICBNQl9PSyB8IE1CX0lDT05FUlJPUik7Ci0jZWxzZQotICAvKiBTZW5kIGl0IHRvIHN0ZGVyciwgYWRkaW5nIGEgbmV3bGluZSAqLwotICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBidWZmZXIpOwotI2VuZGlmCi19Ci0KLQotLyoKLSAqIERlY2lkZSB3aGV0aGVyIHRvIGVtaXQgYSB0cmFjZSBvciB3YXJuaW5nIG1lc3NhZ2UuCi0gKiBtc2dfbGV2ZWwgaXMgb25lIG9mOgotICogICAtMTogcmVjb3ZlcmFibGUgY29ycnVwdC1kYXRhIHdhcm5pbmcsIG1heSB3YW50IHRvIGFib3J0LgotICogICAgMDogaW1wb3J0YW50IGFkdmlzb3J5IG1lc3NhZ2VzIChhbHdheXMgZGlzcGxheSB0byB1c2VyKS4KLSAqICAgIDE6IGZpcnN0IGxldmVsIG9mIHRyYWNpbmcgZGV0YWlsLgotICogICAgMiwzLC4uLjogc3VjY2Vzc2l2ZWx5IG1vcmUgZGV0YWlsZWQgdHJhY2luZyBtZXNzYWdlcy4KLSAqIEFuIGFwcGxpY2F0aW9uIG1pZ2h0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIGl0IHdhbnRlZCB0byBhYm9ydCBvbiB3YXJuaW5ncwotICogb3IgY2hhbmdlIHRoZSBwb2xpY3kgYWJvdXQgd2hpY2ggbWVzc2FnZXMgdG8gZGlzcGxheS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWVtaXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgbXNnX2xldmVsKQotewotICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOwotCi0gIGlmIChtc2dfbGV2ZWwgPCAwKSB7Ci0gICAgLyogSXQncyBhIHdhcm5pbmcgbWVzc2FnZS4gIFNpbmNlIGNvcnJ1cHQgZmlsZXMgbWF5IGdlbmVyYXRlIG1hbnkgd2FybmluZ3MsCi0gICAgICogdGhlIHBvbGljeSBpbXBsZW1lbnRlZCBoZXJlIGlzIHRvIHNob3cgb25seSB0aGUgZmlyc3Qgd2FybmluZywKLSAgICAgKiB1bmxlc3MgdHJhY2VfbGV2ZWwgPj0gMy4KLSAgICAgKi8KLSAgICBpZiAoZXJyLT5udW1fd2FybmluZ3MgPT0gMCB8fCBlcnItPnRyYWNlX2xldmVsID49IDMpCi0gICAgICAoKmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7Ci0gICAgLyogQWx3YXlzIGNvdW50IHdhcm5pbmdzIGluIG51bV93YXJuaW5ncy4gKi8KLSAgICBlcnItPm51bV93YXJuaW5ncysrOwotICB9IGVsc2UgewotICAgIC8qIEl0J3MgYSB0cmFjZSBtZXNzYWdlLiAgU2hvdyBpdCBpZiB0cmFjZV9sZXZlbCA+PSBtc2dfbGV2ZWwuICovCi0gICAgaWYgKGVyci0+dHJhY2VfbGV2ZWwgPj0gbXNnX2xldmVsKQotICAgICAgKCplcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOwotICB9Ci19Ci0KLQotLyoKLSAqIEZvcm1hdCBhIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGUgbW9zdCByZWNlbnQgSlBFRyBlcnJvciBvciBtZXNzYWdlLgotICogVGhlIG1lc3NhZ2UgaXMgc3RvcmVkIGludG8gYnVmZmVyLCB3aGljaCBzaG91bGQgYmUgYXQgbGVhc3QgSk1TR19MRU5HVEhfTUFYCi0gKiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0IG5vICdcbicgY2hhcmFjdGVyIGlzIGFkZGVkIHRvIHRoZSBzdHJpbmcuCi0gKiBGZXcgYXBwbGljYXRpb25zIHNob3VsZCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZm9ybWF0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgY2hhciAqIGJ1ZmZlcikKLXsKLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKLSAgaW50IG1zZ19jb2RlID0gZXJyLT5tc2dfY29kZTsKLSAgY29uc3QgY2hhciAqIG1zZ3RleHQgPSBOVUxMOwotICBjb25zdCBjaGFyICogbXNncHRyOwotICBjaGFyIGNoOwotICBib29sZWFuIGlzc3RyaW5nOwotCi0gIC8qIExvb2sgdXAgbWVzc2FnZSBzdHJpbmcgaW4gcHJvcGVyIHRhYmxlICovCi0gIGlmIChtc2dfY29kZSA+IDAgJiYgbXNnX2NvZGUgPD0gZXJyLT5sYXN0X2pwZWdfbWVzc2FnZSkgewotICAgIG1zZ3RleHQgPSBlcnItPmpwZWdfbWVzc2FnZV90YWJsZVttc2dfY29kZV07Ci0gIH0gZWxzZSBpZiAoZXJyLT5hZGRvbl9tZXNzYWdlX3RhYmxlICE9IE5VTEwgJiYKLQkgICAgIG1zZ19jb2RlID49IGVyci0+Zmlyc3RfYWRkb25fbWVzc2FnZSAmJgotCSAgICAgbXNnX2NvZGUgPD0gZXJyLT5sYXN0X2FkZG9uX21lc3NhZ2UpIHsKLSAgICBtc2d0ZXh0ID0gZXJyLT5hZGRvbl9tZXNzYWdlX3RhYmxlW21zZ19jb2RlIC0gZXJyLT5maXJzdF9hZGRvbl9tZXNzYWdlXTsKLSAgfQotCi0gIC8qIERlZmVuZCBhZ2FpbnN0IGJvZ3VzIG1lc3NhZ2UgbnVtYmVyICovCi0gIGlmIChtc2d0ZXh0ID09IE5VTEwpIHsKLSAgICBlcnItPm1zZ19wYXJtLmlbMF0gPSBtc2dfY29kZTsKLSAgICBtc2d0ZXh0ID0gZXJyLT5qcGVnX21lc3NhZ2VfdGFibGVbMF07Ci0gIH0KLQotICAvKiBDaGVjayBmb3Igc3RyaW5nIHBhcmFtZXRlciwgYXMgaW5kaWNhdGVkIGJ5ICVzIGluIHRoZSBtZXNzYWdlIHRleHQgKi8KLSAgaXNzdHJpbmcgPSBGQUxTRTsKLSAgbXNncHRyID0gbXNndGV4dDsKLSAgd2hpbGUgKChjaCA9ICptc2dwdHIrKykgIT0gJ1wwJykgewotICAgIGlmIChjaCA9PSAnJScpIHsKLSAgICAgIGlmICgqbXNncHRyID09ICdzJykgaXNzdHJpbmcgPSBUUlVFOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLyogRm9ybWF0IHRoZSBtZXNzYWdlIGludG8gdGhlIHBhc3NlZCBidWZmZXIgKi8KLSAgaWYgKGlzc3RyaW5nKQotICAgIHNwcmludGYoYnVmZmVyLCBtc2d0ZXh0LCBlcnItPm1zZ19wYXJtLnMpOwotICBlbHNlCi0gICAgc3ByaW50ZihidWZmZXIsIG1zZ3RleHQsCi0JICAgIGVyci0+bXNnX3Bhcm0uaVswXSwgZXJyLT5tc2dfcGFybS5pWzFdLAotCSAgICBlcnItPm1zZ19wYXJtLmlbMl0sIGVyci0+bXNnX3Bhcm0uaVszXSwKLQkgICAgZXJyLT5tc2dfcGFybS5pWzRdLCBlcnItPm1zZ19wYXJtLmlbNV0sCi0JICAgIGVyci0+bXNnX3Bhcm0uaVs2XSwgZXJyLT5tc2dfcGFybS5pWzddKTsKLX0KLQotCi0vKgotICogUmVzZXQgZXJyb3Igc3RhdGUgdmFyaWFibGVzIGF0IHN0YXJ0IG9mIGEgbmV3IGltYWdlLgotICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIGNvbXByZXNzaW9uIHN0YXJ0dXAgdG8gcmVzZXQgdHJhY2UvZXJyb3IKLSAqIHByb2Nlc3NpbmcgdG8gZGVmYXVsdCBzdGF0ZSwgd2l0aG91dCBsb3NpbmcgYW55IGFwcGxpY2F0aW9uLXNwZWNpZmljCi0gKiBtZXRob2QgcG9pbnRlcnMuICBBbiBhcHBsaWNhdGlvbiBtaWdodCBwb3NzaWJseSB3YW50IHRvIG92ZXJyaWRlCi0gKiB0aGlzIG1ldGhvZCBpZiBpdCBoYXMgYWRkaXRpb25hbCBlcnJvciBwcm9jZXNzaW5nIHN0YXRlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcmVzZXRfZXJyb3JfbWdyIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIGNpbmZvLT5lcnItPm51bV93YXJuaW5ncyA9IDA7Ci0gIC8qIHRyYWNlX2xldmVsIGlzIG5vdCByZXNldCBzaW5jZSBpdCBpcyBhbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBwYXJhbWV0ZXIgKi8KLSAgY2luZm8tPmVyci0+bXNnX2NvZGUgPSAwOwkvKiBtYXkgYmUgdXNlZnVsIGFzIGEgZmxhZyBmb3IgIm5vIGVycm9yIiAqLwotfQotCi0KLS8qCi0gKiBGaWxsIGluIHRoZSBzdGFuZGFyZCBlcnJvci1oYW5kbGluZyBtZXRob2RzIGluIGEganBlZ19lcnJvcl9tZ3Igb2JqZWN0LgotICogVHlwaWNhbCBjYWxsIGlzOgotICoJc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOwotICoJc3RydWN0IGpwZWdfZXJyb3JfbWdyIGVycjsKLSAqCi0gKgljaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmZXJyKTsKLSAqIGFmdGVyIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBtYXkgb3ZlcnJpZGUgc29tZSBvZiB0aGUgbWV0aG9kcy4KLSAqLwotCi1HTE9CQUwoc3RydWN0IGpwZWdfZXJyb3JfbWdyICopCi1qcGVnX3N0ZF9lcnJvciAoc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyKQotewotICBlcnItPmVycm9yX2V4aXQgPSBlcnJvcl9leGl0OwotICBlcnItPmVtaXRfbWVzc2FnZSA9IGVtaXRfbWVzc2FnZTsKLSAgZXJyLT5vdXRwdXRfbWVzc2FnZSA9IG91dHB1dF9tZXNzYWdlOwotICBlcnItPmZvcm1hdF9tZXNzYWdlID0gZm9ybWF0X21lc3NhZ2U7Ci0gIGVyci0+cmVzZXRfZXJyb3JfbWdyID0gcmVzZXRfZXJyb3JfbWdyOwotCi0gIGVyci0+dHJhY2VfbGV2ZWwgPSAwOwkJLyogZGVmYXVsdCA9IG5vIHRyYWNpbmcgKi8KLSAgZXJyLT5udW1fd2FybmluZ3MgPSAwOwkvKiBubyB3YXJuaW5ncyBlbWl0dGVkIHlldCAqLwotICBlcnItPm1zZ19jb2RlID0gMDsJCS8qIG1heSBiZSB1c2VmdWwgYXMgYSBmbGFnIGZvciAibm8gZXJyb3IiICovCi0KLSAgLyogSW5pdGlhbGl6ZSBtZXNzYWdlIHRhYmxlIHBvaW50ZXJzICovCi0gIGVyci0+anBlZ19tZXNzYWdlX3RhYmxlID0ganBlZ19zdGRfbWVzc2FnZV90YWJsZTsKLSAgZXJyLT5sYXN0X2pwZWdfbWVzc2FnZSA9IChpbnQpIEpNU0dfTEFTVE1TR0NPREUgLSAxOwotCi0gIGVyci0+YWRkb25fbWVzc2FnZV90YWJsZSA9IE5VTEw7Ci0gIGVyci0+Zmlyc3RfYWRkb25fbWVzc2FnZSA9IDA7CS8qIGZvciBzYWZldHkgKi8KLSAgZXJyLT5sYXN0X2FkZG9uX21lc3NhZ2UgPSAwOwotCi0gIHJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZXJyb3IuaCBiL2xpYmpwZWd0d3JwL2plcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzJmZmZlLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2plcnJvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qCi0gKiBqZXJyb3IuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGVycm9yIGFuZCBtZXNzYWdlIGNvZGVzIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgotICogRWRpdCB0aGlzIGZpbGUgdG8gYWRkIG5ldyBjb2Rlcywgb3IgdG8gdHJhbnNsYXRlIHRoZSBtZXNzYWdlIHN0cmluZ3MgdG8KLSAqIHNvbWUgb3RoZXIgbGFuZ3VhZ2UuCi0gKiBBIHNldCBvZiBlcnJvci1yZXBvcnRpbmcgbWFjcm9zIGFyZSBkZWZpbmVkIHRvby4gIFNvbWUgYXBwbGljYXRpb25zIHVzaW5nCi0gKiB0aGUgSlBFRyBsaWJyYXJ5IG1heSB3aXNoIHRvIGluY2x1ZGUgdGhpcyBmaWxlIHRvIGdldCB0aGUgZXJyb3IgY29kZXMKLSAqIGFuZC9vciB0aGUgbWFjcm9zLgotICovCi0KLS8qCi0gKiBUbyBkZWZpbmUgdGhlIGVudW0gbGlzdCBvZiBtZXNzYWdlIGNvZGVzLCBpbmNsdWRlIHRoaXMgZmlsZSB3aXRob3V0Ci0gKiBkZWZpbmluZyBtYWNybyBKTUVTU0FHRS4gIFRvIGNyZWF0ZSBhIG1lc3NhZ2Ugc3RyaW5nIHRhYmxlLCBpbmNsdWRlIGl0Ci0gKiBhZ2FpbiB3aXRoIGEgc3VpdGFibGUgSk1FU1NBR0UgZGVmaW5pdGlvbiAoc2VlIGplcnJvci5jIGZvciBhbiBleGFtcGxlKS4KLSAqLwotI2lmbmRlZiBKTUVTU0FHRQotI2lmbmRlZiBKRVJST1JfSAotLyogRmlyc3QgdGltZSB0aHJvdWdoLCBkZWZpbmUgdGhlIGVudW0gbGlzdCAqLwotI2RlZmluZSBKTUFLRV9FTlVNX0xJU1QKLSNlbHNlCi0vKiBSZXBlYXRlZCBpbmNsdXNpb25zIG9mIHRoaXMgZmlsZSBhcmUgbm8tb3BzIHVubGVzcyBKTUVTU0FHRSBpcyBkZWZpbmVkICovCi0jZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQotI2VuZGlmIC8qIEpFUlJPUl9IICovCi0jZW5kaWYgLyogSk1FU1NBR0UgKi8KLQotI2lmZGVmIEpNQUtFX0VOVU1fTElTVAotCi10eXBlZGVmIGVudW0gewotCi0jZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQljb2RlICwKLQotI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLwotCi1KTUVTU0FHRShKTVNHX05PTUVTU0FHRSwgIkJvZ3VzIG1lc3NhZ2UgY29kZSAlZCIpIC8qIE11c3QgYmUgZmlyc3QgZW50cnkhICovCi0KLS8qIEZvciBtYWludGVuYW5jZSBjb252ZW5pZW5jZSwgbGlzdCBpcyBhbHBoYWJldGljYWwgYnkgbWVzc2FnZSBjb2RlIG5hbWUgKi8KLUpNRVNTQUdFKEpFUlJfQVJJVEhfTk9USU1QTCwKLQkgIlNvcnJ5LCB0aGVyZSBhcmUgbGVnYWwgcmVzdHJpY3Rpb25zIG9uIGFyaXRobWV0aWMgY29kaW5nIikKLUpNRVNTQUdFKEpFUlJfQkFEX0FMSUdOX1RZUEUsICJBTElHTl9UWVBFIGlzIHdyb25nLCBwbGVhc2UgZml4IikKLUpNRVNTQUdFKEpFUlJfQkFEX0FMTE9DX0NIVU5LLCAiTUFYX0FMTE9DX0NIVU5LIGlzIHdyb25nLCBwbGVhc2UgZml4IikKLUpNRVNTQUdFKEpFUlJfQkFEX0JVRkZFUl9NT0RFLCAiQm9ndXMgYnVmZmVyIGNvbnRyb2wgbW9kZSIpCi1KTUVTU0FHRShKRVJSX0JBRF9DT01QT05FTlRfSUQsICJJbnZhbGlkIGNvbXBvbmVudCBJRCAlZCBpbiBTT1MiKQotSk1FU1NBR0UoSkVSUl9CQURfRENUX0NPRUYsICJEQ1QgY29lZmZpY2llbnQgb3V0IG9mIHJhbmdlIikKLUpNRVNTQUdFKEpFUlJfQkFEX0RDVFNJWkUsICJJRENUIG91dHB1dCBibG9jayBzaXplICVkIG5vdCBzdXBwb3J0ZWQiKQotSk1FU1NBR0UoSkVSUl9CQURfSFVGRl9UQUJMRSwgIkJvZ3VzIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiIpCi1KTUVTU0FHRShKRVJSX0JBRF9JTl9DT0xPUlNQQUNFLCAiQm9ndXMgaW5wdXQgY29sb3JzcGFjZSIpCi1KTUVTU0FHRShKRVJSX0JBRF9KX0NPTE9SU1BBQ0UsICJCb2d1cyBKUEVHIGNvbG9yc3BhY2UiKQotSk1FU1NBR0UoSkVSUl9CQURfTEVOR1RILCAiQm9ndXMgbWFya2VyIGxlbmd0aCIpCi1KTUVTU0FHRShKRVJSX0JBRF9MSUJfVkVSU0lPTiwKLQkgIldyb25nIEpQRUcgbGlicmFyeSB2ZXJzaW9uOiBsaWJyYXJ5IGlzICVkLCBjYWxsZXIgZXhwZWN0cyAlZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9NQ1VfU0laRSwgIlNhbXBsaW5nIGZhY3RvcnMgdG9vIGxhcmdlIGZvciBpbnRlcmxlYXZlZCBzY2FuIikKLUpNRVNTQUdFKEpFUlJfQkFEX1BPT0xfSUQsICJJbnZhbGlkIG1lbW9yeSBwb29sIGNvZGUgJWQiKQotSk1FU1NBR0UoSkVSUl9CQURfUFJFQ0lTSU9OLCAiVW5zdXBwb3J0ZWQgSlBFRyBkYXRhIHByZWNpc2lvbiAlZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9QUk9HUkVTU0lPTiwKLQkgIkludmFsaWQgcHJvZ3Jlc3NpdmUgcGFyYW1ldGVycyBTcz0lZCBTZT0lZCBBaD0lZCBBbD0lZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9QUk9HX1NDUklQVCwKLQkgIkludmFsaWQgcHJvZ3Jlc3NpdmUgcGFyYW1ldGVycyBhdCBzY2FuIHNjcmlwdCBlbnRyeSAlZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9TQU1QTElORywgIkJvZ3VzIHNhbXBsaW5nIGZhY3RvcnMiKQotSk1FU1NBR0UoSkVSUl9CQURfU0NBTl9TQ1JJUFQsICJJbnZhbGlkIHNjYW4gc2NyaXB0IGF0IGVudHJ5ICVkIikKLUpNRVNTQUdFKEpFUlJfQkFEX1NUQVRFLCAiSW1wcm9wZXIgY2FsbCB0byBKUEVHIGxpYnJhcnkgaW4gc3RhdGUgJWQiKQotSk1FU1NBR0UoSkVSUl9CQURfU1RSVUNUX1NJWkUsCi0JICJKUEVHIHBhcmFtZXRlciBzdHJ1Y3QgbWlzbWF0Y2g6IGxpYnJhcnkgdGhpbmtzIHNpemUgaXMgJXUsIGNhbGxlciBleHBlY3RzICV1IikKLUpNRVNTQUdFKEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTLCAiQm9ndXMgdmlydHVhbCBhcnJheSBhY2Nlc3MiKQotSk1FU1NBR0UoSkVSUl9CVUZGRVJfU0laRSwgIkJ1ZmZlciBwYXNzZWQgdG8gSlBFRyBsaWJyYXJ5IGlzIHRvbyBzbWFsbCIpCi1KTUVTU0FHRShKRVJSX0NBTlRfU1VTUEVORCwgIlN1c3BlbnNpb24gbm90IGFsbG93ZWQgaGVyZSIpCi1KTUVTU0FHRShKRVJSX0NDSVI2MDFfTk9USU1QTCwgIkNDSVI2MDEgc2FtcGxpbmcgbm90IGltcGxlbWVudGVkIHlldCIpCi1KTUVTU0FHRShKRVJSX0NPTVBPTkVOVF9DT1VOVCwgIlRvbyBtYW55IGNvbG9yIGNvbXBvbmVudHM6ICVkLCBtYXggJWQiKQotSk1FU1NBR0UoSkVSUl9DT05WRVJTSU9OX05PVElNUEwsICJVbnN1cHBvcnRlZCBjb2xvciBjb252ZXJzaW9uIHJlcXVlc3QiKQotSk1FU1NBR0UoSkVSUl9EQUNfSU5ERVgsICJCb2d1cyBEQUMgaW5kZXggJWQiKQotSk1FU1NBR0UoSkVSUl9EQUNfVkFMVUUsICJCb2d1cyBEQUMgdmFsdWUgMHgleCIpCi1KTUVTU0FHRShKRVJSX0RIVF9JTkRFWCwgIkJvZ3VzIERIVCBpbmRleCAlZCIpCi1KTUVTU0FHRShKRVJSX0RRVF9JTkRFWCwgIkJvZ3VzIERRVCBpbmRleCAlZCIpCi1KTUVTU0FHRShKRVJSX0VNUFRZX0lNQUdFLCAiRW1wdHkgSlBFRyBpbWFnZSAoRE5MIG5vdCBzdXBwb3J0ZWQpIikKLUpNRVNTQUdFKEpFUlJfRU1TX1JFQUQsICJSZWFkIGZyb20gRU1TIGZhaWxlZCIpCi1KTUVTU0FHRShKRVJSX0VNU19XUklURSwgIldyaXRlIHRvIEVNUyBmYWlsZWQiKQotSk1FU1NBR0UoSkVSUl9FT0lfRVhQRUNURUQsICJEaWRuJ3QgZXhwZWN0IG1vcmUgdGhhbiBvbmUgc2NhbiIpCi1KTUVTU0FHRShKRVJSX0ZJTEVfUkVBRCwgIklucHV0IGZpbGUgcmVhZCBlcnJvciIpCi1KTUVTU0FHRShKRVJSX0ZJTEVfV1JJVEUsICJPdXRwdXQgZmlsZSB3cml0ZSBlcnJvciAtLS0gb3V0IG9mIGRpc2sgc3BhY2U/IikKLUpNRVNTQUdFKEpFUlJfRlJBQ1RfU0FNUExFX05PVElNUEwsICJGcmFjdGlvbmFsIHNhbXBsaW5nIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKQotSk1FU1NBR0UoSkVSUl9IVUZGX0NMRU5fT1ZFUkZMT1csICJIdWZmbWFuIGNvZGUgc2l6ZSB0YWJsZSBvdmVyZmxvdyIpCi1KTUVTU0FHRShKRVJSX0hVRkZfTUlTU0lOR19DT0RFLCAiTWlzc2luZyBIdWZmbWFuIGNvZGUgdGFibGUgZW50cnkiKQotSk1FU1NBR0UoSkVSUl9JTUFHRV9UT09fQklHLCAiTWF4aW11bSBzdXBwb3J0ZWQgaW1hZ2UgZGltZW5zaW9uIGlzICV1IHBpeGVscyIpCi1KTUVTU0FHRShKRVJSX0lOUFVUX0VNUFRZLCAiRW1wdHkgaW5wdXQgZmlsZSIpCi1KTUVTU0FHRShKRVJSX0lOUFVUX0VPRiwgIlByZW1hdHVyZSBlbmQgb2YgaW5wdXQgZmlsZSIpCi1KTUVTU0FHRShKRVJSX01JU01BVENIRURfUVVBTlRfVEFCTEUsCi0JICJDYW5ub3QgdHJhbnNjb2RlIGR1ZSB0byBtdWx0aXBsZSB1c2Ugb2YgcXVhbnRpemF0aW9uIHRhYmxlICVkIikKLUpNRVNTQUdFKEpFUlJfTUlTU0lOR19EQVRBLCAiU2NhbiBzY3JpcHQgZG9lcyBub3QgdHJhbnNtaXQgYWxsIGRhdGEiKQotSk1FU1NBR0UoSkVSUl9NT0RFX0NIQU5HRSwgIkludmFsaWQgY29sb3IgcXVhbnRpemF0aW9uIG1vZGUgY2hhbmdlIikKLUpNRVNTQUdFKEpFUlJfTk9USU1QTCwgIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKQotSk1FU1NBR0UoSkVSUl9OT1RfQ09NUElMRUQsICJSZXF1ZXN0ZWQgZmVhdHVyZSB3YXMgb21pdHRlZCBhdCBjb21waWxlIHRpbWUiKQotSk1FU1NBR0UoSkVSUl9OT19CQUNLSU5HX1NUT1JFLCAiQmFja2luZyBzdG9yZSBub3Qgc3VwcG9ydGVkIikKLUpNRVNTQUdFKEpFUlJfTk9fSFVGRl9UQUJMRSwgIkh1ZmZtYW4gdGFibGUgMHglMDJ4IHdhcyBub3QgZGVmaW5lZCIpCi1KTUVTU0FHRShKRVJSX05PX0lNQUdFLCAiSlBFRyBkYXRhc3RyZWFtIGNvbnRhaW5zIG5vIGltYWdlIikKLUpNRVNTQUdFKEpFUlJfTk9fUVVBTlRfVEFCTEUsICJRdWFudGl6YXRpb24gdGFibGUgMHglMDJ4IHdhcyBub3QgZGVmaW5lZCIpCi1KTUVTU0FHRShKRVJSX05PX1NPSSwgIk5vdCBhIEpQRUcgZmlsZTogc3RhcnRzIHdpdGggMHglMDJ4IDB4JTAyeCIpCi1KTUVTU0FHRShKRVJSX09VVF9PRl9NRU1PUlksICJJbnN1ZmZpY2llbnQgbWVtb3J5IChjYXNlICVkKSIpCi1KTUVTU0FHRShKRVJSX1FVQU5UX0NPTVBPTkVOVFMsCi0JICJDYW5ub3QgcXVhbnRpemUgbW9yZSB0aGFuICVkIGNvbG9yIGNvbXBvbmVudHMiKQotSk1FU1NBR0UoSkVSUl9RVUFOVF9GRVdfQ09MT1JTLCAiQ2Fubm90IHF1YW50aXplIHRvIGZld2VyIHRoYW4gJWQgY29sb3JzIikKLUpNRVNTQUdFKEpFUlJfUVVBTlRfTUFOWV9DT0xPUlMsICJDYW5ub3QgcXVhbnRpemUgdG8gbW9yZSB0aGFuICVkIGNvbG9ycyIpCi1KTUVTU0FHRShKRVJSX1NPRl9EVVBMSUNBVEUsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IHR3byBTT0YgbWFya2VycyIpCi1KTUVTU0FHRShKRVJSX1NPRl9OT19TT1MsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IG1pc3NpbmcgU09TIG1hcmtlciIpCi1KTUVTU0FHRShKRVJSX1NPRl9VTlNVUFBPUlRFRCwgIlVuc3VwcG9ydGVkIEpQRUcgcHJvY2VzczogU09GIHR5cGUgMHglMDJ4IikKLUpNRVNTQUdFKEpFUlJfU09JX0RVUExJQ0FURSwgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogdHdvIFNPSSBtYXJrZXJzIikKLUpNRVNTQUdFKEpFUlJfU09TX05PX1NPRiwgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogU09TIGJlZm9yZSBTT0YiKQotSk1FU1NBR0UoSkVSUl9URklMRV9DUkVBVEUsICJGYWlsZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlICVzIikKLUpNRVNTQUdFKEpFUlJfVEZJTEVfUkVBRCwgIlJlYWQgZmFpbGVkIG9uIHRlbXBvcmFyeSBmaWxlIikKLUpNRVNTQUdFKEpFUlJfVEZJTEVfU0VFSywgIlNlZWsgZmFpbGVkIG9uIHRlbXBvcmFyeSBmaWxlIikKLUpNRVNTQUdFKEpFUlJfVEZJTEVfV1JJVEUsCi0JICJXcml0ZSBmYWlsZWQgb24gdGVtcG9yYXJ5IGZpbGUgLS0tIG91dCBvZiBkaXNrIHNwYWNlPyIpCi1KTUVTU0FHRShKRVJSX1RPT19MSVRUTEVfREFUQSwgIkFwcGxpY2F0aW9uIHRyYW5zZmVycmVkIHRvbyBmZXcgc2NhbmxpbmVzIikKLUpNRVNTQUdFKEpFUlJfVU5LTk9XTl9NQVJLRVIsICJVbnN1cHBvcnRlZCBtYXJrZXIgdHlwZSAweCUwMngiKQotSk1FU1NBR0UoSkVSUl9WSVJUVUFMX0JVRywgIlZpcnR1YWwgYXJyYXkgY29udHJvbGxlciBtZXNzZWQgdXAiKQotSk1FU1NBR0UoSkVSUl9XSURUSF9PVkVSRkxPVywgIkltYWdlIHRvbyB3aWRlIGZvciB0aGlzIGltcGxlbWVudGF0aW9uIikKLUpNRVNTQUdFKEpFUlJfWE1TX1JFQUQsICJSZWFkIGZyb20gWE1TIGZhaWxlZCIpCi1KTUVTU0FHRShKRVJSX1hNU19XUklURSwgIldyaXRlIHRvIFhNUyBmYWlsZWQiKQotSk1FU1NBR0UoSk1TR19DT1BZUklHSFQsIEpDT1BZUklHSFQpCi1KTUVTU0FHRShKTVNHX1ZFUlNJT04sIEpWRVJTSU9OKQotSk1FU1NBR0UoSlRSQ18xNkJJVF9UQUJMRVMsCi0JICJDYXV0aW9uOiBxdWFudGl6YXRpb24gdGFibGVzIGFyZSB0b28gY29hcnNlIGZvciBiYXNlbGluZSBKUEVHIikKLUpNRVNTQUdFKEpUUkNfQURPQkUsCi0JICJBZG9iZSBBUFAxNCBtYXJrZXI6IHZlcnNpb24gJWQsIGZsYWdzIDB4JTA0eCAweCUwNHgsIHRyYW5zZm9ybSAlZCIpCi1KTUVTU0FHRShKVFJDX0FQUDAsICJVbmtub3duIEFQUDAgbWFya2VyIChub3QgSkZJRiksIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX0FQUDE0LCAiVW5rbm93biBBUFAxNCBtYXJrZXIgKG5vdCBBZG9iZSksIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX0RBQywgIkRlZmluZSBBcml0aG1ldGljIFRhYmxlIDB4JTAyeDogMHglMDJ4IikKLUpNRVNTQUdFKEpUUkNfREhULCAiRGVmaW5lIEh1ZmZtYW4gVGFibGUgMHglMDJ4IikKLUpNRVNTQUdFKEpUUkNfRFFULCAiRGVmaW5lIFF1YW50aXphdGlvbiBUYWJsZSAlZCAgcHJlY2lzaW9uICVkIikKLUpNRVNTQUdFKEpUUkNfRFJJLCAiRGVmaW5lIFJlc3RhcnQgSW50ZXJ2YWwgJXUiKQotSk1FU1NBR0UoSlRSQ19FTVNfQ0xPU0UsICJGcmVlZCBFTVMgaGFuZGxlICV1IikKLUpNRVNTQUdFKEpUUkNfRU1TX09QRU4sICJPYnRhaW5lZCBFTVMgaGFuZGxlICV1IikKLUpNRVNTQUdFKEpUUkNfRU9JLCAiRW5kIE9mIEltYWdlIikKLUpNRVNTQUdFKEpUUkNfSFVGRkJJVFMsICIgICAgICAgICUzZCAlM2QgJTNkICUzZCAlM2QgJTNkICUzZCAlM2QiKQotSk1FU1NBR0UoSlRSQ19KRklGLCAiSkZJRiBBUFAwIG1hcmtlcjogdmVyc2lvbiAlZC4lMDJkLCBkZW5zaXR5ICVkeCVkICAlZCIpCi1KTUVTU0FHRShKVFJDX0pGSUZfQkFEVEhVTUJOQUlMU0laRSwKLQkgIldhcm5pbmc6IHRodW1ibmFpbCBpbWFnZSBzaXplIGRvZXMgbm90IG1hdGNoIGRhdGEgbGVuZ3RoICV1IikKLUpNRVNTQUdFKEpUUkNfSkZJRl9FWFRFTlNJT04sCi0JICJKRklGIGV4dGVuc2lvbiBtYXJrZXI6IHR5cGUgMHglMDJ4LCBsZW5ndGggJXUiKQotSk1FU1NBR0UoSlRSQ19KRklGX1RIVU1CTkFJTCwgIiAgICB3aXRoICVkIHggJWQgdGh1bWJuYWlsIGltYWdlIikKLUpNRVNTQUdFKEpUUkNfTUlTQ19NQVJLRVIsICJNaXNjZWxsYW5lb3VzIG1hcmtlciAweCUwMngsIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX1BBUk1MRVNTX01BUktFUiwgIlVuZXhwZWN0ZWQgbWFya2VyIDB4JTAyeCIpCi1KTUVTU0FHRShKVFJDX1FVQU5UVkFMUywgIiAgICAgICAgJTR1ICU0dSAlNHUgJTR1ICU0dSAlNHUgJTR1ICU0dSIpCi1KTUVTU0FHRShKVFJDX1FVQU5UXzNfTkNPTE9SUywgIlF1YW50aXppbmcgdG8gJWQgPSAlZColZColZCBjb2xvcnMiKQotSk1FU1NBR0UoSlRSQ19RVUFOVF9OQ09MT1JTLCAiUXVhbnRpemluZyB0byAlZCBjb2xvcnMiKQotSk1FU1NBR0UoSlRSQ19RVUFOVF9TRUxFQ1RFRCwgIlNlbGVjdGVkICVkIGNvbG9ycyBmb3IgcXVhbnRpemF0aW9uIikKLUpNRVNTQUdFKEpUUkNfUkVDT1ZFUllfQUNUSU9OLCAiQXQgbWFya2VyIDB4JTAyeCwgcmVjb3ZlcnkgYWN0aW9uICVkIikKLUpNRVNTQUdFKEpUUkNfUlNULCAiUlNUJWQiKQotSk1FU1NBR0UoSlRSQ19TTU9PVEhfTk9USU1QTCwKLQkgIlNtb290aGluZyBub3Qgc3VwcG9ydGVkIHdpdGggbm9uc3RhbmRhcmQgc2FtcGxpbmcgcmF0aW9zIikKLUpNRVNTQUdFKEpUUkNfU09GLCAiU3RhcnQgT2YgRnJhbWUgMHglMDJ4OiB3aWR0aD0ldSwgaGVpZ2h0PSV1LCBjb21wb25lbnRzPSVkIikKLUpNRVNTQUdFKEpUUkNfU09GX0NPTVBPTkVOVCwgIiAgICBDb21wb25lbnQgJWQ6ICVkaHglZHYgcT0lZCIpCi1KTUVTU0FHRShKVFJDX1NPSSwgIlN0YXJ0IG9mIEltYWdlIikKLUpNRVNTQUdFKEpUUkNfU09TLCAiU3RhcnQgT2YgU2NhbjogJWQgY29tcG9uZW50cyIpCi1KTUVTU0FHRShKVFJDX1NPU19DT01QT05FTlQsICIgICAgQ29tcG9uZW50ICVkOiBkYz0lZCBhYz0lZCIpCi1KTUVTU0FHRShKVFJDX1NPU19QQVJBTVMsICIgIFNzPSVkLCBTZT0lZCwgQWg9JWQsIEFsPSVkIikKLUpNRVNTQUdFKEpUUkNfVEZJTEVfQ0xPU0UsICJDbG9zZWQgdGVtcG9yYXJ5IGZpbGUgJXMiKQotSk1FU1NBR0UoSlRSQ19URklMRV9PUEVOLCAiT3BlbmVkIHRlbXBvcmFyeSBmaWxlICVzIikKLUpNRVNTQUdFKEpUUkNfVEhVTUJfSlBFRywKLQkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogSlBFRy1jb21wcmVzc2VkIHRodW1ibmFpbCBpbWFnZSwgbGVuZ3RoICV1IikKLUpNRVNTQUdFKEpUUkNfVEhVTUJfUEFMRVRURSwKLQkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogcGFsZXR0ZSB0aHVtYm5haWwgaW1hZ2UsIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX1RIVU1CX1JHQiwKLQkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogUkdCIHRodW1ibmFpbCBpbWFnZSwgbGVuZ3RoICV1IikKLUpNRVNTQUdFKEpUUkNfVU5LTk9XTl9JRFMsCi0JICJVbnJlY29nbml6ZWQgY29tcG9uZW50IElEcyAlZCAlZCAlZCwgYXNzdW1pbmcgWUNiQ3IiKQotSk1FU1NBR0UoSlRSQ19YTVNfQ0xPU0UsICJGcmVlZCBYTVMgaGFuZGxlICV1IikKLUpNRVNTQUdFKEpUUkNfWE1TX09QRU4sICJPYnRhaW5lZCBYTVMgaGFuZGxlICV1IikKLUpNRVNTQUdFKEpXUk5fQURPQkVfWEZPUk0sICJVbmtub3duIEFkb2JlIGNvbG9yIHRyYW5zZm9ybSBjb2RlICVkIikKLUpNRVNTQUdFKEpXUk5fQk9HVVNfUFJPR1JFU1NJT04sCi0JICJJbmNvbnNpc3RlbnQgcHJvZ3Jlc3Npb24gc2VxdWVuY2UgZm9yIGNvbXBvbmVudCAlZCBjb2VmZmljaWVudCAlZCIpCi1KTUVTU0FHRShKV1JOX0VYVFJBTkVPVVNfREFUQSwKLQkgIkNvcnJ1cHQgSlBFRyBkYXRhOiAldSBleHRyYW5lb3VzIGJ5dGVzIGJlZm9yZSBtYXJrZXIgMHglMDJ4IikKLUpNRVNTQUdFKEpXUk5fSElUX01BUktFUiwgIkNvcnJ1cHQgSlBFRyBkYXRhOiBwcmVtYXR1cmUgZW5kIG9mIGRhdGEgc2VnbWVudCIpCi1KTUVTU0FHRShKV1JOX0hVRkZfQkFEX0NPREUsICJDb3JydXB0IEpQRUcgZGF0YTogYmFkIEh1ZmZtYW4gY29kZSIpCi1KTUVTU0FHRShKV1JOX0pGSUZfTUFKT1IsICJXYXJuaW5nOiB1bmtub3duIEpGSUYgcmV2aXNpb24gbnVtYmVyICVkLiUwMmQiKQotSk1FU1NBR0UoSldSTl9KUEVHX0VPRiwgIlByZW1hdHVyZSBlbmQgb2YgSlBFRyBmaWxlIikKLUpNRVNTQUdFKEpXUk5fTVVTVF9SRVNZTkMsCi0JICJDb3JydXB0IEpQRUcgZGF0YTogZm91bmQgbWFya2VyIDB4JTAyeCBpbnN0ZWFkIG9mIFJTVCVkIikKLUpNRVNTQUdFKEpXUk5fTk9UX1NFUVVFTlRJQUwsICJJbnZhbGlkIFNPUyBwYXJhbWV0ZXJzIGZvciBzZXF1ZW50aWFsIEpQRUciKQotSk1FU1NBR0UoSldSTl9UT09fTVVDSF9EQVRBLCAiQXBwbGljYXRpb24gdHJhbnNmZXJyZWQgdG9vIG1hbnkgc2NhbmxpbmVzIikKLQotI2lmZGVmIEpNQUtFX0VOVU1fTElTVAotCi0gIEpNU0dfTEFTVE1TR0NPREUKLX0gSl9NRVNTQUdFX0NPREU7Ci0KLSN1bmRlZiBKTUFLRV9FTlVNX0xJU1QKLSNlbmRpZiAvKiBKTUFLRV9FTlVNX0xJU1QgKi8KLQotLyogWmFwIEpNRVNTQUdFIG1hY3JvIHNvIHRoYXQgZnV0dXJlIHJlLWluY2x1c2lvbnMgZG8gbm90aGluZyBieSBkZWZhdWx0ICovCi0jdW5kZWYgSk1FU1NBR0UKLQotCi0jaWZuZGVmIEpFUlJPUl9ICi0jZGVmaW5lIEpFUlJPUl9ICi0KLS8qIE1hY3JvcyB0byBzaW1wbGlmeSB1c2luZyB0aGUgZXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2Ugc3R1ZmYgKi8KLS8qIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgZWl0aGVyIHR5cGUgb2YgY2luZm8gcG9pbnRlciAqLwotCi0vKiBGYXRhbCBlcnJvcnMgKHByaW50IG1lc3NhZ2UgYW5kIGV4aXQpICovCi0jZGVmaW5lIEVSUkVYSVQoY2luZm8sY29kZSkgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCi0jZGVmaW5lIEVSUkVYSVQxKGNpbmZvLGNvZGUscDEpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQotI2RlZmluZSBFUlJFWElUMihjaW5mbyxjb2RlLHAxLHAyKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKLSNkZWZpbmUgRVJSRVhJVDMoY2luZm8sY29kZSxwMSxwMixwMykgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsyXSA9IChwMyksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCi0jZGVmaW5lIEVSUkVYSVQ0KGNpbmZvLGNvZGUscDEscDIscDMscDQpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMl0gPSAocDMpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbM10gPSAocDQpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQotI2RlZmluZSBFUlJFWElUUyhjaW5mbyxjb2RlLHN0cikgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIHN0cm5jcHkoKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5zLCAoc3RyKSwgSk1TR19TVFJfUEFSTV9NQVgpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQotCi0jZGVmaW5lIE1BS0VTVE1UKHN0dWZmKQkJZG8geyBzdHVmZiB9IHdoaWxlICgwKQotCi0vKiBOb25mYXRhbCBlcnJvcnMgKHdlIGNhbiBrZWVwIGdvaW5nLCBidXQgdGhlIGRhdGEgaXMgcHJvYmFibHkgY29ycnVwdCkgKi8KLSNkZWZpbmUgV0FSTk1TKGNpbmZvLGNvZGUpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQotI2RlZmluZSBXQVJOTVMxKGNpbmZvLGNvZGUscDEpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQotI2RlZmluZSBXQVJOTVMyKGNpbmZvLGNvZGUscDEscDIpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQotCi0vKiBJbmZvcm1hdGlvbmFsL2RlYnVnZ2luZyBtZXNzYWdlcyAqLwotI2RlZmluZSBUUkFDRU1TKGNpbmZvLGx2bCxjb2RlKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKLSNkZWZpbmUgVFJBQ0VNUzEoY2luZm8sbHZsLGNvZGUscDEpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpKQotI2RlZmluZSBUUkFDRU1TMihjaW5mbyxsdmwsY29kZSxwMSxwMikgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSkpCi0jZGVmaW5lIFRSQUNFTVMzKGNpbmZvLGx2bCxjb2RlLHAxLHAyLHAzKSAgXAotICBNQUtFU1RNVChpbnQgKiBfbXAgPSAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmk7IFwKLQkgICBfbXBbMF0gPSAocDEpOyBfbXBbMV0gPSAocDIpOyBfbXBbMl0gPSAocDMpOyBcCi0JICAgKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKTsgXAotCSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSk7ICkKLSNkZWZpbmUgVFJBQ0VNUzQoY2luZm8sbHZsLGNvZGUscDEscDIscDMscDQpICBcCi0gIE1BS0VTVE1UKGludCAqIF9tcCA9IChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaTsgXAotCSAgIF9tcFswXSA9IChwMSk7IF9tcFsxXSA9IChwMik7IF9tcFsyXSA9IChwMyk7IF9tcFszXSA9IChwNCk7IFwKLQkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCi0JICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQotI2RlZmluZSBUUkFDRU1TNShjaW5mbyxsdmwsY29kZSxwMSxwMixwMyxwNCxwNSkgIFwKLSAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCi0JICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgX21wWzNdID0gKHA0KTsgXAotCSAgIF9tcFs0XSA9IChwNSk7IFwKLQkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCi0JICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQotI2RlZmluZSBUUkFDRU1TOChjaW5mbyxsdmwsY29kZSxwMSxwMixwMyxwNCxwNSxwNixwNyxwOCkgIFwKLSAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCi0JICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgX21wWzNdID0gKHA0KTsgXAotCSAgIF9tcFs0XSA9IChwNSk7IF9tcFs1XSA9IChwNik7IF9tcFs2XSA9IChwNyk7IF9tcFs3XSA9IChwOCk7IFwKLQkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCi0JICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQotI2RlZmluZSBUUkFDRU1TUyhjaW5mbyxsdmwsY29kZSxzdHIpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICBzdHJuY3B5KChjaW5mbyktPmVyci0+bXNnX3Bhcm0ucywgKHN0ciksIEpNU0dfU1RSX1BBUk1fTUFYKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKLQotI2VuZGlmIC8qIEpFUlJPUl9IICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZmRjdGZsdC5jIGIvbGlianBlZ3R3cnAvamZkY3RmbHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkN2EwMC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZmRjdGZsdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBqZmRjdGZsdC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYSBmbG9hdGluZy1wb2ludCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIGZvcndhcmQgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4KLSAqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBtb3JlIGFjY3VyYXRlIHRoYW4gZWl0aGVyIG9mIHRoZSBpbnRlZ2VyCi0gKiBEQ1QgaW1wbGVtZW50YXRpb25zLiAgSG93ZXZlciwgaXQgbWF5IG5vdCBnaXZlIHRoZSBzYW1lIHJlc3VsdHMgb24gYWxsCi0gKiBtYWNoaW5lcyBiZWNhdXNlIG9mIGRpZmZlcmVuY2VzIGluIHJvdW5kb2ZmIGJlaGF2aW9yLiAgU3BlZWQgd2lsbCBkZXBlbmQKLSAqIG9uIHRoZSBoYXJkd2FyZSdzIGZsb2F0aW5nIHBvaW50IGNhcGFjaXR5LgotICoKLSAqIEEgMi1EIERDVCBjYW4gYmUgZG9uZSBieSAxLUQgRENUIG9uIGVhY2ggcm93IGZvbGxvd2VkIGJ5IDEtRCBEQ1QKLSAqIG9uIGVhY2ggY29sdW1uLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUKLSAqIG11Y2ggbW9yZSBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hJ3MgYWxnb3JpdGhtIGZvcgotICogc2NhbGVkIERDVC4gIFRoZWlyIG9yaWdpbmFsIHBhcGVyIChUcmFucy4gSUVJQ0UgRS03MSgxMSk6MTA5NSkgaXMgaW4KLSAqIEphcGFuZXNlLCBidXQgdGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gdGhlIFBlbm5lYmFrZXIgJiBNaXRjaGVsbAotICogSlBFRyB0ZXh0Ym9vayAoc2VlIFJFRkVSRU5DRVMgc2VjdGlvbiBpbiBmaWxlIFJFQURNRSkuICBUaGUgZm9sbG93aW5nIGNvZGUKLSAqIGlzIGJhc2VkIGRpcmVjdGx5IG9uIGZpZ3VyZSA0LTggaW4gUCZNLgotICogV2hpbGUgYW4gOC1wb2ludCBEQ1QgY2Fubm90IGJlIGRvbmUgaW4gbGVzcyB0aGFuIDExIG11bHRpcGxpZXMsIGl0IGlzCi0gKiBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSBjb21wdXRhdGlvbiBzbyB0aGF0IG1hbnkgb2YgdGhlIG11bHRpcGxpZXMgYXJlCi0gKiBzaW1wbGUgc2NhbGluZ3Mgb2YgdGhlIGZpbmFsIG91dHB1dHMuICBUaGVzZSBtdWx0aXBsaWVzIGNhbiB0aGVuIGJlCi0gKiBmb2xkZWQgaW50byB0aGUgbXVsdGlwbGljYXRpb25zIG9yIGRpdmlzaW9ucyBieSB0aGUgSlBFRyBxdWFudGl6YXRpb24KLSAqIHRhYmxlIGVudHJpZXMuICBUaGUgQUEmTiBtZXRob2QgbGVhdmVzIG9ubHkgNSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzCi0gKiB0byBiZSBkb25lIGluIHRoZSBEQ1QgaXRzZWxmLgotICogVGhlIHByaW1hcnkgZGlzYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgd2l0aCBhIGZpeGVkLXBvaW50Ci0gKiBpbXBsZW1lbnRhdGlvbiwgYWNjdXJhY3kgaXMgbG9zdCBkdWUgdG8gaW1wcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICogc2NhbGVkIHF1YW50aXphdGlvbiB2YWx1ZXMuICBIb3dldmVyLCB0aGF0IHByb2JsZW0gZG9lcyBub3QgYXJpc2UgaWYKLSAqIHdlIHVzZSBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLSAqLwotCi0jaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0KLS8qCi0gKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZmRjdF9mbG9hdCAoRkFTVF9GTE9BVCAqIGRhdGEpCi17Ci0gIEZBU1RfRkxPQVQgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgRkFTVF9GTE9BVCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKLSAgRkFTVF9GTE9BVCB6MSwgejIsIHozLCB6NCwgejUsIHoxMSwgejEzOwotICBGQVNUX0ZMT0FUICpkYXRhcHRyOwotICBpbnQgY3RyOwotCi0gIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLwotCi0gIGRhdGFwdHIgPSBkYXRhOwotICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7Ci0gICAgdG1wMCA9IGRhdGFwdHJbMF0gKyBkYXRhcHRyWzddOwotICAgIHRtcDcgPSBkYXRhcHRyWzBdIC0gZGF0YXB0cls3XTsKLSAgICB0bXAxID0gZGF0YXB0clsxXSArIGRhdGFwdHJbNl07Ci0gICAgdG1wNiA9IGRhdGFwdHJbMV0gLSBkYXRhcHRyWzZdOwotICAgIHRtcDIgPSBkYXRhcHRyWzJdICsgZGF0YXB0cls1XTsKLSAgICB0bXA1ID0gZGF0YXB0clsyXSAtIGRhdGFwdHJbNV07Ci0gICAgdG1wMyA9IGRhdGFwdHJbM10gKyBkYXRhcHRyWzRdOwotICAgIHRtcDQgPSBkYXRhcHRyWzNdIC0gZGF0YXB0cls0XTsKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgZGF0YXB0clswXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KLSAgICBkYXRhcHRyWzRdID0gdG1wMTAgLSB0bXAxMTsKLSAgICAKLSAgICB6MSA9ICh0bXAxMiArIHRtcDEzKSAqICgoRkFTVF9GTE9BVCkgMC43MDcxMDY3ODEpOyAvKiBjNCAqLwotICAgIGRhdGFwdHJbMl0gPSB0bXAxMyArIHoxOwkvKiBwaGFzZSA1ICovCi0gICAgZGF0YXB0cls2XSA9IHRtcDEzIC0gejE7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgKi8KLQotICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CS8qIHBoYXNlIDIgKi8KLSAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OwotICAgIHRtcDEyID0gdG1wNiArIHRtcDc7Ci0KLSAgICAvKiBUaGUgcm90YXRvciBpcyBtb2RpZmllZCBmcm9tIGZpZyA0LTggdG8gYXZvaWQgZXh0cmEgbmVnYXRpb25zLiAqLwotICAgIHo1ID0gKHRtcDEwIC0gdG1wMTIpICogKChGQVNUX0ZMT0FUKSAwLjM4MjY4MzQzMyk7IC8qIGM2ICovCi0gICAgejIgPSAoKEZBU1RfRkxPQVQpIDAuNTQxMTk2MTAwKSAqIHRtcDEwICsgejU7IC8qIGMyLWM2ICovCi0gICAgejQgPSAoKEZBU1RfRkxPQVQpIDEuMzA2NTYyOTY1KSAqIHRtcDEyICsgejU7IC8qIGMyK2M2ICovCi0gICAgejMgPSB0bXAxMSAqICgoRkFTVF9GTE9BVCkgMC43MDcxMDY3ODEpOyAvKiBjNCAqLwotCi0gICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLwotICAgIHoxMyA9IHRtcDcgLSB6MzsKLQotICAgIGRhdGFwdHJbNV0gPSB6MTMgKyB6MjsJLyogcGhhc2UgNiAqLwotICAgIGRhdGFwdHJbM10gPSB6MTMgLSB6MjsKLSAgICBkYXRhcHRyWzFdID0gejExICsgejQ7Ci0gICAgZGF0YXB0cls3XSA9IHoxMSAtIHo0OwotCi0gICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gIH0KLQotICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4gKi8KLQotICBkYXRhcHRyID0gZGF0YTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgewotICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKLSAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOwotICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo1XTsKLSAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOwotICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLwotICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IHRtcDEwIC0gdG1wMTE7Ci0gICAgCi0gICAgejEgPSAodG1wMTIgKyB0bXAxMykgKiAoKEZBU1RfRkxPQVQpIDAuNzA3MTA2NzgxKTsgLyogYzQgKi8KLSAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSB0bXAxMyArIHoxOyAvKiBwaGFzZSA1ICovCi0gICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gdG1wMTMgLSB6MTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsJLyogcGhhc2UgMiAqLwotICAgIHRtcDExID0gdG1wNSArIHRtcDY7Ci0gICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKLQotICAgIC8qIFRoZSByb3RhdG9yIGlzIG1vZGlmaWVkIGZyb20gZmlnIDQtOCB0byBhdm9pZCBleHRyYSBuZWdhdGlvbnMuICovCi0gICAgejUgPSAodG1wMTAgLSB0bXAxMikgKiAoKEZBU1RfRkxPQVQpIDAuMzgyNjgzNDMzKTsgLyogYzYgKi8KLSAgICB6MiA9ICgoRkFTVF9GTE9BVCkgMC41NDExOTYxMDApICogdG1wMTAgKyB6NTsgLyogYzItYzYgKi8KLSAgICB6NCA9ICgoRkFTVF9GTE9BVCkgMS4zMDY1NjI5NjUpICogdG1wMTIgKyB6NTsgLyogYzIrYzYgKi8KLSAgICB6MyA9IHRtcDExICogKChGQVNUX0ZMT0FUKSAwLjcwNzEwNjc4MSk7IC8qIGM0ICovCi0KLSAgICB6MTEgPSB0bXA3ICsgejM7CQkvKiBwaGFzZSA1ICovCi0gICAgejEzID0gdG1wNyAtIHozOwotCi0gICAgZGF0YXB0cltEQ1RTSVpFKjVdID0gejEzICsgejI7IC8qIHBoYXNlIDYgKi8KLSAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSB6MTMgLSB6MjsKLSAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSB6MTEgKyB6NDsKLSAgICBkYXRhcHRyW0RDVFNJWkUqN10gPSB6MTEgLSB6NDsKLQotICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KLSAgfQotfQotCi0jZW5kaWYgLyogRENUX0ZMT0FUX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamZkY3Rmc3QuYyBiL2xpYmpwZWd0d3JwL2pmZGN0ZnN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYjM3OGEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamZkY3Rmc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogamZkY3Rmc3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmFzdCwgbm90IHNvIGFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuCi0gKgotICogQSAyLUQgRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBEQ1Qgb24gZWFjaCByb3cgZm9sbG93ZWQgYnkgMS1EIERDVAotICogb24gZWFjaCBjb2x1bW4uICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZQotICogbXVjaCBtb3JlIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCi0gKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgotICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCi0gKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQotICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCi0gKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKLSAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKLSAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKLSAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgotICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKLSAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCi0gKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGZpeGVkLXBvaW50IG1hdGgsCi0gKiBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlZAotICogcXVhbnRpemF0aW9uIHZhbHVlcy4gIFRoZSBzbWFsbGVyIHRoZSBxdWFudGl6YXRpb24gdGFibGUgZW50cnksIHRoZSBsZXNzCi0gKiBwcmVjaXNlIHRoZSBzY2FsZWQgdmFsdWUsIHNvIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyB3b3JzZSB3aXRoIGhpZ2gtCi0gKiBxdWFsaXR5LXNldHRpbmcgZmlsZXMgdGhhbiB3aXRoIGxvdy1xdWFsaXR5IG9uZXMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCi0KLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0KLQotLyoKLSAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotICovCi0KLSNpZiBEQ1RTSVpFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLQotLyogU2NhbGluZyBkZWNpc2lvbnMgYXJlIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBpbiB0aGUgTEwmTSBhbGdvcml0aG07Ci0gKiBzZWUgamZkY3RpbnQuYyBmb3IgbW9yZSBkZXRhaWxzLiAgSG93ZXZlciwgd2UgY2hvb3NlIHRvIGRlc2NhbGUKLSAqIChyaWdodCBzaGlmdCkgbXVsdGlwbGljYXRpb24gcHJvZHVjdHMgYXMgc29vbiBhcyB0aGV5IGFyZSBmb3JtZWQsCi0gKiByYXRoZXIgdGhhbiBjYXJyeWluZyBhZGRpdGlvbmFsIGZyYWN0aW9uYWwgYml0cyBpbnRvIHN1YnNlcXVlbnQgYWRkaXRpb25zLgotICogVGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSBzbGlnaHRseSwgYnV0IGl0IGxldHMgdXMgc2F2ZSBhIGZldyBzaGlmdHMuCi0gKiBNb3JlIGltcG9ydGFudGx5LCAxNi1iaXQgYXJpdGhtZXRpYyBpcyB0aGVuIGFkZXF1YXRlIChmb3IgOC1iaXQgc2FtcGxlcykKLSAqIGV2ZXJ5d2hlcmUgZXhjZXB0IGluIHRoZSBtdWx0aXBsaWNhdGlvbnMgcHJvcGVyOyB0aGlzIHNhdmVzIGEgZ29vZCBkZWFsCi0gKiBvZiB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCi0gKgotICogQWdhaW4gdG8gc2F2ZSBhIGZldyBzaGlmdHMsIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBiZXR3ZWVuIHBhc3MgMSBhbmQKLSAqIHBhc3MgMiBhcmUgbm90IHVwc2NhbGVkLCBidXQgYXJlIHJlcHJlc2VudGVkIG9ubHkgdG8gaW50ZWdyYWwgcHJlY2lzaW9uLgotICoKLSAqIEEgZmluYWwgY29tcHJvbWlzZSBpcyB0byByZXByZXNlbnQgdGhlIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50cyB0byBvbmx5Ci0gKiA4IGZyYWN0aW9uYWwgYml0cywgcmF0aGVyIHRoYW4gMTMuICBUaGlzIHNhdmVzIHNvbWUgc2hpZnRpbmcgd29yayBvbiBzb21lCi0gKiBtYWNoaW5lcywgYW5kIG1heSBhbHNvIHJlZHVjZSB0aGUgY29zdCBvZiBtdWx0aXBsaWNhdGlvbiAoc2luY2UgdGhlcmUKLSAqIGFyZSBmZXdlciBvbmUtYml0cyBpbiB0aGUgY29uc3RhbnRzKS4KLSAqLwotCi0jZGVmaW5lIENPTlNUX0JJVFMgIDgKLQotCi0vKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKLSAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgotICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KLSAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KLSAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCi0gKi8KLQotI2lmIENPTlNUX0JJVFMgPT0gOAotI2RlZmluZSBGSVhfMF8zODI2ODM0MzMgICgoSU5UMzIpICAgOTgpCQkvKiBGSVgoMC4zODI2ODM0MzMpICovCi0jZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgKChJTlQzMikgIDEzOSkJCS8qIEZJWCgwLjU0MTE5NjEwMCkgKi8KLSNkZWZpbmUgRklYXzBfNzA3MTA2NzgxICAoKElOVDMyKSAgMTgxKQkJLyogRklYKDAuNzA3MTA2NzgxKSAqLwotI2RlZmluZSBGSVhfMV8zMDY1NjI5NjUgICgoSU5UMzIpICAzMzQpCQkvKiBGSVgoMS4zMDY1NjI5NjUpICovCi0jZWxzZQotI2RlZmluZSBGSVhfMF8zODI2ODM0MzMgIEZJWCgwLjM4MjY4MzQzMykKLSNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICBGSVgoMC41NDExOTYxMDApCi0jZGVmaW5lIEZJWF8wXzcwNzEwNjc4MSAgRklYKDAuNzA3MTA2NzgxKQotI2RlZmluZSBGSVhfMV8zMDY1NjI5NjUgIEZJWCgxLjMwNjU2Mjk2NSkKLSNlbmRpZgotCi0KLS8qIFdlIGNhbiBnYWluIGEgbGl0dGxlIG1vcmUgc3BlZWQsIHdpdGggYSBmdXJ0aGVyIGNvbXByb21pc2UgaW4gYWNjdXJhY3ksCi0gKiBieSBvbWl0dGluZyB0aGUgYWRkaXRpb24gaW4gYSBkZXNjYWxpbmcgc2hpZnQuICBUaGlzIHlpZWxkcyBhbiBpbmNvcnJlY3RseQotICogcm91bmRlZCByZXN1bHQgaGFsZiB0aGUgdGltZS4uLgotICovCi0KLSNpZm5kZWYgVVNFX0FDQ1VSQVRFX1JPVU5ESU5HCi0jdW5kZWYgREVTQ0FMRQotI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKHgsIG4pCi0jZW5kaWYKLQotCi0vKiBNdWx0aXBseSBhIERDVEVMRU0gdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQsIGFuZCBpbW1lZGlhdGVseQotICogZGVzY2FsZSB0byB5aWVsZCBhIERDVEVMRU0gcmVzdWx0LgotICovCi0KLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKChEQ1RFTEVNKSBERVNDQUxFKCh2YXIpICogKGNvbnN0KSwgQ09OU1RfQklUUykpCi0KLQotLyoKLSAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19mZGN0X2lmYXN0IChEQ1RFTEVNICogZGF0YSkKLXsKLSAgRENURUxFTSB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICBEQ1RFTEVNIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwotICBEQ1RFTEVNIHoxLCB6MiwgejMsIHo0LCB6NSwgejExLCB6MTM7Ci0gIERDVEVMRU0gKmRhdGFwdHI7Ci0gIGludCBjdHI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCi0KLSAgZGF0YXB0ciA9IGRhdGE7Ci0gIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKLSAgICB0bXAwID0gZGF0YXB0clswXSArIGRhdGFwdHJbN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbMF0gLSBkYXRhcHRyWzddOwotICAgIHRtcDEgPSBkYXRhcHRyWzFdICsgZGF0YXB0cls2XTsKLSAgICB0bXA2ID0gZGF0YXB0clsxXSAtIGRhdGFwdHJbNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbMl0gKyBkYXRhcHRyWzVdOwotICAgIHRtcDUgPSBkYXRhcHRyWzJdIC0gZGF0YXB0cls1XTsKLSAgICB0bXAzID0gZGF0YXB0clszXSArIGRhdGFwdHJbNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbM10gLSBkYXRhcHRyWzRdOwotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CS8qIHBoYXNlIDIgKi8KLSAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOwotICAgIHRtcDExID0gdG1wMSArIHRtcDI7Ci0gICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKLSAgICAKLSAgICBkYXRhcHRyWzBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLwotICAgIGRhdGFwdHJbNF0gPSB0bXAxMCAtIHRtcDExOwotICAgIAotICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KLSAgICBkYXRhcHRyWzJdID0gdG1wMTMgKyB6MTsJLyogcGhhc2UgNSAqLwotICAgIGRhdGFwdHJbNl0gPSB0bXAxMyAtIHoxOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKLSAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OwotCi0gICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KLSAgICB6NSA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWF8wXzM4MjY4MzQzMyk7IC8qIGM2ICovCi0gICAgejIgPSBNVUxUSVBMWSh0bXAxMCwgRklYXzBfNTQxMTk2MTAwKSArIHo1OyAvKiBjMi1jNiAqLwotICAgIHo0ID0gTVVMVElQTFkodG1wMTIsIEZJWF8xXzMwNjU2Mjk2NSkgKyB6NTsgLyogYzIrYzYgKi8KLSAgICB6MyA9IE1VTFRJUExZKHRtcDExLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLwotCi0gICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLwotICAgIHoxMyA9IHRtcDcgLSB6MzsKLQotICAgIGRhdGFwdHJbNV0gPSB6MTMgKyB6MjsJLyogcGhhc2UgNiAqLwotICAgIGRhdGFwdHJbM10gPSB6MTMgLSB6MjsKLSAgICBkYXRhcHRyWzFdID0gejExICsgejQ7Ci0gICAgZGF0YXB0cls3XSA9IHoxMSAtIHo0OwotCi0gICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gIH0KLQotICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4gKi8KLQotICBkYXRhcHRyID0gZGF0YTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgewotICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKLSAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOwotICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo1XTsKLSAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOwotICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLwotICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IHRtcDEwIC0gdG1wMTE7Ci0gICAgCi0gICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLwotICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IHRtcDEzICsgejE7IC8qIHBoYXNlIDUgKi8KLSAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSB0bXAxMyAtIHoxOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKLSAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OwotCi0gICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KLSAgICB6NSA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWF8wXzM4MjY4MzQzMyk7IC8qIGM2ICovCi0gICAgejIgPSBNVUxUSVBMWSh0bXAxMCwgRklYXzBfNTQxMTk2MTAwKSArIHo1OyAvKiBjMi1jNiAqLwotICAgIHo0ID0gTVVMVElQTFkodG1wMTIsIEZJWF8xXzMwNjU2Mjk2NSkgKyB6NTsgLyogYzIrYzYgKi8KLSAgICB6MyA9IE1VTFRJUExZKHRtcDExLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLwotCi0gICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLwotICAgIHoxMyA9IHRtcDcgLSB6MzsKLQotICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IHoxMyArIHoyOyAvKiBwaGFzZSA2ICovCi0gICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gejEzIC0gejI7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gejExICsgejQ7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjddID0gejExIC0gejQ7Ci0KLSAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCi0gIH0KLX0KLQotI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pmZGN0aW50LmMgYi9saWJqcGVndHdycC9qZmRjdGludC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTc4YjY0Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pmZGN0aW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoKLSAqIGpmZGN0aW50LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuCi0gKgotICogQSAyLUQgRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBEQ1Qgb24gZWFjaCByb3cgZm9sbG93ZWQgYnkgMS1EIERDVAotICogb24gZWFjaCBjb2x1bW4uICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZQotICogbXVjaCBtb3JlIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBhbGdvcml0aG0gZGVzY3JpYmVkIGluCi0gKiAgIEMuIExvZWZmbGVyLCBBLiBMaWd0ZW5iZXJnIGFuZCBHLiBNb3NjaHl0eiwgIlByYWN0aWNhbCBGYXN0IDEtRCBEQ1QKLSAqICAgQWxnb3JpdGhtcyB3aXRoIDExIE11bHRpcGxpY2F0aW9ucyIsIFByb2MuIEludCdsLiBDb25mLiBvbiBBY291c3RpY3MsCi0gKiAgIFNwZWVjaCwgYW5kIFNpZ25hbCBQcm9jZXNzaW5nIDE5ODkgKElDQVNTUCAnODkpLCBwcC4gOTg4LTk5MS4KLSAqIFRoZSBwcmltYXJ5IGFsZ29yaXRobSBkZXNjcmliZWQgdGhlcmUgdXNlcyAxMSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzLgotICogV2UgdXNlIHRoZWlyIGFsdGVybmF0ZSBtZXRob2Qgd2l0aCAxMiBtdWx0aXBsaWVzIGFuZCAzMiBhZGRzLgotICogVGhlIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IG5vIGRhdGEgcGF0aCBjb250YWlucyBtb3JlIHRoYW4gb25lCi0gKiBtdWx0aXBsaWNhdGlvbjsgdGhpcyBhbGxvd3MgYSB2ZXJ5IHNpbXBsZSBhbmQgYWNjdXJhdGUgaW1wbGVtZW50YXRpb24gaW4KLSAqIHNjYWxlZCBmaXhlZC1wb2ludCBhcml0aG1ldGljLCB3aXRoIGEgbWluaW1hbCBudW1iZXIgb2Ygc2hpZnRzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLSAqLwotCi0jaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0KLS8qCi0gKiBUaGUgcG9vcCBvbiB0aGlzIHNjYWxpbmcgc3R1ZmYgaXMgYXMgZm9sbG93czoKLSAqCi0gKiBFYWNoIDEtRCBEQ1Qgc3RlcCBwcm9kdWNlcyBvdXRwdXRzIHdoaWNoIGFyZSBhIGZhY3RvciBvZiBzcXJ0KE4pCi0gKiBsYXJnZXIgdGhhbiB0aGUgdHJ1ZSBEQ1Qgb3V0cHV0cy4gIFRoZSBmaW5hbCBvdXRwdXRzIGFyZSB0aGVyZWZvcmUKLSAqIGEgZmFjdG9yIG9mIE4gbGFyZ2VyIHRoYW4gZGVzaXJlZDsgc2luY2UgTj04IHRoaXMgY2FuIGJlIGN1cmVkIGJ5Ci0gKiBhIHNpbXBsZSByaWdodCBzaGlmdCBhdCB0aGUgZW5kIG9mIHRoZSBhbGdvcml0aG0uICBUaGUgYWR2YW50YWdlIG9mCi0gKiB0aGlzIGFycmFuZ2VtZW50IGlzIHRoYXQgd2Ugc2F2ZSB0d28gbXVsdGlwbGljYXRpb25zIHBlciAxLUQgRENULAotICogYmVjYXVzZSB0aGUgeTAgYW5kIHk0IG91dHB1dHMgbmVlZCBub3QgYmUgZGl2aWRlZCBieSBzcXJ0KE4pLgotICogSW4gdGhlIElKRyBjb2RlLCB0aGlzIGZhY3RvciBvZiA4IGlzIHJlbW92ZWQgYnkgdGhlIHF1YW50aXphdGlvbiBzdGVwCi0gKiAoaW4gamNkY3RtZ3IuYyksIE5PVCBpbiB0aGlzIG1vZHVsZS4KLSAqCi0gKiBXZSBoYXZlIHRvIGRvIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiBvZiB0aGUgaW50ZWdlciBpbnB1dHMsIHdoaWNoCi0gKiBpcyBubyBwcm9ibGVtLCBhbmQgbXVsdGlwbGljYXRpb24gYnkgZnJhY3Rpb25hbCBjb25zdGFudHMsIHdoaWNoIGlzCi0gKiBhIHByb2JsZW0gdG8gZG8gaW4gaW50ZWdlciBhcml0aG1ldGljLiAgV2UgbXVsdGlwbHkgYWxsIHRoZSBjb25zdGFudHMKLSAqIGJ5IENPTlNUX1NDQUxFIGFuZCBjb252ZXJ0IHRoZW0gdG8gaW50ZWdlciBjb25zdGFudHMgKHRodXMgcmV0YWluaW5nCi0gKiBDT05TVF9CSVRTIGJpdHMgb2YgcHJlY2lzaW9uIGluIHRoZSBjb25zdGFudHMpLiAgQWZ0ZXIgZG9pbmcgYQotICogbXVsdGlwbGljYXRpb24gd2UgaGF2ZSB0byBkaXZpZGUgdGhlIHByb2R1Y3QgYnkgQ09OU1RfU0NBTEUsIHdpdGggcHJvcGVyCi0gKiByb3VuZGluZywgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvdXRwdXQuICBUaGlzIGRpdmlzaW9uIGNhbiBiZSBkb25lCi0gKiBjaGVhcGx5IGFzIGEgcmlnaHQgc2hpZnQgb2YgQ09OU1RfQklUUyBiaXRzLiAgV2UgcG9zdHBvbmUgc2hpZnRpbmcKLSAqIGFzIGxvbmcgYXMgcG9zc2libGUgc28gdGhhdCBwYXJ0aWFsIHN1bXMgY2FuIGJlIGFkZGVkIHRvZ2V0aGVyIHdpdGgKLSAqIGZ1bGwgZnJhY3Rpb25hbCBwcmVjaXNpb24uCi0gKgotICogVGhlIG91dHB1dHMgb2YgdGhlIGZpcnN0IHBhc3MgYXJlIHNjYWxlZCB1cCBieSBQQVNTMV9CSVRTIGJpdHMgc28gdGhhdAotICogdGhleSBhcmUgcmVwcmVzZW50ZWQgdG8gYmV0dGVyLXRoYW4taW50ZWdyYWwgcHJlY2lzaW9uLiAgVGhlc2Ugb3V0cHV0cwotICogcmVxdWlyZSBCSVRTX0lOX0pTQU1QTEUgKyBQQVNTMV9CSVRTICsgMyBiaXRzOyB0aGlzIGZpdHMgaW4gYSAxNi1iaXQgd29yZAotICogd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZy4gIChGb3IgMTItYml0IHNhbXBsZSBkYXRhLCB0aGUgaW50ZXJtZWRpYXRlCi0gKiBhcnJheSBpcyBJTlQzMiBhbnl3YXkuKQotICoKLSAqIFRvIGF2b2lkIG92ZXJmbG93IG9mIHRoZSAzMi1iaXQgaW50ZXJtZWRpYXRlIHJlc3VsdHMgaW4gcGFzcyAyLCB3ZSBtdXN0Ci0gKiBoYXZlIEJJVFNfSU5fSlNBTVBMRSArIENPTlNUX0JJVFMgKyBQQVNTMV9CSVRTIDw9IDI2LiAgRXJyb3IgYW5hbHlzaXMKLSAqIHNob3dzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBhcmUgdGhlIG1vc3QgZWZmZWN0aXZlLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAyCi0jZWxzZQotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLwotI2VuZGlmCi0KLS8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cwotICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCi0gKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgotICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgotICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKLSAqLwotCi0jaWYgQ09OU1RfQklUUyA9PSAxMwotI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgICgoSU5UMzIpICAyNDQ2KQkvKiBGSVgoMC4yOTg2MzEzMzYpICovCi0jZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgKChJTlQzMikgIDMxOTYpCS8qIEZJWCgwLjM5MDE4MDY0NCkgKi8KLSNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoKElOVDMyKSAgNDQzMykJLyogRklYKDAuNTQxMTk2MTAwKSAqLwotI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICgoSU5UMzIpICA2MjcwKQkvKiBGSVgoMC43NjUzNjY4NjUpICovCi0jZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KLSNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICAoKElOVDMyKSAgOTYzMykJLyogRklYKDEuMTc1ODc1NjAyKSAqLwotI2RlZmluZSBGSVhfMV81MDEzMjExMTAgICgoSU5UMzIpICAxMjI5OSkJLyogRklYKDEuNTAxMzIxMTEwKSAqLwotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLwotI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgICgoSU5UMzIpICAxNjA2OSkJLyogRklYKDEuOTYxNTcwNTYwKSAqLwotI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgICgoSU5UMzIpICAxNjgxOSkJLyogRklYKDIuMDUzMTE5ODY5KSAqLwotI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLwotI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgICgoSU5UMzIpICAyNTE3MikJLyogRklYKDMuMDcyNzExMDI2KSAqLwotI2Vsc2UKLSNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICBGSVgoMC4yOTg2MzEzMzYpCi0jZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgRklYKDAuMzkwMTgwNjQ0KQotI2RlZmluZSBGSVhfMF81NDExOTYxMDAgIEZJWCgwLjU0MTE5NjEwMCkKLSNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICBGSVgoMC43NjUzNjY4NjUpCi0jZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQotI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgIEZJWCgxLjE3NTg3NTYwMikKLSNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICBGSVgoMS41MDEzMjExMTApCi0jZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQotI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgIEZJWCgxLjk2MTU3MDU2MCkKLSNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICBGSVgoMi4wNTMxMTk4NjkpCi0jZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQotI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgIEZJWCgzLjA3MjcxMTAyNikKLSNlbmRpZgotCi0KLS8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KLSAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKLSAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKLSAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCi0gKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQotI2Vsc2UKLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKLSNlbmRpZgotCi0KLS8qCi0gKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZmRjdF9pc2xvdyAoRENURUxFTSAqIGRhdGEpCi17Ci0gIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwotICBJTlQzMiB6MSwgejIsIHozLCB6NCwgejU7Ci0gIERDVEVMRU0gKmRhdGFwdHI7Ci0gIGludCBjdHI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCi0gIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KLSAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCi0KLSAgZGF0YXB0ciA9IGRhdGE7Ci0gIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKLSAgICB0bXAwID0gZGF0YXB0clswXSArIGRhdGFwdHJbN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbMF0gLSBkYXRhcHRyWzddOwotICAgIHRtcDEgPSBkYXRhcHRyWzFdICsgZGF0YXB0cls2XTsKLSAgICB0bXA2ID0gZGF0YXB0clsxXSAtIGRhdGFwdHJbNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbMl0gKyBkYXRhcHRyWzVdOwotICAgIHRtcDUgPSBkYXRhcHRyWzJdIC0gZGF0YXB0cls1XTsKLSAgICB0bXAzID0gZGF0YXB0clszXSArIGRhdGFwdHJbNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbM10gLSBkYXRhcHRyWzRdOwotICAgIAotICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OwotICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCi0gICAgICovCi0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKLSAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOwotICAgIHRtcDExID0gdG1wMSArIHRtcDI7Ci0gICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKLSAgICAKLSAgICBkYXRhcHRyWzBdID0gKERDVEVMRU0pICgodG1wMTAgKyB0bXAxMSkgPDwgUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0cls0XSA9IChEQ1RFTEVNKSAoKHRtcDEwIC0gdG1wMTEpIDw8IFBBU1MxX0JJVFMpOwotICAgIAotICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKLSAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMywgRklYXzBfNzY1MzY2ODY1KSwKLQkJCQkgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbNl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEyLCAtIEZJWF8xXzg0Nzc1OTA2NSksCi0JCQkJICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDggLS0tIG5vdGUgcGFwZXIgb21pdHMgZmFjdG9yIG9mIHNxcnQoMikuCi0gICAgICogY0sgcmVwcmVzZW50cyBjb3MoSypwaS8xNikuCi0gICAgICogaTAuLmkzIGluIHRoZSBwYXBlciBhcmUgdG1wNC4udG1wNyBoZXJlLgotICAgICAqLwotICAgIAotICAgIHoxID0gdG1wNCArIHRtcDc7Ci0gICAgejIgPSB0bXA1ICsgdG1wNjsKLSAgICB6MyA9IHRtcDQgKyB0bXA2OwotICAgIHo0ID0gdG1wNSArIHRtcDc7Ci0gICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KLSAgICAKLSAgICB0bXA0ID0gTVVMVElQTFkodG1wNCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCi0gICAgdG1wNSA9IE1VTFRJUExZKHRtcDUsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLwotICAgIHRtcDYgPSBNVUxUSVBMWSh0bXA2LCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KLSAgICB0bXA3ID0gTVVMVElQTFkodG1wNywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCi0gICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLwotICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCi0gICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KLSAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCi0gICAgCi0gICAgejMgKz0gejU7Ci0gICAgejQgKz0gejU7Ci0gICAgCi0gICAgZGF0YXB0cls3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDQgKyB6MSArIHozLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA1ICsgejIgKyB6NCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNiArIHoyICsgejMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0clsxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDcgKyB6MSArIHo0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIAotICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci0KLSAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCi0gICAqIFdlIHJlbW92ZSB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLCBidXQgbGVhdmUgdGhlIHJlc3VsdHMgc2NhbGVkIHVwCi0gICAqIGJ5IGFuIG92ZXJhbGwgZmFjdG9yIG9mIDguCi0gICAqLwotCi0gIGRhdGFwdHIgPSBkYXRhOwotICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7Ci0gICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSo3XTsKLSAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjddOwotICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqNl07Ci0gICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSo2XTsKLSAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjVdOwotICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqMl0gLSBkYXRhcHRyW0RDVFNJWkUqNV07Ci0gICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIGRhdGFwdHJbRENUU0laRSo0XTsKLSAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjRdOwotICAgIAotICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OwotICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCi0gICAgICovCi0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKLSAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOwotICAgIHRtcDExID0gdG1wMSArIHRtcDI7Ci0gICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKLSAgICAKLSAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMCArIHRtcDExLCBQQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMCAtIHRtcDExLCBQQVNTMV9CSVRTKTsKLSAgICAKLSAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzU0MTE5NjEwMCk7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMywgRklYXzBfNzY1MzY2ODY1KSwKLQkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEyLCAtIEZJWF8xXzg0Nzc1OTA2NSksCi0JCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4IC0tLSBub3RlIHBhcGVyIG9taXRzIGZhY3RvciBvZiBzcXJ0KDIpLgotICAgICAqIGNLIHJlcHJlc2VudHMgY29zKEsqcGkvMTYpLgotICAgICAqIGkwLi5pMyBpbiB0aGUgcGFwZXIgYXJlIHRtcDQuLnRtcDcgaGVyZS4KLSAgICAgKi8KLSAgICAKLSAgICB6MSA9IHRtcDQgKyB0bXA3OwotICAgIHoyID0gdG1wNSArIHRtcDY7Ci0gICAgejMgPSB0bXA0ICsgdG1wNjsKLSAgICB6NCA9IHRtcDUgKyB0bXA3OwotICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCi0gICAgCi0gICAgdG1wNCA9IE1VTFRJUExZKHRtcDQsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDUgPSBNVUxUSVBMWSh0bXA1LCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KLSAgICB0bXA2ID0gTVVMVElQTFkodG1wNiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCi0gICAgdG1wNyA9IE1VTFRJUExZKHRtcDcsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLwotICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KLSAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLwotICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCi0gICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLwotICAgIAotICAgIHozICs9IHo1OwotICAgIHo0ICs9IHo1OwotICAgIAotICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDQgKyB6MSArIHozLAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDUgKyB6MiArIHo0LAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDYgKyB6MiArIHozLAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDcgKyB6MSArIHo0LAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIAotICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KLSAgfQotfQotCi0jZW5kaWYgLyogRENUX0lTTE9XX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamlkY3RmbHQuYyBiL2xpYmpwZWd0d3JwL2ppZGN0Zmx0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODhjZTMuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamlkY3RmbHQuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKgotICogamlkY3RmbHQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmxvYXRpbmctcG9pbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuICBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgcm91dGluZQotICogbXVzdCBhbHNvIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gb2YgdGhlIGlucHV0IGNvZWZmaWNpZW50cy4KLSAqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBtb3JlIGFjY3VyYXRlIHRoYW4gZWl0aGVyIG9mIHRoZSBpbnRlZ2VyCi0gKiBJRENUIGltcGxlbWVudGF0aW9ucy4gIEhvd2V2ZXIsIGl0IG1heSBub3QgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIG9uIGFsbAotICogbWFjaGluZXMgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBpbiByb3VuZG9mZiBiZWhhdmlvci4gIFNwZWVkIHdpbGwgZGVwZW5kCi0gKiBvbiB0aGUgaGFyZHdhcmUncyBmbG9hdGluZyBwb2ludCBjYXBhY2l0eS4KLSAqCi0gKiBBIDItRCBJRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBJRENUIG9uIGVhY2ggY29sdW1uIGZvbGxvd2VkIGJ5IDEtRCBJRENUCi0gKiBvbiBlYWNoIHJvdyAob3IgdmljZSB2ZXJzYSwgYnV0IGl0J3MgbW9yZSBjb252ZW5pZW50IHRvIGVtaXQgYSByb3cgYXQKLSAqIGEgdGltZSkuICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZSBtdWNoIG1vcmUKLSAqIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCi0gKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgotICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCi0gKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQotICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCi0gKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKLSAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKLSAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKLSAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgotICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKLSAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCi0gKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGEgZml4ZWQtcG9pbnQKLSAqIGltcGxlbWVudGF0aW9uLCBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gKiBzY2FsZWQgcXVhbnRpemF0aW9uIHZhbHVlcy4gIEhvd2V2ZXIsIHRoYXQgcHJvYmxlbSBkb2VzIG5vdCBhcmlzZSBpZgotICogd2UgdXNlIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCi0KLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0KLQotLyoKLSAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotICovCi0KLSNpZiBEQ1RTSVpFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLQotLyogRGVxdWFudGl6ZSBhIGNvZWZmaWNpZW50IGJ5IG11bHRpcGx5aW5nIGl0IGJ5IHRoZSBtdWx0aXBsaWVyLXRhYmxlCi0gKiBlbnRyeTsgcHJvZHVjZSBhIGZsb2F0IHJlc3VsdC4KLSAqLwotCi0jZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKEZBU1RfRkxPQVQpIChjb2VmKSkgKiAocXVhbnR2YWwpKQotCi0KLS8qCi0gKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19pZGN0X2Zsb2F0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgRkFTVF9GTE9BVCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICBGQVNUX0ZMT0FUIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwotICBGQVNUX0ZMT0FUIHo1LCB6MTAsIHoxMSwgejEyLCB6MTM7Ci0gIEpDT0VGUFRSIGlucHRyOwotICBGTE9BVF9NVUxUX1RZUEUgKiBxdWFudHB0cjsKLSAgRkFTVF9GTE9BVCAqIHdzcHRyOwotICBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7Ci0gIGludCBjdHI7Ci0gIEZBU1RfRkxPQVQgd29ya3NwYWNlW0RDVFNJWkUyXTsgLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCi0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLwotCi0gIGlucHRyID0gY29lZl9ibG9jazsKLSAgcXVhbnRwdHIgPSAoRkxPQVRfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKLSAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0Ci0gICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKLSAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAotICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKLSAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KLSAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCi0gICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCi0gICAgICovCi0gICAgCi0gICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo0XSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSo1XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqN10gPT0gMCkgewotICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KLSAgICAgIEZBU1RfRkxPQVQgZGN2YWwgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOwotICAgICAgCi0gICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjRdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjVdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjZdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjddID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLwotICAgICAgcXVhbnRwdHIrKzsKLSAgICAgIHdzcHRyKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0KLSAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKLSAgICB0bXAxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKLSAgICB0bXAyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKLSAgICB0bXAzID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKLQotICAgIHRtcDEwID0gdG1wMCArIHRtcDI7CS8qIHBoYXNlIDMgKi8KLSAgICB0bXAxMSA9IHRtcDAgLSB0bXAyOwotCi0gICAgdG1wMTMgPSB0bXAxICsgdG1wMzsJLyogcGhhc2VzIDUtMyAqLwotICAgIHRtcDEyID0gKHRtcDEgLSB0bXAzKSAqICgoRkFTVF9GTE9BVCkgMS40MTQyMTM1NjIpIC0gdG1wMTM7IC8qIDIqYzQgKi8KLQotICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOwkvKiBwaGFzZSAyICovCi0gICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7Ci0gICAgdG1wMSA9IHRtcDExICsgdG1wMTI7Ci0gICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgKi8KLQotICAgIHRtcDQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOwotICAgIHRtcDUgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOwotICAgIHRtcDYgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOwotICAgIHRtcDcgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOwotCi0gICAgejEzID0gdG1wNiArIHRtcDU7CQkvKiBwaGFzZSA2ICovCi0gICAgejEwID0gdG1wNiAtIHRtcDU7Ci0gICAgejExID0gdG1wNCArIHRtcDc7Ci0gICAgejEyID0gdG1wNCAtIHRtcDc7Ci0KLSAgICB0bXA3ID0gejExICsgejEzOwkJLyogcGhhc2UgNSAqLwotICAgIHRtcDExID0gKHoxMSAtIHoxMykgKiAoKEZBU1RfRkxPQVQpIDEuNDE0MjEzNTYyKTsgLyogMipjNCAqLwotCi0gICAgejUgPSAoejEwICsgejEyKSAqICgoRkFTVF9GTE9BVCkgMS44NDc3NTkwNjUpOyAvKiAyKmMyICovCi0gICAgdG1wMTAgPSAoKEZBU1RfRkxPQVQpIDEuMDgyMzkyMjAwKSAqIHoxMiAtIHo1OyAvKiAyKihjMi1jNikgKi8KLSAgICB0bXAxMiA9ICgoRkFTVF9GTE9BVCkgLTIuNjEzMTI1OTMwKSAqIHoxMCArIHo1OyAvKiAtMiooYzIrYzYpICovCi0KLSAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OwkvKiBwaGFzZSAyICovCi0gICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKLSAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OwotCi0gICAgd3NwdHJbRENUU0laRSowXSA9IHRtcDAgKyB0bXA3OwotICAgIHdzcHRyW0RDVFNJWkUqN10gPSB0bXAwIC0gdG1wNzsKLSAgICB3c3B0cltEQ1RTSVpFKjFdID0gdG1wMSArIHRtcDY7Ci0gICAgd3NwdHJbRENUU0laRSo2XSA9IHRtcDEgLSB0bXA2OwotICAgIHdzcHRyW0RDVFNJWkUqMl0gPSB0bXAyICsgdG1wNTsKLSAgICB3c3B0cltEQ1RTSVpFKjVdID0gdG1wMiAtIHRtcDU7Ci0gICAgd3NwdHJbRENUU0laRSo0XSA9IHRtcDMgKyB0bXA0OwotICAgIHdzcHRyW0RDVFNJWkUqM10gPSB0bXAzIC0gdG1wNDsKLQotICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLwotICAgIHF1YW50cHRyKys7Ci0gICAgd3NwdHIrKzsKLSAgfQotICAKLSAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KLSAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMuICovCi0KLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gMDsgY3RyIDwgRENUU0laRTsgY3RyKyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOwotICAgIC8qIFJvd3Mgb2YgemVyb2VzIGNhbiBiZSBleHBsb2l0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdlIGRpZCB3aXRoIGNvbHVtbnMuCi0gICAgICogSG93ZXZlciwgdGhlIGNvbHVtbiBjYWxjdWxhdGlvbiBoYXMgY3JlYXRlZCBtYW55IG5vbnplcm8gQUMgdGVybXMsIHNvCi0gICAgICogdGhlIHNpbXBsaWZpY2F0aW9uIGFwcGxpZXMgbGVzcyBvZnRlbiAodHlwaWNhbGx5IDUlIHRvIDEwJSBvZiB0aGUgdGltZSkuCi0gICAgICogQW5kIHRlc3RpbmcgZmxvYXRzIGZvciB6ZXJvIGlzIHJlbGF0aXZlbHkgZXhwZW5zaXZlLCBzbyB3ZSBkb24ndCBib3RoZXIuCi0gICAgICovCi0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0KLSAgICB0bXAxMCA9IHdzcHRyWzBdICsgd3NwdHJbNF07Ci0gICAgdG1wMTEgPSB3c3B0clswXSAtIHdzcHRyWzRdOwotCi0gICAgdG1wMTMgPSB3c3B0clsyXSArIHdzcHRyWzZdOwotICAgIHRtcDEyID0gKHdzcHRyWzJdIC0gd3NwdHJbNl0pICogKChGQVNUX0ZMT0FUKSAxLjQxNDIxMzU2MikgLSB0bXAxMzsKLQotICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOwotICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOwotICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOwotICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOwotCi0gICAgLyogT2RkIHBhcnQgKi8KLQotICAgIHoxMyA9IHdzcHRyWzVdICsgd3NwdHJbM107Ci0gICAgejEwID0gd3NwdHJbNV0gLSB3c3B0clszXTsKLSAgICB6MTEgPSB3c3B0clsxXSArIHdzcHRyWzddOwotICAgIHoxMiA9IHdzcHRyWzFdIC0gd3NwdHJbN107Ci0KLSAgICB0bXA3ID0gejExICsgejEzOwotICAgIHRtcDExID0gKHoxMSAtIHoxMykgKiAoKEZBU1RfRkxPQVQpIDEuNDE0MjEzNTYyKTsKLQotICAgIHo1ID0gKHoxMCArIHoxMikgKiAoKEZBU1RfRkxPQVQpIDEuODQ3NzU5MDY1KTsgLyogMipjMiAqLwotICAgIHRtcDEwID0gKChGQVNUX0ZMT0FUKSAxLjA4MjM5MjIwMCkgKiB6MTIgLSB6NTsgLyogMiooYzItYzYpICovCi0gICAgdG1wMTIgPSAoKEZBU1RfRkxPQVQpIC0yLjYxMzEyNTkzMCkgKiB6MTAgKyB6NTsgLyogLTIqKGMyK2M2KSAqLwotCi0gICAgdG1wNiA9IHRtcDEyIC0gdG1wNzsKLSAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OwotICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7Ci0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IHNjYWxlIGRvd24gYnkgYSBmYWN0b3Igb2YgOCBhbmQgcmFuZ2UtbGltaXQgKi8KLQotICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMCArIHRtcDcpLCAzKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzddID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAwIC0gdG1wNyksIDMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDEgKyB0bXA2KSwgMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls2XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMSAtIHRtcDYpLCAzKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAyICsgdG1wNSksIDMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDIgLSB0bXA1KSwgMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMyArIHRtcDQpLCAzKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAzIC0gdG1wNCksIDMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICAKLSAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gIH0KLX0KLQotI2VuZGlmIC8qIERDVF9GTE9BVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ppZGN0ZnN0LmMgYi9saWJqcGVndHdycC9qaWRjdGZzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmE0MjE2Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ppZGN0ZnN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoKLSAqIGppZGN0ZnN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhIGZhc3QsIG5vdCBzbyBhY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICogaW52ZXJzZSBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiAgSW4gdGhlIElKRyBjb2RlLCB0aGlzIHJvdXRpbmUKLSAqIG11c3QgYWxzbyBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIG9mIHRoZSBpbnB1dCBjb2VmZmljaWVudHMuCi0gKgotICogQSAyLUQgSURDVCBjYW4gYmUgZG9uZSBieSAxLUQgSURDVCBvbiBlYWNoIGNvbHVtbiBmb2xsb3dlZCBieSAxLUQgSURDVAotICogb24gZWFjaCByb3cgKG9yIHZpY2UgdmVyc2EsIGJ1dCBpdCdzIG1vcmUgY29udmVuaWVudCB0byBlbWl0IGEgcm93IGF0Ci0gKiBhIHRpbWUpLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUgbXVjaCBtb3JlCi0gKiBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hJ3MgYWxnb3JpdGhtIGZvcgotICogc2NhbGVkIERDVC4gIFRoZWlyIG9yaWdpbmFsIHBhcGVyIChUcmFucy4gSUVJQ0UgRS03MSgxMSk6MTA5NSkgaXMgaW4KLSAqIEphcGFuZXNlLCBidXQgdGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gdGhlIFBlbm5lYmFrZXIgJiBNaXRjaGVsbAotICogSlBFRyB0ZXh0Ym9vayAoc2VlIFJFRkVSRU5DRVMgc2VjdGlvbiBpbiBmaWxlIFJFQURNRSkuICBUaGUgZm9sbG93aW5nIGNvZGUKLSAqIGlzIGJhc2VkIGRpcmVjdGx5IG9uIGZpZ3VyZSA0LTggaW4gUCZNLgotICogV2hpbGUgYW4gOC1wb2ludCBEQ1QgY2Fubm90IGJlIGRvbmUgaW4gbGVzcyB0aGFuIDExIG11bHRpcGxpZXMsIGl0IGlzCi0gKiBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSBjb21wdXRhdGlvbiBzbyB0aGF0IG1hbnkgb2YgdGhlIG11bHRpcGxpZXMgYXJlCi0gKiBzaW1wbGUgc2NhbGluZ3Mgb2YgdGhlIGZpbmFsIG91dHB1dHMuICBUaGVzZSBtdWx0aXBsaWVzIGNhbiB0aGVuIGJlCi0gKiBmb2xkZWQgaW50byB0aGUgbXVsdGlwbGljYXRpb25zIG9yIGRpdmlzaW9ucyBieSB0aGUgSlBFRyBxdWFudGl6YXRpb24KLSAqIHRhYmxlIGVudHJpZXMuICBUaGUgQUEmTiBtZXRob2QgbGVhdmVzIG9ubHkgNSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzCi0gKiB0byBiZSBkb25lIGluIHRoZSBEQ1QgaXRzZWxmLgotICogVGhlIHByaW1hcnkgZGlzYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgd2l0aCBmaXhlZC1wb2ludCBtYXRoLAotICogYWNjdXJhY3kgaXMgbG9zdCBkdWUgdG8gaW1wcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2FsZWQKLSAqIHF1YW50aXphdGlvbiB2YWx1ZXMuICBUaGUgc21hbGxlciB0aGUgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJ5LCB0aGUgbGVzcwotICogcHJlY2lzZSB0aGUgc2NhbGVkIHZhbHVlLCBzbyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgd29yc2Ugd2l0aCBoaWdoLQotICogcXVhbGl0eS1zZXR0aW5nIGZpbGVzIHRoYW4gd2l0aCBsb3ctcXVhbGl0eSBvbmVzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLSAqLwotCi0jaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0KLS8qIFNjYWxpbmcgZGVjaXNpb25zIGFyZSBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgaW4gdGhlIExMJk0gYWxnb3JpdGhtOwotICogc2VlIGppZGN0aW50LmMgZm9yIG1vcmUgZGV0YWlscy4gIEhvd2V2ZXIsIHdlIGNob29zZSB0byBkZXNjYWxlCi0gKiAocmlnaHQgc2hpZnQpIG11bHRpcGxpY2F0aW9uIHByb2R1Y3RzIGFzIHNvb24gYXMgdGhleSBhcmUgZm9ybWVkLAotICogcmF0aGVyIHRoYW4gY2FycnlpbmcgYWRkaXRpb25hbCBmcmFjdGlvbmFsIGJpdHMgaW50byBzdWJzZXF1ZW50IGFkZGl0aW9ucy4KLSAqIFRoaXMgY29tcHJvbWlzZXMgYWNjdXJhY3kgc2xpZ2h0bHksIGJ1dCBpdCBsZXRzIHVzIHNhdmUgYSBmZXcgc2hpZnRzLgotICogTW9yZSBpbXBvcnRhbnRseSwgMTYtYml0IGFyaXRobWV0aWMgaXMgdGhlbiBhZGVxdWF0ZSAoZm9yIDgtYml0IHNhbXBsZXMpCi0gKiBldmVyeXdoZXJlIGV4Y2VwdCBpbiB0aGUgbXVsdGlwbGljYXRpb25zIHByb3BlcjsgdGhpcyBzYXZlcyBhIGdvb2QgZGVhbAotICogb2Ygd29yayBvbiAxNi1iaXQtaW50IG1hY2hpbmVzLgotICoKLSAqIFRoZSBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgYXJlIG5vdCBpbnRlZ2VycyBiZWNhdXNlIHRoZSBBQSZOIHNjYWxpbmcKLSAqIGZhY3RvcnMgaGF2ZSBiZWVuIGluY29ycG9yYXRlZC4gIFdlIHJlcHJlc2VudCB0aGVtIHNjYWxlZCB1cCBieSBQQVNTMV9CSVRTLAotICogc28gdGhhdCB0aGUgZmlyc3QgYW5kIHNlY29uZCBJRENUIHJvdW5kcyBoYXZlIHRoZSBzYW1lIGlucHV0IHNjYWxpbmcuCi0gKiBGb3IgOC1iaXQgSlNBTVBMRXMsIHdlIGNob29zZSBJRkFTVF9TQ0FMRV9CSVRTID0gUEFTUzFfQklUUyBzbyBhcyB0bwotICogYXZvaWQgYSBkZXNjYWxpbmcgc2hpZnQ7IHRoaXMgY29tcHJvbWlzZXMgYWNjdXJhY3kgcmF0aGVyIGRyYXN0aWNhbGx5Ci0gKiBmb3Igc21hbGwgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJpZXMsIGJ1dCBpdCBzYXZlcyBhIGxvdCBvZiBzaGlmdHMuCi0gKiBGb3IgMTItYml0IEpTQU1QTEVzLCB0aGVyZSdzIG5vIGhvcGUgb2YgdXNpbmcgMTZ4MTYgbXVsdGlwbGllcyBhbnl3YXksCi0gKiBzbyB3ZSB1c2UgYSBtdWNoIGxhcmdlciBzY2FsaW5nIGZhY3RvciB0byBwcmVzZXJ2ZSBhY2N1cmFjeS4KLSAqCi0gKiBBIGZpbmFsIGNvbXByb21pc2UgaXMgdG8gcmVwcmVzZW50IHRoZSBtdWx0aXBsaWNhdGl2ZSBjb25zdGFudHMgdG8gb25seQotICogOCBmcmFjdGlvbmFsIGJpdHMsIHJhdGhlciB0aGFuIDEzLiAgVGhpcyBzYXZlcyBzb21lIHNoaWZ0aW5nIHdvcmsgb24gc29tZQotICogbWFjaGluZXMsIGFuZCBtYXkgYWxzbyByZWR1Y2UgdGhlIGNvc3Qgb2YgbXVsdGlwbGljYXRpb24gKHNpbmNlIHRoZXJlCi0gKiBhcmUgZmV3ZXIgb25lLWJpdHMgaW4gdGhlIGNvbnN0YW50cykuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIENPTlNUX0JJVFMgIDgKLSNkZWZpbmUgUEFTUzFfQklUUyAgMgotI2Vsc2UKLSNkZWZpbmUgQ09OU1RfQklUUyAgOAotI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLwotI2VuZGlmCi0KLS8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cwotICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCi0gKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgotICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgotICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKLSAqLwotCi0jaWYgQ09OU1RfQklUUyA9PSA4Ci0jZGVmaW5lIEZJWF8xXzA4MjM5MjIwMCAgKChJTlQzMikgIDI3NykJCS8qIEZJWCgxLjA4MjM5MjIwMCkgKi8KLSNkZWZpbmUgRklYXzFfNDE0MjEzNTYyICAoKElOVDMyKSAgMzYyKQkJLyogRklYKDEuNDE0MjEzNTYyKSAqLwotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICA0NzMpCQkvKiBGSVgoMS44NDc3NTkwNjUpICovCi0jZGVmaW5lIEZJWF8yXzYxMzEyNTkzMCAgKChJTlQzMikgIDY2OSkJCS8qIEZJWCgyLjYxMzEyNTkzMCkgKi8KLSNlbHNlCi0jZGVmaW5lIEZJWF8xXzA4MjM5MjIwMCAgRklYKDEuMDgyMzkyMjAwKQotI2RlZmluZSBGSVhfMV80MTQyMTM1NjIgIEZJWCgxLjQxNDIxMzU2MikKLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICBGSVgoMS44NDc3NTkwNjUpCi0jZGVmaW5lIEZJWF8yXzYxMzEyNTkzMCAgRklYKDIuNjEzMTI1OTMwKQotI2VuZGlmCi0KLQotLyogV2UgY2FuIGdhaW4gYSBsaXR0bGUgbW9yZSBzcGVlZCwgd2l0aCBhIGZ1cnRoZXIgY29tcHJvbWlzZSBpbiBhY2N1cmFjeSwKLSAqIGJ5IG9taXR0aW5nIHRoZSBhZGRpdGlvbiBpbiBhIGRlc2NhbGluZyBzaGlmdC4gIFRoaXMgeWllbGRzIGFuIGluY29ycmVjdGx5Ci0gKiByb3VuZGVkIHJlc3VsdCBoYWxmIHRoZSB0aW1lLi4uCi0gKi8KLQotI2lmbmRlZiBVU0VfQUNDVVJBVEVfUk9VTkRJTkcKLSN1bmRlZiBERVNDQUxFCi0jZGVmaW5lIERFU0NBTEUoeCxuKSAgUklHSFRfU0hJRlQoeCwgbikKLSNlbmRpZgotCi0KLS8qIE11bHRpcGx5IGEgRENURUxFTSB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCwgYW5kIGltbWVkaWF0ZWx5Ci0gKiBkZXNjYWxlIHRvIHlpZWxkIGEgRENURUxFTSByZXN1bHQuCi0gKi8KLQotI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKERDVEVMRU0pIERFU0NBTEUoKHZhcikgKiAoY29uc3QpLCBDT05TVF9CSVRTKSkKLQotCi0vKiBEZXF1YW50aXplIGEgY29lZmZpY2llbnQgYnkgbXVsdGlwbHlpbmcgaXQgYnkgdGhlIG11bHRpcGxpZXItdGFibGUKLSAqIGVudHJ5OyBwcm9kdWNlIGEgRENURUxFTSByZXN1bHQuICBGb3IgOC1iaXQgZGF0YSBhIDE2eDE2LT4xNgotICogbXVsdGlwbGljYXRpb24gd2lsbCBkby4gIEZvciAxMi1iaXQgZGF0YSwgdGhlIG11bHRpcGxpZXIgdGFibGUgaXMKLSAqIGRlY2xhcmVkIElOVDMyLCBzbyBhIDMyLWJpdCBtdWx0aXBseSB3aWxsIGJlIHVzZWQuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElGQVNUX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCi0jZWxzZQotI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICBcCi0JREVTQ0FMRSgoY29lZikqKHF1YW50dmFsKSwgSUZBU1RfU0NBTEVfQklUUy1QQVNTMV9CSVRTKQotI2VuZGlmCi0KLQotLyogTGlrZSBERVNDQUxFLCBidXQgYXBwbGllcyB0byBhIERDVEVMRU0gYW5kIHByb2R1Y2VzIGFuIGludC4KLSAqIFdlIGFzc3VtZSB0aGF0IGludCByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCBpZiBJTlQzMiByaWdodCBzaGlmdCBpcy4KLSAqLwotCi0jaWZkZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLSNkZWZpbmUgSVNISUZUX1RFTVBTCURDVEVMRU0gaXNoaWZ0X3RlbXA7Ci0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgRENURUxFTUJJVFMgIDE2CQkvKiBEQ1RFTEVNIG1heSBiZSAxNiBvciAzMiBiaXRzICovCi0jZWxzZQotI2RlZmluZSBEQ1RFTEVNQklUUyAgMzIJCS8qIERDVEVMRU0gbXVzdCBiZSAzMiBiaXRzICovCi0jZW5kaWYKLSNkZWZpbmUgSVJJR0hUX1NISUZUKHgsc2hmdCkgIFwKLSAgICAoKGlzaGlmdF90ZW1wID0gKHgpKSA8IDAgPyBcCi0gICAgIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpIHwgKCh+KChEQ1RFTEVNKSAwKSkgPDwgKERDVEVMRU1CSVRTLShzaGZ0KSkpIDogXAotICAgICAoaXNoaWZ0X3RlbXAgPj4gKHNoZnQpKSkKLSNlbHNlCi0jZGVmaW5lIElTSElGVF9URU1QUwotI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KQkoKHgpID4+IChzaGZ0KSkKLSNlbmRpZgotCi0jaWZkZWYgVVNFX0FDQ1VSQVRFX1JPVU5ESU5HCi0jZGVmaW5lIElERVNDQUxFKHgsbikgICgoaW50KSBJUklHSFRfU0hJRlQoKHgpICsgKDEgPDwgKChuKS0xKSksIG4pKQotI2Vsc2UKLSNkZWZpbmUgSURFU0NBTEUoeCxuKSAgKChpbnQpIElSSUdIVF9TSElGVCh4LCBuKSkKLSNlbmRpZgotCi0KLS8qCi0gKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19pZGN0X2lmYXN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgRENURUxFTSB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICBEQ1RFTEVNIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwotICBEQ1RFTEVNIHo1LCB6MTAsIHoxMSwgejEyLCB6MTM7Ci0gIEpDT0VGUFRSIGlucHRyOwotICBJRkFTVF9NVUxUX1RZUEUgKiBxdWFudHB0cjsKLSAgaW50ICogd3NwdHI7Ci0gIEpTQU1QUk9XIG91dHB0cjsKLSAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKLSAgaW50IGN0cjsKLSAgaW50IHdvcmtzcGFjZVtEQ1RTSVpFMl07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLwotICBTSElGVF9URU1QUwkJCS8qIGZvciBERVNDQUxFICovCi0gIElTSElGVF9URU1QUwkJCS8qIGZvciBJREVTQ0FMRSAqLwotCi0gIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KLQotICBpbnB0ciA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElGQVNUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGN0ci0tKSB7Ci0gICAgLyogRHVlIHRvIHF1YW50aXphdGlvbiwgd2Ugd2lsbCB1c3VhbGx5IGZpbmQgdGhhdCBtYW55IG9mIHRoZSBpbnB1dAotICAgICAqIGNvZWZmaWNpZW50cyBhcmUgemVybywgZXNwZWNpYWxseSB0aGUgQUMgdGVybXMuICBXZSBjYW4gZXhwbG9pdCB0aGlzCi0gICAgICogYnkgc2hvcnQtY2lyY3VpdGluZyB0aGUgSURDVCBjYWxjdWxhdGlvbiBmb3IgYW55IGNvbHVtbiBpbiB3aGljaCBhbGwKLSAgICAgKiB0aGUgQUMgdGVybXMgYXJlIHplcm8uICBJbiB0aGF0IGNhc2UgZWFjaCBvdXRwdXQgaXMgZXF1YWwgdG8gdGhlCi0gICAgICogREMgY29lZmZpY2llbnQgKHdpdGggc2NhbGUgZmFjdG9yIGFzIG5lZWRlZCkuCi0gICAgICogV2l0aCB0eXBpY2FsIGltYWdlcyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcywgaGFsZiBvciBtb3JlIG9mIHRoZQotICAgICAqIGNvbHVtbiBEQ1QgY2FsY3VsYXRpb25zIGNhbiBiZSBzaW1wbGlmaWVkIHRoaXMgd2F5LgotICAgICAqLwotICAgIAotICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNF0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBpbnQgZGN2YWwgPSAoaW50KSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOwotCi0gICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjRdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjVdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjZdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjddID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLwotICAgICAgcXVhbnRwdHIrKzsKLSAgICAgIHdzcHRyKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0KLSAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKLSAgICB0bXAxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKLSAgICB0bXAyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKLSAgICB0bXAzID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKLQotICAgIHRtcDEwID0gdG1wMCArIHRtcDI7CS8qIHBoYXNlIDMgKi8KLSAgICB0bXAxMSA9IHRtcDAgLSB0bXAyOwotCi0gICAgdG1wMTMgPSB0bXAxICsgdG1wMzsJLyogcGhhc2VzIDUtMyAqLwotICAgIHRtcDEyID0gTVVMVElQTFkodG1wMSAtIHRtcDMsIEZJWF8xXzQxNDIxMzU2MikgLSB0bXAxMzsgLyogMipjNCAqLwotCi0gICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7CS8qIHBoYXNlIDIgKi8KLSAgICB0bXAzID0gdG1wMTAgLSB0bXAxMzsKLSAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKLSAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgdG1wNCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7Ci0gICAgdG1wNSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7Ci0gICAgdG1wNiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7Ci0gICAgdG1wNyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7Ci0KLSAgICB6MTMgPSB0bXA2ICsgdG1wNTsJCS8qIHBoYXNlIDYgKi8KLSAgICB6MTAgPSB0bXA2IC0gdG1wNTsKLSAgICB6MTEgPSB0bXA0ICsgdG1wNzsKLSAgICB6MTIgPSB0bXA0IC0gdG1wNzsKLQotICAgIHRtcDcgPSB6MTEgKyB6MTM7CQkvKiBwaGFzZSA1ICovCi0gICAgdG1wMTEgPSBNVUxUSVBMWSh6MTEgLSB6MTMsIEZJWF8xXzQxNDIxMzU2Mik7IC8qIDIqYzQgKi8KLQotICAgIHo1ID0gTVVMVElQTFkoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOyAvKiAyKmMyICovCi0gICAgdG1wMTAgPSBNVUxUSVBMWSh6MTIsIEZJWF8xXzA4MjM5MjIwMCkgLSB6NTsgLyogMiooYzItYzYpICovCi0gICAgdG1wMTIgPSBNVUxUSVBMWSh6MTAsIC0gRklYXzJfNjEzMTI1OTMwKSArIHo1OyAvKiAtMiooYzIrYzYpICovCi0KLSAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OwkvKiBwaGFzZSAyICovCi0gICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKLSAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OwotCi0gICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpICh0bXAwICsgdG1wNyk7Ci0gICAgd3NwdHJbRENUU0laRSo3XSA9IChpbnQpICh0bXAwIC0gdG1wNyk7Ci0gICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpICh0bXAxICsgdG1wNik7Ci0gICAgd3NwdHJbRENUU0laRSo2XSA9IChpbnQpICh0bXAxIC0gdG1wNik7Ci0gICAgd3NwdHJbRENUU0laRSoyXSA9IChpbnQpICh0bXAyICsgdG1wNSk7Ci0gICAgd3NwdHJbRENUU0laRSo1XSA9IChpbnQpICh0bXAyIC0gdG1wNSk7Ci0gICAgd3NwdHJbRENUU0laRSo0XSA9IChpbnQpICh0bXAzICsgdG1wNCk7Ci0gICAgd3NwdHJbRENUU0laRSozXSA9IChpbnQpICh0bXAzIC0gdG1wNCk7Ci0KLSAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KLSAgICBxdWFudHB0cisrOwotICAgIHdzcHRyKys7Ci0gIH0KLSAgCi0gIC8qIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCi0gIC8qIE5vdGUgdGhhdCB3ZSBtdXN0IGRlc2NhbGUgdGhlIHJlc3VsdHMgYnkgYSBmYWN0b3Igb2YgOCA9PSAyKiozLCAqLwotICAvKiBhbmQgYWxzbyB1bmRvIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcuICovCi0KLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gMDsgY3RyIDwgRENUU0laRTsgY3RyKyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOwotICAgIC8qIFJvd3Mgb2YgemVyb2VzIGNhbiBiZSBleHBsb2l0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdlIGRpZCB3aXRoIGNvbHVtbnMuCi0gICAgICogSG93ZXZlciwgdGhlIGNvbHVtbiBjYWxjdWxhdGlvbiBoYXMgY3JlYXRlZCBtYW55IG5vbnplcm8gQUMgdGVybXMsIHNvCi0gICAgICogdGhlIHNpbXBsaWZpY2F0aW9uIGFwcGxpZXMgbGVzcyBvZnRlbiAodHlwaWNhbGx5IDUlIHRvIDEwJSBvZiB0aGUgdGltZSkuCi0gICAgICogT24gbWFjaGluZXMgd2l0aCB2ZXJ5IGZhc3QgbXVsdGlwbGljYXRpb24sIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKLSAgICAgKiB0ZXN0IHRha2VzIG1vcmUgdGltZSB0aGFuIGl0J3Mgd29ydGguICBJbiB0aGF0IGNhc2UgdGhpcyBzZWN0aW9uCi0gICAgICogbWF5IGJlIGNvbW1lbnRlZCBvdXQuCi0gICAgICovCi0gICAgCi0jaWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKLSAgICBpZiAod3NwdHJbMV0gPT0gMCAmJiB3c3B0clsyXSA9PSAwICYmIHdzcHRyWzNdID09IDAgJiYgd3NwdHJbNF0gPT0gMCAmJgotCXdzcHRyWzVdID09IDAgJiYgd3NwdHJbNl0gPT0gMCAmJiB3c3B0cls3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLwotICAgICAgSlNBTVBMRSBkY3ZhbCA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCi0JCQkJICAmIFJBTkdFX01BU0tdOwotICAgICAgCi0gICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsxXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzJdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls0XSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzVdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbNl0gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls3XSA9IGRjdmFsOwotCi0gICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLQotICAgIHRtcDEwID0gKChEQ1RFTEVNKSB3c3B0clswXSArIChEQ1RFTEVNKSB3c3B0cls0XSk7Ci0gICAgdG1wMTEgPSAoKERDVEVMRU0pIHdzcHRyWzBdIC0gKERDVEVMRU0pIHdzcHRyWzRdKTsKLQotICAgIHRtcDEzID0gKChEQ1RFTEVNKSB3c3B0clsyXSArIChEQ1RFTEVNKSB3c3B0cls2XSk7Ci0gICAgdG1wMTIgPSBNVUxUSVBMWSgoRENURUxFTSkgd3NwdHJbMl0gLSAoRENURUxFTSkgd3NwdHJbNl0sIEZJWF8xXzQxNDIxMzU2MikKLQkgICAgLSB0bXAxMzsKLQotICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOwotICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOwotICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOwotICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOwotCi0gICAgLyogT2RkIHBhcnQgKi8KLQotICAgIHoxMyA9IChEQ1RFTEVNKSB3c3B0cls1XSArIChEQ1RFTEVNKSB3c3B0clszXTsKLSAgICB6MTAgPSAoRENURUxFTSkgd3NwdHJbNV0gLSAoRENURUxFTSkgd3NwdHJbM107Ci0gICAgejExID0gKERDVEVMRU0pIHdzcHRyWzFdICsgKERDVEVMRU0pIHdzcHRyWzddOwotICAgIHoxMiA9IChEQ1RFTEVNKSB3c3B0clsxXSAtIChEQ1RFTEVNKSB3c3B0cls3XTsKLQotICAgIHRtcDcgPSB6MTEgKyB6MTM7CQkvKiBwaGFzZSA1ICovCi0gICAgdG1wMTEgPSBNVUxUSVBMWSh6MTEgLSB6MTMsIEZJWF8xXzQxNDIxMzU2Mik7IC8qIDIqYzQgKi8KLQotICAgIHo1ID0gTVVMVElQTFkoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOyAvKiAyKmMyICovCi0gICAgdG1wMTAgPSBNVUxUSVBMWSh6MTIsIEZJWF8xXzA4MjM5MjIwMCkgLSB6NTsgLyogMiooYzItYzYpICovCi0gICAgdG1wMTIgPSBNVUxUSVBMWSh6MTAsIC0gRklYXzJfNjEzMTI1OTMwKSArIHo1OyAvKiAtMiooYzIrYzYpICovCi0KLSAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OwkvKiBwaGFzZSAyICovCi0gICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKLSAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OwotCi0gICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBzY2FsZSBkb3duIGJ5IGEgZmFjdG9yIG9mIDggYW5kIHJhbmdlLWxpbWl0ICovCi0KLSAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAwICsgdG1wNywgUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzddID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMCAtIHRtcDcsIFBBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDEgKyB0bXA2LCBQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAxIC0gdG1wNiwgUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiArIHRtcDUsIFBBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls1XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDIgLSB0bXA1LCBQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAzICsgdG1wNCwgUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMyAtIHRtcDQsIFBBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotCi0gICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci19Ci0KLSNlbmRpZiAvKiBEQ1RfSUZBU1RfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qaWRjdGludC5jIGIvbGlianBlZ3R3cnAvamlkY3RpbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyYjMyMC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qaWRjdGludC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qCi0gKiBqaWRjdGludC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYSBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICogaW52ZXJzZSBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiAgSW4gdGhlIElKRyBjb2RlLCB0aGlzIHJvdXRpbmUKLSAqIG11c3QgYWxzbyBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIG9mIHRoZSBpbnB1dCBjb2VmZmljaWVudHMuCi0gKgotICogQSAyLUQgSURDVCBjYW4gYmUgZG9uZSBieSAxLUQgSURDVCBvbiBlYWNoIGNvbHVtbiBmb2xsb3dlZCBieSAxLUQgSURDVAotICogb24gZWFjaCByb3cgKG9yIHZpY2UgdmVyc2EsIGJ1dCBpdCdzIG1vcmUgY29udmVuaWVudCB0byBlbWl0IGEgcm93IGF0Ci0gKiBhIHRpbWUpLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUgbXVjaCBtb3JlCi0gKiBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gYW4gYWxnb3JpdGhtIGRlc2NyaWJlZCBpbgotICogICBDLiBMb2VmZmxlciwgQS4gTGlndGVuYmVyZyBhbmQgRy4gTW9zY2h5dHosICJQcmFjdGljYWwgRmFzdCAxLUQgRENUCi0gKiAgIEFsZ29yaXRobXMgd2l0aCAxMSBNdWx0aXBsaWNhdGlvbnMiLCBQcm9jLiBJbnQnbC4gQ29uZi4gb24gQWNvdXN0aWNzLAotICogICBTcGVlY2gsIGFuZCBTaWduYWwgUHJvY2Vzc2luZyAxOTg5IChJQ0FTU1AgJzg5KSwgcHAuIDk4OC05OTEuCi0gKiBUaGUgcHJpbWFyeSBhbGdvcml0aG0gZGVzY3JpYmVkIHRoZXJlIHVzZXMgMTEgbXVsdGlwbGllcyBhbmQgMjkgYWRkcy4KLSAqIFdlIHVzZSB0aGVpciBhbHRlcm5hdGUgbWV0aG9kIHdpdGggMTIgbXVsdGlwbGllcyBhbmQgMzIgYWRkcy4KLSAqIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCBubyBkYXRhIHBhdGggY29udGFpbnMgbW9yZSB0aGFuIG9uZQotICogbXVsdGlwbGljYXRpb247IHRoaXMgYWxsb3dzIGEgdmVyeSBzaW1wbGUgYW5kIGFjY3VyYXRlIGltcGxlbWVudGF0aW9uIGluCi0gKiBzY2FsZWQgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYywgd2l0aCBhIG1pbmltYWwgbnVtYmVyIG9mIHNoaWZ0cy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKLQotCi0vKgotICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi0gKi8KLQotI2lmIERDVFNJWkUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotCi0vKgotICogVGhlIHBvb3Agb24gdGhpcyBzY2FsaW5nIHN0dWZmIGlzIGFzIGZvbGxvd3M6Ci0gKgotICogRWFjaCAxLUQgSURDVCBzdGVwIHByb2R1Y2VzIG91dHB1dHMgd2hpY2ggYXJlIGEgZmFjdG9yIG9mIHNxcnQoTikKLSAqIGxhcmdlciB0aGFuIHRoZSB0cnVlIElEQ1Qgb3V0cHV0cy4gIFRoZSBmaW5hbCBvdXRwdXRzIGFyZSB0aGVyZWZvcmUKLSAqIGEgZmFjdG9yIG9mIE4gbGFyZ2VyIHRoYW4gZGVzaXJlZDsgc2luY2UgTj04IHRoaXMgY2FuIGJlIGN1cmVkIGJ5Ci0gKiBhIHNpbXBsZSByaWdodCBzaGlmdCBhdCB0aGUgZW5kIG9mIHRoZSBhbGdvcml0aG0uICBUaGUgYWR2YW50YWdlIG9mCi0gKiB0aGlzIGFycmFuZ2VtZW50IGlzIHRoYXQgd2Ugc2F2ZSB0d28gbXVsdGlwbGljYXRpb25zIHBlciAxLUQgSURDVCwKLSAqIGJlY2F1c2UgdGhlIHkwIGFuZCB5NCBpbnB1dHMgbmVlZCBub3QgYmUgZGl2aWRlZCBieSBzcXJ0KE4pLgotICoKLSAqIFdlIGhhdmUgdG8gZG8gYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uIG9mIHRoZSBpbnRlZ2VyIGlucHV0cywgd2hpY2gKLSAqIGlzIG5vIHByb2JsZW0sIGFuZCBtdWx0aXBsaWNhdGlvbiBieSBmcmFjdGlvbmFsIGNvbnN0YW50cywgd2hpY2ggaXMKLSAqIGEgcHJvYmxlbSB0byBkbyBpbiBpbnRlZ2VyIGFyaXRobWV0aWMuICBXZSBtdWx0aXBseSBhbGwgdGhlIGNvbnN0YW50cwotICogYnkgQ09OU1RfU0NBTEUgYW5kIGNvbnZlcnQgdGhlbSB0byBpbnRlZ2VyIGNvbnN0YW50cyAodGh1cyByZXRhaW5pbmcKLSAqIENPTlNUX0JJVFMgYml0cyBvZiBwcmVjaXNpb24gaW4gdGhlIGNvbnN0YW50cykuICBBZnRlciBkb2luZyBhCi0gKiBtdWx0aXBsaWNhdGlvbiB3ZSBoYXZlIHRvIGRpdmlkZSB0aGUgcHJvZHVjdCBieSBDT05TVF9TQ0FMRSwgd2l0aCBwcm9wZXIKLSAqIHJvdW5kaW5nLCB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG91dHB1dC4gIFRoaXMgZGl2aXNpb24gY2FuIGJlIGRvbmUKLSAqIGNoZWFwbHkgYXMgYSByaWdodCBzaGlmdCBvZiBDT05TVF9CSVRTIGJpdHMuICBXZSBwb3N0cG9uZSBzaGlmdGluZwotICogYXMgbG9uZyBhcyBwb3NzaWJsZSBzbyB0aGF0IHBhcnRpYWwgc3VtcyBjYW4gYmUgYWRkZWQgdG9nZXRoZXIgd2l0aAotICogZnVsbCBmcmFjdGlvbmFsIHByZWNpc2lvbi4KLSAqCi0gKiBUaGUgb3V0cHV0cyBvZiB0aGUgZmlyc3QgcGFzcyBhcmUgc2NhbGVkIHVwIGJ5IFBBU1MxX0JJVFMgYml0cyBzbyB0aGF0Ci0gKiB0aGV5IGFyZSByZXByZXNlbnRlZCB0byBiZXR0ZXItdGhhbi1pbnRlZ3JhbCBwcmVjaXNpb24uICBUaGVzZSBvdXRwdXRzCi0gKiByZXF1aXJlIEJJVFNfSU5fSlNBTVBMRSArIFBBU1MxX0JJVFMgKyAzIGJpdHM7IHRoaXMgZml0cyBpbiBhIDE2LWJpdCB3b3JkCi0gKiB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLiAgKFRvIHNjYWxlIHVwIDEyLWJpdCBzYW1wbGUgZGF0YSBmdXJ0aGVyLCBhbgotICogaW50ZXJtZWRpYXRlIElOVDMyIGFycmF5IHdvdWxkIGJlIG5lZWRlZC4pCi0gKgotICogVG8gYXZvaWQgb3ZlcmZsb3cgb2YgdGhlIDMyLWJpdCBpbnRlcm1lZGlhdGUgcmVzdWx0cyBpbiBwYXNzIDIsIHdlIG11c3QKLSAqIGhhdmUgQklUU19JTl9KU0FNUExFICsgQ09OU1RfQklUUyArIFBBU1MxX0JJVFMgPD0gMjYuICBFcnJvciBhbmFseXNpcwotICogc2hvd3MgdGhhdCB0aGUgdmFsdWVzIGdpdmVuIGJlbG93IGFyZSB0aGUgbW9zdCBlZmZlY3RpdmUuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIENPTlNUX0JJVFMgIDEzCi0jZGVmaW5lIFBBU1MxX0JJVFMgIDIKLSNlbHNlCi0jZGVmaW5lIENPTlNUX0JJVFMgIDEzCi0jZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCi0jZW5kaWYKLQotLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCi0gKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KLSAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCi0gKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCi0gKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQotICovCi0KLSNpZiBDT05TVF9CSVRTID09IDEzCi0jZGVmaW5lIEZJWF8wXzI5ODYzMTMzNiAgKChJTlQzMikgIDI0NDYpCS8qIEZJWCgwLjI5ODYzMTMzNikgKi8KLSNkZWZpbmUgRklYXzBfMzkwMTgwNjQ0ICAoKElOVDMyKSAgMzE5NikJLyogRklYKDAuMzkwMTgwNjQ0KSAqLwotI2RlZmluZSBGSVhfMF81NDExOTYxMDAgICgoSU5UMzIpICA0NDMzKQkvKiBGSVgoMC41NDExOTYxMDApICovCi0jZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgKChJTlQzMikgIDYyNzApCS8qIEZJWCgwLjc2NTM2Njg2NSkgKi8KLSNkZWZpbmUgRklYXzBfODk5OTc2MjIzICAoKElOVDMyKSAgNzM3MykJLyogRklYKDAuODk5OTc2MjIzKSAqLwotI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgICgoSU5UMzIpICA5NjMzKQkvKiBGSVgoMS4xNzU4NzU2MDIpICovCi0jZGVmaW5lIEZJWF8xXzUwMTMyMTExMCAgKChJTlQzMikgIDEyMjk5KQkvKiBGSVgoMS41MDEzMjExMTApICovCi0jZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgKChJTlQzMikgIDE1MTM3KQkvKiBGSVgoMS44NDc3NTkwNjUpICovCi0jZGVmaW5lIEZJWF8xXzk2MTU3MDU2MCAgKChJTlQzMikgIDE2MDY5KQkvKiBGSVgoMS45NjE1NzA1NjApICovCi0jZGVmaW5lIEZJWF8yXzA1MzExOTg2OSAgKChJTlQzMikgIDE2ODE5KQkvKiBGSVgoMi4wNTMxMTk4NjkpICovCi0jZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgKChJTlQzMikgIDIwOTk1KQkvKiBGSVgoMi41NjI5MTU0NDcpICovCi0jZGVmaW5lIEZJWF8zXzA3MjcxMTAyNiAgKChJTlQzMikgIDI1MTcyKQkvKiBGSVgoMy4wNzI3MTEwMjYpICovCi0jZWxzZQotI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgIEZJWCgwLjI5ODYzMTMzNikKLSNkZWZpbmUgRklYXzBfMzkwMTgwNjQ0ICBGSVgoMC4zOTAxODA2NDQpCi0jZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgRklYKDAuNTQxMTk2MTAwKQotI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgIEZJWCgwLjc2NTM2Njg2NSkKLSNkZWZpbmUgRklYXzBfODk5OTc2MjIzICBGSVgoMC44OTk5NzYyMjMpCi0jZGVmaW5lIEZJWF8xXzE3NTg3NTYwMiAgRklYKDEuMTc1ODc1NjAyKQotI2RlZmluZSBGSVhfMV81MDEzMjExMTAgIEZJWCgxLjUwMTMyMTExMCkKLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICBGSVgoMS44NDc3NTkwNjUpCi0jZGVmaW5lIEZJWF8xXzk2MTU3MDU2MCAgRklYKDEuOTYxNTcwNTYwKQotI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgIEZJWCgyLjA1MzExOTg2OSkKLSNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICBGSVgoMi41NjI5MTU0NDcpCi0jZGVmaW5lIEZJWF8zXzA3MjcxMTAyNiAgRklYKDMuMDcyNzExMDI2KQotI2VuZGlmCi0KLQotLyogTXVsdGlwbHkgYW4gSU5UMzIgdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQgdG8geWllbGQgYW4gSU5UMzIgcmVzdWx0LgotICogRm9yIDgtYml0IHNhbXBsZXMgd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZywgYWxsIHRoZSB2YXJpYWJsZQotICogYW5kIGNvbnN0YW50IHZhbHVlcyBpbnZvbHZlZCBhcmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMgd2lkZSwgc28gYQotICogMTZ4MTYtPjMyIGJpdCBtdWx0aXBseSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgZnVsbCAzMngzMiBtdWx0aXBseS4KLSAqIEZvciAxMi1iaXQgc2FtcGxlcywgYSBmdWxsIDMyLWJpdCBtdWx0aXBsaWNhdGlvbiB3aWxsIGJlIG5lZWRlZC4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpCi0jZWxzZQotI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQotI2VuZGlmCi0KLQotLyogRGVxdWFudGl6ZSBhIGNvZWZmaWNpZW50IGJ5IG11bHRpcGx5aW5nIGl0IGJ5IHRoZSBtdWx0aXBsaWVyLXRhYmxlCi0gKiBlbnRyeTsgcHJvZHVjZSBhbiBpbnQgcmVzdWx0LiAgSW4gdGhpcyBtb2R1bGUsIGJvdGggaW5wdXRzIGFuZCByZXN1bHQKLSAqIGFyZSAxNiBiaXRzIG9yIGxlc3MsIHNvIGVpdGhlciBpbnQgb3Igc2hvcnQgbXVsdGlwbHkgd2lsbCB3b3JrLgotICovCi0KLSNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoSVNMT1dfTVVMVF9UWVBFKSAoY29lZikpICogKHF1YW50dmFsKSkKLQotCi0vKgotICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF9pc2xvdyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi17Ci0gIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7Ci0gIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwotICBJTlQzMiB6MSwgejIsIHozLCB6NCwgejU7Ci0gIEpDT0VGUFRSIGlucHRyOwotICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKLSAgaW50ICogd3NwdHI7Ci0gIEpTQU1QUk9XIG91dHB0cjsKLSAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKLSAgaW50IGN0cjsKLSAgaW50IHdvcmtzcGFjZVtEQ1RTSVpFMl07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLwotICBTSElGVF9URU1QUwotCi0gIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KLSAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgSURDVDsgKi8KLSAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCi0KLSAgaW5wdHIgPSBjb2VmX2Jsb2NrOwotICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOwotICB3c3B0ciA9IHdvcmtzcGFjZTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFOyBjdHIgPiAwOyBjdHItLSkgewotICAgIC8qIER1ZSB0byBxdWFudGl6YXRpb24sIHdlIHdpbGwgdXN1YWxseSBmaW5kIHRoYXQgbWFueSBvZiB0aGUgaW5wdXQKLSAgICAgKiBjb2VmZmljaWVudHMgYXJlIHplcm8sIGVzcGVjaWFsbHkgdGhlIEFDIHRlcm1zLiAgV2UgY2FuIGV4cGxvaXQgdGhpcwotICAgICAqIGJ5IHNob3J0LWNpcmN1aXRpbmcgdGhlIElEQ1QgY2FsY3VsYXRpb24gZm9yIGFueSBjb2x1bW4gaW4gd2hpY2ggYWxsCi0gICAgICogdGhlIEFDIHRlcm1zIGFyZSB6ZXJvLiAgSW4gdGhhdCBjYXNlIGVhY2ggb3V0cHV0IGlzIGVxdWFsIHRvIHRoZQotICAgICAqIERDIGNvZWZmaWNpZW50ICh3aXRoIHNjYWxlIGZhY3RvciBhcyBuZWVkZWQpLgotICAgICAqIFdpdGggdHlwaWNhbCBpbWFnZXMgYW5kIHF1YW50aXphdGlvbiB0YWJsZXMsIGhhbGYgb3IgbW9yZSBvZiB0aGUKLSAgICAgKiBjb2x1bW4gRENUIGNhbGN1bGF0aW9ucyBjYW4gYmUgc2ltcGxpZmllZCB0aGlzIHdheS4KLSAgICAgKi8KLSAgICAKLSAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjRdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo2XSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLwotICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOwotICAgICAgCi0gICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjRdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjVdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjZdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjddID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLwotICAgICAgcXVhbnRwdHIrKzsKLSAgICAgIHdzcHRyKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0OiByZXZlcnNlIHRoZSBldmVuIHBhcnQgb2YgdGhlIGZvcndhcmQgRENULiAqLwotICAgIC8qIFRoZSByb3RhdG9yIGlzIHNxcnQoMikqYygtNikuICovCi0gICAgCi0gICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOwotICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKLSAgICAKLSAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8wXzU0MTE5NjEwMCk7Ci0gICAgdG1wMiA9IHoxICsgTVVMVElQTFkoejMsIC0gRklYXzFfODQ3NzU5MDY1KTsKLSAgICB0bXAzID0gejEgKyBNVUxUSVBMWSh6MiwgRklYXzBfNzY1MzY2ODY1KTsKLSAgICAKLSAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7Ci0gICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOwotCi0gICAgdG1wMCA9ICh6MiArIHozKSA8PCBDT05TVF9CSVRTOwotICAgIHRtcDEgPSAoejIgLSB6MykgPDwgQ09OU1RfQklUUzsKLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwotICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7Ci0gICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwotICAgIAotICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgODsgdGhlIG1hdHJpeCBpcyB1bml0YXJ5IGFuZCBoZW5jZSBpdHMKLSAgICAgKiB0cmFuc3Bvc2UgaXMgaXRzIGludmVyc2UuICBpMC4uaTMgYXJlIHk3LHk1LHkzLHkxIHJlc3BlY3RpdmVseS4KLSAgICAgKi8KLSAgICAKLSAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKLSAgICB0bXAxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKLSAgICB0bXAyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKLSAgICB0bXAzID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKLSAgICAKLSAgICB6MSA9IHRtcDAgKyB0bXAzOwotICAgIHoyID0gdG1wMSArIHRtcDI7Ci0gICAgejMgPSB0bXAwICsgdG1wMjsKLSAgICB6NCA9IHRtcDEgKyB0bXAzOwotICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCi0gICAgCi0gICAgdG1wMCA9IE1VTFRJUExZKHRtcDAsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDEgPSBNVUxUSVBMWSh0bXAxLCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KLSAgICB0bXAyID0gTVVMVElQTFkodG1wMiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCi0gICAgdG1wMyA9IE1VTFRJUExZKHRtcDMsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLwotICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KLSAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLwotICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCi0gICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLwotICAgIAotICAgIHozICs9IHo1OwotICAgIHo0ICs9IHo1OwotICAgIAotICAgIHRtcDAgKz0gejEgKyB6MzsKLSAgICB0bXAxICs9IHoyICsgejQ7Ci0gICAgdG1wMiArPSB6MiArIHozOwotICAgIHRtcDMgKz0gejEgKyB6NDsKLSAgICAKLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IGlucHV0cyBhcmUgdG1wMTAuLnRtcDEzLCB0bXAwLi50bXAzICovCi0gICAgCi0gICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIHdzcHRyW0RDVFNJWkUqN10gPSAoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgREVTQ0FMRSh0bXAxMSArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSo2XSA9IChpbnQpIERFU0NBTEUodG1wMTEgLSB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIHdzcHRyW0RDVFNJWkUqMl0gPSAoaW50KSBERVNDQUxFKHRtcDEyICsgdG1wMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjVdID0gKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSozXSA9IChpbnQpIERFU0NBTEUodG1wMTMgKyB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIHdzcHRyW0RDVFNJWkUqNF0gPSAoaW50KSBERVNDQUxFKHRtcDEzIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICAKLSAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KLSAgICBxdWFudHB0cisrOwotICAgIHdzcHRyKys7Ci0gIH0KLSAgCi0gIC8qIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCi0gIC8qIE5vdGUgdGhhdCB3ZSBtdXN0IGRlc2NhbGUgdGhlIHJlc3VsdHMgYnkgYSBmYWN0b3Igb2YgOCA9PSAyKiozLCAqLwotICAvKiBhbmQgYWxzbyB1bmRvIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcuICovCi0KLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gMDsgY3RyIDwgRENUU0laRTsgY3RyKyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOwotICAgIC8qIFJvd3Mgb2YgemVyb2VzIGNhbiBiZSBleHBsb2l0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdlIGRpZCB3aXRoIGNvbHVtbnMuCi0gICAgICogSG93ZXZlciwgdGhlIGNvbHVtbiBjYWxjdWxhdGlvbiBoYXMgY3JlYXRlZCBtYW55IG5vbnplcm8gQUMgdGVybXMsIHNvCi0gICAgICogdGhlIHNpbXBsaWZpY2F0aW9uIGFwcGxpZXMgbGVzcyBvZnRlbiAodHlwaWNhbGx5IDUlIHRvIDEwJSBvZiB0aGUgdGltZSkuCi0gICAgICogT24gbWFjaGluZXMgd2l0aCB2ZXJ5IGZhc3QgbXVsdGlwbGljYXRpb24sIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKLSAgICAgKiB0ZXN0IHRha2VzIG1vcmUgdGltZSB0aGFuIGl0J3Mgd29ydGguICBJbiB0aGF0IGNhc2UgdGhpcyBzZWN0aW9uCi0gICAgICogbWF5IGJlIGNvbW1lbnRlZCBvdXQuCi0gICAgICovCi0gICAgCi0jaWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKLSAgICBpZiAod3NwdHJbMV0gPT0gMCAmJiB3c3B0clsyXSA9PSAwICYmIHdzcHRyWzNdID09IDAgJiYgd3NwdHJbNF0gPT0gMCAmJgotCXdzcHRyWzVdID09IDAgJiYgd3NwdHJbNl0gPT0gMCAmJiB3c3B0cls3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLwotICAgICAgSlNBTVBMRSBkY3ZhbCA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSB3c3B0clswXSwgUEFTUzFfQklUUyszKQotCQkJCSAgJiBSQU5HRV9NQVNLXTsKLSAgICAgIAotICAgICAgb3V0cHRyWzBdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbMV0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsyXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzNdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbNF0gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls1XSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzZdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbN10gPSBkY3ZhbDsKLQotICAgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICAgICAgY29udGludWU7Ci0gICAgfQotI2VuZGlmCi0gICAgCi0gICAgLyogRXZlbiBwYXJ0OiByZXZlcnNlIHRoZSBldmVuIHBhcnQgb2YgdGhlIGZvcndhcmQgRENULiAqLwotICAgIC8qIFRoZSByb3RhdG9yIGlzIHNxcnQoMikqYygtNikuICovCi0gICAgCi0gICAgejIgPSAoSU5UMzIpIHdzcHRyWzJdOwotICAgIHozID0gKElOVDMyKSB3c3B0cls2XTsKLSAgICAKLSAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8wXzU0MTE5NjEwMCk7Ci0gICAgdG1wMiA9IHoxICsgTVVMVElQTFkoejMsIC0gRklYXzFfODQ3NzU5MDY1KTsKLSAgICB0bXAzID0gejEgKyBNVUxUSVBMWSh6MiwgRklYXzBfNzY1MzY2ODY1KTsKLSAgICAKLSAgICB0bXAwID0gKChJTlQzMikgd3NwdHJbMF0gKyAoSU5UMzIpIHdzcHRyWzRdKSA8PCBDT05TVF9CSVRTOwotICAgIHRtcDEgPSAoKElOVDMyKSB3c3B0clswXSAtIChJTlQzMikgd3NwdHJbNF0pIDw8IENPTlNUX0JJVFM7Ci0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKLSAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOwotICAgIHRtcDExID0gdG1wMSArIHRtcDI7Ci0gICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKLSAgICAKLSAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDg7IHRoZSBtYXRyaXggaXMgdW5pdGFyeSBhbmQgaGVuY2UgaXRzCi0gICAgICogdHJhbnNwb3NlIGlzIGl0cyBpbnZlcnNlLiAgaTAuLmkzIGFyZSB5Nyx5NSx5Myx5MSByZXNwZWN0aXZlbHkuCi0gICAgICovCi0gICAgCi0gICAgdG1wMCA9IChJTlQzMikgd3NwdHJbN107Ci0gICAgdG1wMSA9IChJTlQzMikgd3NwdHJbNV07Ci0gICAgdG1wMiA9IChJTlQzMikgd3NwdHJbM107Ci0gICAgdG1wMyA9IChJTlQzMikgd3NwdHJbMV07Ci0gICAgCi0gICAgejEgPSB0bXAwICsgdG1wMzsKLSAgICB6MiA9IHRtcDEgKyB0bXAyOwotICAgIHozID0gdG1wMCArIHRtcDI7Ci0gICAgejQgPSB0bXAxICsgdG1wMzsKLSAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLwotICAgIAotICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KLSAgICB0bXAxID0gTVVMVElQTFkodG1wMSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCi0gICAgdG1wMiA9IE1VTFRJUExZKHRtcDIsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAzLCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KLSAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCi0gICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KLSAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLwotICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KLSAgICAKLSAgICB6MyArPSB6NTsKLSAgICB6NCArPSB6NTsKLSAgICAKLSAgICB0bXAwICs9IHoxICsgejM7Ci0gICAgdG1wMSArPSB6MiArIHo0OwotICAgIHRtcDIgKz0gejIgKyB6MzsKLSAgICB0bXAzICs9IHoxICsgejQ7Ci0gICAgCi0gICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBpbnB1dHMgYXJlIHRtcDEwLi50bXAxMywgdG1wMC4udG1wMyAqLwotICAgIAotICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAzLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzddID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDMsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDExICsgdG1wMiwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls2XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTEgLSB0bXAyLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDEsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMSwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTMgKyB0bXAwLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzRdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMyAtIHRtcDAsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICAKLSAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gIH0KLX0KLQotI2VuZGlmIC8qIERDVF9JU0xPV19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ppZGN0cmVkLmMgYi9saWJqcGVndHdycC9qaWRjdHJlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjFmM2M3Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ppZGN0cmVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoKLSAqIGppZGN0cmVkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBpbnZlcnNlLURDVCByb3V0aW5lcyB0aGF0IHByb2R1Y2UgcmVkdWNlZC1zaXplIG91dHB1dDoKLSAqIGVpdGhlciA0eDQsIDJ4Miwgb3IgMXgxIHBpeGVscyBmcm9tIGFuIDh4OCBEQ1QgYmxvY2suCi0gKgotICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBMb2VmZmxlciwgTGlndGVuYmVyZyBhbmQgTW9zY2h5dHogKExMJk0pCi0gKiBhbGdvcml0aG0gdXNlZCBpbiBqaWRjdGludC5jLiAgV2Ugc2ltcGx5IHJlcGxhY2UgZWFjaCA4LXRvLTggMS1EIElEQ1Qgc3RlcAotICogd2l0aCBhbiA4LXRvLTQgc3RlcCB0aGF0IHByb2R1Y2VzIHRoZSBmb3VyIGF2ZXJhZ2VzIG9mIHR3byBhZGphY2VudCBvdXRwdXRzCi0gKiAob3IgYW4gOC10by0yIHN0ZXAgcHJvZHVjaW5nIHR3byBhdmVyYWdlcyBvZiBmb3VyIG91dHB1dHMsIGZvciAyeDIgb3V0cHV0KS4KLSAqIFRoZXNlIHN0ZXBzIHdlcmUgZGVyaXZlZCBieSBjb21wdXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBub3JtYWwgTEwmTSBjb2RlLCB0aGVuIHNpbXBsaWZ5aW5nIGFzIG11Y2ggYXMgcG9zc2libGUuCi0gKgotICogMXgxIGlzIHRyaXZpYWw6IGp1c3QgdGFrZSB0aGUgREMgY29lZmZpY2llbnQgZGl2aWRlZCBieSA4LgotICoKLSAqIFNlZSBqaWRjdGludC5jIGZvciBhZGRpdGlvbmFsIGNvbW1lbnRzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0jaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLSAqLwotCi0jaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0KLS8qIFNjYWxpbmcgaXMgdGhlIHNhbWUgYXMgaW4gamlkY3RpbnQuYy4gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIENPTlNUX0JJVFMgIDEzCi0jZGVmaW5lIFBBU1MxX0JJVFMgIDIKLSNlbHNlCi0jZGVmaW5lIENPTlNUX0JJVFMgIDEzCi0jZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCi0jZW5kaWYKLQotLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCi0gKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KLSAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCi0gKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCi0gKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQotICovCi0KLSNpZiBDT05TVF9CSVRTID09IDEzCi0jZGVmaW5lIEZJWF8wXzIxMTE2NDI0MyAgKChJTlQzMikgIDE3MzApCS8qIEZJWCgwLjIxMTE2NDI0MykgKi8KLSNkZWZpbmUgRklYXzBfNTA5Nzk1NTc5ICAoKElOVDMyKSAgNDE3NikJLyogRklYKDAuNTA5Nzk1NTc5KSAqLwotI2RlZmluZSBGSVhfMF82MDEzNDQ4ODcgICgoSU5UMzIpICA0OTI2KQkvKiBGSVgoMC42MDEzNDQ4ODcpICovCi0jZGVmaW5lIEZJWF8wXzcyMDk1OTgyMiAgKChJTlQzMikgIDU5MDYpCS8qIEZJWCgwLjcyMDk1OTgyMikgKi8KLSNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICAoKElOVDMyKSAgNjI3MCkJLyogRklYKDAuNzY1MzY2ODY1KSAqLwotI2RlZmluZSBGSVhfMF84NTA0MzAwOTUgICgoSU5UMzIpICA2OTY3KQkvKiBGSVgoMC44NTA0MzAwOTUpICovCi0jZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KLSNkZWZpbmUgRklYXzFfMDYxNTk0MzM3ICAoKElOVDMyKSAgODY5NykJLyogRklYKDEuMDYxNTk0MzM3KSAqLwotI2RlZmluZSBGSVhfMV8yNzI3NTg1ODAgICgoSU5UMzIpICAxMDQyNikJLyogRklYKDEuMjcyNzU4NTgwKSAqLwotI2RlZmluZSBGSVhfMV80NTE3NzQ5ODEgICgoSU5UMzIpICAxMTg5MykJLyogRklYKDEuNDUxNzc0OTgxKSAqLwotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLwotI2RlZmluZSBGSVhfMl8xNzI3MzQ4MDMgICgoSU5UMzIpICAxNzc5OSkJLyogRklYKDIuMTcyNzM0ODAzKSAqLwotI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLwotI2RlZmluZSBGSVhfM182MjQ1MDk3ODUgICgoSU5UMzIpICAyOTY5MikJLyogRklYKDMuNjI0NTA5Nzg1KSAqLwotI2Vsc2UKLSNkZWZpbmUgRklYXzBfMjExMTY0MjQzICBGSVgoMC4yMTExNjQyNDMpCi0jZGVmaW5lIEZJWF8wXzUwOTc5NTU3OSAgRklYKDAuNTA5Nzk1NTc5KQotI2RlZmluZSBGSVhfMF82MDEzNDQ4ODcgIEZJWCgwLjYwMTM0NDg4NykKLSNkZWZpbmUgRklYXzBfNzIwOTU5ODIyICBGSVgoMC43MjA5NTk4MjIpCi0jZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgRklYKDAuNzY1MzY2ODY1KQotI2RlZmluZSBGSVhfMF84NTA0MzAwOTUgIEZJWCgwLjg1MDQzMDA5NSkKLSNkZWZpbmUgRklYXzBfODk5OTc2MjIzICBGSVgoMC44OTk5NzYyMjMpCi0jZGVmaW5lIEZJWF8xXzA2MTU5NDMzNyAgRklYKDEuMDYxNTk0MzM3KQotI2RlZmluZSBGSVhfMV8yNzI3NTg1ODAgIEZJWCgxLjI3Mjc1ODU4MCkKLSNkZWZpbmUgRklYXzFfNDUxNzc0OTgxICBGSVgoMS40NTE3NzQ5ODEpCi0jZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQotI2RlZmluZSBGSVhfMl8xNzI3MzQ4MDMgIEZJWCgyLjE3MjczNDgwMykKLSNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICBGSVgoMi41NjI5MTU0NDcpCi0jZGVmaW5lIEZJWF8zXzYyNDUwOTc4NSAgRklYKDMuNjI0NTA5Nzg1KQotI2VuZGlmCi0KLQotLyogTXVsdGlwbHkgYW4gSU5UMzIgdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQgdG8geWllbGQgYW4gSU5UMzIgcmVzdWx0LgotICogRm9yIDgtYml0IHNhbXBsZXMgd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZywgYWxsIHRoZSB2YXJpYWJsZQotICogYW5kIGNvbnN0YW50IHZhbHVlcyBpbnZvbHZlZCBhcmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMgd2lkZSwgc28gYQotICogMTZ4MTYtPjMyIGJpdCBtdWx0aXBseSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgZnVsbCAzMngzMiBtdWx0aXBseS4KLSAqIEZvciAxMi1iaXQgc2FtcGxlcywgYSBmdWxsIDMyLWJpdCBtdWx0aXBsaWNhdGlvbiB3aWxsIGJlIG5lZWRlZC4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpCi0jZWxzZQotI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQotI2VuZGlmCi0KLQotLyogRGVxdWFudGl6ZSBhIGNvZWZmaWNpZW50IGJ5IG11bHRpcGx5aW5nIGl0IGJ5IHRoZSBtdWx0aXBsaWVyLXRhYmxlCi0gKiBlbnRyeTsgcHJvZHVjZSBhbiBpbnQgcmVzdWx0LiAgSW4gdGhpcyBtb2R1bGUsIGJvdGggaW5wdXRzIGFuZCByZXN1bHQKLSAqIGFyZSAxNiBiaXRzIG9yIGxlc3MsIHNvIGVpdGhlciBpbnQgb3Igc2hvcnQgbXVsdGlwbHkgd2lsbCB3b3JrLgotICovCi0KLSNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoSVNMT1dfTVVMVF9UWVBFKSAoY29lZikpICogKHF1YW50dmFsKSkKLQotCi0vKgotICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKLSAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSA0eDQgb3V0cHV0IGJsb2NrLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19pZGN0XzR4NCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0JICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotewotICBJTlQzMiB0bXAwLCB0bXAyLCB0bXAxMCwgdG1wMTI7Ci0gIElOVDMyIHoxLCB6MiwgejMsIHo0OwotICBKQ09FRlBUUiBpbnB0cjsKLSAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIGludCAqIHdzcHRyOwotICBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7Ci0gIGludCBjdHI7Ci0gIGludCB3b3Jrc3BhY2VbRENUU0laRSo0XTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCi0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLwotCi0gIGlucHRyID0gY29lZl9ibG9jazsKLSAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKywgY3RyLS0pIHsKLSAgICAvKiBEb24ndCBib3RoZXIgdG8gcHJvY2VzcyBjb2x1bW4gNCwgYmVjYXVzZSBzZWNvbmQgcGFzcyB3b24ndCB1c2UgaXQgKi8KLSAgICBpZiAoY3RyID09IERDVFNJWkUtNCkKLSAgICAgIGNvbnRpbnVlOwotICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvOyB3ZSBuZWVkIG5vdCBleGFtaW5lIHRlcm0gNCBmb3IgNHg0IG91dHB1dCAqLwotICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOwotICAgICAgCi0gICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKLSAgICB0bXAwIDw8PSAoQ09OU1RfQklUUysxKTsKLSAgICAKLSAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7Ci0gICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOwotCi0gICAgdG1wMiA9IE1VTFRJUExZKHoyLCBGSVhfMV84NDc3NTkwNjUpICsgTVVMVElQTFkoejMsIC0gRklYXzBfNzY1MzY2ODY1KTsKLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMCAtIHRtcDI7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgKi8KLSAgICAKLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7Ci0gICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOwotICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKLSAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7Ci0gICAgCi0gICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzIxMTE2NDI0MykgLyogc3FydCgyKSAqIChjMy1jMSkgKi8KLQkgKyBNVUxUSVBMWSh6MiwgRklYXzFfNDUxNzc0OTgxKSAvKiBzcXJ0KDIpICogKGMzK2M3KSAqLwotCSArIE1VTFRJUExZKHozLCAtIEZJWF8yXzE3MjczNDgwMykgLyogc3FydCgyKSAqICgtYzEtYzUpICovCi0JICsgTVVMVElQTFkoejQsIEZJWF8xXzA2MTU5NDMzNyk7IC8qIHNxcnQoMikgKiAoYzUrYzcpICovCi0gICAgCi0gICAgdG1wMiA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzUwOTc5NTU3OSkgLyogc3FydCgyKSAqIChjNy1jNSkgKi8KLQkgKyBNVUxUSVBMWSh6MiwgLSBGSVhfMF82MDEzNDQ4ODcpIC8qIHNxcnQoMikgKiAoYzUtYzEpICovCi0JICsgTVVMVElQTFkoejMsIEZJWF8wXzg5OTk3NjIyMykgLyogc3FydCgyKSAqIChjMy1jNykgKi8KLQkgKyBNVUxUSVBMWSh6NCwgRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqIChjMStjMykgKi8KLQotICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLwotICAgIAotICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOwotICAgIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOwotICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDEyICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOwotICAgIHdzcHRyW0RDVFNJWkUqMl0gPSAoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOwotICB9Ci0gIAotICAvKiBQYXNzIDI6IHByb2Nlc3MgNCByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCi0KLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOwotICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgYSB6ZXJvIHJvdyB0ZXN0IGlzIHdvcnRod2hpbGUgaGVyZSAuLi4gKi8KLQotI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCi0gICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbMl0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmCi0Jd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCi0JCQkJICAmIFJBTkdFX01BU0tdOwotICAgICAgCi0gICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsxXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzJdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKLSAgICAgIAotICAgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICAgICAgY29udGludWU7Ci0gICAgfQotI2VuZGlmCi0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0gICAgCi0gICAgdG1wMCA9ICgoSU5UMzIpIHdzcHRyWzBdKSA8PCAoQ09OU1RfQklUUysxKTsKLSAgICAKLSAgICB0bXAyID0gTVVMVElQTFkoKElOVDMyKSB3c3B0clsyXSwgRklYXzFfODQ3NzU5MDY1KQotCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbNl0sIC0gRklYXzBfNzY1MzY2ODY1KTsKLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMCAtIHRtcDI7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgKi8KLSAgICAKLSAgICB6MSA9IChJTlQzMikgd3NwdHJbN107Ci0gICAgejIgPSAoSU5UMzIpIHdzcHRyWzVdOwotICAgIHozID0gKElOVDMyKSB3c3B0clszXTsKLSAgICB6NCA9IChJTlQzMikgd3NwdHJbMV07Ci0gICAgCi0gICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzIxMTE2NDI0MykgLyogc3FydCgyKSAqIChjMy1jMSkgKi8KLQkgKyBNVUxUSVBMWSh6MiwgRklYXzFfNDUxNzc0OTgxKSAvKiBzcXJ0KDIpICogKGMzK2M3KSAqLwotCSArIE1VTFRJUExZKHozLCAtIEZJWF8yXzE3MjczNDgwMykgLyogc3FydCgyKSAqICgtYzEtYzUpICovCi0JICsgTVVMVElQTFkoejQsIEZJWF8xXzA2MTU5NDMzNyk7IC8qIHNxcnQoMikgKiAoYzUrYzcpICovCi0gICAgCi0gICAgdG1wMiA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzUwOTc5NTU3OSkgLyogc3FydCgyKSAqIChjNy1jNSkgKi8KLQkgKyBNVUxUSVBMWSh6MiwgLSBGSVhfMF82MDEzNDQ4ODcpIC8qIHNxcnQoMikgKiAoYzUtYzEpICovCi0JICsgTVVMVElQTFkoejMsIEZJWF8wXzg5OTk3NjIyMykgLyogc3FydCgyKSAqIChjMy1jNykgKi8KLQkgKyBNVUxUSVBMWSh6NCwgRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqIChjMStjMykgKi8KLQotICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLwotICAgIAotICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAyLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMiwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDAsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAwLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICAKLSAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gIH0KLX0KLQotCi0vKgotICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKLSAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSAyeDIgb3V0cHV0IGJsb2NrLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19pZGN0XzJ4MiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0JICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotewotICBJTlQzMiB0bXAwLCB0bXAxMCwgejE7Ci0gIEpDT0VGUFRSIGlucHRyOwotICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKLSAgaW50ICogd3NwdHI7Ci0gIEpTQU1QUk9XIG91dHB0cjsKLSAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKLSAgaW50IGN0cjsKLSAgaW50IHdvcmtzcGFjZVtEQ1RTSVpFKjJdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KLSAgU0hJRlRfVEVNUFMKLQotICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCi0KLSAgaW5wdHIgPSBjb2VmX2Jsb2NrOwotICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOwotICB3c3B0ciA9IHdvcmtzcGFjZTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFOyBjdHIgPiAwOyBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrLCBjdHItLSkgewotICAgIC8qIERvbid0IGJvdGhlciB0byBwcm9jZXNzIGNvbHVtbnMgMiw0LDYgKi8KLSAgICBpZiAoY3RyID09IERDVFNJWkUtMiB8fCBjdHIgPT0gRENUU0laRS00IHx8IGN0ciA9PSBEQ1RTSVpFLTYpCi0gICAgICBjb250aW51ZTsKLSAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqM10gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvOyB3ZSBuZWVkIG5vdCBleGFtaW5lIHRlcm1zIDIsNCw2IGZvciAyeDIgb3V0cHV0ICovCi0gICAgICBpbnQgZGN2YWwgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pIDw8IFBBU1MxX0JJVFM7Ci0gICAgICAKLSAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKLSAgICAgIAotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotICAgIAotICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKLSAgICB0bXAxMCA9IHoxIDw8IChDT05TVF9CSVRTKzIpOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7Ci0gICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzcyMDk1OTgyMik7IC8qIHNxcnQoMikgKiAoYzctYzUrYzMtYzEpICovCi0gICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOwotICAgIHRtcDAgKz0gTVVMVElQTFkoejEsIEZJWF8wXzg1MDQzMDA5NSk7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1K2M3KSAqLwotICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKLSAgICB0bXAwICs9IE1VTFRJUExZKHoxLCAtIEZJWF8xXzI3Mjc1ODU4MCk7IC8qIHNxcnQoMikgKiAoLWMxK2MzLWM1LWM3KSAqLwotICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKLSAgICB0bXAwICs9IE1VTFRJUExZKHoxLCBGSVhfM182MjQ1MDk3ODUpOyAvKiBzcXJ0KDIpICogKGMxK2MzK2M1K2M3KSAqLwotCi0gICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCi0gICAgCi0gICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMik7Ci0gICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMik7Ci0gIH0KLSAgCi0gIC8qIFBhc3MgMjogcHJvY2VzcyAyIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KLQotICB3c3B0ciA9IHdvcmtzcGFjZTsKLSAgZm9yIChjdHIgPSAwOyBjdHIgPCAyOyBjdHIrKykgewotICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7Ci0gICAgLyogSXQncyBub3QgY2xlYXIgd2hldGhlciBhIHplcm8gcm93IHRlc3QgaXMgd29ydGh3aGlsZSBoZXJlIC4uLiAqLwotCi0jaWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKLSAgICBpZiAod3NwdHJbMV0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmIHdzcHRyWzVdID09IDAgJiYgd3NwdHJbN10gPT0gMCkgewotICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KLSAgICAgIEpTQU1QTEUgZGN2YWwgPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgd3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKLQkJCQkgICYgUkFOR0VfTUFTS107Ci0gICAgICAKLSAgICAgIG91dHB0clswXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzFdID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSNlbmRpZgotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotICAgIAotICAgIHRtcDEwID0gKChJTlQzMikgd3NwdHJbMF0pIDw8IChDT05TVF9CSVRTKzIpOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB0bXAwID0gTVVMVElQTFkoKElOVDMyKSB3c3B0cls3XSwgLSBGSVhfMF83MjA5NTk4MjIpIC8qIHNxcnQoMikgKiAoYzctYzUrYzMtYzEpICovCi0JICsgTVVMVElQTFkoKElOVDMyKSB3c3B0cls1XSwgRklYXzBfODUwNDMwMDk1KSAvKiBzcXJ0KDIpICogKC1jMStjMytjNStjNykgKi8KLQkgKyBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzNdLCAtIEZJWF8xXzI3Mjc1ODU4MCkgLyogc3FydCgyKSAqICgtYzErYzMtYzUtYzcpICovCi0JICsgTVVMVElQTFkoKElOVDMyKSB3c3B0clsxXSwgRklYXzNfNjI0NTA5Nzg1KTsgLyogc3FydCgyKSAqIChjMStjMytjNStjNykgKi8KLQotICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLwotICAgIAotICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAwLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzIpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMCwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysyKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgCi0gICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci19Ci0KLQotLyoKLSAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCi0gKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMXgxIG91dHB1dCBibG9jay4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF8xeDEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgaW50IGRjdmFsOwotICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKLSAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKLSAgU0hJRlRfVEVNUFMKLQotICAvKiBXZSBoYXJkbHkgbmVlZCBhbiBpbnZlcnNlIERDVCByb3V0aW5lIGZvciB0aGlzOiBqdXN0IHRha2UgdGhlCi0gICAqIGF2ZXJhZ2UgcGl4ZWwgdmFsdWUsIHdoaWNoIGlzIG9uZS1laWdodGggb2YgdGhlIERDIGNvZWZmaWNpZW50LgotICAgKi8KLSAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLSAgZGN2YWwgPSBERVFVQU5USVpFKGNvZWZfYmxvY2tbMF0sIHF1YW50cHRyWzBdKTsKLSAgZGN2YWwgPSAoaW50KSBERVNDQUxFKChJTlQzMikgZGN2YWwsIDMpOwotCi0gIG91dHB1dF9idWZbMF1bb3V0cHV0X2NvbF0gPSByYW5nZV9saW1pdFtkY3ZhbCAmIFJBTkdFX01BU0tdOwotfQotCi0jZW5kaWYgLyogSURDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamlkY3R2ZW51bS5jIGIvbGlianBlZ3R3cnAvamlkY3R2ZW51bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU4YmI1Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ppZGN0dmVudW0uYworKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKgotICogamlkY3R2ZW51bS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGUgQXVyb3JhIEZvcnVtLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIiAgICAvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0jaWZkZWYgQU5EUk9JRF9KUEVHX1VTRV9WRU5VTQotLyoKLSAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotICovCi0jaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0vKiBEZXF1YW50aXplIGEgY29lZmZpY2llbnQgYnkgbXVsdGlwbHlpbmcgaXQgYnkgdGhlIG11bHRpcGxpZXItdGFibGUKLSAqIGVudHJ5OyBwcm9kdWNlIGFuIGludCByZXN1bHQuICBJbiB0aGlzIG1vZHVsZSwgYm90aCBpbnB1dHMgYW5kIHJlc3VsdAotICogYXJlIDE2IGJpdHMgb3IgbGVzcywgc28gZWl0aGVyIGludCBvciBzaG9ydCBtdWx0aXBseSB3aWxsIHdvcmsuCi0gKi8KLQotI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICAoKGNvZWYpICogKChJTlQxNilxdWFudHZhbCkpCi0KLUdMT0JBTCh2b2lkKQotanBlZ19pZGN0X2lzbG93IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLSAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0gICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIEpDT0VGUFRSIGNvZWZwdHI7Ci0gIGludCBjdHI7Ci0KLSAgLyogaWRjdF9vdXQgdGVtcCBidWZmZXIgaXMgbmVlZGVkIGJlY2F1c2Ugb3V0cHV0X2J1ZiBzYW1wbGUgYWxsb2NhdGlvbiBpcyA4IGJpdHMsCi0gICAqIHdoaWxlIElEQ1Qgb3V0cHV0IGV4cGVjdHMgMTYgYml0cy4KLSAgICovCi0gIElOVDE2IGlkY3Rfb3V0W0RDVFNJWkUyXTsgIC8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLwotICBKU0FNUFJPVyBvdXRwdHI7Ci0gIElOVDE2KiAgaWRjdHB0cjsKLQotICBjb2VmcHRyICA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0KLSAgLyogRGVxdWFudGl6ZSB0aGUgY29lZmYgYnVmZmVyIGFuZCB3cml0ZSBpdCBiYWNrIHRvIHRoZSBzYW1lIGxvY2F0aW9uICovCi0gIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKLSAgICBjb2VmcHRyWzBdICAgICAgICAgPSBERVFVQU5USVpFKGNvZWZwdHJbMF0gICAgICAgICwgcXVhbnRwdHJbMF0gICAgICAgICk7Ci0gICAgY29lZnB0cltEQ1RTSVpFKjFdID0gREVRVUFOVElaRShjb2VmcHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOwotICAgIGNvZWZwdHJbRENUU0laRSoyXSA9IERFUVVBTlRJWkUoY29lZnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKLSAgICBjb2VmcHRyW0RDVFNJWkUqM10gPSBERVFVQU5USVpFKGNvZWZwdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7Ci0gICAgY29lZnB0cltEQ1RTSVpFKjRdID0gREVRVUFOVElaRShjb2VmcHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOwotICAgIGNvZWZwdHJbRENUU0laRSo1XSA9IERFUVVBTlRJWkUoY29lZnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKLSAgICBjb2VmcHRyW0RDVFNJWkUqNl0gPSBERVFVQU5USVpFKGNvZWZwdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7Ci0gICAgY29lZnB0cltEQ1RTSVpFKjddID0gREVRVUFOVElaRShjb2VmcHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOwotCi0gICAgLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLwotICAgIHF1YW50cHRyKys7Ci0gICAgY29lZnB0cisrOwotICB9Ci0KLSAgaWRjdF84eDhfdmVudW0oKElOVDE2Kiljb2VmX2Jsb2NrLAotICAgICAgICAgICAgICAgICAoSU5UMTYqKWlkY3Rfb3V0LAotICAgICAgICAgICAgICAgICBEQ1RTSVpFICogc2l6ZW9mKElOVDE2KSk7Ci0KLSAgaWRjdHB0ciA9IGlkY3Rfb3V0OwotICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKLSAgICAvLyBvdXRwdHIgc2FtcGxlIHNpemUgaXMgMSBieXRlIHdoaWxlIGlkY3RwdHIgc2FtcGxlIHNpemUgaXMgMiBieXRlcwotICAgIG91dHB0clswXSA9IGlkY3RwdHJbMF07Ci0gICAgb3V0cHRyWzFdID0gaWRjdHB0clsxXTsKLSAgICBvdXRwdHJbMl0gPSBpZGN0cHRyWzJdOwotICAgIG91dHB0clszXSA9IGlkY3RwdHJbM107Ci0gICAgb3V0cHRyWzRdID0gaWRjdHB0cls0XTsKLSAgICBvdXRwdHJbNV0gPSBpZGN0cHRyWzVdOwotICAgIG91dHB0cls2XSA9IGlkY3RwdHJbNl07Ci0gICAgb3V0cHRyWzddID0gaWRjdHB0cls3XTsKLSAgICBpZGN0cHRyICArPSBEQ1RTSVpFOyAgICAgIC8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCByb3cgKi8KLSAgfQotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF80eDQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLSAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotewotICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKLSAgSlNBTVBST1cgb3V0cHRyOwotCi0gIC8qIE5vdGU6IE11c3QgYWxsb2NhdGUgOHg0IGV2ZW4gdGhvdWdoIG9ubHkgNHg0IGlzIHVzZWQgYmVjYXVzZQotICAgKiBJRENUIGZ1bmN0aW9uIGV4cGVjdHMgc3RyaWRlIG9mIDguIFN0cmlkZSBpbnB1dCB0byBmdW5jdGlvbiBpcyBpZ25vcmVkLgotICAgKi8KLSAgSU5UMTYgICAgaWRjdF9vdXRbRENUU0laRSAqIChEQ1RTSVpFPj4xKV07ICAvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KLSAgSU5UMTYqICAgaWRjdHB0cjsKLSAgSkNPRUZQVFIgY29lZnB0cjsKLSAgaW50IGN0cjsKLQotICBjb2VmcHRyICA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0KLSAgLyogRGVxdWFudGl6ZSB0aGUgY29lZmYgYnVmZmVyIGFuZCB3cml0ZSBpdCBiYWNrIHRvIHRoZSBzYW1lIGxvY2F0aW9uICovCi0gIGZvciAoY3RyID0gKERDVFNJWkU+PjEpOyBjdHIgPiAwOyBjdHItLSkgewotICAgIGNvZWZwdHJbMF0gICAgICAgICA9IERFUVVBTlRJWkUoY29lZnB0clswXSAgICAgICAgLCBxdWFudHB0clswXSAgICAgICAgKTsKLSAgICBjb2VmcHRyW0RDVFNJWkUqMV0gPSBERVFVQU5USVpFKGNvZWZwdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7Ci0gICAgY29lZnB0cltEQ1RTSVpFKjJdID0gREVRVUFOVElaRShjb2VmcHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOwotICAgIGNvZWZwdHJbRENUU0laRSozXSA9IERFUVVBTlRJWkUoY29lZnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKLQotICAgIC8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KLSAgICBxdWFudHB0cisrOwotICAgIGNvZWZwdHIrKzsKLSAgfQotCi0gIGlkY3RfNHg0X3ZlbnVtKChJTlQxNiopY29lZl9ibG9jaywKLSAgICAgICAgICAgICAgICAgKElOVDE2KilpZGN0X291dCwKLSAgICAgICAgICAgICAgICAgIERDVFNJWkUgKiBzaXplb2YoSU5UMTYpKTsKLQotICBpZGN0cHRyID0gaWRjdF9vdXQ7Ci0gIGZvciAoY3RyID0gMDsgY3RyIDwgKERDVFNJWkU+PjEpOyBjdHIrKykgewotICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7Ci0KLSAgICAvKiBvdXRwdHIgc2FtcGxlIHNpemUgaXMgMSBieXRlIHdoaWxlIGlkY3RwdHIgc2FtcGxlIHNpemUgaXMgMiBieXRlcyAqLwotICAgIG91dHB0clswXSA9IGlkY3RwdHJbMF07Ci0gICAgb3V0cHRyWzFdID0gaWRjdHB0clsxXTsKLSAgICBvdXRwdHJbMl0gPSBpZGN0cHRyWzJdOwotICAgIG91dHB0clszXSA9IGlkY3RwdHJbM107Ci0gICAgLyogSURDVCBmdW5jdGlvbiBhc3N1bWVzIHN0cmlkZSBvZiA4IHVuaXRzICovCi0gICAgaWRjdHB0ciArPSAoRENUU0laRSk7ICAgIC8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCByb3cgKi8KLSAgfQotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF8yeDIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLSAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotewotICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKLSAgSlNBTVBST1cgb3V0cHRyOwotCi0gIC8qIE5vdGU6IE11c3QgYWxsb2NhdGUgOHgyIGV2ZW4gdGhvdWdoIG9ubHkgMngyIGlzIHVzZWQgYmVjYXVzZQotICAgKiBJRENUIGZ1bmN0aW9uIGV4cGVjdHMgc3RyaWRlIG9mIDguIFN0cmlkZSBpbnB1dCB0byBmdW5jdGlvbiBpcyBpZ25vcmVkLgotICAgKiBUaGVyZSBpcyBhbHNvIGEgaHcgbGltaXRhdGlvbiByZXF1aXJpbmcgaW5wdXQgc2l6ZSB0byBiZSA4eDIuCi0gICAqLwotICBJTlQxNiAgICBpZGN0X291dFtEQ1RTSVpFICogKERDVFNJWkU+PjIpXTsgIC8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLwotICBJTlQxNiogICBpZGN0cHRyOwotICBKQ09FRlBUUiBjb2VmcHRyOwotICBpbnQgY3RyOwotCi0gIGNvZWZwdHIgID0gY29lZl9ibG9jazsKLSAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLQotICAvKiBEZXF1YW50aXplIHRoZSBjb2VmZiBidWZmZXIgYW5kIHdyaXRlIGl0IGJhY2sgdG8gdGhlIHNhbWUgbG9jYXRpb24gKi8KLSAgZm9yIChjdHIgPSAoRENUU0laRT4+Mik7IGN0ciA+IDA7IGN0ci0tKSB7Ci0gICAgY29lZnB0clswXSAgICAgICAgID0gREVRVUFOVElaRShjb2VmcHRyWzBdICAgICAgICAsIHF1YW50cHRyWzBdICAgICAgICApOwotICAgIGNvZWZwdHJbRENUU0laRSoxXSA9IERFUVVBTlRJWkUoY29lZnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKLQotICAgIC8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KLSAgICBxdWFudHB0cisrOwotICAgIGNvZWZwdHIrKzsKLSAgfQotCi0gIGlkY3RfMngyX3ZlbnVtKChJTlQxNiopY29lZl9ibG9jaywKLSAgICAgICAgICAgICAgICAgKElOVDE2KilpZGN0X291dCwKLSAgICAgICAgICAgICAgICAgIERDVFNJWkUgKiBzaXplb2YoSU5UMTYpKTsKLQotICBpZGN0cHRyID0gaWRjdF9vdXQ7Ci0gIGZvciAoY3RyID0gMDsgY3RyIDwgKERDVFNJWkU+PjIpOyBjdHIrKykgewotICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7Ci0KLSAgICAvKiBvdXRwdHIgc2FtcGxlIHNpemUgaXMgMSBieXRlcywgaWRjdHB0ciBzYW1wbGUgc2l6ZSBpcyAyIGJ5dGVzICovCi0gICAgb3V0cHRyWzBdID0gaWRjdHB0clswXTsKLSAgICBvdXRwdHJbMV0gPSBpZGN0cHRyWzFdOwotCi0gICAgLyogSURDVCBmdW5jdGlvbiBhc3N1bWVzIHN0cmlkZSBvZiA4IHVuaXRzICovCi0gICAgaWRjdHB0ciArPSAoRENUU0laRSk7ICAgIC8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCByb3cgKi8KLSAgfQotfQotCi0KLUdMT0JBTCh2b2lkKQotanBlZ19pZGN0XzF4MSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0gICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi17Ci0gIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOwotICBKU0FNUFJPVyBvdXRwdHI7IC8vIDgtYml0IHR5cGUKLSAgSU5UMTYgICAgaWRjdF9vdXRbRENUU0laRV07IC8qIFJlcXVpcmVkIHRvIGFsbG9jYXRlIDggc2FtcGxlcywgZXZlbiB0aG91Z2ggd2Ugb25seSB1c2Ugb25lLiAqLwotICBKQ09FRlBUUiBjb2VmcHRyOwotICBpbnQgY3RyOwotCi0gIGNvZWZwdHIgID0gY29lZl9ibG9jazsKLSAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLSAgb3V0cHRyICAgPSBvdXRwdXRfYnVmWzBdICsgb3V0cHV0X2NvbDsKLQotICAvKiBEZXF1YW50aXplIHRoZSBjb2VmZiBidWZmZXIgYW5kIHdyaXRlIGl0IGJhY2sgdG8gdGhlIHNhbWUgbG9jYXRpb24gKi8KLSAgY29lZnB0clswXSA9IERFUVVBTlRJWkUoY29lZnB0clswXSwgcXVhbnRwdHJbMF0pOwotCi0gIGlkY3RfMXgxX3ZlbnVtKChJTlQxNiopY29lZl9ibG9jaywKLSAgICAgICAgICAgICAgICAgKElOVDE2KilpZGN0X291dCwKLSAgICAgICAgICAgICAgICAgRENUU0laRSAqIHNpemVvZihJTlQxNikpOwotICBvdXRwdHJbMF0gPSBpZGN0X291dFswXTsKLX0KLQotCi0jZW5kaWYgLyogQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamluY2x1ZGUuaCBiL2xpYmpwZWd0d3JwL2ppbmNsdWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNGYxNTEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamluY2x1ZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBqaW5jbHVkZS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgZXhpc3RzIHRvIHByb3ZpZGUgYSBzaW5nbGUgcGxhY2UgdG8gZml4IGFueSBwcm9ibGVtcyB3aXRoCi0gKiBpbmNsdWRpbmcgdGhlIHdyb25nIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgKENvbW1vbiBwcm9ibGVtcyBhcmUgdGFrZW4KLSAqIGNhcmUgb2YgYnkgdGhlIHN0YW5kYXJkIGpjb25maWcgc3ltYm9scywgYnV0IG9uIHJlYWxseSB3ZWlyZCBzeXN0ZW1zCi0gKiB5b3UgbWF5IGhhdmUgdG8gZWRpdCB0aGlzIGZpbGUuKQotICoKLSAqIE5PVEU6IHRoaXMgZmlsZSBpcyBOT1QgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgYnkgYXBwbGljYXRpb25zIHVzaW5nIHRoZQotICogSlBFRyBsaWJyYXJ5LiAgTW9zdCBhcHBsaWNhdGlvbnMgbmVlZCBvbmx5IGluY2x1ZGUganBlZ2xpYi5oLgotICovCi0KLQotLyogSW5jbHVkZSBhdXRvLWNvbmZpZyBmaWxlIHRvIGZpbmQgb3V0IHdoaWNoIHN5c3RlbSBpbmNsdWRlIGZpbGVzIHdlIG5lZWQuICovCi0KLSNpbmNsdWRlICJqY29uZmlnLmgiCQkvKiBhdXRvIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLwotI2RlZmluZSBKQ09ORklHX0lOQ0xVREVECS8qIHNvIHRoYXQganBlZ2xpYi5oIGRvZXNuJ3QgZG8gaXQgYWdhaW4gKi8KLQotLyoKLSAqIFdlIG5lZWQgdGhlIE5VTEwgbWFjcm8gYW5kIHNpemVfdCB0eXBlZGVmLgotICogT24gYW4gQU5TSS1jb25mb3JtaW5nIHN5c3RlbSBpdCBpcyBzdWZmaWNpZW50IHRvIGluY2x1ZGUgPHN0ZGRlZi5oPi4KLSAqIE90aGVyd2lzZSwgd2UgZ2V0IHRoZW0gZnJvbSA8c3RkbGliLmg+IG9yIDxzdGRpby5oPjsgd2UgbWF5IGhhdmUgdG8KLSAqIHB1bGwgaW4gPHN5cy90eXBlcy5oPiBhcyB3ZWxsLgotICogTm90ZSB0aGF0IHRoZSBjb3JlIEpQRUcgbGlicmFyeSBkb2VzIG5vdCByZXF1aXJlIDxzdGRpby5oPjsKLSAqIG9ubHkgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBhbmQgZGF0YSBzb3VyY2UvZGVzdGluYXRpb24gbW9kdWxlcyBkby4KLSAqIEJ1dCB3ZSBtdXN0IHB1bGwgaXQgaW4gYmVjYXVzZSBvZiB0aGUgcmVmZXJlbmNlcyB0byBGSUxFIGluIGpwZWdsaWIuaC4KLSAqIFlvdSBjYW4gcmVtb3ZlIHRob3NlIHJlZmVyZW5jZXMgaWYgeW91IHdhbnQgdG8gY29tcGlsZSB3aXRob3V0IDxzdGRpby5oPi4KLSAqLwotCi0jaWZkZWYgSEFWRV9TVERERUZfSAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfU1lTX1RZUEVTX0gKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyoKLSAqIFdlIG5lZWQgbWVtb3J5IGNvcHlpbmcgYW5kIHplcm9pbmcgZnVuY3Rpb25zLCBwbHVzIHN0cm5jcHkoKS4KLSAqIEFOU0kgYW5kIFN5c3RlbSBWIGltcGxlbWVudGF0aW9ucyBkZWNsYXJlIHRoZXNlIGluIDxzdHJpbmcuaD4uCi0gKiBCU0QgZG9lc24ndCBoYXZlIHRoZSBtZW0oKSBmdW5jdGlvbnMsIGJ1dCBpdCBkb2VzIGhhdmUgYmNvcHkoKS9iemVybygpLgotICogU29tZSBzeXN0ZW1zIG1heSBkZWNsYXJlIG1lbXNldCBhbmQgbWVtY3B5IGluIDxtZW1vcnkuaD4uCi0gKgotICogTk9URTogd2UgYXNzdW1lIHRoZSBzaXplIHBhcmFtZXRlcnMgdG8gdGhlc2UgZnVuY3Rpb25zIGFyZSBvZiB0eXBlIHNpemVfdC4KLSAqIENoYW5nZSB0aGUgY2FzdHMgaW4gdGhlc2UgbWFjcm9zIGlmIG5vdCEKLSAqLwotCi0jaWZkZWYgTkVFRF9CU0RfU1RSSU5HUwotCi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2RlZmluZSBNRU1aRVJPKHRhcmdldCxzaXplKQliemVybygodm9pZCAqKSh0YXJnZXQpLCAoc2l6ZV90KShzaXplKSkKLSNkZWZpbmUgTUVNQ09QWShkZXN0LHNyYyxzaXplKQliY29weSgoY29uc3Qgdm9pZCAqKShzcmMpLCAodm9pZCAqKShkZXN0KSwgKHNpemVfdCkoc2l6ZSkpCi0KLSNlbHNlIC8qIG5vdCBCU0QsIGFzc3VtZSBBTlNJL1N5c1Ygc3RyaW5nIGxpYiAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZGVmaW5lIE1FTVpFUk8odGFyZ2V0LHNpemUpCW1lbXNldCgodm9pZCAqKSh0YXJnZXQpLCAwLCAoc2l6ZV90KShzaXplKSkKLSNkZWZpbmUgTUVNQ09QWShkZXN0LHNyYyxzaXplKQltZW1jcHkoKHZvaWQgKikoZGVzdCksIChjb25zdCB2b2lkICopKHNyYyksIChzaXplX3QpKHNpemUpKQotCi0jZW5kaWYKLQotLyoKLSAqIEluIEFOU0kgQywgYW5kIGluZGVlZCBhbnkgcmF0aW9uYWwgaW1wbGVtZW50YXRpb24sIHNpemVfdCBpcyBhbHNvIHRoZQotICogdHlwZSByZXR1cm5lZCBieSBzaXplb2YoKS4gIEhvd2V2ZXIsIGl0IHNlZW1zIHRoZXJlIGFyZSBzb21lIGlycmF0aW9uYWwKLSAqIGltcGxlbWVudGF0aW9ucyBvdXQgdGhlcmUsIGluIHdoaWNoIHNpemVvZigpIHJldHVybnMgYW4gaW50IGV2ZW4gdGhvdWdoCi0gKiBzaXplX3QgaXMgZGVmaW5lZCBhcyBsb25nIG9yIHVuc2lnbmVkIGxvbmcuICBUbyBlbnN1cmUgY29uc2lzdGVudCByZXN1bHRzCi0gKiB3ZSBhbHdheXMgdXNlIHRoaXMgU0laRU9GKCkgbWFjcm8gaW4gcGxhY2Ugb2YgdXNpbmcgc2l6ZW9mKCkgZGlyZWN0bHkuCi0gKi8KLQotI2RlZmluZSBTSVpFT0Yob2JqZWN0KQkoKHNpemVfdCkgc2l6ZW9mKG9iamVjdCkpCi0KLS8qCi0gKiBUaGUgbW9kdWxlcyB0aGF0IHVzZSBmcmVhZCgpIGFuZCBmd3JpdGUoKSBhbHdheXMgaW52b2tlIHRoZW0gdGhyb3VnaAotICogdGhlc2UgbWFjcm9zLiAgT24gc29tZSBzeXN0ZW1zIHlvdSBtYXkgbmVlZCB0byB0d2lkZGxlIHRoZSBhcmd1bWVudCBjYXN0cy4KLSAqIENBVVRJT046IGFyZ3VtZW50IG9yZGVyIGlzIGRpZmZlcmVudCBmcm9tIHVuZGVybHlpbmcgZnVuY3Rpb25zIQotICovCi0KLSNkZWZpbmUgSkZSRUFEKGZpbGUsYnVmLHNpemVvZmJ1ZikgIFwKLSAgKChzaXplX3QpIGZyZWFkKCh2b2lkICopIChidWYpLCAoc2l6ZV90KSAxLCAoc2l6ZV90KSAoc2l6ZW9mYnVmKSwgKGZpbGUpKSkKLSNkZWZpbmUgSkZXUklURShmaWxlLGJ1ZixzaXplb2ZidWYpICBcCi0gICgoc2l6ZV90KSBmd3JpdGUoKGNvbnN0IHZvaWQgKikgKGJ1ZiksIChzaXplX3QpIDEsIChzaXplX3QpIChzaXplb2ZidWYpLCAoZmlsZSkpKQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvam1lbS1hbmRyb2lkLmMgYi9saWJqcGVndHdycC9qbWVtLWFuZHJvaWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhNGQwYS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qbWVtLWFuZHJvaWQuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLwotCi0jaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgbWFsbG9jKCksZnJlZSgpICovCi1leHRlcm4gdm9pZCAqIG1hbGxvYyBKUFAoKHNpemVfdCBzaXplKSk7Ci1leHRlcm4gdm9pZCBmcmVlIEpQUCgodm9pZCAqcHRyKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBTRUVLX1NFVAkJLyogcHJlLUFOU0kgc3lzdGVtcyBtYXkgbm90IGRlZmluZSB0aGlzOyAqLwotI2RlZmluZSBTRUVLX1NFVCAgMAkJLyogaWYgbm90LCBhc3N1bWUgMCBpcyBjb3JyZWN0ICovCi0jZW5kaWYKLQotCi0vKgotICogTWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIHJlZ3VsYXIgbGlicmFyeQotICogcm91dGluZXMgbWFsbG9jKCkgYW5kIGZyZWUoKS4KLSAqLwotCi1HTE9CQUwodm9pZCAqKQotanBlZ19nZXRfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgcmV0dXJuICh2b2lkICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZnJlZV9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICBmcmVlKG9iamVjdCk7Ci19Ci0KLQotLyoKLSAqICJMYXJnZSIgb2JqZWN0cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyAic21hbGwiIG9uZXMuCi0gKiBOQjogYWx0aG91Z2ggd2UgaW5jbHVkZSBGQVIga2V5d29yZHMgaW4gdGhlIHJvdXRpbmUgZGVjbGFyYXRpb25zLAotICogdGhpcyBmaWxlIHdvbid0IGFjdHVhbGx5IHdvcmsgaW4gODB4ODYgc21hbGwvbWVkaXVtIG1vZGVsOyBhdCBsZWFzdCwKLSAqIHlvdSBwcm9iYWJseSB3b24ndCBiZSBhYmxlIHRvIHByb2Nlc3MgdXNlZnVsLXNpemUgaW1hZ2VzIGluIG9ubHkgNjRLQi4KLSAqLwotCi1HTE9CQUwodm9pZCBGQVIgKikKLWpwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCBGQVIgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICBmcmVlKG9iamVjdCk7Ci19Ci0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBjb21wdXRlcyB0aGUgdG90YWwgbWVtb3J5IHNwYWNlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KLSAqIEl0J3MgaW1wb3NzaWJsZSB0byBkbyB0aGlzIGluIGEgcG9ydGFibGUgd2F5OyBvdXIgY3VycmVudCBzb2x1dGlvbiBpcwotICogdG8gbWFrZSB0aGUgdXNlciB0ZWxsIHVzICh3aXRoIGEgZGVmYXVsdCB2YWx1ZSBzZXQgYXQgY29tcGlsZSB0aW1lKS4KLSAqIElmIHlvdSBjYW4gYWN0dWFsbHkgZ2V0IHRoZSBhdmFpbGFibGUgc3BhY2UsIGl0J3MgYSBnb29kIGlkZWEgdG8gc3VidHJhY3QKLSAqIGEgc2xvcCBmYWN0b3Igb2YgNSUgb3Igc28uCi0gKi8KLQotI2lmbmRlZiBERUZBVUxUX01BWF9NRU0JCS8qIHNvIGNhbiBvdmVycmlkZSBmcm9tIG1ha2VmaWxlICovCi0jZGVmaW5lIERFRkFVTFRfTUFYX01FTQkJMTAwMDAwMDBMIC8qIGRlZmF1bHQ6IHRlbiBtZWdhYnl0ZSAqLwotI2VuZGlmCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1fYXZhaWxhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8sIGxvbmcgbWluX2J5dGVzX25lZWRlZCwKLQkJICAgIGxvbmcgbWF4X2J5dGVzX25lZWRlZCwgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkKLXsKLSAgcmV0dXJuIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlIC0gYWxyZWFkeV9hbGxvY2F0ZWQ7Ci19Ci0KLQotLyoKLSAqIEJhY2tpbmcgc3RvcmUgKHRlbXBvcmFyeSBmaWxlKSBtYW5hZ2VtZW50LgotICogQmFja2luZyBzdG9yZSBvYmplY3RzIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKLSAqIGpwZWdfbWVtX2F2YWlsYWJsZSBpcyBsZXNzIHRoYW4gdGhlIHRvdGFsIHNwYWNlIG5lZWRlZC4gIFlvdSBjYW4gZGlzcGVuc2UKLSAqIHdpdGggdGhlc2Ugcm91dGluZXMgaWYgeW91IGhhdmUgcGxlbnR5IG9mIHZpcnR1YWwgbWVtb3J5OyBzZWUgam1lbW5vYnMuYy4KLSAqLwotCi0KLU1FVEhPRERFRih2b2lkKQotcmVhZF9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBpZiAoZnNlZWsoaW5mby0+dGVtcF9maWxlLCBmaWxlX29mZnNldCwgU0VFS19TRVQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7Ci0gIGlmIChKRlJFQUQoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKLSAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9SRUFEKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJICAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkgICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOwotICBpZiAoSkZXUklURShpbmZvLT50ZW1wX2ZpbGUsIGJ1ZmZlcl9hZGRyZXNzLCBieXRlX2NvdW50KQotICAgICAgIT0gKHNpemVfdCkgYnl0ZV9jb3VudCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1dSSVRFKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLWNsb3NlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKLXsKLSAgZmNsb3NlKGluZm8tPnRlbXBfZmlsZSk7Ci0gIC8qIFNpbmNlIHRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0bXBmaWxlKCkgdG8gY3JlYXRlIHRoZSBmaWxlLAotICAgKiBubyBleHBsaWNpdCBmaWxlIGRlbGV0aW9uIGlzIG5lZWRlZC4KLSAgICovCi19Ci0KLXN0YXRpYyBGSUxFKiBnZXRUZW1wRmlsZUZyb21QYXRoKGNvbnN0IGNoYXIgKiBwYXRoKSB7Ci0gICAgRklMRSAqIGZkID0gZm9wZW4ocGF0aCwgIncrIik7Ci0gICAgdW5saW5rKHBhdGgpOwotICAgIHJldHVybiBmZDsKLX0KLQotc3RhdGljIEZJTEUqIGdldFRlbXBGaWxlKCkgewotICAgIGNoYXIgcGF0aFsxMDI0XTsKLSAgICBzbnByaW50ZihwYXRoLCAxMDIzLCAiL3NkY2FyZC8uJWQudG1wIiwgZ2V0cGlkKCkpOwotICAgIEZJTEUgKiBmZCA9IGdldFRlbXBGaWxlRnJvbVBhdGgocGF0aCk7Ci0gICAgaWYgKGZkID09IE5VTEwpIHsKLSAgICAgICAgLy8gYW55d2hlcmUgZWxzZSB3ZSBjYW4gY3JlYXRlIGEgdGVtcCBmaWxlPwotCQkvLwkgICAgc25wcmludGYocGF0aCwgMTAyMywgIi9kYXRhL2RhdGEvLiVkLnRtcCIsIGdldHBpZCgpKTsKLQkJLy8gICAgICBmZCA9IGdldFRlbXBGaWxlRnJvbVBhdGgocGF0aCk7Ci0gICAgfQotICAgIHJldHVybiBmZDsKLX0KLQotLyoKLSAqIEluaXRpYWwgb3BlbmluZyBvZiBhIGJhY2tpbmctc3RvcmUgb2JqZWN0LgotICoKLSAqIFRoaXMgdmVyc2lvbiB1c2VzIHRtcGZpbGUoKSwgd2hpY2ggY29uc3RydWN0cyBhIHN1aXRhYmxlIGZpbGUgbmFtZQotICogYmVoaW5kIHRoZSBzY2VuZXMuICBXZSBkb24ndCBoYXZlIHRvIHVzZSBpbmZvLT50ZW1wX25hbWVbXSBhdCBhbGw7Ci0gKiBpbmRlZWQsIHdlIGNhbid0IGV2ZW4gZmluZCBvdXQgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0ZW1wIGZpbGUuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQotewotICBpZiAoKGluZm8tPnRlbXBfZmlsZSA9IGdldFRlbXBGaWxlKCkpID09IE5VTEwpCi0gICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiIik7Ci0gIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfYmFja2luZ19zdG9yZTsKLSAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2JhY2tpbmdfc3RvcmU7Ci0gIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV9iYWNraW5nX3N0b3JlOwotfQotCi0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCi0gKiBjbGVhbnVwIHJlcXVpcmVkLgotICovCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICByZXR1cm4gREVGQVVMVF9NQVhfTUVNOwkvKiBkZWZhdWx0IGZvciBtYXhfbWVtb3J5X3RvX3VzZSAqLwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfbWVtX3Rlcm0gKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgLyogbm8gd29yayAqLwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvam1lbS1hc2htZW0uYyBiL2xpYmpwZWd0d3JwL2ptZW0tYXNobWVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMTdiMDIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvam1lbS1hc2htZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLwotCi0jaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLSNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSxmcmVlKCkgKi8KLWV4dGVybiB2b2lkICogbWFsbG9jIEpQUCgoc2l6ZV90IHNpemUpKTsKLWV4dGVybiB2b2lkIGZyZWUgSlBQKCh2b2lkICpwdHIpKTsKLSNlbmRpZgotCi0vKgotICogTWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIHJlZ3VsYXIgbGlicmFyeQotICogcm91dGluZXMgbWFsbG9jKCkgYW5kIGZyZWUoKS4KLSAqLwotCi1HTE9CQUwodm9pZCAqKQotanBlZ19nZXRfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgcmV0dXJuICh2b2lkICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZnJlZV9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICBmcmVlKG9iamVjdCk7Ci19Ci0KLQotLyoKLSAqICJMYXJnZSIgb2JqZWN0cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyAic21hbGwiIG9uZXMuCi0gKiBOQjogYWx0aG91Z2ggd2UgaW5jbHVkZSBGQVIga2V5d29yZHMgaW4gdGhlIHJvdXRpbmUgZGVjbGFyYXRpb25zLAotICogdGhpcyBmaWxlIHdvbid0IGFjdHVhbGx5IHdvcmsgaW4gODB4ODYgc21hbGwvbWVkaXVtIG1vZGVsOyBhdCBsZWFzdCwKLSAqIHlvdSBwcm9iYWJseSB3b24ndCBiZSBhYmxlIHRvIHByb2Nlc3MgdXNlZnVsLXNpemUgaW1hZ2VzIGluIG9ubHkgNjRLQi4KLSAqLwotCi1HTE9CQUwodm9pZCBGQVIgKikKLWpwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCBGQVIgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICBmcmVlKG9iamVjdCk7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCi0gKiBJdCdzIGltcG9zc2libGUgdG8gZG8gdGhpcyBpbiBhIHBvcnRhYmxlIHdheTsgb3VyIGN1cnJlbnQgc29sdXRpb24gaXMKLSAqIHRvIG1ha2UgdGhlIHVzZXIgdGVsbCB1cyAod2l0aCBhIGRlZmF1bHQgdmFsdWUgc2V0IGF0IGNvbXBpbGUgdGltZSkuCi0gKiBJZiB5b3UgY2FuIGFjdHVhbGx5IGdldCB0aGUgYXZhaWxhYmxlIHNwYWNlLCBpdCdzIGEgZ29vZCBpZGVhIHRvIHN1YnRyYWN0Ci0gKiBhIHNsb3AgZmFjdG9yIG9mIDUlIG9yIHNvLgotICovCi0KLSNpZm5kZWYgREVGQVVMVF9NQVhfTUVNCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBtYWtlZmlsZSAqLwotI2RlZmluZSBERUZBVUxUX01BWF9NRU0JCTEwMDAwMDAwTCAvKiBkZWZhdWx0OiB0ZW4gbWVnYWJ5dGUgKi8KLSNlbmRpZgotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCi0JCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCi17Ci0gIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOwotfQotCi0KLS8qCi0gKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KLSAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCi0gKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1yZWFkX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCSAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIG1lbW1vdmUoYnVmZmVyX2FkZHJlc3MsIGluZm8tPmFkZHIgKyBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIG1lbW1vdmUoaW5mby0+YWRkciArIGZpbGVfb2Zmc2V0LCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1jbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCi17Ci0gIG11bm1hcChpbmZvLT5hZGRyLCBpbmZvLT5zaXplKTsKLSAgY2xvc2UoaW5mby0+dGVtcF9maWxlKTsKLX0KLQotTE9DQUwoaW50KQotZ2V0X2FzaG1lbShiYWNraW5nX3N0b3JlX3B0ciBpbmZvLCBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKLXsKLSAgY2hhciBwYXRoWzEwMjRdOwotICBzbnByaW50ZihwYXRoLCAxMDIzLCAiJWQudG1wLmFzaG1lbSIsIGdldHBpZCgpKTsKLSAgaW50IGZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24ocGF0aCwgdG90YWxfYnl0ZXNfbmVlZGVkKTsKLSAgaWYgKGZkID09IC0xKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaW50IGVyciA9IGFzaG1lbV9zZXRfcHJvdF9yZWdpb24oZmQsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwotICBpZiAoZXJyKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaW5mby0+YWRkciA9IG1tYXAoTlVMTCwgdG90YWxfYnl0ZXNfbmVlZGVkLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwgZmQsIDApOwotICBpbmZvLT5zaXplID0gdG90YWxfYnl0ZXNfbmVlZGVkOwotICBpbmZvLT50ZW1wX2ZpbGUgPSBmZDsKLSAgcmV0dXJuIGZkOwotfQotCi0vKgotICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuCi0gKiBUaGlzIHZlcnNpb24gdXNlcyBhc2htZW0gdG8gZ2V0IGEgc2hhcmVkIG1lbW9yeSBvZiB0b3RhbC1ieXRlc19uZWVkZWQuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQotewotICBpZiAoZ2V0X2FzaG1lbShpbmZvLCB0b3RhbF9ieXRlc19uZWVkZWQpID09IC0xKQotICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIiIpOwotICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2JhY2tpbmdfc3RvcmU7Ci0gIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV9iYWNraW5nX3N0b3JlOwotICBpbmZvLT5jbG9zZV9iYWNraW5nX3N0b3JlID0gY2xvc2VfYmFja2luZ19zdG9yZTsKLX0KLQotLyoKLSAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKLSAqIGNsZWFudXAgcmVxdWlyZWQuCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIHJldHVybiBERUZBVUxUX01BWF9NRU07CS8qIGRlZmF1bHQgZm9yIG1heF9tZW1vcnlfdG9fdXNlICovCi19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qbWVtYW5zaS5jIGIvbGlianBlZ3R3cnAvam1lbWFuc2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5M2U0OS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qbWVtYW5zaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBqbWVtYW5zaS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBzaW1wbGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3lzdGVtLQotICogZGVwZW5kZW50IHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBUaGlzIGltcGxlbWVudGF0aW9uCi0gKiBhc3N1bWVzIHRoYXQgeW91IGhhdmUgdGhlIEFOU0ktc3RhbmRhcmQgbGlicmFyeSByb3V0aW5lIHRtcGZpbGUoKS4KLSAqIEFsc28sIHRoZSBwcm9ibGVtIG9mIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZQotICogaXMgc2hvdmVkIG9udG8gdGhlIHVzZXIuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KLQotI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIG1hbGxvYygpLGZyZWUoKSAqLwotZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOwotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQJCS8qIHByZS1BTlNJIHN5c3RlbXMgbWF5IG5vdCBkZWZpbmUgdGhpczsgKi8KLSNkZWZpbmUgU0VFS19TRVQgIDAJCS8qIGlmIG5vdCwgYXNzdW1lIDAgaXMgY29ycmVjdCAqLwotI2VuZGlmCi0KLQotLyoKLSAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKLSAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCi0gKi8KLQotR0xPQkFMKHZvaWQgKikKLWpwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZnJlZShvYmplY3QpOwotfQotCi0KLS8qCi0gKiAiTGFyZ2UiIG9iamVjdHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgInNtYWxsIiBvbmVzLgotICogTkI6IGFsdGhvdWdoIHdlIGluY2x1ZGUgRkFSIGtleXdvcmRzIGluIHRoZSByb3V0aW5lIGRlY2xhcmF0aW9ucywKLSAqIHRoaXMgZmlsZSB3b24ndCBhY3R1YWxseSB3b3JrIGluIDgweDg2IHNtYWxsL21lZGl1bSBtb2RlbDsgYXQgbGVhc3QsCi0gKiB5b3UgcHJvYmFibHkgd29uJ3QgYmUgYWJsZSB0byBwcm9jZXNzIHVzZWZ1bC1zaXplIGltYWdlcyBpbiBvbmx5IDY0S0IuCi0gKi8KLQotR0xPQkFMKHZvaWQgRkFSICopCi1qcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgRkFSICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZnJlZShvYmplY3QpOwotfQotCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCi0gKiBJdCdzIGltcG9zc2libGUgdG8gZG8gdGhpcyBpbiBhIHBvcnRhYmxlIHdheTsgb3VyIGN1cnJlbnQgc29sdXRpb24gaXMKLSAqIHRvIG1ha2UgdGhlIHVzZXIgdGVsbCB1cyAod2l0aCBhIGRlZmF1bHQgdmFsdWUgc2V0IGF0IGNvbXBpbGUgdGltZSkuCi0gKiBJZiB5b3UgY2FuIGFjdHVhbGx5IGdldCB0aGUgYXZhaWxhYmxlIHNwYWNlLCBpdCdzIGEgZ29vZCBpZGVhIHRvIHN1YnRyYWN0Ci0gKiBhIHNsb3AgZmFjdG9yIG9mIDUlIG9yIHNvLgotICovCi0KLSNpZm5kZWYgREVGQVVMVF9NQVhfTUVNCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBtYWtlZmlsZSAqLwotI2RlZmluZSBERUZBVUxUX01BWF9NRU0JCTEwMDAwMDBMIC8qIGRlZmF1bHQ6IG9uZSBtZWdhYnl0ZSAqLwotI2VuZGlmCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1fYXZhaWxhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8sIGxvbmcgbWluX2J5dGVzX25lZWRlZCwKLQkJICAgIGxvbmcgbWF4X2J5dGVzX25lZWRlZCwgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkKLXsKLSAgcmV0dXJuIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlIC0gYWxyZWFkeV9hbGxvY2F0ZWQ7Ci19Ci0KLQotLyoKLSAqIEJhY2tpbmcgc3RvcmUgKHRlbXBvcmFyeSBmaWxlKSBtYW5hZ2VtZW50LgotICogQmFja2luZyBzdG9yZSBvYmplY3RzIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKLSAqIGpwZWdfbWVtX2F2YWlsYWJsZSBpcyBsZXNzIHRoYW4gdGhlIHRvdGFsIHNwYWNlIG5lZWRlZC4gIFlvdSBjYW4gZGlzcGVuc2UKLSAqIHdpdGggdGhlc2Ugcm91dGluZXMgaWYgeW91IGhhdmUgcGxlbnR5IG9mIHZpcnR1YWwgbWVtb3J5OyBzZWUgam1lbW5vYnMuYy4KLSAqLwotCi0KLU1FVEhPRERFRih2b2lkKQotcmVhZF9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBpZiAoZnNlZWsoaW5mby0+dGVtcF9maWxlLCBmaWxlX29mZnNldCwgU0VFS19TRVQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7Ci0gIGlmIChKRlJFQUQoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKLSAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9SRUFEKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJICAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkgICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOwotICBpZiAoSkZXUklURShpbmZvLT50ZW1wX2ZpbGUsIGJ1ZmZlcl9hZGRyZXNzLCBieXRlX2NvdW50KQotICAgICAgIT0gKHNpemVfdCkgYnl0ZV9jb3VudCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1dSSVRFKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLWNsb3NlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKLXsKLSAgZmNsb3NlKGluZm8tPnRlbXBfZmlsZSk7Ci0gIC8qIFNpbmNlIHRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0bXBmaWxlKCkgdG8gY3JlYXRlIHRoZSBmaWxlLAotICAgKiBubyBleHBsaWNpdCBmaWxlIGRlbGV0aW9uIGlzIG5lZWRlZC4KLSAgICovCi19Ci0KLQotLyoKLSAqIEluaXRpYWwgb3BlbmluZyBvZiBhIGJhY2tpbmctc3RvcmUgb2JqZWN0LgotICoKLSAqIFRoaXMgdmVyc2lvbiB1c2VzIHRtcGZpbGUoKSwgd2hpY2ggY29uc3RydWN0cyBhIHN1aXRhYmxlIGZpbGUgbmFtZQotICogYmVoaW5kIHRoZSBzY2VuZXMuICBXZSBkb24ndCBoYXZlIHRvIHVzZSBpbmZvLT50ZW1wX25hbWVbXSBhdCBhbGw7Ci0gKiBpbmRlZWQsIHdlIGNhbid0IGV2ZW4gZmluZCBvdXQgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0ZW1wIGZpbGUuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQotewotICBpZiAoKGluZm8tPnRlbXBfZmlsZSA9IHRtcGZpbGUoKSkgPT0gTlVMTCkKLSAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsICIiKTsKLSAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF9iYWNraW5nX3N0b3JlOwotICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfYmFja2luZ19zdG9yZTsKLSAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2JhY2tpbmdfc3RvcmU7Ci19Ci0KLQotLyoKLSAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKLSAqIGNsZWFudXAgcmVxdWlyZWQuCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIHJldHVybiBERUZBVUxUX01BWF9NRU07CS8qIGRlZmF1bHQgZm9yIG1heF9tZW1vcnlfdG9fdXNlICovCi19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qbWVtZG9zLmMgYi9saWJqcGVndHdycC9qbWVtZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYjQ1YzYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvam1lbWRvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM4ICswLDAgQEAKLS8qCi0gKiBqbWVtZG9zLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBwcm92aWRlcyBhbiBNUy1ET1MtY29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3lzdGVtLQotICogZGVwZW5kZW50IHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBUZW1wb3JhcnkgZGF0YSBjYW4gYmUKLSAqIHN0b3JlZCBpbiBleHRlbmRlZCBvciBleHBhbmRlZCBtZW1vcnkgYXMgd2VsbCBhcyBpbiByZWd1bGFyIERPUyBmaWxlcy4KLSAqCi0gKiBJZiB5b3UgdXNlIHRoaXMgZmlsZSwgeW91IG11c3QgYmUgc3VyZSB0aGF0IE5FRURfRkFSX1BPSU5URVJTIGlzIGRlZmluZWQKLSAqIGlmIHlvdSBjb21waWxlIGluIGEgc21hbGwtZGF0YSBtZW1vcnkgbW9kZWw7IGl0IHNob3VsZCBOT1QgYmUgZGVmaW5lZCBpZgotICogeW91IHVzZSBhIGxhcmdlLWRhdGEgbWVtb3J5IG1vZGVsLiAgVGhpcyBmaWxlIGlzIG5vdCByZWNvbW1lbmRlZCBpZiB5b3UKLSAqIGFyZSB1c2luZyBhIGZsYXQtbWVtb3J5LXNwYWNlIDM4NiBlbnZpcm9ubWVudCBzdWNoIGFzIERKR0NDIG9yIFdhdGNvbSBDLgotICogQWxzbywgdGhpcyBjb2RlIHdpbGwgTk9UIHdvcmsgaWYgc3RydWN0IGZpZWxkcyBhcmUgYWxpZ25lZCBvbiBncmVhdGVyIHRoYW4KLSAqIDItYnl0ZSBib3VuZGFyaWVzLgotICoKLSAqIEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgR2UnIFdlaWplcnMuCi0gKi8KLQotLyoKLSAqIElmIHlvdSBoYXZlIGJvdGggZXh0ZW5kZWQgYW5kIGV4cGFuZGVkIG1lbW9yeSwgeW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGUKLSAqIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHRyaWVkIGluIGpvcGVuX2JhY2tpbmdfc3RvcmUuICBPbiBhIDI4NiBtYWNoaW5lCi0gKiBleHBhbmRlZCBtZW1vcnkgaXMgdXN1YWxseSBmYXN0ZXIsIHNpbmNlIGV4dGVuZGVkIG1lbW9yeSBhY2Nlc3MgaW52b2x2ZXMKLSAqIGFuIGV4cGVuc2l2ZSBwcm90ZWN0ZWQtbW9kZS1hbmQtYmFjayBzd2l0Y2guICBPbiAzODYgYW5kIGJldHRlciwgZXh0ZW5kZWQKLSAqIG1lbW9yeSBpcyB1c3VhbGx5IGZhc3Rlci4gIEFzIGRpc3RyaWJ1dGVkLCB0aGUgY29kZSB0cmllcyBleHRlbmRlZCBtZW1vcnkKLSAqIGZpcnN0ICh3aGF0PyBub3QgZXZlcnlvbmUgaGFzIGEgMzg2PyA6LSkuCi0gKgotICogWW91IGNhbiBkaXNhYmxlIHVzZSBvZiBleHRlbmRlZC9leHBhbmRlZCBtZW1vcnkgZW50aXJlbHkgYnkgYWx0ZXJpbmcgdGhlc2UKLSAqIGRlZmluaXRpb25zIG9yIG92ZXJyaWRpbmcgdGhlbSBmcm9tIHRoZSBNYWtlZmlsZSAoZWcsIC1ERU1TX1NVUFBPUlRFRD0wKS4KLSAqLwotCi0jaWZuZGVmIFhNU19TVVBQT1JURUQKLSNkZWZpbmUgWE1TX1NVUFBPUlRFRCAgMQotI2VuZGlmCi0jaWZuZGVmIEVNU19TVVBQT1JURUQKLSNkZWZpbmUgRU1TX1NVUFBPUlRFRCAgMQotI2VuZGlmCi0KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KLQotI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIHRoZXNlICovCi1leHRlcm4gdm9pZCAqIG1hbGxvYyBKUFAoKHNpemVfdCBzaXplKSk7Ci1leHRlcm4gdm9pZCBmcmVlIEpQUCgodm9pZCAqcHRyKSk7Ci1leHRlcm4gY2hhciAqIGdldGVudiBKUFAoKGNvbnN0IGNoYXIgKiBuYW1lKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfRkFSX1BPSU5URVJTCi0KLSNpZmRlZiBfX1RVUkJPQ19fCi0vKiBUaGVzZSBkZWZpbml0aW9ucyB3b3JrIGZvciBCb3JsYW5kIEMgKFR1cmJvIEMpICovCi0jaW5jbHVkZSA8YWxsb2MuaD4JCS8qIG5lZWQgZmFybWFsbG9jKCksIGZhcmZyZWUoKSAqLwotI2RlZmluZSBmYXJfbWFsbG9jKHgpCWZhcm1hbGxvYyh4KQotI2RlZmluZSBmYXJfZnJlZSh4KQlmYXJmcmVlKHgpCi0jZWxzZQotLyogVGhlc2UgZGVmaW5pdGlvbnMgd29yayBmb3IgTWljcm9zb2Z0IEMgYW5kIGNvbXBhdGlibGUgY29tcGlsZXJzICovCi0jaW5jbHVkZSA8bWFsbG9jLmg+CQkvKiBuZWVkIF9mbWFsbG9jKCksIF9mZnJlZSgpICovCi0jZGVmaW5lIGZhcl9tYWxsb2MoeCkJX2ZtYWxsb2MoeCkKLSNkZWZpbmUgZmFyX2ZyZWUoeCkJX2ZmcmVlKHgpCi0jZW5kaWYKLQotI2Vsc2UgLyogbm90IE5FRURfRkFSX1BPSU5URVJTICovCi0KLSNkZWZpbmUgZmFyX21hbGxvYyh4KQltYWxsb2MoeCkKLSNkZWZpbmUgZmFyX2ZyZWUoeCkJZnJlZSh4KQotCi0jZW5kaWYgLyogTkVFRF9GQVJfUE9JTlRFUlMgKi8KLQotI2lmZGVmIERPTlRfVVNFX0JfTU9ERQkJLyogZGVmaW5lIG1vZGUgcGFyYW1ldGVycyBmb3IgZm9wZW4oKSAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkiciIKLSNlbHNlCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyYiIKLSNlbmRpZgotCi0jaWZuZGVmIFVTRV9NU0RPU19NRU1NR1IJLyogbWFrZSBzdXJlIHVzZXIgZ290IGNvbmZpZ3VyYXRpb24gcmlnaHQgKi8KLSAgWW91IGZvcmdvdCB0byBkZWZpbmUgVVNFX01TRE9TX01FTU1HUiBpbiBqY29uZmlnLmguIC8qIGRlbGliZXJhdGUgc3ludGF4IGVycm9yICovCi0jZW5kaWYKLQotI2lmIE1BWF9BTExPQ19DSFVOSyA+PSA2NTUzNUwJLyogbWFrZSBzdXJlIGpjb25maWcuaCBnb3QgdGhpcyByaWdodCAqLwotICBNQVhfQUxMT0NfQ0hVTksgc2hvdWxkIGJlIGxlc3MgdGhhbiA2NEsuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVycm9yICovCi0jZW5kaWYKLQotCi0vKgotICogRGVjbGFyYXRpb25zIGZvciBhc3NlbWJseS1sYW5ndWFnZSBzdXBwb3J0IHJvdXRpbmVzIChzZWUgam1lbWRvc2EuYXNtKS4KLSAqCi0gKiBUaGUgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCAiZmFyIiBhcyBhcmUgYWxsIHRoZWlyIHBvaW50ZXIgYXJndW1lbnRzOwotICogdGhpcyBlbnN1cmVzIHRoZSBhc3NlbWJseSBzb3VyY2UgY29kZSB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGUKLSAqIGNvbXBpbGVyIG1lbW9yeSBtb2RlbC4gIFdlIGFzc3VtZSAic2hvcnQiIGlzIDE2IGJpdHMsICJsb25nIiBpcyAzMi4KLSAqLwotCi10eXBlZGVmIHZvaWQgZmFyICogWE1TRFJJVkVSOwkvKiBhY3R1YWxseSBhIHBvaW50ZXIgdG8gY29kZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewkJLyogcmVnaXN0ZXJzIGZvciBjYWxsaW5nIFhNUyBkcml2ZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCBheCwgZHgsIGJ4OwotCXZvaWQgZmFyICogZHNfc2k7Ci0gICAgICB9IFhNU2NvbnRleHQ7Ci10eXBlZGVmIHN0cnVjdCB7CQkvKiByZWdpc3RlcnMgZm9yIGNhbGxpbmcgRU1TIGRyaXZlciAqLwotCXVuc2lnbmVkIHNob3J0IGF4LCBkeCwgYng7Ci0Jdm9pZCBmYXIgKiBkc19zaTsKLSAgICAgIH0gRU1TY29udGV4dDsKLQotZXh0ZXJuIHNob3J0IGZhciBqZG9zX29wZW4gSlBQKChzaG9ydCBmYXIgKiBoYW5kbGUsIGNoYXIgZmFyICogZmlsZW5hbWUpKTsKLWV4dGVybiBzaG9ydCBmYXIgamRvc19jbG9zZSBKUFAoKHNob3J0IGhhbmRsZSkpOwotZXh0ZXJuIHNob3J0IGZhciBqZG9zX3NlZWsgSlBQKChzaG9ydCBoYW5kbGUsIGxvbmcgb2Zmc2V0KSk7Ci1leHRlcm4gc2hvcnQgZmFyIGpkb3NfcmVhZCBKUFAoKHNob3J0IGhhbmRsZSwgdm9pZCBmYXIgKiBidWZmZXIsCi0JCQkJdW5zaWduZWQgc2hvcnQgY291bnQpKTsKLWV4dGVybiBzaG9ydCBmYXIgamRvc193cml0ZSBKUFAoKHNob3J0IGhhbmRsZSwgdm9pZCBmYXIgKiBidWZmZXIsCi0JCQkJIHVuc2lnbmVkIHNob3J0IGNvdW50KSk7Ci1leHRlcm4gdm9pZCBmYXIganhtc19nZXRkcml2ZXIgSlBQKChYTVNEUklWRVIgZmFyICopKTsKLWV4dGVybiB2b2lkIGZhciBqeG1zX2NhbGxkcml2ZXIgSlBQKChYTVNEUklWRVIsIFhNU2NvbnRleHQgZmFyICopKTsKLWV4dGVybiBzaG9ydCBmYXIgamVtc19hdmFpbGFibGUgSlBQKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBmYXIgamVtc19jYWxsZHJpdmVyIEpQUCgoRU1TY29udGV4dCBmYXIgKikpOwotCi0KLS8qCi0gKiBTZWxlY3Rpb24gb2YgYSBmaWxlIG5hbWUgZm9yIGEgdGVtcG9yYXJ5IGZpbGUuCi0gKiBUaGlzIGlzIGhpZ2hseSBzeXN0ZW0tZGVwZW5kZW50LCBhbmQgeW91IG1heSB3YW50IHRvIGN1c3RvbWl6ZSBpdC4KLSAqLwotCi1zdGF0aWMgaW50IG5leHRfZmlsZV9udW07CS8qIHRvIGRpc3Rpbmd1aXNoIGFtb25nIHNldmVyYWwgdGVtcCBmaWxlcyAqLwotCi1MT0NBTCh2b2lkKQotc2VsZWN0X2ZpbGVfbmFtZSAoY2hhciAqIGZuYW1lKQotewotICBjb25zdCBjaGFyICogZW52OwotICBjaGFyICogcHRyOwotICBGSUxFICogdGZpbGU7Ci0KLSAgLyogS2VlcCBnZW5lcmF0aW5nIGZpbGUgbmFtZXMgdGlsbCB3ZSBmaW5kIG9uZSB0aGF0J3Mgbm90IGluIHVzZSAqLwotICBmb3IgKDs7KSB7Ci0gICAgLyogR2V0IHRlbXAgZGlyZWN0b3J5IG5hbWUgZnJvbSBlbnZpcm9ubWVudCBUTVAgb3IgVEVNUCB2YXJpYWJsZTsKLSAgICAgKiBpZiBub25lLCB1c2UgIi4iCi0gICAgICovCi0gICAgaWYgKChlbnYgPSAoY29uc3QgY2hhciAqKSBnZXRlbnYoIlRNUCIpKSA9PSBOVUxMKQotICAgICAgaWYgKChlbnYgPSAoY29uc3QgY2hhciAqKSBnZXRlbnYoIlRFTVAiKSkgPT0gTlVMTCkKLQllbnYgPSAiLiI7Ci0gICAgaWYgKCplbnYgPT0gJ1wwJykJCS8qIG51bGwgc3RyaW5nIG1lYW5zICIuIiAqLwotICAgICAgZW52ID0gIi4iOwotICAgIHB0ciA9IGZuYW1lOwkJLyogY29weSBuYW1lIHRvIGZuYW1lICovCi0gICAgd2hpbGUgKCplbnYgIT0gJ1wwJykKLSAgICAgICpwdHIrKyA9ICplbnYrKzsKLSAgICBpZiAocHRyWy0xXSAhPSAnXFwnICYmIHB0clstMV0gIT0gJy8nKQotICAgICAgKnB0cisrID0gJ1xcJzsJCS8qIGFwcGVuZCBiYWNrc2xhc2ggaWYgbm90IGluIGVudiB2YXJpYWJsZSAqLwotICAgIC8qIEFwcGVuZCBhIHN1aXRhYmxlIGZpbGUgbmFtZSAqLwotICAgIG5leHRfZmlsZV9udW0rKzsJCS8qIGFkdmFuY2UgY291bnRlciAqLwotICAgIHNwcmludGYocHRyLCAiSlBHJTAzZC5UTVAiLCBuZXh0X2ZpbGVfbnVtKTsKLSAgICAvKiBQcm9iZSB0byBzZWUgaWYgZmlsZSBuYW1lIGlzIGFscmVhZHkgaW4gdXNlICovCi0gICAgaWYgKCh0ZmlsZSA9IGZvcGVuKGZuYW1lLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpCi0gICAgICBicmVhazsKLSAgICBmY2xvc2UodGZpbGUpOwkJLyogb29wcywgaXQncyB0aGVyZTsgY2xvc2UgdGZpbGUgJiB0cnkgYWdhaW4gKi8KLSAgfQotfQotCi0KLS8qCi0gKiBOZWFyLW1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKLSAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCi0gKi8KLQotR0xPQkFMKHZvaWQgKikKLWpwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZnJlZShvYmplY3QpOwotfQotCi0KLS8qCi0gKiAiTGFyZ2UiIG9iamVjdHMgYXJlIGFsbG9jYXRlZCBpbiBmYXIgbWVtb3J5LCBpZiBwb3NzaWJsZQotICovCi0KLUdMT0JBTCh2b2lkIEZBUiAqKQotanBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgcmV0dXJuICh2b2lkIEZBUiAqKSBmYXJfbWFsbG9jKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICBmYXJfZnJlZShvYmplY3QpOwotfQotCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCi0gKiBJdCdzIGltcG9zc2libGUgdG8gZG8gdGhpcyBpbiBhIHBvcnRhYmxlIHdheTsgb3VyIGN1cnJlbnQgc29sdXRpb24gaXMKLSAqIHRvIG1ha2UgdGhlIHVzZXIgdGVsbCB1cyAod2l0aCBhIGRlZmF1bHQgdmFsdWUgc2V0IGF0IGNvbXBpbGUgdGltZSkuCi0gKiBJZiB5b3UgY2FuIGFjdHVhbGx5IGdldCB0aGUgYXZhaWxhYmxlIHNwYWNlLCBpdCdzIGEgZ29vZCBpZGVhIHRvIHN1YnRyYWN0Ci0gKiBhIHNsb3AgZmFjdG9yIG9mIDUlIG9yIHNvLgotICovCi0KLSNpZm5kZWYgREVGQVVMVF9NQVhfTUVNCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBtYWtlZmlsZSAqLwotI2RlZmluZSBERUZBVUxUX01BWF9NRU0JCTMwMDAwMEwgLyogZm9yIHRvdGFsIHVzYWdlIGFib3V0IDQ1MEsgKi8KLSNlbmRpZgotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCi0JCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCi17Ci0gIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOwotfQotCi0KLS8qCi0gKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KLSAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCi0gKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCi0gKi8KLQotLyoKLSAqIEZvciBNUy1ET1Mgd2Ugc3VwcG9ydCB0aHJlZSB0eXBlcyBvZiBiYWNraW5nIHN0b3JhZ2U6Ci0gKiAgIDEuIENvbnZlbnRpb25hbCBET1MgZmlsZXMuICBXZSBhY2Nlc3MgdGhlc2UgYnkgZGlyZWN0IERPUyBjYWxscyByYXRoZXIKLSAqICAgICAgdGhhbiB2aWEgdGhlIHN0ZGlvIHBhY2thZ2UuICBUaGlzIHByb3ZpZGVzIGEgYml0IGJldHRlciBwZXJmb3JtYW5jZSwKLSAqICAgICAgYnV0IHRoZSByZWFsIHJlYXNvbiBpcyB0aGF0IHRoZSBidWZmZXJzIHRvIGJlIHJlYWQgb3Igd3JpdHRlbiBhcmUgRkFSLgotICogICAgICBUaGUgc3RkaW8gbGlicmFyeSBmb3Igc21hbGwtZGF0YSBtZW1vcnkgbW9kZWxzIGNhbid0IGNvcGUgd2l0aCB0aGF0LgotICogICAyLiBFeHRlbmRlZCBtZW1vcnksIGFjY2Vzc2VkIHBlciB0aGUgWE1TIFYyLjAgc3BlY2lmaWNhdGlvbi4KLSAqICAgMy4gRXhwYW5kZWQgbWVtb3J5LCBhY2Nlc3NlZCBwZXIgdGhlIExJTS9FTVMgNC4wIHNwZWNpZmljYXRpb24uCi0gKiBZb3UnbGwgbmVlZCBjb3BpZXMgb2YgdGhvc2Ugc3BlY3MgdG8gbWFrZSBzZW5zZSBvZiB0aGUgcmVsYXRlZCBjb2RlLgotICogVGhlIHNwZWNzIGFyZSBhdmFpbGFibGUgYnkgSW50ZXJuZXQgRlRQIGZyb20gdGhlIFNJTVRFTCBhcmNoaXZlcyAKLSAqIChvYWsub2FrbGFuZC5lZHUgYW5kIGl0cyB2YXJpb3VzIG1pcnJvciBzaXRlcykuICBTZWUgZmlsZXMKLSAqIHB1Yi9tc2Rvcy9taWNyb3NvZnQveG1zMjAuYXJjIGFuZCBwdWIvbXNkb3MvaW5mby9saW1lbXM0MS56aXAuCi0gKi8KLQotCi0vKgotICogQWNjZXNzIG1ldGhvZHMgZm9yIGEgRE9TIGZpbGUuCi0gKi8KLQotCi1NRVRIT0RERUYodm9pZCkKLXJlYWRfZmlsZV9zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgaWYgKGpkb3Nfc2VlayhpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUsIGZpbGVfb2Zmc2V0KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOwotICAvKiBTaW5jZSBNQVhfQUxMT0NfQ0hVTksgaXMgbGVzcyB0aGFuIDY0SywgYnl0ZV9jb3VudCB3aWxsIGJlIHRvby4gKi8KLSAgaWYgKGJ5dGVfY291bnQgPiA2NTUzNUwpCS8qIHNhZmV0eSBjaGVjayAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0FMTE9DX0NIVU5LKTsKLSAgaWYgKGpkb3NfcmVhZChpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUsIGJ1ZmZlcl9hZGRyZXNzLAotCQkodW5zaWduZWQgc2hvcnQpIGJ5dGVfY291bnQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9maWxlX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIGlmIChqZG9zX3NlZWsoaW5mby0+aGFuZGxlLmZpbGVfaGFuZGxlLCBmaWxlX29mZnNldCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKLSAgLyogU2luY2UgTUFYX0FMTE9DX0NIVU5LIGlzIGxlc3MgdGhhbiA2NEssIGJ5dGVfY291bnQgd2lsbCBiZSB0b28uICovCi0gIGlmIChieXRlX2NvdW50ID4gNjU1MzVMKQkvKiBzYWZldHkgY2hlY2sgKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9BTExPQ19DSFVOSyk7Ci0gIGlmIChqZG9zX3dyaXRlKGluZm8tPmhhbmRsZS5maWxlX2hhbmRsZSwgYnVmZmVyX2FkZHJlc3MsCi0JCSAodW5zaWduZWQgc2hvcnQpIGJ5dGVfY291bnQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfV1JJVEUpOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotY2xvc2VfZmlsZV9zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQotewotICBqZG9zX2Nsb3NlKGluZm8tPmhhbmRsZS5maWxlX2hhbmRsZSk7CS8qIGNsb3NlIHRoZSBmaWxlICovCi0gIHJlbW92ZShpbmZvLT50ZW1wX25hbWUpOwkvKiBkZWxldGUgdGhlIGZpbGUgKi8KLS8qIElmIHlvdXIgc3lzdGVtIGRvZXNuJ3QgaGF2ZSByZW1vdmUoKSwgdHJ5IHVubGluaygpIGluc3RlYWQuCi0gKiByZW1vdmUoKSBpcyB0aGUgQU5TSS1zdGFuZGFyZCBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLCBidXQKLSAqIHVubGluaygpIHdhcyBtb3JlIGNvbW1vbiBpbiBwcmUtQU5TSSBzeXN0ZW1zLgotICovCi0gIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX0NMT1NFLCBpbmZvLT50ZW1wX25hbWUpOwotfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1vcGVuX2ZpbGVfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQotewotICBzaG9ydCBoYW5kbGU7Ci0KLSAgc2VsZWN0X2ZpbGVfbmFtZShpbmZvLT50ZW1wX25hbWUpOwotICBpZiAoamRvc19vcGVuKChzaG9ydCBmYXIgKikgJiBoYW5kbGUsIChjaGFyIGZhciAqKSBpbmZvLT50ZW1wX25hbWUpKSB7Ci0gICAgLyogbWlnaHQgYXMgd2VsbCBleGl0IHNpbmNlIGpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIHdpbGwgZmFpbCBhbnl3YXkgKi8KLSAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsIGluZm8tPnRlbXBfbmFtZSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0gIGluZm8tPmhhbmRsZS5maWxlX2hhbmRsZSA9IGhhbmRsZTsKLSAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF9maWxlX3N0b3JlOwotICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfZmlsZV9zdG9yZTsKLSAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2ZpbGVfc3RvcmU7Ci0gIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX09QRU4sIGluZm8tPnRlbXBfbmFtZSk7Ci0gIHJldHVybiBUUlVFOwkJCS8qIHN1Y2NlZWRlZCAqLwotfQotCi0KLS8qCi0gKiBBY2Nlc3MgbWV0aG9kcyBmb3IgZXh0ZW5kZWQgbWVtb3J5LgotICovCi0KLSNpZiBYTVNfU1VQUE9SVEVECi0KLXN0YXRpYyBYTVNEUklWRVIgeG1zX2RyaXZlcjsJLyogc2F2ZWQgYWRkcmVzcyBvZiBYTVMgZHJpdmVyICovCi0KLXR5cGVkZWYgdW5pb24gewkJCS8qIGVpdGhlciBsb25nIG9mZnNldCBvciByZWFsLW1vZGUgcG9pbnRlciAqLwotCWxvbmcgb2Zmc2V0OwotCXZvaWQgZmFyICogcHRyOwotICAgICAgfSBYTVNQVFI7Ci0KLXR5cGVkZWYgc3RydWN0IHsJCS8qIFhNUyBtb3ZlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICovCi0JbG9uZyBsZW5ndGg7Ci0JWE1TSCBzcmNfaGFuZGxlOwotCVhNU1BUUiBzcmM7Ci0JWE1TSCBkc3RfaGFuZGxlOwotCVhNU1BUUiBkc3Q7Ci0gICAgICB9IFhNU3NwZWM7Ci0KLSNkZWZpbmUgT0REKFgpCSgoKFgpICYgMUwpICE9IDApCi0KLQotTUVUSE9EREVGKHZvaWQpCi1yZWFkX3htc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQl2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQlsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIFhNU2NvbnRleHQgY3R4OwotICBYTVNzcGVjIHNwZWM7Ci0gIGNoYXIgZW5kYnVmZmVyWzJdOwotCi0gIC8qIFRoZSBYTVMgZHJpdmVyIGNhbid0IGNvcGUgd2l0aCBhbiBvZGQgbGVuZ3RoLCBzbyBoYW5kbGUgdGhlIGxhc3QgYnl0ZQotICAgKiBzcGVjaWFsbHkgaWYgYnl0ZV9jb3VudCBpcyBvZGQuICBXZSBkb24ndCBleHBlY3QgdGhpcyB0byBiZSBjb21tb24uCi0gICAqLwotCi0gIHNwZWMubGVuZ3RoID0gYnl0ZV9jb3VudCAmICh+IDFMKTsKLSAgc3BlYy5zcmNfaGFuZGxlID0gaW5mby0+aGFuZGxlLnhtc19oYW5kbGU7Ci0gIHNwZWMuc3JjLm9mZnNldCA9IGZpbGVfb2Zmc2V0OwotICBzcGVjLmRzdF9oYW5kbGUgPSAwOwotICBzcGVjLmRzdC5wdHIgPSBidWZmZXJfYWRkcmVzczsKLSAgCi0gIGN0eC5kc19zaSA9ICh2b2lkIGZhciAqKSAmIHNwZWM7Ci0gIGN0eC5heCA9IDB4MGIwMDsJCS8qIEVNQiBtb3ZlICovCi0gIGp4bXNfY2FsbGRyaXZlcih4bXNfZHJpdmVyLCAoWE1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoY3R4LmF4ICE9IDEpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9YTVNfUkVBRCk7Ci0KLSAgaWYgKE9ERChieXRlX2NvdW50KSkgewotICAgIHJlYWRfeG1zX3N0b3JlKGNpbmZvLCBpbmZvLCAodm9pZCBGQVIgKikgZW5kYnVmZmVyLAotCQkgICBmaWxlX29mZnNldCArIGJ5dGVfY291bnQgLSAxTCwgMkwpOwotICAgICgoY2hhciBGQVIgKikgYnVmZmVyX2FkZHJlc3MpW2J5dGVfY291bnQgLSAxTF0gPSBlbmRidWZmZXJbMF07Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX3htc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgWE1TY29udGV4dCBjdHg7Ci0gIFhNU3NwZWMgc3BlYzsKLSAgY2hhciBlbmRidWZmZXJbMl07Ci0KLSAgLyogVGhlIFhNUyBkcml2ZXIgY2FuJ3QgY29wZSB3aXRoIGFuIG9kZCBsZW5ndGgsIHNvIGhhbmRsZSB0aGUgbGFzdCBieXRlCi0gICAqIHNwZWNpYWxseSBpZiBieXRlX2NvdW50IGlzIG9kZC4gIFdlIGRvbid0IGV4cGVjdCB0aGlzIHRvIGJlIGNvbW1vbi4KLSAgICovCi0KLSAgc3BlYy5sZW5ndGggPSBieXRlX2NvdW50ICYgKH4gMUwpOwotICBzcGVjLnNyY19oYW5kbGUgPSAwOwotICBzcGVjLnNyYy5wdHIgPSBidWZmZXJfYWRkcmVzczsKLSAgc3BlYy5kc3RfaGFuZGxlID0gaW5mby0+aGFuZGxlLnhtc19oYW5kbGU7Ci0gIHNwZWMuZHN0Lm9mZnNldCA9IGZpbGVfb2Zmc2V0OwotCi0gIGN0eC5kc19zaSA9ICh2b2lkIGZhciAqKSAmIHNwZWM7Ci0gIGN0eC5heCA9IDB4MGIwMDsJCS8qIEVNQiBtb3ZlICovCi0gIGp4bXNfY2FsbGRyaXZlcih4bXNfZHJpdmVyLCAoWE1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoY3R4LmF4ICE9IDEpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9YTVNfV1JJVEUpOwotCi0gIGlmIChPREQoYnl0ZV9jb3VudCkpIHsKLSAgICByZWFkX3htc19zdG9yZShjaW5mbywgaW5mbywgKHZvaWQgRkFSICopIGVuZGJ1ZmZlciwKLQkJICAgZmlsZV9vZmZzZXQgKyBieXRlX2NvdW50IC0gMUwsIDJMKTsKLSAgICBlbmRidWZmZXJbMF0gPSAoKGNoYXIgRkFSICopIGJ1ZmZlcl9hZGRyZXNzKVtieXRlX2NvdW50IC0gMUxdOwotICAgIHdyaXRlX3htc19zdG9yZShjaW5mbywgaW5mbywgKHZvaWQgRkFSICopIGVuZGJ1ZmZlciwKLQkJICAgIGZpbGVfb2Zmc2V0ICsgYnl0ZV9jb3VudCAtIDFMLCAyTCk7Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLWNsb3NlX3htc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQotewotICBYTVNjb250ZXh0IGN0eDsKLQotICBjdHguZHggPSBpbmZvLT5oYW5kbGUueG1zX2hhbmRsZTsKLSAgY3R4LmF4ID0gMHgwYTAwOwotICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfWE1TX0NMT1NFLCBpbmZvLT5oYW5kbGUueG1zX2hhbmRsZSk7Ci0gIC8qIHdlIGlnbm9yZSBhbnkgZXJyb3IgcmV0dXJuIGZyb20gdGhlIGRyaXZlciAqLwotfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1vcGVuX3htc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQlsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKLXsKLSAgWE1TY29udGV4dCBjdHg7Ci0KLSAgLyogR2V0IGFkZHJlc3Mgb2YgWE1TIGRyaXZlciAqLwotICBqeG1zX2dldGRyaXZlcigoWE1TRFJJVkVSIGZhciAqKSAmIHhtc19kcml2ZXIpOwotICBpZiAoeG1zX2RyaXZlciA9PSBOVUxMKQotICAgIHJldHVybiBGQUxTRTsJCS8qIG5vIGRyaXZlciB0byBiZSBoYWQgKi8KLQotICAvKiBHZXQgdmVyc2lvbiBudW1iZXIsIG11c3QgYmUgPj0gMi4wMCAqLwotICBjdHguYXggPSAweDAwMDA7Ci0gIGp4bXNfY2FsbGRyaXZlcih4bXNfZHJpdmVyLCAoWE1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoY3R4LmF4IDwgKHVuc2lnbmVkIHNob3J0KSAweDAyMDApCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIFRyeSB0byBnZXQgc3BhY2UgKGV4cHJlc3NlZCBpbiBraWxvYnl0ZXMpICovCi0gIGN0eC5keCA9ICh1bnNpZ25lZCBzaG9ydCkgKCh0b3RhbF9ieXRlc19uZWVkZWQgKyAxMDIzTCkgPj4gMTApOwotICBjdHguYXggPSAweDA5MDA7Ci0gIGp4bXNfY2FsbGRyaXZlcih4bXNfZHJpdmVyLCAoWE1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoY3R4LmF4ICE9IDEpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIFN1Y2NlZWRlZCwgc2F2ZSB0aGUgaGFuZGxlIGFuZCBhd2F5IHdlIGdvICovCi0gIGluZm8tPmhhbmRsZS54bXNfaGFuZGxlID0gY3R4LmR4OwotICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX3htc19zdG9yZTsKLSAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX3htc19zdG9yZTsKLSAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX3htc19zdG9yZTsKLSAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfWE1TX09QRU4sIGN0eC5keCk7Ci0gIHJldHVybiBUUlVFOwkJCS8qIHN1Y2NlZWRlZCAqLwotfQotCi0jZW5kaWYgLyogWE1TX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBBY2Nlc3MgbWV0aG9kcyBmb3IgZXhwYW5kZWQgbWVtb3J5LgotICovCi0KLSNpZiBFTVNfU1VQUE9SVEVECi0KLS8qIFRoZSBFTVMgbW92ZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlcyB3b3JkIGFuZCBsb25nIGZpZWxkcyBhbGlnbmVkCi0gKiBhdCBvZGQgYnl0ZSBib3VuZGFyaWVzLiAgU29tZSBjb21waWxlcnMgd2lsbCBhbGlnbiBzdHJ1Y3QgZmllbGRzIGF0IGV2ZW4KLSAqIGJ5dGUgYm91bmRhcmllcy4gIFdoaWxlIGl0J3MgdXN1YWxseSBwb3NzaWJsZSB0byBmb3JjZSBieXRlIGFsaWdubWVudCwKLSAqIHRoYXQgY2F1c2VzIGFuIG92ZXJhbGwgcGVyZm9ybWFuY2UgcGVuYWx0eSBhbmQgbWF5IHBvc2UgcHJvYmxlbXMgaW4gbWVyZ2luZwotICogSlBFRyBpbnRvIGEgbGFyZ2VyIGFwcGxpY2F0aW9uLiAgSW5zdGVhZCB3ZSBhY2NlcHQgc29tZSByYXRoZXIgZGlydHkgY29kZQotICogaGVyZS4gIE5vdGUgdGhpcyBjb2RlIHdvdWxkIGZhaWwgaWYgdGhlIGhhcmR3YXJlIGRpZCBub3QgYWxsb3cgb2RkLWJ5dGUKLSAqIHdvcmQgJiBsb25nIGFjY2Vzc2VzLCBidXQgYWxsIDgweDg2IENQVXMgZG8uCi0gKi8KLQotdHlwZWRlZiB2b2lkIGZhciAqIEVNU1BUUjsKLQotdHlwZWRlZiB1bmlvbiB7CQkJLyogRU1TIG1vdmUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKi8KLQlsb25nIGxlbmd0aDsJCS8qIEl0J3MgZWFzeSB0byBhY2Nlc3MgZmlyc3QgNCBieXRlcyAqLwotCWNoYXIgYnl0ZXNbMThdOwkJLyogTWlzYWxpZ25lZCBmaWVsZHMgaW4gaGVyZSEgKi8KLSAgICAgIH0gRU1Tc3BlYzsKLQotLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgbWlzYWxpZ25lZCBmaWVsZHMgKi8KLSNkZWZpbmUgRklFTERfQVQoc3BlYyxvZmZzZXQsdHlwZSkgICgqKCh0eXBlICopICYoc3BlYy5ieXRlc1tvZmZzZXRdKSkpCi0jZGVmaW5lIFNSQ19UWVBFKHNwZWMpCQlGSUVMRF9BVChzcGVjLDQsY2hhcikKLSNkZWZpbmUgU1JDX0hBTkRMRShzcGVjKQlGSUVMRF9BVChzcGVjLDUsRU1TSCkKLSNkZWZpbmUgU1JDX09GRlNFVChzcGVjKQlGSUVMRF9BVChzcGVjLDcsdW5zaWduZWQgc2hvcnQpCi0jZGVmaW5lIFNSQ19QQUdFKHNwZWMpCQlGSUVMRF9BVChzcGVjLDksdW5zaWduZWQgc2hvcnQpCi0jZGVmaW5lIFNSQ19QVFIoc3BlYykJCUZJRUxEX0FUKHNwZWMsNyxFTVNQVFIpCi0jZGVmaW5lIERTVF9UWVBFKHNwZWMpCQlGSUVMRF9BVChzcGVjLDExLGNoYXIpCi0jZGVmaW5lIERTVF9IQU5ETEUoc3BlYykJRklFTERfQVQoc3BlYywxMixFTVNIKQotI2RlZmluZSBEU1RfT0ZGU0VUKHNwZWMpCUZJRUxEX0FUKHNwZWMsMTQsdW5zaWduZWQgc2hvcnQpCi0jZGVmaW5lIERTVF9QQUdFKHNwZWMpCQlGSUVMRF9BVChzcGVjLDE2LHVuc2lnbmVkIHNob3J0KQotI2RlZmluZSBEU1RfUFRSKHNwZWMpCQlGSUVMRF9BVChzcGVjLDE0LEVNU1BUUikKLQotI2RlZmluZSBFTVNQQUdFU0laRQkxNjM4NEwJLyogZ29zcGVsLCBzZWUgdGhlIEVNUyBzcGVjcyAqLwotCi0jZGVmaW5lIEhJQllURShXKSAgKCgoVykgPj4gOCkgJiAweEZGKQotI2RlZmluZSBMT0JZVEUoVykgICgoVykgJiAweEZGKQotCi0KLU1FVEhPRERFRih2b2lkKQotcmVhZF9lbXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBFTVNjb250ZXh0IGN0eDsKLSAgRU1Tc3BlYyBzcGVjOwotCi0gIHNwZWMubGVuZ3RoID0gYnl0ZV9jb3VudDsKLSAgU1JDX1RZUEUoc3BlYykgPSAxOwotICBTUkNfSEFORExFKHNwZWMpID0gaW5mby0+aGFuZGxlLmVtc19oYW5kbGU7Ci0gIFNSQ19QQUdFKHNwZWMpICAgPSAodW5zaWduZWQgc2hvcnQpIChmaWxlX29mZnNldCAvIEVNU1BBR0VTSVpFKTsKLSAgU1JDX09GRlNFVChzcGVjKSA9ICh1bnNpZ25lZCBzaG9ydCkgKGZpbGVfb2Zmc2V0ICUgRU1TUEFHRVNJWkUpOwotICBEU1RfVFlQRShzcGVjKSA9IDA7Ci0gIERTVF9IQU5ETEUoc3BlYykgPSAwOwotICBEU1RfUFRSKHNwZWMpICAgID0gYnVmZmVyX2FkZHJlc3M7Ci0gIAotICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOwotICBjdHguYXggPSAweDU3MDA7CQkvKiBtb3ZlIG1lbW9yeSByZWdpb24gKi8KLSAgamVtc19jYWxsZHJpdmVyKChFTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7Ci0gIGlmIChISUJZVEUoY3R4LmF4KSAhPSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRU1TX1JFQUQpOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotd3JpdGVfZW1zX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBFTVNjb250ZXh0IGN0eDsKLSAgRU1Tc3BlYyBzcGVjOwotCi0gIHNwZWMubGVuZ3RoID0gYnl0ZV9jb3VudDsKLSAgU1JDX1RZUEUoc3BlYykgPSAwOwotICBTUkNfSEFORExFKHNwZWMpID0gMDsKLSAgU1JDX1BUUihzcGVjKSAgICA9IGJ1ZmZlcl9hZGRyZXNzOwotICBEU1RfVFlQRShzcGVjKSA9IDE7Ci0gIERTVF9IQU5ETEUoc3BlYykgPSBpbmZvLT5oYW5kbGUuZW1zX2hhbmRsZTsKLSAgRFNUX1BBR0Uoc3BlYykgICA9ICh1bnNpZ25lZCBzaG9ydCkgKGZpbGVfb2Zmc2V0IC8gRU1TUEFHRVNJWkUpOwotICBEU1RfT0ZGU0VUKHNwZWMpID0gKHVuc2lnbmVkIHNob3J0KSAoZmlsZV9vZmZzZXQgJSBFTVNQQUdFU0laRSk7Ci0gIAotICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOwotICBjdHguYXggPSAweDU3MDA7CQkvKiBtb3ZlIG1lbW9yeSByZWdpb24gKi8KLSAgamVtc19jYWxsZHJpdmVyKChFTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7Ci0gIGlmIChISUJZVEUoY3R4LmF4KSAhPSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRU1TX1dSSVRFKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLWNsb3NlX2Vtc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQotewotICBFTVNjb250ZXh0IGN0eDsKLQotICBjdHguYXggPSAweDQ1MDA7Ci0gIGN0eC5keCA9IGluZm8tPmhhbmRsZS5lbXNfaGFuZGxlOwotICBqZW1zX2NhbGxkcml2ZXIoKEVNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfRU1TX0NMT1NFLCBpbmZvLT5oYW5kbGUuZW1zX2hhbmRsZSk7Ci0gIC8qIHdlIGlnbm9yZSBhbnkgZXJyb3IgcmV0dXJuIGZyb20gdGhlIGRyaXZlciAqLwotfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1vcGVuX2Vtc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQlsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKLXsKLSAgRU1TY29udGV4dCBjdHg7Ci0KLSAgLyogSXMgRU1TIGRyaXZlciB0aGVyZT8gKi8KLSAgaWYgKCEgamVtc19hdmFpbGFibGUoKSkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgLyogR2V0IHN0YXR1cywgbWFrZSBzdXJlIEVNUyBpcyBPSyAqLwotICBjdHguYXggPSAweDQwMDA7Ci0gIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgLyogR2V0IHZlcnNpb24sIG11c3QgYmUgPj0gNC4wICovCi0gIGN0eC5heCA9IDB4NDYwMDsKLSAgamVtc19jYWxsZHJpdmVyKChFTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7Ci0gIGlmIChISUJZVEUoY3R4LmF4KSAhPSAwIHx8IExPQllURShjdHguYXgpIDwgMHg0MCkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgLyogVHJ5IHRvIGFsbG9jYXRlIHJlcXVlc3RlZCBzcGFjZSAqLwotICBjdHguYXggPSAweDQzMDA7Ci0gIGN0eC5ieCA9ICh1bnNpZ25lZCBzaG9ydCkgKCh0b3RhbF9ieXRlc19uZWVkZWQgKyBFTVNQQUdFU0laRS0xTCkgLyBFTVNQQUdFU0laRSk7Ci0gIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgLyogU3VjY2VlZGVkLCBzYXZlIHRoZSBoYW5kbGUgYW5kIGF3YXkgd2UgZ28gKi8KLSAgaW5mby0+aGFuZGxlLmVtc19oYW5kbGUgPSBjdHguZHg7Ci0gIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfZW1zX3N0b3JlOwotICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfZW1zX3N0b3JlOwotICBpbmZvLT5jbG9zZV9iYWNraW5nX3N0b3JlID0gY2xvc2VfZW1zX3N0b3JlOwotICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19FTVNfT1BFTiwgY3R4LmR4KTsKLSAgcmV0dXJuIFRSVUU7CQkJLyogc3VjY2VlZGVkICovCi19Ci0KLSNlbmRpZiAvKiBFTVNfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWwgb3BlbmluZyBvZiBhIGJhY2tpbmctc3RvcmUgb2JqZWN0LgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKLXsKLSAgLyogVHJ5IGV4dGVuZGVkIG1lbW9yeSwgdGhlbiBleHBhbmRlZCBtZW1vcnksIHRoZW4gcmVndWxhciBmaWxlLiAqLwotI2lmIFhNU19TVVBQT1JURUQKLSAgaWYgKG9wZW5feG1zX3N0b3JlKGNpbmZvLCBpbmZvLCB0b3RhbF9ieXRlc19uZWVkZWQpKQotICAgIHJldHVybjsKLSNlbmRpZgotI2lmIEVNU19TVVBQT1JURUQKLSAgaWYgKG9wZW5fZW1zX3N0b3JlKGNpbmZvLCBpbmZvLCB0b3RhbF9ieXRlc19uZWVkZWQpKQotICAgIHJldHVybjsKLSNlbmRpZgotICBpZiAob3Blbl9maWxlX3N0b3JlKGNpbmZvLCBpbmZvLCB0b3RhbF9ieXRlc19uZWVkZWQpKQotICAgIHJldHVybjsKLSAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiIik7Ci19Ci0KLQotLyoKLSAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKLSAqIGNsZWFudXAgcmVxdWlyZWQuCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIG5leHRfZmlsZV9udW0gPSAwOwkJLyogaW5pdGlhbGl6ZSB0ZW1wIGZpbGUgbmFtZSBnZW5lcmF0b3IgKi8KLSAgcmV0dXJuIERFRkFVTFRfTUFYX01FTTsJLyogZGVmYXVsdCBmb3IgbWF4X21lbW9yeV90b191c2UgKi8KLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIC8qIE1pY3Jvc29mdCBDLCBhdCBsZWFzdCBpbiB2Ni4wMEEsIHdpbGwgbm90IHN1Y2Nlc3NmdWxseSByZWNsYWltIGZyZWVkCi0gICAqIGJsb2NrcyBvZiBzaXplID4gMzJLYnl0ZXMgdW5sZXNzIHdlIGdpdmUgaXQgYSBraWNrIGluIHRoZSByZWFyLCBsaWtlIHNvOgotICAgKi8KLSNpZmRlZiBORUVEX0ZIRUFQTUlOCi0gIF9maGVhcG1pbigpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qbWVtZG9zYS5hc20gYi9saWJqcGVndHdycC9qbWVtZG9zYS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDQzNzIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvam1lbWRvc2EuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLTsKLTsgam1lbWRvc2EuYXNtCi07Ci07IENvcHlyaWdodCAoQykgMTk5MiwgVGhvbWFzIEcuIExhbmUuCi07IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLTsKLTsgVGhpcyBmaWxlIGNvbnRhaW5zIGxvdy1sZXZlbCBpbnRlcmZhY2Ugcm91dGluZXMgdG8gc3VwcG9ydCB0aGUgTVMtRE9TCi07IGJhY2tpbmcgc3RvcmUgbWFuYWdlciAoam1lbWRvcy5jKS4gIFJvdXRpbmVzIGFyZSBwcm92aWRlZCB0byBhY2Nlc3MgZGlzawotOyBmaWxlcyB0aHJvdWdoIGRpcmVjdCBET1MgY2FsbHMsIGFuZCB0byBhY2Nlc3MgWE1TIGFuZCBFTVMgZHJpdmVycy4KLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBhc3NlbWJsZSB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKLTsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuICBJZiB5b3UgaGF2ZW4ndCBnb3QKLTsgYSBjb21wYXRpYmxlIGFzc2VtYmxlciwgYmV0dGVyIGZhbGwgYmFjayB0byBqbWVtYW5zaS5jIG9yIGptZW1uYW1lLmMuCi07Ci07IFRvIG1pbmltaXplIGRlcGVuZGVuY2Ugb24gdGhlIEMgY29tcGlsZXIncyByZWdpc3RlciB1c2FnZSBjb252ZW50aW9ucywKLTsgd2Ugc2F2ZSBhbmQgcmVzdG9yZSBhbGwgODA4NiByZWdpc3RlcnMsIGV2ZW4gdGhvdWdoIG1vc3QgY29tcGlsZXJzIG9ubHkKLTsgcmVxdWlyZSBTSSxESSxEUyB0byBiZSBwcmVzZXJ2ZWQuICBBbHNvLCB3ZSB1c2Ugb25seSAxNi1iaXQtd2lkZSByZXR1cm4KLTsgdmFsdWVzLCB3aGljaCBldmVyeWJvZHkgcmV0dXJucyBpbiBBWC4KLTsKLTsgQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBHZScgV2VpamVycy4KLTsKLQotSk1FTURPU0FfVFhUCXNlZ21lbnQgYnl0ZSBwdWJsaWMgJ0NPREUnCi0KLQkJYXNzdW1lCWNzOkpNRU1ET1NBX1RYVAotCi0JCXB1YmxpYwlfamRvc19vcGVuCi0JCXB1YmxpYwlfamRvc19jbG9zZQotCQlwdWJsaWMJX2pkb3Nfc2VlawotCQlwdWJsaWMJX2pkb3NfcmVhZAotCQlwdWJsaWMJX2pkb3Nfd3JpdGUKLQkJcHVibGljCV9qeG1zX2dldGRyaXZlcgotCQlwdWJsaWMJX2p4bXNfY2FsbGRyaXZlcgotCQlwdWJsaWMJX2plbXNfYXZhaWxhYmxlCi0JCXB1YmxpYwlfamVtc19jYWxsZHJpdmVyCi0KLTsKLTsgc2hvcnQgZmFyIGpkb3Nfb3BlbiAoc2hvcnQgZmFyICogaGFuZGxlLCBjaGFyIGZhciAqIGZpbGVuYW1lKQotOwotOyBDcmVhdGUgYW5kIG9wZW4gYSB0ZW1wb3JhcnkgZmlsZQotOwotX2pkb3Nfb3Blbglwcm9jCWZhcgotCQlwdXNoCWJwCQkJOyBsaW5rYWdlCi0JCW1vdiAJYnAsc3AKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbW92CWN4LDAJCQk7IG5vcm1hbCBmaWxlIGF0dHJpYnV0ZXMKLQkJbGRzCWR4LGR3b3JkIHB0ciBbYnArMTBdCTsgZ2V0IGZpbGVuYW1lIHBvaW50ZXIKLQkJbW92CWFoLDNjaAkJCTsgY3JlYXRlIGZpbGUKLQkJaW50CTIxaAotCQlqYwlvcGVuX2VycgkJOyBpZiBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlCi0JCWxkcwlieCxkd29yZCBwdHIgW2JwKzZdCTsgZ2V0IGhhbmRsZSBwb2ludGVyCi0JCW1vdgl3b3JkIHB0ciBbYnhdLGF4CTsgc2F2ZSB0aGUgaGFuZGxlCi0JCXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCi1vcGVuX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAotCQlwb3AJZXMKLQkJcG9wCWR4Ci0JCXBvcAljeAotCQlwb3AJYngKLQkJcG9wCWRpCi0JCXBvcAlzaQotCQlwb3AgCWJwCi0JCXJldAotX2pkb3Nfb3BlbgllbmRwCi0KLQotOwotOyBzaG9ydCBmYXIgamRvc19jbG9zZSAoc2hvcnQgaGFuZGxlKQotOwotOyBDbG9zZSB0aGUgZmlsZSBoYW5kbGUKLTsKLV9qZG9zX2Nsb3NlCXByb2MJZmFyCi0JCXB1c2gJYnAJCQk7IGxpbmthZ2UKLQkJbW92IAlicCxzcAotCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQotCQlwdXNoCWRpCi0JCXB1c2gJYngKLQkJcHVzaAljeAotCQlwdXNoCWR4Ci0JCXB1c2gJZXMKLQkJcHVzaAlkcwotCQltb3YJYngsd29yZCBwdHIgW2JwKzZdCTsgZmlsZSBoYW5kbGUKLQkJbW92CWFoLDNlaAkJCTsgY2xvc2UgZmlsZQotCQlpbnQJMjFoCi0JCWpjCWNsb3NlX2VycgkJOyBpZiBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlCi0JCXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCi1jbG9zZV9lcnI6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcG9wIAlicAotCQlyZXQKLV9qZG9zX2Nsb3NlCWVuZHAKLQotCi07Ci07IHNob3J0IGZhciBqZG9zX3NlZWsgKHNob3J0IGhhbmRsZSwgbG9uZyBvZmZzZXQpCi07Ci07IFNldCBmaWxlIHBvc2l0aW9uCi07Ci1famRvc19zZWVrCXByb2MJZmFyCi0JCXB1c2gJYnAJCQk7IGxpbmthZ2UKLQkJbW92IAlicCxzcAotCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQotCQlwdXNoCWRpCi0JCXB1c2gJYngKLQkJcHVzaAljeAotCQlwdXNoCWR4Ci0JCXB1c2gJZXMKLQkJcHVzaAlkcwotCQltb3YJYngsd29yZCBwdHIgW2JwKzZdCTsgZmlsZSBoYW5kbGUKLQkJbW92CWR4LHdvcmQgcHRyIFticCs4XQk7IExTIG9mZnNldAotCQltb3YJY3gsd29yZCBwdHIgW2JwKzEwXQk7IE1TIG9mZnNldAotCQltb3YJYXgsNDIwMGgJCTsgYWJzb2x1dGUgc2VlawotCQlpbnQJMjFoCi0JCWpjCXNlZWtfZXJyCQk7IGlmIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUKLQkJeG9yCWF4LGF4CQkJOyByZXR1cm4gemVybyBmb3IgT0sKLXNlZWtfZXJyOglwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0Ci0JCXBvcAllcwotCQlwb3AJZHgKLQkJcG9wCWN4Ci0JCXBvcAlieAotCQlwb3AJZGkKLQkJcG9wCXNpCi0JCXBvcCAJYnAKLQkJcmV0Ci1famRvc19zZWVrCWVuZHAKLQotCi07Ci07IHNob3J0IGZhciBqZG9zX3JlYWQgKHNob3J0IGhhbmRsZSwgdm9pZCBmYXIgKiBidWZmZXIsIHVuc2lnbmVkIHNob3J0IGNvdW50KQotOwotOyBSZWFkIGZyb20gZmlsZQotOwotX2pkb3NfcmVhZAlwcm9jCWZhcgotCQlwdXNoCWJwCQkJOyBsaW5rYWdlCi0JCW1vdiAJYnAsc3AKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbW92CWJ4LHdvcmQgcHRyIFticCs2XQk7IGZpbGUgaGFuZGxlCi0JCWxkcwlkeCxkd29yZCBwdHIgW2JwKzhdCTsgYnVmZmVyIGFkZHJlc3MKLQkJbW92CWN4LHdvcmQgcHRyIFticCsxMl0JOyBudW1iZXIgb2YgYnl0ZXMKLQkJbW92CWFoLDNmaAkJCTsgcmVhZCBmaWxlCi0JCWludAkyMWgKLQkJamMJcmVhZF9lcnIJCTsgaWYgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZQotCQljbXAJYXgsd29yZCBwdHIgW2JwKzEyXQk7IG1ha2Ugc3VyZSBhbGwgYnl0ZXMgd2VyZSByZWFkCi0JCWplCXJlYWRfb2sKLQkJbW92CWF4LDEJCQk7IGVsc2UgcmV0dXJuIDEgZm9yIG5vdCBPSwotCQlqbXAJc2hvcnQgcmVhZF9lcnIKLXJlYWRfb2s6CXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCi1yZWFkX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAotCQlwb3AJZXMKLQkJcG9wCWR4Ci0JCXBvcAljeAotCQlwb3AJYngKLQkJcG9wCWRpCi0JCXBvcAlzaQotCQlwb3AgCWJwCi0JCXJldAotX2pkb3NfcmVhZAllbmRwCi0KLQotOwotOyBzaG9ydCBmYXIgamRvc193cml0ZSAoc2hvcnQgaGFuZGxlLCB2b2lkIGZhciAqIGJ1ZmZlciwgdW5zaWduZWQgc2hvcnQgY291bnQpCi07Ci07IFdyaXRlIHRvIGZpbGUKLTsKLV9qZG9zX3dyaXRlCXByb2MJZmFyCi0JCXB1c2gJYnAJCQk7IGxpbmthZ2UKLQkJbW92IAlicCxzcAotCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQotCQlwdXNoCWRpCi0JCXB1c2gJYngKLQkJcHVzaAljeAotCQlwdXNoCWR4Ci0JCXB1c2gJZXMKLQkJcHVzaAlkcwotCQltb3YJYngsd29yZCBwdHIgW2JwKzZdCTsgZmlsZSBoYW5kbGUKLQkJbGRzCWR4LGR3b3JkIHB0ciBbYnArOF0JOyBidWZmZXIgYWRkcmVzcwotCQltb3YJY3gsd29yZCBwdHIgW2JwKzEyXQk7IG51bWJlciBvZiBieXRlcwotCQltb3YJYWgsNDBoCQkJOyB3cml0ZSBmaWxlCi0JCWludAkyMWgKLQkJamMJd3JpdGVfZXJyCQk7IGlmIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUKLQkJY21wCWF4LHdvcmQgcHRyIFticCsxMl0JOyBtYWtlIHN1cmUgYWxsIGJ5dGVzIHdyaXR0ZW4KLQkJamUJd3JpdGVfb2sKLQkJbW92CWF4LDEJCQk7IGVsc2UgcmV0dXJuIDEgZm9yIG5vdCBPSwotCQlqbXAJc2hvcnQgd3JpdGVfZXJyCi13cml0ZV9vazoJeG9yCWF4LGF4CQkJOyByZXR1cm4gemVybyBmb3IgT0sKLXdyaXRlX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAotCQlwb3AJZXMKLQkJcG9wCWR4Ci0JCXBvcAljeAotCQlwb3AJYngKLQkJcG9wCWRpCi0JCXBvcAlzaQotCQlwb3AgCWJwCi0JCXJldAotX2pkb3Nfd3JpdGUJZW5kcAotCi0KLTsKLTsgdm9pZCBmYXIganhtc19nZXRkcml2ZXIgKFhNU0RSSVZFUiBmYXIgKikKLTsKLTsgR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBYTVMgZHJpdmVyLCBvciBOVUxMIGlmIG5vdCBhdmFpbGFibGUKLTsKLV9qeG1zX2dldGRyaXZlcglwcm9jCWZhcgotCQlwdXNoCWJwCQkJOyBsaW5rYWdlCi0JCW1vdiAJYnAsc3AKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbW92IAlheCw0MzAwaAkJOyBjYWxsIG11bHRpcGxleCBpbnRlcnJ1cHQgd2l0aAotCQlpbnQJMmZoCQkJOyBhIG1hZ2ljIGNvb2tpZSwgaGV4IDQzMDAKLQkJY21wIAlhbCw4MGgJCQk7IEFMIHNob3VsZCBjb250YWluIGhleCA4MAotCQlqZQl4bXNhdmFpbAotCQl4b3IgCWR4LGR4CQkJOyBubyBYTVMgZHJpdmVyIGF2YWlsYWJsZQotCQl4b3IgCWF4LGF4CQkJOyByZXR1cm4gYSBuaWwgcG9pbnRlcgotCQlqbXAJc2hvcnQgeG1zYXZhaWxfZG9uZQoteG1zYXZhaWw6CW1vdiAJYXgsNDMxMGgJCTsgZmV0Y2ggZHJpdmVyIGFkZHJlc3Mgd2l0aAotCQlpbnQJMmZoCQkJOyBhbm90aGVyIG1hZ2ljIGNvb2tpZQotCQltb3YgCWR4LGVzCQkJOyBjb3B5IGFkZHJlc3MgdG8gZHg6YXgKLQkJbW92IAlheCxieAoteG1zYXZhaWxfZG9uZToJbGVzIAlieCxkd29yZCBwdHIgW2JwKzZdCTsgZ2V0IHBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlCi0JCW1vdgl3b3JkIHB0ciBlczpbYnhdLGF4Ci0JCW1vdgl3b3JkIHB0ciBlczpbYngrMl0sZHgKLQkJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAotCQlwb3AJZXMKLQkJcG9wCWR4Ci0JCXBvcAljeAotCQlwb3AJYngKLQkJcG9wCWRpCi0JCXBvcAlzaQotCQlwb3AJYnAKLQkJcmV0Ci1fanhtc19nZXRkcml2ZXIJZW5kcAotCi0KLTsKLTsgdm9pZCBmYXIganhtc19jYWxsZHJpdmVyIChYTVNEUklWRVIsIFhNU2NvbnRleHQgZmFyICopCi07Ci07IFRoZSBYTVNjb250ZXh0IHN0cnVjdHVyZSBjb250YWlucyB2YWx1ZXMgZm9yIHRoZSBBWCxEWCxCWCxTSSxEUyByZWdpc3RlcnMuCi07IFRoZXNlIGFyZSBsb2FkZWQsIHRoZSBYTVMgY2FsbCBpcyBwZXJmb3JtZWQsIGFuZCB0aGUgbmV3IHZhbHVlcyBvZiB0aGUKLTsgQVgsRFgsQlggcmVnaXN0ZXJzIGFyZSB3cml0dGVuIGJhY2sgdG8gdGhlIGNvbnRleHQgc3RydWN0dXJlLgotOwotX2p4bXNfY2FsbGRyaXZlciAJcHJvYwlmYXIKLQkJcHVzaAlicAkJCTsgbGlua2FnZQotCQltb3YgCWJwLHNwCi0JCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5Ci0JCXB1c2gJZGkKLQkJcHVzaAlieAotCQlwdXNoCWN4Ci0JCXB1c2gJZHgKLQkJcHVzaAllcwotCQlwdXNoCWRzCi0JCWxlcyAJYngsZHdvcmQgcHRyIFticCsxMF0JOyBnZXQgWE1TY29udGV4dCBwb2ludGVyCi0JCW1vdiAJYXgsd29yZCBwdHIgZXM6W2J4XQk7IGxvYWQgcmVnaXN0ZXJzCi0JCW1vdiAJZHgsd29yZCBwdHIgZXM6W2J4KzJdCi0JCW1vdiAJc2ksd29yZCBwdHIgZXM6W2J4KzZdCi0JCW1vdiAJZHMsd29yZCBwdHIgZXM6W2J4KzhdCi0JCW1vdiAJYngsd29yZCBwdHIgZXM6W2J4KzRdCi0JCWNhbGwJZHdvcmQgcHRyIFticCs2XQk7IGNhbGwgdGhlIGRyaXZlcgotCQltb3YJY3gsYngJCQk7IHNhdmUgcmV0dXJuZWQgQlggZm9yIGEgc2VjCi0JCWxlcyAJYngsZHdvcmQgcHRyIFticCsxMF0JOyBnZXQgWE1TY29udGV4dCBwb2ludGVyCi0JCW1vdiAJd29yZCBwdHIgZXM6W2J4XSxheAk7IHB1dCBiYWNrIGF4LGR4LGJ4Ci0JCW1vdiAJd29yZCBwdHIgZXM6W2J4KzJdLGR4Ci0JCW1vdiAJd29yZCBwdHIgZXM6W2J4KzRdLGN4Ci0JCXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcG9wIAlicAotCQlyZXQKLV9qeG1zX2NhbGxkcml2ZXIgCWVuZHAKLQotCi07Ci07IHNob3J0IGZhciBqZW1zX2F2YWlsYWJsZSAodm9pZCkKLTsKLTsgSGF2ZSB3ZSBnb3QgYW4gRU1TIGRyaXZlcj8gKHRoaXMgY29tZXMgc3RyYWlnaHQgZnJvbSB0aGUgRU1TIDQuMCBzcGVjcykKLTsKLV9qZW1zX2F2YWlsYWJsZQlwcm9jCWZhcgotCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQotCQlwdXNoCWRpCi0JCXB1c2gJYngKLQkJcHVzaAljeAotCQlwdXNoCWR4Ci0JCXB1c2gJZXMKLQkJcHVzaAlkcwotCQltb3YJYXgsMzU2N2gJCTsgZ2V0IGludGVycnVwdCB2ZWN0b3IgNjdoCi0JCWludAkyMWgKLQkJcHVzaAljcwotCQlwb3AJZHMKLQkJbW92CWRpLDAwMGFoCQk7IGNoZWNrIG9mZnMgMTAgaW4gcmV0dXJuZWQgc2VnCi0JCWxlYQlzaSxBU0NJSV9kZXZpY2VfbmFtZQk7IGFnYWluc3QgbGl0ZXJhbCBzdHJpbmcKLQkJbW92CWN4LDgKLQkJY2xkCi0JCXJlcGUgY21wc2IKLQkJam5lCW5vX2VtcwotCQltb3YJYXgsMQkJCTsgbWF0Y2gsIGl0J3MgdGhlcmUKLQkJam1wCXNob3J0IGF2YWlsX2RvbmUKLW5vX2VtczoJCXhvcglheCxheAkJCTsgaXQncyBub3QgdGhlcmUKLWF2YWlsX2RvbmU6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcmV0Ci0KLUFTQ0lJX2RldmljZV9uYW1lCWRiCSJFTU1YWFhYMCIKLQotX2plbXNfYXZhaWxhYmxlCWVuZHAKLQotCi07Ci07IHZvaWQgZmFyIGplbXNfY2FsbGRyaXZlciAoRU1TY29udGV4dCBmYXIgKikKLTsKLTsgVGhlIEVNU2NvbnRleHQgc3RydWN0dXJlIGNvbnRhaW5zIHZhbHVlcyBmb3IgdGhlIEFYLERYLEJYLFNJLERTIHJlZ2lzdGVycy4KLTsgVGhlc2UgYXJlIGxvYWRlZCwgdGhlIEVNUyB0cmFwIGlzIHBlcmZvcm1lZCwgYW5kIHRoZSBuZXcgdmFsdWVzIG9mIHRoZQotOyBBWCxEWCxCWCByZWdpc3RlcnMgYXJlIHdyaXR0ZW4gYmFjayB0byB0aGUgY29udGV4dCBzdHJ1Y3R1cmUuCi07Ci1famVtc19jYWxsZHJpdmVyCXByb2MgZmFyCi0JCXB1c2gJYnAJCQk7IGxpbmthZ2UKLQkJbW92IAlicCxzcAotCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQotCQlwdXNoCWRpCi0JCXB1c2gJYngKLQkJcHVzaAljeAotCQlwdXNoCWR4Ci0JCXB1c2gJZXMKLQkJcHVzaAlkcwotCQlsZXMgCWJ4LGR3b3JkIHB0ciBbYnArNl0JOyBnZXQgRU1TY29udGV4dCBwb2ludGVyCi0JCW1vdiAJYXgsd29yZCBwdHIgZXM6W2J4XQk7IGxvYWQgcmVnaXN0ZXJzCi0JCW1vdiAJZHgsd29yZCBwdHIgZXM6W2J4KzJdCi0JCW1vdiAJc2ksd29yZCBwdHIgZXM6W2J4KzZdCi0JCW1vdiAJZHMsd29yZCBwdHIgZXM6W2J4KzhdCi0JCW1vdiAJYngsd29yZCBwdHIgZXM6W2J4KzRdCi0JCWludAk2N2gJCQk7IGNhbGwgdGhlIEVNUyBkcml2ZXIKLQkJbW92CWN4LGJ4CQkJOyBzYXZlIHJldHVybmVkIEJYIGZvciBhIHNlYwotCQlsZXMgCWJ4LGR3b3JkIHB0ciBbYnArNl0JOyBnZXQgRU1TY29udGV4dCBwb2ludGVyCi0JCW1vdiAJd29yZCBwdHIgZXM6W2J4XSxheAk7IHB1dCBiYWNrIGF4LGR4LGJ4Ci0JCW1vdiAJd29yZCBwdHIgZXM6W2J4KzJdLGR4Ci0JCW1vdiAJd29yZCBwdHIgZXM6W2J4KzRdLGN4Ci0JCXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcG9wIAlicAotCQlyZXQKLV9qZW1zX2NhbGxkcml2ZXIJZW5kcAotCi1KTUVNRE9TQV9UWFQJZW5kcwotCi0JCWVuZApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvam1lbW1hYy5jIGIvbGlianBlZ3R3cnAvam1lbW1hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDZmOWJlLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ptZW1tYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKgotICogam1lbW1hYy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBqbWVtbWFjLmMgcHJvdmlkZXMgYW4gQXBwbGUgTWFjaW50b3NoIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzeXN0ZW0tCi0gKiBkZXBlbmRlbnQgcG9ydGlvbiBvZiB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlci4KLSAqCi0gKiBJZiB5b3UgdXNlIGptZW1tYWMuYywgdGhlbiB5b3UgbXVzdCBkZWZpbmUgVVNFX01BQ19NRU1NR1IgaW4gdGhlCi0gKiBKUEVHX0lOVEVSTkFMUyBwYXJ0IG9mIGpjb25maWcuaC4KLSAqCi0gKiBqbWVtbWFjLmMgdXNlcyB0aGUgTWFjaW50b3NoIHRvb2xib3ggcm91dGluZXMgTmV3UHRyIGFuZCBEaXNwb3NlUHRyCi0gKiBpbnN0ZWFkIG9mIG1hbGxvYyBhbmQgZnJlZS4gIEl0IGFjY3VyYXRlbHkgZGV0ZXJtaW5lcyB0aGUgYW1vdW50IG9mCi0gKiBtZW1vcnkgYXZhaWxhYmxlIGJ5IHVzaW5nIENvbXBhY3RNZW0uICBOb3RpY2UgdGhhdCBpZiBsZWZ0IHRvIGl0cwotICogb3duIGRldmljZXMsIHRoaXMgY29kZSBjYW4gY2hldyB1cCBhbGwgYXZhaWxhYmxlIHNwYWNlIGluIHRoZQotICogYXBwbGljYXRpb24ncyB6b25lLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHJhdGhlciBzbWFsbCAic2xvcCIKLSAqIGZhY3RvciBjb21wdXRlZCBpbiBqcGVnX21lbV9hdmFpbGFibGUoKS4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gZW5zdXJlCi0gKiB0aGF0IG1vcmUgc3BhY2UgaXMgbGVmdCBvdmVyIGJ5IHJlZHVjaW5nIG1heF9tZW1vcnlfdG9fdXNlLgotICoKLSAqIExhcmdlIGltYWdlcyBhcmUgc3dhcHBlZCB0byBkaXNrIHVzaW5nIHRlbXBvcmFyeSBmaWxlcyBhbmQgU3lzdGVtIDcuMCsncwotICogdGVtcG9yYXJ5IGZvbGRlciBmdW5jdGlvbmFsaXR5LgotICoKLSAqIE5vdGUgdGhhdCBqbWVtbWFjLmMgZGVwZW5kcyBvbiB0d28gZmVhdHVyZXMgb2YgTWFjT1MgdGhhdCB3ZXJlIGZpcnN0Ci0gKiBpbnRyb2R1Y2VkIGluIFN5c3RlbSA3OiBGaW5kRm9sZGVyIGFuZCB0aGUgRlNTcGVjLWJhc2VkIGNhbGxzLgotICogSWYgeW91ciBhcHBsaWNhdGlvbiB1c2VzIGptZW1tYWMuYyBhbmQgaXMgcnVuIHVuZGVyIFN5c3RlbSA2IG9yIGVhcmxpZXIsCi0gKiBhbmQgdGhlIGpwZWcgbGlicmFyeSBkZWNpZGVzIGl0IG5lZWRzIGEgdGVtcG9yYXJ5IGZpbGUsIGl0IHdpbGwgYWJvcnQsCi0gKiBwcmludGluZyBlcnJvciBtZXNzYWdlcyBhYm91dCByZXF1aXJpbmcgU3lzdGVtIDcuICAoSWYgbm8gdGVtcG9yYXJ5IGZpbGVzCi0gKiBhcmUgY3JlYXRlZCwgaXQgd2lsbCBydW4gZmluZS4pCi0gKgotICogSWYgeW91IHdhbnQgdG8gdXNlIGptZW1tYWMuYyBpbiBhbiBhcHBsaWNhdGlvbiB0aGF0IG1pZ2h0IGJlIHVzZWQgd2l0aAotICogU3lzdGVtIDYgb3IgZWFybGllciwgdGhlbiB5b3Ugc2hvdWxkIHJlbW92ZSBkZXBlbmRlbmNpZXMgb24gRmluZEZvbGRlcgotICogYW5kIHRoZSBGU1NwZWMgY2FsbHMuICBZb3Ugd2lsbCBuZWVkIHRvIHJlcGxhY2UgRmluZEZvbGRlciB3aXRoIHNvbWUKLSAqIG90aGVyIG1lY2hhbmlzbSBmb3IgZmluZGluZyBhIHBsYWNlIHRvIHB1dCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCB5b3UKLSAqIHNob3VsZCByZXBsYWNlIHRoZSBGU1NwZWMgY2FsbHMgd2l0aCB0aGVpciBIRlMgZXF1aXZhbGVudHM6Ci0gKgotICogICAgIEZTcERlbGV0ZSAgICAgLT4gIEhEZWxldGUKLSAqICAgICBGU3BHZXRGSW5mbyAgIC0+ICBIR2V0RkluZm8KLSAqICAgICBGU3BDcmVhdGUgICAgIC0+ICBIQ3JlYXRlCi0gKiAgICAgRlNwT3BlbkRGICAgICAtPiAgSE9wZW4gICAgICAqKiogTm90ZTogbm90IEhPcGVuREYgKioqCi0gKiAgICAgRlNNYWtlRlNTcGVjICAtPiAgKGZpbGwgaW4gc3BlYyBieSBoYW5kLikKLSAqCi0gKiAoVXNlIEhPcGVuIGluc3RlYWQgb2YgSE9wZW5ERi4gIEhPcGVuIGlzIGp1c3QgYSBnbHVlLWludGVyZmFjZSB0byBQQkhPcGVuLAotICogd2hpY2ggaXMgb24gYWxsIEhGUyBtYWNzLiAgSE9wZW5ERiBpcyBhIFN5c3RlbSA3IGFkZGl0aW9uIHdoaWNoIGF2b2lkcyB0aGUKLSAqIGFnZXMtb2xkIHByb2JsZW0gb2YgbmFtZXMgc3RhcnRpbmcgd2l0aCBhIHBlcmlvZC4pCi0gKgotICogQ29udHJpYnV0ZWQgYnkgU2FtIEJ1c2hlbGwgKGpzYW1AaWFndS5vbi5uZXQpIGFuZAotICogRGFuIEdpbGRvciAoZ3lsZEBpbi10b3VjaC5jb20pLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqbWVtc3lzLmgiICAgIC8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KLQotI2lmbmRlZiBVU0VfTUFDX01FTU1HUgkvKiBtYWtlIHN1cmUgdXNlciBnb3QgY29uZmlndXJhdGlvbiByaWdodCAqLwotICBZb3UgZm9yZ290IHRvIGRlZmluZSBVU0VfTUFDX01FTU1HUiBpbiBqY29uZmlnLmguIC8qIGRlbGliZXJhdGUgc3ludGF4IGVycm9yICovCi0jZW5kaWYKLQotI2luY2x1ZGUgPE1lbW9yeS5oPiAgICAgLyogd2UgdXNlIHRoZSBNYWNPUyBtZW1vcnkgbWFuYWdlciAqLwotI2luY2x1ZGUgPEZpbGVzLmg+ICAgICAgLyogd2UgdXNlIHRoZSBNYWNPUyBGaWxlIHN0dWZmICovCi0jaW5jbHVkZSA8Rm9sZGVycy5oPiAgICAvKiB3ZSB1c2UgdGhlIE1hY09TIEhGUyBzdHVmZiAqLwotI2luY2x1ZGUgPFNjcmlwdC5oPiAgICAgLyogZm9yIHNtU3lzdGVtU2NyaXB0ICovCi0jaW5jbHVkZSA8R2VzdGFsdC5oPiAgICAvKiB3ZSB1c2UgR2VzdGFsdCB0byB0ZXN0IGZvciBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5ICovCi0KLSNpZm5kZWYgVEVNUF9GSUxFX05BTUUJCS8qIGNhbiBvdmVycmlkZSBmcm9tIGpjb25maWcuaCBvciBNYWtlZmlsZSAqLwotI2RlZmluZSBURU1QX0ZJTEVfTkFNRSAgIkpQRyUwM2QuVE1QIgotI2VuZGlmCi0KLXN0YXRpYyBpbnQgbmV4dF9maWxlX251bTsJLyogdG8gZGlzdGluZ3Vpc2ggYW1vbmcgc2V2ZXJhbCB0ZW1wIGZpbGVzICovCi0KLQotLyoKLSAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBNYWNPUyBsaWJyYXJ5Ci0gKiByb3V0aW5lcyBOZXdQdHIoKSBhbmQgRGlzcG9zZVB0cigpLCB3aGljaCBhbGxvY2F0ZSBmaXhlZC1hZGRyZXNzCi0gKiBzdG9yYWdlLiAgVW5mb3J0dW5hdGVseSwgdGhlIElKRyBsaWJyYXJ5IGlzbid0IHNtYXJ0IGVub3VnaCB0byBjb3BlCi0gKiB3aXRoIHJlbG9jYXRhYmxlIHN0b3JhZ2UuCi0gKi8KLQotR0xPQkFMKHZvaWQgKikKLWpwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCAqKSBOZXdQdHIoc2l6ZW9mb2JqZWN0KTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgRGlzcG9zZVB0cigoUHRyKSBvYmplY3QpOwotfQotCi0KLS8qCi0gKiAiTGFyZ2UiIG9iamVjdHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgInNtYWxsIiBvbmVzLgotICogTkI6IHdlIGluY2x1ZGUgRkFSIGtleXdvcmRzIGluIHRoZSByb3V0aW5lIGRlY2xhcmF0aW9ucyBzaW1wbHkgZm9yCi0gKiBjb25zaXN0ZW5jeSB3aXRoIHRoZSByZXN0IG9mIHRoZSBJSkcgY29kZTsgRkFSIHNob3VsZCBleHBhbmQgdG8gZW1wdHkKLSAqIG9uIHJhdGlvbmFsIGFyY2hpdGVjdHVyZXMgbGlrZSB0aGUgTWFjLgotICovCi0KLUdMT0JBTCh2b2lkIEZBUiAqKQotanBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgcmV0dXJuICh2b2lkIEZBUiAqKSBOZXdQdHIoc2l6ZW9mb2JqZWN0KTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIERpc3Bvc2VQdHIoKFB0cikgb2JqZWN0KTsKLX0KLQotCi0vKgotICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgotICovCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1fYXZhaWxhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8sIGxvbmcgbWluX2J5dGVzX25lZWRlZCwKLQkJICAgIGxvbmcgbWF4X2J5dGVzX25lZWRlZCwgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkKLXsKLSAgbG9uZyBsaW1pdCA9IGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlIC0gYWxyZWFkeV9hbGxvY2F0ZWQ7Ci0gIGxvbmcgc2xvcCwgbWVtOwotCi0gIC8qIERvbid0IGFzayBmb3IgbW9yZSB0aGFuIHdoYXQgYXBwbGljYXRpb24gaGFzIHRvbGQgdXMgd2UgbWF5IHVzZSAqLwotICBpZiAobWF4X2J5dGVzX25lZWRlZCA+IGxpbWl0ICYmIGxpbWl0ID4gMCkKLSAgICBtYXhfYnl0ZXNfbmVlZGVkID0gbGltaXQ7Ci0gIC8qIEZpbmQgd2hldGhlciB0aGVyZSdzIGEgYmlnIGVub3VnaCBmcmVlIGJsb2NrIGluIHRoZSBoZWFwLgotICAgKiBDb21wYWN0TWVtIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbnRpZ3VvdXMgYmxvY2sgb2YgdGhlIHJlcXVlc3RlZCBzaXplLAotICAgKiBhbmQgdGhlbiByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGZyZWUgYmxvY2sgKHdoaWNoIGNvdWxkIGJlCi0gICAqIG11Y2ggbW9yZSBvciBtdWNoIGxlc3MgdGhhbiB3ZSBhc2tlZCBmb3IpLgotICAgKiBXZSBhZGQgc29tZSBzbG9wIHRvIGVuc3VyZSB3ZSBkb24ndCB1c2UgdXAgYWxsIGF2YWlsYWJsZSBtZW1vcnkuCi0gICAqLwotICBzbG9wID0gbWF4X2J5dGVzX25lZWRlZCAvIDE2ICsgMzI3NjhMOwotICBtZW0gPSBDb21wYWN0TWVtKG1heF9ieXRlc19uZWVkZWQgKyBzbG9wKSAtIHNsb3A7Ci0gIGlmIChtZW0gPCAwKQotICAgIG1lbSA9IDA7CQkJLyogc2lnaCwgY291bGRuJ3QgZXZlbiBnZXQgdGhlIHNsb3AgKi8KLSAgLyogRG9uJ3QgdGFrZSBtb3JlIHRoYW4gdGhlIGFwcGxpY2F0aW9uIHNheXMgd2UgY2FuIGhhdmUgKi8KLSAgaWYgKG1lbSA+IGxpbWl0ICYmIGxpbWl0ID4gMCkKLSAgICBtZW0gPSBsaW1pdDsKLSAgcmV0dXJuIG1lbTsKLX0KLQotCi0vKgotICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCi0gKiBCYWNraW5nIHN0b3JlIG9iamVjdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQotICoganBlZ19tZW1fYXZhaWxhYmxlIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgc3BhY2UgbmVlZGVkLiAgWW91IGNhbiBkaXNwZW5zZQotICogd2l0aCB0aGVzZSByb3V0aW5lcyBpZiB5b3UgaGF2ZSBwbGVudHkgb2YgdmlydHVhbCBtZW1vcnk7IHNlZSBqbWVtbm9icy5jLgotICovCi0KLQotTUVUSE9EREVGKHZvaWQpCi1yZWFkX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCSAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIGxvbmcgYnl0ZXMgPSBieXRlX2NvdW50OwotICBsb25nIHJldFZhbDsKLQotICBpZiAoIFNldEZQb3MgKCBpbmZvLT50ZW1wX2ZpbGUsIGZzRnJvbVN0YXJ0LCBmaWxlX29mZnNldCApICE9IG5vRXJyICkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOwotCi0gIHJldFZhbCA9IEZTUmVhZCAoIGluZm8tPnRlbXBfZmlsZSwgJmJ5dGVzLAotCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyX2FkZHJlc3MgKTsKLSAgaWYgKCByZXRWYWwgIT0gbm9FcnIgfHwgYnl0ZXMgIT0gYnl0ZV9jb3VudCApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9SRUFEKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJICAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkgICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgbG9uZyBieXRlcyA9IGJ5dGVfY291bnQ7Ci0gIGxvbmcgcmV0VmFsOwotCi0gIGlmICggU2V0RlBvcyAoIGluZm8tPnRlbXBfZmlsZSwgZnNGcm9tU3RhcnQsIGZpbGVfb2Zmc2V0ICkgIT0gbm9FcnIgKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7Ci0KLSAgcmV0VmFsID0gRlNXcml0ZSAoIGluZm8tPnRlbXBfZmlsZSwgJmJ5dGVzLAotCQkgICAgICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcl9hZGRyZXNzICk7Ci0gIGlmICggcmV0VmFsICE9IG5vRXJyIHx8IGJ5dGVzICE9IGJ5dGVfY291bnQgKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfV1JJVEUpOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotY2xvc2VfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQotewotICBGU0Nsb3NlICggaW5mby0+dGVtcF9maWxlICk7Ci0gIEZTcERlbGV0ZSAoICYoaW5mby0+dGVtcFNwZWMpICk7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWwgb3BlbmluZyBvZiBhIGJhY2tpbmctc3RvcmUgb2JqZWN0LgotICoKLSAqIFRoaXMgdmVyc2lvbiB1c2VzIEZpbmRGb2xkZXIgdG8gZmluZCB0aGUgVGVtcG9yYXJ5IEl0ZW1zIGZvbGRlciwKLSAqIGFuZCBwdXRzIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGVyZS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCi17Ci0gIHNob3J0ICAgICAgICAgdG1wUmVmLCB2UmVmTnVtOwotICBsb25nICAgICAgICAgIGRpcklEOwotICBGSW5mbyAgICAgICAgIGZpbmRlckluZm87Ci0gIEZTU3BlYyAgICAgICAgdGhlU3BlYzsKLSAgU3RyMjU1ICAgICAgICBmTmFtZTsKLSAgT1NFcnIgICAgICAgICBvc0VycjsKLSAgbG9uZyAgICAgICAgICBnZXN0YWx0UmVzcG9uc2UgPSAwOwotCi0gIC8qIENoZWNrIHRoYXQgRlNTcGVjIGNhbGxzIGFyZSBhdmFpbGFibGUuICovCi0gIG9zRXJyID0gR2VzdGFsdCggZ2VzdGFsdEZTQXR0ciwgJmdlc3RhbHRSZXNwb25zZSApOwotICBpZiAoICggb3NFcnIgIT0gbm9FcnIgKQotICAgICAgIHx8ICEoIGdlc3RhbHRSZXNwb25zZSAmICgxPDxnZXN0YWx0SGFzRlNTcGVjQ2FsbHMpICkgKQotICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIi0gU3lzdGVtIDcuMCBvciBsYXRlciByZXF1aXJlZCIpOwotICAvKiBUTyBETzogYWRkIGEgcHJvcGVyIGVycm9yIG1lc3NhZ2UgdG8gamVycm9yLmguICovCi0KLSAgLyogQ2hlY2sgdGhhdCBGaW5kRm9sZGVyIGlzIGF2YWlsYWJsZS4gKi8KLSAgb3NFcnIgPSBHZXN0YWx0KCBnZXN0YWx0RmluZEZvbGRlckF0dHIsICZnZXN0YWx0UmVzcG9uc2UgKTsKLSAgaWYgKCAoIG9zRXJyICE9IG5vRXJyICkKLSAgICAgICB8fCAhKCBnZXN0YWx0UmVzcG9uc2UgJiAoMTw8Z2VzdGFsdEZpbmRGb2xkZXJQcmVzZW50KSApICkKLSAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsICItIFN5c3RlbSA3LjAgb3IgbGF0ZXIgcmVxdWlyZWQuIik7Ci0gIC8qIFRPIERPOiBhZGQgYSBwcm9wZXIgZXJyb3IgbWVzc2FnZSB0byBqZXJyb3IuaC4gKi8KLQotICBvc0VyciA9IEZpbmRGb2xkZXIgKCBrT25TeXN0ZW1EaXNrLCBrVGVtcG9yYXJ5Rm9sZGVyVHlwZSwga0NyZWF0ZUZvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sICZkaXJJRCApOwotICBpZiAoIG9zRXJyICE9IG5vRXJyICkKLSAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsICItIHRlbXBvcmFyeSBpdGVtcyBmb2xkZXIgdW5hdmFpbGFibGUiKTsKLSAgLyogVE8gRE86IFRyeSBwdXR0aW5nIHRoZSB0ZW1wIGZpbGVzIHNvbWV3aGVyZSBlbHNlLiAqLwotCi0gIC8qIEtlZXAgZ2VuZXJhdGluZyBmaWxlIG5hbWVzIHRpbGwgd2UgZmluZCBvbmUgdGhhdCdzIG5vdCBpbiB1c2UgKi8KLSAgZm9yICg7OykgewotICAgIG5leHRfZmlsZV9udW0rKzsJCS8qIGFkdmFuY2UgY291bnRlciAqLwotCi0gICAgc3ByaW50ZihpbmZvLT50ZW1wX25hbWUsIFRFTVBfRklMRV9OQU1FLCBuZXh0X2ZpbGVfbnVtKTsKLSAgICBzdHJjcHkgKCAoUHRyKWZOYW1lKzEsIGluZm8tPnRlbXBfbmFtZSApOwotICAgICpmTmFtZSA9IHN0cmxlbiAoaW5mby0+dGVtcF9uYW1lKTsKLSAgICBvc0VyciA9IEZTTWFrZUZTU3BlYyAoIHZSZWZOdW0sIGRpcklELCBmTmFtZSwgJnRoZVNwZWMgKTsKLQotICAgIGlmICggKG9zRXJyID0gRlNwR2V0RkluZm8gKCAmdGhlU3BlYywgJmZpbmRlckluZm8gKSApICE9IG5vRXJyICkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgb3NFcnIgPSBGU3BDcmVhdGUgKCAmdGhlU3BlYywgJz8/Pz8nLCAnPz8/PycsIHNtU3lzdGVtU2NyaXB0ICk7Ci0gIGlmICggb3NFcnIgIT0gbm9FcnIgKQotICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgaW5mby0+dGVtcF9uYW1lKTsKLQotICBvc0VyciA9IEZTcE9wZW5ERiAoICZ0aGVTcGVjLCBmc1JkV3JQZXJtLCAmKGluZm8tPnRlbXBfZmlsZSkgKTsKLSAgaWYgKCBvc0VyciAhPSBub0VyciApCi0gICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCBpbmZvLT50ZW1wX25hbWUpOwotCi0gIGluZm8tPnRlbXBTcGVjID0gdGhlU3BlYzsKLQotICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2JhY2tpbmdfc3RvcmU7Ci0gIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV9iYWNraW5nX3N0b3JlOwotICBpbmZvLT5jbG9zZV9iYWNraW5nX3N0b3JlID0gY2xvc2VfYmFja2luZ19zdG9yZTsKLSAgVFJBQ0VNU1MoY2luZm8sIDEsIEpUUkNfVEZJTEVfT1BFTiwgaW5mby0+dGVtcF9uYW1lKTsKLX0KLQotCi0vKgotICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAotICogY2xlYW51cCByZXF1aXJlZC4KLSAqLwotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2luaXQgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgbmV4dF9maWxlX251bSA9IDA7Ci0KLSAgLyogbWF4X21lbW9yeV90b191c2Ugd2lsbCBiZSBpbml0aWFsaXplZCB0byBGcmVlTWVtKCkncyByZXN1bHQ7Ci0gICAqIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIG1pZ2h0IGxhdGVyIHJlZHVjZSBpdCwgZm9yIGV4YW1wbGUKLSAgICogdG8gbGVhdmUgcm9vbSB0byBpbnZva2UgbXVsdGlwbGUgSlBFRyBvYmplY3RzLgotICAgKiBOb3RlIHRoYXQgRnJlZU1lbSByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZnJlZSBieXRlczsKLSAgICogaXQgbWF5IG5vdCBiZSBwb3NzaWJsZSB0byBhbGxvY2F0ZSBhIHNpbmdsZSBibG9jayBvZiB0aGlzIHNpemUuCi0gICAqLwotICByZXR1cm4gRnJlZU1lbSgpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfbWVtX3Rlcm0gKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgLyogbm8gd29yayAqLwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvam1lbW1nci5jIGIvbGlianBlZ3R3cnAvam1lbW1nci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODAxYjMyLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ptZW1tZ3IuYworKysgL2Rldi9udWxsCkBAIC0xLDExMTggKzAsMCBAQAotLyoKLSAqIGptZW1tZ3IuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUEVHIHN5c3RlbS1pbmRlcGVuZGVudCBtZW1vcnkgbWFuYWdlbWVudAotICogcm91dGluZXMuICBUaGlzIGNvZGUgaXMgdXNhYmxlIGFjcm9zcyBhIHdpZGUgdmFyaWV0eSBvZiBtYWNoaW5lczsgbW9zdAotICogb2YgdGhlIHN5c3RlbSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGlzb2xhdGVkIGluIGEgc2VwYXJhdGUgZmlsZS4KLSAqIFRoZSBtYWpvciBmdW5jdGlvbnMgcHJvdmlkZWQgaGVyZSBhcmU6Ci0gKiAgICogcG9vbC1iYXNlZCBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIG9mIG1lbW9yeTsKLSAqICAgKiBwb2xpY3kgZGVjaXNpb25zIGFib3V0IGhvdyB0byBkaXZpZGUgYXZhaWxhYmxlIG1lbW9yeSBhbW9uZyB0aGUKLSAqICAgICB2aXJ0dWFsIGFycmF5czsKLSAqICAgKiBjb250cm9sIGxvZ2ljIGZvciBzd2FwcGluZyB2aXJ0dWFsIGFycmF5cyBiZXR3ZWVuIG1haW4gbWVtb3J5IGFuZAotICogICAgIGJhY2tpbmcgc3RvcmFnZS4KLSAqIFRoZSBzZXBhcmF0ZSBzeXN0ZW0tZGVwZW5kZW50IGZpbGUgcHJvdmlkZXMgdGhlIGFjdHVhbCBiYWNraW5nLXN0b3JhZ2UKLSAqIGFjY2VzcyBjb2RlLCBhbmQgaXQgY29udGFpbnMgdGhlIHBvbGljeSBkZWNpc2lvbiBhYm91dCBob3cgbXVjaCB0b3RhbAotICogbWFpbiBtZW1vcnkgdG8gdXNlLgotICogVGhpcyBmaWxlIGlzIHN5c3RlbS1kZXBlbmRlbnQgaW4gdGhlIHNlbnNlIHRoYXQgc29tZSBvZiBpdHMgZnVuY3Rpb25zCi0gKiBhcmUgdW5uZWNlc3NhcnkgaW4gc29tZSBzeXN0ZW1zLiAgRm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzIGVub3VnaCB2aXJ0dWFsCi0gKiBtZW1vcnkgc28gdGhhdCBiYWNraW5nIHN0b3JhZ2Ugd2lsbCBuZXZlciBiZSB1c2VkLCBtdWNoIG9mIHRoZSB2aXJ0dWFsCi0gKiBhcnJheSBjb250cm9sIGxvZ2ljIGNvdWxkIGJlIHJlbW92ZWQuICAoT2YgY291cnNlLCBpZiB5b3UgaGF2ZSB0aGF0IG11Y2gKLSAqIG1lbW9yeSB0aGVuIHlvdSBzaG91bGRuJ3QgY2FyZSBhYm91dCBhIGxpdHRsZSBiaXQgb2YgdW51c2VkIGNvZGUuLi4pCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2RlZmluZSBBTV9NRU1PUllfTUFOQUdFUgkvKiB3ZSBkZWZpbmUganZpcnRfWGFycmF5X2NvbnRyb2wgc3RydWN0cyAqLwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KLQotI2lmbmRlZiBOT19HRVRFTlYKLSNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBnZXRlbnYoKSAqLwotZXh0ZXJuIGNoYXIgKiBnZXRlbnYgSlBQKChjb25zdCBjaGFyICogbmFtZSkpOwotI2VuZGlmCi0jZW5kaWYKLQotCi0vKgotICogU29tZSBpbXBvcnRhbnQgbm90ZXM6Ci0gKiAgIFRoZSBhbGxvY2F0aW9uIHJvdXRpbmVzIHByb3ZpZGVkIGhlcmUgbXVzdCBuZXZlciByZXR1cm4gTlVMTC4KLSAqICAgVGhleSBzaG91bGQgZXhpdCB0byBlcnJvcl9leGl0IGlmIHVuc3VjY2Vzc2Z1bC4KLSAqCi0gKiAgIEl0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIHRyeSB0byBtZXJnZSB0aGUgc2FycmF5IGFuZCBiYXJyYXkgcm91dGluZXMsCi0gKiAgIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHRleHR1YWxseSBhbG1vc3QgdGhlIHNhbWUsIGJlY2F1c2Ugc2FtcGxlcyBhcmUKLSAqICAgdXN1YWxseSBzdG9yZWQgYXMgYnl0ZXMgd2hpbGUgY29lZmZpY2llbnRzIGFyZSBzaG9ydHMgb3IgaW50cy4gIFRodXMsCi0gKiAgIGluIG1hY2hpbmVzIHdoZXJlIGJ5dGUgcG9pbnRlcnMgaGF2ZSBhIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbiBmcm9tCi0gKiAgIHdvcmQgcG9pbnRlcnMsIHRoZSByZXN1bHRpbmcgbWFjaGluZSBjb2RlIGNvdWxkIG5vdCBiZSB0aGUgc2FtZS4KLSAqLwotCi0KLS8qCi0gKiBNYW55IG1hY2hpbmVzIHJlcXVpcmUgc3RvcmFnZSBhbGlnbm1lbnQ6IGxvbmdzIG11c3Qgc3RhcnQgb24gNC1ieXRlCi0gKiBib3VuZGFyaWVzLCBkb3VibGVzIG9uIDgtYnl0ZSBib3VuZGFyaWVzLCBldGMuICBPbiBzdWNoIG1hY2hpbmVzLCBtYWxsb2MoKQotICogYWx3YXlzIHJldHVybnMgcG9pbnRlcnMgdGhhdCBhcmUgbXVsdGlwbGVzIG9mIHRoZSB3b3JzdC1jYXNlIGFsaWdubWVudAotICogcmVxdWlyZW1lbnQsIGFuZCB3ZSBoYWQgYmV0dGVyIGRvIHNvIHRvby4KLSAqIFRoZXJlIGlzbid0IGFueSByZWFsbHkgcG9ydGFibGUgd2F5IHRvIGRldGVybWluZSB0aGUgd29yc3QtY2FzZSBhbGlnbm1lbnQKLSAqIHJlcXVpcmVtZW50LiAgVGhpcyBtb2R1bGUgYXNzdW1lcyB0aGF0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgaXMKLSAqIG11bHRpcGxlcyBvZiBzaXplb2YoQUxJR05fVFlQRSkuCi0gKiBCeSBkZWZhdWx0LCB3ZSBkZWZpbmUgQUxJR05fVFlQRSBhcyBkb3VibGUuICBUaGlzIGlzIG5lY2Vzc2FyeSBvbiBzb21lCi0gKiB3b3Jrc3RhdGlvbnMgKHdoZXJlIGRvdWJsZXMgcmVhbGx5IGRvIG5lZWQgOC1ieXRlIGFsaWdubWVudCkgYW5kIHdpbGwgd29yawotICogZmluZSBvbiBuZWFybHkgZXZlcnl0aGluZy4gIElmIHlvdXIgbWFjaGluZSBoYXMgbGVzc2VyIGFsaWdubWVudCBuZWVkcywKLSAqIHlvdSBjYW4gc2F2ZSBhIGZldyBieXRlcyBieSBtYWtpbmcgQUxJR05fVFlQRSBzbWFsbGVyLgotICogVGhlIG9ubHkgcGxhY2UgSSBrbm93IG9mIHdoZXJlIHRoaXMgd2lsbCBOT1Qgd29yayBpcyBjZXJ0YWluIE1hY2ludG9zaAotICogNjgweDAgY29tcGlsZXJzIHRoYXQgZGVmaW5lIGRvdWJsZSBhcyBhIDEwLWJ5dGUgSUVFRSBleHRlbmRlZCBmbG9hdC4KLSAqIERvaW5nIDEwLWJ5dGUgYWxpZ25tZW50IGlzIGNvdW50ZXJwcm9kdWN0aXZlIGJlY2F1c2UgbG9uZ3dvcmRzIHdvbid0IGJlCi0gKiBhbGlnbmVkIHdlbGwuICBQdXQgIiNkZWZpbmUgQUxJR05fVFlQRSBsb25nIiBpbiBqY29uZmlnLmggaWYgeW91IGhhdmUKLSAqIHN1Y2ggYSBjb21waWxlci4KLSAqLwotCi0jaWZuZGVmIEFMSUdOX1RZUEUJCS8qIHNvIGNhbiBvdmVycmlkZSBmcm9tIGpjb25maWcuaCAqLwotI2RlZmluZSBBTElHTl9UWVBFICBkb3VibGUKLSNlbmRpZgotCi0KLS8qCi0gKiBXZSBhbGxvY2F0ZSBvYmplY3RzIGZyb20gInBvb2xzIiwgd2hlcmUgZWFjaCBwb29sIGlzIGdvdHRlbiB3aXRoIGEgc2luZ2xlCi0gKiByZXF1ZXN0IHRvIGpwZWdfZ2V0X3NtYWxsKCkgb3IganBlZ19nZXRfbGFyZ2UoKS4gIFRoZXJlIGlzIG5vIHBlci1vYmplY3QKLSAqIG92ZXJoZWFkIHdpdGhpbiBhIHBvb2wsIGV4Y2VwdCBmb3IgYWxpZ25tZW50IHBhZGRpbmcuICBFYWNoIHBvb2wgaGFzIGEKLSAqIGhlYWRlciB3aXRoIGEgbGluayB0byB0aGUgbmV4dCBwb29sIG9mIHRoZSBzYW1lIGNsYXNzLgotICogU21hbGwgYW5kIGxhcmdlIHBvb2wgaGVhZGVycyBhcmUgaWRlbnRpY2FsIGV4Y2VwdCB0aGF0IHRoZSBsYXR0ZXIncwotICogbGluayBwb2ludGVyIG11c3QgYmUgRkFSIG9uIDgweDg2IG1hY2hpbmVzLgotICogTm90aWNlIHRoYXQgdGhlICJyZWFsIiBoZWFkZXIgZmllbGRzIGFyZSB1bmlvbidlZCB3aXRoIGEgZHVtbXkgQUxJR05fVFlQRQotICogZmllbGQuICBUaGlzIGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gbWFrZSBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpIGEgbXVsdGlwbGUKLSAqIG9mIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgQUxJR05fVFlQRS4KLSAqLwotCi10eXBlZGVmIHVuaW9uIHNtYWxsX3Bvb2xfc3RydWN0ICogc21hbGxfcG9vbF9wdHI7Ci0KLXR5cGVkZWYgdW5pb24gc21hbGxfcG9vbF9zdHJ1Y3QgewotICBzdHJ1Y3QgewotICAgIHNtYWxsX3Bvb2xfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCBvZiBwb29scyAqLwotICAgIHNpemVfdCBieXRlc191c2VkOwkJLyogaG93IG1hbnkgYnl0ZXMgYWxyZWFkeSB1c2VkIHdpdGhpbiBwb29sICovCi0gICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CQkvKiBieXRlcyBzdGlsbCBhdmFpbGFibGUgaW4gdGhpcyBwb29sICovCi0gIH0gaGRyOwotICBBTElHTl9UWVBFIGR1bW15OwkJLyogaW5jbHVkZWQgaW4gdW5pb24gdG8gZW5zdXJlIGFsaWdubWVudCAqLwotfSBzbWFsbF9wb29sX2hkcjsKLQotdHlwZWRlZiB1bmlvbiBsYXJnZV9wb29sX3N0cnVjdCBGQVIgKiBsYXJnZV9wb29sX3B0cjsKLQotdHlwZWRlZiB1bmlvbiBsYXJnZV9wb29sX3N0cnVjdCB7Ci0gIHN0cnVjdCB7Ci0gICAgbGFyZ2VfcG9vbF9wdHIgbmV4dDsJLyogbmV4dCBpbiBsaXN0IG9mIHBvb2xzICovCi0gICAgc2l6ZV90IGJ5dGVzX3VzZWQ7CQkvKiBob3cgbWFueSBieXRlcyBhbHJlYWR5IHVzZWQgd2l0aGluIHBvb2wgKi8KLSAgICBzaXplX3QgYnl0ZXNfbGVmdDsJCS8qIGJ5dGVzIHN0aWxsIGF2YWlsYWJsZSBpbiB0aGlzIHBvb2wgKi8KLSAgfSBoZHI7Ci0gIEFMSUdOX1RZUEUgZHVtbXk7CQkvKiBpbmNsdWRlZCBpbiB1bmlvbiB0byBlbnN1cmUgYWxpZ25tZW50ICovCi19IGxhcmdlX3Bvb2xfaGRyOwotCi0KLS8qCi0gKiBIZXJlIGlzIHRoZSBmdWxsIGRlZmluaXRpb24gb2YgYSBtZW1vcnkgbWFuYWdlciBvYmplY3QuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19tZW1vcnlfbWdyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIEVhY2ggcG9vbCBpZGVudGlmaWVyIChsaWZldGltZSBjbGFzcykgbmFtZXMgYSBsaW5rZWQgbGlzdCBvZiBwb29scy4gKi8KLSAgc21hbGxfcG9vbF9wdHIgc21hbGxfbGlzdFtKUE9PTF9OVU1QT09MU107Ci0gIGxhcmdlX3Bvb2xfcHRyIGxhcmdlX2xpc3RbSlBPT0xfTlVNUE9PTFNdOwotCi0gIC8qIFNpbmNlIHdlIG9ubHkgaGF2ZSBvbmUgbGlmZXRpbWUgY2xhc3Mgb2YgdmlydHVhbCBhcnJheXMsIG9ubHkgb25lCi0gICAqIGxpbmtlZCBsaXN0IGlzIG5lY2Vzc2FyeSAoZm9yIGVhY2ggZGF0YXR5cGUpLiAgTm90ZSB0aGF0IHRoZSB2aXJ0dWFsCi0gICAqIGFycmF5IGNvbnRyb2wgYmxvY2tzIGJlaW5nIGxpbmtlZCB0b2dldGhlciBhcmUgYWN0dWFsbHkgc3RvcmVkIHNvbWV3aGVyZQotICAgKiBpbiB0aGUgc21hbGwtcG9vbCBsaXN0LgotICAgKi8KLSAganZpcnRfc2FycmF5X3B0ciB2aXJ0X3NhcnJheV9saXN0OwotICBqdmlydF9iYXJyYXlfcHRyIHZpcnRfYmFycmF5X2xpc3Q7Ci0KLSAgLyogVGhpcyBjb3VudHMgdG90YWwgc3BhY2Ugb2J0YWluZWQgZnJvbSBqcGVnX2dldF9zbWFsbC9sYXJnZSAqLwotICBsb25nIHRvdGFsX3NwYWNlX2FsbG9jYXRlZDsKLQotICAvKiBhbGxvY19zYXJyYXkgYW5kIGFsbG9jX2JhcnJheSBzZXQgdGhpcyB2YWx1ZSBmb3IgdXNlIGJ5IHZpcnR1YWwKLSAgICogYXJyYXkgcm91dGluZXMuCi0gICAqLwotICBKRElNRU5TSU9OIGxhc3Rfcm93c3BlcmNodW5rOwkvKiBmcm9tIG1vc3QgcmVjZW50IGFsbG9jX3NhcnJheS9iYXJyYXkgKi8KLX0gbXlfbWVtb3J5X21ncjsKLQotdHlwZWRlZiBteV9tZW1vcnlfbWdyICogbXlfbWVtX3B0cjsKLQotCi0vKgotICogVGhlIGNvbnRyb2wgYmxvY2tzIGZvciB2aXJ0dWFsIGFycmF5cy4KLSAqIE5vdGUgdGhhdCB0aGVzZSBibG9ja3MgYXJlIGFsbG9jYXRlZCBpbiB0aGUgInNtYWxsIiBwb29sIGFyZWEuCi0gKiBTeXN0ZW0tZGVwZW5kZW50IGluZm8gZm9yIHRoZSBhc3NvY2lhdGVkIGJhY2tpbmcgc3RvcmUgKGlmIGFueSkgaXMgaGlkZGVuCi0gKiBpbnNpZGUgdGhlIGJhY2tpbmdfc3RvcmVfaW5mbyBzdHJ1Y3QuCi0gKi8KLQotc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sIHsKLSAgSlNBTVBBUlJBWSBtZW1fYnVmZmVyOwkvKiA9PiB0aGUgaW4tbWVtb3J5IGJ1ZmZlciAqLwotICBKRElNRU5TSU9OIHJvd3NfaW5fYXJyYXk7CS8qIHRvdGFsIHZpcnR1YWwgYXJyYXkgaGVpZ2h0ICovCi0gIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdzsJLyogd2lkdGggb2YgYXJyYXkgKGFuZCBvZiBtZW1vcnkgYnVmZmVyKSAqLwotICBKRElNRU5TSU9OIG1heGFjY2VzczsJCS8qIG1heCByb3dzIGFjY2Vzc2VkIGJ5IGFjY2Vzc192aXJ0X3NhcnJheSAqLwotICBKRElNRU5TSU9OIHJvd3NfaW5fbWVtOwkvKiBoZWlnaHQgb2YgbWVtb3J5IGJ1ZmZlciAqLwotICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuazsJLyogYWxsb2NhdGlvbiBjaHVuayBzaXplIGluIG1lbV9idWZmZXIgKi8KLSAgSkRJTUVOU0lPTiBjdXJfc3RhcnRfcm93OwkvKiBmaXJzdCBsb2dpY2FsIHJvdyAjIGluIHRoZSBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiBmaXJzdF91bmRlZl9yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHVuaW5pdGlhbGl6ZWQgcm93ICovCi0gIGJvb2xlYW4gcHJlX3plcm87CQkvKiBwcmUtemVybyBtb2RlIHJlcXVlc3RlZD8gKi8KLSAgYm9vbGVhbiBkaXJ0eTsJCS8qIGRvIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5lZWQgd3JpdHRlbj8gKi8KLSAgYm9vbGVhbiBiX3Nfb3BlbjsJCS8qIGlzIGJhY2tpbmctc3RvcmUgZGF0YSB2YWxpZD8gKi8KLSAganZpcnRfc2FycmF5X3B0ciBuZXh0OwkvKiBsaW5rIHRvIG5leHQgdmlydHVhbCBzYXJyYXkgY29udHJvbCBibG9jayAqLwotICBiYWNraW5nX3N0b3JlX2luZm8gYl9zX2luZm87CS8qIFN5c3RlbS1kZXBlbmRlbnQgY29udHJvbCBpbmZvICovCi19OwotCi1zdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgewotICBKQkxPQ0tBUlJBWSBtZW1fYnVmZmVyOwkvKiA9PiB0aGUgaW4tbWVtb3J5IGJ1ZmZlciAqLwotICBKRElNRU5TSU9OIHJvd3NfaW5fYXJyYXk7CS8qIHRvdGFsIHZpcnR1YWwgYXJyYXkgaGVpZ2h0ICovCi0gIEpESU1FTlNJT04gYmxvY2tzcGVycm93OwkvKiB3aWR0aCBvZiBhcnJheSAoYW5kIG9mIG1lbW9yeSBidWZmZXIpICovCi0gIEpESU1FTlNJT04gbWF4YWNjZXNzOwkJLyogbWF4IHJvd3MgYWNjZXNzZWQgYnkgYWNjZXNzX3ZpcnRfYmFycmF5ICovCi0gIEpESU1FTlNJT04gcm93c19pbl9tZW07CS8qIGhlaWdodCBvZiBtZW1vcnkgYnVmZmVyICovCi0gIEpESU1FTlNJT04gcm93c3BlcmNodW5rOwkvKiBhbGxvY2F0aW9uIGNodW5rIHNpemUgaW4gbWVtX2J1ZmZlciAqLwotICBKRElNRU5TSU9OIGN1cl9zdGFydF9yb3c7CS8qIGZpcnN0IGxvZ2ljYWwgcm93ICMgaW4gdGhlIGJ1ZmZlciAqLwotICBKRElNRU5TSU9OIGZpcnN0X3VuZGVmX3JvdzsJLyogcm93ICMgb2YgZmlyc3QgdW5pbml0aWFsaXplZCByb3cgKi8KLSAgYm9vbGVhbiBwcmVfemVybzsJCS8qIHByZS16ZXJvIG1vZGUgcmVxdWVzdGVkPyAqLwotICBib29sZWFuIGRpcnR5OwkJLyogZG8gY3VycmVudCBidWZmZXIgY29udGVudHMgbmVlZCB3cml0dGVuPyAqLwotICBib29sZWFuIGJfc19vcGVuOwkJLyogaXMgYmFja2luZy1zdG9yZSBkYXRhIHZhbGlkPyAqLwotICBqdmlydF9iYXJyYXlfcHRyIG5leHQ7CS8qIGxpbmsgdG8gbmV4dCB2aXJ0dWFsIGJhcnJheSBjb250cm9sIGJsb2NrICovCi0gIGJhY2tpbmdfc3RvcmVfaW5mbyBiX3NfaW5mbzsJLyogU3lzdGVtLWRlcGVuZGVudCBjb250cm9sIGluZm8gKi8KLX07Ci0KLQotI2lmZGVmIE1FTV9TVEFUUwkJLyogb3B0aW9uYWwgZXh0cmEgc3R1ZmYgZm9yIHN0YXRpc3RpY3MgKi8KLQotTE9DQUwodm9pZCkKLXByaW50X21lbV9zdGF0cyAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkKLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAgc21hbGxfcG9vbF9wdHIgc2hkcl9wdHI7Ci0gIGxhcmdlX3Bvb2xfcHRyIGxoZHJfcHRyOwotCi0gIC8qIFNpbmNlIHRoaXMgaXMgb25seSBhIGRlYnVnZ2luZyBzdHViLCB3ZSBjYW4gY2hlYXQgYSBsaXR0bGUgYnkgdXNpbmcKLSAgICogZnByaW50ZiBkaXJlY3RseSByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoIHRoZSB0cmFjZSBtZXNzYWdlIGNvZGUuCi0gICAqIFRoaXMgaXMgaGVscGZ1bCBiZWNhdXNlIG1lc3NhZ2UgcGFybSBhcnJheSBjYW4ndCBoYW5kbGUgbG9uZ3MuCi0gICAqLwotICBmcHJpbnRmKHN0ZGVyciwgIkZyZWVpbmcgcG9vbCAlZCwgdG90YWwgc3BhY2UgPSAlbGRcbiIsCi0JICBwb29sX2lkLCBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCk7Ci0KLSAgZm9yIChsaGRyX3B0ciA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsgbGhkcl9wdHIgIT0gTlVMTDsKLSAgICAgICBsaGRyX3B0ciA9IGxoZHJfcHRyLT5oZHIubmV4dCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiICBMYXJnZSBjaHVuayB1c2VkICVsZFxuIiwKLQkgICAgKGxvbmcpIGxoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCk7Ci0gIH0KLQotICBmb3IgKHNoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOyBzaGRyX3B0ciAhPSBOVUxMOwotICAgICAgIHNoZHJfcHRyID0gc2hkcl9wdHItPmhkci5uZXh0KSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIFNtYWxsIGNodW5rIHVzZWQgJWxkIGZyZWUgJWxkXG4iLAotCSAgICAobG9uZykgc2hkcl9wdHItPmhkci5ieXRlc191c2VkLAotCSAgICAobG9uZykgc2hkcl9wdHItPmhkci5ieXRlc19sZWZ0KTsKLSAgfQotfQotCi0jZW5kaWYgLyogTUVNX1NUQVRTICovCi0KLQotTE9DQUwodm9pZCkKLW91dF9vZl9tZW1vcnkgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHdoaWNoKQotLyogUmVwb3J0IGFuIG91dC1vZi1tZW1vcnkgZXJyb3IgYW5kIHN0b3AgZXhlY3V0aW9uICovCi0vKiBJZiB3ZSBjb21waWxlZCBNRU1fU1RBVFMgc3VwcG9ydCwgcmVwb3J0IGFsbG9jIHJlcXVlc3RzIGJlZm9yZSBkeWluZyAqLwotewotI2lmZGVmIE1FTV9TVEFUUwotICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDI7CS8qIGZvcmNlIHNlbGZfZGVzdHJ1Y3QgdG8gcmVwb3J0IHN0YXRzICovCi0jZW5kaWYKLSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfT1VUX09GX01FTU9SWSwgd2hpY2gpOwotfQotCi0KLS8qCi0gKiBBbGxvY2F0aW9uIG9mICJzbWFsbCIgb2JqZWN0cy4KLSAqCi0gKiBGb3IgdGhlc2UsIHdlIHVzZSBwb29sZWQgc3RvcmFnZS4gIFdoZW4gYSBuZXcgcG9vbCBtdXN0IGJlIGNyZWF0ZWQsCi0gKiB3ZSB0cnkgdG8gZ2V0IGVub3VnaCBzcGFjZSBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCBwbHVzIGEgInNsb3AiIGZhY3RvciwKLSAqIHdoZXJlIHRoZSBzbG9wIHdpbGwgYmUgdGhlIGFtb3VudCBvZiBsZWZ0b3ZlciBzcGFjZSBpbiB0aGUgbmV3IHBvb2wuCi0gKiBUaGUgc3BlZWQgdnMuIHNwYWNlIHRyYWRlb2ZmIGlzIGxhcmdlbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2xvcCB2YWx1ZXMuCi0gKiBBIGRpZmZlcmVudCBzbG9wIHZhbHVlIGlzIHByb3ZpZGVkIGZvciBlYWNoIHBvb2wgY2xhc3MgKGxpZmV0aW1lKSwKLSAqIGFuZCB3ZSBhbHNvIGRpc3Rpbmd1aXNoIHRoZSBmaXJzdCBwb29sIG9mIGEgY2xhc3MgZnJvbSBsYXRlciBvbmVzLgotICogTk9URTogdGhlIHZhbHVlcyBnaXZlbiB3b3JrIGZhaXJseSB3ZWxsIG9uIGJvdGggMTYtIGFuZCAzMi1iaXQtaW50Ci0gKiBtYWNoaW5lcywgYnV0IG1heSBiZSB0b28gc21hbGwgaWYgbG9uZ3MgYXJlIDY0IGJpdHMgb3IgbW9yZS4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGZpcnN0X3Bvb2xfc2xvcFtKUE9PTF9OVU1QT09MU10gPSAKLXsKLQkxNjAwLAkJCS8qIGZpcnN0IFBFUk1BTkVOVCBwb29sICovCi0JMTYwMDAJCQkvKiBmaXJzdCBJTUFHRSBwb29sICovCi19OwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGV4dHJhX3Bvb2xfc2xvcFtKUE9PTF9OVU1QT09MU10gPSAKLXsKLQkwLAkJCS8qIGFkZGl0aW9uYWwgUEVSTUFORU5UIHBvb2xzICovCi0JNTAwMAkJCS8qIGFkZGl0aW9uYWwgSU1BR0UgcG9vbHMgKi8KLX07Ci0KLSNkZWZpbmUgTUlOX1NMT1AgIDUwCQkvKiBncmVhdGVyIHRoYW4gMCB0byBhdm9pZCBmdXRpbGUgbG9vcGluZyAqLwotCi0KLU1FVEhPRERFRih2b2lkICopCi1hbGxvY19zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLS8qIEFsbG9jYXRlIGEgInNtYWxsIiBvYmplY3QgKi8KLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAgc21hbGxfcG9vbF9wdHIgaGRyX3B0ciwgcHJldl9oZHJfcHRyOwotICBjaGFyICogZGF0YV9wdHI7Ci0gIHNpemVfdCBvZGRfYnl0ZXMsIG1pbl9yZXF1ZXN0LCBzbG9wOwotCi0gIC8qIENoZWNrIGZvciB1bnNhdGlzZmlhYmxlIHJlcXVlc3QgKGRvIG5vdyB0byBlbnN1cmUgbm8gb3ZlcmZsb3cgYmVsb3cpICovCi0gIGlmIChzaXplb2ZvYmplY3QgPiAoc2l6ZV90KSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihzbWFsbF9wb29sX2hkcikpKQotICAgIG91dF9vZl9tZW1vcnkoY2luZm8sIDEpOwkvKiByZXF1ZXN0IGV4Y2VlZHMgbWFsbG9jJ3MgYWJpbGl0eSAqLwotCi0gIC8qIFJvdW5kIHVwIHRoZSByZXF1ZXN0ZWQgc2l6ZSB0byBhIG11bHRpcGxlIG9mIFNJWkVPRihBTElHTl9UWVBFKSAqLwotICBvZGRfYnl0ZXMgPSBzaXplb2ZvYmplY3QgJSBTSVpFT0YoQUxJR05fVFlQRSk7Ci0gIGlmIChvZGRfYnl0ZXMgPiAwKQotICAgIHNpemVvZm9iamVjdCArPSBTSVpFT0YoQUxJR05fVFlQRSkgLSBvZGRfYnl0ZXM7Ci0KLSAgLyogU2VlIGlmIHNwYWNlIGlzIGF2YWlsYWJsZSBpbiBhbnkgZXhpc3RpbmcgcG9vbCAqLwotICBpZiAocG9vbF9pZCA8IDAgfHwgcG9vbF9pZCA+PSBKUE9PTF9OVU1QT09MUykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLwotICBwcmV2X2hkcl9wdHIgPSBOVUxMOwotICBoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOwotICB3aGlsZSAoaGRyX3B0ciAhPSBOVUxMKSB7Ci0gICAgaWYgKGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ID49IHNpemVvZm9iamVjdCkKLSAgICAgIGJyZWFrOwkJCS8qIGZvdW5kIHBvb2wgd2l0aCBlbm91Z2ggc3BhY2UgKi8KLSAgICBwcmV2X2hkcl9wdHIgPSBoZHJfcHRyOwotICAgIGhkcl9wdHIgPSBoZHJfcHRyLT5oZHIubmV4dDsKLSAgfQotCi0gIC8qIFRpbWUgdG8gbWFrZSBhIG5ldyBwb29sPyAqLwotICBpZiAoaGRyX3B0ciA9PSBOVUxMKSB7Ci0gICAgLyogbWluX3JlcXVlc3QgaXMgd2hhdCB3ZSBuZWVkIG5vdywgc2xvcCBpcyB3aGF0IHdpbGwgYmUgbGVmdG92ZXIgKi8KLSAgICBtaW5fcmVxdWVzdCA9IHNpemVvZm9iamVjdCArIFNJWkVPRihzbWFsbF9wb29sX2hkcik7Ci0gICAgaWYgKHByZXZfaGRyX3B0ciA9PSBOVUxMKQkvKiBmaXJzdCBwb29sIGluIGNsYXNzPyAqLwotICAgICAgc2xvcCA9IGZpcnN0X3Bvb2xfc2xvcFtwb29sX2lkXTsKLSAgICBlbHNlCi0gICAgICBzbG9wID0gZXh0cmFfcG9vbF9zbG9wW3Bvb2xfaWRdOwotICAgIC8qIERvbid0IGFzayBmb3IgbW9yZSB0aGFuIE1BWF9BTExPQ19DSFVOSyAqLwotICAgIGlmIChzbG9wID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1taW5fcmVxdWVzdCkpCi0gICAgICBzbG9wID0gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1taW5fcmVxdWVzdCk7Ci0gICAgLyogVHJ5IHRvIGdldCBzcGFjZSwgaWYgZmFpbCByZWR1Y2Ugc2xvcCBhbmQgdHJ5IGFnYWluICovCi0gICAgZm9yICg7OykgewotICAgICAgaGRyX3B0ciA9IChzbWFsbF9wb29sX3B0cikganBlZ19nZXRfc21hbGwoY2luZm8sIG1pbl9yZXF1ZXN0ICsgc2xvcCk7Ci0gICAgICBpZiAoaGRyX3B0ciAhPSBOVUxMKQotCWJyZWFrOwotICAgICAgc2xvcCAvPSAyOwotICAgICAgaWYgKHNsb3AgPCBNSU5fU0xPUCkJLyogZ2l2ZSB1cCB3aGVuIGl0IGdldHMgcmVhbCBzbWFsbCAqLwotCW91dF9vZl9tZW1vcnkoY2luZm8sIDIpOyAvKiBqcGVnX2dldF9zbWFsbCBmYWlsZWQgKi8KLSAgICB9Ci0gICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgKz0gbWluX3JlcXVlc3QgKyBzbG9wOwotICAgIC8qIFN1Y2Nlc3MsIGluaXRpYWxpemUgdGhlIG5ldyBwb29sIGhlYWRlciBhbmQgYWRkIHRvIGVuZCBvZiBsaXN0ICovCi0gICAgaGRyX3B0ci0+aGRyLm5leHQgPSBOVUxMOwotICAgIGhkcl9wdHItPmhkci5ieXRlc191c2VkID0gMDsKLSAgICBoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCA9IHNpemVvZm9iamVjdCArIHNsb3A7Ci0gICAgaWYgKHByZXZfaGRyX3B0ciA9PSBOVUxMKQkvKiBmaXJzdCBwb29sIGluIGNsYXNzPyAqLwotICAgICAgbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdID0gaGRyX3B0cjsKLSAgICBlbHNlCi0gICAgICBwcmV2X2hkcl9wdHItPmhkci5uZXh0ID0gaGRyX3B0cjsKLSAgfQotCi0gIC8qIE9LLCBhbGxvY2F0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGN1cnJlbnQgcG9vbCAqLwotICBkYXRhX3B0ciA9IChjaGFyICopIChoZHJfcHRyICsgMSk7IC8qIHBvaW50IHRvIGZpcnN0IGRhdGEgYnl0ZSBpbiBwb29sICovCi0gIGRhdGFfcHRyICs9IGhkcl9wdHItPmhkci5ieXRlc191c2VkOyAvKiBwb2ludCB0byBwbGFjZSBmb3Igb2JqZWN0ICovCi0gIGhkcl9wdHItPmhkci5ieXRlc191c2VkICs9IHNpemVvZm9iamVjdDsKLSAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgLT0gc2l6ZW9mb2JqZWN0OwotCi0gIHJldHVybiAodm9pZCAqKSBkYXRhX3B0cjsKLX0KLQotCi0vKgotICogQWxsb2NhdGlvbiBvZiAibGFyZ2UiIG9iamVjdHMuCi0gKgotICogVGhlIGV4dGVybmFsIHNlbWFudGljcyBvZiB0aGVzZSBhcmUgdGhlIHNhbWUgYXMgInNtYWxsIiBvYmplY3RzLAotICogZXhjZXB0IHRoYXQgRkFSIHBvaW50ZXJzIGFyZSB1c2VkIG9uIDgweDg2LiAgSG93ZXZlciB0aGUgcG9vbAotICogbWFuYWdlbWVudCBoZXVyaXN0aWNzIGFyZSBxdWl0ZSBkaWZmZXJlbnQuICBXZSBhc3N1bWUgdGhhdCBlYWNoCi0gKiByZXF1ZXN0IGlzIGxhcmdlIGVub3VnaCB0aGF0IGl0IG1heSBhcyB3ZWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0bwotICoganBlZ19nZXRfbGFyZ2U7IHRoZSBwb29sIG1hbmFnZW1lbnQganVzdCBsaW5rcyBldmVyeXRoaW5nIHRvZ2V0aGVyCi0gKiBzbyB0aGF0IHdlIGNhbiBmcmVlIGl0IGFsbCBvbiBkZW1hbmQuCi0gKiBOb3RlOiB0aGUgbWFqb3IgdXNlIG9mICJsYXJnZSIgb2JqZWN0cyBpcyBpbiBKU0FNUEFSUkFZIGFuZCBKQkxPQ0tBUlJBWQotICogc3RydWN0dXJlcy4gIFRoZSByb3V0aW5lcyB0aGF0IGNyZWF0ZSB0aGVzZSBzdHJ1Y3R1cmVzIChzZWUgYmVsb3cpCi0gKiBkZWxpYmVyYXRlbHkgYnVuY2ggcm93cyB0b2dldGhlciB0byBlbnN1cmUgYSBsYXJnZSByZXF1ZXN0IHNpemUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQgRkFSICopCi1hbGxvY19sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLS8qIEFsbG9jYXRlIGEgImxhcmdlIiBvYmplY3QgKi8KLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAgbGFyZ2VfcG9vbF9wdHIgaGRyX3B0cjsKLSAgc2l6ZV90IG9kZF9ieXRlczsKLQotICAvKiBDaGVjayBmb3IgdW5zYXRpc2ZpYWJsZSByZXF1ZXN0IChkbyBub3cgdG8gZW5zdXJlIG5vIG92ZXJmbG93IGJlbG93KSAqLwotICBpZiAoc2l6ZW9mb2JqZWN0ID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1TSVpFT0YobGFyZ2VfcG9vbF9oZHIpKSkKLSAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCAzKTsJLyogcmVxdWVzdCBleGNlZWRzIG1hbGxvYydzIGFiaWxpdHkgKi8KLQotICAvKiBSb3VuZCB1cCB0aGUgcmVxdWVzdGVkIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkgKi8KLSAgb2RkX2J5dGVzID0gc2l6ZW9mb2JqZWN0ICUgU0laRU9GKEFMSUdOX1RZUEUpOwotICBpZiAob2RkX2J5dGVzID4gMCkKLSAgICBzaXplb2ZvYmplY3QgKz0gU0laRU9GKEFMSUdOX1RZUEUpIC0gb2RkX2J5dGVzOwotCi0gIC8qIEFsd2F5cyBtYWtlIGEgbmV3IHBvb2wgKi8KLSAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KLQotICBoZHJfcHRyID0gKGxhcmdlX3Bvb2xfcHRyKSBqcGVnX2dldF9sYXJnZShjaW5mbywgc2l6ZW9mb2JqZWN0ICsKLQkJCQkJICAgIFNJWkVPRihsYXJnZV9wb29sX2hkcikpOwotICBpZiAoaGRyX3B0ciA9PSBOVUxMKQotICAgIG91dF9vZl9tZW1vcnkoY2luZm8sIDQpOwkvKiBqcGVnX2dldF9sYXJnZSBmYWlsZWQgKi8KLSAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgKz0gc2l6ZW9mb2JqZWN0ICsgU0laRU9GKGxhcmdlX3Bvb2xfaGRyKTsKLQotICAvKiBTdWNjZXNzLCBpbml0aWFsaXplIHRoZSBuZXcgcG9vbCBoZWFkZXIgYW5kIGFkZCB0byBsaXN0ICovCi0gIGhkcl9wdHItPmhkci5uZXh0ID0gbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdOwotICAvKiBXZSBtYWludGFpbiBzcGFjZSBjb3VudHMgaW4gZWFjaCBwb29sIGhlYWRlciBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXMsCi0gICAqIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdCBuZWVkZWQgZm9yIGFsbG9jYXRpb24uCi0gICAqLwotICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCA9IHNpemVvZm9iamVjdDsKLSAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgPSAwOwotICBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF0gPSBoZHJfcHRyOwotCi0gIHJldHVybiAodm9pZCBGQVIgKikgKGhkcl9wdHIgKyAxKTsgLyogcG9pbnQgdG8gZmlyc3QgZGF0YSBieXRlIGluIHBvb2wgKi8KLX0KLQotCi0vKgotICogQ3JlYXRpb24gb2YgMi1EIHNhbXBsZSBhcnJheXMuCi0gKiBUaGUgcG9pbnRlcnMgYXJlIGluIG5lYXIgaGVhcCwgdGhlIHNhbXBsZXMgdGhlbXNlbHZlcyBpbiBGQVIgaGVhcC4KLSAqCi0gKiBUbyBtaW5pbWl6ZSBhbGxvY2F0aW9uIG92ZXJoZWFkIGFuZCB0byBhbGxvdyBJL08gb2YgbGFyZ2UgY29udGlndW91cwotICogYmxvY2tzLCB3ZSBhbGxvY2F0ZSB0aGUgc2FtcGxlIHJvd3MgaW4gZ3JvdXBzIG9mIGFzIG1hbnkgcm93cyBhcyBwb3NzaWJsZQotICogd2l0aG91dCBleGNlZWRpbmcgTUFYX0FMTE9DX0NIVU5LIHRvdGFsIGJ5dGVzIHBlciBhbGxvY2F0aW9uIHJlcXVlc3QuCi0gKiBOQjogdGhlIHZpcnR1YWwgYXJyYXkgY29udHJvbCByb3V0aW5lcywgbGF0ZXIgaW4gdGhpcyBmaWxlLCBrbm93IGFib3V0Ci0gKiB0aGlzIGNodW5raW5nIG9mIHJvd3MuICBUaGUgcm93c3BlcmNodW5rIHZhbHVlIGlzIGxlZnQgaW4gdGhlIG1lbSBtYW5hZ2VyCi0gKiBvYmplY3Qgc28gdGhhdCBpdCBjYW4gYmUgc2F2ZWQgYXdheSBpZiB0aGlzIHNhcnJheSBpcyB0aGUgd29ya3NwYWNlIGZvcgotICogYSB2aXJ0dWFsIGFycmF5LgotICovCi0KLU1FVEhPRERFRihKU0FNUEFSUkFZKQotYWxsb2Nfc2FycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAotCSAgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzKQotLyogQWxsb2NhdGUgYSAyLUQgc2FtcGxlIGFycmF5ICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIEpTQU1QQVJSQVkgcmVzdWx0OwotICBKU0FNUFJPVyB3b3Jrc3BhY2U7Ci0gIEpESU1FTlNJT04gcm93c3BlcmNodW5rLCBjdXJyb3csIGk7Ci0gIGxvbmcgbHRlbXA7Ci0KLSAgLyogQ2FsY3VsYXRlIG1heCAjIG9mIHJvd3MgYWxsb3dlZCBpbiBvbmUgYWxsb2NhdGlvbiBjaHVuayAqLwotICBsdGVtcCA9IChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkgLwotCSAgKChsb25nKSBzYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpKTsKLSAgaWYgKGx0ZW1wIDw9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7Ci0gIGlmIChsdGVtcCA8IChsb25nKSBudW1yb3dzKQotICAgIHJvd3NwZXJjaHVuayA9IChKRElNRU5TSU9OKSBsdGVtcDsKLSAgZWxzZQotICAgIHJvd3NwZXJjaHVuayA9IG51bXJvd3M7Ci0gIG1lbS0+bGFzdF9yb3dzcGVyY2h1bmsgPSByb3dzcGVyY2h1bms7Ci0KLSAgLyogR2V0IHNwYWNlIGZvciByb3cgcG9pbnRlcnMgKHNtYWxsIG9iamVjdCkgKi8KLSAgcmVzdWx0ID0gKEpTQU1QQVJSQVkpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAotCQkJCSAgICAoc2l6ZV90KSAobnVtcm93cyAqIFNJWkVPRihKU0FNUFJPVykpKTsKLQotICAvKiBHZXQgdGhlIHJvd3MgdGhlbXNlbHZlcyAobGFyZ2Ugb2JqZWN0cykgKi8KLSAgY3Vycm93ID0gMDsKLSAgd2hpbGUgKGN1cnJvdyA8IG51bXJvd3MpIHsKLSAgICByb3dzcGVyY2h1bmsgPSBNSU4ocm93c3BlcmNodW5rLCBudW1yb3dzIC0gY3Vycm93KTsKLSAgICB3b3Jrc3BhY2UgPSAoSlNBTVBST1cpIGFsbG9jX2xhcmdlKGNpbmZvLCBwb29sX2lkLAotCShzaXplX3QpICgoc2l6ZV90KSByb3dzcGVyY2h1bmsgKiAoc2l6ZV90KSBzYW1wbGVzcGVycm93Ci0JCSAgKiBTSVpFT0YoSlNBTVBMRSkpKTsKLSAgICBmb3IgKGkgPSByb3dzcGVyY2h1bms7IGkgPiAwOyBpLS0pIHsKLSAgICAgIHJlc3VsdFtjdXJyb3crK10gPSB3b3Jrc3BhY2U7Ci0gICAgICB3b3Jrc3BhY2UgKz0gc2FtcGxlc3BlcnJvdzsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qCi0gKiBDcmVhdGlvbiBvZiAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXlzLgotICogVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgY29kZSBmb3Igc2FtcGxlIGFycmF5cywgYWJvdmUuCi0gKi8KLQotTUVUSE9EREVGKEpCTE9DS0FSUkFZKQotYWxsb2NfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAotCSAgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MpCi0vKiBBbGxvY2F0ZSBhIDItRCBjb2VmZmljaWVudC1ibG9jayBhcnJheSAqLwotewotICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOwotICBKQkxPQ0tBUlJBWSByZXN1bHQ7Ci0gIEpCTE9DS1JPVyB3b3Jrc3BhY2U7Ci0gIEpESU1FTlNJT04gcm93c3BlcmNodW5rLCBjdXJyb3csIGk7Ci0gIGxvbmcgbHRlbXA7Ci0KLSAgLyogQ2FsY3VsYXRlIG1heCAjIG9mIHJvd3MgYWxsb3dlZCBpbiBvbmUgYWxsb2NhdGlvbiBjaHVuayAqLwotICBsdGVtcCA9IChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkgLwotCSAgKChsb25nKSBibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKSk7Ci0gIGlmIChsdGVtcCA8PSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOwotICBpZiAobHRlbXAgPCAobG9uZykgbnVtcm93cykKLSAgICByb3dzcGVyY2h1bmsgPSAoSkRJTUVOU0lPTikgbHRlbXA7Ci0gIGVsc2UKLSAgICByb3dzcGVyY2h1bmsgPSBudW1yb3dzOwotICBtZW0tPmxhc3Rfcm93c3BlcmNodW5rID0gcm93c3BlcmNodW5rOwotCi0gIC8qIEdldCBzcGFjZSBmb3Igcm93IHBvaW50ZXJzIChzbWFsbCBvYmplY3QpICovCi0gIHJlc3VsdCA9IChKQkxPQ0tBUlJBWSkgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCi0JCQkJICAgICAoc2l6ZV90KSAobnVtcm93cyAqIFNJWkVPRihKQkxPQ0tST1cpKSk7Ci0KLSAgLyogR2V0IHRoZSByb3dzIHRoZW1zZWx2ZXMgKGxhcmdlIG9iamVjdHMpICovCi0gIGN1cnJvdyA9IDA7Ci0gIHdoaWxlIChjdXJyb3cgPCBudW1yb3dzKSB7Ci0gICAgcm93c3BlcmNodW5rID0gTUlOKHJvd3NwZXJjaHVuaywgbnVtcm93cyAtIGN1cnJvdyk7Ci0gICAgd29ya3NwYWNlID0gKEpCTE9DS1JPVykgYWxsb2NfbGFyZ2UoY2luZm8sIHBvb2xfaWQsCi0JKHNpemVfdCkgKChzaXplX3QpIHJvd3NwZXJjaHVuayAqIChzaXplX3QpIGJsb2Nrc3BlcnJvdwotCQkgICogU0laRU9GKEpCTE9DSykpKTsKLSAgICBmb3IgKGkgPSByb3dzcGVyY2h1bms7IGkgPiAwOyBpLS0pIHsKLSAgICAgIHJlc3VsdFtjdXJyb3crK10gPSB3b3Jrc3BhY2U7Ci0gICAgICB3b3Jrc3BhY2UgKz0gYmxvY2tzcGVycm93OwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoKLSAqIEFib3V0IHZpcnR1YWwgYXJyYXkgbWFuYWdlbWVudDoKLSAqCi0gKiBUaGUgYWJvdmUgIm5vcm1hbCIgYXJyYXkgcm91dGluZXMgYXJlIG9ubHkgdXNlZCB0byBhbGxvY2F0ZSBzdHJpcCBidWZmZXJzCi0gKiAoYXMgd2lkZSBhcyB0aGUgaW1hZ2UsIGJ1dCBqdXN0IGEgZmV3IHJvd3MgaGlnaCkuICBGdWxsLWltYWdlLXNpemVkIGJ1ZmZlcnMKLSAqIGFyZSBoYW5kbGVkIGFzICJ2aXJ0dWFsIiBhcnJheXMuICBUaGUgYXJyYXkgaXMgc3RpbGwgYWNjZXNzZWQgYSBzdHJpcCBhdCBhCi0gKiB0aW1lLCBidXQgdGhlIG1lbW9yeSBtYW5hZ2VyIG11c3Qgc2F2ZSB0aGUgd2hvbGUgYXJyYXkgZm9yIHJlcGVhdGVkCi0gKiBhY2Nlc3Nlcy4gIFRoZSBpbnRlbmRlZCBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IHRoZXJlIGlzIGEgc3RyaXAgYnVmZmVyIGluCi0gKiBtZW1vcnkgKGFzIGhpZ2ggYXMgaXMgcG9zc2libGUgZ2l2ZW4gdGhlIGRlc2lyZWQgbWVtb3J5IGxpbWl0KSwgcGx1cyBhCi0gKiBiYWNraW5nIGZpbGUgdGhhdCBob2xkcyB0aGUgcmVzdCBvZiB0aGUgYXJyYXkuCi0gKgotICogVGhlIHJlcXVlc3RfdmlydF9hcnJheSByb3V0aW5lcyBhcmUgdG9sZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgaW1hZ2UgYW5kCi0gKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgYWNjZXNzZWQgYXQgb25jZS4gIFRoZSBpbi1tZW1vcnkKLSAqIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSBtYXhhY2Nlc3MgdmFsdWUuCi0gKgotICogVGhlIHJlcXVlc3Qgcm91dGluZXMgY3JlYXRlIGNvbnRyb2wgYmxvY2tzIGJ1dCBub3QgdGhlIGluLW1lbW9yeSBidWZmZXJzLgotICogVGhhdCBpcyBwb3N0cG9uZWQgdW50aWwgcmVhbGl6ZV92aXJ0X2FycmF5cyBpcyBjYWxsZWQuICBBdCB0aGF0IHRpbWUgdGhlCi0gKiB0b3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGlzIGtub3duIChhcHByb3hpbWF0ZWx5LCBhbnl3YXkpLCBzbyBmcmVlCi0gKiBtZW1vcnkgY2FuIGJlIGRpdmlkZWQgdXAgZmFpcmx5LgotICoKLSAqIFRoZSBhY2Nlc3NfdmlydF9hcnJheSByb3V0aW5lcyBhcmUgcmVzcG9uc2libGUgZm9yIG1ha2luZyBhIHNwZWNpZmljIHN0cmlwCi0gKiBhcmVhIGFjY2Vzc2libGUgKGFmdGVyIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgYmFja2luZyBmaWxlLCBpZiBuZWNlc3NhcnkpLgotICogTm90ZSB0aGF0IHRoZSBhY2Nlc3Mgcm91dGluZXMgYXJlIHRvbGQgd2hldGhlciB0aGUgY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5Ci0gKiB0aGUgYWNjZXNzZWQgc3RyaXA7IGR1cmluZyBhIHJlYWQtb25seSBwYXNzIHRoaXMgc2F2ZXMgaGF2aW5nIHRvIHJld3JpdGUKLSAqIGRhdGEgdG8gZGlzay4gIFRoZSBhY2Nlc3Mgcm91dGluZXMgYXJlIGFsc28gcmVzcG9uc2libGUgZm9yIHByZS16ZXJvaW5nCi0gKiBhbnkgbmV3bHkgYWNjZXNzZWQgcm93cywgaWYgcHJlLXplcm9pbmcgd2FzIHJlcXVlc3RlZC4KLSAqCi0gKiBJbiBjdXJyZW50IHVzYWdlLCB0aGUgYWNjZXNzIHJlcXVlc3RzIGFyZSB1c3VhbGx5IGZvciBub25vdmVybGFwcGluZwotICogc3RyaXBzOyB0aGF0IGlzLCBzdWNjZXNzaXZlIGFjY2VzcyBzdGFydF9yb3cgbnVtYmVycyBkaWZmZXIgYnkgZXhhY3RseQotICogbnVtX3Jvd3MgPSBtYXhhY2Nlc3MuICBUaGlzIG1lYW5zIHdlIGNhbiBnZXQgZ29vZCBwZXJmb3JtYW5jZSB3aXRoIHNpbXBsZQotICogYnVmZmVyIGR1bXAvcmVsb2FkIGxvZ2ljLCBieSBtYWtpbmcgdGhlIGluLW1lbW9yeSBidWZmZXIgYmUgYSBtdWx0aXBsZQotICogb2YgdGhlIGFjY2VzcyBoZWlnaHQ7IHRoZW4gdGhlcmUgd2lsbCBuZXZlciBiZSBhY2Nlc3NlcyBhY3Jvc3MgYnVmZmVybG9hZAotICogYm91bmRhcmllcy4gIFRoZSBjb2RlIHdpbGwgc3RpbGwgd29yayB3aXRoIG92ZXJsYXBwaW5nIGFjY2VzcyByZXF1ZXN0cywKLSAqIGJ1dCBpdCBkb2Vzbid0IGhhbmRsZSBidWZmZXJsb2FkIG92ZXJsYXBzIHZlcnkgZWZmaWNpZW50bHkuCi0gKi8KLQotCi1NRVRIT0RERUYoanZpcnRfc2FycmF5X3B0cikKLXJlcXVlc3RfdmlydF9zYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIGJvb2xlYW4gcHJlX3plcm8sCi0JCSAgICAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MsCi0JCSAgICAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpCi0vKiBSZXF1ZXN0IGEgdmlydHVhbCAyLUQgc2FtcGxlIGFycmF5ICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIGp2aXJ0X3NhcnJheV9wdHIgcmVzdWx0OwotCi0gIC8qIE9ubHkgSU1BR0UtbGlmZXRpbWUgdmlydHVhbCBhcnJheXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KLSAgaWYgKHBvb2xfaWQgIT0gSlBPT0xfSU1BR0UpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KLQotICAvKiBnZXQgY29udHJvbCBibG9jayAqLwotICByZXN1bHQgPSAoanZpcnRfc2FycmF5X3B0cikgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCi0JCQkJCSAgU0laRU9GKHN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCkpOwotCi0gIHJlc3VsdC0+bWVtX2J1ZmZlciA9IE5VTEw7CS8qIG1hcmtzIGFycmF5IG5vdCB5ZXQgcmVhbGl6ZWQgKi8KLSAgcmVzdWx0LT5yb3dzX2luX2FycmF5ID0gbnVtcm93czsKLSAgcmVzdWx0LT5zYW1wbGVzcGVycm93ID0gc2FtcGxlc3BlcnJvdzsKLSAgcmVzdWx0LT5tYXhhY2Nlc3MgPSBtYXhhY2Nlc3M7Ci0gIHJlc3VsdC0+cHJlX3plcm8gPSBwcmVfemVybzsKLSAgcmVzdWx0LT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBubyBhc3NvY2lhdGVkIGJhY2tpbmctc3RvcmUgb2JqZWN0ICovCi0gIHJlc3VsdC0+bmV4dCA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgLyogYWRkIHRvIGxpc3Qgb2YgdmlydHVhbCBhcnJheXMgKi8KLSAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gcmVzdWx0OwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotTUVUSE9EREVGKGp2aXJ0X2JhcnJheV9wdHIpCi1yZXF1ZXN0X3ZpcnRfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLCBib29sZWFuIHByZV96ZXJvLAotCQkgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MsCi0JCSAgICAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpCi0vKiBSZXF1ZXN0IGEgdmlydHVhbCAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAganZpcnRfYmFycmF5X3B0ciByZXN1bHQ7Ci0KLSAgLyogT25seSBJTUFHRS1saWZldGltZSB2aXJ0dWFsIGFycmF5cyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCAqLwotICBpZiAocG9vbF9pZCAhPSBKUE9PTF9JTUFHRSkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLwotCi0gIC8qIGdldCBjb250cm9sIGJsb2NrICovCi0gIHJlc3VsdCA9IChqdmlydF9iYXJyYXlfcHRyKSBhbGxvY19zbWFsbChjaW5mbywgcG9vbF9pZCwKLQkJCQkJICBTSVpFT0Yoc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sKSk7Ci0KLSAgcmVzdWx0LT5tZW1fYnVmZmVyID0gTlVMTDsJLyogbWFya3MgYXJyYXkgbm90IHlldCByZWFsaXplZCAqLwotICByZXN1bHQtPnJvd3NfaW5fYXJyYXkgPSBudW1yb3dzOwotICByZXN1bHQtPmJsb2Nrc3BlcnJvdyA9IGJsb2Nrc3BlcnJvdzsKLSAgcmVzdWx0LT5tYXhhY2Nlc3MgPSBtYXhhY2Nlc3M7Ci0gIHJlc3VsdC0+cHJlX3plcm8gPSBwcmVfemVybzsKLSAgcmVzdWx0LT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBubyBhc3NvY2lhdGVkIGJhY2tpbmctc3RvcmUgb2JqZWN0ICovCi0gIHJlc3VsdC0+bmV4dCA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgLyogYWRkIHRvIGxpc3Qgb2YgdmlydHVhbCBhcnJheXMgKi8KLSAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gcmVzdWx0OwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1yZWFsaXplX3ZpcnRfYXJyYXlzIChqX2NvbW1vbl9wdHIgY2luZm8pCi0vKiBBbGxvY2F0ZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgZm9yIGFueSB1bnJlYWxpemVkIHZpcnR1YWwgYXJyYXlzICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIGxvbmcgc3BhY2VfcGVyX21pbmhlaWdodCwgbWF4aW11bV9zcGFjZSwgYXZhaWxfbWVtOwotICBsb25nIG1pbmhlaWdodHMsIG1heF9taW5oZWlnaHRzOwotICBqdmlydF9zYXJyYXlfcHRyIHNwdHI7Ci0gIGp2aXJ0X2JhcnJheV9wdHIgYnB0cjsKLQotICAvKiBDb21wdXRlIHRoZSBtaW5pbXVtIHNwYWNlIG5lZWRlZCAobWF4YWNjZXNzIHJvd3MgaW4gZWFjaCBidWZmZXIpCi0gICAqIGFuZCB0aGUgbWF4aW11bSBzcGFjZSBuZWVkZWQgKGZ1bGwgaW1hZ2UgaGVpZ2h0IGluIGVhY2ggYnVmZmVyKS4KLSAgICogVGhlc2UgbWF5IGJlIG9mIHVzZSB0byB0aGUgc3lzdGVtLWRlcGVuZGVudCBqcGVnX21lbV9hdmFpbGFibGUgcm91dGluZS4KLSAgICovCi0gIHNwYWNlX3Blcl9taW5oZWlnaHQgPSAwOwotICBtYXhpbXVtX3NwYWNlID0gMDsKLSAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7Ci0gICAgaWYgKHNwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkgeyAvKiBpZiBub3QgcmVhbGl6ZWQgeWV0ICovCi0gICAgICBzcGFjZV9wZXJfbWluaGVpZ2h0ICs9IChsb25nKSBzcHRyLT5tYXhhY2Nlc3MgKgotCQkJICAgICAobG9uZykgc3B0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKLSAgICAgIG1heGltdW1fc3BhY2UgKz0gKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgKgotCQkgICAgICAgKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKiBTSVpFT0YoSlNBTVBMRSk7Ci0gICAgfQotICB9Ci0gIGZvciAoYnB0ciA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgYnB0ciAhPSBOVUxMOyBicHRyID0gYnB0ci0+bmV4dCkgewotICAgIGlmIChicHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLwotICAgICAgc3BhY2VfcGVyX21pbmhlaWdodCArPSAobG9uZykgYnB0ci0+bWF4YWNjZXNzICoKLQkJCSAgICAgKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOwotICAgICAgbWF4aW11bV9zcGFjZSArPSAobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAqCi0JCSAgICAgICAobG9uZykgYnB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHNwYWNlX3Blcl9taW5oZWlnaHQgPD0gMCkKLSAgICByZXR1cm47CQkJLyogbm8gdW5yZWFsaXplZCBhcnJheXMsIG5vIHdvcmsgKi8KLQotICAvKiBEZXRlcm1pbmUgYW1vdW50IG9mIG1lbW9yeSB0byBhY3R1YWxseSB1c2U7IHRoaXMgaXMgc3lzdGVtLWRlcGVuZGVudC4gKi8KLSAgYXZhaWxfbWVtID0ganBlZ19tZW1fYXZhaWxhYmxlKGNpbmZvLCBzcGFjZV9wZXJfbWluaGVpZ2h0LCBtYXhpbXVtX3NwYWNlLAotCQkJCSBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCk7Ci0KLSAgLyogSWYgdGhlIG1heGltdW0gc3BhY2UgbmVlZGVkIGlzIGF2YWlsYWJsZSwgbWFrZSBhbGwgdGhlIGJ1ZmZlcnMgZnVsbAotICAgKiBoZWlnaHQ7IG90aGVyd2lzZSBwYXJjZWwgaXQgb3V0IHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG1pbmhlaWdodHMKLSAgICogaW4gZWFjaCBidWZmZXIuCi0gICAqLwotICBpZiAoYXZhaWxfbWVtID49IG1heGltdW1fc3BhY2UpCi0gICAgbWF4X21pbmhlaWdodHMgPSAxMDAwMDAwMDAwTDsKLSAgZWxzZSB7Ci0gICAgbWF4X21pbmhlaWdodHMgPSBhdmFpbF9tZW0gLyBzcGFjZV9wZXJfbWluaGVpZ2h0OwotICAgIC8qIElmIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBlbm91Z2ggc3BhY2UsIHRyeSB0byBnZXQgdGhlIG1pbmltdW0KLSAgICAgKiBhbnl3YXkuICBUaGlzIGFsbG93cyBhICJzdHViIiBpbXBsZW1lbnRhdGlvbiBvZiBqcGVnX21lbV9hdmFpbGFibGUoKS4KLSAgICAgKi8KLSAgICBpZiAobWF4X21pbmhlaWdodHMgPD0gMCkKLSAgICAgIG1heF9taW5oZWlnaHRzID0gMTsKLSAgfQotCi0gIC8qIEFsbG9jYXRlIHRoZSBpbi1tZW1vcnkgYnVmZmVycyBhbmQgaW5pdGlhbGl6ZSBiYWNraW5nIHN0b3JlIGFzIG5lZWRlZC4gKi8KLQotICBmb3IgKHNwdHIgPSBtZW0tPnZpcnRfc2FycmF5X2xpc3Q7IHNwdHIgIT0gTlVMTDsgc3B0ciA9IHNwdHItPm5leHQpIHsKLSAgICBpZiAoc3B0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KLSAgICAgIG1pbmhlaWdodHMgPSAoKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgLSAxTCkgLyBzcHRyLT5tYXhhY2Nlc3MgKyAxTDsKLSAgICAgIGlmIChtaW5oZWlnaHRzIDw9IG1heF9taW5oZWlnaHRzKSB7Ci0JLyogVGhpcyBidWZmZXIgZml0cyBpbiBtZW1vcnkgKi8KLQlzcHRyLT5yb3dzX2luX21lbSA9IHNwdHItPnJvd3NfaW5fYXJyYXk7Ci0gICAgICB9IGVsc2UgewotCS8qIEl0IGRvZXNuJ3QgZml0IGluIG1lbW9yeSwgY3JlYXRlIGJhY2tpbmcgc3RvcmUuICovCi0Jc3B0ci0+cm93c19pbl9tZW0gPSAoSkRJTUVOU0lPTikgKG1heF9taW5oZWlnaHRzICogc3B0ci0+bWF4YWNjZXNzKTsKLQlqcGVnX29wZW5fYmFja2luZ19zdG9yZShjaW5mbywgJiBzcHRyLT5iX3NfaW5mbywKLQkJCQkobG9uZykgc3B0ci0+cm93c19pbl9hcnJheSAqCi0JCQkJKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKgotCQkJCShsb25nKSBTSVpFT0YoSlNBTVBMRSkpOwotCXNwdHItPmJfc19vcGVuID0gVFJVRTsKLSAgICAgIH0KLSAgICAgIHNwdHItPm1lbV9idWZmZXIgPSBhbGxvY19zYXJyYXkoY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICAgIHNwdHItPnNhbXBsZXNwZXJyb3csIHNwdHItPnJvd3NfaW5fbWVtKTsKLSAgICAgIHNwdHItPnJvd3NwZXJjaHVuayA9IG1lbS0+bGFzdF9yb3dzcGVyY2h1bms7Ci0gICAgICBzcHRyLT5jdXJfc3RhcnRfcm93ID0gMDsKLSAgICAgIHNwdHItPmZpcnN0X3VuZGVmX3JvdyA9IDA7Ci0gICAgICBzcHRyLT5kaXJ0eSA9IEZBTFNFOwotICAgIH0KLSAgfQotCi0gIGZvciAoYnB0ciA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgYnB0ciAhPSBOVUxMOyBicHRyID0gYnB0ci0+bmV4dCkgewotICAgIGlmIChicHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLwotICAgICAgbWluaGVpZ2h0cyA9ICgobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAtIDFMKSAvIGJwdHItPm1heGFjY2VzcyArIDFMOwotICAgICAgaWYgKG1pbmhlaWdodHMgPD0gbWF4X21pbmhlaWdodHMpIHsKLQkvKiBUaGlzIGJ1ZmZlciBmaXRzIGluIG1lbW9yeSAqLwotCWJwdHItPnJvd3NfaW5fbWVtID0gYnB0ci0+cm93c19pbl9hcnJheTsKLSAgICAgIH0gZWxzZSB7Ci0JLyogSXQgZG9lc24ndCBmaXQgaW4gbWVtb3J5LCBjcmVhdGUgYmFja2luZyBzdG9yZS4gKi8KLQlicHRyLT5yb3dzX2luX21lbSA9IChKRElNRU5TSU9OKSAobWF4X21pbmhlaWdodHMgKiBicHRyLT5tYXhhY2Nlc3MpOwotCWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlKGNpbmZvLCAmIGJwdHItPmJfc19pbmZvLAotCQkJCShsb25nKSBicHRyLT5yb3dzX2luX2FycmF5ICoKLQkJCQkobG9uZykgYnB0ci0+YmxvY2tzcGVycm93ICoKLQkJCQkobG9uZykgU0laRU9GKEpCTE9DSykpOwotCWJwdHItPmJfc19vcGVuID0gVFJVRTsKLSAgICAgIH0KLSAgICAgIGJwdHItPm1lbV9idWZmZXIgPSBhbGxvY19iYXJyYXkoY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICAgIGJwdHItPmJsb2Nrc3BlcnJvdywgYnB0ci0+cm93c19pbl9tZW0pOwotICAgICAgYnB0ci0+cm93c3BlcmNodW5rID0gbWVtLT5sYXN0X3Jvd3NwZXJjaHVuazsKLSAgICAgIGJwdHItPmN1cl9zdGFydF9yb3cgPSAwOwotICAgICAgYnB0ci0+Zmlyc3RfdW5kZWZfcm93ID0gMDsKLSAgICAgIGJwdHItPmRpcnR5ID0gRkFMU0U7Ci0gICAgfQotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWRvX3NhcnJheV9pbyAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9zYXJyYXlfcHRyIHB0ciwgYm9vbGVhbiB3cml0aW5nKQotLyogRG8gYmFja2luZyBzdG9yZSByZWFkIG9yIHdyaXRlIG9mIGEgdmlydHVhbCBzYW1wbGUgYXJyYXkgKi8KLXsKLSAgbG9uZyBieXRlc3BlcnJvdywgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQsIHJvd3MsIHRoaXNyb3csIGk7Ci0KLSAgYnl0ZXNwZXJyb3cgPSAobG9uZykgcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOwotICBmaWxlX29mZnNldCA9IHB0ci0+Y3VyX3N0YXJ0X3JvdyAqIGJ5dGVzcGVycm93OwotICAvKiBMb29wIHRvIHJlYWQgb3Igd3JpdGUgZWFjaCBhbGxvY2F0aW9uIGNodW5rIGluIG1lbV9idWZmZXIgKi8KLSAgZm9yIChpID0gMDsgaSA8IChsb25nKSBwdHItPnJvd3NfaW5fbWVtOyBpICs9IHB0ci0+cm93c3BlcmNodW5rKSB7Ci0gICAgLyogT25lIGNodW5rLCBidXQgY2hlY2sgZm9yIHNob3J0IGNodW5rIGF0IGVuZCBvZiBidWZmZXIgKi8KLSAgICByb3dzID0gTUlOKChsb25nKSBwdHItPnJvd3NwZXJjaHVuaywgKGxvbmcpIHB0ci0+cm93c19pbl9tZW0gLSBpKTsKLSAgICAvKiBUcmFuc2ZlciBubyBtb3JlIHRoYW4gaXMgY3VycmVudGx5IGRlZmluZWQgKi8KLSAgICB0aGlzcm93ID0gKGxvbmcpIHB0ci0+Y3VyX3N0YXJ0X3JvdyArIGk7Ci0gICAgcm93cyA9IE1JTihyb3dzLCAobG9uZykgcHRyLT5maXJzdF91bmRlZl9yb3cgLSB0aGlzcm93KTsKLSAgICAvKiBUcmFuc2ZlciBubyBtb3JlIHRoYW4gZml0cyBpbiBmaWxlICovCi0gICAgcm93cyA9IE1JTihyb3dzLCAobG9uZykgcHRyLT5yb3dzX2luX2FycmF5IC0gdGhpc3Jvdyk7Ci0gICAgaWYgKHJvd3MgPD0gMCkJCS8qIHRoaXMgY2h1bmsgbWlnaHQgYmUgcGFzdCBlbmQgb2YgZmlsZSEgKi8KLSAgICAgIGJyZWFrOwotICAgIGJ5dGVfY291bnQgPSByb3dzICogYnl0ZXNwZXJyb3c7Ci0gICAgaWYgKHdyaXRpbmcpCi0gICAgICAoKnB0ci0+Yl9zX2luZm8ud3JpdGVfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHB0ci0+Yl9zX2luZm8sCi0JCQkJCSAgICAodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW2ldLAotCQkJCQkgICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOwotICAgIGVsc2UKLSAgICAgICgqcHRyLT5iX3NfaW5mby5yZWFkX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAotCQkJCQkgICAodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW2ldLAotCQkJCQkgICBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7Ci0gICAgZmlsZV9vZmZzZXQgKz0gYnl0ZV9jb3VudDsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1kb19iYXJyYXlfaW8gKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciBwdHIsIGJvb2xlYW4gd3JpdGluZykKLS8qIERvIGJhY2tpbmcgc3RvcmUgcmVhZCBvciB3cml0ZSBvZiBhIHZpcnR1YWwgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KLXsKLSAgbG9uZyBieXRlc3BlcnJvdywgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQsIHJvd3MsIHRoaXNyb3csIGk7Ci0KLSAgYnl0ZXNwZXJyb3cgPSAobG9uZykgcHRyLT5ibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKTsKLSAgZmlsZV9vZmZzZXQgPSBwdHItPmN1cl9zdGFydF9yb3cgKiBieXRlc3BlcnJvdzsKLSAgLyogTG9vcCB0byByZWFkIG9yIHdyaXRlIGVhY2ggYWxsb2NhdGlvbiBjaHVuayBpbiBtZW1fYnVmZmVyICovCi0gIGZvciAoaSA9IDA7IGkgPCAobG9uZykgcHRyLT5yb3dzX2luX21lbTsgaSArPSBwdHItPnJvd3NwZXJjaHVuaykgewotICAgIC8qIE9uZSBjaHVuaywgYnV0IGNoZWNrIGZvciBzaG9ydCBjaHVuayBhdCBlbmQgb2YgYnVmZmVyICovCi0gICAgcm93cyA9IE1JTigobG9uZykgcHRyLT5yb3dzcGVyY2h1bmssIChsb25nKSBwdHItPnJvd3NfaW5fbWVtIC0gaSk7Ci0gICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGlzIGN1cnJlbnRseSBkZWZpbmVkICovCi0gICAgdGhpc3JvdyA9IChsb25nKSBwdHItPmN1cl9zdGFydF9yb3cgKyBpOwotICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+Zmlyc3RfdW5kZWZfcm93IC0gdGhpc3Jvdyk7Ci0gICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGZpdHMgaW4gZmlsZSAqLwotICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+cm93c19pbl9hcnJheSAtIHRoaXNyb3cpOwotICAgIGlmIChyb3dzIDw9IDApCQkvKiB0aGlzIGNodW5rIG1pZ2h0IGJlIHBhc3QgZW5kIG9mIGZpbGUhICovCi0gICAgICBicmVhazsKLSAgICBieXRlX2NvdW50ID0gcm93cyAqIGJ5dGVzcGVycm93OwotICAgIGlmICh3cml0aW5nKQotICAgICAgKCpwdHItPmJfc19pbmZvLndyaXRlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAotCQkJCQkgICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKLQkJCQkJICAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKLSAgICBlbHNlCi0gICAgICAoKnB0ci0+Yl9zX2luZm8ucmVhZF9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKLQkJCQkJICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKLQkJCQkJICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOwotICAgIGZpbGVfb2Zmc2V0ICs9IGJ5dGVfY291bnQ7Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYoSlNBTVBBUlJBWSkKLWFjY2Vzc192aXJ0X3NhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9zYXJyYXlfcHRyIHB0ciwKLQkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIG51bV9yb3dzLAotCQkgICAgYm9vbGVhbiB3cml0YWJsZSkKLS8qIEFjY2VzcyB0aGUgcGFydCBvZiBhIHZpcnR1YWwgc2FtcGxlIGFycmF5IHN0YXJ0aW5nIGF0IHN0YXJ0X3JvdyAqLwotLyogYW5kIGV4dGVuZGluZyBmb3IgbnVtX3Jvd3Mgcm93cy4gIHdyaXRhYmxlIGlzIHRydWUgaWYgICovCi0vKiBjYWxsZXIgaW50ZW5kcyB0byBtb2RpZnkgdGhlIGFjY2Vzc2VkIGFyZWEuICovCi17Ci0gIEpESU1FTlNJT04gZW5kX3JvdyA9IHN0YXJ0X3JvdyArIG51bV9yb3dzOwotICBKRElNRU5TSU9OIHVuZGVmX3JvdzsKLQotICAvKiBkZWJ1Z2dpbmcgY2hlY2sgKi8KLSAgaWYgKGVuZF9yb3cgPiBwdHItPnJvd3NfaW5fYXJyYXkgfHwgbnVtX3Jvd3MgPiBwdHItPm1heGFjY2VzcyB8fAotICAgICAgcHRyLT5tZW1fYnVmZmVyID09IE5VTEwpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOwotCi0gIC8qIE1ha2UgdGhlIGRlc2lyZWQgcGFydCBvZiB0aGUgdmlydHVhbCBhcnJheSBhY2Nlc3NpYmxlICovCi0gIGlmIChzdGFydF9yb3cgPCBwdHItPmN1cl9zdGFydF9yb3cgfHwKLSAgICAgIGVuZF9yb3cgPiBwdHItPmN1cl9zdGFydF9yb3crcHRyLT5yb3dzX2luX21lbSkgewotICAgIGlmICghIHB0ci0+Yl9zX29wZW4pCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1ZJUlRVQUxfQlVHKTsKLSAgICAvKiBGbHVzaCBvbGQgYnVmZmVyIGNvbnRlbnRzIGlmIG5lY2Vzc2FyeSAqLwotICAgIGlmIChwdHItPmRpcnR5KSB7Ci0gICAgICBkb19zYXJyYXlfaW8oY2luZm8sIHB0ciwgVFJVRSk7Ci0gICAgICBwdHItPmRpcnR5ID0gRkFMU0U7Ci0gICAgfQotICAgIC8qIERlY2lkZSB3aGF0IHBhcnQgb2YgdmlydHVhbCBhcnJheSB0byBhY2Nlc3MuCi0gICAgICogQWxnb3JpdGhtOiBpZiB0YXJnZXQgYWRkcmVzcyA+IGN1cnJlbnQgd2luZG93LCBhc3N1bWUgZm9yd2FyZCBzY2FuLAotICAgICAqIGxvYWQgc3RhcnRpbmcgYXQgdGFyZ2V0IGFkZHJlc3MuICBJZiB0YXJnZXQgYWRkcmVzcyA8IGN1cnJlbnQgd2luZG93LAotICAgICAqIGFzc3VtZSBiYWNrd2FyZCBzY2FuLCBsb2FkIHNvIHRoYXQgdGFyZ2V0IGFyZWEgaXMgdG9wIG9mIHdpbmRvdy4KLSAgICAgKiBOb3RlIHRoYXQgd2hlbiBzd2l0Y2hpbmcgZnJvbSBmb3J3YXJkIHdyaXRlIHRvIGZvcndhcmQgcmVhZCwgd2lsbCBoYXZlCi0gICAgICogc3RhcnRfcm93ID0gMCwgc28gdGhlIGxpbWl0aW5nIGNhc2UgYXBwbGllcyBhbmQgd2UgbG9hZCBmcm9tIDAgYW55d2F5LgotICAgICAqLwotICAgIGlmIChzdGFydF9yb3cgPiBwdHItPmN1cl9zdGFydF9yb3cpIHsKLSAgICAgIHB0ci0+Y3VyX3N0YXJ0X3JvdyA9IHN0YXJ0X3JvdzsKLSAgICB9IGVsc2UgewotICAgICAgLyogdXNlIGxvbmcgYXJpdGhtZXRpYyBoZXJlIHRvIGF2b2lkIG92ZXJmbG93ICYgdW5zaWduZWQgcHJvYmxlbXMgKi8KLSAgICAgIGxvbmcgbHRlbXA7Ci0KLSAgICAgIGx0ZW1wID0gKGxvbmcpIGVuZF9yb3cgLSAobG9uZykgcHRyLT5yb3dzX2luX21lbTsKLSAgICAgIGlmIChsdGVtcCA8IDApCi0JbHRlbXAgPSAwOwkJLyogZG9uJ3QgZmFsbCBvZmYgZnJvbnQgZW5kIG9mIGZpbGUgKi8KLSAgICAgIHB0ci0+Y3VyX3N0YXJ0X3JvdyA9IChKRElNRU5TSU9OKSBsdGVtcDsKLSAgICB9Ci0gICAgLyogUmVhZCBpbiB0aGUgc2VsZWN0ZWQgcGFydCBvZiB0aGUgYXJyYXkuCi0gICAgICogRHVyaW5nIHRoZSBpbml0aWFsIHdyaXRlIHBhc3MsIHdlIHdpbGwgZG8gbm8gYWN0dWFsIHJlYWQKLSAgICAgKiBiZWNhdXNlIHRoZSBzZWxlY3RlZCBwYXJ0IGlzIGFsbCB1bmRlZmluZWQuCi0gICAgICovCi0gICAgZG9fc2FycmF5X2lvKGNpbmZvLCBwdHIsIEZBTFNFKTsKLSAgfQotICAvKiBFbnN1cmUgdGhlIGFjY2Vzc2VkIHBhcnQgb2YgdGhlIGFycmF5IGlzIGRlZmluZWQ7IHByZXplcm8gaWYgbmVlZGVkLgotICAgKiBUbyBpbXByb3ZlIGxvY2FsaXR5IG9mIGFjY2Vzcywgd2Ugb25seSBwcmV6ZXJvIHRoZSBwYXJ0IG9mIHRoZSBhcnJheQotICAgKiB0aGF0IHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gYWNjZXNzLCBub3QgdGhlIGVudGlyZSBpbi1tZW1vcnkgYXJyYXkuCi0gICAqLwotICBpZiAocHRyLT5maXJzdF91bmRlZl9yb3cgPCBlbmRfcm93KSB7Ci0gICAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgc3RhcnRfcm93KSB7Ci0gICAgICBpZiAod3JpdGFibGUpCQkvKiB3cml0ZXIgc2tpcHBlZCBvdmVyIGEgc2VjdGlvbiBvZiBhcnJheSAqLwotCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKLSAgICAgIHVuZGVmX3JvdyA9IHN0YXJ0X3JvdzsJLyogYnV0IHJlYWRlciBpcyBhbGxvd2VkIHRvIHJlYWQgYWhlYWQgKi8KLSAgICB9IGVsc2UgewotICAgICAgdW5kZWZfcm93ID0gcHRyLT5maXJzdF91bmRlZl9yb3c7Ci0gICAgfQotICAgIGlmICh3cml0YWJsZSkKLSAgICAgIHB0ci0+Zmlyc3RfdW5kZWZfcm93ID0gZW5kX3JvdzsKLSAgICBpZiAocHRyLT5wcmVfemVybykgewotICAgICAgc2l6ZV90IGJ5dGVzcGVycm93ID0gKHNpemVfdCkgcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOwotICAgICAgdW5kZWZfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsgLyogbWFrZSBpbmRleGVzIHJlbGF0aXZlIHRvIGJ1ZmZlciAqLwotICAgICAgZW5kX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7Ci0gICAgICB3aGlsZSAodW5kZWZfcm93IDwgZW5kX3JvdykgewotCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW3VuZGVmX3Jvd10sIGJ5dGVzcGVycm93KTsKLQl1bmRlZl9yb3crKzsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKCEgd3JpdGFibGUpCQkvKiByZWFkZXIgbG9va2luZyBhdCB1bmRlZmluZWQgZGF0YSAqLwotCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKLSAgICB9Ci0gIH0KLSAgLyogRmxhZyB0aGUgYnVmZmVyIGRpcnR5IGlmIGNhbGxlciB3aWxsIHdyaXRlIGluIGl0ICovCi0gIGlmICh3cml0YWJsZSkKLSAgICBwdHItPmRpcnR5ID0gVFJVRTsKLSAgLyogUmV0dXJuIGFkZHJlc3Mgb2YgcHJvcGVyIHBhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICByZXR1cm4gcHRyLT5tZW1fYnVmZmVyICsgKHN0YXJ0X3JvdyAtIHB0ci0+Y3VyX3N0YXJ0X3Jvdyk7Ci19Ci0KLQotTUVUSE9EREVGKEpCTE9DS0FSUkFZKQotYWNjZXNzX3ZpcnRfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgcHRyLAotCQkgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gbnVtX3Jvd3MsCi0JCSAgICBib29sZWFuIHdyaXRhYmxlKQotLyogQWNjZXNzIHRoZSBwYXJ0IG9mIGEgdmlydHVhbCBibG9jayBhcnJheSBzdGFydGluZyBhdCBzdGFydF9yb3cgKi8KLS8qIGFuZCBleHRlbmRpbmcgZm9yIG51bV9yb3dzIHJvd3MuICB3cml0YWJsZSBpcyB0cnVlIGlmICAqLwotLyogY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5IHRoZSBhY2Nlc3NlZCBhcmVhLiAqLwotewotICBKRElNRU5TSU9OIGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKLSAgSkRJTUVOU0lPTiB1bmRlZl9yb3c7Ci0KLSAgLyogZGVidWdnaW5nIGNoZWNrICovCi0gIGlmIChlbmRfcm93ID4gcHRyLT5yb3dzX2luX2FycmF5IHx8IG51bV9yb3dzID4gcHRyLT5tYXhhY2Nlc3MgfHwKLSAgICAgIHB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKLQotICAvKiBNYWtlIHRoZSBkZXNpcmVkIHBhcnQgb2YgdGhlIHZpcnR1YWwgYXJyYXkgYWNjZXNzaWJsZSAqLwotICBpZiAoc3RhcnRfcm93IDwgcHRyLT5jdXJfc3RhcnRfcm93IHx8Ci0gICAgICBlbmRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93K3B0ci0+cm93c19pbl9tZW0pIHsKLSAgICBpZiAoISBwdHItPmJfc19vcGVuKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9WSVJUVUFMX0JVRyk7Ci0gICAgLyogRmx1c2ggb2xkIGJ1ZmZlciBjb250ZW50cyBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAocHRyLT5kaXJ0eSkgewotICAgICAgZG9fYmFycmF5X2lvKGNpbmZvLCBwdHIsIFRSVUUpOwotICAgICAgcHRyLT5kaXJ0eSA9IEZBTFNFOwotICAgIH0KLSAgICAvKiBEZWNpZGUgd2hhdCBwYXJ0IG9mIHZpcnR1YWwgYXJyYXkgdG8gYWNjZXNzLgotICAgICAqIEFsZ29yaXRobTogaWYgdGFyZ2V0IGFkZHJlc3MgPiBjdXJyZW50IHdpbmRvdywgYXNzdW1lIGZvcndhcmQgc2NhbiwKLSAgICAgKiBsb2FkIHN0YXJ0aW5nIGF0IHRhcmdldCBhZGRyZXNzLiAgSWYgdGFyZ2V0IGFkZHJlc3MgPCBjdXJyZW50IHdpbmRvdywKLSAgICAgKiBhc3N1bWUgYmFja3dhcmQgc2NhbiwgbG9hZCBzbyB0aGF0IHRhcmdldCBhcmVhIGlzIHRvcCBvZiB3aW5kb3cuCi0gICAgICogTm90ZSB0aGF0IHdoZW4gc3dpdGNoaW5nIGZyb20gZm9yd2FyZCB3cml0ZSB0byBmb3J3YXJkIHJlYWQsIHdpbGwgaGF2ZQotICAgICAqIHN0YXJ0X3JvdyA9IDAsIHNvIHRoZSBsaW1pdGluZyBjYXNlIGFwcGxpZXMgYW5kIHdlIGxvYWQgZnJvbSAwIGFueXdheS4KLSAgICAgKi8KLSAgICBpZiAoc3RhcnRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93KSB7Ci0gICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSBzdGFydF9yb3c7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHVzZSBsb25nIGFyaXRobWV0aWMgaGVyZSB0byBhdm9pZCBvdmVyZmxvdyAmIHVuc2lnbmVkIHByb2JsZW1zICovCi0gICAgICBsb25nIGx0ZW1wOwotCi0gICAgICBsdGVtcCA9IChsb25nKSBlbmRfcm93IC0gKGxvbmcpIHB0ci0+cm93c19pbl9tZW07Ci0gICAgICBpZiAobHRlbXAgPCAwKQotCWx0ZW1wID0gMDsJCS8qIGRvbid0IGZhbGwgb2ZmIGZyb250IGVuZCBvZiBmaWxlICovCi0gICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSAoSkRJTUVOU0lPTikgbHRlbXA7Ci0gICAgfQotICAgIC8qIFJlYWQgaW4gdGhlIHNlbGVjdGVkIHBhcnQgb2YgdGhlIGFycmF5LgotICAgICAqIER1cmluZyB0aGUgaW5pdGlhbCB3cml0ZSBwYXNzLCB3ZSB3aWxsIGRvIG5vIGFjdHVhbCByZWFkCi0gICAgICogYmVjYXVzZSB0aGUgc2VsZWN0ZWQgcGFydCBpcyBhbGwgdW5kZWZpbmVkLgotICAgICAqLwotICAgIGRvX2JhcnJheV9pbyhjaW5mbywgcHRyLCBGQUxTRSk7Ci0gIH0KLSAgLyogRW5zdXJlIHRoZSBhY2Nlc3NlZCBwYXJ0IG9mIHRoZSBhcnJheSBpcyBkZWZpbmVkOyBwcmV6ZXJvIGlmIG5lZWRlZC4KLSAgICogVG8gaW1wcm92ZSBsb2NhbGl0eSBvZiBhY2Nlc3MsIHdlIG9ubHkgcHJlemVybyB0aGUgcGFydCBvZiB0aGUgYXJyYXkKLSAgICogdGhhdCB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGFjY2Vzcywgbm90IHRoZSBlbnRpcmUgaW4tbWVtb3J5IGFycmF5LgotICAgKi8KLSAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgZW5kX3JvdykgewotICAgIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IHN0YXJ0X3JvdykgewotICAgICAgaWYgKHdyaXRhYmxlKQkJLyogd3JpdGVyIHNraXBwZWQgb3ZlciBhIHNlY3Rpb24gb2YgYXJyYXkgKi8KLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7Ci0gICAgICB1bmRlZl9yb3cgPSBzdGFydF9yb3c7CS8qIGJ1dCByZWFkZXIgaXMgYWxsb3dlZCB0byByZWFkIGFoZWFkICovCi0gICAgfSBlbHNlIHsKLSAgICAgIHVuZGVmX3JvdyA9IHB0ci0+Zmlyc3RfdW5kZWZfcm93OwotICAgIH0KLSAgICBpZiAod3JpdGFibGUpCi0gICAgICBwdHItPmZpcnN0X3VuZGVmX3JvdyA9IGVuZF9yb3c7Ci0gICAgaWYgKHB0ci0+cHJlX3plcm8pIHsKLSAgICAgIHNpemVfdCBieXRlc3BlcnJvdyA9IChzaXplX3QpIHB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7Ci0gICAgICB1bmRlZl9yb3cgLT0gcHRyLT5jdXJfc3RhcnRfcm93OyAvKiBtYWtlIGluZGV4ZXMgcmVsYXRpdmUgdG8gYnVmZmVyICovCi0gICAgICBlbmRfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsKLSAgICAgIHdoaWxlICh1bmRlZl9yb3cgPCBlbmRfcm93KSB7Ci0Janplcm9fZmFyKCh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbdW5kZWZfcm93XSwgYnl0ZXNwZXJyb3cpOwotCXVuZGVmX3JvdysrOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoISB3cml0YWJsZSkJCS8qIHJlYWRlciBsb29raW5nIGF0IHVuZGVmaW5lZCBkYXRhICovCi0JRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOwotICAgIH0KLSAgfQotICAvKiBGbGFnIHRoZSBidWZmZXIgZGlydHkgaWYgY2FsbGVyIHdpbGwgd3JpdGUgaW4gaXQgKi8KLSAgaWYgKHdyaXRhYmxlKQotICAgIHB0ci0+ZGlydHkgPSBUUlVFOwotICAvKiBSZXR1cm4gYWRkcmVzcyBvZiBwcm9wZXIgcGFydCBvZiB0aGUgYnVmZmVyICovCi0gIHJldHVybiBwdHItPm1lbV9idWZmZXIgKyAoc3RhcnRfcm93IC0gcHRyLT5jdXJfc3RhcnRfcm93KTsKLX0KLQotCi0vKgotICogUmVsZWFzZSBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gYSBzcGVjaWZpZWQgcG9vbC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZyZWVfcG9vbCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkKLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAgc21hbGxfcG9vbF9wdHIgc2hkcl9wdHI7Ci0gIGxhcmdlX3Bvb2xfcHRyIGxoZHJfcHRyOwotICBzaXplX3Qgc3BhY2VfZnJlZWQ7Ci0KLSAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KLQotI2lmZGVmIE1FTV9TVEFUUwotICBpZiAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPiAxKQotICAgIHByaW50X21lbV9zdGF0cyhjaW5mbywgcG9vbF9pZCk7IC8qIHByaW50IHBvb2wncyBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljcyAqLwotI2VuZGlmCi0KLSAgLyogSWYgZnJlZWluZyBJTUFHRSBwb29sLCBjbG9zZSBhbnkgdmlydHVhbCBhcnJheXMgZmlyc3QgKi8KLSAgaWYgKHBvb2xfaWQgPT0gSlBPT0xfSU1BR0UpIHsKLSAgICBqdmlydF9zYXJyYXlfcHRyIHNwdHI7Ci0gICAganZpcnRfYmFycmF5X3B0ciBicHRyOwotCi0gICAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7Ci0gICAgICBpZiAoc3B0ci0+Yl9zX29wZW4pIHsJLyogdGhlcmUgbWF5IGJlIG5vIGJhY2tpbmcgc3RvcmUgKi8KLQlzcHRyLT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBwcmV2ZW50IHJlY3Vyc2l2ZSBjbG9zZSBpZiBlcnJvciAqLwotCSgqc3B0ci0+Yl9zX2luZm8uY2xvc2VfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHNwdHItPmJfc19pbmZvKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gTlVMTDsKLSAgICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKLSAgICAgIGlmIChicHRyLT5iX3Nfb3BlbikgewkvKiB0aGVyZSBtYXkgYmUgbm8gYmFja2luZyBzdG9yZSAqLwotCWJwdHItPmJfc19vcGVuID0gRkFMU0U7CS8qIHByZXZlbnQgcmVjdXJzaXZlIGNsb3NlIGlmIGVycm9yICovCi0JKCpicHRyLT5iX3NfaW5mby5jbG9zZV9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgYnB0ci0+Yl9zX2luZm8pOwotICAgICAgfQotICAgIH0KLSAgICBtZW0tPnZpcnRfYmFycmF5X2xpc3QgPSBOVUxMOwotICB9Ci0KLSAgLyogUmVsZWFzZSBsYXJnZSBvYmplY3RzICovCi0gIGxoZHJfcHRyID0gbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdOwotICBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF0gPSBOVUxMOwotCi0gIHdoaWxlIChsaGRyX3B0ciAhPSBOVUxMKSB7Ci0gICAgbGFyZ2VfcG9vbF9wdHIgbmV4dF9saGRyX3B0ciA9IGxoZHJfcHRyLT5oZHIubmV4dDsKLSAgICBzcGFjZV9mcmVlZCA9IGxoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArCi0JCSAgbGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ICsKLQkJICBTSVpFT0YobGFyZ2VfcG9vbF9oZHIpOwotICAgIGpwZWdfZnJlZV9sYXJnZShjaW5mbywgKHZvaWQgRkFSICopIGxoZHJfcHRyLCBzcGFjZV9mcmVlZCk7Ci0gICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgLT0gc3BhY2VfZnJlZWQ7Ci0gICAgbGhkcl9wdHIgPSBuZXh0X2xoZHJfcHRyOwotICB9Ci0KLSAgLyogUmVsZWFzZSBzbWFsbCBvYmplY3RzICovCi0gIHNoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOwotICBtZW0tPnNtYWxsX2xpc3RbcG9vbF9pZF0gPSBOVUxMOwotCi0gIHdoaWxlIChzaGRyX3B0ciAhPSBOVUxMKSB7Ci0gICAgc21hbGxfcG9vbF9wdHIgbmV4dF9zaGRyX3B0ciA9IHNoZHJfcHRyLT5oZHIubmV4dDsKLSAgICBzcGFjZV9mcmVlZCA9IHNoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArCi0JCSAgc2hkcl9wdHItPmhkci5ieXRlc19sZWZ0ICsKLQkJICBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpOwotICAgIGpwZWdfZnJlZV9zbWFsbChjaW5mbywgKHZvaWQgKikgc2hkcl9wdHIsIHNwYWNlX2ZyZWVkKTsKLSAgICBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCAtPSBzcGFjZV9mcmVlZDsKLSAgICBzaGRyX3B0ciA9IG5leHRfc2hkcl9wdHI7Ci0gIH0KLX0KLQotCi0vKgotICogQ2xvc2UgdXAgc2hvcCBlbnRpcmVseS4KLSAqIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCBiZSBjYWxsZWQgdW5sZXNzIGNpbmZvLT5tZW0gaXMgbm9uLU5VTEwuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zZWxmX2Rlc3RydWN0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIGludCBwb29sOwotCi0gIC8qIENsb3NlIGFsbCBiYWNraW5nIHN0b3JlLCByZWxlYXNlIGFsbCBtZW1vcnkuCi0gICAqIFJlbGVhc2luZyBwb29scyBpbiByZXZlcnNlIG9yZGVyIG1pZ2h0IGhlbHAgYXZvaWQgZnJhZ21lbnRhdGlvbgotICAgKiB3aXRoIHNvbWUgKGJyYWluLWRhbWFnZWQpIG1hbGxvYyBsaWJyYXJpZXMuCi0gICAqLwotICBmb3IgKHBvb2wgPSBKUE9PTF9OVU1QT09MUy0xOyBwb29sID49IEpQT09MX1BFUk1BTkVOVDsgcG9vbC0tKSB7Ci0gICAgZnJlZV9wb29sKGNpbmZvLCBwb29sKTsKLSAgfQotCi0gIC8qIFJlbGVhc2UgdGhlIG1lbW9yeSBtYW5hZ2VyIGNvbnRyb2wgYmxvY2sgdG9vLiAqLwotICBqcGVnX2ZyZWVfc21hbGwoY2luZm8sICh2b2lkICopIGNpbmZvLT5tZW0sIFNJWkVPRihteV9tZW1vcnlfbWdyKSk7Ci0gIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogZW5zdXJlcyBJIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSAqLwotCi0gIGpwZWdfbWVtX3Rlcm0oY2luZm8pOwkJLyogc3lzdGVtLWRlcGVuZGVudCBjbGVhbnVwICovCi19Ci0KLQotLyoKLSAqIE1lbW9yeSBtYW5hZ2VyIGluaXRpYWxpemF0aW9uLgotICogV2hlbiB0aGlzIGlzIGNhbGxlZCwgb25seSB0aGUgZXJyb3IgbWFuYWdlciBwb2ludGVyIGlzIHZhbGlkIGluIGNpbmZvIQotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfbWVtb3J5X21nciAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBteV9tZW1fcHRyIG1lbTsKLSAgbG9uZyBtYXhfdG9fdXNlOwotICBpbnQgcG9vbDsKLSAgc2l6ZV90IHRlc3RfbWFjOwotCi0gIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogZm9yIHNhZmV0eSBpZiBpbml0IGZhaWxzICovCi0KLSAgLyogQ2hlY2sgZm9yIGNvbmZpZ3VyYXRpb24gZXJyb3JzLgotICAgKiBTSVpFT0YoQUxJR05fVFlQRSkgc2hvdWxkIGJlIGEgcG93ZXIgb2YgMjsgb3RoZXJ3aXNlLCBpdCBwcm9iYWJseQotICAgKiBkb2Vzbid0IHJlZmxlY3QgYW55IHJlYWwgaGFyZHdhcmUgYWxpZ25tZW50IHJlcXVpcmVtZW50LgotICAgKiBUaGUgdGVzdCBpcyBhIGxpdHRsZSB0cmlja3k6IGZvciBYPjAsIFggYW5kIFgtMSBoYXZlIG5vIG9uZS1iaXRzCi0gICAqIGluIGNvbW1vbiBpZiBhbmQgb25seSBpZiBYIGlzIGEgcG93ZXIgb2YgMiwgaWUgaGFzIG9ubHkgb25lIG9uZS1iaXQuCi0gICAqIFNvbWUgY29tcGlsZXJzIG1heSBnaXZlIGFuICJ1bnJlYWNoYWJsZSBjb2RlIiB3YXJuaW5nIGhlcmU7IGlnbm9yZSBpdC4KLSAgICovCi0gIGlmICgoU0laRU9GKEFMSUdOX1RZUEUpICYgKFNJWkVPRihBTElHTl9UWVBFKS0xKSkgIT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9BTElHTl9UWVBFKTsKLSAgLyogTUFYX0FMTE9DX0NIVU5LIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyB0eXBlIHNpemVfdCwgYW5kIG11c3QgYmUKLSAgICogYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkuCi0gICAqIEFnYWluLCBhbiAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZyBtYXkgYmUgaWdub3JlZCBoZXJlLgotICAgKiBCdXQgYSAiY29uc3RhbnQgdG9vIGxhcmdlIiB3YXJuaW5nIG1lYW5zIHlvdSBuZWVkIHRvIGZpeCBNQVhfQUxMT0NfQ0hVTksuCi0gICAqLwotICB0ZXN0X21hYyA9IChzaXplX3QpIE1BWF9BTExPQ19DSFVOSzsKLSAgaWYgKChsb25nKSB0ZXN0X21hYyAhPSBNQVhfQUxMT0NfQ0hVTksgfHwKLSAgICAgIChNQVhfQUxMT0NfQ0hVTksgJSBTSVpFT0YoQUxJR05fVFlQRSkpICE9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxMT0NfQ0hVTkspOwotCi0gIG1heF90b191c2UgPSBqcGVnX21lbV9pbml0KGNpbmZvKTsgLyogc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiAqLwotCi0gIC8qIEF0dGVtcHQgdG8gYWxsb2NhdGUgbWVtb3J5IG1hbmFnZXIncyBjb250cm9sIGJsb2NrICovCi0gIG1lbSA9IChteV9tZW1fcHRyKSBqcGVnX2dldF9zbWFsbChjaW5mbywgU0laRU9GKG15X21lbW9yeV9tZ3IpKTsKLQotICBpZiAobWVtID09IE5VTEwpIHsKLSAgICBqcGVnX21lbV90ZXJtKGNpbmZvKTsJLyogc3lzdGVtLWRlcGVuZGVudCBjbGVhbnVwICovCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfT1VUX09GX01FTU9SWSwgMCk7Ci0gIH0KLQotICAvKiBPSywgZmlsbCBpbiB0aGUgbWV0aG9kIHBvaW50ZXJzICovCi0gIG1lbS0+cHViLmFsbG9jX3NtYWxsID0gYWxsb2Nfc21hbGw7Ci0gIG1lbS0+cHViLmFsbG9jX2xhcmdlID0gYWxsb2NfbGFyZ2U7Ci0gIG1lbS0+cHViLmFsbG9jX3NhcnJheSA9IGFsbG9jX3NhcnJheTsKLSAgbWVtLT5wdWIuYWxsb2NfYmFycmF5ID0gYWxsb2NfYmFycmF5OwotICBtZW0tPnB1Yi5yZXF1ZXN0X3ZpcnRfc2FycmF5ID0gcmVxdWVzdF92aXJ0X3NhcnJheTsKLSAgbWVtLT5wdWIucmVxdWVzdF92aXJ0X2JhcnJheSA9IHJlcXVlc3RfdmlydF9iYXJyYXk7Ci0gIG1lbS0+cHViLnJlYWxpemVfdmlydF9hcnJheXMgPSByZWFsaXplX3ZpcnRfYXJyYXlzOwotICBtZW0tPnB1Yi5hY2Nlc3NfdmlydF9zYXJyYXkgPSBhY2Nlc3NfdmlydF9zYXJyYXk7Ci0gIG1lbS0+cHViLmFjY2Vzc192aXJ0X2JhcnJheSA9IGFjY2Vzc192aXJ0X2JhcnJheTsKLSAgbWVtLT5wdWIuZnJlZV9wb29sID0gZnJlZV9wb29sOwotICBtZW0tPnB1Yi5zZWxmX2Rlc3RydWN0ID0gc2VsZl9kZXN0cnVjdDsKLQotICAvKiBNYWtlIE1BWF9BTExPQ19DSFVOSyBhY2Nlc3NpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KLSAgbWVtLT5wdWIubWF4X2FsbG9jX2NodW5rID0gTUFYX0FMTE9DX0NIVU5LOwotCi0gIC8qIEluaXRpYWxpemUgd29ya2luZyBzdGF0ZSAqLwotICBtZW0tPnB1Yi5tYXhfbWVtb3J5X3RvX3VzZSA9IG1heF90b191c2U7Ci0KLSAgZm9yIChwb29sID0gSlBPT0xfTlVNUE9PTFMtMTsgcG9vbCA+PSBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgewotICAgIG1lbS0+c21hbGxfbGlzdFtwb29sXSA9IE5VTEw7Ci0gICAgbWVtLT5sYXJnZV9saXN0W3Bvb2xdID0gTlVMTDsKLSAgfQotICBtZW0tPnZpcnRfc2FycmF5X2xpc3QgPSBOVUxMOwotICBtZW0tPnZpcnRfYmFycmF5X2xpc3QgPSBOVUxMOwotCi0gIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkID0gU0laRU9GKG15X21lbW9yeV9tZ3IpOwotCi0gIC8qIERlY2xhcmUgb3Vyc2VsdmVzIG9wZW4gZm9yIGJ1c2luZXNzICovCi0gIGNpbmZvLT5tZW0gPSAmIG1lbS0+cHViOwotCi0gIC8qIENoZWNrIGZvciBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBKUEVHTUVNOyBpZiBmb3VuZCwgb3ZlcnJpZGUgdGhlCi0gICAqIGRlZmF1bHQgbWF4X21lbW9yeSBzZXR0aW5nIGZyb20ganBlZ19tZW1faW5pdC4gIE5vdGUgdGhhdCB0aGUKLSAgICogc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IGFnYWluIG92ZXJyaWRlIHRoaXMgdmFsdWUuCi0gICAqIElmIHlvdXIgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBnZXRlbnYoKSwgZGVmaW5lIE5PX0dFVEVOViB0byBkaXNhYmxlCi0gICAqIHRoaXMgZmVhdHVyZS4KLSAgICovCi0jaWZuZGVmIE5PX0dFVEVOVgotICB7IGNoYXIgKiBtZW1lbnY7Ci0KLSAgICBpZiAoKG1lbWVudiA9IGdldGVudigiSlBFR01FTSIpKSAhPSBOVUxMKSB7Ci0gICAgICBjaGFyIGNoID0gJ3gnOwotCi0gICAgICBpZiAoc3NjYW5mKG1lbWVudiwgIiVsZCVjIiwgJm1heF90b191c2UsICZjaCkgPiAwKSB7Ci0JaWYgKGNoID09ICdtJyB8fCBjaCA9PSAnTScpCi0JICBtYXhfdG9fdXNlICo9IDEwMDBMOwotCW1lbS0+cHViLm1heF9tZW1vcnlfdG9fdXNlID0gbWF4X3RvX3VzZSAqIDEwMDBMOwotICAgICAgfQotICAgIH0KLSAgfQotI2VuZGlmCi0KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ptZW1uYW1lLmMgYi9saWJqcGVndHdycC9qbWVtbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDk2ZGVlLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ptZW1uYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIGptZW1uYW1lLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS1kZXBlbmRlbnQKLSAqIHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdAotICogeW91IG11c3QgZXhwbGljaXRseSBjb25zdHJ1Y3QgYSBuYW1lIGZvciBlYWNoIHRlbXAgZmlsZS4KLSAqIEFsc28sIHRoZSBwcm9ibGVtIG9mIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZQotICogaXMgc2hvdmVkIG9udG8gdGhlIHVzZXIuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KLQotI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIG1hbGxvYygpLGZyZWUoKSAqLwotZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOwotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQJCS8qIHByZS1BTlNJIHN5c3RlbXMgbWF5IG5vdCBkZWZpbmUgdGhpczsgKi8KLSNkZWZpbmUgU0VFS19TRVQgIDAJCS8qIGlmIG5vdCwgYXNzdW1lIDAgaXMgY29ycmVjdCAqLwotI2VuZGlmCi0KLSNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCi0jZGVmaW5lIFJXX0JJTkFSWQkidysiCi0jZWxzZQotI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgotI2RlZmluZSBSV19CSU5BUlkJIncrYiIsICJjdHg9c3RtIgotI2Vsc2UJCQkJLyogc3RhbmRhcmQgQU5TSS1jb21wbGlhbnQgY2FzZSAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCi0jZGVmaW5lIFJXX0JJTkFSWQkidytiIgotI2VuZGlmCi0jZW5kaWYKLQotCi0vKgotICogU2VsZWN0aW9uIG9mIGEgZmlsZSBuYW1lIGZvciBhIHRlbXBvcmFyeSBmaWxlLgotICogVGhpcyBpcyBzeXN0ZW0tZGVwZW5kZW50IQotICoKLSAqIFRoZSBjb2RlIGFzIGdpdmVuIGlzIHN1aXRhYmxlIGZvciBtb3N0IFVuaXggc3lzdGVtcywgYW5kIGl0IGlzIGVhc2lseQotICogbW9kaWZpZWQgZm9yIG1vc3Qgbm9uLVVuaXggc3lzdGVtcy4gIFNvbWUgbm90ZXM6Ci0gKiAgMS4gIFRoZSB0ZW1wIGZpbGUgaXMgY3JlYXRlZCBpbiB0aGUgZGlyZWN0b3J5IG5hbWVkIGJ5IFRFTVBfRElSRUNUT1JZLgotICogICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAvdXNyL3RtcCwgd2hpY2ggaXMgdGhlIGNvbnZlbnRpb25hbCBwbGFjZSBmb3IKLSAqICAgICAgY3JlYXRpbmcgbGFyZ2UgdGVtcCBmaWxlcyBvbiBVbml4LiAgT24gb3RoZXIgc3lzdGVtcyB5b3UnbGwgcHJvYmFibHkKLSAqICAgICAgd2FudCB0byBjaGFuZ2UgdGhlIGZpbGUgbG9jYXRpb24uICBZb3UgY2FuIGRvIHRoaXMgYnkgZWRpdGluZyB0aGUKLSAqICAgICAgI2RlZmluZSwgb3IgKHByZWZlcnJlZCkgYnkgZGVmaW5pbmcgVEVNUF9ESVJFQ1RPUlkgaW4gamNvbmZpZy5oLgotICoKLSAqICAyLiAgSWYgeW91IG5lZWQgdG8gY2hhbmdlIHRoZSBmaWxlIG5hbWUgYXMgd2VsbCBhcyBpdHMgbG9jYXRpb24sCi0gKiAgICAgIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIFRFTVBfRklMRV9OQU1FIG1hY3JvLiAgKE5vdGUgdGhhdCB0aGlzIGlzCi0gKiAgICAgIGFjdHVhbGx5IGEgcHJpbnRmIGZvcm1hdCBzdHJpbmc7IGl0IG11c3QgY29udGFpbiAlcyBhbmQgJWQuKQotICogICAgICBGZXcgcGVvcGxlIHNob3VsZCBuZWVkIHRvIGRvIHRoaXMuCi0gKgotICogIDMuICBta3RlbXAoKSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG11bHRpcGxlIHByb2Nlc3NlcyBydW5uaW5nCi0gKiAgICAgIHNpbXVsdGFuZW91c2x5IHdvbid0IHNlbGVjdCB0aGUgc2FtZSBmaWxlIG5hbWVzLiAgSWYgeW91ciBzeXN0ZW0KLSAqICAgICAgZG9lc24ndCBoYXZlIG1rdGVtcCgpLCBkZWZpbmUgTk9fTUtURU1QIHRvIGRvIGl0IHRoZSBoYXJkIHdheS4KLSAqICAgICAgKElmIHlvdSBkb24ndCBoYXZlIDxlcnJuby5oPiwgYWxzbyBkZWZpbmUgTk9fRVJSTk9fSC4pCi0gKgotICogIDQuICBZb3UgcHJvYmFibHkgd2FudCB0byBkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUiBzbyB0aGF0IGNqcGVnLmMvZGpwZWcuYwotICogICAgICB3aWxsIGNhdXNlIHRoZSB0ZW1wIGZpbGVzIHRvIGJlIHJlbW92ZWQgaWYgeW91IHN0b3AgdGhlIHByb2dyYW0gZWFybHkuCi0gKi8KLQotI2lmbmRlZiBURU1QX0RJUkVDVE9SWQkJLyogY2FuIG92ZXJyaWRlIGZyb20gamNvbmZpZy5oIG9yIE1ha2VmaWxlICovCi0jZGVmaW5lIFRFTVBfRElSRUNUT1JZICAiL3Vzci90bXAvIiAvKiByZWNvbW1lbmRlZCBzZXR0aW5nIGZvciBVbml4ICovCi0jZW5kaWYKLQotc3RhdGljIGludCBuZXh0X2ZpbGVfbnVtOwkvKiB0byBkaXN0aW5ndWlzaCBhbW9uZyBzZXZlcmFsIHRlbXAgZmlsZXMgKi8KLQotI2lmZGVmIE5PX01LVEVNUAotCi0jaWZuZGVmIFRFTVBfRklMRV9OQU1FCQkvKiBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggb3IgTWFrZWZpbGUgKi8KLSNkZWZpbmUgVEVNUF9GSUxFX05BTUUgICIlc0pQRyUwM2QuVE1QIgotI2VuZGlmCi0KLSNpZm5kZWYgTk9fRVJSTk9fSAotI2luY2x1ZGUgPGVycm5vLmg+CQkvKiB0byBkZWZpbmUgRU5PRU5UICovCi0jZW5kaWYKLQotLyogQU5TSSBDIHNwZWNpZmllcyB0aGF0IGVycm5vIGlzIGEgbWFjcm8sIGJ1dCBvbiBvbGRlciBzeXN0ZW1zIGl0J3MgbW9yZQotICogbGlrZWx5IHRvIGJlIGEgcGxhaW4gaW50IHZhcmlhYmxlLiAgQW5kIG5vdCBhbGwgdmVyc2lvbnMgb2YgZXJybm8uaAotICogYm90aGVyIHRvIGRlY2xhcmUgaXQsIHNvIHdlIGhhdmUgdG8gaW4gb3JkZXIgdG8gYmUgbW9zdCBwb3J0YWJsZS4gIFRodXM6Ci0gKi8KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotCi1MT0NBTCh2b2lkKQotc2VsZWN0X2ZpbGVfbmFtZSAoY2hhciAqIGZuYW1lKQotewotICBGSUxFICogdGZpbGU7Ci0KLSAgLyogS2VlcCBnZW5lcmF0aW5nIGZpbGUgbmFtZXMgdGlsbCB3ZSBmaW5kIG9uZSB0aGF0J3Mgbm90IGluIHVzZSAqLwotICBmb3IgKDs7KSB7Ci0gICAgbmV4dF9maWxlX251bSsrOwkJLyogYWR2YW5jZSBjb3VudGVyICovCi0gICAgc3ByaW50ZihmbmFtZSwgVEVNUF9GSUxFX05BTUUsIFRFTVBfRElSRUNUT1JZLCBuZXh0X2ZpbGVfbnVtKTsKLSAgICBpZiAoKHRmaWxlID0gZm9wZW4oZm5hbWUsIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgLyogZm9wZW4gY291bGQgaGF2ZSBmYWlsZWQgZm9yIGEgcmVhc29uIG90aGVyIHRoYW4gdGhlIGZpbGUgbm90Ci0gICAgICAgKiBiZWluZyB0aGVyZTsgZm9yIGV4YW1wbGUsIGZpbGUgdGhlcmUgYnV0IHVucmVhZGFibGUuCi0gICAgICAgKiBJZiA8ZXJybm8uaD4gaXNuJ3QgYXZhaWxhYmxlLCB0aGVuIHdlIGNhbm5vdCB0ZXN0IHRoZSBjYXVzZS4KLSAgICAgICAqLwotI2lmZGVmIEVOT0VOVAotICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkKLQljb250aW51ZTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGZjbG9zZSh0ZmlsZSk7CQkvKiBvb3BzLCBpdCdzIHRoZXJlOyBjbG9zZSB0ZmlsZSAmIHRyeSBhZ2FpbiAqLwotICB9Ci19Ci0KLSNlbHNlIC8qICEgTk9fTUtURU1QICovCi0KLS8qIE5vdGUgdGhhdCBta3RlbXAoKSByZXF1aXJlcyB0aGUgaW5pdGlhbCBmaWxlbmFtZSB0byBlbmQgaW4gc2l4IFgncyAqLwotI2lmbmRlZiBURU1QX0ZJTEVfTkFNRQkJLyogY2FuIG92ZXJyaWRlIGZyb20gamNvbmZpZy5oIG9yIE1ha2VmaWxlICovCi0jZGVmaW5lIFRFTVBfRklMRV9OQU1FICAiJXNKUEclZFhYWFhYWCIKLSNlbmRpZgotCi1MT0NBTCh2b2lkKQotc2VsZWN0X2ZpbGVfbmFtZSAoY2hhciAqIGZuYW1lKQotewotICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KLSAgc3ByaW50ZihmbmFtZSwgVEVNUF9GSUxFX05BTUUsIFRFTVBfRElSRUNUT1JZLCBuZXh0X2ZpbGVfbnVtKTsKLSAgbWt0ZW1wKGZuYW1lKTsJCS8qIG1ha2Ugc3VyZSBmaWxlIG5hbWUgaXMgdW5pcXVlICovCi0gIC8qIG1rdGVtcCByZXBsYWNlcyB0aGUgdHJhaWxpbmcgWFhYWFhYIHdpdGggYSB1bmlxdWUgc3RyaW5nIG9mIGNoYXJhY3RlcnMgKi8KLX0KLQotI2VuZGlmIC8qIE5PX01LVEVNUCAqLwotCi0KLS8qCi0gKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5Ci0gKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgotICovCi0KLUdMT0JBTCh2b2lkICopCi1qcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIGZyZWUob2JqZWN0KTsKLX0KLQotCi0vKgotICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KLSAqIE5COiBhbHRob3VnaCB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMsCi0gKiB0aGlzIGZpbGUgd29uJ3QgYWN0dWFsbHkgd29yayBpbiA4MHg4NiBzbWFsbC9tZWRpdW0gbW9kZWw7IGF0IGxlYXN0LAotICogeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gcHJvY2VzcyB1c2VmdWwtc2l6ZSBpbWFnZXMgaW4gb25seSA2NEtCLgotICovCi0KLUdMT0JBTCh2b2lkIEZBUiAqKQotanBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgcmV0dXJuICh2b2lkIEZBUiAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIGZyZWUob2JqZWN0KTsKLX0KLQotCi0vKgotICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgotICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCi0gKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgotICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAotICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KLSNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkxMDAwMDAwTCAvKiBkZWZhdWx0OiBvbmUgbWVnYWJ5dGUgKi8KLSNlbmRpZgotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCi0JCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCi17Ci0gIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOwotfQotCi0KLS8qCi0gKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KLSAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCi0gKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCi0gKi8KLQotCi1NRVRIT0RERUYodm9pZCkKLXJlYWRfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOwotICBpZiAoSkZSRUFEKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCi0gICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKLSAgaWYgKEpGV1JJVEUoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKLSAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9XUklURSk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1jbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCi17Ci0gIGZjbG9zZShpbmZvLT50ZW1wX2ZpbGUpOwkvKiBjbG9zZSB0aGUgZmlsZSAqLwotICB1bmxpbmsoaW5mby0+dGVtcF9uYW1lKTsJLyogZGVsZXRlIHRoZSBmaWxlICovCi0vKiBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IGhhdmUgdW5saW5rKCksIHVzZSByZW1vdmUoKSBpbnN0ZWFkLgotICogcmVtb3ZlKCkgaXMgdGhlIEFOU0ktc3RhbmRhcmQgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbiwgYnV0IGlmCi0gKiB5b3VyIHN5c3RlbSB3YXMgQU5TSSB5b3UnZCBiZSB1c2luZyBqbWVtYW5zaS5jLCByaWdodD8KLSAqLwotICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9DTE9TRSwgaW5mby0+dGVtcF9uYW1lKTsKLX0KLQotCi0vKgotICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQotewotICBzZWxlY3RfZmlsZV9uYW1lKGluZm8tPnRlbXBfbmFtZSk7Ci0gIGlmICgoaW5mby0+dGVtcF9maWxlID0gZm9wZW4oaW5mby0+dGVtcF9uYW1lLCBSV19CSU5BUlkpKSA9PSBOVUxMKQotICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgaW5mby0+dGVtcF9uYW1lKTsKLSAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF9iYWNraW5nX3N0b3JlOwotICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfYmFja2luZ19zdG9yZTsKLSAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2JhY2tpbmdfc3RvcmU7Ci0gIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX09QRU4sIGluZm8tPnRlbXBfbmFtZSk7Ci19Ci0KLQotLyoKLSAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKLSAqIGNsZWFudXAgcmVxdWlyZWQuCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIG5leHRfZmlsZV9udW0gPSAwOwkJLyogaW5pdGlhbGl6ZSB0ZW1wIGZpbGUgbmFtZSBnZW5lcmF0b3IgKi8KLSAgcmV0dXJuIERFRkFVTFRfTUFYX01FTTsJLyogZGVmYXVsdCBmb3IgbWF4X21lbW9yeV90b191c2UgKi8KLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ptZW1ub2JzLmMgYi9saWJqcGVndHdycC9qbWVtbm9icy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjhjMzM3Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ptZW1ub2JzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIGptZW1ub2JzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIHJlYWxseSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KLSAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgVGhpcyBpbXBsZW1lbnRhdGlvbgotICogYXNzdW1lcyB0aGF0IG5vIGJhY2tpbmctc3RvcmUgZmlsZXMgYXJlIG5lZWRlZDogYWxsIHJlcXVpcmVkIHNwYWNlCi0gKiBjYW4gYmUgb2J0YWluZWQgZnJvbSBtYWxsb2MoKS4KLSAqIFRoaXMgaXMgdmVyeSBwb3J0YWJsZSBpbiB0aGUgc2Vuc2UgdGhhdCBpdCdsbCBjb21waWxlIG9uIGFsbW9zdCBhbnl0aGluZywKLSAqIGJ1dCB5b3UnZCBiZXR0ZXIgaGF2ZSBsb3RzIG9mIG1haW4gbWVtb3J5IChvciB2aXJ0dWFsIG1lbW9yeSkgaWYgeW91IHdhbnQKLSAqIHRvIHByb2Nlc3MgYmlnIGltYWdlcy4KLSAqIE5vdGUgdGhhdCB0aGUgbWF4X21lbW9yeV90b191c2Ugb3B0aW9uIGlzIGlnbm9yZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLwotCi0jaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgbWFsbG9jKCksZnJlZSgpICovCi1leHRlcm4gdm9pZCAqIG1hbGxvYyBKUFAoKHNpemVfdCBzaXplKSk7Ci1leHRlcm4gdm9pZCBmcmVlIEpQUCgodm9pZCAqcHRyKSk7Ci0jZW5kaWYKLQotCi0vKgotICogTWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIHJlZ3VsYXIgbGlicmFyeQotICogcm91dGluZXMgbWFsbG9jKCkgYW5kIGZyZWUoKS4KLSAqLwotCi1HTE9CQUwodm9pZCAqKQotanBlZ19nZXRfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgcmV0dXJuICh2b2lkICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZnJlZV9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICBmcmVlKG9iamVjdCk7Ci19Ci0KLQotLyoKLSAqICJMYXJnZSIgb2JqZWN0cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyAic21hbGwiIG9uZXMuCi0gKiBOQjogYWx0aG91Z2ggd2UgaW5jbHVkZSBGQVIga2V5d29yZHMgaW4gdGhlIHJvdXRpbmUgZGVjbGFyYXRpb25zLAotICogdGhpcyBmaWxlIHdvbid0IGFjdHVhbGx5IHdvcmsgaW4gODB4ODYgc21hbGwvbWVkaXVtIG1vZGVsOyBhdCBsZWFzdCwKLSAqIHlvdSBwcm9iYWJseSB3b24ndCBiZSBhYmxlIHRvIHByb2Nlc3MgdXNlZnVsLXNpemUgaW1hZ2VzIGluIG9ubHkgNjRLQi4KLSAqLwotCi1HTE9CQUwodm9pZCBGQVIgKikKLWpwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCBGQVIgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICBmcmVlKG9iamVjdCk7Ci19Ci0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBjb21wdXRlcyB0aGUgdG90YWwgbWVtb3J5IHNwYWNlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KLSAqIEhlcmUgd2UgYWx3YXlzIHNheSwgIndlIGdvdCBhbGwgeW91IHdhbnQgYnVkISIKLSAqLwotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCi0JCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCi17Ci0gIHJldHVybiBtYXhfYnl0ZXNfbmVlZGVkOwotfQotCi0KLS8qCi0gKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KLSAqIFNpbmNlIGpwZWdfbWVtX2F2YWlsYWJsZSBhbHdheXMgcHJvbWlzZWQgdGhlIG1vb24sCi0gKiB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYW5kIHdlIGNhbiBqdXN0IGVycm9yIG91dC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCi17Ci0gIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9fQkFDS0lOR19TVE9SRSk7Ci19Ci0KLQotLyoKLSAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKLSAqIGNsZWFudXAgcmVxdWlyZWQuICBIZXJlLCB0aGVyZSBpc24ndCBhbnkuCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIHJldHVybiAwOwkJCS8qIGp1c3Qgc2V0IG1heF9tZW1vcnlfdG9fdXNlIHRvIDAgKi8KLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ptZW1zeXMuaCBiL2xpYmpwZWd0d3JwL2ptZW1zeXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkMWM2My4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qbWVtc3lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoKLSAqIGptZW1zeXMuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBpbmNsdWRlIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHN5c3RlbS1pbmRlcGVuZGVudAotICogYW5kIHN5c3RlbS1kZXBlbmRlbnQgcG9ydGlvbnMgb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBObyBvdGhlcgotICogbW9kdWxlcyBuZWVkIGluY2x1ZGUgaXQuICAoVGhlIHN5c3RlbS1pbmRlcGVuZGVudCBwb3J0aW9uIGlzIGptZW1tZ3IuYzsKLSAqIHRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudCBwb3J0aW9uLikKLSAqCi0gKiBUaGlzIGZpbGUgd29ya3MgYXMtaXMgZm9yIHRoZSBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VycyBzdXBwbGllZAotICogaW4gdGhlIElKRyBkaXN0cmlidXRpb24uICBZb3UgbWF5IG5lZWQgdG8gbW9kaWZ5IGl0IGlmIHlvdSB3cml0ZSBhCi0gKiBjdXN0b20gbWVtb3J5IG1hbmFnZXIuICBJZiBzeXN0ZW0tZGVwZW5kZW50IGNoYW5nZXMgYXJlIG5lZWRlZCBpbgotICogdGhpcyBmaWxlLCB0aGUgYmVzdCBtZXRob2QgaXMgdG8gI2lmZGVmIHRoZW0gYmFzZWQgb24gYSBjb25maWd1cmF0aW9uCi0gKiBzeW1ib2wgc3VwcGxpZWQgaW4gamNvbmZpZy5oLCBhcyB3ZSBoYXZlIGRvbmUgd2l0aCBVU0VfTVNET1NfTUVNTUdSCi0gKiBhbmQgVVNFX01BQ19NRU1NR1IuCi0gKi8KLQotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUganBlZ19nZXRfc21hbGwJCWpHZXRTbWFsbAotI2RlZmluZSBqcGVnX2ZyZWVfc21hbGwJCWpGcmVlU21hbGwKLSNkZWZpbmUganBlZ19nZXRfbGFyZ2UJCWpHZXRMYXJnZQotI2RlZmluZSBqcGVnX2ZyZWVfbGFyZ2UJCWpGcmVlTGFyZ2UKLSNkZWZpbmUganBlZ19tZW1fYXZhaWxhYmxlCWpNZW1BdmFpbAotI2RlZmluZSBqcGVnX29wZW5fYmFja2luZ19zdG9yZQlqT3BlbkJhY2tTdG9yZQotI2RlZmluZSBqcGVnX21lbV9pbml0CQlqTWVtSW5pdAotI2RlZmluZSBqcGVnX21lbV90ZXJtCQlqTWVtVGVybQotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotCi0vKgotICogVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBhbGxvY2F0ZSBhbmQgcmVsZWFzZSBzbWFsbCBjaHVua3Mgb2YKLSAqIG1lbW9yeS4gIChUeXBpY2FsbHkgdGhlIHRvdGFsIGFtb3VudCByZXF1ZXN0ZWQgdGhyb3VnaCBqcGVnX2dldF9zbWFsbCBpcwotICogbm8gbW9yZSB0aGFuIDIwSyBvciBzbzsgdGhpcyB3aWxsIGJlIHJlcXVlc3RlZCBpbiBjaHVua3Mgb2YgYSBmZXcgSyBlYWNoLikKLSAqIEJlaGF2aW9yIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBmb3IgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zIG1hbGxvYwotICogYW5kIGZyZWU7IGluIHBhcnRpY3VsYXIsIGpwZWdfZ2V0X3NtYWxsIG11c3QgcmV0dXJuIE5VTEwgb24gZmFpbHVyZS4KLSAqIE9uIG1vc3Qgc3lzdGVtcywgdGhlc2UgQVJFIG1hbGxvYyBhbmQgZnJlZS4gIGpwZWdfZnJlZV9zbWFsbCBpcyBwYXNzZWQgdGhlCi0gKiBzaXplIG9mIHRoZSBvYmplY3QgYmVpbmcgZnJlZWQsIGp1c3QgaW4gY2FzZSBpdCdzIG5lZWRlZC4KLSAqIE9uIGFuIDgweDg2IG1hY2hpbmUgdXNpbmcgc21hbGwtZGF0YSBtZW1vcnkgbW9kZWwsIHRoZXNlIG1hbmFnZSBuZWFyIGhlYXAuCi0gKi8KLQotRVhURVJOKHZvaWQgKikganBlZ19nZXRfc21hbGwgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2ZyZWVfc21hbGwgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsCi0JCQkJICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7Ci0KLS8qCi0gKiBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGFsbG9jYXRlIGFuZCByZWxlYXNlIGxhcmdlIGNodW5rcyBvZgotICogbWVtb3J5ICh1cCB0byB0aGUgdG90YWwgZnJlZSBzcGFjZSBkZXNpZ25hdGVkIGJ5IGpwZWdfbWVtX2F2YWlsYWJsZSkuCi0gKiBUaGUgaW50ZXJmYWNlIGlzIHRoZSBzYW1lIGFzIGFib3ZlLCBleGNlcHQgdGhhdCBvbiBhbiA4MHg4NiBtYWNoaW5lLAotICogZmFyIHBvaW50ZXJzIGFyZSB1c2VkLiAgT24gbW9zdCBvdGhlciBtYWNoaW5lcyB0aGVzZSBhcmUgaWRlbnRpY2FsIHRvCi0gKiB0aGUganBlZ19nZXQvZnJlZV9zbWFsbCByb3V0aW5lczsgYnV0IHdlIGtlZXAgdGhlbSBzZXBhcmF0ZSBhbnl3YXksCi0gKiBpbiBjYXNlIGEgZGlmZmVyZW50IGFsbG9jYXRpb24gc3RyYXRlZ3kgaXMgZGVzaXJhYmxlIGZvciBsYXJnZSBjaHVua3MuCi0gKi8KLQotRVhURVJOKHZvaWQgRkFSICopIGpwZWdfZ2V0X2xhcmdlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCSAgICAgICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7Ci1FWFRFUk4odm9pZCkganBlZ19mcmVlX2xhcmdlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwKLQkJCQkgIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKLQotLyoKLSAqIFRoZSBtYWNybyBNQVhfQUxMT0NfQ0hVTksgZGVzaWduYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXkKLSAqIGJlIHJlcXVlc3RlZCBpbiBhIHNpbmdsZSBjYWxsIHRvIGpwZWdfZ2V0X2xhcmdlIChhbmQganBlZ19nZXRfc21hbGwgZm9yIHRoYXQKLSAqIG1hdHRlciwgYnV0IHRoYXQgY2FzZSBzaG91bGQgbmV2ZXIgY29tZSBpbnRvIHBsYXkpLiAgVGhpcyBtYWNybyBpcyBuZWVkZWQKLSAqIHRvIG1vZGVsIHRoZSA2NEtiLXNlZ21lbnQtc2l6ZSBsaW1pdCBvZiBmYXIgYWRkcmVzc2luZyBvbiA4MHg4NiBtYWNoaW5lcy4KLSAqIE9uIHRob3NlIG1hY2hpbmVzLCB3ZSBleHBlY3QgdGhhdCBqY29uZmlnLmggd2lsbCBwcm92aWRlIGEgcHJvcGVyIHZhbHVlLgotICogT24gbWFjaGluZXMgd2l0aCAzMi1iaXQgZmxhdCBhZGRyZXNzIHNwYWNlcywgYW55IGxhcmdlIGNvbnN0YW50IG1heSBiZSB1c2VkLgotICoKLSAqIE5COiBqbWVtbWdyLmMgZXhwZWN0cyB0aGF0IE1BWF9BTExPQ19DSFVOSyB3aWxsIGJlIHJlcHJlc2VudGFibGUgYXMgdHlwZQotICogc2l6ZV90IGFuZCB3aWxsIGJlIGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKGFsaWduX3R5cGUpLgotICovCi0KLSNpZm5kZWYgTUFYX0FMTE9DX0NIVU5LCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KLSNkZWZpbmUgTUFYX0FMTE9DX0NIVU5LICAxMDAwMDAwMDAwTAotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIHNwYWNlIHN0aWxsIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiBieQotICoganBlZ19nZXRfbGFyZ2UuICBJZiBtb3JlIHNwYWNlIHRoYW4gdGhpcyBpcyBuZWVkZWQsIGJhY2tpbmcgc3RvcmUgd2lsbCBiZQotICogdXNlZC4gIE5PVEU6IGFueSBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWQgbXVzdCBub3QgYmUgY291bnRlZC4KLSAqCi0gKiBUaGVyZSBpcyBhIG1pbmltdW0gc3BhY2UgcmVxdWlyZW1lbnQsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1pbmltdW0KLSAqIGZlYXNpYmxlIGJ1ZmZlciBzaXplczsgam1lbW1nci5jIHdpbGwgcmVxdWVzdCB0aGF0IG11Y2ggc3BhY2UgZXZlbiBpZgotICoganBlZ19tZW1fYXZhaWxhYmxlIHJldHVybnMgemVyby4gIFRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCwgZW5vdWdoIHRvIGhvbGQKLSAqIGFsbCB3b3JraW5nIHN0b3JhZ2UgaW4gbWVtb3J5LCBpcyBhbHNvIHBhc3NlZCBpbiBjYXNlIGl0IGlzIHVzZWZ1bC4KLSAqIEZpbmFsbHksIHRoZSB0b3RhbCBzcGFjZSBhbHJlYWR5IGFsbG9jYXRlZCBpcyBwYXNzZWQuICBJZiBubyBiZXR0ZXIKLSAqIG1ldGhvZCBpcyBhdmFpbGFibGUsIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlIC0gYWxyZWFkeV9hbGxvY2F0ZWQKLSAqIGlzIG9mdGVuIGEgc3VpdGFibGUgY2FsY3VsYXRpb24uCi0gKgotICogSXQgaXMgT0sgZm9yIGpwZWdfbWVtX2F2YWlsYWJsZSB0byB1bmRlcmVzdGltYXRlIHRoZSBzcGFjZSBhdmFpbGFibGUKLSAqICh0aGF0J2xsIGp1c3QgbGVhZCB0byBtb3JlIGJhY2tpbmctc3RvcmUgYWNjZXNzIHRoYW4gaXMgcmVhbGx5IG5lY2Vzc2FyeSkuCi0gKiBIb3dldmVyLCBhbiBvdmVyZXN0aW1hdGUgd2lsbCBsZWFkIHRvIGZhaWx1cmUuICBIZW5jZSBpdCdzIHdpc2UgdG8gc3VidHJhY3QKLSAqIGEgc2xvcCBmYWN0b3IgZnJvbSB0aGUgdHJ1ZSBhdmFpbGFibGUgc3BhY2UuICA1JSBzaG91bGQgYmUgZW5vdWdoLgotICoKLSAqIE9uIG1hY2hpbmVzIHdpdGggbG90cyBvZiB2aXJ0dWFsIG1lbW9yeSwgYW55IGxhcmdlIGNvbnN0YW50IG1heSBiZSByZXR1cm5lZC4KLSAqIENvbnZlcnNlbHksIHplcm8gbWF5IGJlIHJldHVybmVkIHRvIGFsd2F5cyB1c2UgdGhlIG1pbmltdW0gYW1vdW50IG9mIG1lbW9yeS4KLSAqLwotCi1FWFRFUk4obG9uZykganBlZ19tZW1fYXZhaWxhYmxlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCSAgICAgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAotCQkJCSAgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLAotCQkJCSAgICAgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkpOwotCi0KLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB3aGF0ZXZlciBzdGF0ZSBpcyBuZWVkZWQgdG8gYWNjZXNzIGEgc2luZ2xlCi0gKiBiYWNraW5nLXN0b3JlIG9iamVjdC4gIFRoZSByZWFkL3dyaXRlL2Nsb3NlIG1ldGhvZCBwb2ludGVycyBhcmUgY2FsbGVkCi0gKiBieSBqbWVtbWdyLmMgdG8gbWFuaXB1bGF0ZSB0aGUgYmFja2luZy1zdG9yZSBvYmplY3Q7IGFsbCBvdGhlciBmaWVsZHMKLSAqIGFyZSBwcml2YXRlIHRvIHRoZSBzeXN0ZW0tZGVwZW5kZW50IGJhY2tpbmcgc3RvcmUgcm91dGluZXMuCi0gKi8KLQotI2RlZmluZSBURU1QX05BTUVfTEVOR1RIICAgNjQJLyogbWF4IGxlbmd0aCBvZiBhIHRlbXBvcmFyeSBmaWxlJ3MgbmFtZSAqLwotCi0KLSNpZmRlZiBVU0VfTVNET1NfTUVNTUdSCQkvKiBET1Mtc3BlY2lmaWMganVuayAqLwotCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFhNU0g7CS8qIHR5cGUgb2YgZXh0ZW5kZWQtbWVtb3J5IGhhbmRsZXMgKi8KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgRU1TSDsJLyogdHlwZSBvZiBleHBhbmRlZC1tZW1vcnkgaGFuZGxlcyAqLwotCi10eXBlZGVmIHVuaW9uIHsKLSAgc2hvcnQgZmlsZV9oYW5kbGU7CQkvKiBET1MgZmlsZSBoYW5kbGUgaWYgaXQncyBhIHRlbXAgZmlsZSAqLwotICBYTVNIIHhtc19oYW5kbGU7CQkvKiBoYW5kbGUgaWYgaXQncyBhIGNodW5rIG9mIFhNUyAqLwotICBFTVNIIGVtc19oYW5kbGU7CQkvKiBoYW5kbGUgaWYgaXQncyBhIGNodW5rIG9mIEVNUyAqLwotfSBoYW5kbGVfdW5pb247Ci0KLSNlbmRpZiAvKiBVU0VfTVNET1NfTUVNTUdSICovCi0KLSNpZmRlZiBVU0VfTUFDX01FTU1HUgkJLyogTWFjLXNwZWNpZmljIGp1bmsgKi8KLSNpbmNsdWRlIDxGaWxlcy5oPgotI2VuZGlmIC8qIFVTRV9NQUNfTUVNTUdSICovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgYmFja2luZ19zdG9yZV9zdHJ1Y3QgKiBiYWNraW5nX3N0b3JlX3B0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgYmFja2luZ19zdG9yZV9zdHJ1Y3QgewotICAvKiBNZXRob2RzIGZvciByZWFkaW5nL3dyaXRpbmcvY2xvc2luZyB0aGlzIGJhY2tpbmctc3RvcmUgb2JqZWN0ICovCi0gIEpNRVRIT0Qodm9pZCwgcmVhZF9iYWNraW5nX3N0b3JlLCAoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCSAgICAgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJCQkgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCQkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpKTsKLSAgSk1FVEhPRCh2b2lkLCB3cml0ZV9iYWNraW5nX3N0b3JlLCAoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCSAgICAgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCQkJICAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJCQkgICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpKTsKLSAgSk1FVEhPRCh2b2lkLCBjbG9zZV9iYWNraW5nX3N0b3JlLCAoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCSAgICAgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pKTsKLQotICAvKiBQcml2YXRlIGZpZWxkcyBmb3Igc3lzdGVtLWRlcGVuZGVudCBiYWNraW5nLXN0b3JlIG1hbmFnZW1lbnQgKi8KLSNpZmRlZiBVU0VfTVNET1NfTUVNTUdSCi0gIC8qIEZvciB0aGUgTVMtRE9TIG1hbmFnZXIgKGptZW1kb3MuYyksIHdlIG5lZWQ6ICovCi0gIGhhbmRsZV91bmlvbiBoYW5kbGU7CQkvKiByZWZlcmVuY2UgdG8gYmFja2luZy1zdG9yZSBzdG9yYWdlIG9iamVjdCAqLwotICBjaGFyIHRlbXBfbmFtZVtURU1QX05BTUVfTEVOR1RIXTsgLyogbmFtZSBpZiBpdCdzIGEgZmlsZSAqLwotI2Vsc2UKLSNpZmRlZiBVU0VfTUFDX01FTU1HUgotICAvKiBGb3IgdGhlIE1hYyBtYW5hZ2VyIChqbWVtbWFjLmMpLCB3ZSBuZWVkOiAqLwotICBzaG9ydCB0ZW1wX2ZpbGU7CQkvKiBmaWxlIHJlZmVyZW5jZSBudW1iZXIgdG8gdGVtcCBmaWxlICovCi0gIEZTU3BlYyB0ZW1wU3BlYzsJCS8qIHRoZSBGU1NwZWMgZm9yIHRoZSB0ZW1wIGZpbGUgKi8KLSAgY2hhciB0ZW1wX25hbWVbVEVNUF9OQU1FX0xFTkdUSF07IC8qIG5hbWUgaWYgaXQncyBhIGZpbGUgKi8KLSNlbHNlCi0jaWZkZWYgVVNFX0FORFJPSURfQVNITUVNCi0gIHNob3J0IHRlbXBfZmlsZTsJCS8qIGZpbGUgcmVmZXJlbmNlIG51bWJlciB0byB0ZW1wIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciogYWRkcjsgIC8qIHRoZSBtZW1vcnkgYWRkcmVzcyBtYXBwZWQgdG8gYXNobWVtICovCi0gIGxvbmcgc2l6ZTsgICAgICAgICAgICAvKiB0aGUgcmVxdWVzdGVkIGFzaG1lbSBzaXplICovCi0jZWxzZQotICAvKiBGb3IgYSB0eXBpY2FsIGltcGxlbWVudGF0aW9uIHdpdGggdGVtcCBmaWxlcywgd2UgbmVlZDogKi8KLSAgRklMRSAqIHRlbXBfZmlsZTsJCS8qIHN0ZGlvIHJlZmVyZW5jZSB0byB0ZW1wIGZpbGUgKi8KLSAgY2hhciB0ZW1wX25hbWVbVEVNUF9OQU1FX0xFTkdUSF07IC8qIG5hbWUgb2YgdGVtcCBmaWxlICovCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi19IGJhY2tpbmdfc3RvcmVfaW5mbzsKLQotCi0vKgotICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuICBUaGlzIG11c3QgZmlsbCBpbiB0aGUKLSAqIHJlYWQvd3JpdGUvY2xvc2UgcG9pbnRlcnMgaW4gdGhlIG9iamVjdC4gIFRoZSByZWFkL3dyaXRlIHJvdXRpbmVzCi0gKiBtYXkgdGFrZSBhbiBlcnJvciBleGl0IGlmIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBmaWxlIHNpemUgaXMgZXhjZWVkZWQuCi0gKiAoSWYganBlZ19tZW1fYXZhaWxhYmxlIGFsd2F5cyByZXR1cm5zIGEgbGFyZ2UgdmFsdWUsIHRoaXMgcm91dGluZSBjYW4KLSAqIGp1c3QgdGFrZSBhbiBlcnJvciBleGl0LikKLSAqLwotCi1FWFRFUk4odm9pZCkganBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJCSAgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJCQkJICBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkpOwotCi0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCi0gKiBjbGVhbnVwIHJlcXVpcmVkLiAganBlZ19tZW1faW5pdCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgaXMKLSAqIGFsbG9jYXRlZCAoYW5kLCB0aGVyZWZvcmUsIG5vdGhpbmcgaW4gY2luZm8gaXMgb2YgdXNlIGV4Y2VwdCB0aGUgZXJyb3IKLSAqIG1hbmFnZXIgcG9pbnRlcikuICBJdCBzaG91bGQgcmV0dXJuIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSBmb3IKLSAqIG1heF9tZW1vcnlfdG9fdXNlOyB0aGlzIG1heSBzdWJzZXF1ZW50bHkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgc3Vycm91bmRpbmcKLSAqIGFwcGxpY2F0aW9uLiAgKE5vdGUgdGhhdCBtYXhfbWVtb3J5X3RvX3VzZSBpcyBvbmx5IGltcG9ydGFudCBpZgotICoganBlZ19tZW1fYXZhaWxhYmxlIGNob29zZXMgdG8gY29uc3VsdCBpdCAuLi4gbm8gb25lIGVsc2Ugd2lsbC4pCi0gKiBqcGVnX21lbV90ZXJtIG1heSBhc3N1bWUgdGhhdCBhbGwgcmVxdWVzdGVkIG1lbW9yeSBoYXMgYmVlbiBmcmVlZCBhbmQgdGhhdAotICogYWxsIG9wZW5lZCBiYWNraW5nLXN0b3JlIG9iamVjdHMgaGF2ZSBiZWVuIGNsb3NlZC4KLSAqLwotCi1FWFRFUk4obG9uZykganBlZ19tZW1faW5pdCBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfbWVtX3Rlcm0gSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ptb3JlY2ZnLmggYi9saWJqcGVndHdycC9qbW9yZWNmZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzZiYmNiLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ptb3JlY2ZnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoKLSAqIGptb3JlY2ZnLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGN1c3RvbWl6ZSB0aGUKLSAqIEpQRUcgc29mdHdhcmUgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zIG9yIHN1cHBvcnQgbWFjaGluZS1kZXBlbmRlbnQKLSAqIG9wdGltaXphdGlvbnMuICBNb3N0IHVzZXJzIHdpbGwgbm90IG5lZWQgdG8gdG91Y2ggdGhpcyBmaWxlLgotICovCi0KLS8qCi0gKiBEZWZpbmUgQU5EUk9JRF9SR0IgdG8gZW5hYmxlIHNwZWNpZmljIG9wdGltaXphdGlvbnMgZm9yIEFuZHJvaWQKLSAqICAgSkNTX1JHQkFfODg4OCBzdXBwb3J0Ci0gKiAgIEpDU19SR0JfNTY1IHN1cHBvcnQKLSAqIAotICovCi0KLSNkZWZpbmUgQU5EUk9JRF9SR0IKLQotI2lmZGVmIEFORFJPSURfUkdCCi0jZGVmaW5lIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSAgKCgoKHIpPDw4KSYweGY4MDApfCgoKGcpPDwzKSYweDdFMCl8KChiKT4+MykpCi0jZGVmaW5lIFBBQ0tfVFdPX1BJWEVMUyhsLHIpICAgKChyPDwxNikgfCBsKQotI2RlZmluZSBQQUNLX05FRURfQUxJR05NRU5UKHB0cikgKCgoaW50KShwdHIpKSYzKQotI2RlZmluZSBXUklURV9UV09fUElYRUxTKGFkZHIsIHBpeGVscykgZG8geyAgICAgXAotICAgICAgICAgKChJTlQxNiopKGFkZHIpKVswXSA9IChwaXhlbHMpOyAgICAgICAgXAotICAgICAgICAgKChJTlQxNiopKGFkZHIpKVsxXSA9IChwaXhlbHMpPj4xNjsgICAgXAotICAgIH0gd2hpbGUoMCkKLSNkZWZpbmUgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKGFkZHIsIHBpeGVscykgICgoKihJTlQzMiopKGFkZHIpKSA9IHBpeGVscykKLSNkZWZpbmUgRElUSEVSXzU2NV9SKHIsIGRpdGhlcikgKChyKSArICgoZGl0aGVyKSYweEZGKSkKLSNkZWZpbmUgRElUSEVSXzU2NV9HKGcsIGRpdGhlcikgKChnKSArICgoKGRpdGhlcikmMHhGRik+PjEpKQotI2RlZmluZSBESVRIRVJfNTY1X0IoYiwgZGl0aGVyKSAoKGIpICsgKChkaXRoZXIpJjB4RkYpKQotI2VuZGlmCi0KLS8qCi0gKiBEZWZpbmUgQklUU19JTl9KU0FNUExFIGFzIGVpdGhlcgotICogICA4ICAgZm9yIDgtYml0IHNhbXBsZSB2YWx1ZXMgKHRoZSB1c3VhbCBzZXR0aW5nKQotICogICAxMiAgZm9yIDEyLWJpdCBzYW1wbGUgdmFsdWVzCi0gKiBPbmx5IDggYW5kIDEyIGFyZSBsZWdhbCBkYXRhIHByZWNpc2lvbnMgZm9yIGxvc3N5IEpQRUcgYWNjb3JkaW5nIHRvIHRoZQotICogSlBFRyBzdGFuZGFyZCwgYW5kIHRoZSBJSkcgY29kZSBkb2VzIG5vdCBzdXBwb3J0IGFueXRoaW5nIGVsc2UhCi0gKiBXZSBkbyBub3Qgc3VwcG9ydCBydW4tdGltZSBzZWxlY3Rpb24gb2YgZGF0YSBwcmVjaXNpb24sIHNvcnJ5LgotICovCi0KLSNkZWZpbmUgQklUU19JTl9KU0FNUExFICA4CS8qIHVzZSA4IG9yIDEyICovCi0KLQotLyoKLSAqIE1heGltdW0gbnVtYmVyIG9mIGNvbXBvbmVudHMgKGNvbG9yIGNoYW5uZWxzKSBhbGxvd2VkIGluIEpQRUcgaW1hZ2UuCi0gKiBUbyBtZWV0IHRoZSBsZXR0ZXIgb2YgdGhlIEpQRUcgc3BlYywgc2V0IHRoaXMgdG8gMjU1LiAgSG93ZXZlciwgZGFybgotICogZmV3IGFwcGxpY2F0aW9ucyBuZWVkIG1vcmUgdGhhbiA0IGNoYW5uZWxzIChtYXliZSA1IGZvciBDTVlLICsgYWxwaGEKLSAqIG1hc2spLiAgV2UgcmVjb21tZW5kIDEwIGFzIGEgcmVhc29uYWJsZSBjb21wcm9taXNlOyB1c2UgNCBpZiB5b3UgYXJlCi0gKiByZWFsbHkgc2hvcnQgb24gbWVtb3J5LiAgKEVhY2ggYWxsb3dlZCBjb21wb25lbnQgY29zdHMgYSBodW5kcmVkIG9yIHNvCi0gKiBieXRlcyBvZiBzdG9yYWdlLCB3aGV0aGVyIGFjdHVhbGx5IHVzZWQgaW4gYW4gaW1hZ2Ugb3Igbm90LikKLSAqLwotCi0jZGVmaW5lIE1BWF9DT01QT05FTlRTICAxMAkvKiBtYXhpbXVtIG51bWJlciBvZiBpbWFnZSBjb21wb25lbnRzICovCi0KLQotLyoKLSAqIEJhc2ljIGRhdGEgdHlwZXMuCi0gKiBZb3UgbWF5IG5lZWQgdG8gY2hhbmdlIHRoZXNlIGlmIHlvdSBoYXZlIGEgbWFjaGluZSB3aXRoIHVudXN1YWwgZGF0YQotICogdHlwZSBzaXplczsgZm9yIGV4YW1wbGUsICJjaGFyIiBub3QgOCBiaXRzLCAic2hvcnQiIG5vdCAxNiBiaXRzLAotICogb3IgImxvbmciIG5vdCAzMiBiaXRzLiAgV2UgZG9uJ3QgY2FyZSB3aGV0aGVyICJpbnQiIGlzIDE2IG9yIDMyIGJpdHMsCi0gKiBidXQgaXQgaGFkIGJldHRlciBiZSBhdCBsZWFzdCAxNi4KLSAqLwotCi0vKiBSZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBzYW1wbGUgKHBpeGVsIGVsZW1lbnQgdmFsdWUpLgotICogV2UgZnJlcXVlbnRseSBhbGxvY2F0ZSBsYXJnZSBhcnJheXMgb2YgdGhlc2UsIHNvIGl0J3MgaW1wb3J0YW50IHRvIGtlZXAKLSAqIHRoZW0gc21hbGwuICBCdXQgaWYgeW91IGhhdmUgbWVtb3J5IHRvIGJ1cm4gYW5kIGFjY2VzcyB0byBjaGFyIG9yIHNob3J0Ci0gKiBhcnJheXMgaXMgdmVyeSBzbG93IG9uIHlvdXIgaGFyZHdhcmUsIHlvdSBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGVzZS4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLS8qIEpTQU1QTEUgc2hvdWxkIGJlIHRoZSBzbWFsbGVzdCB0eXBlIHRoYXQgd2lsbCBob2xkIHRoZSB2YWx1ZXMgMC4uMjU1LgotICogWW91IGNhbiB1c2UgYSBzaWduZWQgY2hhciBieSBoYXZpbmcgR0VUSlNBTVBMRSBtYXNrIGl0IHdpdGggMHhGRi4KLSAqLwotCi0jaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBKU0FNUExFOwotI2RlZmluZSBHRVRKU0FNUExFKHZhbHVlKSAgKChpbnQpICh2YWx1ZSkpCi0KLSNlbHNlIC8qIG5vdCBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLQotdHlwZWRlZiBjaGFyIEpTQU1QTEU7Ci0jaWZkZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBHRVRKU0FNUExFKHZhbHVlKSAgKChpbnQpICh2YWx1ZSkpCi0jZWxzZQotI2RlZmluZSBHRVRKU0FNUExFKHZhbHVlKSAgKChpbnQpICh2YWx1ZSkgJiAweEZGKQotI2VuZGlmIC8qIENIQVJfSVNfVU5TSUdORUQgKi8KLQotI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLwotCi0jZGVmaW5lIE1BWEpTQU1QTEUJMjU1Ci0jZGVmaW5lIENFTlRFUkpTQU1QTEUJMTI4Ci0KLSNlbmRpZiAvKiBCSVRTX0lOX0pTQU1QTEUgPT0gOCAqLwotCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gMTIKLS8qIEpTQU1QTEUgc2hvdWxkIGJlIHRoZSBzbWFsbGVzdCB0eXBlIHRoYXQgd2lsbCBob2xkIHRoZSB2YWx1ZXMgMC4uNDA5NS4KLSAqIE9uIG5lYXJseSBhbGwgbWFjaGluZXMgInNob3J0IiB3aWxsIGRvIG5pY2VseS4KLSAqLwotCi10eXBlZGVmIHNob3J0IEpTQU1QTEU7Ci0jZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSkKLQotI2RlZmluZSBNQVhKU0FNUExFCTQwOTUKLSNkZWZpbmUgQ0VOVEVSSlNBTVBMRQkyMDQ4Ci0KLSNlbmRpZiAvKiBCSVRTX0lOX0pTQU1QTEUgPT0gMTIgKi8KLQotCi0vKiBSZXByZXNlbnRhdGlvbiBvZiBhIERDVCBmcmVxdWVuY3kgY29lZmZpY2llbnQuCi0gKiBUaGlzIHNob3VsZCBiZSBhIHNpZ25lZCB2YWx1ZSBvZiBhdCBsZWFzdCAxNiBiaXRzOyAic2hvcnQiIGlzIHVzdWFsbHkgT0suCi0gKiBBZ2Fpbiwgd2UgYWxsb2NhdGUgbGFyZ2UgYXJyYXlzIG9mIHRoZXNlLCBidXQgeW91IGNhbiBjaGFuZ2UgdG8gaW50Ci0gKiBpZiB5b3UgaGF2ZSBtZW1vcnkgdG8gYnVybiBhbmQgInNob3J0IiBpcyByZWFsbHkgc2xvdy4KLSAqLwotCi10eXBlZGVmIHNob3J0IEpDT0VGOwotCi0KLS8qIENvbXByZXNzZWQgZGF0YXN0cmVhbXMgYXJlIHJlcHJlc2VudGVkIGFzIGFycmF5cyBvZiBKT0NURVQuCi0gKiBUaGVzZSBtdXN0IGJlIEVYQUNUTFkgOCBiaXRzIHdpZGUsIGF0IGxlYXN0IG9uY2UgdGhleSBhcmUgd3JpdHRlbiB0bwotICogZXh0ZXJuYWwgc3RvcmFnZS4gIE5vdGUgdGhhdCB3aGVuIHVzaW5nIHRoZSBzdGRpbyBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbgotICogbWFuYWdlcnMsIHRoaXMgaXMgYWxzbyB0aGUgZGF0YSB0eXBlIHBhc3NlZCB0byBmcmVhZC9md3JpdGUuCi0gKi8KLQotI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgSk9DVEVUOwotI2RlZmluZSBHRVRKT0NURVQodmFsdWUpICAodmFsdWUpCi0KLSNlbHNlIC8qIG5vdCBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLQotdHlwZWRlZiBjaGFyIEpPQ1RFVDsKLSNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jZGVmaW5lIEdFVEpPQ1RFVCh2YWx1ZSkgICh2YWx1ZSkKLSNlbHNlCi0jZGVmaW5lIEdFVEpPQ1RFVCh2YWx1ZSkgICgodmFsdWUpICYgMHhGRikKLSNlbmRpZiAvKiBDSEFSX0lTX1VOU0lHTkVEICovCi0KLSNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLQotCi0vKiBUaGVzZSB0eXBlZGVmcyBhcmUgdXNlZCBmb3IgdmFyaW91cyB0YWJsZSBlbnRyaWVzIGFuZCBzbyBmb3J0aC4KLSAqIFRoZXkgbXVzdCBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIHNwZWNpZmllZDsgYnV0IG1ha2luZyB0aGVtIHRvbyBiaWcKLSAqIHdvbid0IGNvc3QgYSBodWdlIGFtb3VudCBvZiBtZW1vcnksIHNvIHdlIGRvbid0IHByb3ZpZGUgc3BlY2lhbAotICogZXh0cmFjdGlvbiBjb2RlIGxpa2Ugd2UgZGlkIGZvciBKU0FNUExFLiAgKEluIG90aGVyIHdvcmRzLCB0aGVzZQotICogdHlwZWRlZnMgbGl2ZSBhdCBhIGRpZmZlcmVudCBwb2ludCBvbiB0aGUgc3BlZWQvc3BhY2UgdHJhZGVvZmYgY3VydmUuKQotICovCi0KLS8qIFVJTlQ4IG11c3QgaG9sZCBhdCBsZWFzdCB0aGUgdmFsdWVzIDAuLjI1NS4gKi8KLQotI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJTlQ4OwotI2Vsc2UgLyogbm90IEhBVkVfVU5TSUdORURfQ0hBUiAqLwotI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKLXR5cGVkZWYgY2hhciBVSU5UODsKLSNlbHNlIC8qIG5vdCBDSEFSX0lTX1VOU0lHTkVEICovCi10eXBlZGVmIHNob3J0IFVJTlQ4OwotI2VuZGlmIC8qIENIQVJfSVNfVU5TSUdORUQgKi8KLSNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLQotLyogVUlOVDE2IG11c3QgaG9sZCBhdCBsZWFzdCB0aGUgdmFsdWVzIDAuLjY1NTM1LiAqLwotCi0jaWZkZWYgSEFWRV9VTlNJR05FRF9TSE9SVAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVSU5UMTY7Ci0jZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9TSE9SVCAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDE2OwotI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfU0hPUlQgKi8KLQotLyogSU5UMTYgbXVzdCBob2xkIGF0IGxlYXN0IHRoZSB2YWx1ZXMgLTMyNzY4Li4zMjc2Ny4gKi8KLQotI2lmbmRlZiBYTURfSAkJCS8qIFgxMS94bWQuaCBjb3JyZWN0bHkgZGVmaW5lcyBJTlQxNiAqLwotdHlwZWRlZiBzaG9ydCBJTlQxNjsKLSNlbmRpZgotCi0vKiBJTlQzMiBtdXN0IGhvbGQgYXQgbGVhc3Qgc2lnbmVkIDMyLWJpdCB2YWx1ZXMuICovCi0KLSNpZm5kZWYgWE1EX0gJCQkvKiBYMTEveG1kLmggY29ycmVjdGx5IGRlZmluZXMgSU5UMzIgKi8KLXR5cGVkZWYgbG9uZyBJTlQzMjsKLSNlbmRpZgotCi0vKiBEYXRhdHlwZSB1c2VkIGZvciBpbWFnZSBkaW1lbnNpb25zLiAgVGhlIEpQRUcgc3RhbmRhcmQgb25seSBzdXBwb3J0cwotICogaW1hZ2VzIHVwIHRvIDY0Syo2NEsgZHVlIHRvIDE2LWJpdCBmaWVsZHMgaW4gU09GIG1hcmtlcnMuICBUaGVyZWZvcmUKLSAqICJ1bnNpZ25lZCBpbnQiIGlzIHN1ZmZpY2llbnQgb24gYWxsIG1hY2hpbmVzLiAgSG93ZXZlciwgaWYgeW91IG5lZWQgdG8KLSAqIGhhbmRsZSBsYXJnZXIgaW1hZ2VzIGFuZCB5b3UgZG9uJ3QgbWluZCBkZXZpYXRpbmcgZnJvbSB0aGUgc3BlYywgeW91Ci0gKiBjYW4gY2hhbmdlIHRoaXMgZGF0YXR5cGUuCi0gKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgSkRJTUVOU0lPTjsKLQotI2RlZmluZSBKUEVHX01BWF9ESU1FTlNJT04gIDY1NTAwTCAgLyogYSB0YWQgdW5kZXIgNjRLIHRvIHByZXZlbnQgb3ZlcmZsb3dzICovCi0KLQotLyogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGluIGFsbCBmdW5jdGlvbiBkZWZpbml0aW9ucyBhbmQgZXh0ZXJuIGRlY2xhcmF0aW9ucy4KLSAqIFlvdSBjb3VsZCBtb2RpZnkgdGhlbSBpZiB5b3UgbmVlZCB0byBjaGFuZ2UgZnVuY3Rpb24gbGlua2FnZSBjb252ZW50aW9uczsKLSAqIGluIHBhcnRpY3VsYXIsIHlvdSdsbCBuZWVkIHRvIGRvIHRoYXQgdG8gbWFrZSB0aGUgbGlicmFyeSBhIFdpbmRvd3MgRExMLgotICogQW5vdGhlciBhcHBsaWNhdGlvbiBpcyB0byBtYWtlIGFsbCBmdW5jdGlvbnMgZ2xvYmFsIGZvciB1c2Ugd2l0aCBkZWJ1Z2dlcnMKLSAqIG9yIGNvZGUgcHJvZmlsZXJzIHRoYXQgcmVxdWlyZSBpdC4KLSAqLwotCi0vKiBhIGZ1bmN0aW9uIGNhbGxlZCB0aHJvdWdoIG1ldGhvZCBwb2ludGVyczogKi8KLSNkZWZpbmUgTUVUSE9EREVGKHR5cGUpCQlzdGF0aWMgdHlwZQotLyogYSBmdW5jdGlvbiB1c2VkIG9ubHkgaW4gaXRzIG1vZHVsZTogKi8KLSNkZWZpbmUgTE9DQUwodHlwZSkJCXN0YXRpYyB0eXBlCi0vKiBhIGZ1bmN0aW9uIHJlZmVyZW5jZWQgdGhydSBFWFRFUk5zOiAqLwotI2RlZmluZSBHTE9CQUwodHlwZSkJCXR5cGUKLS8qIGEgcmVmZXJlbmNlIHRvIGEgR0xPQkFMIGZ1bmN0aW9uOiAqLwotI2RlZmluZSBFWFRFUk4odHlwZSkJCWV4dGVybiB0eXBlCi0KLQotLyogVGhpcyBtYWNybyBpcyB1c2VkIHRvIGRlY2xhcmUgYSAibWV0aG9kIiwgdGhhdCBpcywgYSBmdW5jdGlvbiBwb2ludGVyLgotICogV2Ugd2FudCB0byBzdXBwbHkgcHJvdG90eXBlIHBhcmFtZXRlcnMgaWYgdGhlIGNvbXBpbGVyIGNhbiBjb3BlLgotICogTm90ZSB0aGF0IHRoZSBhcmdsaXN0IHBhcmFtZXRlciBtdXN0IGJlIHBhcmVudGhlc2l6ZWQhCi0gKiBBZ2FpbiwgeW91IGNhbiBjdXN0b21pemUgdGhpcyBpZiB5b3UgbmVlZCBzcGVjaWFsIGxpbmthZ2Uga2V5d29yZHMuCi0gKi8KLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgdHlwZSAoKm1ldGhvZG5hbWUpIGFyZ2xpc3QKLSNlbHNlCi0jZGVmaW5lIEpNRVRIT0QodHlwZSxtZXRob2RuYW1lLGFyZ2xpc3QpICB0eXBlICgqbWV0aG9kbmFtZSkgKCkKLSNlbmRpZgotCi0KLS8qIEhlcmUgaXMgdGhlIHBzZXVkby1rZXl3b3JkIGZvciBkZWNsYXJpbmcgcG9pbnRlcnMgdGhhdCBtdXN0IGJlICJmYXIiCi0gKiBvbiA4MHg4NiBtYWNoaW5lcy4gIE1vc3Qgb2YgdGhlIHNwZWNpYWxpemVkIGNvZGluZyBmb3IgODB4ODYgaXMgaGFuZGxlZAotICogYnkganVzdCBzYXlpbmcgIkZBUiAqIiB3aGVyZSBzdWNoIGEgcG9pbnRlciBpcyBuZWVkZWQuICBJbiBhIGZldyBwbGFjZXMKLSAqIGV4cGxpY2l0IGNvZGluZyBpcyBuZWVkZWQ7IHNlZSB1c2VzIG9mIHRoZSBORUVEX0ZBUl9QT0lOVEVSUyBzeW1ib2wuCi0gKi8KLQotI2lmZGVmIE5FRURfRkFSX1BPSU5URVJTCi0jZGVmaW5lIEZBUiAgZmFyCi0jZWxzZQotI2RlZmluZSBGQVIKLSNlbmRpZgotCi0KLS8qCi0gKiBPbiBhIGZldyBzeXN0ZW1zLCB0eXBlIGJvb2xlYW4gYW5kL29yIGl0cyB2YWx1ZXMgRkFMU0UsIFRSVUUgbWF5IGFwcGVhcgotICogaW4gc3RhbmRhcmQgaGVhZGVyIGZpbGVzLiAgT3IgeW91IG1heSBoYXZlIGNvbmZsaWN0cyB3aXRoIGFwcGxpY2F0aW9uLQotICogc3BlY2lmaWMgaGVhZGVyIGZpbGVzIHRoYXQgeW91IHdhbnQgdG8gaW5jbHVkZSB0b2dldGhlciB3aXRoIHRoZXNlIGZpbGVzLgotICogRGVmaW5pbmcgSEFWRV9CT09MRUFOIGJlZm9yZSBpbmNsdWRpbmcganBlZ2xpYi5oIHNob3VsZCBtYWtlIGl0IHdvcmsuCi0gKi8KLQotI2lmbmRlZiBIQVZFX0JPT0xFQU4KLXR5cGVkZWYgaW50IGJvb2xlYW47Ci0jZW5kaWYKLSNpZm5kZWYgRkFMU0UJCQkvKiBpbiBjYXNlIHRoZXNlIG1hY3JvcyBhbHJlYWR5IGV4aXN0ICovCi0jZGVmaW5lIEZBTFNFCTAJCS8qIHZhbHVlcyBvZiBib29sZWFuICovCi0jZW5kaWYKLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFCTEKLSNlbmRpZgotCi0KLS8qCi0gKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgYWZmZWN0IGNvZGUgc2VsZWN0aW9uIHdpdGhpbiB0aGUgSlBFRyBsaWJyYXJ5LAotICogYnV0IHRoZXkgZG9uJ3QgbmVlZCB0byBiZSB2aXNpYmxlIHRvIG1vc3QgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5LgotICogVG8gbWluaW1pemUgYXBwbGljYXRpb24gbmFtZXNwYWNlIHBvbGx1dGlvbiwgdGhlIHN5bWJvbHMgd29uJ3QgYmUKLSAqIGRlZmluZWQgdW5sZXNzIEpQRUdfSU5URVJOQUxTIG9yIEpQRUdfSU5URVJOQUxfT1BUSU9OUyBoYXMgYmVlbiBkZWZpbmVkLgotICovCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotI2RlZmluZSBKUEVHX0lOVEVSTkFMX09QVElPTlMKLSNlbmRpZgotCi0jaWZkZWYgSlBFR19JTlRFUk5BTF9PUFRJT05TCi0KLQotLyoKLSAqIFRoZXNlIGRlZmluZXMgaW5kaWNhdGUgd2hldGhlciB0byBpbmNsdWRlIHZhcmlvdXMgb3B0aW9uYWwgZnVuY3Rpb25zLgotICogVW5kZWZpbmluZyBzb21lIG9mIHRoZXNlIHN5bWJvbHMgd2lsbCBwcm9kdWNlIGEgc21hbGxlciBidXQgbGVzcyBjYXBhYmxlCi0gKiBsaWJyYXJ5LiAgTm90ZSB0aGF0IHlvdSBjYW4gbGVhdmUgY2VydGFpbiBzb3VyY2UgZmlsZXMgb3V0IG9mIHRoZQotICogY29tcGlsYXRpb24vbGlua2luZyBwcm9jZXNzIGlmIHlvdSd2ZSAjdW5kZWYnZCB0aGUgY29ycmVzcG9uZGluZyBzeW1ib2xzLgotICogKFlvdSBtYXkgSEFWRSB0byBkbyB0aGF0IGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBsaWtlIG51bGwgc291cmNlIGZpbGVzLikKLSAqLwotCi0vKiBBcml0aG1ldGljIGNvZGluZyBpcyB1bnN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4gIENvbXBsYWludHMgdG8gSUJNLiAqLwotCi0vKiBDYXBhYmlsaXR5IG9wdGlvbnMgY29tbW9uIHRvIGVuY29kZXIgYW5kIGRlY29kZXI6ICovCi0KLSNkZWZpbmUgRENUX0lTTE9XX1NVUFBPUlRFRAkvKiBzbG93IGJ1dCBhY2N1cmF0ZSBpbnRlZ2VyIGFsZ29yaXRobSAqLwotI2RlZmluZSBEQ1RfSUZBU1RfU1VQUE9SVEVECS8qIGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZCAqLwotI2RlZmluZSBEQ1RfRkxPQVRfU1VQUE9SVEVECS8qIGZsb2F0aW5nLXBvaW50OiBhY2N1cmF0ZSwgZmFzdCBvbiBmYXN0IEhXICovCi0KLS8qIEVuY29kZXIgY2FwYWJpbGl0eSBvcHRpb25zOiAqLwotCi0jdW5kZWYgIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAgICAvKiBBcml0aG1ldGljIGNvZGluZyBiYWNrIGVuZD8gKi8KLSNkZWZpbmUgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEIC8qIE11bHRpcGxlLXNjYW4gSlBFRyBmaWxlcz8gKi8KLSNkZWZpbmUgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQJICAgIC8qIFByb2dyZXNzaXZlIEpQRUc/IChSZXF1aXJlcyBNVUxUSVNDQU4pKi8KLSNkZWZpbmUgRU5UUk9QWV9PUFRfU1VQUE9SVEVECSAgICAvKiBPcHRpbWl6YXRpb24gb2YgZW50cm9weSBjb2RpbmcgcGFybXM/ICovCi0vKiBOb3RlOiBpZiB5b3Ugc2VsZWN0ZWQgMTItYml0IGRhdGEgcHJlY2lzaW9uLCBpdCBpcyBkYW5nZXJvdXMgdG8gdHVybiBvZmYKLSAqIEVOVFJPUFlfT1BUX1NVUFBPUlRFRC4gIFRoZSBzdGFuZGFyZCBIdWZmbWFuIHRhYmxlcyBhcmUgb25seSBnb29kIGZvciA4LWJpdAotICogcHJlY2lzaW9uLCBzbyBqY2h1ZmYuYyBub3JtYWxseSB1c2VzIGVudHJvcHkgb3B0aW1pemF0aW9uIHRvIGNvbXB1dGUKLSAqIHVzYWJsZSB0YWJsZXMgZm9yIGhpZ2hlciBwcmVjaXNpb24uICBJZiB5b3UgZG9uJ3Qgd2FudCB0byBkbyBvcHRpbWl6YXRpb24sCi0gKiB5b3UnbGwgaGF2ZSB0byBzdXBwbHkgZGlmZmVyZW50IGRlZmF1bHQgSHVmZm1hbiB0YWJsZXMuCi0gKiBUaGUgZXhhY3Qgc2FtZSBzdGF0ZW1lbnRzIGFwcGx5IGZvciBwcm9ncmVzc2l2ZSBKUEVHOiB0aGUgZGVmYXVsdCB0YWJsZXMKLSAqIGRvbid0IHdvcmsgZm9yIHByb2dyZXNzaXZlIG1vZGUuICAoVGhpcyBtYXkgZ2V0IGZpeGVkLCBob3dldmVyLikKLSAqLwotI2RlZmluZSBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVEICAgLyogSW5wdXQgaW1hZ2Ugc21vb3RoaW5nIG9wdGlvbj8gKi8KLQotLyogRGVjb2RlciBjYXBhYmlsaXR5IG9wdGlvbnM6ICovCi0KLSN1bmRlZiAgRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVEICAgIC8qIEFyaXRobWV0aWMgY29kaW5nIGJhY2sgZW5kPyAqLwotI2RlZmluZSBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgLyogTXVsdGlwbGUtc2NhbiBKUEVHIGZpbGVzPyAqLwotI2RlZmluZSBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAkgICAgLyogUHJvZ3Jlc3NpdmUgSlBFRz8gKFJlcXVpcmVzIE1VTFRJU0NBTikqLwotI2RlZmluZSBTQVZFX01BUktFUlNfU1VQUE9SVEVECSAgICAvKiBqcGVnX3NhdmVfbWFya2VycygpIG5lZWRlZD8gKi8KLSNkZWZpbmUgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRCAgIC8qIEJsb2NrIHNtb290aGluZz8gKFByb2dyZXNzaXZlIG9ubHkpICovCi0jZGVmaW5lIElEQ1RfU0NBTElOR19TVVBQT1JURUQJICAgIC8qIE91dHB1dCByZXNjYWxpbmcgdmlhIElEQ1Q/ICovCi0jdW5kZWYgIFVQU0FNUExFX1NDQUxJTkdfU1VQUE9SVEVEICAvKiBPdXRwdXQgcmVzY2FsaW5nIGF0IHVwc2FtcGxlIHN0YWdlPyAqLwotI2RlZmluZSBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRCAgLyogRmFzdCBwYXRoIGZvciBzbG9wcHkgdXBzYW1wbGluZz8gKi8KLSNkZWZpbmUgUVVBTlRfMVBBU1NfU1VQUE9SVEVECSAgICAvKiAxLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uPyAqLwotI2RlZmluZSBRVUFOVF8yUEFTU19TVVBQT1JURUQJICAgIC8qIDItcGFzcyBjb2xvciBxdWFudGl6YXRpb24/ICovCi0KLS8qIG1vcmUgY2FwYWJpbGl0eSBvcHRpb25zIGxhdGVyLCBubyBkb3VidCAqLwotCi0KLS8qCi0gKiBPcmRlcmluZyBvZiBSR0IgZGF0YSBpbiBzY2FubGluZXMgcGFzc2VkIHRvIG9yIGZyb20gdGhlIGFwcGxpY2F0aW9uLgotICogSWYgeW91ciBhcHBsaWNhdGlvbiB3YW50cyB0byBkZWFsIHdpdGggZGF0YSBpbiB0aGUgb3JkZXIgQixHLFIsIGp1c3QKLSAqIGNoYW5nZSB0aGVzZSBtYWNyb3MuICBZb3UgY2FuIGFsc28gZGVhbCB3aXRoIGZvcm1hdHMgc3VjaCBhcyBSLEcsQixYCi0gKiAob25lIGV4dHJhIGJ5dGUgcGVyIHBpeGVsKSBieSBjaGFuZ2luZyBSR0JfUElYRUxTSVpFLiAgTm90ZSB0aGF0IGNoYW5naW5nCi0gKiB0aGUgb2Zmc2V0cyB3aWxsIGFsc28gY2hhbmdlIHRoZSBvcmRlciBpbiB3aGljaCBjb2xvcm1hcCBkYXRhIGlzIG9yZ2FuaXplZC4KLSAqIFJFU1RSSUNUSU9OUzoKLSAqIDEuIFRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnLGRqcGVnIGRvIE5PVCBzdXBwb3J0IG1vZGlmaWVkIFJHQiBmb3JtYXRzLgotICogMi4gVGhlc2UgbWFjcm9zIG9ubHkgYWZmZWN0IFJHQjw9PllDYkNyIGNvbG9yIGNvbnZlcnNpb24sIHNvIHRoZXkgYXJlIG5vdAotICogICAgdXNlZnVsIGlmIHlvdSBhcmUgdXNpbmcgSlBFRyBjb2xvciBzcGFjZXMgb3RoZXIgdGhhbiBZQ2JDciBvciBncmF5c2NhbGUuCi0gKiAzLiBUaGUgY29sb3IgcXVhbnRpemVyIG1vZHVsZXMgd2lsbCBub3QgYmVoYXZlIGRlc2lyYWJseSBpZiBSR0JfUElYRUxTSVpFCi0gKiAgICBpcyBub3QgMyAodGhleSBkb24ndCB1bmRlcnN0YW5kIGFib3V0IGR1bW15IGNvbG9yIGNvbXBvbmVudHMhKS4gIFNvIHlvdQotICogICAgY2FuJ3QgdXNlIGNvbG9yIHF1YW50aXphdGlvbiBpZiB5b3UgY2hhbmdlIHRoYXQgdmFsdWUuCi0gKi8KLQotI2RlZmluZSBSR0JfUkVECQkwCS8qIE9mZnNldCBvZiBSZWQgaW4gYW4gUkdCIHNjYW5saW5lIGVsZW1lbnQgKi8KLSNkZWZpbmUgUkdCX0dSRUVOCTEJLyogT2Zmc2V0IG9mIEdyZWVuICovCi0jZGVmaW5lIFJHQl9CTFVFCTIJLyogT2Zmc2V0IG9mIEJsdWUgKi8KLSNpZmRlZiBBTkRST0lEX1JHQgotI2RlZmluZSBSR0JfQUxQSEEgICAzICAgLyogT2Zmc2V0IG9mIEFscGhhICovCi0jZW5kaWYKLSNkZWZpbmUgUkdCX1BJWEVMU0laRSAgIDMgICAvKiBKU0FNUExFcyBwZXIgUkdCIHNjYW5saW5lIGVsZW1lbnQgKi8KLQotLyogRGVmaW5pdGlvbnMgZm9yIHNwZWVkLXJlbGF0ZWQgb3B0aW1pemF0aW9ucy4gKi8KLQotCi0vKiBJZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIGlubGluZSBmdW5jdGlvbnMsIGRlZmluZSBJTkxJTkUKLSAqIGFzIHRoZSBpbmxpbmUga2V5d29yZDsgb3RoZXJ3aXNlIGRlZmluZSBpdCBhcyBlbXB0eS4KLSAqLwotCi0jaWZuZGVmIElOTElORQotI2lmZGVmIF9fR05VQ19fCQkJLyogZm9yIGluc3RhbmNlLCBHTlUgQyBrbm93cyBhYm91dCBpbmxpbmUgKi8KLSNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KLSNlbmRpZgotI2lmbmRlZiBJTkxJTkUKLSNkZWZpbmUgSU5MSU5FCQkJLyogZGVmYXVsdCBpcyB0byBkZWZpbmUgaXQgYXMgZW1wdHkgKi8KLSNlbmRpZgotI2VuZGlmCi0KLQotLyogT24gc29tZSBtYWNoaW5lcyAobm90YWJseSA2ODAwMCBzZXJpZXMpICJpbnQiIGlzIDMyIGJpdHMsIGJ1dCBtdWx0aXBseWluZwotICogdHdvIDE2LWJpdCBzaG9ydHMgaXMgZmFzdGVyIHRoYW4gbXVsdGlwbHlpbmcgdHdvIGludHMuICBEZWZpbmUgTVVMVElQTElFUgotICogYXMgc2hvcnQgb24gc3VjaCBhIG1hY2hpbmUuICBNVUxUSVBMSUVSIG11c3QgYmUgYXQgbGVhc3QgMTYgYml0cyB3aWRlLgotICovCi0KLSNpZm5kZWYgTVVMVElQTElFUgotI2RlZmluZSBNVUxUSVBMSUVSICBpbnQJCS8qIHR5cGUgZm9yIGZhc3Rlc3QgaW50ZWdlciBtdWx0aXBseSAqLwotI2VuZGlmCi0KLQotLyogRkFTVF9GTE9BVCBzaG91bGQgYmUgZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSwgd2hpY2hldmVyIGlzIGRvbmUgZmFzdGVyCi0gKiBieSB5b3VyIGNvbXBpbGVyLiAgKE5vdGUgdGhhdCB0aGlzIHR5cGUgaXMgb25seSB1c2VkIGluIHRoZSBmbG9hdGluZyBwb2ludAotICogRENUIHJvdXRpbmVzLCBzbyBpdCBvbmx5IG1hdHRlcnMgaWYgeW91J3ZlIGRlZmluZWQgRENUX0ZMT0FUX1NVUFBPUlRFRC4pCi0gKiBUeXBpY2FsbHksIGZsb2F0IGlzIGZhc3RlciBpbiBBTlNJIEMgY29tcGlsZXJzLCB3aGlsZSBkb3VibGUgaXMgZmFzdGVyIGluCi0gKiBwcmUtQU5TSSBjb21waWxlcnMgKGJlY2F1c2UgdGhleSBpbnNpc3Qgb24gY29udmVydGluZyB0byBkb3VibGUgYW55d2F5KS4KLSAqIFRoZSBjb2RlIGJlbG93IHRoZXJlZm9yZSBjaG9vc2VzIGZsb2F0IGlmIHdlIGhhdmUgQU5TSS1zdHlsZSBwcm90b3R5cGVzLgotICovCi0KLSNpZm5kZWYgRkFTVF9GTE9BVAotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBGQVNUX0ZMT0FUICBmbG9hdAotI2Vsc2UKLSNkZWZpbmUgRkFTVF9GTE9BVCAgZG91YmxlCi0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTF9PUFRJT05TICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qcGVnaW50LmggYi9saWJqcGVndHdycC9qcGVnaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjlmZmUuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvanBlZ2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8qCi0gKiBqcGVnaW50LmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgY29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHZhcmlvdXMgSlBFRyBtb2R1bGVzLgotICogVGhlc2UgZGVjbGFyYXRpb25zIGFyZSBjb25zaWRlcmVkIGludGVybmFsIHRvIHRoZSBKUEVHIGxpYnJhcnk7IG1vc3QKLSAqIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBzaG91bGRuJ3QgbmVlZCB0byBpbmNsdWRlIHRoaXMgZmlsZS4KLSAqLwotCi0KLS8qIERlY2xhcmF0aW9ucyBmb3IgYm90aCBjb21wcmVzc2lvbiAmIGRlY29tcHJlc3Npb24gKi8KLQotdHlwZWRlZiBlbnVtIHsJCQkvKiBPcGVyYXRpbmcgbW9kZXMgZm9yIGJ1ZmZlciBjb250cm9sbGVycyAqLwotCUpCVUZfUEFTU19USFJVLAkJLyogUGxhaW4gc3RyaXB3aXNlIG9wZXJhdGlvbiAqLwotCS8qIFJlbWFpbmluZyBtb2RlcyByZXF1aXJlIGEgZnVsbC1pbWFnZSBidWZmZXIgdG8gaGF2ZSBiZWVuIGNyZWF0ZWQgKi8KLQlKQlVGX1NBVkVfU09VUkNFLAkvKiBSdW4gc291cmNlIHN1Ym9iamVjdCBvbmx5LCBzYXZlIG91dHB1dCAqLwotCUpCVUZfQ1JBTktfREVTVCwJLyogUnVuIGRlc3Qgc3Vib2JqZWN0IG9ubHksIHVzaW5nIHNhdmVkIGRhdGEgKi8KLQlKQlVGX1NBVkVfQU5EX1BBU1MJLyogUnVuIGJvdGggc3Vib2JqZWN0cywgc2F2ZSBvdXRwdXQgKi8KLX0gSl9CVUZfTU9ERTsKLQotLyogVmFsdWVzIG9mIGdsb2JhbF9zdGF0ZSBmaWVsZCAoamRhcGkuYyBoYXMgc29tZSBkZXBlbmRlbmNpZXMgb24gb3JkZXJpbmchKSAqLwotI2RlZmluZSBDU1RBVEVfU1RBUlQJMTAwCS8qIGFmdGVyIGNyZWF0ZV9jb21wcmVzcyAqLwotI2RlZmluZSBDU1RBVEVfU0NBTk5JTkcJMTAxCS8qIHN0YXJ0X2NvbXByZXNzIGRvbmUsIHdyaXRlX3NjYW5saW5lcyBPSyAqLwotI2RlZmluZSBDU1RBVEVfUkFXX09LCTEwMgkvKiBzdGFydF9jb21wcmVzcyBkb25lLCB3cml0ZV9yYXdfZGF0YSBPSyAqLwotI2RlZmluZSBDU1RBVEVfV1JDT0VGUwkxMDMJLyoganBlZ193cml0ZV9jb2VmZmljaWVudHMgZG9uZSAqLwotI2RlZmluZSBEU1RBVEVfU1RBUlQJMjAwCS8qIGFmdGVyIGNyZWF0ZV9kZWNvbXByZXNzICovCi0jZGVmaW5lIERTVEFURV9JTkhFQURFUgkyMDEJLyogcmVhZGluZyBoZWFkZXIgbWFya2Vycywgbm8gU09TIHlldCAqLwotI2RlZmluZSBEU1RBVEVfUkVBRFkJMjAyCS8qIGZvdW5kIFNPUywgcmVhZHkgZm9yIHN0YXJ0X2RlY29tcHJlc3MgKi8KLSNkZWZpbmUgRFNUQVRFX1BSRUxPQUQJMjAzCS8qIHJlYWRpbmcgbXVsdGlzY2FuIGZpbGUgaW4gc3RhcnRfZGVjb21wcmVzcyovCi0jZGVmaW5lIERTVEFURV9QUkVTQ0FOCTIwNAkvKiBwZXJmb3JtaW5nIGR1bW15IHBhc3MgZm9yIDItcGFzcyBxdWFudCAqLwotI2RlZmluZSBEU1RBVEVfU0NBTk5JTkcJMjA1CS8qIHN0YXJ0X2RlY29tcHJlc3MgZG9uZSwgcmVhZF9zY2FubGluZXMgT0sgKi8KLSNkZWZpbmUgRFNUQVRFX1JBV19PSwkyMDYJLyogc3RhcnRfZGVjb21wcmVzcyBkb25lLCByZWFkX3Jhd19kYXRhIE9LICovCi0jZGVmaW5lIERTVEFURV9CVUZJTUFHRQkyMDcJLyogZXhwZWN0aW5nIGpwZWdfc3RhcnRfb3V0cHV0ICovCi0jZGVmaW5lIERTVEFURV9CVUZQT1NUCTIwOAkvKiBsb29raW5nIGZvciBTT1MvRU9JIGluIGpwZWdfZmluaXNoX291dHB1dCAqLwotI2RlZmluZSBEU1RBVEVfUkRDT0VGUwkyMDkJLyogcmVhZGluZyBmaWxlIGluIGpwZWdfcmVhZF9jb2VmZmljaWVudHMgKi8KLSNkZWZpbmUgRFNUQVRFX1NUT1BQSU5HCTIxMAkvKiBsb29raW5nIGZvciBFT0kgaW4ganBlZ19maW5pc2hfZGVjb21wcmVzcyAqLwotCi0KLS8qIERlY2xhcmF0aW9ucyBmb3IgY29tcHJlc3Npb24gbW9kdWxlcyAqLwotCi0vKiBNYXN0ZXIgY29udHJvbCBtb2R1bGUgKi8KLXN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBwcmVwYXJlX2Zvcl9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBwYXNzX3N0YXJ0dXAsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLQotICAvKiBTdGF0ZSB2YXJpYWJsZXMgbWFkZSB2aXNpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KLSAgYm9vbGVhbiBjYWxsX3Bhc3Nfc3RhcnR1cDsJLyogVHJ1ZSBpZiBwYXNzX3N0YXJ0dXAgbXVzdCBiZSBjYWxsZWQgKi8KLSAgYm9vbGVhbiBpc19sYXN0X3Bhc3M7CQkvKiBUcnVlIGR1cmluZyBsYXN0IHBhc3MgKi8KLX07Ci0KLS8qIE1haW4gYnVmZmVyIGNvbnRyb2wgKGRvd25zYW1wbGVkLWRhdGEgYnVmZmVyKSAqLwotc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKLSAgSk1FVEhPRCh2b2lkLCBwcm9jZXNzX2RhdGEsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKLQkJCSAgICAgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpKTsKLX07Ci0KLS8qIENvbXByZXNzaW9uIHByZXByb2Nlc3NpbmcgKGRvd25zYW1wbGluZyBpbnB1dCBidWZmZXIgY29udHJvbCkgKi8KLXN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7Ci0gIEpNRVRIT0Qodm9pZCwgcHJlX3Byb2Nlc3NfZGF0YSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAotCQkJCSAgIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCi0JCQkJICAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsLAotCQkJCSAgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkJCQkgICBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKLQkJCQkgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKSk7Ci19OwotCi0vKiBDb2VmZmljaWVudCBidWZmZXIgY29udHJvbCAqLwotc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKLSAgSk1FVEhPRChib29sZWFuLCBjb21wcmVzc19kYXRhLCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKLX07Ci0KLS8qIENvbG9yc3BhY2UgY29udmVyc2lvbiAqLwotc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBjb2xvcl9jb252ZXJ0LCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkJCQlKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykpOwotfTsKLQotLyogRG93bnNhbXBsaW5nICovCi1zdHJ1Y3QganBlZ19kb3duc2FtcGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZG93bnNhbXBsZSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfaW5kZXgsCi0JCQkgICAgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkJCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3VwX2luZGV4KSk7Ci0KLSAgYm9vbGVhbiBuZWVkX2NvbnRleHRfcm93czsJLyogVFJVRSBpZiBuZWVkIHJvd3MgYWJvdmUgJiBiZWxvdyAqLwotfTsKLQotLyogRm9yd2FyZCBEQ1QgKGFsc28gY29udHJvbHMgY29lZmZpY2llbnQgcXVhbnRpemF0aW9uKSAqLwotc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICAvKiBwZXJoYXBzIHRoaXMgc2hvdWxkIGJlIGFuIGFycmF5Pz8/ICovCi0gIEpNRVRIT0Qodm9pZCwgZm9yd2FyZF9EQ1QsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkJICAgICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAotCQkJICAgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gc3RhcnRfY29sLAotCQkJICAgICAgSkRJTUVOU0lPTiBudW1fYmxvY2tzKSk7Ci19OwotCi0vKiBFbnRyb3B5IGVuY29kaW5nICovCi1zdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBnYXRoZXJfc3RhdGlzdGljcykpOwotICBKTUVUSE9EKGJvb2xlYW4sIGVuY29kZV9tY3UsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLX07Ci0KLS8qIE1hcmtlciB3cml0aW5nICovCi1zdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHsKLSAgSk1FVEhPRCh2b2lkLCB3cml0ZV9maWxlX2hlYWRlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfZnJhbWVfaGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCB3cml0ZV9zY2FuX2hlYWRlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfZmlsZV90cmFpbGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCB3cml0ZV90YWJsZXNfb25seSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIC8qIFRoZXNlIHJvdXRpbmVzIGFyZSBleHBvcnRlZCB0byBhbGxvdyBpbnNlcnRpb24gb2YgZXh0cmEgbWFya2VycyAqLwotICAvKiBQcm9iYWJseSBvbmx5IENPTSBhbmQgQVBQbiBtYXJrZXJzIHNob3VsZCBiZSB3cml0dGVuIHRoaXMgd2F5ICovCi0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfbWFya2VyX2hlYWRlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBkYXRhbGVuKSk7Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfbWFya2VyX2J5dGUsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkpOwotfTsKLQotCi0vKiBEZWNsYXJhdGlvbnMgZm9yIGRlY29tcHJlc3Npb24gbW9kdWxlcyAqLwotCi0vKiBNYXN0ZXIgY29udHJvbCBtb2R1bGUgKi8KLXN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgewotICBKTUVUSE9EKHZvaWQsIHByZXBhcmVfZm9yX291dHB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9vdXRwdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotICAvKiBTdGF0ZSB2YXJpYWJsZXMgbWFkZSB2aXNpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KLSAgYm9vbGVhbiBpc19kdW1teV9wYXNzOwkvKiBUcnVlIGR1cmluZyAxc3QgcGFzcyBmb3IgMi1wYXNzIHF1YW50ICovCi19OwotCi0vKiBJbnB1dCBjb250cm9sIG1vZHVsZSAqLwotc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciB7Ci0gIEpNRVRIT0QoaW50LCBjb25zdW1lX2lucHV0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKGludCwgY29uc3VtZV9pbnB1dF9idWlsZF9odWZmbWFuX2luZGV4LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsIGludCBzY2FuX2NvdW50KSk7Ci0gIEpNRVRIT0QoaW50LCBjb25zdW1lX21hcmtlcnMsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IHNjYW5fY291bnQpKTsKLSAgSk1FVEhPRCh2b2lkLCByZXNldF9pbnB1dF9jb250cm9sbGVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X2lucHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZmluaXNoX2lucHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLSAgLyogU3RhdGUgdmFyaWFibGVzIG1hZGUgdmlzaWJsZSB0byBvdGhlciBtb2R1bGVzICovCi0gIGJvb2xlYW4gaGFzX211bHRpcGxlX3NjYW5zOwkvKiBUcnVlIGlmIGZpbGUgaGFzIG11bHRpcGxlIHNjYW5zICovCi0gIGJvb2xlYW4gZW9pX3JlYWNoZWQ7CQkvKiBUcnVlIHdoZW4gRU9JIGhhcyBiZWVuIGNvbnN1bWVkICovCi19OwotCi0vKiBNYWluIGJ1ZmZlciBjb250cm9sIChkb3duc2FtcGxlZC1kYXRhIGJ1ZmZlcikgKi8KLXN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKLSAgSk1FVEhPRCh2b2lkLCBwcm9jZXNzX2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCQkgICAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotfTsKLQotLyogQ29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2wgKi8KLXN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9pbnB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKGludCwgY29uc3VtZV9kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKGludCwgY29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXgsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4KiBpbmRleCwgaW50IHNjYW5fY291bnQpKTsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9vdXRwdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChpbnQsIGRlY29tcHJlc3NfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOwotICAvKiBQb2ludGVyIHRvIGFycmF5IG9mIGNvZWZmaWNpZW50IHZpcnR1YWwgYXJyYXlzLCBvciBOVUxMIGlmIG5vbmUgKi8KLSAganZpcnRfYmFycmF5X3B0ciAqY29lZl9hcnJheXM7Ci0KLSAgLyogY29sdW1uIG51bWJlciBvZiB0aGUgZmlyc3QgYW5kIGxhc3QgdGlsZSwgcmVzcGVjdGl2ZWx5ICovCi0gIGludCBjb2x1bW5fbGVmdF9ib3VuZGFyeTsKLSAgaW50IGNvbHVtbl9yaWdodF9ib3VuZGFyeTsKLQotICAvKiBjb2x1bW4gbnVtYmVyIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBNQ1UsIHJlc3BlY3RpdmVseSAqLwotICBpbnQgTUNVX2NvbHVtbl9sZWZ0X2JvdW5kYXJ5OwotICBpbnQgTUNVX2NvbHVtbl9yaWdodF9ib3VuZGFyeTsKLQotICAvKiB0aGUgbnVtYmVyIG9mIE1DVSBjb2x1bW5zIHRvIHNraXAgZnJvbSB0aGUgaW5kZXhlZCBNQ1UsIGlNLAotICAgKiB0byB0aGUgcmVxdWVzdGVkIE1DVSBib3VuZGFyeSwgck0sIHdoZXJlIGlNIGlzIHRoZSBNQ1UgdGhhdCB3ZSBzYW1wbGUKLSAgICogaW50byBvdXIgaW5kZXggYW5kIGlzIHRoZSBuZWFyZXN0IG9uZSB0byB0aGUgbGVmdCBvZiByTS4KLSAgICovCi0gIGludCBNQ1VfY29sdW1uc190b19za2lwOwotfTsKLQotLyogRGVjb21wcmVzc2lvbiBwb3N0cHJvY2Vzc2luZyAoY29sb3IgcXVhbnRpemF0aW9uIGJ1ZmZlciBjb250cm9sKSAqLwotc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOwotICBKTUVUSE9EKHZvaWQsIHBvc3RfcHJvY2Vzc19kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsCi0JCQkJICAgIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JCQkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkJCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAotCQkJCSAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotfTsKLQotLyogTWFya2VyIHJlYWRpbmcgJiBwYXJzaW5nICovCi1zdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyIHsKLSAgSk1FVEhPRCh2b2lkLCByZXNldF9tYXJrZXJfcmVhZGVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICAvKiBSZWFkIG1hcmtlcnMgdW50aWwgU09TIG9yIEVPSS4KLSAgICogUmV0dXJucyBzYW1lIGNvZGVzIGFzIGFyZSBkZWZpbmVkIGZvciBqcGVnX2NvbnN1bWVfaW5wdXQ6Ci0gICAqIEpQRUdfU1VTUEVOREVELCBKUEVHX1JFQUNIRURfU09TLCBvciBKUEVHX1JFQUNIRURfRU9JLgotICAgKi8KLSAgSk1FVEhPRChpbnQsIHJlYWRfbWFya2VycywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBnZXRfc29zX21hcmtlcl9wb3NpdGlvbiwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4KSk7Ci0gIC8qIFJlYWQgYSByZXN0YXJ0IG1hcmtlciAtLS0gZXhwb3J0ZWQgZm9yIHVzZSBieSBlbnRyb3B5IGRlY29kZXIgb25seSAqLwotICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHJlYWRfcmVzdGFydF9tYXJrZXI7Ci0KLSAgLyogU3RhdGUgb2YgbWFya2VyIHJlYWRlciAtLS0gbm9taW5hbGx5IGludGVybmFsLCBidXQgYXBwbGljYXRpb25zCi0gICAqIHN1cHBseWluZyBDT00gb3IgQVBQbiBoYW5kbGVycyBtaWdodCBsaWtlIHRvIGtub3cgdGhlIHN0YXRlLgotICAgKi8KLSAgYm9vbGVhbiBzYXdfU09JOwkJLyogZm91bmQgU09JPyAqLwotICBib29sZWFuIHNhd19TT0Y7CQkvKiBmb3VuZCBTT0Y/ICovCi0gIGludCBuZXh0X3Jlc3RhcnRfbnVtOwkJLyogbmV4dCByZXN0YXJ0IG51bWJlciBleHBlY3RlZCAoMC03KSAqLwotICBpbnQgY3VycmVudF9zb3NfbWFya2VyX3Bvc2l0aW9uOwotICB1bnNpZ25lZCBpbnQgZGlzY2FyZGVkX2J5dGVzOwkvKiAjIG9mIGJ5dGVzIHNraXBwZWQgbG9va2luZyBmb3IgYSBtYXJrZXIgKi8KLX07Ci0KLS8qIEVudHJvcHkgZGVjb2RpbmcgKi8KLXN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChib29sZWFuLCBkZWNvZGVfbWN1LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQlKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgY29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlciwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgb2Zmc2V0KSk7Ci0gIEpNRVRIT0Qodm9pZCwgZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9vZmZzZXRfZGF0YSAqb2Zmc2V0KSk7Ci0KLSAgLyogVGhpcyBpcyBoZXJlIHRvIHNoYXJlIGNvZGUgYmV0d2VlbiBiYXNlbGluZSBhbmQgcHJvZ3Jlc3NpdmUgZGVjb2RlcnM7ICovCi0gIC8qIG90aGVyIG1vZHVsZXMgcHJvYmFibHkgc2hvdWxkIG5vdCB1c2UgaXQgKi8KLSAgYm9vbGVhbiBpbnN1ZmZpY2llbnRfZGF0YTsJLyogc2V0IFRSVUUgYWZ0ZXIgZW1pdHRpbmcgd2FybmluZyAqLwotCi0gIGh1ZmZtYW5faW5kZXggKmluZGV4OwotfTsKLQotLyogSW52ZXJzZSBEQ1QgKGFsc28gcGVyZm9ybXMgZGVxdWFudGl6YXRpb24pICovCi10eXBlZGVmIEpNRVRIT0Qodm9pZCwgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciwKLQkJKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKLQkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci0KLXN0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICAvKiBJdCBpcyB1c2VmdWwgdG8gYWxsb3cgZWFjaCBjb21wb25lbnQgdG8gaGF2ZSBhIHNlcGFyYXRlIElEQ1QgbWV0aG9kLiAqLwotICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUW01BWF9DT01QT05FTlRTXTsKLX07Ci0KLS8qIFVwc2FtcGxpbmcgKG5vdGUgdGhhdCB1cHNhbXBsZXIgbXVzdCBhbHNvIGNhbGwgY29sb3IgY29udmVydGVyKSAqLwotc3RydWN0IGpwZWdfdXBzYW1wbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHVwc2FtcGxlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAotCQkJICAgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkJCSAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKLQkJCSAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkJICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotCi0gIGJvb2xlYW4gbmVlZF9jb250ZXh0X3Jvd3M7CS8qIFRSVUUgaWYgbmVlZCByb3dzIGFib3ZlICYgYmVsb3cgKi8KLX07Ci0KLS8qIENvbG9yc3BhY2UgY29udmVyc2lvbiAqLwotc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgY29sb3JfY29udmVydCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCQkJCUpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKSk7Ci19OwotCi0vKiBDb2xvciBxdWFudGl6YXRpb24gb3IgY29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbiAqLwotc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc19wcmVfc2NhbikpOwotICBKTUVUSE9EKHZvaWQsIGNvbG9yX3F1YW50aXplLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKLQkJCQkgaW50IG51bV9yb3dzKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZmluaXNoX3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgbmV3X2NvbG9yX21hcCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLX07Ci0KLSNpZmRlZiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNCi0KLS8qIElEQ1Qgcm91dGluZXMgKi8KLUVYVEVSTiAodm9pZCkgaWRjdF8xeDFfdmVudW0gKElOVDE2ICogY29lZmZQdHIsIElOVDE2ICogc2FtcGxlUHRyLCBJTlQzMiBzdHJpZGUpOwotRVhURVJOICh2b2lkKSBpZGN0XzJ4Ml92ZW51bSAoSU5UMTYgKiBjb2VmZlB0ciwgSU5UMTYgKiBzYW1wbGVQdHIsIElOVDMyIHN0cmlkZSk7Ci1FWFRFUk4gKHZvaWQpIGlkY3RfNHg0X3ZlbnVtIChJTlQxNiAqIGNvZWZmUHRyLCBJTlQxNiAqIHNhbXBsZVB0ciwgSU5UMzIgc3RyaWRlKTsKLUVYVEVSTiAodm9pZCkgaWRjdF84eDhfdmVudW0gKElOVDE2ICogY29lZmZQdHIsIElOVDE2ICogc2FtcGxlUHRyLCBJTlQzMiBzdHJpZGUpOwotCi0jaWZuZGVmIEFORFJPSURfSlBFR19ESVNBQkxFX1ZFTlVNX1lDQ19SR0JfNTY1Ci0vKiBDb2xvciBjb252ZXJzaW9uIHJvdXRpbmVzICovCi1FWFRFUk4gKHZvaWQpIHl2dXAycmdiNTY1X3ZlbnVtIChVSU5UOCAqcEx1bWFMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ3JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ2JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwUkdCNTY1TGluZSwKLSAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG5MaW5lV2lkdGgpOwotRVhURVJOICh2b2lkKSB5eXZ1cDJyZ2I1NjVfdmVudW0gKFVJTlQ4ICogcEx1bWFMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ3JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ2JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICogcFJHQjU2NUxpbmUsCi0gICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBuTGluZVdpZHRoKTsKLSNlbmRpZgotRVhURVJOICh2b2lkKSB5dnVwMmJncjg4OF92ZW51bSAoVUlOVDggKiBwTHVtYUxpbmUsCi0gICAgICAgICAgICAgICAgVUlOVDggKnBDckxpbmUsCi0gICAgICAgICAgICAgICAgVUlOVDggKnBDYkxpbmUsCi0gICAgICAgICAgICAgICAgVUlOVDggKiBwQkdSODg4TGluZSwKLSAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG5MaW5lV2lkdGgpOwotRVhURVJOICh2b2lkKSB5eXZ1cDJiZ3I4ODhfdmVudW0gKFVJTlQ4ICogcEx1bWFMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ3JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ2JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICogcEJHUjg4OExpbmUsCi0gICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBuTGluZVdpZHRoKTsKLUVYVEVSTiAodm9pZCkgeXZ1cDJhYmdyODg4OF92ZW51bSAoVUlOVDggKiBwTHVtYUxpbmUsCi0gICAgICAgICAgICAgICAgVUlOVDggKnBDckxpbmUsCi0gICAgICAgICAgICAgICAgVUlOVDggKnBDYkxpbmUsCi0gICAgICAgICAgICAgICAgVUlOVDggKiBwQUJHUjg4OExpbmUsCi0gICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBuTGluZVdpZHRoKTsKLUVYVEVSTiAodm9pZCkgeXl2dXAyYWJncjg4ODhfdmVudW0gKFVJTlQ4ICogcEx1bWFMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ3JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ2JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICogcEFCR1I4ODhMaW5lLAotICAgICAgICAgICAgICAgIEpESU1FTlNJT04gbkxpbmVXaWR0aCk7Ci0jZW5kaWYKLQotLyogTWlzY2VsbGFuZW91cyB1c2VmdWwgbWFjcm9zICovCi0KLSN1bmRlZiBNQVgKLSNkZWZpbmUgTUFYKGEsYikJKChhKSA+IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBNSU4KLSNkZWZpbmUgTUlOKGEsYikJKChhKSA8IChiKSA/IChhKSA6IChiKSkKLQotCi0vKiBXZSBhc3N1bWUgdGhhdCByaWdodCBzaGlmdCBjb3JyZXNwb25kcyB0byBzaWduZWQgZGl2aXNpb24gYnkgMiB3aXRoCi0gKiByb3VuZGluZyB0b3dhcmRzIG1pbnVzIGluZmluaXR5LiAgVGhpcyBpcyBjb3JyZWN0IGZvciB0eXBpY2FsICJhcml0aG1ldGljCi0gKiBzaGlmdCIgaW5zdHJ1Y3Rpb25zIHRoYXQgc2hpZnQgaW4gY29waWVzIG9mIHRoZSBzaWduIGJpdC4gIEJ1dCBzb21lCi0gKiBDIGNvbXBpbGVycyBpbXBsZW1lbnQgPj4gd2l0aCBhbiB1bnNpZ25lZCBzaGlmdC4gIEZvciB0aGVzZSBtYWNoaW5lcyB5b3UKLSAqIG11c3QgZGVmaW5lIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVELgotICogUklHSFRfU0hJRlQgcHJvdmlkZXMgYSBwcm9wZXIgc2lnbmVkIHJpZ2h0IHNoaWZ0IG9mIGFuIElOVDMyIHF1YW50aXR5LgotICogSXQgaXMgb25seSBhcHBsaWVkIHdpdGggY29uc3RhbnQgc2hpZnQgY291bnRzLiAgU0hJRlRfVEVNUFMgbXVzdCBiZQotICogaW5jbHVkZWQgaW4gdGhlIHZhcmlhYmxlcyBvZiBhbnkgcm91dGluZSB1c2luZyBSSUdIVF9TSElGVC4KLSAqLwotCi0jaWZkZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLSNkZWZpbmUgU0hJRlRfVEVNUFMJSU5UMzIgc2hpZnRfdGVtcDsKLSNkZWZpbmUgUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAotCSgoc2hpZnRfdGVtcCA9ICh4KSkgPCAwID8gXAotCSAoc2hpZnRfdGVtcCA+PiAoc2hmdCkpIHwgKCh+KChJTlQzMikgMCkpIDw8ICgzMi0oc2hmdCkpKSA6IFwKLQkgKHNoaWZ0X3RlbXAgPj4gKHNoZnQpKSkKLSNlbHNlCi0jZGVmaW5lIFNISUZUX1RFTVBTCi0jZGVmaW5lIFJJR0hUX1NISUZUKHgsc2hmdCkJKCh4KSA+PiAoc2hmdCkpCi0jZW5kaWYKLQotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUgamluaXRfY29tcHJlc3NfbWFzdGVyCWpJQ29tcHJlc3MKLSNkZWZpbmUgamluaXRfY19tYXN0ZXJfY29udHJvbAlqSUNNYXN0ZXIKLSNkZWZpbmUgamluaXRfY19tYWluX2NvbnRyb2xsZXIJaklDTWFpbkMKLSNkZWZpbmUgamluaXRfY19wcmVwX2NvbnRyb2xsZXIJaklDUHJlcEMKLSNkZWZpbmUgamluaXRfY19jb2VmX2NvbnRyb2xsZXIJaklDQ29lZkMKLSNkZWZpbmUgamluaXRfY29sb3JfY29udmVydGVyCWpJQ0NvbG9yCi0jZGVmaW5lIGppbml0X2Rvd25zYW1wbGVyCWpJRG93bnNhbXBsZXIKLSNkZWZpbmUgamluaXRfZm9yd2FyZF9kY3QJaklGRENUCi0jZGVmaW5lIGppbml0X2h1ZmZfZW5jb2RlcglqSUhFbmNvZGVyCi0jZGVmaW5lIGppbml0X3BodWZmX2VuY29kZXIJaklQSEVuY29kZXIKLSNkZWZpbmUgamluaXRfbWFya2VyX3dyaXRlcglqSU1Xcml0ZXIKLSNkZWZpbmUgamluaXRfbWFzdGVyX2RlY29tcHJlc3MJaklETWFzdGVyCi0jZGVmaW5lIGppbml0X2RfbWFpbl9jb250cm9sbGVyCWpJRE1haW5DCi0jZGVmaW5lIGppbml0X2RfY29lZl9jb250cm9sbGVyCWpJRENvZWZDCi0jZGVmaW5lIGppbml0X2RfcG9zdF9jb250cm9sbGVyCWpJRFBvc3RDCi0jZGVmaW5lIGppbml0X2lucHV0X2NvbnRyb2xsZXIJaklJbkN0bHIKLSNkZWZpbmUgamluaXRfbWFya2VyX3JlYWRlcglqSU1SZWFkZXIKLSNkZWZpbmUgamluaXRfaHVmZl9kZWNvZGVyCWpJSERlY29kZXIKLSNkZWZpbmUgamluaXRfcGh1ZmZfZGVjb2RlcglqSVBIRGVjb2RlcgotI2RlZmluZSBqaW5pdF9pbnZlcnNlX2RjdAlqSUlEQ1QKLSNkZWZpbmUgamluaXRfdXBzYW1wbGVyCQlqSVVwc2FtcGxlcgotI2RlZmluZSBqaW5pdF9jb2xvcl9kZWNvbnZlcnRlcglqSURDb2xvcgotI2RlZmluZSBqaW5pdF8xcGFzc19xdWFudGl6ZXIJakkxUXVhbnQKLSNkZWZpbmUgamluaXRfMnBhc3NfcXVhbnRpemVyCWpJMlF1YW50Ci0jZGVmaW5lIGppbml0X21lcmdlZF91cHNhbXBsZXIJaklNVXBzYW1wbGVyCi0jZGVmaW5lIGppbml0X21lbW9yeV9tZ3IJaklNZW1NZ3IKLSNkZWZpbmUgamRpdl9yb3VuZF91cAkJakRpdlJvdW5kCi0jZGVmaW5lIGpyb3VuZF91cAkJalJvdW5kCi0jZGVmaW5lIGpjb3B5X3NhbXBsZV9yb3dzCWpDb3B5U2FtcGxlcwotI2RlZmluZSBqY29weV9ibG9ja19yb3cJCWpDb3B5QmxvY2tzCi0jZGVmaW5lIGp6ZXJvX2ZhcgkJalplcm9GYXIKLSNkZWZpbmUganBlZ196aWd6YWdfb3JkZXIJalpJR1RhYmxlCi0jZGVmaW5lIGpwZWdfbmF0dXJhbF9vcmRlcglqWkFHVGFibGUKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLQotLyogQ29tcHJlc3Npb24gbW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCi1FWFRFUk4odm9pZCkgamluaXRfY29tcHJlc3NfbWFzdGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9jX21hc3Rlcl9jb250cm9sIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSBib29sZWFuIHRyYW5zY29kZV9vbmx5KSk7Ci1FWFRFUk4odm9pZCkgamluaXRfY19tYWluX2NvbnRyb2xsZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9jX3ByZXBfY29udHJvbGxlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOwotRVhURVJOKHZvaWQpIGppbml0X2NfY29lZl9jb250cm9sbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfY29sb3JfY29udmVydGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9kb3duc2FtcGxlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfZm9yd2FyZF9kY3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X2h1ZmZfZW5jb2RlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfcGh1ZmZfZW5jb2RlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfbWFya2VyX3dyaXRlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0vKiBEZWNvbXByZXNzaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lcyAqLwotRVhURVJOKHZvaWQpIGppbml0X21hc3Rlcl9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X2RfbWFpbl9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9kX2NvZWZfY29udHJvbGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOwotRVhURVJOKHZvaWQpIGppbml0X2lucHV0X2NvbnRyb2xsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfbWFya2VyX3JlYWRlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9odWZmX2RlY29kZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfaHVmZl9kZWNvZGVyX25vX2RhdGEgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfcGh1ZmZfZGVjb2RlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9pbnZlcnNlX2RjdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF91cHNhbXBsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfMXBhc3NfcXVhbnRpemVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0XzJwYXNzX3F1YW50aXplciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9tZXJnZWRfdXBzYW1wbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfZGVjb21wcmVzc19wZXJfc2Nhbl9zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbyk7Ci0vKiBNZW1vcnkgbWFuYWdlciBpbml0aWFsaXphdGlvbiAqLwotRVhURVJOKHZvaWQpIGppbml0X21lbW9yeV9tZ3IgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLQotLyogVXRpbGl0eSByb3V0aW5lcyBpbiBqdXRpbHMuYyAqLwotRVhURVJOKGxvbmcpIGpkaXZfcm91bmRfdXAgSlBQKChsb25nIGEsIGxvbmcgYikpOwotRVhURVJOKGxvbmcpIGpyb3VuZF91cCBKUFAoKGxvbmcgYSwgbG9uZyBiKSk7Ci1FWFRFUk4obG9uZykgam1pbiBKUFAoKGxvbmcgYSwgbG9uZyBiKSk7Ci1FWFRFUk4odm9pZCkgamNvcHlfc2FtcGxlX3Jvd3MgSlBQKChKU0FNUEFSUkFZIGlucHV0X2FycmF5LCBpbnQgc291cmNlX3JvdywKLQkJCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYXJyYXksIGludCBkZXN0X3JvdywKLQkJCQkgICAgaW50IG51bV9yb3dzLCBKRElNRU5TSU9OIG51bV9jb2xzKSk7Ci1FWFRFUk4odm9pZCkgamNvcHlfYmxvY2tfcm93IEpQUCgoSkJMT0NLUk9XIGlucHV0X3JvdywgSkJMT0NLUk9XIG91dHB1dF9yb3csCi0JCQkJICBKRElNRU5TSU9OIG51bV9ibG9ja3MpKTsKLUVYVEVSTih2b2lkKSBqemVyb19mYXIgSlBQKCh2b2lkIEZBUiAqIHRhcmdldCwgc2l6ZV90IGJ5dGVzdG96ZXJvKSk7Ci0KLUVYVEVSTih2b2lkKSBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbiBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQpKTsKLUVYVEVSTih2b2lkKSBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbl9iaXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZV9vZmZzZXQsIGludCBiaXRfbGVmdCwgSU5UMzIgYnVmKSk7Ci0KLUVYVEVSTihpbnQpIGpnZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotLyogQ29uc3RhbnQgdGFibGVzIGluIGp1dGlscy5jICovCi0jaWYgMAkJCQkvKiBUaGlzIHRhYmxlIGlzIG5vdCBhY3R1YWxseSBuZWVkZWQgaW4gdjZhICovCi1leHRlcm4gY29uc3QgaW50IGpwZWdfemlnemFnX29yZGVyW107IC8qIG5hdHVyYWwgY29lZiBvcmRlciB0byB6aWd6YWcgb3JkZXIgKi8KLSNlbmRpZgotZXh0ZXJuIGNvbnN0IGludCBqcGVnX25hdHVyYWxfb3JkZXJbXTsgLyogemlnemFnIGNvZWYgb3JkZXIgdG8gbmF0dXJhbCBvcmRlciAqLwotCi0vKiBTdXBwcmVzcyB1bmRlZmluZWQtc3RydWN0dXJlIGNvbXBsYWludHMgaWYgbmVjZXNzYXJ5LiAqLwotCi0jaWZkZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLSNpZm5kZWYgQU1fTUVNT1JZX01BTkFHRVIJLyogb25seSBqbWVtbWdyLmMgZGVmaW5lcyB0aGVzZSAqLwotc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07Ci0jZW5kaWYKLSNlbmRpZiAvKiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTiAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvanBlZ2xpYi5oIGIvbGlianBlZ3R3cnAvanBlZ2xpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2U2ODcyLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pwZWdsaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExODQgKzAsMCBAQAotLyoKLSAqIGpwZWdsaWIuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGFwcGxpY2F0aW9uIGludGVyZmFjZSBmb3IgdGhlIEpQRUcgbGlicmFyeS4KLSAqIE1vc3QgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IG5lZWQgb25seSBpbmNsdWRlIHRoaXMgZmlsZSwKLSAqIGFuZCBwZXJoYXBzIGplcnJvci5oIGlmIHRoZXkgd2FudCB0byBrbm93IHRoZSBleGFjdCBlcnJvciBjb2Rlcy4KLSAqLwotCi0jaWZuZGVmIEpQRUdMSUJfSAotI2RlZmluZSBKUEVHTElCX0gKLQotLyoKLSAqIEZpcnN0IHdlIGluY2x1ZGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhhdCByZWNvcmQgaG93IHRoaXMKLSAqIGluc3RhbGxhdGlvbiBvZiB0aGUgSlBFRyBsaWJyYXJ5IGlzIHNldCB1cC4gIGpjb25maWcuaCBjYW4gYmUKLSAqIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZvciBtYW55IHN5c3RlbXMuICBqbW9yZWNmZy5oIGNvbnRhaW5zCi0gKiBtYW51YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgbW9zdCBwZW9wbGUgbmVlZCBub3Qgd29ycnkgYWJvdXQuCi0gKi8KLQotI2lmbmRlZiBKQ09ORklHX0lOQ0xVREVECS8qIGluIGNhc2UgamluY2x1ZGUuaCBhbHJlYWR5IGRpZCAqLwotI2luY2x1ZGUgImpjb25maWcuaCIJCS8qIHdpZGVseSB1c2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLwotI2VuZGlmCi0jaW5jbHVkZSAiam1vcmVjZmcuaCIJCS8qIHNlbGRvbSBjaGFuZ2VkIG9wdGlvbnMgKi8KLQotCi0vKiBWZXJzaW9uIElEIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgotICogTWlnaHQgYmUgdXNlZnVsIGZvciB0ZXN0cyBsaWtlICIjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA2MCIuCi0gKi8KLQotI2RlZmluZSBKUEVHX0xJQl9WRVJTSU9OICA2MgkvKiBWZXJzaW9uIDZiICovCi0KLQotLyogVmFyaW91cyBjb25zdGFudHMgZGV0ZXJtaW5pbmcgdGhlIHNpemVzIG9mIHRoaW5ncy4KLSAqIEFsbCBvZiB0aGVzZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBKUEVHIHN0YW5kYXJkLCBzbyBkb24ndCBjaGFuZ2UgdGhlbQotICogaWYgeW91IHdhbnQgdG8gYmUgY29tcGF0aWJsZS4KLSAqLwotCi0jZGVmaW5lIERDVFNJWkUJCSAgICA4CS8qIFRoZSBiYXNpYyBEQ1QgYmxvY2sgaXMgOHg4IHNhbXBsZXMgKi8KLSNkZWZpbmUgRENUU0laRTIJICAgIDY0CS8qIERDVFNJWkUgc3F1YXJlZDsgIyBvZiBlbGVtZW50cyBpbiBhIGJsb2NrICovCi0jZGVmaW5lIE5VTV9RVUFOVF9UQkxTICAgICAgNAkvKiBRdWFudGl6YXRpb24gdGFibGVzIGFyZSBudW1iZXJlZCAwLi4zICovCi0jZGVmaW5lIE5VTV9IVUZGX1RCTFMgICAgICAgNAkvKiBIdWZmbWFuIHRhYmxlcyBhcmUgbnVtYmVyZWQgMC4uMyAqLwotI2RlZmluZSBOVU1fQVJJVEhfVEJMUyAgICAgIDE2CS8qIEFyaXRoLWNvZGluZyB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLjE1ICovCi0jZGVmaW5lIE1BWF9DT01QU19JTl9TQ0FOICAgNAkvKiBKUEVHIGxpbWl0IG9uICMgb2YgY29tcG9uZW50cyBpbiBvbmUgc2NhbiAqLwotI2RlZmluZSBNQVhfU0FNUF9GQUNUT1IgICAgIDQJLyogSlBFRyBsaW1pdCBvbiBzYW1wbGluZyBmYWN0b3JzICovCi0vKiBVbmZvcnR1bmF0ZWx5LCBzb21lIGJvem8gYXQgQWRvYmUgc2F3IG5vIHJlYXNvbiB0byBiZSBib3VuZCBieSB0aGUgc3RhbmRhcmQ7Ci0gKiB0aGUgUG9zdFNjcmlwdCBEQ1QgZmlsdGVyIGNhbiBlbWl0IGZpbGVzIHdpdGggbWFueSBtb3JlIHRoYW4gMTAgYmxvY2tzL01DVS4KLSAqIElmIHlvdSBoYXBwZW4gdG8gcnVuIGFjcm9zcyBzdWNoIGEgZmlsZSwgeW91IGNhbiB1cCBEX01BWF9CTE9DS1NfSU5fTUNVCi0gKiB0byBoYW5kbGUgaXQuICBXZSBldmVuIGxldCB5b3UgZG8gdGhpcyBmcm9tIHRoZSBqY29uZmlnLmggZmlsZS4gIEhvd2V2ZXIsCi0gKiB3ZSBzdHJvbmdseSBkaXNjb3VyYWdlIGNoYW5naW5nIENfTUFYX0JMT0NLU19JTl9NQ1U7IGp1c3QgYmVjYXVzZSBBZG9iZQotICogc29tZXRpbWVzIGVtaXRzIG5vbmNvbXBsaWFudCBmaWxlcyBkb2Vzbid0IG1lYW4geW91IHNob3VsZCB0b28uCi0gKi8KLSNkZWZpbmUgQ19NQVhfQkxPQ0tTX0lOX01DVSAgIDEwIC8qIGNvbXByZXNzb3IncyBsaW1pdCBvbiBibG9ja3MgcGVyIE1DVSAqLwotI2lmbmRlZiBEX01BWF9CTE9DS1NfSU5fTUNVCi0jZGVmaW5lIERfTUFYX0JMT0NLU19JTl9NQ1UgICAxMCAvKiBkZWNvbXByZXNzb3IncyBsaW1pdCBvbiBibG9ja3MgcGVyIE1DVSAqLwotI2VuZGlmCi0KLQotLyogRGF0YSBzdHJ1Y3R1cmVzIGZvciBpbWFnZXMgKGFycmF5cyBvZiBzYW1wbGVzIGFuZCBvZiBEQ1QgY29lZmZpY2llbnRzKS4KLSAqIE9uIDgweDg2IG1hY2hpbmVzLCB0aGUgaW1hZ2UgYXJyYXlzIGFyZSB0b28gYmlnIGZvciBuZWFyIHBvaW50ZXJzLAotICogYnV0IHRoZSBwb2ludGVyIGFycmF5cyBjYW4gZml0IGluIG5lYXIgbWVtb3J5LgotICovCi0KLXR5cGVkZWYgSlNBTVBMRSBGQVIgKkpTQU1QUk9XOwkvKiBwdHIgdG8gb25lIGltYWdlIHJvdyBvZiBwaXhlbCBzYW1wbGVzLiAqLwotdHlwZWRlZiBKU0FNUFJPVyAqSlNBTVBBUlJBWTsJLyogcHRyIHRvIHNvbWUgcm93cyAoYSAyLUQgc2FtcGxlIGFycmF5KSAqLwotdHlwZWRlZiBKU0FNUEFSUkFZICpKU0FNUElNQUdFOwkvKiBhIDMtRCBzYW1wbGUgYXJyYXk6IHRvcCBpbmRleCBpcyBjb2xvciAqLwotCi10eXBlZGVmIEpDT0VGIEpCTE9DS1tEQ1RTSVpFMl07CS8qIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMgKi8KLXR5cGVkZWYgSkJMT0NLIEZBUiAqSkJMT0NLUk9XOwkvKiBwb2ludGVyIHRvIG9uZSByb3cgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCi10eXBlZGVmIEpCTE9DS1JPVyAqSkJMT0NLQVJSQVk7CQkvKiBhIDItRCBhcnJheSBvZiBjb2VmZmljaWVudCBibG9ja3MgKi8KLXR5cGVkZWYgSkJMT0NLQVJSQVkgKkpCTE9DS0lNQUdFOwkvKiBhIDMtRCBhcnJheSBvZiBjb2VmZmljaWVudCBibG9ja3MgKi8KLQotdHlwZWRlZiBKQ09FRiBGQVIgKkpDT0VGUFRSOwkvKiB1c2VmdWwgaW4gYSBjb3VwbGUgb2YgcGxhY2VzICovCi0KLQotLyogVHlwZXMgZm9yIEpQRUcgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhbmQgd29ya2luZyB0YWJsZXMuICovCi0KLQotLyogRENUIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMuICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogVGhpcyBhcnJheSBnaXZlcyB0aGUgY29lZmZpY2llbnQgcXVhbnRpemVycyBpbiBuYXR1cmFsIGFycmF5IG9yZGVyCi0gICAqIChub3QgdGhlIHppZ3phZyBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBzdG9yZWQgaW4gYSBKUEVHIERRVCBtYXJrZXIpLgotICAgKiBDQVVUSU9OOiBJSkcgdmVyc2lvbnMgcHJpb3IgdG8gdjZhIGtlcHQgdGhpcyBhcnJheSBpbiB6aWd6YWcgb3JkZXIuCi0gICAqLwotICBVSU5UMTYgcXVhbnR2YWxbRENUU0laRTJdOwkvKiBxdWFudGl6YXRpb24gc3RlcCBmb3IgZWFjaCBjb2VmZmljaWVudCAqLwotICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIEZBTFNFIHdoZW4KLSAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgVFJVRSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCi0gICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gVFJVRS4KLSAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCi0gICAqLwotICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiBUUlVFIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCi19IEpRVUFOVF9UQkw7Ci0KLQotLyogSHVmZm1hbiBjb2RpbmcgdGFibGVzLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIFRoZXNlIHR3byBmaWVsZHMgZGlyZWN0bHkgcmVwcmVzZW50IHRoZSBjb250ZW50cyBvZiBhIEpQRUcgREhUIG1hcmtlciAqLwotICBVSU5UOCBiaXRzWzE3XTsJCS8qIGJpdHNba10gPSAjIG9mIHN5bWJvbHMgd2l0aCBjb2RlcyBvZiAqLwotCQkJCS8qIGxlbmd0aCBrIGJpdHM7IGJpdHNbMF0gaXMgdW51c2VkICovCi0gIFVJTlQ4IGh1ZmZ2YWxbMjU2XTsJCS8qIFRoZSBzeW1ib2xzLCBpbiBvcmRlciBvZiBpbmNyIGNvZGUgbGVuZ3RoICovCi0gIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGR1cmluZyBjb21wcmVzc2lvbi4gIEl0J3MgaW5pdGlhbGl6ZWQgRkFMU0Ugd2hlbgotICAgKiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgYW5kIHNldCBUUlVFIHdoZW4gaXQncyBiZWVuIG91dHB1dCB0byB0aGUgZmlsZS4KLSAgICogWW91IGNvdWxkIHN1cHByZXNzIG91dHB1dCBvZiBhIHRhYmxlIGJ5IHNldHRpbmcgdGhpcyB0byBUUlVFLgotICAgKiAoU2VlIGpwZWdfc3VwcHJlc3NfdGFibGVzIGZvciBhbiBleGFtcGxlLikKLSAgICovCi0gIGJvb2xlYW4gc2VudF90YWJsZTsJCS8qIFRSVUUgd2hlbiB0YWJsZSBoYXMgYmVlbiBvdXRwdXQgKi8KLX0gSkhVRkZfVEJMOwotCi0KLS8qIEJhc2ljIGluZm8gYWJvdXQgb25lIGNvbXBvbmVudCAoY29sb3IgY2hhbm5lbCkuICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogVGhlc2UgdmFsdWVzIGFyZSBmaXhlZCBvdmVyIHRoZSB3aG9sZSBpbWFnZS4gKi8KLSAgLyogRm9yIGNvbXByZXNzaW9uLCB0aGV5IG11c3QgYmUgc3VwcGxpZWQgYnkgcGFyYW1ldGVyIHNldHVwOyAqLwotICAvKiBmb3IgZGVjb21wcmVzc2lvbiwgdGhleSBhcmUgcmVhZCBmcm9tIHRoZSBTT0YgbWFya2VyLiAqLwotICBpbnQgY29tcG9uZW50X2lkOwkJLyogaWRlbnRpZmllciBmb3IgdGhpcyBjb21wb25lbnQgKDAuLjI1NSkgKi8KLSAgaW50IGNvbXBvbmVudF9pbmRleDsJCS8qIGl0cyBpbmRleCBpbiBTT0Ygb3IgY2luZm8tPmNvbXBfaW5mb1tdICovCi0gIGludCBoX3NhbXBfZmFjdG9yOwkJLyogaG9yaXpvbnRhbCBzYW1wbGluZyBmYWN0b3IgKDEuLjQpICovCi0gIGludCB2X3NhbXBfZmFjdG9yOwkJLyogdmVydGljYWwgc2FtcGxpbmcgZmFjdG9yICgxLi40KSAqLwotICBpbnQgcXVhbnRfdGJsX25vOwkJLyogcXVhbnRpemF0aW9uIHRhYmxlIHNlbGVjdG9yICgwLi4zKSAqLwotICAvKiBUaGVzZSB2YWx1ZXMgbWF5IHZhcnkgYmV0d2VlbiBzY2Fucy4gKi8KLSAgLyogRm9yIGNvbXByZXNzaW9uLCB0aGV5IG11c3QgYmUgc3VwcGxpZWQgYnkgcGFyYW1ldGVyIHNldHVwOyAqLwotICAvKiBmb3IgZGVjb21wcmVzc2lvbiwgdGhleSBhcmUgcmVhZCBmcm9tIHRoZSBTT1MgbWFya2VyLiAqLwotICAvKiBUaGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG1heSBub3QgdXNlIHRoZXNlIHZhcmlhYmxlcy4gKi8KLSAgaW50IGRjX3RibF9ubzsJCS8qIERDIGVudHJvcHkgdGFibGUgc2VsZWN0b3IgKDAuLjMpICovCi0gIGludCBhY190Ymxfbm87CQkvKiBBQyBlbnRyb3B5IHRhYmxlIHNlbGVjdG9yICgwLi4zKSAqLwotCi0gIC8qIFJlbWFpbmluZyBmaWVsZHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcHJpdmF0ZSBieSBhcHBsaWNhdGlvbnMuICovCi0KLSAgLyogVGhlc2UgdmFsdWVzIGFyZSBjb21wdXRlZCBkdXJpbmcgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBzdGFydHVwOiAqLwotICAvKiBDb21wb25lbnQncyBzaXplIGluIERDVCBibG9ja3MuCi0gICAqIEFueSBkdW1teSBibG9ja3MgYWRkZWQgdG8gY29tcGxldGUgYW4gTUNVIGFyZSBub3QgY291bnRlZDsgdGhlcmVmb3JlCi0gICAqIHRoZXNlIHZhbHVlcyBkbyBub3QgZGVwZW5kIG9uIHdoZXRoZXIgYSBzY2FuIGlzIGludGVybGVhdmVkIG9yIG5vdC4KLSAgICovCi0gIEpESU1FTlNJT04gd2lkdGhfaW5fYmxvY2tzOwotICBKRElNRU5TSU9OIGhlaWdodF9pbl9ibG9ja3M7Ci0gIC8qIFNpemUgb2YgYSBEQ1QgYmxvY2sgaW4gc2FtcGxlcy4gIEFsd2F5cyBEQ1RTSVpFIGZvciBjb21wcmVzc2lvbi4KLSAgICogRm9yIGRlY29tcHJlc3Npb24gdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGZyb20gb25lIERDVCBibG9jaywKLSAgICogcmVmbGVjdGluZyBhbnkgc2NhbGluZyB3ZSBjaG9vc2UgdG8gYXBwbHkgZHVyaW5nIHRoZSBJRENUIHN0ZXAuCi0gICAqIFZhbHVlcyBvZiAxLDIsNCw4IGFyZSBsaWtlbHkgdG8gYmUgc3VwcG9ydGVkLiAgTm90ZSB0aGF0IGRpZmZlcmVudAotICAgKiBjb21wb25lbnRzIG1heSByZWNlaXZlIGRpZmZlcmVudCBJRENUIHNjYWxpbmdzLgotICAgKi8KLSAgaW50IERDVF9zY2FsZWRfc2l6ZTsKLSAgLyogVGhlIGRvd25zYW1wbGVkIGRpbWVuc2lvbnMgYXJlIHRoZSBjb21wb25lbnQncyBhY3R1YWwsIHVucGFkZGVkIG51bWJlcgotICAgKiBvZiBzYW1wbGVzIGF0IHRoZSBtYWluIGJ1ZmZlciAocHJlcHJvY2Vzc2luZy9jb21wcmVzc2lvbiBpbnRlcmZhY2UpLCB0aHVzCi0gICAqIGRvd25zYW1wbGVkX3dpZHRoID0gY2VpbChpbWFnZV93aWR0aCAqIEhpL0htYXgpCi0gICAqIGFuZCBzaW1pbGFybHkgZm9yIGhlaWdodC4gIEZvciBkZWNvbXByZXNzaW9uLCBJRENUIHNjYWxpbmcgaXMgaW5jbHVkZWQsIHNvCi0gICAqIGRvd25zYW1wbGVkX3dpZHRoID0gY2VpbChpbWFnZV93aWR0aCAqIEhpL0htYXggKiBEQ1Rfc2NhbGVkX3NpemUvRENUU0laRSkKLSAgICovCi0gIEpESU1FTlNJT04gZG93bnNhbXBsZWRfd2lkdGg7CSAvKiBhY3R1YWwgd2lkdGggaW4gc2FtcGxlcyAqLwotICBKRElNRU5TSU9OIGRvd25zYW1wbGVkX2hlaWdodDsgLyogYWN0dWFsIGhlaWdodCBpbiBzYW1wbGVzICovCi0gIC8qIFRoaXMgZmxhZyBpcyB1c2VkIG9ubHkgZm9yIGRlY29tcHJlc3Npb24uICBJbiBjYXNlcyB3aGVyZSBzb21lIG9mIHRoZQotICAgKiBjb21wb25lbnRzIHdpbGwgYmUgaWdub3JlZCAoZWcgZ3JheXNjYWxlIG91dHB1dCBmcm9tIFlDYkNyIGltYWdlKSwKLSAgICogd2UgY2FuIHNraXAgbW9zdCBjb21wdXRhdGlvbnMgZm9yIHRoZSB1bnVzZWQgY29tcG9uZW50cy4KLSAgICovCi0gIGJvb2xlYW4gY29tcG9uZW50X25lZWRlZDsJLyogZG8gd2UgbmVlZCB0aGUgdmFsdWUgb2YgdGhpcyBjb21wb25lbnQ/ICovCi0KLSAgLyogVGhlc2UgdmFsdWVzIGFyZSBjb21wdXRlZCBiZWZvcmUgc3RhcnRpbmcgYSBzY2FuIG9mIHRoZSBjb21wb25lbnQuICovCi0gIC8qIFRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbWF5IG5vdCB1c2UgdGhlc2UgdmFyaWFibGVzLiAqLwotICBpbnQgTUNVX3dpZHRoOwkJLyogbnVtYmVyIG9mIGJsb2NrcyBwZXIgTUNVLCBob3Jpem9udGFsbHkgKi8KLSAgaW50IE1DVV9oZWlnaHQ7CQkvKiBudW1iZXIgb2YgYmxvY2tzIHBlciBNQ1UsIHZlcnRpY2FsbHkgKi8KLSAgaW50IE1DVV9ibG9ja3M7CQkvKiBNQ1Vfd2lkdGggKiBNQ1VfaGVpZ2h0ICovCi0gIGludCBNQ1Vfc2FtcGxlX3dpZHRoOwkJLyogTUNVIHdpZHRoIGluIHNhbXBsZXMsIE1DVV93aWR0aCpEQ1Rfc2NhbGVkX3NpemUgKi8KLSAgaW50IGxhc3RfY29sX3dpZHRoOwkJLyogIyBvZiBub24tZHVtbXkgYmxvY2tzIGFjcm9zcyBpbiBsYXN0IE1DVSAqLwotICBpbnQgbGFzdF9yb3dfaGVpZ2h0OwkJLyogIyBvZiBub24tZHVtbXkgYmxvY2tzIGRvd24gaW4gbGFzdCBNQ1UgKi8KLQotICAvKiBTYXZlZCBxdWFudGl6YXRpb24gdGFibGUgZm9yIGNvbXBvbmVudDsgTlVMTCBpZiBub25lIHlldCBzYXZlZC4KLSAgICogU2VlIGpkaW5wdXQuYyBjb21tZW50cyBhYm91dCB0aGUgbmVlZCBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLSAgICogVGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgdXNlZCBvbmx5IGZvciBkZWNvbXByZXNzaW9uLgotICAgKi8KLSAgSlFVQU5UX1RCTCAqIHF1YW50X3RhYmxlOwotCi0gIC8qIFByaXZhdGUgcGVyLWNvbXBvbmVudCBzdG9yYWdlIGZvciBEQ1Qgb3IgSURDVCBzdWJzeXN0ZW0uICovCi0gIHZvaWQgKiBkY3RfdGFibGU7Ci19IGpwZWdfY29tcG9uZW50X2luZm87Ci0KLQotLyogVGhlIHNjcmlwdCBmb3IgZW5jb2RpbmcgYSBtdWx0aXBsZS1zY2FuIGZpbGUgaXMgYW4gYXJyYXkgb2YgdGhlc2U6ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGNvbXBzX2luX3NjYW47CQkvKiBudW1iZXIgb2YgY29tcG9uZW50cyBlbmNvZGVkIGluIHRoaXMgc2NhbiAqLwotICBpbnQgY29tcG9uZW50X2luZGV4W01BWF9DT01QU19JTl9TQ0FOXTsgLyogdGhlaXIgU09GL2NvbXBfaW5mb1tdIGluZGV4ZXMgKi8KLSAgaW50IFNzLCBTZTsJCQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHNwZWN0cmFsIHNlbGVjdGlvbiBwYXJtcyAqLwotICBpbnQgQWgsIEFsOwkJCS8qIHByb2dyZXNzaXZlIEpQRUcgc3VjY2Vzc2l2ZSBhcHByb3guIHBhcm1zICovCi19IGpwZWdfc2Nhbl9pbmZvOwotCi0vKiBUaGUgZGVjb21wcmVzc29yIGNhbiBzYXZlIEFQUG4gYW5kIENPTSBtYXJrZXJzIGluIGEgbGlzdCBvZiB0aGVzZTogKi8KLQotdHlwZWRlZiBzdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0IEZBUiAqIGpwZWdfc2F2ZWRfbWFya2VyX3B0cjsKLQotc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCB7Ci0gIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBuZXh0OwkvKiBuZXh0IGluIGxpc3QsIG9yIE5VTEwgKi8KLSAgVUlOVDggbWFya2VyOwkJCS8qIG1hcmtlciBjb2RlOiBKUEVHX0NPTSwgb3IgSlBFR19BUFAwK24gKi8KLSAgdW5zaWduZWQgaW50IG9yaWdpbmFsX2xlbmd0aDsJLyogIyBieXRlcyBvZiBkYXRhIGluIHRoZSBmaWxlICovCi0gIHVuc2lnbmVkIGludCBkYXRhX2xlbmd0aDsJLyogIyBieXRlcyBvZiBkYXRhIHNhdmVkIGF0IGRhdGFbXSAqLwotICBKT0NURVQgRkFSICogZGF0YTsJCS8qIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgbWFya2VyICovCi0gIC8qIHRoZSBtYXJrZXIgbGVuZ3RoIHdvcmQgaXMgbm90IGNvdW50ZWQgaW4gZGF0YV9sZW5ndGggb3Igb3JpZ2luYWxfbGVuZ3RoICovCi19OwotCi0vKiBLbm93biBjb2xvciBzcGFjZXMuICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSkNTX1VOS05PV04sCQkvKiBlcnJvci91bnNwZWNpZmllZCAqLwotCUpDU19HUkFZU0NBTEUsCQkvKiBtb25vY2hyb21lICovCi0JSkNTX1JHQiwJCS8qIHJlZC9ncmVlbi9ibHVlICovCi0JSkNTX1lDYkNyLAkJLyogWS9DYi9DciAoYWxzbyBrbm93biBhcyBZVVYpICovCi0JSkNTX0NNWUssCQkvKiBDL00vWS9LICovCi0JSkNTX1lDQ0ssCQkvKiBZL0NiL0NyL0sgKi8KLSNpZmRlZiBBTkRST0lEX1JHQgotICAgIEpDU19SR0JBXzg4ODgsICAvKiByZWQvZ3JlZW4vYmx1ZS9hbHBoYSAqLwotICAgIEpDU19SR0JfNTY1ICAgICAvKiByZWQvZ3JlZW4vYmx1ZSBpbiA1NjUgZm9ybWF0ICovCi0jZW5kaWYKLX0gSl9DT0xPUl9TUEFDRTsKLQotLyogRENUL0lEQ1QgYWxnb3JpdGhtIG9wdGlvbnMuICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSkRDVF9JU0xPVywJCS8qIHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtICovCi0JSkRDVF9JRkFTVCwJCS8qIGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZCAqLwotCUpEQ1RfRkxPQVQJCS8qIGZsb2F0aW5nLXBvaW50OiBhY2N1cmF0ZSwgZmFzdCBvbiBmYXN0IEhXICovCi19IEpfRENUX01FVEhPRDsKLQotI2lmbmRlZiBKRENUX0RFRkFVTFQJCS8qIG1heSBiZSBvdmVycmlkZGVuIGluIGpjb25maWcuaCAqLwotI2RlZmluZSBKRENUX0RFRkFVTFQgIEpEQ1RfSVNMT1cKLSNlbmRpZgotI2lmbmRlZiBKRENUX0ZBU1RFU1QJCS8qIG1heSBiZSBvdmVycmlkZGVuIGluIGpjb25maWcuaCAqLwotI2RlZmluZSBKRENUX0ZBU1RFU1QgIEpEQ1RfSUZBU1QKLSNlbmRpZgotCi0vKiBEaXRoZXJpbmcgb3B0aW9ucyBmb3IgZGVjb21wcmVzc2lvbi4gKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlKRElUSEVSX05PTkUsCQkvKiBubyBkaXRoZXJpbmcgKi8KLQlKRElUSEVSX09SREVSRUQsCS8qIHNpbXBsZSBvcmRlcmVkIGRpdGhlciAqLwotCUpESVRIRVJfRlMJCS8qIEZsb3lkLVN0ZWluYmVyZyBlcnJvciBkaWZmdXNpb24gZGl0aGVyICovCi19IEpfRElUSEVSX01PREU7Ci0KLQotLyogQ29tbW9uIGZpZWxkcyBiZXR3ZWVuIEpQRUcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gbWFzdGVyIHN0cnVjdHMuICovCi0KLSNkZWZpbmUganBlZ19jb21tb25fZmllbGRzIFwKLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyOwkvKiBFcnJvciBoYW5kbGVyIG1vZHVsZSAqL1wKLSAgc3RydWN0IGpwZWdfbWVtb3J5X21nciAqIG1lbTsJLyogTWVtb3J5IG1hbmFnZXIgbW9kdWxlICovXAotICBzdHJ1Y3QganBlZ19wcm9ncmVzc19tZ3IgKiBwcm9ncmVzczsgLyogUHJvZ3Jlc3MgbW9uaXRvciwgb3IgTlVMTCBpZiBub25lICovXAotICB2b2lkICogY2xpZW50X2RhdGE7CQkvKiBBdmFpbGFibGUgZm9yIHVzZSBieSBhcHBsaWNhdGlvbiAqL1wKLSAgYm9vbGVhbiBpc19kZWNvbXByZXNzb3I7CS8qIFNvIGNvbW1vbiBjb2RlIGNhbiB0ZWxsIHdoaWNoIGlzIHdoaWNoICovXAotICBpbnQgZ2xvYmFsX3N0YXRlCQkvKiBGb3IgY2hlY2tpbmcgY2FsbCBzZXF1ZW5jZSB2YWxpZGl0eSAqLwotCi0vKiBSb3V0aW5lcyB0aGF0IGFyZSB0byBiZSB1c2VkIGJ5IGJvdGggaGFsdmVzIG9mIHRoZSBsaWJyYXJ5IGFyZSBkZWNsYXJlZAotICogdG8gcmVjZWl2ZSBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUuICBUaGVyZSBhcmUgbm8gYWN0dWFsIGluc3RhbmNlcyBvZgotICoganBlZ19jb21tb25fc3RydWN0LCBvbmx5IG9mIGpwZWdfY29tcHJlc3Nfc3RydWN0IGFuZCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0LgotICovCi1zdHJ1Y3QganBlZ19jb21tb25fc3RydWN0IHsKLSAganBlZ19jb21tb25fZmllbGRzOwkJLyogRmllbGRzIGNvbW1vbiB0byBib3RoIG1hc3RlciBzdHJ1Y3QgdHlwZXMgKi8KLSAgLyogQWRkaXRpb25hbCBmaWVsZHMgZm9sbG93IGluIGFuIGFjdHVhbCBqcGVnX2NvbXByZXNzX3N0cnVjdCBvcgotICAgKiBqcGVnX2RlY29tcHJlc3Nfc3RydWN0LiAgQWxsIHRocmVlIHN0cnVjdHMgbXVzdCBhZ3JlZSBvbiB0aGVzZQotICAgKiBpbml0aWFsIGZpZWxkcyEgIChUaGlzIHdvdWxkIGJlIGEgbG90IGNsZWFuZXIgaW4gQysrLikKLSAgICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBqcGVnX2NvbW1vbl9zdHJ1Y3QgKiBqX2NvbW1vbl9wdHI7Ci10eXBlZGVmIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCAqIGpfY29tcHJlc3NfcHRyOwotdHlwZWRlZiBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCAqIGpfZGVjb21wcmVzc19wdHI7Ci0KLQotLyogTWFzdGVyIHJlY29yZCBmb3IgYSBjb21wcmVzc2lvbiBpbnN0YW5jZSAqLwotCi1zdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgewotICBqcGVnX2NvbW1vbl9maWVsZHM7CQkvKiBGaWVsZHMgc2hhcmVkIHdpdGgganBlZ19kZWNvbXByZXNzX3N0cnVjdCAqLwotCi0gIC8qIERlc3RpbmF0aW9uIGZvciBjb21wcmVzc2VkIGRhdGEgKi8KLSAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdDsKLQotICAvKiBEZXNjcmlwdGlvbiBvZiBzb3VyY2UgaW1hZ2UgLS0tIHRoZXNlIGZpZWxkcyBtdXN0IGJlIGZpbGxlZCBpbiBieQotICAgKiBvdXRlciBhcHBsaWNhdGlvbiBiZWZvcmUgc3RhcnRpbmcgY29tcHJlc3Npb24uICBpbl9jb2xvcl9zcGFjZSBtdXN0Ci0gICAqIGJlIGNvcnJlY3QgYmVmb3JlIHlvdSBjYW4gZXZlbiBjYWxsIGpwZWdfc2V0X2RlZmF1bHRzKCkuCi0gICAqLwotCi0gIEpESU1FTlNJT04gaW1hZ2Vfd2lkdGg7CS8qIGlucHV0IGltYWdlIHdpZHRoICovCi0gIEpESU1FTlNJT04gaW1hZ2VfaGVpZ2h0OwkvKiBpbnB1dCBpbWFnZSBoZWlnaHQgKi8KLSAgaW50IGlucHV0X2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gaW5wdXQgaW1hZ2UgKi8KLSAgSl9DT0xPUl9TUEFDRSBpbl9jb2xvcl9zcGFjZTsJLyogY29sb3JzcGFjZSBvZiBpbnB1dCBpbWFnZSAqLwotCi0gIGRvdWJsZSBpbnB1dF9nYW1tYTsJCS8qIGltYWdlIGdhbW1hIG9mIGlucHV0IGltYWdlICovCi0KLSAgLyogQ29tcHJlc3Npb24gcGFyYW1ldGVycyAtLS0gdGhlc2UgZmllbGRzIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nCi0gICAqIGpwZWdfc3RhcnRfY29tcHJlc3MoKS4gIFdlIHJlY29tbWVuZCBjYWxsaW5nIGpwZWdfc2V0X2RlZmF1bHRzKCkgdG8KLSAgICogaW5pdGlhbGl6ZSBldmVyeXRoaW5nIHRvIHJlYXNvbmFibGUgZGVmYXVsdHMsIHRoZW4gY2hhbmdpbmcgYW55dGhpbmcKLSAgICogdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljYWxseSB3YW50cyB0byBjaGFuZ2UuICBUaGF0IHdheSB5b3Ugd29uJ3QgZ2V0Ci0gICAqIGJ1cm50IHdoZW4gbmV3IHBhcmFtZXRlcnMgYXJlIGFkZGVkLiAgQWxzbyBub3RlIHRoYXQgdGhlcmUgYXJlIHNldmVyYWwKLSAgICogaGVscGVyIHJvdXRpbmVzIHRvIHNpbXBsaWZ5IGNoYW5naW5nIHBhcmFtZXRlcnMuCi0gICAqLwotCi0gIGludCBkYXRhX3ByZWNpc2lvbjsJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIGltYWdlIGRhdGEgKi8KLQotICBpbnQgbnVtX2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gSlBFRyBpbWFnZSAqLwotICBKX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2U7IC8qIGNvbG9yc3BhY2Ugb2YgSlBFRyBpbWFnZSAqLwotCi0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wX2luZm87Ci0gIC8qIGNvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPRiAqLwotCi0gIEpRVUFOVF9UQkwgKiBxdWFudF90YmxfcHRyc1tOVU1fUVVBTlRfVEJMU107Ci0gIC8qIHB0cnMgdG8gY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLwotCi0gIEpIVUZGX1RCTCAqIGRjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107Ci0gIEpIVUZGX1RCTCAqIGFjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107Ci0gIC8qIHB0cnMgdG8gSHVmZm1hbiBjb2RpbmcgdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCi0KLSAgVUlOVDggYXJpdGhfZGNfTFtOVU1fQVJJVEhfVEJMU107IC8qIEwgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCi0gIFVJTlQ4IGFyaXRoX2RjX1VbTlVNX0FSSVRIX1RCTFNdOyAvKiBVIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwotICBVSU5UOCBhcml0aF9hY19LW05VTV9BUklUSF9UQkxTXTsgLyogS3ggdmFsdWVzIGZvciBBQyBhcml0aC1jb2RpbmcgdGFibGVzICovCi0KLSAgaW50IG51bV9zY2FuczsJCS8qICMgb2YgZW50cmllcyBpbiBzY2FuX2luZm8gYXJyYXkgKi8KLSAgY29uc3QganBlZ19zY2FuX2luZm8gKiBzY2FuX2luZm87IC8qIHNjcmlwdCBmb3IgbXVsdGktc2NhbiBmaWxlLCBvciBOVUxMICovCi0gIC8qIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHNjYW5faW5mbyBpcyBOVUxMLCB3aGljaCBjYXVzZXMgYSBzaW5nbGUtc2NhbgotICAgKiBzZXF1ZW50aWFsIEpQRUcgZmlsZSB0byBiZSBlbWl0dGVkLiAgVG8gY3JlYXRlIGEgbXVsdGktc2NhbiBmaWxlLAotICAgKiBzZXQgbnVtX3NjYW5zIGFuZCBzY2FuX2luZm8gdG8gcG9pbnQgdG8gYW4gYXJyYXkgb2Ygc2NhbiBkZWZpbml0aW9ucy4KLSAgICovCi0KLSAgYm9vbGVhbiByYXdfZGF0YV9pbjsJCS8qIFRSVUU9Y2FsbGVyIHN1cHBsaWVzIGRvd25zYW1wbGVkIGRhdGEgKi8KLSAgYm9vbGVhbiBhcml0aF9jb2RlOwkJLyogVFJVRT1hcml0aG1ldGljIGNvZGluZywgRkFMU0U9SHVmZm1hbiAqLwotICBib29sZWFuIG9wdGltaXplX2NvZGluZzsJLyogVFJVRT1vcHRpbWl6ZSBlbnRyb3B5IGVuY29kaW5nIHBhcm1zICovCi0gIGJvb2xlYW4gQ0NJUjYwMV9zYW1wbGluZzsJLyogVFJVRT1maXJzdCBzYW1wbGVzIGFyZSBjb3NpdGVkICovCi0gIGludCBzbW9vdGhpbmdfZmFjdG9yOwkJLyogMS4uMTAwLCBvciAwIGZvciBubyBpbnB1dCBzbW9vdGhpbmcgKi8KLSAgSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2Q7CS8qIERDVCBhbGdvcml0aG0gc2VsZWN0b3IgKi8KLQotICAvKiBUaGUgcmVzdGFydCBpbnRlcnZhbCBjYW4gYmUgc3BlY2lmaWVkIGluIGFic29sdXRlIE1DVXMgYnkgc2V0dGluZwotICAgKiByZXN0YXJ0X2ludGVydmFsLCBvciBpbiBNQ1Ugcm93cyBieSBzZXR0aW5nIHJlc3RhcnRfaW5fcm93cwotICAgKiAoaW4gd2hpY2ggY2FzZSB0aGUgY29ycmVjdCByZXN0YXJ0X2ludGVydmFsIHdpbGwgYmUgZmlndXJlZAotICAgKiBmb3IgZWFjaCBzY2FuKS4KLSAgICovCi0gIHVuc2lnbmVkIGludCByZXN0YXJ0X2ludGVydmFsOyAvKiBNQ1VzIHBlciByZXN0YXJ0LCBvciAwIGZvciBubyByZXN0YXJ0ICovCi0gIGludCByZXN0YXJ0X2luX3Jvd3M7CQkvKiBpZiA+IDAsIE1DVSByb3dzIHBlciByZXN0YXJ0IGludGVydmFsICovCi0KLSAgLyogUGFyYW1ldGVycyBjb250cm9sbGluZyBlbWlzc2lvbiBvZiBzcGVjaWFsIG1hcmtlcnMuICovCi0KLSAgYm9vbGVhbiB3cml0ZV9KRklGX2hlYWRlcjsJLyogc2hvdWxkIGEgSkZJRiBtYXJrZXIgYmUgd3JpdHRlbj8gKi8KLSAgVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uOwkvKiBXaGF0IHRvIHdyaXRlIGZvciB0aGUgSkZJRiB2ZXJzaW9uIG51bWJlciAqLwotICBVSU5UOCBKRklGX21pbm9yX3ZlcnNpb247Ci0gIC8qIFRoZXNlIHRocmVlIHZhbHVlcyBhcmUgbm90IHVzZWQgYnkgdGhlIEpQRUcgY29kZSwgbWVyZWx5IGNvcGllZCAqLwotICAvKiBpbnRvIHRoZSBKRklGIEFQUDAgbWFya2VyLiAgZGVuc2l0eV91bml0IGNhbiBiZSAwIGZvciB1bmtub3duLCAqLwotICAvKiAxIGZvciBkb3RzL2luY2gsIG9yIDIgZm9yIGRvdHMvY20uICBOb3RlIHRoYXQgdGhlIHBpeGVsIGFzcGVjdCAqLwotICAvKiByYXRpbyBpcyBkZWZpbmVkIGJ5IFhfZGVuc2l0eS9ZX2RlbnNpdHkgZXZlbiB3aGVuIGRlbnNpdHlfdW5pdD0wLiAqLwotICBVSU5UOCBkZW5zaXR5X3VuaXQ7CQkvKiBKRklGIGNvZGUgZm9yIHBpeGVsIHNpemUgdW5pdHMgKi8KLSAgVUlOVDE2IFhfZGVuc2l0eTsJCS8qIEhvcml6b250YWwgcGl4ZWwgZGVuc2l0eSAqLwotICBVSU5UMTYgWV9kZW5zaXR5OwkJLyogVmVydGljYWwgcGl4ZWwgZGVuc2l0eSAqLwotICBib29sZWFuIHdyaXRlX0Fkb2JlX21hcmtlcjsJLyogc2hvdWxkIGFuIEFkb2JlIG1hcmtlciBiZSB3cml0dGVuPyAqLwotCi0gIC8qIFN0YXRlIHZhcmlhYmxlOiBpbmRleCBvZiBuZXh0IHNjYW5saW5lIHRvIGJlIHdyaXR0ZW4gdG8KLSAgICoganBlZ193cml0ZV9zY2FubGluZXMoKS4gIEFwcGxpY2F0aW9uIG1heSB1c2UgdGhpcyB0byBjb250cm9sIGl0cwotICAgKiBwcm9jZXNzaW5nIGxvb3AsIGUuZy4sICJ3aGlsZSAobmV4dF9zY2FubGluZSA8IGltYWdlX2hlaWdodCkiLgotICAgKi8KLQotICBKRElNRU5TSU9OIG5leHRfc2NhbmxpbmU7CS8qIDAgLi4gaW1hZ2VfaGVpZ2h0LTEgICovCi0KLSAgLyogUmVtYWluaW5nIGZpZWxkcyBhcmUga25vd24gdGhyb3VnaG91dCBjb21wcmVzc29yLCBidXQgZ2VuZXJhbGx5Ci0gICAqIHNob3VsZCBub3QgYmUgdG91Y2hlZCBieSBhIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgotICAgKi8KLQotICAvKgotICAgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbXB1dGVkIGR1cmluZyBjb21wcmVzc2lvbiBzdGFydHVwCi0gICAqLwotICBib29sZWFuIHByb2dyZXNzaXZlX21vZGU7CS8qIFRSVUUgaWYgc2NhbiBzY3JpcHQgdXNlcyBwcm9ncmVzc2l2ZSBtb2RlICovCi0gIGludCBtYXhfaF9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCBoX3NhbXBfZmFjdG9yICovCi0gIGludCBtYXhfdl9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCB2X3NhbXBfZmFjdG9yICovCi0KLSAgSkRJTUVOU0lPTiB0b3RhbF9pTUNVX3Jvd3M7CS8qICMgb2YgaU1DVSByb3dzIHRvIGJlIGlucHV0IHRvIGNvZWYgY3RsciAqLwotICAvKiBUaGUgY29lZmZpY2llbnQgY29udHJvbGxlciByZWNlaXZlcyBkYXRhIGluIHVuaXRzIG9mIE1DVSByb3dzIGFzIGRlZmluZWQKLSAgICogZm9yIGZ1bGx5IGludGVybGVhdmVkIHNjYW5zICh3aGV0aGVyIHRoZSBKUEVHIGZpbGUgaXMgaW50ZXJsZWF2ZWQgb3Igbm90KS4KLSAgICogVGhlcmUgYXJlIHZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50IGluIGFuCi0gICAqICJpTUNVIiAoaW50ZXJsZWF2ZWQgTUNVKSByb3cuCi0gICAqLwotCi0gIC8qCi0gICAqIFRoZXNlIGZpZWxkcyBhcmUgdmFsaWQgZHVyaW5nIGFueSBvbmUgc2Nhbi4KLSAgICogVGhleSBkZXNjcmliZSB0aGUgY29tcG9uZW50cyBhbmQgTUNVcyBhY3R1YWxseSBhcHBlYXJpbmcgaW4gdGhlIHNjYW4uCi0gICAqLwotICBpbnQgY29tcHNfaW5fc2NhbjsJCS8qICMgb2YgSlBFRyBjb21wb25lbnRzIGluIHRoaXMgc2NhbiAqLwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY3VyX2NvbXBfaW5mb1tNQVhfQ09NUFNfSU5fU0NBTl07Ci0gIC8qICpjdXJfY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09TICovCi0KLSAgSkRJTUVOU0lPTiBNQ1VzX3Blcl9yb3c7CS8qICMgb2YgTUNVcyBhY3Jvc3MgdGhlIGltYWdlICovCi0gIEpESU1FTlNJT04gTUNVX3Jvd3NfaW5fc2NhbjsJLyogIyBvZiBNQ1Ugcm93cyBpbiB0aGUgaW1hZ2UgKi8KLQotICBpbnQgYmxvY2tzX2luX01DVTsJCS8qICMgb2YgRENUIGJsb2NrcyBwZXIgTUNVICovCi0gIGludCBNQ1VfbWVtYmVyc2hpcFtDX01BWF9CTE9DS1NfSU5fTUNVXTsKLSAgLyogTUNVX21lbWJlcnNoaXBbaV0gaXMgaW5kZXggaW4gY3VyX2NvbXBfaW5mbyBvZiBjb21wb25lbnQgb3duaW5nICovCi0gIC8qIGkndGggYmxvY2sgaW4gYW4gTUNVICovCi0KLSAgaW50IFNzLCBTZSwgQWgsIEFsOwkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBwYXJhbWV0ZXJzIGZvciBzY2FuICovCi0KLSAgLyoKLSAgICogTGlua3MgdG8gY29tcHJlc3Npb24gc3Vib2JqZWN0cyAobWV0aG9kcyBhbmQgcHJpdmF0ZSB2YXJpYWJsZXMgb2YgbW9kdWxlcykKLSAgICovCi0gIHN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyICogbWFzdGVyOwotICBzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciAqIG1haW47Ci0gIHN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyICogcHJlcDsKLSAgc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgKiBjb2VmOwotICBzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyICogbWFya2VyOwotICBzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgKiBjY29udmVydDsKLSAgc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgKiBkb3duc2FtcGxlOwotICBzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCAqIGZkY3Q7Ci0gIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqIGVudHJvcHk7Ci0gIGpwZWdfc2Nhbl9pbmZvICogc2NyaXB0X3NwYWNlOyAvKiB3b3Jrc3BhY2UgZm9yIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uICovCi0gIGludCBzY3JpcHRfc3BhY2Vfc2l6ZTsKLX07Ci0KLQotLyogTWFzdGVyIHJlY29yZCBmb3IgYSBkZWNvbXByZXNzaW9uIGluc3RhbmNlICovCi0KLXN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IHsKLSAganBlZ19jb21tb25fZmllbGRzOwkJLyogRmllbGRzIHNoYXJlZCB3aXRoIGpwZWdfY29tcHJlc3Nfc3RydWN0ICovCi0KLSAgLyogU291cmNlIG9mIGNvbXByZXNzZWQgZGF0YSAqLwotICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICogc3JjOwotCi0gIC8qIEJhc2ljIGRlc2NyaXB0aW9uIG9mIGltYWdlIC0tLSBmaWxsZWQgaW4gYnkganBlZ19yZWFkX2hlYWRlcigpLiAqLwotICAvKiBBcHBsaWNhdGlvbiBtYXkgaW5zcGVjdCB0aGVzZSB2YWx1ZXMgdG8gZGVjaWRlIGhvdyB0byBwcm9jZXNzIGltYWdlLiAqLwotCi0gIEpESU1FTlNJT04gb3JpZ2luYWxfaW1hZ2Vfd2lkdGg7CS8qIG5vbWluYWwgaW1hZ2Ugd2lkdGggKGZyb20gU09GIG1hcmtlcikgKi8KLQotICBKRElNRU5TSU9OIGltYWdlX3dpZHRoOwkvKiBub21pbmFsIGltYWdlIHdpZHRoIChmcm9tIFNPRiBtYXJrZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIGNoYW5nZWQgYnkgdGlsZSBkZWNvZGUgKi8KLSAgSkRJTUVOU0lPTiBpbWFnZV9oZWlnaHQ7CS8qIG5vbWluYWwgaW1hZ2UgaGVpZ2h0ICovCi0gIGludCBudW1fY29tcG9uZW50czsJCS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBKUEVHIGltYWdlICovCi0gIEpfQ09MT1JfU1BBQ0UganBlZ19jb2xvcl9zcGFjZTsgLyogY29sb3JzcGFjZSBvZiBKUEVHIGltYWdlICovCi0KLSAgLyogRGVjb21wcmVzc2lvbiBwcm9jZXNzaW5nIHBhcmFtZXRlcnMgLS0tIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHNldCBiZWZvcmUKLSAgICogY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4gIE5vdGUgdGhhdCBqcGVnX3JlYWRfaGVhZGVyKCkgaW5pdGlhbGl6ZXMKLSAgICogdGhlbSB0byBkZWZhdWx0IHZhbHVlcy4KLSAgICovCi0KLSAgSl9DT0xPUl9TUEFDRSBvdXRfY29sb3Jfc3BhY2U7IC8qIGNvbG9yc3BhY2UgZm9yIG91dHB1dCAqLwotCi0gIHVuc2lnbmVkIGludCBzY2FsZV9udW0sIHNjYWxlX2Rlbm9tOyAvKiBmcmFjdGlvbiBieSB3aGljaCB0byBzY2FsZSBpbWFnZSAqLwotCi0gIGRvdWJsZSBvdXRwdXRfZ2FtbWE7CQkvKiBpbWFnZSBnYW1tYSB3YW50ZWQgaW4gb3V0cHV0ICovCi0KLSAgYm9vbGVhbiBidWZmZXJlZF9pbWFnZTsJLyogVFJVRT1tdWx0aXBsZSBvdXRwdXQgcGFzc2VzICovCi0gIGJvb2xlYW4gcmF3X2RhdGFfb3V0OwkJLyogVFJVRT1kb3duc2FtcGxlZCBkYXRhIHdhbnRlZCAqLwotCi0gIEpfRENUX01FVEhPRCBkY3RfbWV0aG9kOwkvKiBJRENUIGFsZ29yaXRobSBzZWxlY3RvciAqLwotICBib29sZWFuIGRvX2ZhbmN5X3Vwc2FtcGxpbmc7CS8qIFRSVUU9YXBwbHkgZmFuY3kgdXBzYW1wbGluZyAqLwotICBib29sZWFuIGRvX2Jsb2NrX3Ntb290aGluZzsJLyogVFJVRT1hcHBseSBpbnRlcmJsb2NrIHNtb290aGluZyAqLwotCi0gIGJvb2xlYW4gcXVhbnRpemVfY29sb3JzOwkvKiBUUlVFPWNvbG9ybWFwcGVkIG91dHB1dCB3YW50ZWQgKi8KLSAgLyogdGhlIGZvbGxvd2luZyBhcmUgaWdub3JlZCBpZiBub3QgcXVhbnRpemVfY29sb3JzOiAqLwotICBKX0RJVEhFUl9NT0RFIGRpdGhlcl9tb2RlOwkvKiB0eXBlIG9mIGNvbG9yIGRpdGhlcmluZyB0byB1c2UgKi8KLSAgYm9vbGVhbiB0d29fcGFzc19xdWFudGl6ZTsJLyogVFJVRT11c2UgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uICovCi0gIGludCBkZXNpcmVkX251bWJlcl9vZl9jb2xvcnM7CS8qIG1heCAjIGNvbG9ycyB0byB1c2UgaW4gY3JlYXRlZCBjb2xvcm1hcCAqLwotICAvKiB0aGVzZSBhcmUgc2lnbmlmaWNhbnQgb25seSBpbiBidWZmZXJlZC1pbWFnZSBtb2RlOiAqLwotICBib29sZWFuIGVuYWJsZV8xcGFzc19xdWFudDsJLyogZW5hYmxlIGZ1dHVyZSB1c2Ugb2YgMS1wYXNzIHF1YW50aXplciAqLwotICBib29sZWFuIGVuYWJsZV9leHRlcm5hbF9xdWFudDsvKiBlbmFibGUgZnV0dXJlIHVzZSBvZiBleHRlcm5hbCBjb2xvcm1hcCAqLwotICBib29sZWFuIGVuYWJsZV8ycGFzc19xdWFudDsJLyogZW5hYmxlIGZ1dHVyZSB1c2Ugb2YgMi1wYXNzIHF1YW50aXplciAqLwotCi0gIC8qIERlc2NyaXB0aW9uIG9mIGFjdHVhbCBvdXRwdXQgaW1hZ2UgdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIGFwcGxpY2F0aW9uLgotICAgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbXB1dGVkIGJ5IGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgotICAgKiBZb3UgY2FuIGFsc28gdXNlIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucygpIHRvIGRldGVybWluZSB0aGVzZSB2YWx1ZXMKLSAgICogaW4gYWR2YW5jZSBvZiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgotICAgKi8KLQotICBKRElNRU5TSU9OIG91dHB1dF93aWR0aDsJLyogc2NhbGVkIGltYWdlIHdpZHRoICovCi0gIEpESU1FTlNJT04gb3V0cHV0X2hlaWdodDsJLyogc2NhbGVkIGltYWdlIGhlaWdodCAqLwotICBpbnQgb3V0X2NvbG9yX2NvbXBvbmVudHM7CS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBvdXRfY29sb3Jfc3BhY2UgKi8KLSAgaW50IG91dHB1dF9jb21wb25lbnRzOwkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgcmV0dXJuZWQgKi8KLSAgLyogb3V0cHV0X2NvbXBvbmVudHMgaXMgMSAoYSBjb2xvcm1hcCBpbmRleCkgd2hlbiBxdWFudGl6aW5nIGNvbG9yczsKLSAgICogb3RoZXJ3aXNlIGl0IGVxdWFscyBvdXRfY29sb3JfY29tcG9uZW50cy4KLSAgICovCi0gIGludCByZWNfb3V0YnVmX2hlaWdodDsJLyogbWluIHJlY29tbWVuZGVkIGhlaWdodCBvZiBzY2FubGluZSBidWZmZXIgKi8KLSAgLyogSWYgdGhlIGJ1ZmZlciBwYXNzZWQgdG8ganBlZ19yZWFkX3NjYW5saW5lcygpIGlzIGxlc3MgdGhhbiB0aGlzIG1hbnkgcm93cwotICAgKiBoaWdoLCBzcGFjZSBhbmQgdGltZSB3aWxsIGJlIHdhc3RlZCBkdWUgdG8gdW5uZWNlc3NhcnkgZGF0YSBjb3B5aW5nLgotICAgKiBVc3VhbGx5IHJlY19vdXRidWZfaGVpZ2h0IHdpbGwgYmUgMSBvciAyLCBhdCBtb3N0IDQuCi0gICAqLwotCi0gIC8qIFdoZW4gcXVhbnRpemluZyBjb2xvcnMsIHRoZSBvdXRwdXQgY29sb3JtYXAgaXMgZGVzY3JpYmVkIGJ5IHRoZXNlIGZpZWxkcy4KLSAgICogVGhlIGFwcGxpY2F0aW9uIGNhbiBzdXBwbHkgYSBjb2xvcm1hcCBieSBzZXR0aW5nIGNvbG9ybWFwIG5vbi1OVUxMIGJlZm9yZQotICAgKiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzczsgb3RoZXJ3aXNlIGEgY29sb3JtYXAgaXMgY3JlYXRlZCBkdXJpbmcKLSAgICoganBlZ19zdGFydF9kZWNvbXByZXNzIG9yIGpwZWdfc3RhcnRfb3V0cHV0LgotICAgKiBUaGUgbWFwIGhhcyBvdXRfY29sb3JfY29tcG9uZW50cyByb3dzIGFuZCBhY3R1YWxfbnVtYmVyX29mX2NvbG9ycyBjb2x1bW5zLgotICAgKi8KLSAgaW50IGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOwkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB1c2UgKi8KLSAgSlNBTVBBUlJBWSBjb2xvcm1hcDsJCS8qIFRoZSBjb2xvciBtYXAgYXMgYSAyLUQgcGl4ZWwgYXJyYXkgKi8KLQotICAvKiBTdGF0ZSB2YXJpYWJsZXM6IHRoZXNlIHZhcmlhYmxlcyBpbmRpY2F0ZSB0aGUgcHJvZ3Jlc3Mgb2YgZGVjb21wcmVzc2lvbi4KLSAgICogVGhlIGFwcGxpY2F0aW9uIG1heSBleGFtaW5lIHRoZXNlIGJ1dCBtdXN0IG5vdCBtb2RpZnkgdGhlbS4KLSAgICovCi0KLSAgLyogUm93IGluZGV4IG9mIG5leHQgc2NhbmxpbmUgdG8gYmUgcmVhZCBmcm9tIGpwZWdfcmVhZF9zY2FubGluZXMoKS4KLSAgICogQXBwbGljYXRpb24gbWF5IHVzZSB0aGlzIHRvIGNvbnRyb2wgaXRzIHByb2Nlc3NpbmcgbG9vcCwgZS5nLiwKLSAgICogIndoaWxlIChvdXRwdXRfc2NhbmxpbmUgPCBvdXRwdXRfaGVpZ2h0KSIuCi0gICAqLwotICBKRElNRU5TSU9OIG91dHB1dF9zY2FubGluZTsJLyogMCAuLiBvdXRwdXRfaGVpZ2h0LTEgICovCi0KLSAgLyogQ3VycmVudCBpbnB1dCBzY2FuIG51bWJlciBhbmQgbnVtYmVyIG9mIGlNQ1Ugcm93cyBjb21wbGV0ZWQgaW4gc2Nhbi4KLSAgICogVGhlc2UgaW5kaWNhdGUgdGhlIHByb2dyZXNzIG9mIHRoZSBkZWNvbXByZXNzb3IgaW5wdXQgc2lkZS4KLSAgICovCi0gIGludCBpbnB1dF9zY2FuX251bWJlcjsJLyogTnVtYmVyIG9mIFNPUyBtYXJrZXJzIHNlZW4gc28gZmFyICovCi0gIEpESU1FTlNJT04gaW5wdXRfaU1DVV9yb3c7CS8qIE51bWJlciBvZiBpTUNVIHJvd3MgY29tcGxldGVkICovCi0KLSAgLyogVGhlICJvdXRwdXQgc2NhbiBudW1iZXIiIGlzIHRoZSBub3Rpb25hbCBzY2FuIGJlaW5nIGRpc3BsYXllZCBieSB0aGUKLSAgICogb3V0cHV0IHNpZGUuICBUaGUgZGVjb21wcmVzc29yIHdpbGwgbm90IGFsbG93IG91dHB1dCBzY2FuL3JvdyBudW1iZXIKLSAgICogdG8gZ2V0IGFoZWFkIG9mIGlucHV0IHNjYW4vcm93LCBidXQgaXQgY2FuIGZhbGwgYXJiaXRyYXJpbHkgZmFyIGJlaGluZC4KLSAgICovCi0gIGludCBvdXRwdXRfc2Nhbl9udW1iZXI7CS8qIE5vbWluYWwgc2NhbiBudW1iZXIgYmVpbmcgZGlzcGxheWVkICovCi0gIEpESU1FTlNJT04gb3V0cHV0X2lNQ1Vfcm93OwkvKiBOdW1iZXIgb2YgaU1DVSByb3dzIHJlYWQgKi8KLQotICAvKiBDdXJyZW50IHByb2dyZXNzaW9uIHN0YXR1cy4gIGNvZWZfYml0c1tjXVtpXSBpbmRpY2F0ZXMgdGhlIHByZWNpc2lvbgotICAgKiB3aXRoIHdoaWNoIGNvbXBvbmVudCBjJ3MgRENUIGNvZWZmaWNpZW50IGkgKGluIHppZ3phZyBvcmRlcikgaXMga25vd24uCi0gICAqIEl0IGlzIC0xIHdoZW4gbm8gZGF0YSBoYXMgeWV0IGJlZW4gcmVjZWl2ZWQsIG90aGVyd2lzZSBpdCBpcyB0aGUgcG9pbnQKLSAgICogdHJhbnNmb3JtIChzaGlmdCkgdmFsdWUgZm9yIHRoZSBtb3N0IHJlY2VudCBzY2FuIG9mIHRoZSBjb2VmZmljaWVudAotICAgKiAodGh1cywgMCBhdCBjb21wbGV0aW9uIG9mIHRoZSBwcm9ncmVzc2lvbikuCi0gICAqIFRoaXMgcG9pbnRlciBpcyBOVUxMIHdoZW4gcmVhZGluZyBhIG5vbi1wcm9ncmVzc2l2ZSBmaWxlLgotICAgKi8KLSAgaW50ICgqY29lZl9iaXRzKVtEQ1RTSVpFMl07CS8qIC0xIG9yIGN1cnJlbnQgQWwgdmFsdWUgZm9yIGVhY2ggY29lZiAqLwotCi0gIC8qIEludGVybmFsIEpQRUcgcGFyYW1ldGVycyAtLS0gdGhlIGFwcGxpY2F0aW9uIHVzdWFsbHkgbmVlZCBub3QgbG9vayBhdAotICAgKiB0aGVzZSBmaWVsZHMuICBOb3RlIHRoYXQgdGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtYXkgbm90IHVzZQotICAgKiBhbnkgcGFyYW1ldGVycyB0aGF0IGNhbiBjaGFuZ2UgYmV0d2VlbiBzY2Fucy4KLSAgICovCi0KLSAgLyogUXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcyBhcmUgY2FycmllZCBmb3J3YXJkIGFjcm9zcyBpbnB1dAotICAgKiBkYXRhc3RyZWFtcyB3aGVuIHByb2Nlc3NpbmcgYWJicmV2aWF0ZWQgSlBFRyBkYXRhc3RyZWFtcy4KLSAgICovCi0KLSAgSlFVQU5UX1RCTCAqIHF1YW50X3RibF9wdHJzW05VTV9RVUFOVF9UQkxTXTsKLSAgLyogcHRycyB0byBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCi0KLSAgSkhVRkZfVEJMICogZGNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKLSAgSkhVRkZfVEJMICogYWNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKLSAgLyogcHRycyB0byBIdWZmbWFuIGNvZGluZyB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KLQotICAvKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBuZXZlciBjYXJyaWVkIGFjcm9zcyBkYXRhc3RyZWFtcywgc2luY2UgdGhleQotICAgKiBhcmUgZ2l2ZW4gaW4gU09GL1NPUyBtYXJrZXJzIG9yIGRlZmluZWQgdG8gYmUgcmVzZXQgYnkgU09JLgotICAgKi8KLQotICBpbnQgZGF0YV9wcmVjaXNpb247CQkvKiBiaXRzIG9mIHByZWNpc2lvbiBpbiBpbWFnZSBkYXRhICovCi0KLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBfaW5mbzsKLSAgLyogY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09GICovCi0KLSAgYm9vbGVhbiB0aWxlX2RlY29kZTsgICAgICAgICAvKiBUUlVFIGlmIHVzaW5nIHRpbGUgYmFzZWQgZGVjb2RpbmcgKi8KLSAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiBUUlVFIGlmIFNPRm4gc3BlY2lmaWVzIHByb2dyZXNzaXZlIG1vZGUgKi8KLSAgYm9vbGVhbiBhcml0aF9jb2RlOwkJLyogVFJVRT1hcml0aG1ldGljIGNvZGluZywgRkFMU0U9SHVmZm1hbiAqLwotCi0gIFVJTlQ4IGFyaXRoX2RjX0xbTlVNX0FSSVRIX1RCTFNdOyAvKiBMIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwotICBVSU5UOCBhcml0aF9kY19VW05VTV9BUklUSF9UQkxTXTsgLyogVSB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KLSAgVUlOVDggYXJpdGhfYWNfS1tOVU1fQVJJVEhfVEJMU107IC8qIEt4IHZhbHVlcyBmb3IgQUMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwotCi0gIHVuc2lnbmVkIGludCByZXN0YXJ0X2ludGVydmFsOyAvKiBNQ1VzIHBlciByZXN0YXJ0IGludGVydmFsLCBvciAwIGZvciBubyByZXN0YXJ0ICovCi0KLSAgLyogVGhlc2UgZmllbGRzIHJlY29yZCBkYXRhIG9idGFpbmVkIGZyb20gb3B0aW9uYWwgbWFya2VycyByZWNvZ25pemVkIGJ5Ci0gICAqIHRoZSBKUEVHIGxpYnJhcnkuCi0gICAqLwotICBib29sZWFuIHNhd19KRklGX21hcmtlcjsJLyogVFJVRSBpZmYgYSBKRklGIEFQUDAgbWFya2VyIHdhcyBmb3VuZCAqLwotICAvKiBEYXRhIGNvcGllZCBmcm9tIEpGSUYgbWFya2VyOyBvbmx5IHZhbGlkIGlmIHNhd19KRklGX21hcmtlciBpcyBUUlVFOiAqLwotICBVSU5UOCBKRklGX21ham9yX3ZlcnNpb247CS8qIEpGSUYgdmVyc2lvbiBudW1iZXIgKi8KLSAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uOwotICBVSU5UOCBkZW5zaXR5X3VuaXQ7CQkvKiBKRklGIGNvZGUgZm9yIHBpeGVsIHNpemUgdW5pdHMgKi8KLSAgVUlOVDE2IFhfZGVuc2l0eTsJCS8qIEhvcml6b250YWwgcGl4ZWwgZGVuc2l0eSAqLwotICBVSU5UMTYgWV9kZW5zaXR5OwkJLyogVmVydGljYWwgcGl4ZWwgZGVuc2l0eSAqLwotICBib29sZWFuIHNhd19BZG9iZV9tYXJrZXI7CS8qIFRSVUUgaWZmIGFuIEFkb2JlIEFQUDE0IG1hcmtlciB3YXMgZm91bmQgKi8KLSAgVUlOVDggQWRvYmVfdHJhbnNmb3JtOwkvKiBDb2xvciB0cmFuc2Zvcm0gY29kZSBmcm9tIEFkb2JlIG1hcmtlciAqLwotCi0gIGJvb2xlYW4gQ0NJUjYwMV9zYW1wbGluZzsJLyogVFJVRT1maXJzdCBzYW1wbGVzIGFyZSBjb3NpdGVkICovCi0KLSAgLyogQXNpZGUgZnJvbSB0aGUgc3BlY2lmaWMgZGF0YSByZXRhaW5lZCBmcm9tIEFQUG4gbWFya2VycyBrbm93biB0byB0aGUKLSAgICogbGlicmFyeSwgdGhlIHVuaW50ZXJwcmV0ZWQgY29udGVudHMgb2YgYW55IG9yIGFsbCBBUFBuIGFuZCBDT00gbWFya2VycwotICAgKiBjYW4gYmUgc2F2ZWQgaW4gYSBsaXN0IGZvciBleGFtaW5hdGlvbiBieSB0aGUgYXBwbGljYXRpb24uCi0gICAqLwotICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgbWFya2VyX2xpc3Q7IC8qIEhlYWQgb2YgbGlzdCBvZiBzYXZlZCBtYXJrZXJzICovCi0KLSAgLyogUmVtYWluaW5nIGZpZWxkcyBhcmUga25vd24gdGhyb3VnaG91dCBkZWNvbXByZXNzb3IsIGJ1dCBnZW5lcmFsbHkKLSAgICogc2hvdWxkIG5vdCBiZSB0b3VjaGVkIGJ5IGEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCi0gICAqLwotCi0gIC8qCi0gICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGRlY29tcHJlc3Npb24gc3RhcnR1cAotICAgKi8KLSAgaW50IG1heF9oX3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IGhfc2FtcF9mYWN0b3IgKi8KLSAgaW50IG1heF92X3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IHZfc2FtcF9mYWN0b3IgKi8KLQotICBpbnQgbWluX0RDVF9zY2FsZWRfc2l6ZTsJLyogc21hbGxlc3QgRENUX3NjYWxlZF9zaXplIG9mIGFueSBjb21wb25lbnQgKi8KLQotICBKRElNRU5TSU9OIHRvdGFsX2lNQ1Vfcm93czsJLyogIyBvZiBpTUNVIHJvd3MgaW4gaW1hZ2UgKi8KLSAgLyogVGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIncyBpbnB1dCBhbmQgb3V0cHV0IHByb2dyZXNzIGlzIG1lYXN1cmVkIGluCi0gICAqIHVuaXRzIG9mICJpTUNVIiAoaW50ZXJsZWF2ZWQgTUNVKSByb3dzLiAgVGhlc2UgYXJlIHRoZSBzYW1lIGFzIE1DVSByb3dzCi0gICAqIGluIGZ1bGx5IGludGVybGVhdmVkIEpQRUcgc2NhbnMsIGJ1dCBhcmUgdXNlZCB3aGV0aGVyIHRoZSBzY2FuIGlzCi0gICAqIGludGVybGVhdmVkIG9yIG5vdC4gIFdlIGRlZmluZSBhbiBpTUNVIHJvdyBhcyB2X3NhbXBfZmFjdG9yIERDVCBibG9jawotICAgKiByb3dzIG9mIGVhY2ggY29tcG9uZW50LiAgVGhlcmVmb3JlLCB0aGUgSURDVCBvdXRwdXQgY29udGFpbnMKLSAgICogdl9zYW1wX2ZhY3RvcipEQ1Rfc2NhbGVkX3NpemUgc2FtcGxlIHJvd3Mgb2YgYSBjb21wb25lbnQgcGVyIGlNQ1Ugcm93LgotICAgKi8KLQotICBKU0FNUExFICogc2FtcGxlX3JhbmdlX2xpbWl0OyAvKiB0YWJsZSBmb3IgZmFzdCByYW5nZS1saW1pdGluZyAqLwotCi0gIC8qCi0gICAqIFRoZXNlIGZpZWxkcyBhcmUgdmFsaWQgZHVyaW5nIGFueSBvbmUgc2Nhbi4KLSAgICogVGhleSBkZXNjcmliZSB0aGUgY29tcG9uZW50cyBhbmQgTUNVcyBhY3R1YWxseSBhcHBlYXJpbmcgaW4gdGhlIHNjYW4uCi0gICAqIE5vdGUgdGhhdCB0aGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG11c3Qgbm90IHVzZSB0aGVzZSBmaWVsZHMuCi0gICAqLwotICBpbnQgY29tcHNfaW5fc2NhbjsJCS8qICMgb2YgSlBFRyBjb21wb25lbnRzIGluIHRoaXMgc2NhbiAqLwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY3VyX2NvbXBfaW5mb1tNQVhfQ09NUFNfSU5fU0NBTl07Ci0gIC8qICpjdXJfY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09TICovCi0KLSAgSkRJTUVOU0lPTiBNQ1VzX3Blcl9yb3c7CS8qICMgb2YgTUNVcyBhY3Jvc3MgdGhlIGltYWdlICovCi0gIEpESU1FTlNJT04gTUNVX3Jvd3NfaW5fc2NhbjsJLyogIyBvZiBNQ1Ugcm93cyBpbiB0aGUgaW1hZ2UgKi8KLQotICBpbnQgYmxvY2tzX2luX01DVTsJCS8qICMgb2YgRENUIGJsb2NrcyBwZXIgTUNVICovCi0gIGludCBNQ1VfbWVtYmVyc2hpcFtEX01BWF9CTE9DS1NfSU5fTUNVXTsKLSAgLyogTUNVX21lbWJlcnNoaXBbaV0gaXMgaW5kZXggaW4gY3VyX2NvbXBfaW5mbyBvZiBjb21wb25lbnQgb3duaW5nICovCi0gIC8qIGkndGggYmxvY2sgaW4gYW4gTUNVICovCi0KLSAgaW50IFNzLCBTZSwgQWgsIEFsOwkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBwYXJhbWV0ZXJzIGZvciBzY2FuICovCi0KLSAgLyogVGhpcyBmaWVsZCBpcyBzaGFyZWQgYmV0d2VlbiBlbnRyb3B5IGRlY29kZXIgYW5kIG1hcmtlciBwYXJzZXIuCi0gICAqIEl0IGlzIGVpdGhlciB6ZXJvIG9yIHRoZSBjb2RlIG9mIGEgSlBFRyBtYXJrZXIgdGhhdCBoYXMgYmVlbgotICAgKiByZWFkIGZyb20gdGhlIGRhdGEgc291cmNlLCBidXQgaGFzIG5vdCB5ZXQgYmVlbiBwcm9jZXNzZWQuCi0gICAqLwotICBpbnQgdW5yZWFkX21hcmtlcjsKLQotICAvKgotICAgKiBMaW5rcyB0byBkZWNvbXByZXNzaW9uIHN1Ym9iamVjdHMgKG1ldGhvZHMsIHByaXZhdGUgdmFyaWFibGVzIG9mIG1vZHVsZXMpCi0gICAqLwotICBzdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyICogbWFzdGVyOwotICBzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciAqIG1haW47Ci0gIHN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyICogY29lZjsKLSAgc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgKiBwb3N0OwotICBzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyICogaW5wdXRjdGw7Ci0gIHN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgKiBtYXJrZXI7Ci0gIHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciAqIGVudHJvcHk7Ci0gIHN0cnVjdCBqcGVnX2ludmVyc2VfZGN0ICogaWRjdDsKLSAgc3RydWN0IGpwZWdfdXBzYW1wbGVyICogdXBzYW1wbGU7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyICogY2NvbnZlcnQ7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqIGNxdWFudGl6ZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAvLyB8LS0tIGJ5dGVfb2Zmc2V0IC0tLXwtIGJpdF9sZWZ0IC18Ci0gIC8vICBcLS0tLS0tIDI3IC0tLS0tLS0vIFwtLS0tIDUgLS0tLS8KLSAgdW5zaWduZWQgaW50IGJpdHN0cmVhbV9vZmZzZXQ7Ci0gIHNob3J0IHByZXZfZGNbM107Ci0KLSAgLy8gcmVtYWluaW5nIEVPQnMgaW4gRU9CUlVOCi0gIHVuc2lnbmVkIHNob3J0IEVPQlJVTjsKLQotICAvLyBzYXZlIHRoZSBkZWNvZGVyIGN1cnJlbnQgYml0IGJ1ZmZlciwgZW50cm9weS0+Yml0c3RhdGUuZ2V0X2J1ZmZlci4KLSAgSU5UMzIgZ2V0X2J1ZmZlcjsKLQotICAvLyBzYXZlIHRoZSByZXN0YXJ0IGluZm8uCi0gIHVuc2lnbmVkIHNob3J0IHJlc3RhcnRzX3RvX2dvOwotICB1bnNpZ25lZCBjaGFyIG5leHRfcmVzdGFydF9udW07Ci19IGh1ZmZtYW5fb2Zmc2V0X2RhdGE7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAvLyBUaGUgaGVhZGVyIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoaXMgc2NhbgotICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX29mZnNldDsKLQotICAvLyBOdW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGlzIHNjYW4KLSAgaW50IGNvbXBzX2luX3NjYW47Ci0KLSAgLy8gTnVtYmVyIG9mIE1DVXMgaW4gZWFjaCByb3cKLSAgaW50IE1DVXNfcGVyX3JvdzsKLSAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLQotICAvLyBUaGUgbGFzdCBNQ1UgcG9zaXRpb24gYW5kIGl0cyBkYyB2YWx1ZSBpbiB0aGlzIHNjYW4KLSAgaHVmZm1hbl9vZmZzZXRfZGF0YSBwcmV2X01DVV9vZmZzZXQ7Ci0KLSAgaHVmZm1hbl9vZmZzZXRfZGF0YSAqKm9mZnNldDsKLX0gaHVmZm1hbl9zY2FuX2hlYWRlcjsKLQotI2RlZmluZSBERUZBVUxUX01DVV9TQU1QTEVfU0laRSAxNgotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgLy8gVGhlIG51bWJlciBvZiBNQ1VzIHRoYXQgd2Ugc2FtcGxlIGVhY2ggdGltZSBhcyBhbiBpbmRleCBwb2ludAotICBpbnQgTUNVX3NhbXBsZV9zaXplOwotCi0gIC8vIE51bWJlciBvZiBzY2FuIGluIHRoaXMgaW1hZ2UKLSAgaW50IHNjYW5fY291bnQ7Ci0KLSAgLy8gTnVtYmVyIG9mIGlNQ1VzIHJvd3MgaW4gdGhpcyBpbWFnZQotICBpbnQgdG90YWxfaU1DVV9yb3dzOwotCi0gIC8vIE1lbW9yeSB1c2VkIGJ5IHNjYW4gc3RydWN0Ci0gIHNpemVfdCBtZW1fdXNlZDsKLSAgaHVmZm1hbl9zY2FuX2hlYWRlciAqc2NhbjsKLX0gaHVmZm1hbl9pbmRleDsKLQotLyogIk9iamVjdCIgZGVjbGFyYXRpb25zIGZvciBKUEVHIG1vZHVsZXMgdGhhdCBtYXkgYmUgc3VwcGxpZWQgb3IgY2FsbGVkCi0gKiBkaXJlY3RseSBieSB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCi0gKiBBcyB3aXRoIGFsbCBvYmplY3RzIGluIHRoZSBKUEVHIGxpYnJhcnksIHRoZXNlIHN0cnVjdHMgb25seSBkZWZpbmUgdGhlCi0gKiBwdWJsaWNseSB2aXNpYmxlIG1ldGhvZHMgYW5kIHN0YXRlIHZhcmlhYmxlcyBvZiBhIG1vZHVsZS4gIEFkZGl0aW9uYWwKLSAqIHByaXZhdGUgZmllbGRzIG1heSBleGlzdCBhZnRlciB0aGUgcHVibGljIG9uZXMuCi0gKi8KLQotCi0vKiBFcnJvciBoYW5kbGVyIG9iamVjdCAqLwotCi1zdHJ1Y3QganBlZ19lcnJvcl9tZ3IgewotICAvKiBFcnJvciBleGl0IGhhbmRsZXI6IGRvZXMgbm90IHJldHVybiB0byBjYWxsZXIgKi8KLSAgSk1FVEhPRCh2b2lkLCBlcnJvcl9leGl0LCAoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0gIC8qIENvbmRpdGlvbmFsbHkgZW1pdCBhIHRyYWNlIG9yIHdhcm5pbmcgbWVzc2FnZSAqLwotICBKTUVUSE9EKHZvaWQsIGVtaXRfbWVzc2FnZSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IG1zZ19sZXZlbCkpOwotICAvKiBSb3V0aW5lIHRoYXQgYWN0dWFsbHkgb3V0cHV0cyBhIHRyYWNlIG9yIGVycm9yIG1lc3NhZ2UgKi8KLSAgSk1FVEhPRCh2b2lkLCBvdXRwdXRfbWVzc2FnZSwgKGpfY29tbW9uX3B0ciBjaW5mbykpOwotICAvKiBGb3JtYXQgYSBtZXNzYWdlIHN0cmluZyBmb3IgdGhlIG1vc3QgcmVjZW50IEpQRUcgZXJyb3Igb3IgbWVzc2FnZSAqLwotICBKTUVUSE9EKHZvaWQsIGZvcm1hdF9tZXNzYWdlLCAoal9jb21tb25fcHRyIGNpbmZvLCBjaGFyICogYnVmZmVyKSk7Ci0jZGVmaW5lIEpNU0dfTEVOR1RIX01BWCAgMjAwCS8qIHJlY29tbWVuZGVkIHNpemUgb2YgZm9ybWF0X21lc3NhZ2UgYnVmZmVyICovCi0gIC8qIFJlc2V0IGVycm9yIHN0YXRlIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBhIG5ldyBpbWFnZSAqLwotICBKTUVUSE9EKHZvaWQsIHJlc2V0X2Vycm9yX21nciwgKGpfY29tbW9uX3B0ciBjaW5mbykpOwotCi0gIC8qIFRoZSBtZXNzYWdlIElEIGNvZGUgYW5kIGFueSBwYXJhbWV0ZXJzIGFyZSBzYXZlZCBoZXJlLgotICAgKiBBIG1lc3NhZ2UgY2FuIGhhdmUgb25lIHN0cmluZyBwYXJhbWV0ZXIgb3IgdXAgdG8gOCBpbnQgcGFyYW1ldGVycy4KLSAgICovCi0gIGludCBtc2dfY29kZTsKLSNkZWZpbmUgSk1TR19TVFJfUEFSTV9NQVggIDgwCi0gIHVuaW9uIHsKLSAgICBpbnQgaVs4XTsKLSAgICBjaGFyIHNbSk1TR19TVFJfUEFSTV9NQVhdOwotICB9IG1zZ19wYXJtOwotCi0gIC8qIFN0YW5kYXJkIHN0YXRlIHZhcmlhYmxlcyBmb3IgZXJyb3IgZmFjaWxpdHkgKi8KLQotICBpbnQgdHJhY2VfbGV2ZWw7CQkvKiBtYXggbXNnX2xldmVsIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgKi8KLQotICAvKiBGb3IgcmVjb3ZlcmFibGUgY29ycnVwdC1kYXRhIGVycm9ycywgd2UgZW1pdCBhIHdhcm5pbmcgbWVzc2FnZSwKLSAgICogYnV0IGtlZXAgZ29pbmcgdW5sZXNzIGVtaXRfbWVzc2FnZSBjaG9vc2VzIHRvIGFib3J0LiAgZW1pdF9tZXNzYWdlCi0gICAqIHNob3VsZCBjb3VudCB3YXJuaW5ncyBpbiBudW1fd2FybmluZ3MuICBUaGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24KLSAgICogY2FuIGNoZWNrIGZvciBiYWQgZGF0YSBieSBzZWVpbmcgaWYgbnVtX3dhcm5pbmdzIGlzIG5vbnplcm8gYXQgdGhlCi0gICAqIGVuZCBvZiBwcm9jZXNzaW5nLgotICAgKi8KLSAgbG9uZyBudW1fd2FybmluZ3M7CQkvKiBudW1iZXIgb2YgY29ycnVwdC1kYXRhIHdhcm5pbmdzICovCi0KLSAgLyogVGhlc2UgZmllbGRzIHBvaW50IHRvIHRoZSB0YWJsZShzKSBvZiBlcnJvciBtZXNzYWdlIHN0cmluZ3MuCi0gICAqIEFuIGFwcGxpY2F0aW9uIGNhbiBjaGFuZ2UgdGhlIHRhYmxlIHBvaW50ZXIgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50Ci0gICAqIG1lc3NhZ2UgbGlzdCAodHlwaWNhbGx5LCB0byBjaGFuZ2UgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGVycm9ycyBhcmUKLSAgICogcmVwb3J0ZWQpLiAgU29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gYWRkIGFkZGl0aW9uYWwgZXJyb3IgY29kZXMKLSAgICogdGhhdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIEpQRUcgbGlicmFyeSBlcnJvciBtZWNoYW5pc207IHRoZSBzZWNvbmQKLSAgICogdGFibGUgcG9pbnRlciBpcyB1c2VkIGZvciB0aGlzIHB1cnBvc2UuCi0gICAqCi0gICAqIEZpcnN0IHRhYmxlIGluY2x1ZGVzIGFsbCBlcnJvcnMgZ2VuZXJhdGVkIGJ5IEpQRUcgbGlicmFyeSBpdHNlbGYuCi0gICAqIEVycm9yIGNvZGUgMCBpcyByZXNlcnZlZCBmb3IgYSAibm8gc3VjaCBlcnJvciBzdHJpbmciIG1lc3NhZ2UuCi0gICAqLwotICBjb25zdCBjaGFyICogY29uc3QgKiBqcGVnX21lc3NhZ2VfdGFibGU7IC8qIExpYnJhcnkgZXJyb3JzICovCi0gIGludCBsYXN0X2pwZWdfbWVzc2FnZTsgICAgLyogVGFibGUgY29udGFpbnMgc3RyaW5ncyAwLi5sYXN0X2pwZWdfbWVzc2FnZSAqLwotICAvKiBTZWNvbmQgdGFibGUgY2FuIGJlIGFkZGVkIGJ5IGFwcGxpY2F0aW9uIChzZWUgY2pwZWcvZGpwZWcgZm9yIGV4YW1wbGUpLgotICAgKiBJdCBjb250YWlucyBzdHJpbmdzIG51bWJlcmVkIGZpcnN0X2FkZG9uX21lc3NhZ2UuLmxhc3RfYWRkb25fbWVzc2FnZS4KLSAgICovCi0gIGNvbnN0IGNoYXIgKiBjb25zdCAqIGFkZG9uX21lc3NhZ2VfdGFibGU7IC8qIE5vbi1saWJyYXJ5IGVycm9ycyAqLwotICBpbnQgZmlyc3RfYWRkb25fbWVzc2FnZTsJLyogY29kZSBmb3IgZmlyc3Qgc3RyaW5nIGluIGFkZG9uIHRhYmxlICovCi0gIGludCBsYXN0X2FkZG9uX21lc3NhZ2U7CS8qIGNvZGUgZm9yIGxhc3Qgc3RyaW5nIGluIGFkZG9uIHRhYmxlICovCi19OwotCi0KLS8qIFByb2dyZXNzIG1vbml0b3Igb2JqZWN0ICovCi0KLXN0cnVjdCBqcGVnX3Byb2dyZXNzX21nciB7Ci0gIEpNRVRIT0Qodm9pZCwgcHJvZ3Jlc3NfbW9uaXRvciwgKGpfY29tbW9uX3B0ciBjaW5mbykpOwotCi0gIGxvbmcgcGFzc19jb3VudGVyOwkJLyogd29yayB1bml0cyBjb21wbGV0ZWQgaW4gdGhpcyBwYXNzICovCi0gIGxvbmcgcGFzc19saW1pdDsJCS8qIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzIGluIHRoaXMgcGFzcyAqLwotICBpbnQgY29tcGxldGVkX3Bhc3NlczsJCS8qIHBhc3NlcyBjb21wbGV0ZWQgc28gZmFyICovCi0gIGludCB0b3RhbF9wYXNzZXM7CQkvKiB0b3RhbCBudW1iZXIgb2YgcGFzc2VzIGV4cGVjdGVkICovCi19OwotCi0KLS8qIERhdGEgZGVzdGluYXRpb24gb2JqZWN0IGZvciBjb21wcmVzc2lvbiAqLwotCi1zdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgewotICBKT0NURVQgKiBuZXh0X291dHB1dF9ieXRlOwkvKiA9PiBuZXh0IGJ5dGUgdG8gd3JpdGUgaW4gYnVmZmVyICovCi0gIHNpemVfdCBmcmVlX2luX2J1ZmZlcjsJLyogIyBvZiBieXRlIHNwYWNlcyByZW1haW5pbmcgaW4gYnVmZmVyICovCi0KLSAgSk1FVEhPRCh2b2lkLCBpbml0X2Rlc3RpbmF0aW9uLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChib29sZWFuLCBlbXB0eV9vdXRwdXRfYnVmZmVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCB0ZXJtX2Rlc3RpbmF0aW9uLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLX07Ci0KLQotLyogRGF0YSBzb3VyY2Ugb2JqZWN0IGZvciBkZWNvbXByZXNzaW9uICovCi0KLXN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgewotICBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGU7IC8qID0+IG5leHQgYnl0ZSB0byByZWFkIGZyb20gYnVmZmVyICovCi0gIGNvbnN0IEpPQ1RFVCAqIHN0YXJ0X2lucHV0X2J5dGU7IC8qID0+IGZpcnN0IGJ5dGUgdG8gcmVhZCBmcm9tIGlucHV0ICovCi0gIHNpemVfdCBieXRlc19pbl9idWZmZXI7CS8qICMgb2YgYnl0ZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLwotICBzaXplX3QgY3VycmVudF9vZmZzZXQ7IC8qIGN1cnJlbnQgcmVhZGVkIGlucHV0IG9mZnNldCAqLwotCi0gIEpNRVRIT0Qodm9pZCwgaW5pdF9zb3VyY2UsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgZmlsbF9pbnB1dF9idWZmZXIsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgc2tpcF9pbnB1dF9kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpKTsKLSAgSk1FVEhPRChib29sZWFuLCByZXN5bmNfdG9fcmVzdGFydCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBkZXNpcmVkKSk7Ci0gIEpNRVRIT0Qodm9pZCwgdGVybV9zb3VyY2UsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgc2Vla19pbnB1dF9kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBieXRlX29mZnNldCkpOwotfTsKLQotCi0vKiBNZW1vcnkgbWFuYWdlciBvYmplY3QuCi0gKiBBbGxvY2F0ZXMgInNtYWxsIiBvYmplY3RzIChhIGZldyBLIHRvdGFsKSwgImxhcmdlIiBvYmplY3RzICh0ZW5zIG9mIEspLAotICogYW5kICJyZWFsbHkgYmlnIiBvYmplY3RzICh2aXJ0dWFsIGFycmF5cyB3aXRoIGJhY2tpbmcgc3RvcmUgaWYgbmVlZGVkKS4KLSAqIFRoZSBtZW1vcnkgbWFuYWdlciBkb2VzIG5vdCBhbGxvdyBpbmRpdmlkdWFsIG9iamVjdHMgdG8gYmUgZnJlZWQ7IHJhdGhlciwKLSAqIGVhY2ggY3JlYXRlZCBvYmplY3QgaXMgYXNzaWduZWQgdG8gYSBwb29sLCBhbmQgd2hvbGUgcG9vbHMgY2FuIGJlIGZyZWVkCi0gKiBhdCBvbmNlLiAgVGhpcyBpcyBmYXN0ZXIgYW5kIG1vcmUgY29udmVuaWVudCB0aGFuIHJlbWVtYmVyaW5nIGV4YWN0bHkgd2hhdAotICogdG8gZnJlZSwgZXNwZWNpYWxseSB3aGVyZSBtYWxsb2MoKS9mcmVlKCkgYXJlIG5vdCB0b28gc3BlZWR5LgotICogTkI6IGFsbG9jIHJvdXRpbmVzIG5ldmVyIHJldHVybiBOVUxMLiAgVGhleSBleGl0IHRvIGVycm9yX2V4aXQgaWYgbm90Ci0gKiBzdWNjZXNzZnVsLgotICovCi0KLSNkZWZpbmUgSlBPT0xfUEVSTUFORU5UCTAJLyogbGFzdHMgdW50aWwgbWFzdGVyIHJlY29yZCBpcyBkZXN0cm95ZWQgKi8KLSNkZWZpbmUgSlBPT0xfSU1BR0UJMQkvKiBsYXN0cyB1bnRpbCBkb25lIHdpdGggaW1hZ2UvZGF0YXN0cmVhbSAqLwotI2RlZmluZSBKUE9PTF9OVU1QT09MUwkyCi0KLXR5cGVkZWYgc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sICoganZpcnRfc2FycmF5X3B0cjsKLXR5cGVkZWYgc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sICoganZpcnRfYmFycmF5X3B0cjsKLQotCi1zdHJ1Y3QganBlZ19tZW1vcnlfbWdyIHsKLSAgLyogTWV0aG9kIHBvaW50ZXJzICovCi0gIEpNRVRIT0Qodm9pZCAqLCBhbGxvY19zbWFsbCwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCi0JCQkJc2l6ZV90IHNpemVvZm9iamVjdCkpOwotICBKTUVUSE9EKHZvaWQgRkFSICosIGFsbG9jX2xhcmdlLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKLQkJCQkgICAgIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKLSAgSk1FVEhPRChKU0FNUEFSUkFZLCBhbGxvY19zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAotCQkJCSAgICAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93LAotCQkJCSAgICAgSkRJTUVOU0lPTiBudW1yb3dzKSk7Ci0gIEpNRVRIT0QoSkJMT0NLQVJSQVksIGFsbG9jX2JhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCi0JCQkJICAgICAgSkRJTUVOU0lPTiBibG9ja3NwZXJyb3csCi0JCQkJICAgICAgSkRJTUVOU0lPTiBudW1yb3dzKSk7Ci0gIEpNRVRIT0QoanZpcnRfc2FycmF5X3B0ciwgcmVxdWVzdF92aXJ0X3NhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywKLQkJCQkJCSAgaW50IHBvb2xfaWQsCi0JCQkJCQkgIGJvb2xlYW4gcHJlX3plcm8sCi0JCQkJCQkgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywKLQkJCQkJCSAgSkRJTUVOU0lPTiBudW1yb3dzLAotCQkJCQkJICBKRElNRU5TSU9OIG1heGFjY2VzcykpOwotICBKTUVUSE9EKGp2aXJ0X2JhcnJheV9wdHIsIHJlcXVlc3RfdmlydF9iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJCQkgIGludCBwb29sX2lkLAotCQkJCQkJICBib29sZWFuIHByZV96ZXJvLAotCQkJCQkJICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywKLQkJCQkJCSAgSkRJTUVOU0lPTiBudW1yb3dzLAotCQkJCQkJICBKRElNRU5TSU9OIG1heGFjY2VzcykpOwotICBKTUVUSE9EKHZvaWQsIHJlYWxpemVfdmlydF9hcnJheXMsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChKU0FNUEFSUkFZLCBhY2Nlc3NfdmlydF9zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJCSAgIGp2aXJ0X3NhcnJheV9wdHIgcHRyLAotCQkJCQkgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywKLQkJCQkJICAgSkRJTUVOU0lPTiBudW1fcm93cywKLQkJCQkJICAgYm9vbGVhbiB3cml0YWJsZSkpOwotICBKTUVUSE9EKEpCTE9DS0FSUkFZLCBhY2Nlc3NfdmlydF9iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJCSAgICBqdmlydF9iYXJyYXlfcHRyIHB0ciwKLQkJCQkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LAotCQkJCQkgICAgSkRJTUVOU0lPTiBudW1fcm93cywKLQkJCQkJICAgIGJvb2xlYW4gd3JpdGFibGUpKTsKLSAgSk1FVEhPRCh2b2lkLCBmcmVlX3Bvb2wsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkKSk7Ci0gIEpNRVRIT0Qodm9pZCwgc2VsZl9kZXN0cnVjdCwgKGpfY29tbW9uX3B0ciBjaW5mbykpOwotCi0gIC8qIExpbWl0IG9uIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGlzIEpQRUcgb2JqZWN0LiAgKE5vdGUgdGhhdCB0aGlzIGlzCi0gICAqIG1lcmVseSBhZHZpc29yeSwgbm90IGEgZ3VhcmFudGVlZCBtYXhpbXVtOyBpdCBvbmx5IGFmZmVjdHMgdGhlIHNwYWNlCi0gICAqIHVzZWQgZm9yIHZpcnR1YWwtYXJyYXkgYnVmZmVycy4pICBNYXkgYmUgY2hhbmdlZCBieSBvdXRlciBhcHBsaWNhdGlvbgotICAgKiBhZnRlciBjcmVhdGluZyB0aGUgSlBFRyBvYmplY3QuCi0gICAqLwotICBsb25nIG1heF9tZW1vcnlfdG9fdXNlOwotCi0gIC8qIE1heGltdW0gYWxsb2NhdGlvbiByZXF1ZXN0IGFjY2VwdGVkIGJ5IGFsbG9jX2xhcmdlLiAqLwotICBsb25nIG1heF9hbGxvY19jaHVuazsKLX07Ci0KLQotLyogUm91dGluZSBzaWduYXR1cmUgZm9yIGFwcGxpY2F0aW9uLXN1cHBsaWVkIG1hcmtlciBwcm9jZXNzaW5nIG1ldGhvZHMuCi0gKiBOZWVkIG5vdCBwYXNzIG1hcmtlciBjb2RlIHNpbmNlIGl0IGlzIHN0b3JlZCBpbiBjaW5mby0+dW5yZWFkX21hcmtlci4KLSAqLwotdHlwZWRlZiBKTUVUSE9EKGJvb2xlYW4sIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLQotLyogRGVjbGFyYXRpb25zIGZvciByb3V0aW5lcyBjYWxsZWQgYnkgYXBwbGljYXRpb24uCi0gKiBUaGUgSlBQIG1hY3JvIGhpZGVzIHByb3RvdHlwZSBwYXJhbWV0ZXJzIGZyb20gY29tcGlsZXJzIHRoYXQgY2FuJ3QgY29wZS4KLSAqIE5vdGUgSlBQIHJlcXVpcmVzIGRvdWJsZSBwYXJlbnRoZXNlcy4KLSAqLwotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEpQUChhcmdsaXN0KQlhcmdsaXN0Ci0jZWxzZQotI2RlZmluZSBKUFAoYXJnbGlzdCkJKCkKLSNlbmRpZgotCi0KLS8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLgotICogV2Ugc2hvcnRlbiBleHRlcm5hbCBuYW1lcyB0byBiZSB1bmlxdWUgaW4gdGhlIGZpcnN0IHNpeCBsZXR0ZXJzLCB3aGljaAotICogaXMgZ29vZCBlbm91Z2ggZm9yIGFsbCBrbm93biBzeXN0ZW1zLgotICogKElmIHlvdXIgY29tcGlsZXIgaXRzZWxmIG5lZWRzIG5hbWVzIHRvIGJlIHVuaXF1ZSBpbiBsZXNzIHRoYW4gMTUKLSAqIGNoYXJhY3RlcnMsIHlvdSBhcmUgb3V0IG9mIGx1Y2suICBHZXQgYSBiZXR0ZXIgY29tcGlsZXIuKQotICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGpwZWdfc3RkX2Vycm9yCQlqU3RkRXJyb3IKLSNkZWZpbmUganBlZ19DcmVhdGVDb21wcmVzcwlqQ3JlYUNvbXByZXNzCi0jZGVmaW5lIGpwZWdfQ3JlYXRlRGVjb21wcmVzcwlqQ3JlYURlY29tcHJlc3MKLSNkZWZpbmUganBlZ19kZXN0cm95X2NvbXByZXNzCWpEZXN0Q29tcHJlc3MKLSNkZWZpbmUganBlZ19kZXN0cm95X2RlY29tcHJlc3MJakRlc3REZWNvbXByZXNzCi0jZGVmaW5lIGpwZWdfc3RkaW9fZGVzdAkJalN0ZERlc3QKLSNkZWZpbmUganBlZ19zdGRpb19zcmMJCWpTdGRTcmMKLSNkZWZpbmUganBlZ19zZXRfZGVmYXVsdHMJalNldERlZmF1bHRzCi0jZGVmaW5lIGpwZWdfc2V0X2NvbG9yc3BhY2UJalNldENvbG9yc3BhY2UKLSNkZWZpbmUganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UJakRlZkNvbG9yc3BhY2UKLSNkZWZpbmUganBlZ19zZXRfcXVhbGl0eQlqU2V0UXVhbGl0eQotI2RlZmluZSBqcGVnX3NldF9saW5lYXJfcXVhbGl0eQlqU2V0TFF1YWxpdHkKLSNkZWZpbmUganBlZ19hZGRfcXVhbnRfdGFibGUJakFkZFF1YW50VGFibGUKLSNkZWZpbmUganBlZ19xdWFsaXR5X3NjYWxpbmcJalF1YWxpdHlTY2FsaW5nCi0jZGVmaW5lIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uCWpTaW1Qcm9ncmVzcwotI2RlZmluZSBqcGVnX3N1cHByZXNzX3RhYmxlcwlqU3VwcHJlc3NUYWJsZXMKLSNkZWZpbmUganBlZ19hbGxvY19xdWFudF90YWJsZQlqQWxjUVRhYmxlCi0jZGVmaW5lIGpwZWdfYWxsb2NfaHVmZl90YWJsZQlqQWxjSFRhYmxlCi0jZGVmaW5lIGpwZWdfc3RhcnRfY29tcHJlc3MJalN0cnRDb21wcmVzcwotI2RlZmluZSBqcGVnX3dyaXRlX3NjYW5saW5lcwlqV3J0U2NhbmxpbmVzCi0jZGVmaW5lIGpwZWdfZmluaXNoX2NvbXByZXNzCWpGaW5Db21wcmVzcwotI2RlZmluZSBqcGVnX3dyaXRlX3Jhd19kYXRhCWpXcnRSYXdEYXRhCi0jZGVmaW5lIGpwZWdfd3JpdGVfbWFya2VyCWpXcnRNYXJrZXIKLSNkZWZpbmUganBlZ193cml0ZV9tX2hlYWRlcglqV3J0TUhlYWRlcgotI2RlZmluZSBqcGVnX3dyaXRlX21fYnl0ZQlqV3J0TUJ5dGUKLSNkZWZpbmUganBlZ193cml0ZV90YWJsZXMJaldydFRhYmxlcwotI2RlZmluZSBqcGVnX3JlYWRfaGVhZGVyCWpSZWFkSGVhZGVyCi0jZGVmaW5lIGpwZWdfc3RhcnRfZGVjb21wcmVzcwlqU3RydERlY29tcHJlc3MKLSNkZWZpbmUganBlZ19yZWFkX3NjYW5saW5lcwlqUmVhZFNjYW5saW5lcwotI2RlZmluZSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzCWpGaW5EZWNvbXByZXNzCi0jZGVmaW5lIGpwZWdfcmVhZF9yYXdfZGF0YQlqUmVhZFJhd0RhdGEKLSNkZWZpbmUganBlZ19oYXNfbXVsdGlwbGVfc2NhbnMJakhhc011bHRTY24KLSNkZWZpbmUganBlZ19zdGFydF9vdXRwdXQJalN0cnRPdXRwdXQKLSNkZWZpbmUganBlZ19maW5pc2hfb3V0cHV0CWpGaW5PdXRwdXQKLSNkZWZpbmUganBlZ19pbnB1dF9jb21wbGV0ZQlqSW5Db21wbGV0ZQotI2RlZmluZSBqcGVnX25ld19jb2xvcm1hcAlqTmV3Q01hcAotI2RlZmluZSBqcGVnX2NvbnN1bWVfaW5wdXQJakNvbnN1bWVJbnB1dAotI2RlZmluZSBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMJakNhbGNEaW1lbnNpb25zCi0jZGVmaW5lIGpwZWdfc2F2ZV9tYXJrZXJzCWpTYXZlTWFya2VycwotI2RlZmluZSBqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yCWpTZXRNYXJrZXIKLSNkZWZpbmUganBlZ19yZWFkX2NvZWZmaWNpZW50cwlqUmVhZENvZWZzCi0jZGVmaW5lIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzCWpXcnRDb2VmcwotI2RlZmluZSBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycwlqQ29weUNyaXQKLSNkZWZpbmUganBlZ19hYm9ydF9jb21wcmVzcwlqQWJydENvbXByZXNzCi0jZGVmaW5lIGpwZWdfYWJvcnRfZGVjb21wcmVzcwlqQWJydERlY29tcHJlc3MKLSNkZWZpbmUganBlZ19hYm9ydAkJakFib3J0Ci0jZGVmaW5lIGpwZWdfZGVzdHJveQkJakRlc3Ryb3kKLSNkZWZpbmUganBlZ19yZXN5bmNfdG9fcmVzdGFydAlqUmVzeW5jUmVzdGFydAotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotCi0vKiBEZWZhdWx0IGVycm9yLW1hbmFnZW1lbnQgc2V0dXAgKi8KLUVYVEVSTihzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKikganBlZ19zdGRfZXJyb3IKLQlKUFAoKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycikpOwotCi0vKiBJbml0aWFsaXphdGlvbiBvZiBKUEVHIGNvbXByZXNzaW9uIG9iamVjdHMuCi0gKiBqcGVnX2NyZWF0ZV9jb21wcmVzcygpIGFuZCBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCkgYXJlIHRoZSBleHBvcnRlZAotICogbmFtZXMgdGhhdCBhcHBsaWNhdGlvbnMgc2hvdWxkIGNhbGwuICBUaGVzZSBleHBhbmQgdG8gY2FsbHMgb24KLSAqIGpwZWdfQ3JlYXRlQ29tcHJlc3MgYW5kIGpwZWdfQ3JlYXRlRGVjb21wcmVzcyB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHBhc3NlZCBmb3IgdmVyc2lvbiBtaXNtYXRjaCBjaGVja2luZy4KLSAqIE5COiB5b3UgbXVzdCBzZXQgdXAgdGhlIGVycm9yLW1hbmFnZXIgQkVGT1JFIGNhbGxpbmcganBlZ19jcmVhdGVfeHh4LgotICovCi0jZGVmaW5lIGpwZWdfY3JlYXRlX2NvbXByZXNzKGNpbmZvKSBcCi0gICAganBlZ19DcmVhdGVDb21wcmVzcygoY2luZm8pLCBKUEVHX0xJQl9WRVJTSU9OLCBcCi0JCQkoc2l6ZV90KSBzaXplb2Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSkKLSNkZWZpbmUganBlZ19jcmVhdGVfZGVjb21wcmVzcyhjaW5mbykgXAotICAgIGpwZWdfQ3JlYXRlRGVjb21wcmVzcygoY2luZm8pLCBKUEVHX0xJQl9WRVJTSU9OLCBcCi0JCQkgIChzaXplX3QpIHNpemVvZihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCkpCi1FWFRFUk4odm9pZCkganBlZ19DcmVhdGVDb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgIGludCB2ZXJzaW9uLCBzaXplX3Qgc3RydWN0c2l6ZSkpOwotRVhURVJOKHZvaWQpIGpwZWdfQ3JlYXRlRGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCWludCB2ZXJzaW9uLCBzaXplX3Qgc3RydWN0c2l6ZSkpOwotLyogRGVzdHJ1Y3Rpb24gb2YgSlBFRyBjb21wcmVzc2lvbiBvYmplY3RzICovCi1FWFRFUk4odm9pZCkganBlZ19kZXN0cm95X2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogU3RhbmRhcmQgZGF0YSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzOiBzdGRpbyBzdHJlYW1zLiAqLwotLyogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBvcGVuaW5nIHRoZSBmaWxlIGJlZm9yZSBhbmQgY2xvc2luZyBhZnRlci4gKi8KLUVYVEVSTih2b2lkKSBqcGVnX3N0ZGlvX2Rlc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIG91dGZpbGUpKTsKLUVYVEVSTih2b2lkKSBqcGVnX3N0ZGlvX3NyYyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpKTsKLQotLyogRGVmYXVsdCBwYXJhbWV0ZXIgc2V0dXAgZm9yIGNvbXByZXNzaW9uICovCi1FWFRFUk4odm9pZCkganBlZ19zZXRfZGVmYXVsdHMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotLyogQ29tcHJlc3Npb24gcGFyYW1ldGVyIHNldHVwIGFpZHMgKi8KLUVYVEVSTih2b2lkKSBqcGVnX3NldF9jb2xvcnNwYWNlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgICAgSl9DT0xPUl9TUEFDRSBjb2xvcnNwYWNlKSk7Ci1FWFRFUk4odm9pZCkganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfc2V0X3F1YWxpdHkgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHF1YWxpdHksCi0JCQkJICAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOwotRVhURVJOKHZvaWQpIGpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgaW50IHNjYWxlX2ZhY3RvciwKLQkJCQkJICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7Ci1FWFRFUk4odm9pZCkganBlZ19hZGRfcXVhbnRfdGFibGUgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHdoaWNoX3RibCwKLQkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpiYXNpY190YWJsZSwKLQkJCQkgICAgICAgaW50IHNjYWxlX2ZhY3RvciwKLQkJCQkgICAgICAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOwotRVhURVJOKGludCkganBlZ19xdWFsaXR5X3NjYWxpbmcgSlBQKChpbnQgcXVhbGl0eSkpOwotRVhURVJOKHZvaWQpIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX3N1cHByZXNzX3RhYmxlcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgICBib29sZWFuIHN1cHByZXNzKSk7Ci1FWFRFUk4oSlFVQU5UX1RCTCAqKSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7Ci1FWFRFUk4oSkhVRkZfVEJMICopIGpwZWdfYWxsb2NfaHVmZl90YWJsZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotCi0vKiBNYWluIGVudHJ5IHBvaW50cyBmb3IgY29tcHJlc3Npb24gKi8KLUVYVEVSTih2b2lkKSBqcGVnX3N0YXJ0X2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgICAgYm9vbGVhbiB3cml0ZV9hbGxfdGFibGVzKSk7Ci1FWFRFUk4oSkRJTUVOU0lPTikganBlZ193cml0ZV9zY2FubGluZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgICBKU0FNUEFSUkFZIHNjYW5saW5lcywKLQkJCQkJICAgICBKRElNRU5TSU9OIG51bV9saW5lcykpOwotRVhURVJOKHZvaWQpIGpwZWdfZmluaXNoX2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogUmVwbGFjZXMganBlZ193cml0ZV9zY2FubGluZXMgd2hlbiB3cml0aW5nIHJhdyBkb3duc2FtcGxlZCBkYXRhLiAqLwotRVhURVJOKEpESU1FTlNJT04pIGpwZWdfd3JpdGVfcmF3X2RhdGEgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIEpTQU1QSU1BR0UgZGF0YSwKLQkJCQkJICAgIEpESU1FTlNJT04gbnVtX2xpbmVzKSk7Ci0KLS8qIFdyaXRlIGEgc3BlY2lhbCBtYXJrZXIuICBTZWUgbGlianBlZy5kb2MgY29uY2VybmluZyBzYWZlIHVzYWdlLiAqLwotRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfbWFya2VyCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwKLQkgICAgIGNvbnN0IEpPQ1RFVCAqIGRhdGFwdHIsIHVuc2lnbmVkIGludCBkYXRhbGVuKSk7Ci0vKiBTYW1lLCBidXQgcGllY2VtZWFsLiAqLwotRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfbV9oZWFkZXIKLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikpOwotRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfbV9ieXRlCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkpOwotCi0vKiBBbHRlcm5hdGUgY29tcHJlc3Npb24gZnVuY3Rpb246IGp1c3Qgd3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUgZmlsZSAqLwotRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogRGVjb21wcmVzc2lvbiBzdGFydHVwOiByZWFkIHN0YXJ0IG9mIEpQRUcgZGF0YXN0cmVhbSB0byBzZWUgd2hhdCdzIHRoZXJlICovCi1FWFRFUk4oaW50KSBqcGVnX3JlYWRfaGVhZGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgIGJvb2xlYW4gcmVxdWlyZV9pbWFnZSkpOwotLyogUmV0dXJuIHZhbHVlIGlzIG9uZSBvZjogKi8KLSNkZWZpbmUgSlBFR19TVVNQRU5ERUQJCTAgLyogU3VzcGVuZGVkIGR1ZSB0byBsYWNrIG9mIGlucHV0IGRhdGEgKi8KLSNkZWZpbmUgSlBFR19IRUFERVJfT0sJCTEgLyogRm91bmQgdmFsaWQgaW1hZ2UgZGF0YXN0cmVhbSAqLwotI2RlZmluZSBKUEVHX0hFQURFUl9UQUJMRVNfT05MWQkyIC8qIEZvdW5kIHZhbGlkIHRhYmxlLXNwZWNzLW9ubHkgZGF0YXN0cmVhbSAqLwotLyogSWYgeW91IHBhc3MgcmVxdWlyZV9pbWFnZSA9IFRSVUUgKG5vcm1hbCBjYXNlKSwgeW91IG5lZWQgbm90IGNoZWNrIGZvcgotICogYSBUQUJMRVNfT05MWSByZXR1cm4gY29kZTsgYW4gYWJicmV2aWF0ZWQgZmlsZSB3aWxsIGNhdXNlIGFuIGVycm9yIGV4aXQuCi0gKiBKUEVHX1NVU1BFTkRFRCBpcyBvbmx5IHBvc3NpYmxlIGlmIHlvdSB1c2UgYSBkYXRhIHNvdXJjZSBtb2R1bGUgdGhhdCBjYW4KLSAqIGdpdmUgYSBzdXNwZW5zaW9uIHJldHVybiAodGhlIHN0ZGlvIHNvdXJjZSBtb2R1bGUgZG9lc24ndCkuCi0gKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludHMgZm9yIGRlY29tcHJlc3Npb24gKi8KLUVYVEVSTihib29sZWFuKSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oYm9vbGVhbikganBlZ19zdGFydF90aWxlX2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oSkRJTUVOU0lPTikganBlZ19yZWFkX3NjYW5saW5lcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKU0FNUEFSUkFZIHNjYW5saW5lcywKLQkJCQkJICAgIEpESU1FTlNJT04gbWF4X2xpbmVzKSk7Ci1FWFRFUk4oSkRJTUVOU0lPTikganBlZ19yZWFkX3NjYW5saW5lc19mcm9tIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAotCQkJCQkgICAgaW50IGxpbmVfb2Zmc2V0LAotCQkJCQkgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpKTsKLUVYVEVSTihKRElNRU5TSU9OKSBqcGVnX3JlYWRfdGlsZV9zY2FubGluZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgc2NhbmxpbmVzKSk7Ci1FWFRFUk4odm9pZCkganBlZ19pbml0X3JlYWRfdGlsZV9zY2FubGluZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwKLQkJICAgICAgICAgICAgICAgIGludCAqc3RhcnRfeCwgaW50ICpzdGFydF95LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpKTsKLUVYVEVSTihib29sZWFuKSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0vKiBSZXBsYWNlcyBqcGVnX3JlYWRfc2NhbmxpbmVzIHdoZW4gcmVhZGluZyByYXcgZG93bnNhbXBsZWQgZGF0YS4gKi8KLUVYVEVSTihKRElNRU5TSU9OKSBqcGVnX3JlYWRfcmF3X2RhdGEgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICBKU0FNUElNQUdFIGRhdGEsCi0JCQkJCSAgIEpESU1FTlNJT04gbWF4X2xpbmVzKSk7Ci0KLS8qIEFkZGl0aW9uYWwgZW50cnkgcG9pbnRzIGZvciBidWZmZXJlZC1pbWFnZSBtb2RlLiAqLwotRVhURVJOKGJvb2xlYW4pIGpwZWdfaGFzX211bHRpcGxlX3NjYW5zIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGJvb2xlYW4pIGpwZWdfc3RhcnRfb3V0cHV0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICAgICAgaW50IHNjYW5fbnVtYmVyKSk7Ci1FWFRFUk4oYm9vbGVhbikganBlZ19maW5pc2hfb3V0cHV0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGJvb2xlYW4pIGpwZWdfaW5wdXRfY29tcGxldGUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ19uZXdfY29sb3JtYXAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oaW50KSBqcGVnX2NvbnN1bWVfaW5wdXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0vKiBSZXR1cm4gdmFsdWUgaXMgb25lIG9mOiAqLwotLyogI2RlZmluZSBKUEVHX1NVU1BFTkRFRAkwICAgIFN1c3BlbmRlZCBkdWUgdG8gbGFjayBvZiBpbnB1dCBkYXRhICovCi0jZGVmaW5lIEpQRUdfUkVBQ0hFRF9TT1MJMSAvKiBSZWFjaGVkIHN0YXJ0IG9mIG5ldyBzY2FuICovCi0jZGVmaW5lIEpQRUdfUkVBQ0hFRF9FT0kJMiAvKiBSZWFjaGVkIGVuZCBvZiBpbWFnZSAqLwotI2RlZmluZSBKUEVHX1JPV19DT01QTEVURUQJMyAvKiBDb21wbGV0ZWQgb25lIGlNQ1Ugcm93ICovCi0jZGVmaW5lIEpQRUdfU0NBTl9DT01QTEVURUQJNCAvKiBDb21wbGV0ZWQgbGFzdCBpTUNVIHJvdyBvZiBhIHNjYW4gKi8KLQotLyogUHJlY2FsY3VsYXRlIG91dHB1dCBkaW1lbnNpb25zIGZvciBjdXJyZW50IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4gKi8KLUVYVEVSTih2b2lkKSBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLS8qIENvbnRyb2wgc2F2aW5nIG9mIENPTSBhbmQgQVBQbiBtYXJrZXJzIGludG8gbWFya2VyX2xpc3QuICovCi1FWFRFUk4odm9pZCkganBlZ19zYXZlX21hcmtlcnMKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKLQkgICAgIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXQpKTsKLQotLyogSW5zdGFsbCBhIHNwZWNpYWwgcHJvY2Vzc2luZyBtZXRob2QgZm9yIENPTSBvciBBUFBuIG1hcmtlcnMuICovCi1FWFRFUk4odm9pZCkganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcgotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAotCSAgICAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCByb3V0aW5lKSk7Ci0KLS8qIFJlYWQgb3Igd3JpdGUgcmF3IERDVCBjb2VmZmljaWVudHMgLS0tIHVzZWZ1bCBmb3IgbG9zc2xlc3MgdHJhbnNjb2RpbmcuICovCi1FWFRFUk4oanZpcnRfYmFycmF5X3B0ciAqKSBqcGVnX3JlYWRfY29lZmZpY2llbnRzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGJvb2xlYW4pIGpwZWdfYnVpbGRfaHVmZm1hbl9pbmRleAotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9pbmRleCAqaW5kZXgpKTsKLUVYVEVSTih2b2lkKSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykpOwotRVhURVJOKHZvaWQpIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLAotCQkJCQkJal9jb21wcmVzc19wdHIgZHN0aW5mbykpOwotCi0vKiBJZiB5b3UgY2hvb3NlIHRvIGFib3J0IGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gYmVmb3JlIGNvbXBsZXRpbmcKLSAqIGpwZWdfZmluaXNoXyhkZSljb21wcmVzcywgdGhlbiB5b3UgbmVlZCB0byBjbGVhbiB1cCB0byByZWxlYXNlIG1lbW9yeSwKLSAqIHRlbXBvcmFyeSBmaWxlcywgZXRjLiAgWW91IGNhbiBqdXN0IGNhbGwganBlZ19kZXN0cm95XyhkZSljb21wcmVzcwotICogaWYgeW91J3JlIGRvbmUgd2l0aCB0aGUgSlBFRyBvYmplY3QsIGJ1dCBpZiB5b3Ugd2FudCB0byBjbGVhbiBpdCB1cCBhbmQKLSAqIHJldXNlIGl0LCBjYWxsIHRoaXM6Ci0gKi8KLUVYVEVSTih2b2lkKSBqcGVnX2Fib3J0X2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX2Fib3J0X2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLS8qIEdlbmVyaWMgdmVyc2lvbnMgb2YganBlZ19hYm9ydCBhbmQganBlZ19kZXN0cm95IHRoYXQgd29yayBvbiBlaXRoZXIKLSAqIGZsYXZvciBvZiBKUEVHIG9iamVjdC4gIFRoZXNlIG1heSBiZSBtb3JlIGNvbnZlbmllbnQgaW4gc29tZSBwbGFjZXMuCi0gKi8KLUVYVEVSTih2b2lkKSBqcGVnX2Fib3J0IEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ19kZXN0cm95IEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0KLS8qIERlZmF1bHQgcmVzdGFydC1tYXJrZXItcmVzeW5jIHByb2NlZHVyZSBmb3IgdXNlIGJ5IGRhdGEgc291cmNlIG1vZHVsZXMgKi8KLUVYVEVSTihib29sZWFuKSBqcGVnX3Jlc3luY190b19yZXN0YXJ0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIGludCBkZXNpcmVkKSk7Ci0KLUVYVEVSTih2b2lkKSBqcGVnX2NvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgb2Zmc2V0KTsKLUVYVEVSTih2b2lkKSBqcGVnX2dldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9vZmZzZXRfZGF0YSAqb2Zmc2V0KTsKLUVYVEVSTih2b2lkKSBqcGVnX2NyZWF0ZV9odWZmbWFuX2luZGV4KGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCk7Ci1FWFRFUk4odm9pZCkganBlZ19jb25maWd1cmVfaHVmZm1hbl9pbmRleF9zY2FuKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IHNjYW5fbm8sIGludCBvZmZzZXQpOwotRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveV9odWZmbWFuX2luZGV4KGh1ZmZtYW5faW5kZXggKmluZGV4KTsKLQotCi0vKiBUaGVzZSBtYXJrZXIgY29kZXMgYXJlIGV4cG9ydGVkIHNpbmNlIGFwcGxpY2F0aW9ucyBhbmQgZGF0YSBzb3VyY2UgbW9kdWxlcwotICogYXJlIGxpa2VseSB0byB3YW50IHRvIHVzZSB0aGVtLgotICovCi0KLSNkZWZpbmUgSlBFR19SU1QwCTB4RDAJLyogUlNUMCBtYXJrZXIgY29kZSAqLwotI2RlZmluZSBKUEVHX0VPSQkweEQ5CS8qIEVPSSBtYXJrZXIgY29kZSAqLwotI2RlZmluZSBKUEVHX0FQUDAJMHhFMAkvKiBBUFAwIG1hcmtlciBjb2RlICovCi0jZGVmaW5lIEpQRUdfQ09NCTB4RkUJLyogQ09NIG1hcmtlciBjb2RlICovCi0KLQotLyogSWYgd2UgaGF2ZSBhIGJyYWluLWRhbWFnZWQgY29tcGlsZXIgdGhhdCBlbWl0cyB3YXJuaW5ncyAob3Igd29yc2UsIGVycm9ycykKLSAqIGZvciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgbmV2ZXIgZmlsbGVkIGluLCBrZWVwIGl0IHF1aWV0IGJ5Ci0gKiBzdXBwbHlpbmcgZHVtbXkgZGVmaW5pdGlvbnMgZm9yIHRoZSB2YXJpb3VzIHN1YnN0cnVjdHVyZXMuCi0gKi8KLQotI2lmZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0jaWZuZGVmIEpQRUdfSU5URVJOQUxTCQkvKiB3aWxsIGJlIGRlZmluZWQgaW4ganBlZ2ludC5oICovCi1zdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0IHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfdXBzYW1wbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciB7IGxvbmcgZHVtbXk7IH07Ci0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLSNlbmRpZiAvKiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTiAqLwotCi0KLS8qCi0gKiBUaGUgSlBFRyBsaWJyYXJ5IG1vZHVsZXMgZGVmaW5lIEpQRUdfSU5URVJOQUxTIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlLgotICogVGhlIGludGVybmFsIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMgYXJlIHJlYWQgb25seSB3aGVuIHRoYXQgaXMgdHJ1ZS4KLSAqIEFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBzaG91bGQgbm90IGluY2x1ZGUganBlZ2ludC5oLCBidXQgbWF5IHdpc2gKLSAqIHRvIGluY2x1ZGUgamVycm9yLmguCi0gKi8KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAianBlZ2ludC5oIgkJLyogZmV0Y2ggcHJpdmF0ZSBkZWNsYXJhdGlvbnMgKi8KLSNpbmNsdWRlICJqZXJyb3IuaCIJCS8qIGZldGNoIGVycm9yIGNvZGVzIHRvbyAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBKUEVHTElCX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pwZWd0cmFuLjEgYi9saWJqcGVndHdycC9qcGVndHJhbi4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGUxOGUyLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pwZWd0cmFuLjEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLlRIIEpQRUdUUkFOIDEgIjMgQXVndXN0IDE5OTciCi0uU0ggTkFNRQotanBlZ3RyYW4gXC0gbG9zc2xlc3MgdHJhbnNmb3JtYXRpb24gb2YgSlBFRyBmaWxlcwotLlNIIFNZTk9QU0lTCi0uQiBqcGVndHJhbgotWwotLkkgb3B0aW9ucwotXQotWwotLkkgZmlsZW5hbWUKLV0KLS5MUAotLlNIIERFU0NSSVBUSU9OCi0uTFAKLS5CIGpwZWd0cmFuCi1wZXJmb3JtcyB2YXJpb3VzIHVzZWZ1bCB0cmFuc2Zvcm1hdGlvbnMgb2YgSlBFRyBmaWxlcy4KLUl0IGNhbiB0cmFuc2xhdGUgdGhlIGNvZGVkIHJlcHJlc2VudGF0aW9uIGZyb20gb25lIHZhcmlhbnQgb2YgSlBFRyB0byBhbm90aGVyLAotZm9yIGV4YW1wbGUgZnJvbSBiYXNlbGluZSBKUEVHIHRvIHByb2dyZXNzaXZlIEpQRUcgb3IgdmljZSB2ZXJzYS4gIEl0IGNhbiBhbHNvCi1wZXJmb3JtIHNvbWUgcmVhcnJhbmdlbWVudHMgb2YgdGhlIGltYWdlIGRhdGEsIGZvciBleGFtcGxlIHR1cm5pbmcgYW4gaW1hZ2UKLWZyb20gbGFuZHNjYXBlIHRvIHBvcnRyYWl0IGZvcm1hdCBieSByb3RhdGlvbi4KLS5QUAotLkIganBlZ3RyYW4KLXdvcmtzIGJ5IHJlYXJyYW5naW5nIHRoZSBjb21wcmVzc2VkIGRhdGEgKERDVCBjb2VmZmljaWVudHMpLCB3aXRob3V0Ci1ldmVyIGZ1bGx5IGRlY29kaW5nIHRoZSBpbWFnZS4gIFRoZXJlZm9yZSwgaXRzIHRyYW5zZm9ybWF0aW9ucyBhcmUgbG9zc2xlc3M6Ci10aGVyZSBpcyBubyBpbWFnZSBkZWdyYWRhdGlvbiBhdCBhbGwsIHdoaWNoIHdvdWxkIG5vdCBiZSB0cnVlIGlmIHlvdSB1c2VkCi0uQiBkanBlZwotZm9sbG93ZWQgYnkKLS5CIGNqcGVnCi10byBhY2NvbXBsaXNoIHRoZSBzYW1lIGNvbnZlcnNpb24uICBCdXQgYnkgdGhlIHNhbWUgdG9rZW4sCi0uQiBqcGVndHJhbgotY2Fubm90IHBlcmZvcm0gbG9zc3kgb3BlcmF0aW9ucyBzdWNoIGFzIGNoYW5naW5nIHRoZSBpbWFnZSBxdWFsaXR5LgotLlBQCi0uQiBqcGVndHJhbgotcmVhZHMgdGhlIG5hbWVkIEpQRUcvSkZJRiBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcwotbmFtZWQsIGFuZCBwcm9kdWNlcyBhIEpQRUcvSkZJRiBmaWxlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCi0uU0ggT1BUSU9OUwotQWxsIHN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQ7IGZvciBleGFtcGxlLAotLkIgXC1vcHRpbWl6ZQotbWF5IGJlIHdyaXR0ZW4KLS5CIFwtb3B0Ci1vcgotLkJSIFwtbyAuCi1VcHBlciBhbmQgbG93ZXIgY2FzZSBhcmUgZXF1aXZhbGVudC4KLUJyaXRpc2ggc3BlbGxpbmdzIGFyZSBhbHNvIGFjY2VwdGVkIChlLmcuLAotLkJSIFwtb3B0aW1pc2UgKSwKLXRob3VnaCBmb3IgYnJldml0eSB0aGVzZSBhcmUgbm90IG1lbnRpb25lZCBiZWxvdy4KLS5QUAotVG8gc3BlY2lmeSB0aGUgY29kZWQgSlBFRyByZXByZXNlbnRhdGlvbiB1c2VkIGluIHRoZSBvdXRwdXQgZmlsZSwKLS5CIGpwZWd0cmFuCi1hY2NlcHRzIGEgc3Vic2V0IG9mIHRoZSBzd2l0Y2hlcyByZWNvZ25pemVkIGJ5Ci0uQlIgY2pwZWcgOgotLlRQCi0uQiBcLW9wdGltaXplCi1QZXJmb3JtIG9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGVuY29kaW5nIHBhcmFtZXRlcnMuCi0uVFAKLS5CIFwtcHJvZ3Jlc3NpdmUKLUNyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUuCi0uVFAKLS5CSSBcLXJlc3RhcnQgIiBOIgotRW1pdCBhIEpQRUcgcmVzdGFydCBtYXJrZXIgZXZlcnkgTiBNQ1Ugcm93cywgb3IgZXZlcnkgTiBNQ1UgYmxvY2tzIGlmICJCIiBpcwotYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KLS5UUAotLkJJIFwtc2NhbnMgIiBmaWxlIgotVXNlIHRoZSBzY2FuIHNjcmlwdCBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KLS5QUAotU2VlCi0uQlIgY2pwZWcgKDEpCi1mb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZXNlIHN3aXRjaGVzLgotSWYgeW91IHNwZWNpZnkgbm9uZSBvZiB0aGVzZSBzd2l0Y2hlcywgeW91IGdldCBhIHBsYWluIGJhc2VsaW5lLUpQRUcgb3V0cHV0Ci1maWxlLiAgVGhlIHF1YWxpdHkgc2V0dGluZyBhbmQgc28gZm9ydGggYXJlIGRldGVybWluZWQgYnkgdGhlIGlucHV0IGZpbGUuCi0uUFAKLVRoZSBpbWFnZSBjYW4gYmUgbG9zc2xlc3NseSB0cmFuc2Zvcm1lZCBieSBnaXZpbmcgb25lIG9mIHRoZXNlIHN3aXRjaGVzOgotLlRQCi0uQiBcLWZsaXAgaG9yaXpvbnRhbAotTWlycm9yIGltYWdlIGhvcml6b250YWxseSAobGVmdC1yaWdodCkuCi0uVFAKLS5CIFwtZmxpcCB2ZXJ0aWNhbAotTWlycm9yIGltYWdlIHZlcnRpY2FsbHkgKHRvcC1ib3R0b20pLgotLlRQCi0uQiBcLXJvdGF0ZSA5MAotUm90YXRlIGltYWdlIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLgotLlRQCi0uQiBcLXJvdGF0ZSAxODAKLVJvdGF0ZSBpbWFnZSAxODAgZGVncmVlcy4KLS5UUAotLkIgXC1yb3RhdGUgMjcwCi1Sb3RhdGUgaW1hZ2UgMjcwIGRlZ3JlZXMgY2xvY2t3aXNlIChvciA5MCBjY3cpLgotLlRQCi0uQiBcLXRyYW5zcG9zZQotVHJhbnNwb3NlIGltYWdlIChhY3Jvc3MgVUwtdG8tTFIgYXhpcykuCi0uVFAKLS5CIFwtdHJhbnN2ZXJzZQotVHJhbnN2ZXJzZSB0cmFuc3Bvc2UgKGFjcm9zcyBVUi10by1MTCBheGlzKS4KLS5QUAotVGhlIHRyYW5zcG9zZSB0cmFuc2Zvcm1hdGlvbiBoYXMgbm8gcmVzdHJpY3Rpb25zIHJlZ2FyZGluZyBpbWFnZSBkaW1lbnNpb25zLgotVGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBvcGVyYXRlIHJhdGhlciBvZGRseSBpZiB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUgbm90Ci1hIG11bHRpcGxlIG9mIHRoZSBpTUNVIHNpemUgKHVzdWFsbHkgOCBvciAxNiBwaXhlbHMpLCBiZWNhdXNlIHRoZXkgY2FuIG9ubHkKLXRyYW5zZm9ybSBjb21wbGV0ZSBibG9ja3Mgb2YgRENUIGNvZWZmaWNpZW50IGRhdGEgaW4gdGhlIGRlc2lyZWQgd2F5LgotLlBQCi0uQlIganBlZ3RyYW4gJ3MKLWRlZmF1bHQgYmVoYXZpb3Igd2hlbiB0cmFuc2Zvcm1pbmcgYW4gb2RkLXNpemUgaW1hZ2UgaXMgZGVzaWduZWQKLXRvIHByZXNlcnZlIGV4YWN0IHJldmVyc2liaWxpdHkgYW5kIG1hdGhlbWF0aWNhbCBjb25zaXN0ZW5jeSBvZiB0aGUKLXRyYW5zZm9ybWF0aW9uIHNldC4gIEFzIHN0YXRlZCwgdHJhbnNwb3NlIGlzIGFibGUgdG8gZmxpcCB0aGUgZW50aXJlIGltYWdlCi1hcmVhLiAgSG9yaXpvbnRhbCBtaXJyb3JpbmcgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1UgY29sdW1uIGF0IHRoZSByaWdodCBlZGdlCi11bnRvdWNoZWQsIGJ1dCBpcyBhYmxlIHRvIGZsaXAgYWxsIHJvd3Mgb2YgdGhlIGltYWdlLiAgU2ltaWxhcmx5LCB2ZXJ0aWNhbAotbWlycm9yaW5nIGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVIHJvdyBhdCB0aGUgYm90dG9tIGVkZ2UgdW50b3VjaGVkLCBidXQgaXMKLWFibGUgdG8gZmxpcCBhbGwgY29sdW1ucy4gIFRoZSBvdGhlciB0cmFuc2Zvcm1zIGNhbiBiZSBidWlsdCB1cCBhcyBzZXF1ZW5jZXMKLW9mIHRyYW5zcG9zZSBhbmQgZmxpcCBvcGVyYXRpb25zOyBmb3IgY29uc2lzdGVuY3ksIHRoZWlyIGFjdGlvbnMgb24gZWRnZQotcGl4ZWxzIGFyZSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBlbmQgcmVzdWx0IG9mIHRoZSBjb3JyZXNwb25kaW5nCi10cmFuc3Bvc2UtYW5kLWZsaXAgc2VxdWVuY2UuCi0uUFAKLUZvciBwcmFjdGljYWwgdXNlLCB5b3UgbWF5IHByZWZlciB0byBkaXNjYXJkIGFueSB1bnRyYW5zZm9ybWFibGUgZWRnZSBwaXhlbHMKLXJhdGhlciB0aGFuIGhhdmluZyBhIHN0cmFuZ2UtbG9va2luZyBzdHJpcCBhbG9uZyB0aGUgcmlnaHQgYW5kL29yIGJvdHRvbSBlZGdlcwotb2YgYSB0cmFuc2Zvcm1lZCBpbWFnZS4gIFRvIGRvIHRoaXMsIGFkZCB0aGUKLS5CIFwtdHJpbQotc3dpdGNoOgotLlRQCi0uQiBcLXRyaW0KLURyb3Agbm9uLXRyYW5zZm9ybWFibGUgZWRnZSBibG9ja3MuCi0uUFAKLU9idmlvdXNseSwgYSB0cmFuc2Zvcm1hdGlvbiB3aXRoCi0uQiBcLXRyaW0KLWlzIG5vdCByZXZlcnNpYmxlLCBzbyBzdHJpY3RseSBzcGVha2luZwotLkIganBlZ3RyYW4KLXdpdGggdGhpcyBzd2l0Y2ggaXMgbm90IGxvc3NsZXNzLiAgQWxzbywgdGhlIGV4cGVjdGVkIG1hdGhlbWF0aWNhbAotZXF1aXZhbGVuY2VzIGJldHdlZW4gdGhlIHRyYW5zZm9ybWF0aW9ucyBubyBsb25nZXIgaG9sZC4gIEZvciBleGFtcGxlLAotLkIgXC1yb3QgMjcwIC10cmltCi10cmltcyBvbmx5IHRoZSBib3R0b20gZWRnZSwgYnV0Ci0uQiBcLXJvdCA5MCAtdHJpbQotZm9sbG93ZWQgYnkKLS5CIFwtcm90IDE4MCAtdHJpbQotdHJpbXMgYm90aCBlZGdlcy4KLS5QUAotQW5vdGhlciBub3Qtc3RyaWN0bHktbG9zc2xlc3MgdHJhbnNmb3JtYXRpb24gc3dpdGNoIGlzOgotLlRQCi0uQiBcLWdyYXlzY2FsZQotRm9yY2UgZ3JheXNjYWxlIG91dHB1dC4KLS5QUAotVGhpcyBvcHRpb24gZGlzY2FyZHMgdGhlIGNocm9taW5hbmNlIGNoYW5uZWxzIGlmIHRoZSBpbnB1dCBpbWFnZSBpcyBZQ2JDcgotKGllLCBhIHN0YW5kYXJkIGNvbG9yIEpQRUcpLCByZXN1bHRpbmcgaW4gYSBncmF5c2NhbGUgSlBFRyBmaWxlLiAgVGhlCi1sdW1pbmFuY2UgY2hhbm5lbCBpcyBwcmVzZXJ2ZWQgZXhhY3RseSwgc28gdGhpcyBpcyBhIGJldHRlciBtZXRob2Qgb2YgcmVkdWNpbmcKLXRvIGdyYXlzY2FsZSB0aGFuIGRlY29tcHJlc3Npb24sIGNvbnZlcnNpb24sIGFuZCByZWNvbXByZXNzaW9uLiAgVGhpcyBzd2l0Y2gKLWlzIHBhcnRpY3VsYXJseSBoYW5keSBmb3IgZml4aW5nIGEgbW9ub2Nocm9tZSBwaWN0dXJlIHRoYXQgd2FzIG1pc3Rha2VubHkKLWVuY29kZWQgYXMgYSBjb2xvciBKUEVHLiAgKEluIHN1Y2ggYSBjYXNlLCB0aGUgc3BhY2Ugc2F2aW5ncyBmcm9tIGdldHRpbmcgcmlkCi1vZiB0aGUgbmVhci1lbXB0eSBjaHJvbWEgY2hhbm5lbHMgd29uJ3QgYmUgbGFyZ2U7IGJ1dCB0aGUgZGVjb2RpbmcgdGltZSBmb3IKLWEgZ3JheXNjYWxlIEpQRUcgaXMgc3Vic3RhbnRpYWxseSBsZXNzIHRoYW4gdGhhdCBmb3IgYSBjb2xvciBKUEVHLikKLS5QUAotLkIganBlZ3RyYW4KLWFsc28gcmVjb2duaXplcyB0aGVzZSBzd2l0Y2hlcyB0aGF0IGNvbnRyb2wgd2hhdCB0byBkbyB3aXRoICJleHRyYSIgbWFya2VycywKLXN1Y2ggYXMgY29tbWVudCBibG9ja3M6Ci0uVFAKLS5CIFwtY29weSBub25lCi1Db3B5IG5vIGV4dHJhIG1hcmtlcnMgZnJvbSBzb3VyY2UgZmlsZS4gIFRoaXMgc2V0dGluZyBzdXBwcmVzc2VzIGFsbAotY29tbWVudHMgYW5kIG90aGVyIGV4Y2VzcyBiYWdnYWdlIHByZXNlbnQgaW4gdGhlIHNvdXJjZSBmaWxlLgotLlRQCi0uQiBcLWNvcHkgY29tbWVudHMKLUNvcHkgb25seSBjb21tZW50IG1hcmtlcnMuICBUaGlzIHNldHRpbmcgY29waWVzIGNvbW1lbnRzIGZyb20gdGhlIHNvdXJjZSBmaWxlLAotYnV0IGRpc2NhcmRzIGFueSBvdGhlciBpbmVzc2VudGlhbCBkYXRhLgotLlRQCi0uQiBcLWNvcHkgYWxsCi1Db3B5IGFsbCBleHRyYSBtYXJrZXJzLiAgVGhpcyBzZXR0aW5nIHByZXNlcnZlcyBtaXNjZWxsYW5lb3VzIG1hcmtlcnMKLWZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZSwgc3VjaCBhcyBKRklGIHRodW1ibmFpbHMgYW5kIFBob3Rvc2hvcCBzZXR0aW5ncy4KLUluIHNvbWUgZmlsZXMgdGhlc2UgZXh0cmEgbWFya2VycyBjYW4gYmUgc2l6YWJsZS4KLS5QUAotVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKLS5CUiAiXC1jb3B5IGNvbW1lbnRzIiAuCi0oTm90ZTogaW4gSUpHIHJlbGVhc2VzIHY2IGFuZCB2NmEsCi0uQiBqcGVndHJhbgotYWx3YXlzIGRpZCB0aGUgZXF1aXZhbGVudCBvZgotLkJSICJcLWNvcHkgbm9uZSIgLikKLS5QUAotQWRkaXRpb25hbCBzd2l0Y2hlcyByZWNvZ25pemVkIGJ5IGpwZWd0cmFuIGFyZToKLS5UUAotLkJJIFwtbWF4bWVtb3J5ICIgTiIKLVNldCBsaW1pdCBmb3IgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgaW4gcHJvY2Vzc2luZyBsYXJnZSBpbWFnZXMuICBWYWx1ZSBpcwotaW4gdGhvdXNhbmRzIG9mIGJ5dGVzLCBvciBtaWxsaW9ucyBvZiBieXRlcyBpZiAiTSIgaXMgYXR0YWNoZWQgdG8gdGhlCi1udW1iZXIuICBGb3IgZXhhbXBsZSwKLS5CIFwtbWF4IDRtCi1zZWxlY3RzIDQwMDAwMDAgYnl0ZXMuICBJZiBtb3JlIHNwYWNlIGlzIG5lZWRlZCwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4KLS5UUAotLkJJIFwtb3V0ZmlsZSAiIG5hbWUiCi1TZW5kIG91dHB1dCBpbWFnZSB0byB0aGUgbmFtZWQgZmlsZSwgbm90IHRvIHN0YW5kYXJkIG91dHB1dC4KLS5UUAotLkIgXC12ZXJib3NlCi1FbmFibGUgZGVidWcgcHJpbnRvdXQuICBNb3JlCi0uQlIgXC12ICdzCi1naXZlIG1vcmUgb3V0cHV0LiAgQWxzbywgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBwcmludGVkIGF0IHN0YXJ0dXAuCi0uVFAKLS5CIFwtZGVidWcKLVNhbWUgYXMKLS5CUiBcLXZlcmJvc2UgLgotLlNIIEVYQU1QTEVTCi0uTFAKLVRoaXMgZXhhbXBsZSBjb252ZXJ0cyBhIGJhc2VsaW5lIEpQRUcgZmlsZSB0byBwcm9ncmVzc2l2ZSBmb3JtOgotLklQCi0uQiBqcGVndHJhbiBcLXByb2dyZXNzaXZlCi0uSSBmb28uanBnCi0uQiA+Ci0uSSBmb29wcm9nLmpwZwotLlBQCi1UaGlzIGV4YW1wbGUgcm90YXRlcyBhbiBpbWFnZSA5MCBkZWdyZWVzIGNsb2Nrd2lzZSwgZGlzY2FyZGluZyBhbnkKLXVucm90YXRhYmxlIGVkZ2UgcGl4ZWxzOgotLklQCi0uQiBqcGVndHJhbiBcLXJvdCA5MCAtdHJpbQotLkkgZm9vLmpwZwotLkIgPgotLkkgZm9vOTAuanBnCi0uU0ggRU5WSVJPTk1FTlQKLS5UUAotLkIgSlBFR01FTQotSWYgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQsIGl0cyB2YWx1ZSBpcyB0aGUgZGVmYXVsdCBtZW1vcnkgbGltaXQuCi1UaGUgdmFsdWUgaXMgc3BlY2lmaWVkIGFzIGRlc2NyaWJlZCBmb3IgdGhlCi0uQiBcLW1heG1lbW9yeQotc3dpdGNoLgotLkIgSlBFR01FTQotb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlIHNwZWNpZmllZCB3aGVuIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCwgYW5kCi1pdHNlbGYgaXMgb3ZlcnJpZGRlbiBieSBhbiBleHBsaWNpdAotLkJSIFwtbWF4bWVtb3J5IC4KLS5TSCBTRUUgQUxTTwotLkJSIGNqcGVnICgxKSwKLS5CUiBkanBlZyAoMSksCi0uQlIgcmRqcGdjb20gKDEpLAotLkJSIHdyanBnY29tICgxKQotLmJyCi1XYWxsYWNlLCBHcmVnb3J5IEsuICAiVGhlIEpQRUcgU3RpbGwgUGljdHVyZSBDb21wcmVzc2lvbiBTdGFuZGFyZCIsCi1Db21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCBBcHJpbCAxOTkxICh2b2wuIDM0LCBuby4gNCksIHBwLiAzMC00NC4KLS5TSCBBVVRIT1IKLUluZGVwZW5kZW50IEpQRUcgR3JvdXAKLS5TSCBCVUdTCi1Bcml0aG1ldGljIGNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLgotLlBQCi1UaGUgdHJhbnNmb3JtIG9wdGlvbnMgY2FuJ3QgdHJhbnNmb3JtIG9kZC1zaXplIGltYWdlcyBwZXJmZWN0bHkuICBVc2UKLS5CIFwtdHJpbQotaWYgeW91IGRvbid0IGxpa2UgdGhlIHJlc3VsdHMgd2l0aG91dCBpdC4KLS5QUAotVGhlIGVudGlyZSBpbWFnZSBpcyByZWFkIGludG8gbWVtb3J5IGFuZCB0aGVuIHdyaXR0ZW4gb3V0IGFnYWluLCBldmVuIGluCi1jYXNlcyB3aGVyZSB0aGlzIGlzbid0IHJlYWxseSBuZWNlc3NhcnkuICBFeHBlY3Qgc3dhcHBpbmcgb24gbGFyZ2UgaW1hZ2VzLAotZXNwZWNpYWxseSB3aGVuIHVzaW5nIHRoZSBtb3JlIGNvbXBsZXggdHJhbnNmb3JtIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qcGVndHJhbi5jIGIvbGlianBlZ3R3cnAvanBlZ3RyYW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlZjExMS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qcGVndHJhbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8qCi0gKiBqcGVndHJhbi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYSBjb21tYW5kLWxpbmUgdXNlciBpbnRlcmZhY2UgZm9yIEpQRUcgdHJhbnNjb2RpbmcuCi0gKiBJdCBpcyB2ZXJ5IHNpbWlsYXIgdG8gY2pwZWcuYywgYnV0IHByb3ZpZGVzIGxvc3NsZXNzIHRyYW5zY29kaW5nIGJldHdlZW4KLSAqIGRpZmZlcmVudCBKUEVHIGZpbGUgZm9ybWF0cy4gIEl0IGFsc28gcHJvdmlkZXMgc29tZSBsb3NzbGVzcyBhbmQgc29ydC1vZi0KLSAqIGxvc3NsZXNzIHRyYW5zZm9ybWF0aW9ucyBvZiBKUEVHIGRhdGEuCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLSNpbmNsdWRlICJ0cmFuc3VwcC5oIgkJLyogU3VwcG9ydCByb3V0aW5lcyBmb3IganBlZ3RyYW4gKi8KLSNpbmNsdWRlICJqdmVyc2lvbi5oIgkJLyogZm9yIHZlcnNpb24gbWVzc2FnZSAqLwotCi0jaWZkZWYgVVNFX0NDT01NQU5ECQkvKiBjb21tYW5kLWxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KLSNpZmRlZiBfX01XRVJLU19fCi0jaW5jbHVkZSA8U0lPVVguaD4gICAgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgbmVlZHMgdGhpcyAqLwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIC4uLiBhbmQgdGhpcyAqLwotI2VuZGlmCi0jaWZkZWYgVEhJTktfQwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIFRoaW5rIGRlY2xhcmVzIGl0IGhlcmUgKi8KLSNlbmRpZgotI2VuZGlmCi0KLQotLyoKLSAqIEFyZ3VtZW50LXBhcnNpbmcgY29kZS4KLSAqIFRoZSBzd2l0Y2ggcGFyc2VyIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWZ1bCB3aXRoIERPUy1zdHlsZSBjb21tYW5kIGxpbmUKLSAqIHN5bnRheCwgaWUsIGludGVybWl4ZWQgc3dpdGNoZXMgYW5kIGZpbGUgbmFtZXMsIHdoZXJlIG9ubHkgdGhlIHN3aXRjaGVzCi0gKiB0byB0aGUgbGVmdCBvZiBhIGdpdmVuIGZpbGUgbmFtZSBhZmZlY3QgcHJvY2Vzc2luZyBvZiB0aGF0IGZpbGUuCi0gKiBUaGUgbWFpbiBwcm9ncmFtIGluIHRoaXMgZmlsZSBkb2Vzbid0IGFjdHVhbGx5IHVzZSB0aGlzIGNhcGFiaWxpdHkuLi4KLSAqLwotCi0KLXN0YXRpYyBjb25zdCBjaGFyICogcHJvZ25hbWU7CS8qIHByb2dyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KLXN0YXRpYyBjaGFyICogb3V0ZmlsZW5hbWU7CS8qIGZvciAtb3V0ZmlsZSBzd2l0Y2ggKi8KLXN0YXRpYyBKQ09QWV9PUFRJT04gY29weW9wdGlvbjsJLyogLWNvcHkgc3dpdGNoICovCi1zdGF0aWMganBlZ190cmFuc2Zvcm1faW5mbyB0cmFuc2Zvcm1vcHRpb247IC8qIGltYWdlIHRyYW5zZm9ybWF0aW9uIG9wdGlvbnMgKi8KLQotCi1MT0NBTCh2b2lkKQotdXNhZ2UgKHZvaWQpCi0vKiBjb21wbGFpbiBhYm91dCBiYWQgY29tbWFuZCBsaW5lICovCi17Ci0gIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFtzd2l0Y2hlc10gIiwgcHJvZ25hbWUpOwotI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0gIGZwcmludGYoc3RkZXJyLCAiaW5wdXRmaWxlIG91dHB1dGZpbGVcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihzdGRlcnIsICJbaW5wdXRmaWxlXVxuIik7Ci0jZW5kaWYKLQotICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtY29weSBub25lICAgICBDb3B5IG5vIGV4dHJhIG1hcmtlcnMgZnJvbSBzb3VyY2UgZmlsZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtY29weSBjb21tZW50cyBDb3B5IG9ubHkgY29tbWVudCBtYXJrZXJzIChkZWZhdWx0KVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtY29weSBhbGwgICAgICBDb3B5IGFsbCBleHRyYSBtYXJrZXJzXG4iKTsKLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vcHRpbWl6ZSAgICAgIE9wdGltaXplIEh1ZmZtYW4gdGFibGUgKHNtYWxsZXIgZmlsZSwgYnV0IHNsb3cgY29tcHJlc3Npb24pXG4iKTsKLSNlbmRpZgotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtcHJvZ3Jlc3NpdmUgICBDcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlXG4iKTsKLSNlbmRpZgotI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgZm9yIG1vZGlmeWluZyB0aGUgaW1hZ2U6XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1ncmF5c2NhbGUgICAgIFJlZHVjZSB0byBncmF5c2NhbGUgKG9taXQgY29sb3IgZGF0YSlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWZsaXAgW2hvcml6b250YWx8dmVydGljYWxdICBNaXJyb3IgaW1hZ2UgKGxlZnQtcmlnaHQgb3IgdG9wLWJvdHRvbSlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJvdGF0ZSBbOTB8MTgwfDI3MF0gICAgICAgICBSb3RhdGUgaW1hZ2UgKGRlZ3JlZXMgY2xvY2t3aXNlKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdHJhbnNwb3NlICAgICBUcmFuc3Bvc2UgaW1hZ2VcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXRyYW5zdmVyc2UgICAgVHJhbnN2ZXJzZSB0cmFuc3Bvc2UgaW1hZ2VcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXRyaW0gICAgICAgICAgRHJvcCBub24tdHJhbnNmb3JtYWJsZSBlZGdlIGJsb2Nrc1xuIik7Ci0jZW5kaWYgLyogVFJBTlNGT1JNU19TVVBQT1JURUQgKi8KLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1yZXN0YXJ0IE4gICAgIFNldCByZXN0YXJ0IGludGVydmFsIGluIHJvd3MsIG9yIGluIGJsb2NrcyB3aXRoIEJcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW1heG1lbW9yeSBOICAgTWF4aW11bSBtZW1vcnkgdG8gdXNlIChpbiBrYnl0ZXMpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vdXRmaWxlIG5hbWUgIFNwZWNpZnkgbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcmJvc2UgIG9yICAtZGVidWcgICBFbWl0IGRlYnVnIG91dHB1dFxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgZm9yIHdpemFyZHM6XG4iKTsKLSNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1hcml0aG1ldGljICAgIFVzZSBhcml0aG1ldGljIGNvZGluZ1xuIik7Ci0jZW5kaWYKLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1zY2FucyBmaWxlICAgIENyZWF0ZSBtdWx0aS1zY2FuIEpQRUcgcGVyIHNjcmlwdCBmaWxlXG4iKTsKLSNlbmRpZgotICBleGl0KEVYSVRfRkFJTFVSRSk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLXNlbGVjdF90cmFuc2Zvcm0gKEpYRk9STV9DT0RFIHRyYW5zZm9ybSkKLS8qIFNpbGx5IGxpdHRsZSByb3V0aW5lIHRvIGRldGVjdCBtdWx0aXBsZSB0cmFuc2Zvcm0gb3B0aW9ucywKLSAqIHdoaWNoIHdlIGNhbid0IGhhbmRsZS4KLSAqLwotewotI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECi0gIGlmICh0cmFuc2Zvcm1vcHRpb24udHJhbnNmb3JtID09IEpYRk9STV9OT05FIHx8Ci0gICAgICB0cmFuc2Zvcm1vcHRpb24udHJhbnNmb3JtID09IHRyYW5zZm9ybSkgewotICAgIHRyYW5zZm9ybW9wdGlvbi50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07Ci0gIH0gZWxzZSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuIG9ubHkgZG8gb25lIGltYWdlIHRyYW5zZm9ybWF0aW9uIGF0IGEgdGltZVxuIiwKLQkgICAgcHJvZ25hbWUpOwotICAgIHVzYWdlKCk7Ci0gIH0KLSNlbHNlCi0gIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBpbWFnZSB0cmFuc2Zvcm1hdGlvbiB3YXMgbm90IGNvbXBpbGVkXG4iLAotCSAgcHJvZ25hbWUpOwotICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0jZW5kaWYKLX0KLQotCi1MT0NBTChpbnQpCi1wYXJzZV9zd2l0Y2hlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBhcmdjLCBjaGFyICoqYXJndiwKLQkJaW50IGxhc3RfZmlsZV9hcmdfc2VlbiwgYm9vbGVhbiBmb3JfcmVhbCkKLS8qIFBhcnNlIG9wdGlvbmFsIHN3aXRjaGVzLgotICogUmV0dXJucyBhcmd2W10gaW5kZXggb2YgZmlyc3QgZmlsZS1uYW1lIGFyZ3VtZW50ICg9PSBhcmdjIGlmIG5vbmUpLgotICogQW55IGZpbGUgbmFtZXMgd2l0aCBpbmRleGVzIDw9IGxhc3RfZmlsZV9hcmdfc2VlbiBhcmUgaWdub3JlZDsKLSAqIHRoZXkgaGF2ZSBwcmVzdW1hYmx5IGJlZW4gcHJvY2Vzc2VkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLgotICogKFBhc3MgMCBmb3IgbGFzdF9maWxlX2FyZ19zZWVuIG9uIHRoZSBmaXJzdCBvciBvbmx5IGl0ZXJhdGlvbi4pCi0gKiBmb3JfcmVhbCBpcyBGQUxTRSBvbiB0aGUgZmlyc3QgKGR1bW15KSBwYXNzOyB3ZSBtYXkgc2tpcCBhbnkgZXhwZW5zaXZlCi0gKiBwcm9jZXNzaW5nLgotICovCi17Ci0gIGludCBhcmduOwotICBjaGFyICogYXJnOwotICBib29sZWFuIHNpbXBsZV9wcm9ncmVzc2l2ZTsKLSAgY2hhciAqIHNjYW5zYXJnID0gTlVMTDsJLyogc2F2ZXMgLXNjYW5zIHBhcm0gaWYgYW55ICovCi0KLSAgLyogU2V0IHVwIGRlZmF1bHQgSlBFRyBwYXJhbWV0ZXJzLiAqLwotICBzaW1wbGVfcHJvZ3Jlc3NpdmUgPSBGQUxTRTsKLSAgb3V0ZmlsZW5hbWUgPSBOVUxMOwotICBjb3B5b3B0aW9uID0gSkNPUFlPUFRfREVGQVVMVDsKLSAgdHJhbnNmb3Jtb3B0aW9uLnRyYW5zZm9ybSA9IEpYRk9STV9OT05FOwotICB0cmFuc2Zvcm1vcHRpb24udHJpbSA9IEZBTFNFOwotICB0cmFuc2Zvcm1vcHRpb24uZm9yY2VfZ3JheXNjYWxlID0gRkFMU0U7Ci0gIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMDsKLQotICAvKiBTY2FuIGNvbW1hbmQgbGluZSBvcHRpb25zLCBhZGp1c3QgcGFyYW1ldGVycyAqLwotCi0gIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKLSAgICBhcmcgPSBhcmd2W2FyZ25dOwotICAgIGlmICgqYXJnICE9ICctJykgewotICAgICAgLyogTm90IGEgc3dpdGNoLCBtdXN0IGJlIGEgZmlsZSBuYW1lIGFyZ3VtZW50ICovCi0gICAgICBpZiAoYXJnbiA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4pIHsKLQlvdXRmaWxlbmFtZSA9IE5VTEw7CS8qIC1vdXRmaWxlIGFwcGxpZXMgdG8ganVzdCBvbmUgaW5wdXQgZmlsZSAqLwotCWNvbnRpbnVlOwkJLyogaWdub3JlIHRoaXMgbmFtZSBpZiBwcmV2aW91c2x5IHByb2Nlc3NlZCAqLwotICAgICAgfQotICAgICAgYnJlYWs7CQkJLyogZWxzZSBkb25lIHBhcnNpbmcgc3dpdGNoZXMgKi8KLSAgICB9Ci0gICAgYXJnKys7CQkJLyogYWR2YW5jZSBwYXN0IHN3aXRjaCBtYXJrZXIgY2hhcmFjdGVyICovCi0KLSAgICBpZiAoa2V5bWF0Y2goYXJnLCAiYXJpdGhtZXRpYyIsIDEpKSB7Ci0gICAgICAvKiBVc2UgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0jaWZkZWYgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVECi0gICAgICBjaW5mby0+YXJpdGhfY29kZSA9IFRSVUU7Ci0jZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGFyaXRobWV0aWMgY29kaW5nIG5vdCBzdXBwb3J0ZWRcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImNvcHkiLCAxKSkgewotICAgICAgLyogU2VsZWN0IHdoaWNoIGV4dHJhIG1hcmtlcnMgdG8gY29weS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAibm9uZSIsIDEpKSB7Ci0JY29weW9wdGlvbiA9IEpDT1BZT1BUX05PTkU7Ci0gICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJjb21tZW50cyIsIDEpKSB7Ci0JY29weW9wdGlvbiA9IEpDT1BZT1BUX0NPTU1FTlRTOwotICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiYWxsIiwgMSkpIHsKLQljb3B5b3B0aW9uID0gSkNPUFlPUFRfQUxMOwotICAgICAgfSBlbHNlCi0JdXNhZ2UoKTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGVidWciLCAxKSB8fCBrZXltYXRjaChhcmcsICJ2ZXJib3NlIiwgMSkpIHsKLSAgICAgIC8qIEVuYWJsZSBkZWJ1ZyBwcmludG91dHMuICovCi0gICAgICAvKiBPbiBmaXJzdCAtZCwgcHJpbnQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiAqLwotICAgICAgc3RhdGljIGJvb2xlYW4gcHJpbnRlZF92ZXJzaW9uID0gRkFMU0U7Ci0KLSAgICAgIGlmICghIHByaW50ZWRfdmVyc2lvbikgewotCWZwcmludGYoc3RkZXJyLCAiSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUdUUkFOLCB2ZXJzaW9uICVzXG4lc1xuIiwKLQkJSlZFUlNJT04sIEpDT1BZUklHSFQpOwotCXByaW50ZWRfdmVyc2lvbiA9IFRSVUU7Ci0gICAgICB9Ci0gICAgICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCsrOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJmbGlwIiwgMSkpIHsKLSAgICAgIC8qIE1pcnJvciBsZWZ0LXJpZ2h0IG9yIHRvcC1ib3R0b20uICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImhvcml6b250YWwiLCAxKSkKLQlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9GTElQX0gpOwotICAgICAgZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgInZlcnRpY2FsIiwgMSkpCi0Jc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fRkxJUF9WKTsKLSAgICAgIGVsc2UKLQl1c2FnZSgpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJncmF5c2NhbGUiLCAxKSB8fCBrZXltYXRjaChhcmcsICJncmV5c2NhbGUiLDEpKSB7Ci0gICAgICAvKiBGb3JjZSB0byBncmF5c2NhbGUuICovCi0jaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKLSAgICAgIHRyYW5zZm9ybW9wdGlvbi5mb3JjZV9ncmF5c2NhbGUgPSBUUlVFOwotI2Vsc2UKLSAgICAgIHNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX05PTkUpOwkvKiBmb3JjZSBhbiBlcnJvciAqLwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm1heG1lbW9yeSIsIDMpKSB7Ci0gICAgICAvKiBNYXhpbXVtIG1lbW9yeSBpbiBLYiAob3IgTWIgd2l0aCAnbScpLiAqLwotICAgICAgbG9uZyBsdmFsOwotICAgICAgY2hhciBjaCA9ICd4JzsKLQotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQotCWx2YWwgKj0gMTAwMEw7Ci0gICAgICBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSA9IGx2YWwgKiAxMDAwTDsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3B0aW1pemUiLCAxKSB8fCBrZXltYXRjaChhcmcsICJvcHRpbWlzZSIsIDEpKSB7Ci0gICAgICAvKiBFbmFibGUgZW50cm9weSBwYXJtIG9wdGltaXphdGlvbi4gKi8KLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOwotI2Vsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBlbnRyb3B5IG9wdGltaXphdGlvbiB3YXMgbm90IGNvbXBpbGVkXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSNlbmRpZgotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvdXRmaWxlIiwgNCkpIHsKLSAgICAgIC8qIFNldCBvdXRwdXQgZmlsZSBuYW1lLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgb3V0ZmlsZW5hbWUgPSBhcmd2W2FyZ25dOwkvKiBzYXZlIGl0IGF3YXkgZm9yIGxhdGVyIHVzZSAqLwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJwcm9ncmVzc2l2ZSIsIDEpKSB7Ci0gICAgICAvKiBTZWxlY3Qgc2ltcGxlIHByb2dyZXNzaXZlIG1vZGUuICovCi0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIHNpbXBsZV9wcm9ncmVzc2l2ZSA9IFRSVUU7Ci0gICAgICAvKiBXZSBtdXN0IHBvc3Rwb25lIGV4ZWN1dGlvbiB1bnRpbCBudW1fY29tcG9uZW50cyBpcyBrbm93bi4gKi8KLSNlbHNlCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgcHJvZ3Jlc3NpdmUgb3V0cHV0IHdhcyBub3QgY29tcGlsZWRcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInJlc3RhcnQiLCAxKSkgewotICAgICAgLyogUmVzdGFydCBpbnRlcnZhbCBpbiBNQ1Ugcm93cyAob3IgaW4gTUNVcyB3aXRoICdiJykuICovCi0gICAgICBsb25nIGx2YWw7Ci0gICAgICBjaGFyIGNoID0gJ3gnOwotCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlbGQlYyIsICZsdmFsLCAmY2gpIDwgMSkKLQl1c2FnZSgpOwotICAgICAgaWYgKGx2YWwgPCAwIHx8IGx2YWwgPiA2NTUzNUwpCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChjaCA9PSAnYicgfHwgY2ggPT0gJ0InKSB7Ci0JY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAodW5zaWduZWQgaW50KSBsdmFsOwotCWNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgPSAwOyAvKiBlbHNlIHByaW9yICctcmVzdGFydCBuJyBvdmVycmlkZXMgbWUgKi8KLSAgICAgIH0gZWxzZSB7Ci0JY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IChpbnQpIGx2YWw7Ci0JLyogcmVzdGFydF9pbnRlcnZhbCB3aWxsIGJlIGNvbXB1dGVkIGR1cmluZyBzdGFydHVwICovCi0gICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInJvdGF0ZSIsIDIpKSB7Ci0gICAgICAvKiBSb3RhdGUgOTAsIDE4MCwgb3IgMjcwIGRlZ3JlZXMgKG1lYXN1cmVkIGNsb2Nrd2lzZSkuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIjkwIiwgMikpCi0Jc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fUk9UXzkwKTsKLSAgICAgIGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICIxODAiLCAzKSkKLQlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9ST1RfMTgwKTsKLSAgICAgIGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICIyNzAiLCAzKSkKLQlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9ST1RfMjcwKTsKLSAgICAgIGVsc2UKLQl1c2FnZSgpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJzY2FucyIsIDEpKSB7Ci0gICAgICAvKiBTZXQgc2NhbiBzY3JpcHQuICovCi0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBzY2Fuc2FyZyA9IGFyZ3ZbYXJnbl07Ci0gICAgICAvKiBXZSBtdXN0IHBvc3Rwb25lIHJlYWRpbmcgdGhlIGZpbGUgaW4gY2FzZSAtcHJvZ3Jlc3NpdmUgYXBwZWFycy4gKi8KLSNlbHNlCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgbXVsdGktc2NhbiBvdXRwdXQgd2FzIG5vdCBjb21waWxlZFxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAidHJhbnNwb3NlIiwgMSkpIHsKLSAgICAgIC8qIFRyYW5zcG9zZSAoYWNyb3NzIFVMLXRvLUxSIGF4aXMpLiAqLwotICAgICAgc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fVFJBTlNQT1NFKTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAidHJhbnN2ZXJzZSIsIDYpKSB7Ci0gICAgICAvKiBUcmFuc3ZlcnNlIHRyYW5zcG9zZSAoYWNyb3NzIFVSLXRvLUxMIGF4aXMpLiAqLwotICAgICAgc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fVFJBTlNWRVJTRSk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInRyaW0iLCAzKSkgewotICAgICAgLyogVHJpbSBvZmYgYW55IHBhcnRpYWwgZWRnZSBNQ1VzIHRoYXQgdGhlIHRyYW5zZm9ybSBjYW4ndCBoYW5kbGUuICovCi0gICAgICB0cmFuc2Zvcm1vcHRpb24udHJpbSA9IFRSVUU7Ci0KLSAgICB9IGVsc2UgewotICAgICAgdXNhZ2UoKTsJCQkvKiBib2d1cyBzd2l0Y2ggKi8KLSAgICB9Ci0gIH0KLQotICAvKiBQb3N0LXN3aXRjaC1zY2FubmluZyBjbGVhbnVwICovCi0KLSAgaWYgKGZvcl9yZWFsKSB7Ci0KLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgIGlmIChzaW1wbGVfcHJvZ3Jlc3NpdmUpCS8qIHByb2Nlc3MgLXByb2dyZXNzaXZlOyAtc2NhbnMgY2FuIG92ZXJyaWRlICovCi0gICAgICBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbihjaW5mbyk7Ci0jZW5kaWYKLQotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICAgIGlmIChzY2Fuc2FyZyAhPSBOVUxMKQkvKiBwcm9jZXNzIC1zY2FucyBpZiBpdCB3YXMgcHJlc2VudCAqLwotICAgICAgaWYgKCEgcmVhZF9zY2FuX3NjcmlwdChjaW5mbywgc2NhbnNhcmcpKQotCXVzYWdlKCk7Ci0jZW5kaWYKLSAgfQotCi0gIHJldHVybiBhcmduOwkJCS8qIHJldHVybiBpbmRleCBvZiBuZXh0IGFyZyAoZmlsZSBuYW1lKSAqLwotfQotCi0KLS8qCi0gKiBUaGUgbWFpbiBwcm9ncmFtLgotICovCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBzcmNpbmZvOwotICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgZHN0aW5mbzsKLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGpzcmNlcnIsIGpkc3RlcnI7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIHN0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHByb2dyZXNzOwotI2VuZGlmCi0gIGp2aXJ0X2JhcnJheV9wdHIgKiBzcmNfY29lZl9hcnJheXM7Ci0gIGp2aXJ0X2JhcnJheV9wdHIgKiBkc3RfY29lZl9hcnJheXM7Ci0gIGludCBmaWxlX2luZGV4OwotICBGSUxFICogaW5wdXRfZmlsZTsKLSAgRklMRSAqIG91dHB1dF9maWxlOwotCi0gIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCi0jaWZkZWYgVVNFX0NDT01NQU5ECi0gIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7Ci0jZW5kaWYKLQotICBwcm9nbmFtZSA9IGFyZ3ZbMF07Ci0gIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCi0gICAgcHJvZ25hbWUgPSAianBlZ3RyYW4iOwkvKiBpbiBjYXNlIEMgbGlicmFyeSBkb2Vzbid0IHByb3ZpZGUgaXQgKi8KLQotICAvKiBJbml0aWFsaXplIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0IHdpdGggZGVmYXVsdCBlcnJvciBoYW5kbGluZy4gKi8KLSAgc3JjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmanNyY2Vycik7Ci0gIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJnNyY2luZm8pOwotICAvKiBJbml0aWFsaXplIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCB3aXRoIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcuICovCi0gIGRzdGluZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmpkc3RlcnIpOwotICBqcGVnX2NyZWF0ZV9jb21wcmVzcygmZHN0aW5mbyk7Ci0KLSAgLyogTm93IHNhZmUgdG8gZW5hYmxlIHNpZ25hbCBjYXRjaGVyLgotICAgKiBOb3RlOiB3ZSBhc3N1bWUgb25seSB0aGUgZGVjb21wcmVzc2lvbiBvYmplY3Qgd2lsbCBoYXZlIHZpcnR1YWwgYXJyYXlzLgotICAgKi8KLSNpZmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCi0gIGVuYWJsZV9zaWduYWxfY2F0Y2hlcigoal9jb21tb25fcHRyKSAmc3JjaW5mbyk7Ci0jZW5kaWYKLQotICAvKiBTY2FuIGNvbW1hbmQgbGluZSB0byBmaW5kIGZpbGUgbmFtZXMuCi0gICAqIEl0IGlzIGNvbnZlbmllbnQgdG8gdXNlIGp1c3Qgb25lIHN3aXRjaC1wYXJzaW5nIHJvdXRpbmUsIGJ1dCB0aGUgc3dpdGNoCi0gICAqIHZhbHVlcyByZWFkIGhlcmUgYXJlIG1vc3RseSBpZ25vcmVkOyB3ZSB3aWxsIHJlc2NhbiB0aGUgc3dpdGNoZXMgYWZ0ZXIKLSAgICogb3BlbmluZyB0aGUgaW5wdXQgZmlsZS4gIEFsc28gbm90ZSB0aGF0IG1vc3Qgb2YgdGhlIHN3aXRjaGVzIGFmZmVjdCB0aGUKLSAgICogZGVzdGluYXRpb24gSlBFRyBvYmplY3QsIHNvIHdlIHBhcnNlIGludG8gdGhhdCBhbmQgdGhlbiBjb3B5IG92ZXIgd2hhdAotICAgKiBuZWVkcyB0byBhZmZlY3RzIHRoZSBzb3VyY2UgdG9vLgotICAgKi8KLQotICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmRzdGluZm8sIGFyZ2MsIGFyZ3YsIDAsIEZBTFNFKTsKLSAganNyY2Vyci50cmFjZV9sZXZlbCA9IGpkc3RlcnIudHJhY2VfbGV2ZWw7Ci0gIHNyY2luZm8ubWVtLT5tYXhfbWVtb3J5X3RvX3VzZSA9IGRzdGluZm8ubWVtLT5tYXhfbWVtb3J5X3RvX3VzZTsKLQotI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0gIC8qIE11c3QgaGF2ZSBlaXRoZXIgLW91dGZpbGUgc3dpdGNoIG9yIGV4cGxpY2l0IG91dHB1dCBmaWxlIG5hbWUgKi8KLSAgaWYgKG91dGZpbGVuYW1lID09IE5VTEwpIHsKLSAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTIpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICB1c2FnZSgpOwotICAgIH0KLSAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbZmlsZV9pbmRleCsxXTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTEpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICB1c2FnZSgpOwotICAgIH0KLSAgfQotI2Vsc2UKLSAgLyogVW5peCBzdHlsZTogZXhwZWN0IHplcm8gb3Igb25lIGZpbGUgbmFtZSAqLwotICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MtMSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGlucHV0IGZpbGVcbiIsIHByb2duYW1lKTsKLSAgICB1c2FnZSgpOwotICB9Ci0jZW5kaWYgLyogVFdPX0ZJTEVfQ09NTUFORExJTkUgKi8KLQotICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLwotICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MpIHsKLSAgICBpZiAoKGlucHV0X2ZpbGUgPSBmb3Blbihhcmd2W2ZpbGVfaW5kZXhdLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2ZpbGVfaW5kZXhdKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCi0gICAgaW5wdXRfZmlsZSA9IHJlYWRfc3RkaW4oKTsKLSAgfQotCi0gIC8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAqLwotICBpZiAob3V0ZmlsZW5hbWUgIT0gTlVMTCkgewotICAgIGlmICgob3V0cHV0X2ZpbGUgPSBmb3BlbihvdXRmaWxlbmFtZSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIG91dGZpbGVuYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogZGVmYXVsdCBvdXRwdXQgZmlsZSBpcyBzdGRvdXQgKi8KLSAgICBvdXRwdXRfZmlsZSA9IHdyaXRlX3N0ZG91dCgpOwotICB9Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmZHN0aW5mbywgJnByb2dyZXNzKTsKLSNlbmRpZgotCi0gIC8qIFNwZWNpZnkgZGF0YSBzb3VyY2UgZm9yIGRlY29tcHJlc3Npb24gKi8KLSAganBlZ19zdGRpb19zcmMoJnNyY2luZm8sIGlucHV0X2ZpbGUpOwotCi0gIC8qIEVuYWJsZSBzYXZpbmcgb2YgZXh0cmEgbWFya2VycyB0aGF0IHdlIHdhbnQgdG8gY29weSAqLwotICBqY29weV9tYXJrZXJzX3NldHVwKCZzcmNpbmZvLCBjb3B5b3B0aW9uKTsKLQotICAvKiBSZWFkIGZpbGUgaGVhZGVyICovCi0gICh2b2lkKSBqcGVnX3JlYWRfaGVhZGVyKCZzcmNpbmZvLCBUUlVFKTsKLQotICAvKiBBbnkgc3BhY2UgbmVlZGVkIGJ5IGEgdHJhbnNmb3JtIG9wdGlvbiBtdXN0IGJlIHJlcXVlc3RlZCBiZWZvcmUKLSAgICoganBlZ19yZWFkX2NvZWZmaWNpZW50cyBzbyB0aGF0IG1lbW9yeSBhbGxvY2F0aW9uIHdpbGwgYmUgZG9uZSByaWdodC4KLSAgICovCi0jaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKLSAganRyYW5zZm9ybV9yZXF1ZXN0X3dvcmtzcGFjZSgmc3JjaW5mbywgJnRyYW5zZm9ybW9wdGlvbik7Ci0jZW5kaWYKLQotICAvKiBSZWFkIHNvdXJjZSBmaWxlIGFzIERDVCBjb2VmZmljaWVudHMgKi8KLSAgc3JjX2NvZWZfYXJyYXlzID0ganBlZ19yZWFkX2NvZWZmaWNpZW50cygmc3JjaW5mbyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBkZXN0aW5hdGlvbiBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGZyb20gc291cmNlIHZhbHVlcyAqLwotICBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycygmc3JjaW5mbywgJmRzdGluZm8pOwotCi0gIC8qIEFkanVzdCBkZXN0aW5hdGlvbiBwYXJhbWV0ZXJzIGlmIHJlcXVpcmVkIGJ5IHRyYW5zZm9ybSBvcHRpb25zOwotICAgKiBhbHNvIGZpbmQgb3V0IHdoaWNoIHNldCBvZiBjb2VmZmljaWVudCBhcnJheXMgd2lsbCBob2xkIHRoZSBvdXRwdXQuCi0gICAqLwotI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECi0gIGRzdF9jb2VmX2FycmF5cyA9IGp0cmFuc2Zvcm1fYWRqdXN0X3BhcmFtZXRlcnMoJnNyY2luZm8sICZkc3RpbmZvLAotCQkJCQkJIHNyY19jb2VmX2FycmF5cywKLQkJCQkJCSAmdHJhbnNmb3Jtb3B0aW9uKTsKLSNlbHNlCi0gIGRzdF9jb2VmX2FycmF5cyA9IHNyY19jb2VmX2FycmF5czsKLSNlbmRpZgotCi0gIC8qIEFkanVzdCBkZWZhdWx0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYnkgcmUtcGFyc2luZyB0aGUgb3B0aW9ucyAqLwotICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmRzdGluZm8sIGFyZ2MsIGFyZ3YsIDAsIFRSVUUpOwotCi0gIC8qIFNwZWNpZnkgZGF0YSBkZXN0aW5hdGlvbiBmb3IgY29tcHJlc3Npb24gKi8KLSAganBlZ19zdGRpb19kZXN0KCZkc3RpbmZvLCBvdXRwdXRfZmlsZSk7Ci0KLSAgLyogU3RhcnQgY29tcHJlc3NvciAobm90ZSBubyBpbWFnZSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4gaGVyZSkgKi8KLSAganBlZ193cml0ZV9jb2VmZmljaWVudHMoJmRzdGluZm8sIGRzdF9jb2VmX2FycmF5cyk7Ci0KLSAgLyogQ29weSB0byB0aGUgb3V0cHV0IGZpbGUgYW55IGV4dHJhIG1hcmtlcnMgdGhhdCB3ZSB3YW50IHRvIHByZXNlcnZlICovCi0gIGpjb3B5X21hcmtlcnNfZXhlY3V0ZSgmc3JjaW5mbywgJmRzdGluZm8sIGNvcHlvcHRpb24pOwotCi0gIC8qIEV4ZWN1dGUgaW1hZ2UgdHJhbnNmb3JtYXRpb24sIGlmIGFueSAqLwotI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECi0gIGp0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm1hdGlvbigmc3JjaW5mbywgJmRzdGluZm8sCi0JCQkJICAgIHNyY19jb2VmX2FycmF5cywKLQkJCQkgICAgJnRyYW5zZm9ybW9wdGlvbik7Ci0jZW5kaWYKLQotICAvKiBGaW5pc2ggY29tcHJlc3Npb24gYW5kIHJlbGVhc2UgbWVtb3J5ICovCi0gIGpwZWdfZmluaXNoX2NvbXByZXNzKCZkc3RpbmZvKTsKLSAganBlZ19kZXN0cm95X2NvbXByZXNzKCZkc3RpbmZvKTsKLSAgKHZvaWQpIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoJnNyY2luZm8pOwotICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmc3JjaW5mbyk7Ci0KLSAgLyogQ2xvc2UgZmlsZXMsIGlmIHdlIG9wZW5lZCB0aGVtICovCi0gIGlmIChpbnB1dF9maWxlICE9IHN0ZGluKQotICAgIGZjbG9zZShpbnB1dF9maWxlKTsKLSAgaWYgKG91dHB1dF9maWxlICE9IHN0ZG91dCkKLSAgICBmY2xvc2Uob3V0cHV0X2ZpbGUpOwotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGVuZF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZkc3RpbmZvKTsKLSNlbmRpZgotCi0gIC8qIEFsbCBkb25lLiAqLwotICBleGl0KGpzcmNlcnIubnVtX3dhcm5pbmdzICsgamRzdGVyci5udW1fd2FybmluZ3MgP0VYSVRfV0FSTklORzpFWElUX1NVQ0NFU1MpOwotICByZXR1cm4gMDsJCQkvKiBzdXBwcmVzcyBuby1yZXR1cm4tdmFsdWUgd2FybmluZ3MgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pxdWFudDEuYyBiL2xpYmpwZWd0d3JwL2pxdWFudDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmOTZhYS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qcXVhbnQxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NTYgKzAsMCBAQAotLyoKLSAqIGpxdWFudDEuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24gKGNvbG9yIG1hcHBpbmcpIHJvdXRpbmVzLgotICogVGhlc2Ugcm91dGluZXMgcHJvdmlkZSBtYXBwaW5nIHRvIGEgZml4ZWQgY29sb3IgbWFwIHVzaW5nIGVxdWFsbHkgc3BhY2VkCi0gKiBjb2xvciB2YWx1ZXMuICBPcHRpb25hbCBGbG95ZC1TdGVpbmJlcmcgb3Igb3JkZXJlZCBkaXRoZXJpbmcgaXMgYXZhaWxhYmxlLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotI2lmZGVmIFFVQU5UXzFQQVNTX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGUgbWFpbiBwdXJwb3NlIG9mIDEtcGFzcyBxdWFudGl6YXRpb24gaXMgdG8gcHJvdmlkZSBhIGZhc3QsIGlmIG5vdCB2ZXJ5Ci0gKiBoaWdoIHF1YWxpdHksIGNvbG9ybWFwcGVkIG91dHB1dCBjYXBhYmlsaXR5LiAgQSAyLXBhc3MgcXVhbnRpemVyIHVzdWFsbHkKLSAqIGdpdmVzIGJldHRlciB2aXN1YWwgcXVhbGl0eTsgaG93ZXZlciwgZm9yIHF1YW50aXplZCBncmF5c2NhbGUgb3V0cHV0IHRoaXMKLSAqIHF1YW50aXplciBpcyBwZXJmZWN0bHkgYWRlcXVhdGUuICBEaXRoZXJpbmcgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHdpdGggdGhpcwotICogcXVhbnRpemVyLCB0aG91Z2ggeW91IGNhbiB0dXJuIGl0IG9mZiBpZiB5b3UgcmVhbGx5IHdhbnQgdG8uCi0gKgotICogSW4gMS1wYXNzIHF1YW50aXphdGlvbiB0aGUgY29sb3JtYXAgbXVzdCBiZSBjaG9zZW4gaW4gYWR2YW5jZSBvZiBzZWVpbmcgdGhlCi0gKiBpbWFnZS4gIFdlIHVzZSBhIG1hcCBjb25zaXN0aW5nIG9mIGFsbCBjb21iaW5hdGlvbnMgb2YgTmNvbG9yc1tpXSBjb2xvcgotICogdmFsdWVzIGZvciB0aGUgaSd0aCBjb21wb25lbnQuICBUaGUgTmNvbG9yc1tdIHZhbHVlcyBhcmUgY2hvc2VuIHNvIHRoYXQKLSAqIHRoZWlyIHByb2R1Y3QsIHRoZSB0b3RhbCBudW1iZXIgb2YgY29sb3JzLCBpcyBubyBtb3JlIHRoYW4gdGhhdCByZXF1ZXN0ZWQuCi0gKiAoSW4gbW9zdCBjYXNlcywgdGhlIHByb2R1Y3Qgd2lsbCBiZSBzb21ld2hhdCBsZXNzLikKLSAqCi0gKiBTaW5jZSB0aGUgY29sb3JtYXAgaXMgb3J0aG9nb25hbCwgdGhlIHJlcHJlc2VudGF0aXZlIHZhbHVlIGZvciBlYWNoIGNvbG9yCi0gKiBjb21wb25lbnQgY2FuIGJlIGRldGVybWluZWQgd2l0aG91dCBjb25zaWRlcmluZyB0aGUgb3RoZXIgY29tcG9uZW50czsKLSAqIHRoZW4gdGhlc2UgaW5kZXhlcyBjYW4gYmUgY29tYmluZWQgaW50byBhIGNvbG9ybWFwIGluZGV4IGJ5IGEgc3RhbmRhcmQKLSAqIE4tZGltZW5zaW9uYWwtYXJyYXktc3Vic2NyaXB0IGNhbGN1bGF0aW9uLiAgTW9zdCBvZiB0aGUgYXJpdGhtZXRpYyBpbnZvbHZlZAotICogY2FuIGJlIHByZWNhbGN1bGF0ZWQgYW5kIHN0b3JlZCBpbiB0aGUgbG9va3VwIHRhYmxlIGNvbG9yaW5kZXhbXS4KLSAqIGNvbG9yaW5kZXhbaV1bal0gbWFwcyBwaXhlbCB2YWx1ZSBqIGluIGNvbXBvbmVudCBpIHRvIHRoZSBuZWFyZXN0Ci0gKiByZXByZXNlbnRhdGl2ZSB2YWx1ZSAoZ3JpZCBwbGFuZSkgZm9yIHRoYXQgY29tcG9uZW50OyB0aGlzIGluZGV4IGlzCi0gKiBtdWx0aXBsaWVkIGJ5IHRoZSBhcnJheSBzdHJpZGUgZm9yIGNvbXBvbmVudCBpLCBzbyB0aGF0IHRoZQotICogaW5kZXggb2YgdGhlIGNvbG9ybWFwIGVudHJ5IGNsb3Nlc3QgdG8gYSBnaXZlbiBwaXhlbCB2YWx1ZSBpcyBqdXN0Ci0gKiAgICBzdW0oIGNvbG9yaW5kZXhbY29tcG9uZW50LW51bWJlcl1bcGl4ZWwtY29tcG9uZW50LXZhbHVlXSApCi0gKiBBc2lkZSBmcm9tIGJlaW5nIGZhc3QsIHRoaXMgc2NoZW1lIGFsbG93cyBmb3IgdmFyaWFibGUgc3BhY2luZyBiZXR3ZWVuCi0gKiByZXByZXNlbnRhdGl2ZSB2YWx1ZXMgd2l0aCBubyBhZGRpdGlvbmFsIGxvb2t1cCBjb3N0LgotICoKLSAqIElmIGdhbW1hIGNvcnJlY3Rpb24gaGFzIGJlZW4gYXBwbGllZCBpbiBjb2xvciBjb252ZXJzaW9uLCBpdCBtaWdodCBiZSB3aXNlCi0gKiB0byBhZGp1c3QgdGhlIGNvbG9yIGdyaWQgc3BhY2luZyBzbyB0aGF0IHRoZSByZXByZXNlbnRhdGl2ZSBjb2xvcnMgYXJlCi0gKiBlcXVpZGlzdGFudCBpbiBsaW5lYXIgc3BhY2UuICBBdCB0aGlzIHdyaXRpbmcsIGdhbW1hIGNvcnJlY3Rpb24gaXMgbm90Ci0gKiBpbXBsZW1lbnRlZCBieSBqZGNvbG9yLCBzbyBub3RoaW5nIGlzIGRvbmUgaGVyZS4KLSAqLwotCi0KLS8qIERlY2xhcmF0aW9ucyBmb3Igb3JkZXJlZCBkaXRoZXJpbmcuCi0gKgotICogV2UgdXNlIGEgc3RhbmRhcmQgMTZ4MTYgb3JkZXJlZCBkaXRoZXIgYXJyYXkuICBUaGUgYmFzaWMgY29uY2VwdCBvZiBvcmRlcmVkCi0gKiBkaXRoZXJpbmcgaXMgZGVzY3JpYmVkIGluIG1hbnkgcmVmZXJlbmNlcywgZm9yIGluc3RhbmNlIERhbGUgU2NodW1hY2hlcidzCi0gKiBjaGFwdGVyIElJLjIgb2YgR3JhcGhpY3MgR2VtcyBJSSAoSmFtZXMgQXJ2bywgZWQuIEFjYWRlbWljIFByZXNzLCAxOTkxKS4KLSAqIEluIHBsYWNlIG9mIFNjaHVtYWNoZXIncyBjb21wYXJpc29ucyBhZ2FpbnN0IGEgInRocmVzaG9sZCIgdmFsdWUsIHdlIGFkZCBhCi0gKiAiZGl0aGVyIiB2YWx1ZSB0byB0aGUgaW5wdXQgcGl4ZWwgYW5kIHRoZW4gcm91bmQgdGhlIHJlc3VsdCB0byB0aGUgbmVhcmVzdAotICogb3V0cHV0IHZhbHVlLiAgVGhlIGRpdGhlciB2YWx1ZSBpcyBlcXVpdmFsZW50IHRvICgwLjUgLSB0aHJlc2hvbGQpIHRpbWVzCi0gKiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBvdXRwdXQgdmFsdWVzLiAgRm9yIG9yZGVyZWQgZGl0aGVyaW5nLCB3ZSBhc3N1bWUgdGhhdAotICogdGhlIG91dHB1dCBjb2xvcnMgYXJlIGVxdWFsbHkgc3BhY2VkOyBpZiBub3QsIHJlc3VsdHMgd2lsbCBwcm9iYWJseSBiZQotICogd29yc2UsIHNpbmNlIHRoZSBkaXRoZXIgbWF5IGJlIHRvbyBtdWNoIG9yIHRvbyBsaXR0bGUgYXQgYSBnaXZlbiBwb2ludC4KLSAqCi0gKiBUaGUgbm9ybWFsIGNhbGN1bGF0aW9uIHdvdWxkIGJlIHRvIGZvcm0gcGl4ZWwgdmFsdWUgKyBkaXRoZXIsIHJhbmdlLWxpbWl0Ci0gKiB0aGlzIHRvIDAuLk1BWEpTQU1QTEUsIGFuZCB0aGVuIGluZGV4IGludG8gdGhlIGNvbG9yaW5kZXggdGFibGUgYXMgdXN1YWwuCi0gKiBXZSBjYW4gc2tpcCB0aGUgc2VwYXJhdGUgcmFuZ2UtbGltaXRpbmcgc3RlcCBieSBleHRlbmRpbmcgdGhlIGNvbG9yaW5kZXgKLSAqIHRhYmxlIGluIGJvdGggZGlyZWN0aW9ucy4KLSAqLwotCi0jZGVmaW5lIE9ESVRIRVJfU0laRSAgMTYJLyogZGltZW5zaW9uIG9mIGRpdGhlciBtYXRyaXggKi8KLS8qIE5COiBpZiBPRElUSEVSX1NJWkUgaXMgbm90IGEgcG93ZXIgb2YgMiwgT0RJVEhFUl9NQVNLIHVzZXMgd2lsbCBicmVhayAqLwotI2RlZmluZSBPRElUSEVSX0NFTExTIChPRElUSEVSX1NJWkUqT0RJVEhFUl9TSVpFKQkvKiAjIGNlbGxzIGluIG1hdHJpeCAqLwotI2RlZmluZSBPRElUSEVSX01BU0sgIChPRElUSEVSX1NJWkUtMSkgLyogbWFzayBmb3Igd3JhcHBpbmcgYXJvdW5kIGNvdW50ZXJzICovCi0KLXR5cGVkZWYgaW50IE9ESVRIRVJfTUFUUklYW09ESVRIRVJfU0laRV1bT0RJVEhFUl9TSVpFXTsKLXR5cGVkZWYgaW50ICgqT0RJVEhFUl9NQVRSSVhfUFRSKVtPRElUSEVSX1NJWkVdOwotCi1zdGF0aWMgY29uc3QgVUlOVDggYmFzZV9kaXRoZXJfbWF0cml4W09ESVRIRVJfU0laRV1bT0RJVEhFUl9TSVpFXSA9IHsKLSAgLyogQmF5ZXIncyBvcmRlci00IGRpdGhlciBhcnJheS4gIEdlbmVyYXRlZCBieSB0aGUgY29kZSBnaXZlbiBpbgotICAgKiBTdGVwaGVuIEhhd2xleSdzIGFydGljbGUgIk9yZGVyZWQgRGl0aGVyaW5nIiBpbiBHcmFwaGljcyBHZW1zIEkuCi0gICAqIFRoZSB2YWx1ZXMgaW4gdGhpcyBhcnJheSBtdXN0IHJhbmdlIGZyb20gMCB0byBPRElUSEVSX0NFTExTLTEuCi0gICAqLwotICB7ICAgMCwxOTIsIDQ4LDI0MCwgMTIsMjA0LCA2MCwyNTIsICAzLDE5NSwgNTEsMjQzLCAxNSwyMDcsIDYzLDI1NSB9LAotICB7IDEyOCwgNjQsMTc2LDExMiwxNDAsIDc2LDE4OCwxMjQsMTMxLCA2NywxNzksMTE1LDE0MywgNzksMTkxLDEyNyB9LAotICB7ICAzMiwyMjQsIDE2LDIwOCwgNDQsMjM2LCAyOCwyMjAsIDM1LDIyNywgMTksMjExLCA0NywyMzksIDMxLDIyMyB9LAotICB7IDE2MCwgOTYsMTQ0LCA4MCwxNzIsMTA4LDE1NiwgOTIsMTYzLCA5OSwxNDcsIDgzLDE3NSwxMTEsMTU5LCA5NSB9LAotICB7ICAgOCwyMDAsIDU2LDI0OCwgIDQsMTk2LCA1MiwyNDQsIDExLDIwMywgNTksMjUxLCAgNywxOTksIDU1LDI0NyB9LAotICB7IDEzNiwgNzIsMTg0LDEyMCwxMzIsIDY4LDE4MCwxMTYsMTM5LCA3NSwxODcsMTIzLDEzNSwgNzEsMTgzLDExOSB9LAotICB7ICA0MCwyMzIsIDI0LDIxNiwgMzYsMjI4LCAyMCwyMTIsIDQzLDIzNSwgMjcsMjE5LCAzOSwyMzEsIDIzLDIxNSB9LAotICB7IDE2OCwxMDQsMTUyLCA4OCwxNjQsMTAwLDE0OCwgODQsMTcxLDEwNywxNTUsIDkxLDE2NywxMDMsMTUxLCA4NyB9LAotICB7ICAgMiwxOTQsIDUwLDI0MiwgMTQsMjA2LCA2MiwyNTQsICAxLDE5MywgNDksMjQxLCAxMywyMDUsIDYxLDI1MyB9LAotICB7IDEzMCwgNjYsMTc4LDExNCwxNDIsIDc4LDE5MCwxMjYsMTI5LCA2NSwxNzcsMTEzLDE0MSwgNzcsMTg5LDEyNSB9LAotICB7ICAzNCwyMjYsIDE4LDIxMCwgNDYsMjM4LCAzMCwyMjIsIDMzLDIyNSwgMTcsMjA5LCA0NSwyMzcsIDI5LDIyMSB9LAotICB7IDE2MiwgOTgsMTQ2LCA4MiwxNzQsMTEwLDE1OCwgOTQsMTYxLCA5NywxNDUsIDgxLDE3MywxMDksMTU3LCA5MyB9LAotICB7ICAxMCwyMDIsIDU4LDI1MCwgIDYsMTk4LCA1NCwyNDYsICA5LDIwMSwgNTcsMjQ5LCAgNSwxOTcsIDUzLDI0NSB9LAotICB7IDEzOCwgNzQsMTg2LDEyMiwxMzQsIDcwLDE4MiwxMTgsMTM3LCA3MywxODUsMTIxLDEzMywgNjksMTgxLDExNyB9LAotICB7ICA0MiwyMzQsIDI2LDIxOCwgMzgsMjMwLCAyMiwyMTQsIDQxLDIzMywgMjUsMjE3LCAzNywyMjksIDIxLDIxMyB9LAotICB7IDE3MCwxMDYsMTU0LCA5MCwxNjYsMTAyLDE1MCwgODYsMTY5LDEwNSwxNTMsIDg5LDE2NSwxMDEsMTQ5LCA4NSB9Ci19OwotCi0KLS8qIERlY2xhcmF0aW9ucyBmb3IgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZy4KLSAqCi0gKiBFcnJvcnMgYXJlIGFjY3VtdWxhdGVkIGludG8gdGhlIGFycmF5IGZzZXJyb3JzW10sIGF0IGEgcmVzb2x1dGlvbiBvZgotICogMS8xNnRoIG9mIGEgcGl4ZWwgY291bnQuICBUaGUgZXJyb3IgYXQgYSBnaXZlbiBwaXhlbCBpcyBwcm9wYWdhdGVkCi0gKiB0byBpdHMgbm90LXlldC1wcm9jZXNzZWQgbmVpZ2hib3JzIHVzaW5nIHRoZSBzdGFuZGFyZCBGLVMgZnJhY3Rpb25zLAotICoJCS4uLgkoaGVyZSkJNy8xNgotICoJCTMvMTYJNS8xNgkxLzE2Ci0gKiBXZSB3b3JrIGxlZnQtdG8tcmlnaHQgb24gZXZlbiByb3dzLCByaWdodC10by1sZWZ0IG9uIG9kZCByb3dzLgotICoKLSAqIFdlIGNhbiBnZXQgYXdheSB3aXRoIGEgc2luZ2xlIGFycmF5IChob2xkaW5nIG9uZSByb3cncyB3b3J0aCBvZiBlcnJvcnMpCi0gKiBieSB1c2luZyBpdCB0byBzdG9yZSB0aGUgY3VycmVudCByb3cncyBlcnJvcnMgYXQgcGl4ZWwgY29sdW1ucyBub3QgeWV0Ci0gKiBwcm9jZXNzZWQsIGJ1dCB0aGUgbmV4dCByb3cncyBlcnJvcnMgYXQgY29sdW1ucyBhbHJlYWR5IHByb2Nlc3NlZC4gIFdlCi0gKiBuZWVkIG9ubHkgYSBmZXcgZXh0cmEgdmFyaWFibGVzIHRvIGhvbGQgdGhlIGVycm9ycyBpbW1lZGlhdGVseSBhcm91bmQgdGhlCi0gKiBjdXJyZW50IGNvbHVtbi4gIChJZiB3ZSBhcmUgbHVja3ksIHRob3NlIHZhcmlhYmxlcyBhcmUgaW4gcmVnaXN0ZXJzLCBidXQKLSAqIGV2ZW4gaWYgbm90LCB0aGV5J3JlIHByb2JhYmx5IGNoZWFwZXIgdG8gYWNjZXNzIHRoYW4gYXJyYXkgZWxlbWVudHMgYXJlLikKLSAqCi0gKiBUaGUgZnNlcnJvcnNbXSBhcnJheSBpcyBpbmRleGVkIFtjb21wb25lbnQjXVtwb3NpdGlvbl0uCi0gKiBXZSBwcm92aWRlICgjY29sdW1ucyArIDIpIGVudHJpZXMgcGVyIGNvbXBvbmVudDsgdGhlIGV4dHJhIGVudHJ5IGF0IGVhY2gKLSAqIGVuZCBzYXZlcyB1cyBmcm9tIHNwZWNpYWwtY2FzaW5nIHRoZSBmaXJzdCBhbmQgbGFzdCBwaXhlbHMuCi0gKgotICogTm90ZTogb24gYSB3aWRlIGltYWdlLCB3ZSBtaWdodCBub3QgaGF2ZSBlbm91Z2ggcm9vbSBpbiBhIFBDJ3MgbmVhciBkYXRhCi0gKiBzZWdtZW50IHRvIGhvbGQgdGhlIGVycm9yIGFycmF5OyBzbyBpdCBpcyBhbGxvY2F0ZWQgd2l0aCBhbGxvY19sYXJnZS4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLXR5cGVkZWYgSU5UMTYgRlNFUlJPUjsJCS8qIDE2IGJpdHMgc2hvdWxkIGJlIGVub3VnaCAqLwotdHlwZWRlZiBpbnQgTE9DRlNFUlJPUjsJCS8qIHVzZSAnaW50JyBmb3IgY2FsY3VsYXRpb24gdGVtcHMgKi8KLSNlbHNlCi10eXBlZGVmIElOVDMyIEZTRVJST1I7CQkvKiBtYXkgbmVlZCBtb3JlIHRoYW4gMTYgYml0cyAqLwotdHlwZWRlZiBJTlQzMiBMT0NGU0VSUk9SOwkvKiBiZSBzdXJlIGNhbGN1bGF0aW9uIHRlbXBzIGFyZSBiaWcgZW5vdWdoICovCi0jZW5kaWYKLQotdHlwZWRlZiBGU0VSUk9SIEZBUiAqRlNFUlJQVFI7CS8qIHBvaW50ZXIgdG8gZXJyb3IgYXJyYXkgKGluIEZBUiBzdG9yYWdlISkgKi8KLQotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi0jZGVmaW5lIE1BWF9RX0NPTVBTIDQJCS8qIG1heCBjb21wb25lbnRzIEkgY2FuIGhhbmRsZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBJbml0aWFsbHkgYWxsb2NhdGVkIGNvbG9ybWFwIGlzIHNhdmVkIGhlcmUgKi8KLSAgSlNBTVBBUlJBWSBzdl9jb2xvcm1hcDsJLyogVGhlIGNvbG9yIG1hcCBhcyBhIDItRCBwaXhlbCBhcnJheSAqLwotICBpbnQgc3ZfYWN0dWFsOwkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdXNlICovCi0KLSAgSlNBTVBBUlJBWSBjb2xvcmluZGV4OwkvKiBQcmVjb21wdXRlZCBtYXBwaW5nIGZvciBzcGVlZCAqLwotICAvKiBjb2xvcmluZGV4W2ldW2pdID0gaW5kZXggb2YgY29sb3IgY2xvc2VzdCB0byBwaXhlbCB2YWx1ZSBqIGluIGNvbXBvbmVudCBpLAotICAgKiBwcmVtdWx0aXBsaWVkIGFzIGRlc2NyaWJlZCBhYm92ZS4gIFNpbmNlIGNvbG9ybWFwIGluZGV4ZXMgbXVzdCBmaXQgaW50bwotICAgKiBKU0FNUExFcywgdGhlIGVudHJpZXMgb2YgdGhpcyBhcnJheSB3aWxsIHRvby4KLSAgICovCi0gIGJvb2xlYW4gaXNfcGFkZGVkOwkJLyogaXMgdGhlIGNvbG9yaW5kZXggcGFkZGVkIGZvciBvZGl0aGVyPyAqLwotCi0gIGludCBOY29sb3JzW01BWF9RX0NPTVBTXTsJLyogIyBvZiB2YWx1ZXMgYWxsb2NlZCB0byBlYWNoIGNvbXBvbmVudCAqLwotCi0gIC8qIFZhcmlhYmxlcyBmb3Igb3JkZXJlZCBkaXRoZXJpbmcgKi8KLSAgaW50IHJvd19pbmRleDsJCS8qIGN1ciByb3cncyB2ZXJ0aWNhbCBpbmRleCBpbiBkaXRoZXIgbWF0cml4ICovCi0gIE9ESVRIRVJfTUFUUklYX1BUUiBvZGl0aGVyW01BWF9RX0NPTVBTXTsgLyogb25lIGRpdGhlciBhcnJheSBwZXIgY29tcG9uZW50ICovCi0KLSAgLyogVmFyaWFibGVzIGZvciBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nICovCi0gIEZTRVJSUFRSIGZzZXJyb3JzW01BWF9RX0NPTVBTXTsgLyogYWNjdW11bGF0ZWQgZXJyb3JzICovCi0gIGJvb2xlYW4gb25fb2RkX3JvdzsJCS8qIGZsYWcgdG8gcmVtZW1iZXIgd2hpY2ggcm93IHdlIGFyZSBvbiAqLwotfSBteV9jcXVhbnRpemVyOwotCi10eXBlZGVmIG15X2NxdWFudGl6ZXIgKiBteV9jcXVhbnRpemVfcHRyOwotCi0KLS8qCi0gKiBQb2xpY3ktbWFraW5nIHN1YnJvdXRpbmVzIGZvciBjcmVhdGVfY29sb3JtYXAgYW5kIGNyZWF0ZV9jb2xvcmluZGV4LgotICogVGhlc2Ugcm91dGluZXMgZGV0ZXJtaW5lIHRoZSBjb2xvcm1hcCB0byBiZSB1c2VkLiAgVGhlIHJlc3Qgb2YgdGhlIG1vZHVsZQotICogb25seSBhc3N1bWVzIHRoYXQgdGhlIGNvbG9ybWFwIGlzIG9ydGhvZ29uYWwuCi0gKgotICogICogc2VsZWN0X25jb2xvcnMgZGVjaWRlcyBob3cgdG8gZGl2dnkgdXAgdGhlIGF2YWlsYWJsZSBjb2xvcnMKLSAqICAgIGFtb25nIHRoZSBjb21wb25lbnRzLgotICogICogb3V0cHV0X3ZhbHVlIGRlZmluZXMgdGhlIHNldCBvZiByZXByZXNlbnRhdGl2ZSB2YWx1ZXMgZm9yIGEgY29tcG9uZW50LgotICogICogbGFyZ2VzdF9pbnB1dF92YWx1ZSBkZWZpbmVzIHRoZSBtYXBwaW5nIGZyb20gaW5wdXQgdmFsdWVzIHRvCi0gKiAgICByZXByZXNlbnRhdGl2ZSB2YWx1ZXMgZm9yIGEgY29tcG9uZW50LgotICogTm90ZSB0aGF0IHRoZSBsYXR0ZXIgdHdvIHJvdXRpbmVzIG1heSBpbXBvc2UgZGlmZmVyZW50IHBvbGljaWVzIGZvcgotICogZGlmZmVyZW50IGNvbXBvbmVudHMsIHRob3VnaCB0aGlzIGlzIG5vdCBjdXJyZW50bHkgZG9uZS4KLSAqLwotCi0KLUxPQ0FMKGludCkKLXNlbGVjdF9uY29sb3JzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgTmNvbG9yc1tdKQotLyogRGV0ZXJtaW5lIGFsbG9jYXRpb24gb2YgZGVzaXJlZCBjb2xvcnMgdG8gY29tcG9uZW50cywgKi8KLS8qIGFuZCBmaWxsIGluIE5jb2xvcnNbXSBhcnJheSB0byBpbmRpY2F0ZSBjaG9pY2UuICovCi0vKiBSZXR1cm4gdmFsdWUgaXMgdG90YWwgbnVtYmVyIG9mIGNvbG9ycyAocHJvZHVjdCBvZiBOY29sb3JzW10gdmFsdWVzKS4gKi8KLXsKLSAgaW50IG5jID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOyAvKiBudW1iZXIgb2YgY29sb3IgY29tcG9uZW50cyAqLwotICBpbnQgbWF4X2NvbG9ycyA9IGNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnM7Ci0gIGludCB0b3RhbF9jb2xvcnMsIGlyb290LCBpLCBqOwotICBib29sZWFuIGNoYW5nZWQ7Ci0gIGxvbmcgdGVtcDsKLSAgc3RhdGljIGNvbnN0IGludCBSR0Jfb3JkZXJbM10gPSB7IFJHQl9HUkVFTiwgUkdCX1JFRCwgUkdCX0JMVUUgfTsKLQotICAvKiBXZSBjYW4gYWxsb2NhdGUgYXQgbGVhc3QgdGhlIG5jJ3RoIHJvb3Qgb2YgbWF4X2NvbG9ycyBwZXIgY29tcG9uZW50LiAqLwotICAvKiBDb21wdXRlIGZsb29yKG5jJ3RoIHJvb3Qgb2YgbWF4X2NvbG9ycykuICovCi0gIGlyb290ID0gMTsKLSAgZG8gewotICAgIGlyb290Kys7Ci0gICAgdGVtcCA9IGlyb290OwkJLyogc2V0IHRlbXAgPSBpcm9vdCAqKiBuYyAqLwotICAgIGZvciAoaSA9IDE7IGkgPCBuYzsgaSsrKQotICAgICAgdGVtcCAqPSBpcm9vdDsKLSAgfSB3aGlsZSAodGVtcCA8PSAobG9uZykgbWF4X2NvbG9ycyk7IC8qIHJlcGVhdCB0aWxsIGlyb290IGV4Y2VlZHMgcm9vdCAqLwotICBpcm9vdC0tOwkJCS8qIG5vdyBpcm9vdCA9IGZsb29yKHJvb3QpICovCi0KLSAgLyogTXVzdCBoYXZlIGF0IGxlYXN0IDIgY29sb3IgdmFsdWVzIHBlciBjb21wb25lbnQgKi8KLSAgaWYgKGlyb290IDwgMikKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9GRVdfQ09MT1JTLCAoaW50KSB0ZW1wKTsKLQotICAvKiBJbml0aWFsaXplIHRvIGlyb290IGNvbG9yIHZhbHVlcyBmb3IgZWFjaCBjb21wb25lbnQgKi8KLSAgdG90YWxfY29sb3JzID0gMTsKLSAgZm9yIChpID0gMDsgaSA8IG5jOyBpKyspIHsKLSAgICBOY29sb3JzW2ldID0gaXJvb3Q7Ci0gICAgdG90YWxfY29sb3JzICo9IGlyb290OwotICB9Ci0gIC8qIFdlIG1heSBiZSBhYmxlIHRvIGluY3JlbWVudCB0aGUgY291bnQgZm9yIG9uZSBvciBtb3JlIGNvbXBvbmVudHMgd2l0aG91dAotICAgKiBleGNlZWRpbmcgbWF4X2NvbG9ycywgdGhvdWdoIHdlIGtub3cgbm90IGFsbCBjYW4gYmUgaW5jcmVtZW50ZWQuCi0gICAqIFNvbWV0aW1lcywgdGhlIGZpcnN0IGNvbXBvbmVudCBjYW4gYmUgaW5jcmVtZW50ZWQgbW9yZSB0aGFuIG9uY2UhCi0gICAqIChFeGFtcGxlOiBmb3IgMTYgY29sb3JzLCB3ZSBzdGFydCBhdCAyKjIqMiwgZ28gdG8gMyoyKjIsIHRoZW4gNCoyKjIuKQotICAgKiBJbiBSR0IgY29sb3JzcGFjZSwgdHJ5IHRvIGluY3JlbWVudCBHIGZpcnN0LCB0aGVuIFIsIHRoZW4gQi4KLSAgICovCi0gIGRvIHsKLSAgICBjaGFuZ2VkID0gRkFMU0U7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5jOyBpKyspIHsKLSAgICAgIGogPSAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCID8gUkdCX29yZGVyW2ldIDogaSk7Ci0gICAgICAvKiBjYWxjdWxhdGUgbmV3IHRvdGFsX2NvbG9ycyBpZiBOY29sb3JzW2pdIGlzIGluY3JlbWVudGVkICovCi0gICAgICB0ZW1wID0gdG90YWxfY29sb3JzIC8gTmNvbG9yc1tqXTsKLSAgICAgIHRlbXAgKj0gTmNvbG9yc1tqXSsxOwkvKiBkb25lIGluIGxvbmcgYXJpdGggdG8gYXZvaWQgb2ZsbyAqLwotICAgICAgaWYgKHRlbXAgPiAobG9uZykgbWF4X2NvbG9ycykKLQlicmVhazsJCQkvKiB3b24ndCBmaXQsIGRvbmUgd2l0aCB0aGlzIHBhc3MgKi8KLSAgICAgIE5jb2xvcnNbal0rKzsJCS8qIE9LLCBhcHBseSB0aGUgaW5jcmVtZW50ICovCi0gICAgICB0b3RhbF9jb2xvcnMgPSAoaW50KSB0ZW1wOwotICAgICAgY2hhbmdlZCA9IFRSVUU7Ci0gICAgfQotICB9IHdoaWxlIChjaGFuZ2VkKTsKLQotICByZXR1cm4gdG90YWxfY29sb3JzOwotfQotCi0KLUxPQ0FMKGludCkKLW91dHB1dF92YWx1ZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGNpLCBpbnQgaiwgaW50IG1heGopCi0vKiBSZXR1cm4gaid0aCBvdXRwdXQgdmFsdWUsIHdoZXJlIGogd2lsbCByYW5nZSBmcm9tIDAgdG8gbWF4aiAqLwotLyogVGhlIG91dHB1dCB2YWx1ZXMgbXVzdCBmYWxsIGluIDAuLk1BWEpTQU1QTEUgaW4gaW5jcmVhc2luZyBvcmRlciAqLwotewotICAvKiBXZSBhbHdheXMgcHJvdmlkZSB2YWx1ZXMgMCBhbmQgTUFYSlNBTVBMRSBmb3IgZWFjaCBjb21wb25lbnQ7Ci0gICAqIGFueSBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgZXF1YWxseSBzcGFjZWQgYmV0d2VlbiB0aGVzZSBsaW1pdHMuCi0gICAqIChGb3JjaW5nIHRoZSB1cHBlciBhbmQgbG93ZXIgdmFsdWVzIHRvIHRoZSBsaW1pdHMgZW5zdXJlcyB0aGF0Ci0gICAqIGRpdGhlcmluZyBjYW4ndCBwcm9kdWNlIGEgY29sb3Igb3V0c2lkZSB0aGUgc2VsZWN0ZWQgZ2FtdXQuKQotICAgKi8KLSAgcmV0dXJuIChpbnQpICgoKElOVDMyKSBqICogTUFYSlNBTVBMRSArIG1heGovMikgLyBtYXhqKTsKLX0KLQotCi1MT0NBTChpbnQpCi1sYXJnZXN0X2lucHV0X3ZhbHVlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgY2ksIGludCBqLCBpbnQgbWF4aikKLS8qIFJldHVybiBsYXJnZXN0IGlucHV0IHZhbHVlIHRoYXQgc2hvdWxkIG1hcCB0byBqJ3RoIG91dHB1dCB2YWx1ZSAqLwotLyogTXVzdCBoYXZlIGxhcmdlc3Qoaj0wKSA+PSAwLCBhbmQgbGFyZ2VzdChqPW1heGopID49IE1BWEpTQU1QTEUgKi8KLXsKLSAgLyogQnJlYWtwb2ludHMgYXJlIGhhbGZ3YXkgYmV0d2VlbiB2YWx1ZXMgcmV0dXJuZWQgYnkgb3V0cHV0X3ZhbHVlICovCi0gIHJldHVybiAoaW50KSAoKChJTlQzMikgKDIqaiArIDEpICogTUFYSlNBTVBMRSArIG1heGopIC8gKDIqbWF4aikpOwotfQotCi0KLS8qCi0gKiBDcmVhdGUgdGhlIGNvbG9ybWFwLgotICovCi0KLUxPQ0FMKHZvaWQpCi1jcmVhdGVfY29sb3JtYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIEpTQU1QQVJSQVkgY29sb3JtYXA7CQkvKiBDcmVhdGVkIGNvbG9ybWFwICovCi0gIGludCB0b3RhbF9jb2xvcnM7CQkvKiBOdW1iZXIgb2YgZGlzdGluY3Qgb3V0cHV0IGNvbG9ycyAqLwotICBpbnQgaSxqLGssIG5jaSwgYmxrc2l6ZSwgYmxrZGlzdCwgcHRyLCB2YWw7Ci0KLSAgLyogU2VsZWN0IG51bWJlciBvZiBjb2xvcnMgZm9yIGVhY2ggY29tcG9uZW50ICovCi0gIHRvdGFsX2NvbG9ycyA9IHNlbGVjdF9uY29sb3JzKGNpbmZvLCBjcXVhbnRpemUtPk5jb2xvcnMpOwotCi0gIC8qIFJlcG9ydCBzZWxlY3RlZCBjb2xvciBjb3VudHMgKi8KLSAgaWYgKGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9PSAzKQotICAgIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX1FVQU5UXzNfTkNPTE9SUywKLQkgICAgIHRvdGFsX2NvbG9ycywgY3F1YW50aXplLT5OY29sb3JzWzBdLAotCSAgICAgY3F1YW50aXplLT5OY29sb3JzWzFdLCBjcXVhbnRpemUtPk5jb2xvcnNbMl0pOwotICBlbHNlCi0gICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfUVVBTlRfTkNPTE9SUywgdG90YWxfY29sb3JzKTsKLQotICAvKiBBbGxvY2F0ZSBhbmQgZmlsbCBpbiB0aGUgY29sb3JtYXAuICovCi0gIC8qIFRoZSBjb2xvcnMgYXJlIG9yZGVyZWQgaW4gdGhlIG1hcCBpbiBzdGFuZGFyZCByb3ctbWFqb3Igb3JkZXIsICovCi0gIC8qIGkuZS4gcmlnaHRtb3N0IChoaWdoZXN0LWluZGV4ZWQpIGNvbG9yIGNoYW5nZXMgbW9zdCByYXBpZGx5LiAqLwotCi0gIGNvbG9ybWFwID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgKEpESU1FTlNJT04pIHRvdGFsX2NvbG9ycywgKEpESU1FTlNJT04pIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyk7Ci0KLSAgLyogYmxrc2l6ZSBpcyBudW1iZXIgb2YgYWRqYWNlbnQgcmVwZWF0ZWQgZW50cmllcyBmb3IgYSBjb21wb25lbnQgKi8KLSAgLyogYmxrZGlzdCBpcyBkaXN0YW5jZSBiZXR3ZWVuIGdyb3VwcyBvZiBpZGVudGljYWwgZW50cmllcyBmb3IgYSBjb21wb25lbnQgKi8KLSAgYmxrZGlzdCA9IHRvdGFsX2NvbG9yczsKLQotICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOyBpKyspIHsKLSAgICAvKiBmaWxsIGluIGNvbG9ybWFwIGVudHJpZXMgZm9yIGkndGggY29sb3IgY29tcG9uZW50ICovCi0gICAgbmNpID0gY3F1YW50aXplLT5OY29sb3JzW2ldOyAvKiAjIG9mIGRpc3RpbmN0IHZhbHVlcyBmb3IgdGhpcyBjb2xvciAqLwotICAgIGJsa3NpemUgPSBibGtkaXN0IC8gbmNpOwotICAgIGZvciAoaiA9IDA7IGogPCBuY2k7IGorKykgewotICAgICAgLyogQ29tcHV0ZSBqJ3RoIG91dHB1dCB2YWx1ZSAob3V0IG9mIG5jaSkgZm9yIGNvbXBvbmVudCAqLwotICAgICAgdmFsID0gb3V0cHV0X3ZhbHVlKGNpbmZvLCBpLCBqLCBuY2ktMSk7Ci0gICAgICAvKiBGaWxsIGluIGFsbCBjb2xvcm1hcCBlbnRyaWVzIHRoYXQgaGF2ZSB0aGlzIHZhbHVlIG9mIHRoaXMgY29tcG9uZW50ICovCi0gICAgICBmb3IgKHB0ciA9IGogKiBibGtzaXplOyBwdHIgPCB0b3RhbF9jb2xvcnM7IHB0ciArPSBibGtkaXN0KSB7Ci0JLyogZmlsbCBpbiBibGtzaXplIGVudHJpZXMgYmVnaW5uaW5nIGF0IHB0ciAqLwotCWZvciAoayA9IDA7IGsgPCBibGtzaXplOyBrKyspCi0JICBjb2xvcm1hcFtpXVtwdHIra10gPSAoSlNBTVBMRSkgdmFsOwotICAgICAgfQotICAgIH0KLSAgICBibGtkaXN0ID0gYmxrc2l6ZTsJCS8qIGJsa3NpemUgb2YgdGhpcyBjb2xvciBpcyBibGtkaXN0IG9mIG5leHQgKi8KLSAgfQotCi0gIC8qIFNhdmUgdGhlIGNvbG9ybWFwIGluIHByaXZhdGUgc3RvcmFnZSwKLSAgICogd2hlcmUgaXQgd2lsbCBzdXJ2aXZlIGNvbG9yIHF1YW50aXphdGlvbiBtb2RlIGNoYW5nZXMuCi0gICAqLwotICBjcXVhbnRpemUtPnN2X2NvbG9ybWFwID0gY29sb3JtYXA7Ci0gIGNxdWFudGl6ZS0+c3ZfYWN0dWFsID0gdG90YWxfY29sb3JzOwotfQotCi0KLS8qCi0gKiBDcmVhdGUgdGhlIGNvbG9yIGluZGV4IHRhYmxlLgotICovCi0KLUxPQ0FMKHZvaWQpCi1jcmVhdGVfY29sb3JpbmRleCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgSlNBTVBST1cgaW5kZXhwdHI7Ci0gIGludCBpLGosaywgbmNpLCBibGtzaXplLCB2YWwsIHBhZDsKLQotICAvKiBGb3Igb3JkZXJlZCBkaXRoZXIsIHdlIHBhZCB0aGUgY29sb3IgaW5kZXggdGFibGVzIGJ5IE1BWEpTQU1QTEUgaW4KLSAgICogZWFjaCBkaXJlY3Rpb24gKGlucHV0IGluZGV4IHZhbHVlcyBjYW4gYmUgLU1BWEpTQU1QTEUgLi4gMipNQVhKU0FNUExFKS4KLSAgICogVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGluIHRoZSBvdGhlciBkaXRoZXJpbmcgbW9kZXMuICBIb3dldmVyLCB3ZQotICAgKiBmbGFnIHdoZXRoZXIgaXQgd2FzIGRvbmUgaW4gY2FzZSB1c2VyIGNoYW5nZXMgZGl0aGVyaW5nIG1vZGUuCi0gICAqLwotICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfT1JERVJFRCkgewotICAgIHBhZCA9IE1BWEpTQU1QTEUqMjsKLSAgICBjcXVhbnRpemUtPmlzX3BhZGRlZCA9IFRSVUU7Ci0gIH0gZWxzZSB7Ci0gICAgcGFkID0gMDsKLSAgICBjcXVhbnRpemUtPmlzX3BhZGRlZCA9IEZBTFNFOwotICB9Ci0KLSAgY3F1YW50aXplLT5jb2xvcmluZGV4ID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgKEpESU1FTlNJT04pIChNQVhKU0FNUExFKzEgKyBwYWQpLAotICAgICAoSkRJTUVOU0lPTikgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzKTsKLQotICAvKiBibGtzaXplIGlzIG51bWJlciBvZiBhZGphY2VudCByZXBlYXRlZCBlbnRyaWVzIGZvciBhIGNvbXBvbmVudCAqLwotICBibGtzaXplID0gY3F1YW50aXplLT5zdl9hY3R1YWw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7Ci0gICAgLyogZmlsbCBpbiBjb2xvcmluZGV4IGVudHJpZXMgZm9yIGkndGggY29sb3IgY29tcG9uZW50ICovCi0gICAgbmNpID0gY3F1YW50aXplLT5OY29sb3JzW2ldOyAvKiAjIG9mIGRpc3RpbmN0IHZhbHVlcyBmb3IgdGhpcyBjb2xvciAqLwotICAgIGJsa3NpemUgPSBibGtzaXplIC8gbmNpOwotCi0gICAgLyogYWRqdXN0IGNvbG9yaW5kZXggcG9pbnRlcnMgdG8gcHJvdmlkZSBwYWRkaW5nIGF0IG5lZ2F0aXZlIGluZGV4ZXMuICovCi0gICAgaWYgKHBhZCkKLSAgICAgIGNxdWFudGl6ZS0+Y29sb3JpbmRleFtpXSArPSBNQVhKU0FNUExFOwotCi0gICAgLyogaW4gbG9vcCwgdmFsID0gaW5kZXggb2YgY3VycmVudCBvdXRwdXQgdmFsdWUsICovCi0gICAgLyogYW5kIGsgPSBsYXJnZXN0IGogdGhhdCBtYXBzIHRvIGN1cnJlbnQgdmFsICovCi0gICAgaW5kZXhwdHIgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbaV07Ci0gICAgdmFsID0gMDsKLSAgICBrID0gbGFyZ2VzdF9pbnB1dF92YWx1ZShjaW5mbywgaSwgMCwgbmNpLTEpOwotICAgIGZvciAoaiA9IDA7IGogPD0gTUFYSlNBTVBMRTsgaisrKSB7Ci0gICAgICB3aGlsZSAoaiA+IGspCQkvKiBhZHZhbmNlIHZhbCBpZiBwYXN0IGJvdW5kYXJ5ICovCi0JayA9IGxhcmdlc3RfaW5wdXRfdmFsdWUoY2luZm8sIGksICsrdmFsLCBuY2ktMSk7Ci0gICAgICAvKiBwcmVtdWx0aXBseSBzbyB0aGF0IG5vIG11bHRpcGxpY2F0aW9uIG5lZWRlZCBpbiBtYWluIHByb2Nlc3NpbmcgKi8KLSAgICAgIGluZGV4cHRyW2pdID0gKEpTQU1QTEUpICh2YWwgKiBibGtzaXplKTsKLSAgICB9Ci0gICAgLyogUGFkIGF0IGJvdGggZW5kcyBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAocGFkKQotICAgICAgZm9yIChqID0gMTsgaiA8PSBNQVhKU0FNUExFOyBqKyspIHsKLQlpbmRleHB0clstal0gPSBpbmRleHB0clswXTsKLQlpbmRleHB0cltNQVhKU0FNUExFK2pdID0gaW5kZXhwdHJbTUFYSlNBTVBMRV07Ci0gICAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogQ3JlYXRlIGFuIG9yZGVyZWQtZGl0aGVyIGFycmF5IGZvciBhIGNvbXBvbmVudCBoYXZpbmcgbmNvbG9ycwotICogZGlzdGluY3Qgb3V0cHV0IHZhbHVlcy4KLSAqLwotCi1MT0NBTChPRElUSEVSX01BVFJJWF9QVFIpCi1tYWtlX29kaXRoZXJfYXJyYXkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBuY29sb3JzKQotewotICBPRElUSEVSX01BVFJJWF9QVFIgb2RpdGhlcjsKLSAgaW50IGosazsKLSAgSU5UMzIgbnVtLGRlbjsKLQotICBvZGl0aGVyID0gKE9ESVRIRVJfTUFUUklYX1BUUikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihPRElUSEVSX01BVFJJWCkpOwotICAvKiBUaGUgaW50ZXItdmFsdWUgZGlzdGFuY2UgZm9yIHRoaXMgY29sb3IgaXMgTUFYSlNBTVBMRS8obmNvbG9ycy0xKS4KLSAgICogSGVuY2UgdGhlIGRpdGhlciB2YWx1ZSBmb3IgdGhlIG1hdHJpeCBjZWxsIHdpdGggZmlsbCBvcmRlciBmCi0gICAqIChmPTAuLk4tMSkgc2hvdWxkIGJlIChOLTEtMipmKS8oMipOKSAqIE1BWEpTQU1QTEUvKG5jb2xvcnMtMSkuCi0gICAqIE9uIDE2LWJpdC1pbnQgbWFjaGluZSwgYmUgY2FyZWZ1bCB0byBhdm9pZCBvdmVyZmxvdy4KLSAgICovCi0gIGRlbiA9IDIgKiBPRElUSEVSX0NFTExTICogKChJTlQzMikgKG5jb2xvcnMgLSAxKSk7Ci0gIGZvciAoaiA9IDA7IGogPCBPRElUSEVSX1NJWkU7IGorKykgewotICAgIGZvciAoayA9IDA7IGsgPCBPRElUSEVSX1NJWkU7IGsrKykgewotICAgICAgbnVtID0gKChJTlQzMikgKE9ESVRIRVJfQ0VMTFMtMSAtIDIqKChpbnQpYmFzZV9kaXRoZXJfbWF0cml4W2pdW2tdKSkpCi0JICAgICogTUFYSlNBTVBMRTsKLSAgICAgIC8qIEVuc3VyZSByb3VuZCB0b3dhcmRzIHplcm8gZGVzcGl0ZSBDJ3MgbGFjayBvZiBjb25zaXN0ZW5jeQotICAgICAgICogYWJvdXQgcm91bmRpbmcgbmVnYXRpdmUgdmFsdWVzIGluIGludGVnZXIgZGl2aXNpb24uLi4KLSAgICAgICAqLwotICAgICAgb2RpdGhlcltqXVtrXSA9IChpbnQpIChudW08MCA/IC0oKC1udW0pL2RlbikgOiBudW0vZGVuKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG9kaXRoZXI7Ci19Ci0KLQotLyoKLSAqIENyZWF0ZSB0aGUgb3JkZXJlZC1kaXRoZXIgdGFibGVzLgotICogQ29tcG9uZW50cyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIHJlcHJlc2VudGF0aXZlIGNvbG9ycyBtYXkgCi0gKiBzaGFyZSBhIGRpdGhlciB0YWJsZS4KLSAqLwotCi1MT0NBTCh2b2lkKQotY3JlYXRlX29kaXRoZXJfdGFibGVzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOwotICBPRElUSEVSX01BVFJJWF9QVFIgb2RpdGhlcjsKLSAgaW50IGksIGosIG5jaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOyBpKyspIHsKLSAgICBuY2kgPSBjcXVhbnRpemUtPk5jb2xvcnNbaV07IC8qICMgb2YgZGlzdGluY3QgdmFsdWVzIGZvciB0aGlzIGNvbG9yICovCi0gICAgb2RpdGhlciA9IE5VTEw7CQkvKiBzZWFyY2ggZm9yIG1hdGNoaW5nIHByaW9yIGNvbXBvbmVudCAqLwotICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKLSAgICAgIGlmIChuY2kgPT0gY3F1YW50aXplLT5OY29sb3JzW2pdKSB7Ci0Jb2RpdGhlciA9IGNxdWFudGl6ZS0+b2RpdGhlcltqXTsKLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG9kaXRoZXIgPT0gTlVMTCkJLyogbmVlZCBhIG5ldyB0YWJsZT8gKi8KLSAgICAgIG9kaXRoZXIgPSBtYWtlX29kaXRoZXJfYXJyYXkoY2luZm8sIG5jaSk7Ci0gICAgY3F1YW50aXplLT5vZGl0aGVyW2ldID0gb2RpdGhlcjsKLSAgfQotfQotCi0KLS8qCi0gKiBNYXAgc29tZSByb3dzIG9mIHBpeGVscyB0byB0aGUgb3V0cHV0IGNvbG9ybWFwcGVkIHJlcHJlc2VudGF0aW9uLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotY29sb3JfcXVhbnRpemUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAotCQlKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLS8qIEdlbmVyYWwgY2FzZSwgbm8gZGl0aGVyaW5nICovCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIEpTQU1QQVJSQVkgY29sb3JpbmRleCA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleDsKLSAgcmVnaXN0ZXIgaW50IHBpeGNvZGUsIGNpOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHJpbiwgcHRyb3V0OwotICBpbnQgcm93OwotICBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIHJlZ2lzdGVyIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgewotICAgIHB0cmluID0gaW5wdXRfYnVmW3Jvd107Ci0gICAgcHRyb3V0ID0gb3V0cHV0X2J1Zltyb3ddOwotICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgICBwaXhjb2RlID0gMDsKLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7Ci0JcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXhbY2ldW0dFVEpTQU1QTEUoKnB0cmluKyspXSk7Ci0gICAgICB9Ci0gICAgICAqcHRyb3V0KysgPSAoSlNBTVBMRSkgcGl4Y29kZTsKLSAgICB9Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLWNvbG9yX3F1YW50aXplMyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLS8qIEZhc3QgcGF0aCBmb3Igb3V0X2NvbG9yX2NvbXBvbmVudHM9PTMsIG5vIGRpdGhlcmluZyAqLwotewotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOwotICByZWdpc3RlciBpbnQgcGl4Y29kZTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyaW4sIHB0cm91dDsKLSAgSlNBTVBST1cgY29sb3JpbmRleDAgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMF07Ci0gIEpTQU1QUk9XIGNvbG9yaW5kZXgxID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzFdOwotICBKU0FNUFJPVyBjb2xvcmluZGV4MiA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFsyXTsKLSAgaW50IHJvdzsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotCi0gIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7Ci0gICAgcHRyaW4gPSBpbnB1dF9idWZbcm93XTsKLSAgICBwdHJvdXQgPSBvdXRwdXRfYnVmW3Jvd107Ci0gICAgZm9yIChjb2wgPSB3aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAgIHBpeGNvZGUgID0gR0VUSlNBTVBMRShjb2xvcmluZGV4MFtHRVRKU0FNUExFKCpwdHJpbisrKV0pOwotICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgxW0dFVEpTQU1QTEUoKnB0cmluKyspXSk7Ci0gICAgICBwaXhjb2RlICs9IEdFVEpTQU1QTEUoY29sb3JpbmRleDJbR0VUSlNBTVBMRSgqcHRyaW4rKyldKTsKLSAgICAgICpwdHJvdXQrKyA9IChKU0FNUExFKSBwaXhjb2RlOwotICAgIH0KLSAgfQotfQotCi0KLU1FVEhPRERFRih2b2lkKQotcXVhbnRpemVfb3JkX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCi0JCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi0vKiBHZW5lcmFsIGNhc2UsIHdpdGggb3JkZXJlZCBkaXRoZXJpbmcgKi8KLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdXRfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdXRfcHRyOwotICBKU0FNUFJPVyBjb2xvcmluZGV4X2NpOwotICBpbnQgKiBkaXRoZXI7CQkJLyogcG9pbnRzIHRvIGFjdGl2ZSByb3cgb2YgZGl0aGVyIG1hdHJpeCAqLwotICBpbnQgcm93X2luZGV4LCBjb2xfaW5kZXg7CS8qIGN1cnJlbnQgaW5kZXhlcyBpbnRvIGRpdGhlciBtYXRyaXggKi8KLSAgaW50IG5jID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOwotICBpbnQgY2k7Ci0gIGludCByb3c7Ci0gIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgewotICAgIC8qIEluaXRpYWxpemUgb3V0cHV0IHZhbHVlcyB0byAwIHNvIGNhbiBwcm9jZXNzIGNvbXBvbmVudHMgc2VwYXJhdGVseSAqLwotICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgb3V0cHV0X2J1Zltyb3ddLAotCSAgICAgIChzaXplX3QpICh3aWR0aCAqIFNJWkVPRihKU0FNUExFKSkpOwotICAgIHJvd19pbmRleCA9IGNxdWFudGl6ZS0+cm93X2luZGV4OwotICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7Ci0gICAgICBpbnB1dF9wdHIgPSBpbnB1dF9idWZbcm93XSArIGNpOwotICAgICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbcm93XTsKLSAgICAgIGNvbG9yaW5kZXhfY2kgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbY2ldOwotICAgICAgZGl0aGVyID0gY3F1YW50aXplLT5vZGl0aGVyW2NpXVtyb3dfaW5kZXhdOwotICAgICAgY29sX2luZGV4ID0gMDsKLQotICAgICAgZm9yIChjb2wgPSB3aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLQkvKiBGb3JtIHBpeGVsIHZhbHVlICsgZGl0aGVyLCByYW5nZS1saW1pdCB0byAwLi5NQVhKU0FNUExFLAotCSAqIHNlbGVjdCBvdXRwdXQgdmFsdWUsIGFjY3VtdWxhdGUgaW50byBvdXRwdXQgY29kZSBmb3IgdGhpcyBwaXhlbC4KLQkgKiBSYW5nZS1saW1pdGluZyBuZWVkIG5vdCBiZSBkb25lIGV4cGxpY2l0bHksIGFzIHdlIGhhdmUgZXh0ZW5kZWQKLQkgKiB0aGUgY29sb3JpbmRleCB0YWJsZSB0byBwcm9kdWNlIHRoZSByaWdodCBhbnN3ZXJzIGZvciBvdXQtb2YtcmFuZ2UKLQkgKiBpbnB1dHMuICBUaGUgbWF4aW11bSBkaXRoZXIgaXMgKy0gTUFYSlNBTVBMRTsgdGhpcyBzZXRzIHRoZQotCSAqIHJlcXVpcmVkIGFtb3VudCBvZiBwYWRkaW5nLgotCSAqLwotCSpvdXRwdXRfcHRyICs9IGNvbG9yaW5kZXhfY2lbR0VUSlNBTVBMRSgqaW5wdXRfcHRyKStkaXRoZXJbY29sX2luZGV4XV07Ci0JaW5wdXRfcHRyICs9IG5jOwotCW91dHB1dF9wdHIrKzsKLQljb2xfaW5kZXggPSAoY29sX2luZGV4ICsgMSkgJiBPRElUSEVSX01BU0s7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIEFkdmFuY2Ugcm93IGluZGV4IGZvciBuZXh0IHJvdyAqLwotICAgIHJvd19pbmRleCA9IChyb3dfaW5kZXggKyAxKSAmIE9ESVRIRVJfTUFTSzsKLSAgICBjcXVhbnRpemUtPnJvd19pbmRleCA9IHJvd19pbmRleDsKLSAgfQotfQotCi0KLU1FVEhPRERFRih2b2lkKQotcXVhbnRpemUzX29yZF9kaXRoZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAotCQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLS8qIEZhc3QgcGF0aCBmb3Igb3V0X2NvbG9yX2NvbXBvbmVudHM9PTMsIHdpdGggb3JkZXJlZCBkaXRoZXJpbmcgKi8KLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgcmVnaXN0ZXIgaW50IHBpeGNvZGU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHV0X3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHV0X3B0cjsKLSAgSlNBTVBST1cgY29sb3JpbmRleDAgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMF07Ci0gIEpTQU1QUk9XIGNvbG9yaW5kZXgxID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzFdOwotICBKU0FNUFJPVyBjb2xvcmluZGV4MiA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFsyXTsKLSAgaW50ICogZGl0aGVyMDsJCS8qIHBvaW50cyB0byBhY3RpdmUgcm93IG9mIGRpdGhlciBtYXRyaXggKi8KLSAgaW50ICogZGl0aGVyMTsKLSAgaW50ICogZGl0aGVyMjsKLSAgaW50IHJvd19pbmRleCwgY29sX2luZGV4OwkvKiBjdXJyZW50IGluZGV4ZXMgaW50byBkaXRoZXIgbWF0cml4ICovCi0gIGludCByb3c7Ci0gIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgewotICAgIHJvd19pbmRleCA9IGNxdWFudGl6ZS0+cm93X2luZGV4OwotICAgIGlucHV0X3B0ciA9IGlucHV0X2J1Zltyb3ddOwotICAgIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW3Jvd107Ci0gICAgZGl0aGVyMCA9IGNxdWFudGl6ZS0+b2RpdGhlclswXVtyb3dfaW5kZXhdOwotICAgIGRpdGhlcjEgPSBjcXVhbnRpemUtPm9kaXRoZXJbMV1bcm93X2luZGV4XTsKLSAgICBkaXRoZXIyID0gY3F1YW50aXplLT5vZGl0aGVyWzJdW3Jvd19pbmRleF07Ci0gICAgY29sX2luZGV4ID0gMDsKLQotICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgICBwaXhjb2RlICA9IEdFVEpTQU1QTEUoY29sb3JpbmRleDBbR0VUSlNBTVBMRSgqaW5wdXRfcHRyKyspICsKLQkJCQkJZGl0aGVyMFtjb2xfaW5kZXhdXSk7Ci0gICAgICBwaXhjb2RlICs9IEdFVEpTQU1QTEUoY29sb3JpbmRleDFbR0VUSlNBTVBMRSgqaW5wdXRfcHRyKyspICsKLQkJCQkJZGl0aGVyMVtjb2xfaW5kZXhdXSk7Ci0gICAgICBwaXhjb2RlICs9IEdFVEpTQU1QTEUoY29sb3JpbmRleDJbR0VUSlNBTVBMRSgqaW5wdXRfcHRyKyspICsKLQkJCQkJZGl0aGVyMltjb2xfaW5kZXhdXSk7Ci0gICAgICAqb3V0cHV0X3B0cisrID0gKEpTQU1QTEUpIHBpeGNvZGU7Ci0gICAgICBjb2xfaW5kZXggPSAoY29sX2luZGV4ICsgMSkgJiBPRElUSEVSX01BU0s7Ci0gICAgfQotICAgIHJvd19pbmRleCA9IChyb3dfaW5kZXggKyAxKSAmIE9ESVRIRVJfTUFTSzsKLSAgICBjcXVhbnRpemUtPnJvd19pbmRleCA9IHJvd19pbmRleDsKLSAgfQotfQotCi0KLU1FVEhPRERFRih2b2lkKQotcXVhbnRpemVfZnNfZGl0aGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKLQkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotLyogR2VuZXJhbCBjYXNlLCB3aXRoIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgKi8KLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgcmVnaXN0ZXIgTE9DRlNFUlJPUiBjdXI7CS8qIGN1cnJlbnQgZXJyb3Igb3IgcGl4ZWwgdmFsdWUgKi8KLSAgTE9DRlNFUlJPUiBiZWxvd2VycjsJCS8qIGVycm9yIGZvciBwaXhlbCBiZWxvdyBjdXIgKi8KLSAgTE9DRlNFUlJPUiBicHJldmVycjsJCS8qIGVycm9yIGZvciBiZWxvdy9wcmV2IGNvbCAqLwotICBMT0NGU0VSUk9SIGJuZXh0ZXJyOwkJLyogZXJyb3IgZm9yIGJlbG93L25leHQgY29sICovCi0gIExPQ0ZTRVJST1IgZGVsdGE7Ci0gIHJlZ2lzdGVyIEZTRVJSUFRSIGVycm9ycHRyOwkvKiA9PiBmc2Vycm9yc1tdIGF0IGNvbHVtbiBiZWZvcmUgY3VycmVudCAqLwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB1dF9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB1dF9wdHI7Ci0gIEpTQU1QUk9XIGNvbG9yaW5kZXhfY2k7Ci0gIEpTQU1QUk9XIGNvbG9ybWFwX2NpOwotICBpbnQgcGl4Y29kZTsKLSAgaW50IG5jID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOwotICBpbnQgZGlyOwkJCS8qIDEgZm9yIGxlZnQtdG8tcmlnaHQsIC0xIGZvciByaWdodC10by1sZWZ0ICovCi0gIGludCBkaXJuYzsJCQkvKiBkaXIgKiBuYyAqLwotICBpbnQgY2k7Ci0gIGludCByb3c7Ci0gIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICBTSElGVF9URU1QUwotCi0gIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7Ci0gICAgLyogSW5pdGlhbGl6ZSBvdXRwdXQgdmFsdWVzIHRvIDAgc28gY2FuIHByb2Nlc3MgY29tcG9uZW50cyBzZXBhcmF0ZWx5ICovCi0gICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBvdXRwdXRfYnVmW3Jvd10sCi0JICAgICAgKHNpemVfdCkgKHdpZHRoICogU0laRU9GKEpTQU1QTEUpKSk7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgbmM7IGNpKyspIHsKLSAgICAgIGlucHV0X3B0ciA9IGlucHV0X2J1Zltyb3ddICsgY2k7Ci0gICAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltyb3ddOwotICAgICAgaWYgKGNxdWFudGl6ZS0+b25fb2RkX3JvdykgewotCS8qIHdvcmsgcmlnaHQgdG8gbGVmdCBpbiB0aGlzIHJvdyAqLwotCWlucHV0X3B0ciArPSAod2lkdGgtMSkgKiBuYzsgLyogc28gcG9pbnQgdG8gcmlnaHRtb3N0IHBpeGVsICovCi0Jb3V0cHV0X3B0ciArPSB3aWR0aC0xOwotCWRpciA9IC0xOwotCWRpcm5jID0gLW5jOwotCWVycm9ycHRyID0gY3F1YW50aXplLT5mc2Vycm9yc1tjaV0gKyAod2lkdGgrMSk7IC8qID0+IGVudHJ5IGFmdGVyIGxhc3QgY29sdW1uICovCi0gICAgICB9IGVsc2UgewotCS8qIHdvcmsgbGVmdCB0byByaWdodCBpbiB0aGlzIHJvdyAqLwotCWRpciA9IDE7Ci0JZGlybmMgPSBuYzsKLQllcnJvcnB0ciA9IGNxdWFudGl6ZS0+ZnNlcnJvcnNbY2ldOyAvKiA9PiBlbnRyeSBiZWZvcmUgZmlyc3QgY29sdW1uICovCi0gICAgICB9Ci0gICAgICBjb2xvcmluZGV4X2NpID0gY3F1YW50aXplLT5jb2xvcmluZGV4W2NpXTsKLSAgICAgIGNvbG9ybWFwX2NpID0gY3F1YW50aXplLT5zdl9jb2xvcm1hcFtjaV07Ci0gICAgICAvKiBQcmVzZXQgZXJyb3IgdmFsdWVzOiBubyBlcnJvciBwcm9wYWdhdGVkIHRvIGZpcnN0IHBpeGVsIGZyb20gbGVmdCAqLwotICAgICAgY3VyID0gMDsKLSAgICAgIC8qIGFuZCBubyBlcnJvciBwcm9wYWdhdGVkIHRvIHJvdyBiZWxvdyB5ZXQgKi8KLSAgICAgIGJlbG93ZXJyID0gYnByZXZlcnIgPSAwOwotCi0gICAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotCS8qIGN1ciBob2xkcyB0aGUgZXJyb3IgcHJvcGFnYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBwaXhlbCBvbiB0aGUKLQkgKiBjdXJyZW50IGxpbmUuICBBZGQgdGhlIGVycm9yIHByb3BhZ2F0ZWQgZnJvbSB0aGUgcHJldmlvdXMgbGluZQotCSAqIHRvIGZvcm0gdGhlIGNvbXBsZXRlIGVycm9yIGNvcnJlY3Rpb24gdGVybSBmb3IgdGhpcyBwaXhlbCwgYW5kCi0JICogcm91bmQgdGhlIGVycm9yIHRlcm0gKHdoaWNoIGlzIGV4cHJlc3NlZCAqIDE2KSB0byBhbiBpbnRlZ2VyLgotCSAqIFJJR0hUX1NISUZUIHJvdW5kcyB0b3dhcmRzIG1pbnVzIGluZmluaXR5LCBzbyBhZGRpbmcgOCBpcyBjb3JyZWN0Ci0JICogZm9yIGVpdGhlciBzaWduIG9mIHRoZSBlcnJvciB2YWx1ZS4KLQkgKiBOb3RlOiBlcnJvcnB0ciBwb2ludHMgdG8gKnByZXZpb3VzKiBjb2x1bW4ncyBhcnJheSBlbnRyeS4KLQkgKi8KLQljdXIgPSBSSUdIVF9TSElGVChjdXIgKyBlcnJvcnB0cltkaXJdICsgOCwgNCk7Ci0JLyogRm9ybSBwaXhlbCB2YWx1ZSArIGVycm9yLCBhbmQgcmFuZ2UtbGltaXQgdG8gMC4uTUFYSlNBTVBMRS4KLQkgKiBUaGUgbWF4aW11bSBlcnJvciBpcyArLSBNQVhKU0FNUExFOyB0aGlzIHNldHMgdGhlIHJlcXVpcmVkIHNpemUKLQkgKiBvZiB0aGUgcmFuZ2VfbGltaXQgYXJyYXkuCi0JICovCi0JY3VyICs9IEdFVEpTQU1QTEUoKmlucHV0X3B0cik7Ci0JY3VyID0gR0VUSlNBTVBMRShyYW5nZV9saW1pdFtjdXJdKTsKLQkvKiBTZWxlY3Qgb3V0cHV0IHZhbHVlLCBhY2N1bXVsYXRlIGludG8gb3V0cHV0IGNvZGUgZm9yIHRoaXMgcGl4ZWwgKi8KLQlwaXhjb2RlID0gR0VUSlNBTVBMRShjb2xvcmluZGV4X2NpW2N1cl0pOwotCSpvdXRwdXRfcHRyICs9IChKU0FNUExFKSBwaXhjb2RlOwotCS8qIENvbXB1dGUgYWN0dWFsIHJlcHJlc2VudGF0aW9uIGVycm9yIGF0IHRoaXMgcGl4ZWwgKi8KLQkvKiBOb3RlOiB3ZSBjYW4gZG8gdGhpcyBldmVuIHRob3VnaCB3ZSBkb24ndCBoYXZlIHRoZSBmaW5hbCAqLwotCS8qIHBpeGVsIGNvZGUsIGJlY2F1c2UgdGhlIGNvbG9ybWFwIGlzIG9ydGhvZ29uYWwuICovCi0JY3VyIC09IEdFVEpTQU1QTEUoY29sb3JtYXBfY2lbcGl4Y29kZV0pOwotCS8qIENvbXB1dGUgZXJyb3IgZnJhY3Rpb25zIHRvIGJlIHByb3BhZ2F0ZWQgdG8gYWRqYWNlbnQgcGl4ZWxzLgotCSAqIEFkZCB0aGVzZSBpbnRvIHRoZSBydW5uaW5nIHN1bXMsIGFuZCBzaW11bHRhbmVvdXNseSBzaGlmdCB0aGUKLQkgKiBuZXh0LWxpbmUgZXJyb3Igc3VtcyBsZWZ0IGJ5IDEgY29sdW1uLgotCSAqLwotCWJuZXh0ZXJyID0gY3VyOwotCWRlbHRhID0gY3VyICogMjsKLQljdXIgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogMyAqLwotCWVycm9ycHRyWzBdID0gKEZTRVJST1IpIChicHJldmVyciArIGN1cik7Ci0JY3VyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDUgKi8KLQlicHJldmVyciA9IGJlbG93ZXJyICsgY3VyOwotCWJlbG93ZXJyID0gYm5leHRlcnI7Ci0JY3VyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDcgKi8KLQkvKiBBdCB0aGlzIHBvaW50IGN1ciBjb250YWlucyB0aGUgNy8xNiBlcnJvciB2YWx1ZSB0byBiZSBwcm9wYWdhdGVkCi0JICogdG8gdGhlIG5leHQgcGl4ZWwgb24gdGhlIGN1cnJlbnQgbGluZSwgYW5kIGFsbCB0aGUgZXJyb3JzIGZvciB0aGUKLQkgKiBuZXh0IGxpbmUgaGF2ZSBiZWVuIHNoaWZ0ZWQgb3Zlci4gV2UgYXJlIHRoZXJlZm9yZSByZWFkeSB0byBtb3ZlIG9uLgotCSAqLwotCWlucHV0X3B0ciArPSBkaXJuYzsJLyogYWR2YW5jZSBpbnB1dCBwdHIgdG8gbmV4dCBjb2x1bW4gKi8KLQlvdXRwdXRfcHRyICs9IGRpcjsJLyogYWR2YW5jZSBvdXRwdXQgcHRyIHRvIG5leHQgY29sdW1uICovCi0JZXJyb3JwdHIgKz0gZGlyOwkvKiBhZHZhbmNlIGVycm9ycHRyIHRvIGN1cnJlbnQgY29sdW1uICovCi0gICAgICB9Ci0gICAgICAvKiBQb3N0LWxvb3AgY2xlYW51cDogd2UgbXVzdCB1bmxvYWQgdGhlIGZpbmFsIGVycm9yIHZhbHVlIGludG8gdGhlCi0gICAgICAgKiBmaW5hbCBmc2Vycm9yc1tdIGVudHJ5LiAgTm90ZSB3ZSBuZWVkIG5vdCB1bmxvYWQgYmVsb3dlcnIgYmVjYXVzZQotICAgICAgICogaXQgaXMgZm9yIHRoZSBkdW1teSBjb2x1bW4gYmVmb3JlIG9yIGFmdGVyIHRoZSBhY3R1YWwgYXJyYXkuCi0gICAgICAgKi8KLSAgICAgIGVycm9ycHRyWzBdID0gKEZTRVJST1IpIGJwcmV2ZXJyOyAvKiB1bmxvYWQgcHJldiBlcnIgaW50byBhcnJheSAqLwotICAgIH0KLSAgICBjcXVhbnRpemUtPm9uX29kZF9yb3cgPSAoY3F1YW50aXplLT5vbl9vZGRfcm93ID8gRkFMU0UgOiBUUlVFKTsKLSAgfQotfQotCi0KLS8qCi0gKiBBbGxvY2F0ZSB3b3Jrc3BhY2UgZm9yIEZsb3lkLVN0ZWluYmVyZyBlcnJvcnMuCi0gKi8KLQotTE9DQUwodm9pZCkKLWFsbG9jX2ZzX3dvcmtzcGFjZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgc2l6ZV90IGFycmF5c2l6ZTsKLSAgaW50IGk7Ci0KLSAgYXJyYXlzaXplID0gKHNpemVfdCkgKChjaW5mby0+b3V0cHV0X3dpZHRoICsgMikgKiBTSVpFT0YoRlNFUlJPUikpOwotICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOyBpKyspIHsKLSAgICBjcXVhbnRpemUtPmZzZXJyb3JzW2ldID0gKEZTRVJSUFRSKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBhcnJheXNpemUpOwotICB9Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIG9uZS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfMV9xdWFudCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc19wcmVfc2NhbikKLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgc2l6ZV90IGFycmF5c2l6ZTsKLSAgaW50IGk7Ci0KLSAgLyogSW5zdGFsbCBteSBjb2xvcm1hcC4gKi8KLSAgY2luZm8tPmNvbG9ybWFwID0gY3F1YW50aXplLT5zdl9jb2xvcm1hcDsKLSAgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzID0gY3F1YW50aXplLT5zdl9hY3R1YWw7Ci0KLSAgLyogSW5pdGlhbGl6ZSBmb3IgZGVzaXJlZCBkaXRoZXJpbmcgbW9kZS4gKi8KLSAgc3dpdGNoIChjaW5mby0+ZGl0aGVyX21vZGUpIHsKLSAgY2FzZSBKRElUSEVSX05PTkU6Ci0gICAgaWYgKGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9PSAzKQotICAgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBjb2xvcl9xdWFudGl6ZTM7Ci0gICAgZWxzZQotICAgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBjb2xvcl9xdWFudGl6ZTsKLSAgICBicmVhazsKLSAgY2FzZSBKRElUSEVSX09SREVSRUQ6Ci0gICAgaWYgKGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9PSAzKQotICAgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBxdWFudGl6ZTNfb3JkX2RpdGhlcjsKLSAgICBlbHNlCi0gICAgICBjcXVhbnRpemUtPnB1Yi5jb2xvcl9xdWFudGl6ZSA9IHF1YW50aXplX29yZF9kaXRoZXI7Ci0gICAgY3F1YW50aXplLT5yb3dfaW5kZXggPSAwOwkvKiBpbml0aWFsaXplIHN0YXRlIGZvciBvcmRlcmVkIGRpdGhlciAqLwotICAgIC8qIElmIHVzZXIgY2hhbmdlZCB0byBvcmRlcmVkIGRpdGhlciBmcm9tIGFub3RoZXIgbW9kZSwKLSAgICAgKiB3ZSBtdXN0IHJlY3JlYXRlIHRoZSBjb2xvciBpbmRleCB0YWJsZSB3aXRoIHBhZGRpbmcuCi0gICAgICogVGhpcyB3aWxsIGNvc3QgZXh0cmEgc3BhY2UsIGJ1dCBwcm9iYWJseSBpc24ndCB2ZXJ5IGxpa2VseS4KLSAgICAgKi8KLSAgICBpZiAoISBjcXVhbnRpemUtPmlzX3BhZGRlZCkKLSAgICAgIGNyZWF0ZV9jb2xvcmluZGV4KGNpbmZvKTsKLSAgICAvKiBDcmVhdGUgb3JkZXJlZC1kaXRoZXIgdGFibGVzIGlmIHdlIGRpZG4ndCBhbHJlYWR5LiAqLwotICAgIGlmIChjcXVhbnRpemUtPm9kaXRoZXJbMF0gPT0gTlVMTCkKLSAgICAgIGNyZWF0ZV9vZGl0aGVyX3RhYmxlcyhjaW5mbyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkRJVEhFUl9GUzoKLSAgICBjcXVhbnRpemUtPnB1Yi5jb2xvcl9xdWFudGl6ZSA9IHF1YW50aXplX2ZzX2RpdGhlcjsKLSAgICBjcXVhbnRpemUtPm9uX29kZF9yb3cgPSBGQUxTRTsgLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgRi1TIGRpdGhlciAqLwotICAgIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2UgaWYgZGlkbid0IGFscmVhZHkuICovCi0gICAgaWYgKGNxdWFudGl6ZS0+ZnNlcnJvcnNbMF0gPT0gTlVMTCkKLSAgICAgIGFsbG9jX2ZzX3dvcmtzcGFjZShjaW5mbyk7Ci0gICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvcGFnYXRlZCBlcnJvcnMgdG8gemVyby4gKi8KLSAgICBhcnJheXNpemUgPSAoc2l6ZV90KSAoKGNpbmZvLT5vdXRwdXRfd2lkdGggKyAyKSAqIFNJWkVPRihGU0VSUk9SKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKQotICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjcXVhbnRpemUtPmZzZXJyb3JzW2ldLCBhcnJheXNpemUpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9wYXNzXzFfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgaW4gMS1wYXNzIGNhc2UgKi8KLX0KLQotCi0vKgotICogU3dpdGNoIHRvIGEgbmV3IGV4dGVybmFsIGNvbG9ybWFwIGJldHdlZW4gb3V0cHV0IHBhc3Nlcy4KLSAqIFNob3VsZG4ndCBnZXQgdG8gdGhpcyBtb2R1bGUhCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1uZXdfY29sb3JfbWFwXzFfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIEVSUkVYSVQoY2luZm8sIEpFUlJfTU9ERV9DSEFOR0UpOwotfQotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgMS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbi4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0XzFwYXNzX3F1YW50aXplciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemU7Ci0KLSAgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfY3F1YW50aXplcikpOwotICBjaW5mby0+Y3F1YW50aXplID0gKHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqKSBjcXVhbnRpemU7Ci0gIGNxdWFudGl6ZS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzXzFfcXVhbnQ7Ci0gIGNxdWFudGl6ZS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfMV9xdWFudDsKLSAgY3F1YW50aXplLT5wdWIubmV3X2NvbG9yX21hcCA9IG5ld19jb2xvcl9tYXBfMV9xdWFudDsKLSAgY3F1YW50aXplLT5mc2Vycm9yc1swXSA9IE5VTEw7IC8qIEZsYWcgRlMgd29ya3NwYWNlIG5vdCBhbGxvY2F0ZWQgKi8KLSAgY3F1YW50aXplLT5vZGl0aGVyWzBdID0gTlVMTDsJLyogQWxzbyBmbGFnIG9kaXRoZXIgYXJyYXlzIG5vdCBhbGxvY2F0ZWQgKi8KLQotICAvKiBNYWtlIHN1cmUgbXkgaW50ZXJuYWwgYXJyYXlzIHdvbid0IG92ZXJmbG93ICovCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPiBNQVhfUV9DT01QUykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9DT01QT05FTlRTLCBNQVhfUV9DT01QUyk7Ci0gIC8qIE1ha2Ugc3VyZSBjb2xvcm1hcCBpbmRleGVzIGNhbiBiZSByZXByZXNlbnRlZCBieSBKU0FNUExFcyAqLwotICBpZiAoY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA+IChNQVhKU0FNUExFKzEpKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX01BTllfQ09MT1JTLCBNQVhKU0FNUExFKzEpOwotCi0gIC8qIENyZWF0ZSB0aGUgY29sb3JtYXAgYW5kIGNvbG9yIGluZGV4IHRhYmxlLiAqLwotICBjcmVhdGVfY29sb3JtYXAoY2luZm8pOwotICBjcmVhdGVfY29sb3JpbmRleChjaW5mbyk7Ci0KLSAgLyogQWxsb2NhdGUgRmxveWQtU3RlaW5iZXJnIHdvcmtzcGFjZSBub3cgaWYgcmVxdWVzdGVkLgotICAgKiBXZSBkbyB0aGlzIG5vdyBzaW5jZSBpdCBpcyBGQVIgc3RvcmFnZSBhbmQgbWF5IGFmZmVjdCB0aGUgbWVtb3J5Ci0gICAqIG1hbmFnZXIncyBzcGFjZSBjYWxjdWxhdGlvbnMuICBJZiB0aGUgdXNlciBjaGFuZ2VzIHRvIEZTIGRpdGhlcgotICAgKiBtb2RlIGluIGEgbGF0ZXIgcGFzcywgd2Ugd2lsbCBhbGxvY2F0ZSB0aGUgc3BhY2UgdGhlbiwgYW5kIHdpbGwKLSAgICogcG9zc2libHkgb3ZlcnJ1biB0aGUgbWF4X21lbW9yeV90b191c2Ugc2V0dGluZy4KLSAgICovCi0gIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9GUykKLSAgICBhbGxvY19mc193b3Jrc3BhY2UoY2luZm8pOwotfQotCi0jZW5kaWYgLyogUVVBTlRfMVBBU1NfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qcXVhbnQyLmMgYi9saWJqcGVndHdycC9qcXVhbnQyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNjAxZTMuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvanF1YW50Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMxMCArMCwwIEBACi0vKgotICoganF1YW50Mi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgMi1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAoY29sb3IgbWFwcGluZykgcm91dGluZXMuCi0gKiBUaGVzZSByb3V0aW5lcyBwcm92aWRlIHNlbGVjdGlvbiBvZiBhIGN1c3RvbSBjb2xvciBtYXAgZm9yIGFuIGltYWdlLAotICogZm9sbG93ZWQgYnkgbWFwcGluZyBvZiB0aGUgaW1hZ2UgdG8gdGhhdCBjb2xvciBtYXAsIHdpdGggb3B0aW9uYWwKLSAqIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcuCi0gKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBqdXN0IHRoZSBzZWNvbmQgcGFzcyB0byBtYXAgdG8gYW4gYXJiaXRyYXJ5Ci0gKiBleHRlcm5hbGx5LWdpdmVuIGNvbG9yIG1hcC4KLSAqCi0gKiBOb3RlOiBvcmRlcmVkIGRpdGhlcmluZyBpcyBub3Qgc3VwcG9ydGVkLCBzaW5jZSB0aGVyZSBpc24ndCBhbnkgZmFzdAotICogd2F5IHRvIGNvbXB1dGUgaW50ZXJjb2xvciBkaXN0YW5jZXM7IGl0J3MgdW5jbGVhciB0aGF0IG9yZGVyZWQgZGl0aGVyJ3MKLSAqIGZ1bmRhbWVudGFsIGFzc3VtcHRpb25zIGV2ZW4gaG9sZCB3aXRoIGFuIGlycmVndWxhcmx5IHNwYWNlZCBjb2xvciBtYXAuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0KLQotLyoKLSAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIHdlbGwta25vd24gSGVja2JlcnQgcGFyYWRpZ20gZm9yIGNvbG9yCi0gKiBxdWFudGl6YXRpb24uICBNb3N0IG9mIHRoZSBpZGVhcyB1c2VkIGhlcmUgY2FuIGJlIHRyYWNlZCBiYWNrIHRvCi0gKiBIZWNrYmVydCdzIHNlbWluYWwgcGFwZXIKLSAqICAgSGVja2JlcnQsIFBhdWwuICAiQ29sb3IgSW1hZ2UgUXVhbnRpemF0aW9uIGZvciBGcmFtZSBCdWZmZXIgRGlzcGxheSIsCi0gKiAgIFByb2MuIFNJR0dSQVBIICc4MiwgQ29tcHV0ZXIgR3JhcGhpY3Mgdi4xNiAjMyAoSnVseSAxOTgyKSwgcHAgMjk3LTMwNC4KLSAqCi0gKiBJbiB0aGUgZmlyc3QgcGFzcyBvdmVyIHRoZSBpbWFnZSwgd2UgYWNjdW11bGF0ZSBhIGhpc3RvZ3JhbSBzaG93aW5nIHRoZQotICogdXNhZ2UgY291bnQgb2YgZWFjaCBwb3NzaWJsZSBjb2xvci4gIFRvIGtlZXAgdGhlIGhpc3RvZ3JhbSB0byBhIHJlYXNvbmFibGUKLSAqIHNpemUsIHdlIHJlZHVjZSB0aGUgcHJlY2lzaW9uIG9mIHRoZSBpbnB1dDsgdHlwaWNhbCBwcmFjdGljZSBpcyB0byByZXRhaW4KLSAqIDUgb3IgNiBiaXRzIHBlciBjb2xvciwgc28gdGhhdCA4IG9yIDQgZGlmZmVyZW50IGlucHV0IHZhbHVlcyBhcmUgY291bnRlZAotICogaW4gdGhlIHNhbWUgaGlzdG9ncmFtIGNlbGwuCi0gKgotICogTmV4dCwgdGhlIGNvbG9yLXNlbGVjdGlvbiBzdGVwIGJlZ2lucyB3aXRoIGEgYm94IHJlcHJlc2VudGluZyB0aGUgd2hvbGUKLSAqIGNvbG9yIHNwYWNlLCBhbmQgcmVwZWF0ZWRseSBzcGxpdHMgdGhlICJsYXJnZXN0IiByZW1haW5pbmcgYm94IHVudGlsIHdlCi0gKiBoYXZlIGFzIG1hbnkgYm94ZXMgYXMgZGVzaXJlZCBjb2xvcnMuICBUaGVuIHRoZSBtZWFuIGNvbG9yIGluIGVhY2gKLSAqIHJlbWFpbmluZyBib3ggYmVjb21lcyBvbmUgb2YgdGhlIHBvc3NpYmxlIG91dHB1dCBjb2xvcnMuCi0gKiAKLSAqIFRoZSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBpbWFnZSBtYXBzIGVhY2ggaW5wdXQgcGl4ZWwgdG8gdGhlIGNsb3Nlc3Qgb3V0cHV0Ci0gKiBjb2xvciAob3B0aW9uYWxseSBhZnRlciBhcHBseWluZyBhIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgY29ycmVjdGlvbikuCi0gKiBUaGlzIG1hcHBpbmcgaXMgbG9naWNhbGx5IHRyaXZpYWwsIGJ1dCBtYWtpbmcgaXQgZ28gZmFzdCBlbm91Z2ggcmVxdWlyZXMKLSAqIGNvbnNpZGVyYWJsZSBjYXJlLgotICoKLSAqIEhlY2tiZXJ0LXN0eWxlIHF1YW50aXplcnMgdmFyeSBhIGdvb2QgZGVhbCBpbiB0aGVpciBwb2xpY2llcyBmb3IgY2hvb3NpbmcKLSAqIHRoZSAibGFyZ2VzdCIgYm94IGFuZCBkZWNpZGluZyB3aGVyZSB0byBjdXQgaXQuICBUaGUgcGFydGljdWxhciBwb2xpY2llcwotICogdXNlZCBoZXJlIGhhdmUgcHJvdmVkIG91dCB3ZWxsIGluIGV4cGVyaW1lbnRhbCBjb21wYXJpc29ucywgYnV0IGJldHRlciBvbmVzCi0gKiBtYXkgeWV0IGJlIGZvdW5kLgotICoKLSAqIEluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIElKRyBjb2RlLCB0aGlzIG1vZHVsZSBxdWFudGl6ZWQgaW4gWUNiQ3IgY29sb3IKLSAqIHNwYWNlLCBwcm9jZXNzaW5nIHRoZSByYXcgdXBzYW1wbGVkIGRhdGEgd2l0aG91dCBhIGNvbG9yIGNvbnZlcnNpb24gc3RlcC4KLSAqIFRoaXMgYWxsb3dlZCB0aGUgY29sb3IgY29udmVyc2lvbiBtYXRoIHRvIGJlIGRvbmUgb25seSBvbmNlIHBlciBjb2xvcm1hcAotICogZW50cnksIG5vdCBvbmNlIHBlciBwaXhlbC4gIEhvd2V2ZXIsIHRoYXQgb3B0aW1pemF0aW9uIHByZWNsdWRlZCBvdGhlcgotICogdXNlZnVsIG9wdGltaXphdGlvbnMgKHN1Y2ggYXMgbWVyZ2luZyBjb2xvciBjb252ZXJzaW9uIHdpdGggdXBzYW1wbGluZykKLSAqIGFuZCBpdCBhbHNvIGludGVyZmVyZWQgd2l0aCBkZXNpcmVkIGNhcGFiaWxpdGllcyBzdWNoIGFzIHF1YW50aXppbmcgdG8gYW4KLSAqIGV4dGVybmFsbHktc3VwcGxpZWQgY29sb3JtYXAuICBXZSBoYXZlIHRoZXJlZm9yZSBhYmFuZG9uZWQgdGhhdCBhcHByb2FjaC4KLSAqIFRoZSBwcmVzZW50IGNvZGUgd29ya3MgaW4gdGhlIHBvc3QtY29udmVyc2lvbiBjb2xvciBzcGFjZSwgdHlwaWNhbGx5IFJHQi4KLSAqCi0gKiBUbyBpbXByb3ZlIHRoZSB2aXN1YWwgcXVhbGl0eSBvZiB0aGUgcmVzdWx0cywgd2UgYWN0dWFsbHkgd29yayBpbiBzY2FsZWQKLSAqIFJHQiBzcGFjZSwgZ2l2aW5nIEcgZGlzdGFuY2VzIG1vcmUgd2VpZ2h0IHRoYW4gUiwgYW5kIFIgaW4gdHVybiBtb3JlIHRoYW4KLSAqIEIuICBUbyBkbyBldmVyeXRoaW5nIGluIGludGVnZXIgbWF0aCwgd2UgbXVzdCB1c2UgaW50ZWdlciBzY2FsZSBmYWN0b3JzLgotICogVGhlIDIvMy8xIHNjYWxlIGZhY3RvcnMgdXNlZCBoZXJlIGNvcnJlc3BvbmQgbG9vc2VseSB0byB0aGUgcmVsYXRpdmUKLSAqIHdlaWdodHMgb2YgdGhlIGNvbG9ycyBpbiB0aGUgTlRTQyBncmF5c2NhbGUgZXF1YXRpb24uCi0gKiBJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBjb2RlIHRvIHF1YW50aXplIGEgbm9uLVJHQiBjb2xvciBzcGFjZSwgeW91J2xsCi0gKiBwcm9iYWJseSBuZWVkIHRvIGNoYW5nZSB0aGVzZSBzY2FsZSBmYWN0b3JzLgotICovCi0KLSNkZWZpbmUgUl9TQ0FMRSAyCQkvKiBzY2FsZSBSIGRpc3RhbmNlcyBieSB0aGlzIG11Y2ggKi8KLSNkZWZpbmUgR19TQ0FMRSAzCQkvKiBzY2FsZSBHIGRpc3RhbmNlcyBieSB0aGlzIG11Y2ggKi8KLSNkZWZpbmUgQl9TQ0FMRSAxCQkvKiBhbmQgQiBieSB0aGlzIG11Y2ggKi8KLQotLyogUmVsYWJlbCBSL0cvQiBhcyBjb21wb25lbnRzIDAvMS8yLCByZXNwZWN0aW5nIHRoZSBSR0Igb3JkZXJpbmcgZGVmaW5lZAotICogaW4gam1vcmVjZmcuaC4gIEFzIHRoZSBjb2RlIHN0YW5kcywgaXQgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIFIsRyxCCi0gKiBhbmQgQixHLFIgb3JkZXJzLiAgSWYgeW91IGRlZmluZSBzb21lIG90aGVyIHdlaXJkIG9yZGVyIGluIGptb3JlY2ZnLmgsCi0gKiB5b3UnbGwgZ2V0IGNvbXBpbGUgZXJyb3JzIHVudGlsIHlvdSBleHRlbmQgdGhpcyBsb2dpYy4gIEluIHRoYXQgY2FzZQotICogeW91J2xsIHByb2JhYmx5IHdhbnQgdG8gdHdlYWsgdGhlIGhpc3RvZ3JhbSBzaXplcyB0b28uCi0gKi8KLQotI2lmIFJHQl9SRUQgPT0gMAotI2RlZmluZSBDMF9TQ0FMRSBSX1NDQUxFCi0jZW5kaWYKLSNpZiBSR0JfQkxVRSA9PSAwCi0jZGVmaW5lIEMwX1NDQUxFIEJfU0NBTEUKLSNlbmRpZgotI2lmIFJHQl9HUkVFTiA9PSAxCi0jZGVmaW5lIEMxX1NDQUxFIEdfU0NBTEUKLSNlbmRpZgotI2lmIFJHQl9SRUQgPT0gMgotI2RlZmluZSBDMl9TQ0FMRSBSX1NDQUxFCi0jZW5kaWYKLSNpZiBSR0JfQkxVRSA9PSAyCi0jZGVmaW5lIEMyX1NDQUxFIEJfU0NBTEUKLSNlbmRpZgotCi0KLS8qCi0gKiBGaXJzdCB3ZSBoYXZlIHRoZSBoaXN0b2dyYW0gZGF0YSBzdHJ1Y3R1cmUgYW5kIHJvdXRpbmVzIGZvciBjcmVhdGluZyBpdC4KLSAqCi0gKiBUaGUgbnVtYmVyIG9mIGJpdHMgb2YgcHJlY2lzaW9uIGNhbiBiZSBhZGp1c3RlZCBieSBjaGFuZ2luZyB0aGVzZSBzeW1ib2xzLgotICogV2UgcmVjb21tZW5kIGtlZXBpbmcgNiBiaXRzIGZvciBHIGFuZCA1IGVhY2ggZm9yIFIgYW5kIEIuCi0gKiBJZiB5b3UgaGF2ZSBwbGVudHkgb2YgbWVtb3J5IGFuZCBjeWNsZXMsIDYgYml0cyBhbGwgYXJvdW5kIGdpdmVzIG1hcmdpbmFsbHkKLSAqIGJldHRlciByZXN1bHRzOyBpZiB5b3UgYXJlIHNob3J0IG9mIG1lbW9yeSwgNSBiaXRzIGFsbCBhcm91bmQgd2lsbCBzYXZlCi0gKiBzb21lIHNwYWNlIGJ1dCBkZWdyYWRlIHRoZSByZXN1bHRzLgotICogVG8gbWFpbnRhaW4gYSBmdWxseSBhY2N1cmF0ZSBoaXN0b2dyYW0sIHdlJ2QgbmVlZCB0byBhbGxvY2F0ZSBhICJsb25nIgotICogKHByZWZlcmFibHkgdW5zaWduZWQgbG9uZykgZm9yIGVhY2ggY2VsbC4gIEluIHByYWN0aWNlIHRoaXMgaXMgb3ZlcmtpbGw7Ci0gKiB3ZSBjYW4gZ2V0IGJ5IHdpdGggMTYgYml0cyBwZXIgY2VsbC4gIEZldyBvZiB0aGUgY2VsbCBjb3VudHMgd2lsbCBvdmVyZmxvdywKLSAqIGFuZCBjbGFtcGluZyB0aG9zZSB0aGF0IGRvIG92ZXJmbG93IHRvIHRoZSBtYXhpbXVtIHZhbHVlIHdpbGwgZ2l2ZSBjbG9zZS0KLSAqIGVub3VnaCByZXN1bHRzLiAgVGhpcyByZWR1Y2VzIHRoZSByZWNvbW1lbmRlZCBoaXN0b2dyYW0gc2l6ZSBmcm9tIDI1NktiCi0gKiB0byAxMjhLYiwgd2hpY2ggaXMgYSB1c2VmdWwgc2F2aW5ncyBvbiBQQy1jbGFzcyBtYWNoaW5lcy4KLSAqIChJbiB0aGUgc2Vjb25kIHBhc3MgdGhlIGhpc3RvZ3JhbSBzcGFjZSBpcyByZS11c2VkIGZvciBwaXhlbCBtYXBwaW5nIGRhdGE7Ci0gKiBpbiB0aGF0IGNhcGFjaXR5LCBlYWNoIGNlbGwgbXVzdCBiZSBhYmxlIHRvIHN0b3JlIHplcm8gdG8gdGhlIG51bWJlciBvZgotICogZGVzaXJlZCBjb2xvcnMuICAxNiBiaXRzL2NlbGwgaXMgcGxlbnR5IGZvciB0aGF0IHRvby4pCi0gKiBTaW5jZSB0aGUgSlBFRyBjb2RlIGlzIGludGVuZGVkIHRvIHJ1biBpbiBzbWFsbCBtZW1vcnkgbW9kZWwgb24gODB4ODYKLSAqIG1hY2hpbmVzLCB3ZSBjYW4ndCBqdXN0IGFsbG9jYXRlIHRoZSBoaXN0b2dyYW0gaW4gb25lIGNodW5rLiAgSW5zdGVhZAotICogb2YgYSB0cnVlIDMtRCBhcnJheSwgd2UgdXNlIGEgcm93IG9mIHBvaW50ZXJzIHRvIDItRCBhcnJheXMuICBFYWNoCi0gKiBwb2ludGVyIGNvcnJlc3BvbmRzIHRvIGEgQzAgdmFsdWUgKHR5cGljYWxseSAyXjUgPSAzMiBwb2ludGVycykgYW5kCi0gKiBlYWNoIDItRCBhcnJheSBoYXMgMl42KjJeNSA9IDIwNDggb3IgMl42KjJeNiA9IDQwOTYgZW50cmllcy4gIE5vdGUgdGhhdAotICogb24gODB4ODYgbWFjaGluZXMsIHRoZSBwb2ludGVyIHJvdyBpcyBpbiBuZWFyIG1lbW9yeSBidXQgdGhlIGFjdHVhbAotICogYXJyYXlzIGFyZSBpbiBmYXIgbWVtb3J5IChzYW1lIGFycmFuZ2VtZW50IGFzIHdlIHVzZSBmb3IgaW1hZ2UgYXJyYXlzKS4KLSAqLwotCi0jZGVmaW5lIE1BWE5VTUNPTE9SUyAgKE1BWEpTQU1QTEUrMSkgLyogbWF4aW11bSBzaXplIG9mIGNvbG9ybWFwICovCi0KLS8qIFRoZXNlIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBlaXRoZXIgUixHLEIgb3IgQixHLFIgY29sb3Igb3JkZXIsCi0gKiBidXQgeW91IG1heSBub3QgbGlrZSB0aGUgcmVzdWx0cyBmb3Igb3RoZXIgY29sb3Igb3JkZXJzLgotICovCi0jZGVmaW5lIEhJU1RfQzBfQklUUyAgNQkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gUi9CIGhpc3RvZ3JhbSAqLwotI2RlZmluZSBISVNUX0MxX0JJVFMgIDYJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIEcgaGlzdG9ncmFtICovCi0jZGVmaW5lIEhJU1RfQzJfQklUUyAgNQkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gQi9SIGhpc3RvZ3JhbSAqLwotCi0vKiBOdW1iZXIgb2YgZWxlbWVudHMgYWxvbmcgaGlzdG9ncmFtIGF4ZXMuICovCi0jZGVmaW5lIEhJU1RfQzBfRUxFTVMgICgxPDxISVNUX0MwX0JJVFMpCi0jZGVmaW5lIEhJU1RfQzFfRUxFTVMgICgxPDxISVNUX0MxX0JJVFMpCi0jZGVmaW5lIEhJU1RfQzJfRUxFTVMgICgxPDxISVNUX0MyX0JJVFMpCi0KLS8qIFRoZXNlIGFyZSB0aGUgYW1vdW50cyB0byBzaGlmdCBhbiBpbnB1dCB2YWx1ZSB0byBnZXQgYSBoaXN0b2dyYW0gaW5kZXguICovCi0jZGVmaW5lIEMwX1NISUZUICAoQklUU19JTl9KU0FNUExFLUhJU1RfQzBfQklUUykKLSNkZWZpbmUgQzFfU0hJRlQgIChCSVRTX0lOX0pTQU1QTEUtSElTVF9DMV9CSVRTKQotI2RlZmluZSBDMl9TSElGVCAgKEJJVFNfSU5fSlNBTVBMRS1ISVNUX0MyX0JJVFMpCi0KLQotdHlwZWRlZiBVSU5UMTYgaGlzdGNlbGw7CS8qIGhpc3RvZ3JhbSBjZWxsOyBwcmVmZXIgYW4gdW5zaWduZWQgdHlwZSAqLwotCi10eXBlZGVmIGhpc3RjZWxsIEZBUiAqIGhpc3RwdHI7CS8qIGZvciBwb2ludGVycyB0byBoaXN0b2dyYW0gY2VsbHMgKi8KLQotdHlwZWRlZiBoaXN0Y2VsbCBoaXN0MWRbSElTVF9DMl9FTEVNU107IC8qIHR5cGVkZWZzIGZvciB0aGUgYXJyYXkgKi8KLXR5cGVkZWYgaGlzdDFkIEZBUiAqIGhpc3QyZDsJLyogdHlwZSBmb3IgdGhlIDJuZC1sZXZlbCBwb2ludGVycyAqLwotdHlwZWRlZiBoaXN0MmQgKiBoaXN0M2Q7CS8qIHR5cGUgZm9yIHRvcC1sZXZlbCBwb2ludGVyICovCi0KLQotLyogRGVjbGFyYXRpb25zIGZvciBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nLgotICoKLSAqIEVycm9ycyBhcmUgYWNjdW11bGF0ZWQgaW50byB0aGUgYXJyYXkgZnNlcnJvcnNbXSwgYXQgYSByZXNvbHV0aW9uIG9mCi0gKiAxLzE2dGggb2YgYSBwaXhlbCBjb3VudC4gIFRoZSBlcnJvciBhdCBhIGdpdmVuIHBpeGVsIGlzIHByb3BhZ2F0ZWQKLSAqIHRvIGl0cyBub3QteWV0LXByb2Nlc3NlZCBuZWlnaGJvcnMgdXNpbmcgdGhlIHN0YW5kYXJkIEYtUyBmcmFjdGlvbnMsCi0gKgkJLi4uCShoZXJlKQk3LzE2Ci0gKgkJMy8xNgk1LzE2CTEvMTYKLSAqIFdlIHdvcmsgbGVmdC10by1yaWdodCBvbiBldmVuIHJvd3MsIHJpZ2h0LXRvLWxlZnQgb24gb2RkIHJvd3MuCi0gKgotICogV2UgY2FuIGdldCBhd2F5IHdpdGggYSBzaW5nbGUgYXJyYXkgKGhvbGRpbmcgb25lIHJvdydzIHdvcnRoIG9mIGVycm9ycykKLSAqIGJ5IHVzaW5nIGl0IHRvIHN0b3JlIHRoZSBjdXJyZW50IHJvdydzIGVycm9ycyBhdCBwaXhlbCBjb2x1bW5zIG5vdCB5ZXQKLSAqIHByb2Nlc3NlZCwgYnV0IHRoZSBuZXh0IHJvdydzIGVycm9ycyBhdCBjb2x1bW5zIGFscmVhZHkgcHJvY2Vzc2VkLiAgV2UKLSAqIG5lZWQgb25seSBhIGZldyBleHRyYSB2YXJpYWJsZXMgdG8gaG9sZCB0aGUgZXJyb3JzIGltbWVkaWF0ZWx5IGFyb3VuZCB0aGUKLSAqIGN1cnJlbnQgY29sdW1uLiAgKElmIHdlIGFyZSBsdWNreSwgdGhvc2UgdmFyaWFibGVzIGFyZSBpbiByZWdpc3RlcnMsIGJ1dAotICogZXZlbiBpZiBub3QsIHRoZXkncmUgcHJvYmFibHkgY2hlYXBlciB0byBhY2Nlc3MgdGhhbiBhcnJheSBlbGVtZW50cyBhcmUuKQotICoKLSAqIFRoZSBmc2Vycm9yc1tdIGFycmF5IGhhcyAoI2NvbHVtbnMgKyAyKSBlbnRyaWVzOyB0aGUgZXh0cmEgZW50cnkgYXQKLSAqIGVhY2ggZW5kIHNhdmVzIHVzIGZyb20gc3BlY2lhbC1jYXNpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IHBpeGVscy4KLSAqIEVhY2ggZW50cnkgaXMgdGhyZWUgdmFsdWVzIGxvbmcsIG9uZSB2YWx1ZSBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQuCi0gKgotICogTm90ZTogb24gYSB3aWRlIGltYWdlLCB3ZSBtaWdodCBub3QgaGF2ZSBlbm91Z2ggcm9vbSBpbiBhIFBDJ3MgbmVhciBkYXRhCi0gKiBzZWdtZW50IHRvIGhvbGQgdGhlIGVycm9yIGFycmF5OyBzbyBpdCBpcyBhbGxvY2F0ZWQgd2l0aCBhbGxvY19sYXJnZS4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLXR5cGVkZWYgSU5UMTYgRlNFUlJPUjsJCS8qIDE2IGJpdHMgc2hvdWxkIGJlIGVub3VnaCAqLwotdHlwZWRlZiBpbnQgTE9DRlNFUlJPUjsJCS8qIHVzZSAnaW50JyBmb3IgY2FsY3VsYXRpb24gdGVtcHMgKi8KLSNlbHNlCi10eXBlZGVmIElOVDMyIEZTRVJST1I7CQkvKiBtYXkgbmVlZCBtb3JlIHRoYW4gMTYgYml0cyAqLwotdHlwZWRlZiBJTlQzMiBMT0NGU0VSUk9SOwkvKiBiZSBzdXJlIGNhbGN1bGF0aW9uIHRlbXBzIGFyZSBiaWcgZW5vdWdoICovCi0jZW5kaWYKLQotdHlwZWRlZiBGU0VSUk9SIEZBUiAqRlNFUlJQVFI7CS8qIHBvaW50ZXIgdG8gZXJyb3IgYXJyYXkgKGluIEZBUiBzdG9yYWdlISkgKi8KLQotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBTcGFjZSBmb3IgdGhlIGV2ZW50dWFsbHkgY3JlYXRlZCBjb2xvcm1hcCBpcyBzdGFzaGVkIGhlcmUgKi8KLSAgSlNBTVBBUlJBWSBzdl9jb2xvcm1hcDsJLyogY29sb3JtYXAgYWxsb2NhdGVkIGF0IGluaXQgdGltZSAqLwotICBpbnQgZGVzaXJlZDsJCQkvKiBkZXNpcmVkICMgb2YgY29sb3JzID0gc2l6ZSBvZiBjb2xvcm1hcCAqLwotCi0gIC8qIFZhcmlhYmxlcyBmb3IgYWNjdW11bGF0aW5nIGltYWdlIHN0YXRpc3RpY3MgKi8KLSAgaGlzdDNkIGhpc3RvZ3JhbTsJCS8qIHBvaW50ZXIgdG8gdGhlIGhpc3RvZ3JhbSAqLwotCi0gIGJvb2xlYW4gbmVlZHNfemVyb2VkOwkJLyogVFJVRSBpZiBuZXh0IHBhc3MgbXVzdCB6ZXJvIGhpc3RvZ3JhbSAqLwotCi0gIC8qIFZhcmlhYmxlcyBmb3IgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyAqLwotICBGU0VSUlBUUiBmc2Vycm9yczsJCS8qIGFjY3VtdWxhdGVkIGVycm9ycyAqLwotICBib29sZWFuIG9uX29kZF9yb3c7CQkvKiBmbGFnIHRvIHJlbWVtYmVyIHdoaWNoIHJvdyB3ZSBhcmUgb24gKi8KLSAgaW50ICogZXJyb3JfbGltaXRlcjsJCS8qIHRhYmxlIGZvciBjbGFtcGluZyB0aGUgYXBwbGllZCBlcnJvciAqLwotfSBteV9jcXVhbnRpemVyOwotCi10eXBlZGVmIG15X2NxdWFudGl6ZXIgKiBteV9jcXVhbnRpemVfcHRyOwotCi0KLS8qCi0gKiBQcmVzY2FuIHNvbWUgcm93cyBvZiBwaXhlbHMuCi0gKiBJbiB0aGlzIG1vZHVsZSB0aGUgcHJlc2NhbiBzaW1wbHkgdXBkYXRlcyB0aGUgaGlzdG9ncmFtLCB3aGljaCBoYXMgYmVlbgotICogaW5pdGlhbGl6ZWQgdG8gemVyb2VzIGJ5IHN0YXJ0X3Bhc3MuCi0gKiBBbiBvdXRwdXRfYnVmIHBhcmFtZXRlciBpcyByZXF1aXJlZCBieSB0aGUgbWV0aG9kIHNpZ25hdHVyZSwgYnV0IG5vIGRhdGEKLSAqIGlzIGFjdHVhbGx5IG91dHB1dCAoaW4gZmFjdCB0aGUgYnVmZmVyIGNvbnRyb2xsZXIgaXMgcHJvYmFibHkgcGFzc2luZyBhCi0gKiBOVUxMIHBvaW50ZXIpLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJlc2Nhbl9xdWFudGl6ZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCi0JCSAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgaGlzdHB0ciBoaXN0cDsKLSAgcmVnaXN0ZXIgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOwotICBpbnQgcm93OwotICBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0KLSAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKLSAgICBwdHIgPSBpbnB1dF9idWZbcm93XTsKLSAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICAgLyogZ2V0IHBpeGVsIHZhbHVlIGFuZCBpbmRleCBpbnRvIHRoZSBoaXN0b2dyYW0gKi8KLSAgICAgIGhpc3RwID0gJiBoaXN0b2dyYW1bR0VUSlNBTVBMRShwdHJbMF0pID4+IEMwX1NISUZUXQotCQkJIFtHRVRKU0FNUExFKHB0clsxXSkgPj4gQzFfU0hJRlRdCi0JCQkgW0dFVEpTQU1QTEUocHRyWzJdKSA+PiBDMl9TSElGVF07Ci0gICAgICAvKiBpbmNyZW1lbnQsIGNoZWNrIGZvciBvdmVyZmxvdyBhbmQgdW5kbyBpbmNyZW1lbnQgaWYgc28uICovCi0gICAgICBpZiAoKysoKmhpc3RwKSA8PSAwKQotCSgqaGlzdHApLS07Ci0gICAgICBwdHIgKz0gMzsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogTmV4dCB3ZSBoYXZlIHRoZSByZWFsbHkgaW50ZXJlc3Rpbmcgcm91dGluZXM6IHNlbGVjdGlvbiBvZiBhIGNvbG9ybWFwCi0gKiBnaXZlbiB0aGUgY29tcGxldGVkIGhpc3RvZ3JhbS4KLSAqIFRoZXNlIHJvdXRpbmVzIHdvcmsgd2l0aCBhIGxpc3Qgb2YgImJveGVzIiwgZWFjaCByZXByZXNlbnRpbmcgYSByZWN0YW5ndWxhcgotICogc3Vic2V0IG9mIHRoZSBpbnB1dCBjb2xvciBzcGFjZSAodG8gaGlzdG9ncmFtIHByZWNpc2lvbikuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBUaGUgYm91bmRzIG9mIHRoZSBib3ggKGluY2x1c2l2ZSk7IGV4cHJlc3NlZCBhcyBoaXN0b2dyYW0gaW5kZXhlcyAqLwotICBpbnQgYzBtaW4sIGMwbWF4OwotICBpbnQgYzFtaW4sIGMxbWF4OwotICBpbnQgYzJtaW4sIGMybWF4OwotICAvKiBUaGUgdm9sdW1lIChhY3R1YWxseSAyLW5vcm0pIG9mIHRoZSBib3ggKi8KLSAgSU5UMzIgdm9sdW1lOwotICAvKiBUaGUgbnVtYmVyIG9mIG5vbnplcm8gaGlzdG9ncmFtIGNlbGxzIHdpdGhpbiB0aGlzIGJveCAqLwotICBsb25nIGNvbG9yY291bnQ7Ci19IGJveDsKLQotdHlwZWRlZiBib3ggKiBib3hwdHI7Ci0KLQotTE9DQUwoYm94cHRyKQotZmluZF9iaWdnZXN0X2NvbG9yX3BvcCAoYm94cHRyIGJveGxpc3QsIGludCBudW1ib3hlcykKLS8qIEZpbmQgdGhlIHNwbGl0dGFibGUgYm94IHdpdGggdGhlIGxhcmdlc3QgY29sb3IgcG9wdWxhdGlvbiAqLwotLyogUmV0dXJucyBOVUxMIGlmIG5vIHNwbGl0dGFibGUgYm94ZXMgcmVtYWluICovCi17Ci0gIHJlZ2lzdGVyIGJveHB0ciBib3hwOwotICByZWdpc3RlciBpbnQgaTsKLSAgcmVnaXN0ZXIgbG9uZyBtYXhjID0gMDsKLSAgYm94cHRyIHdoaWNoID0gTlVMTDsKLSAgCi0gIGZvciAoaSA9IDAsIGJveHAgPSBib3hsaXN0OyBpIDwgbnVtYm94ZXM7IGkrKywgYm94cCsrKSB7Ci0gICAgaWYgKGJveHAtPmNvbG9yY291bnQgPiBtYXhjICYmIGJveHAtPnZvbHVtZSA+IDApIHsKLSAgICAgIHdoaWNoID0gYm94cDsKLSAgICAgIG1heGMgPSBib3hwLT5jb2xvcmNvdW50OwotICAgIH0KLSAgfQotICByZXR1cm4gd2hpY2g7Ci19Ci0KLQotTE9DQUwoYm94cHRyKQotZmluZF9iaWdnZXN0X3ZvbHVtZSAoYm94cHRyIGJveGxpc3QsIGludCBudW1ib3hlcykKLS8qIEZpbmQgdGhlIHNwbGl0dGFibGUgYm94IHdpdGggdGhlIGxhcmdlc3QgKHNjYWxlZCkgdm9sdW1lICovCi0vKiBSZXR1cm5zIE5VTEwgaWYgbm8gc3BsaXR0YWJsZSBib3hlcyByZW1haW4gKi8KLXsKLSAgcmVnaXN0ZXIgYm94cHRyIGJveHA7Ci0gIHJlZ2lzdGVyIGludCBpOwotICByZWdpc3RlciBJTlQzMiBtYXh2ID0gMDsKLSAgYm94cHRyIHdoaWNoID0gTlVMTDsKLSAgCi0gIGZvciAoaSA9IDAsIGJveHAgPSBib3hsaXN0OyBpIDwgbnVtYm94ZXM7IGkrKywgYm94cCsrKSB7Ci0gICAgaWYgKGJveHAtPnZvbHVtZSA+IG1heHYpIHsKLSAgICAgIHdoaWNoID0gYm94cDsKLSAgICAgIG1heHYgPSBib3hwLT52b2x1bWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiB3aGljaDsKLX0KLQotCi1MT0NBTCh2b2lkKQotdXBkYXRlX2JveCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm94cHRyIGJveHApCi0vKiBTaHJpbmsgdGhlIG1pbi9tYXggYm91bmRzIG9mIGEgYm94IHRvIGVuY2xvc2Ugb25seSBub256ZXJvIGVsZW1lbnRzLCAqLwotLyogYW5kIHJlY29tcHV0ZSBpdHMgdm9sdW1lIGFuZCBwb3B1bGF0aW9uICovCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKLSAgaGlzdHB0ciBoaXN0cDsKLSAgaW50IGMwLGMxLGMyOwotICBpbnQgYzBtaW4sYzBtYXgsYzFtaW4sYzFtYXgsYzJtaW4sYzJtYXg7Ci0gIElOVDMyIGRpc3QwLGRpc3QxLGRpc3QyOwotICBsb25nIGNjb3VudDsKLSAgCi0gIGMwbWluID0gYm94cC0+YzBtaW47ICBjMG1heCA9IGJveHAtPmMwbWF4OwotICBjMW1pbiA9IGJveHAtPmMxbWluOyAgYzFtYXggPSBib3hwLT5jMW1heDsKLSAgYzJtaW4gPSBib3hwLT5jMm1pbjsgIGMybWF4ID0gYm94cC0+YzJtYXg7Ci0gIAotICBpZiAoYzBtYXggPiBjMG1pbikKLSAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKQotICAgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykgewotCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07Ci0JZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykKLQkgIGlmICgqaGlzdHArKyAhPSAwKSB7Ci0JICAgIGJveHAtPmMwbWluID0gYzBtaW4gPSBjMDsKLQkgICAgZ290byBoYXZlX2MwbWluOwotCSAgfQotICAgICAgfQotIGhhdmVfYzBtaW46Ci0gIGlmIChjMG1heCA+IGMwbWluKQotICAgIGZvciAoYzAgPSBjMG1heDsgYzAgPj0gYzBtaW47IGMwLS0pCi0gICAgICBmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrKSB7Ci0JaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MybWluXTsKLQlmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKQotCSAgaWYgKCpoaXN0cCsrICE9IDApIHsKLQkgICAgYm94cC0+YzBtYXggPSBjMG1heCA9IGMwOwotCSAgICBnb3RvIGhhdmVfYzBtYXg7Ci0JICB9Ci0gICAgICB9Ci0gaGF2ZV9jMG1heDoKLSAgaWYgKGMxbWF4ID4gYzFtaW4pCi0gICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykKLSAgICAgIGZvciAoYzAgPSBjMG1pbjsgYzAgPD0gYzBtYXg7IGMwKyspIHsKLQloaXN0cCA9ICYgaGlzdG9ncmFtW2MwXVtjMV1bYzJtaW5dOwotCWZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCi0JICBpZiAoKmhpc3RwKysgIT0gMCkgewotCSAgICBib3hwLT5jMW1pbiA9IGMxbWluID0gYzE7Ci0JICAgIGdvdG8gaGF2ZV9jMW1pbjsKLQkgIH0KLSAgICAgIH0KLSBoYXZlX2MxbWluOgotICBpZiAoYzFtYXggPiBjMW1pbikKLSAgICBmb3IgKGMxID0gYzFtYXg7IGMxID49IGMxbWluOyBjMS0tKQotICAgICAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykgewotCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07Ci0JZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykKLQkgIGlmICgqaGlzdHArKyAhPSAwKSB7Ci0JICAgIGJveHAtPmMxbWF4ID0gYzFtYXggPSBjMTsKLQkgICAgZ290byBoYXZlX2MxbWF4OwotCSAgfQotICAgICAgfQotIGhhdmVfYzFtYXg6Ci0gIGlmIChjMm1heCA+IGMybWluKQotICAgIGZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCi0gICAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKSB7Ci0JaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFtaW5dW2MyXTsKLQlmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrLCBoaXN0cCArPSBISVNUX0MyX0VMRU1TKQotCSAgaWYgKCpoaXN0cCAhPSAwKSB7Ci0JICAgIGJveHAtPmMybWluID0gYzJtaW4gPSBjMjsKLQkgICAgZ290byBoYXZlX2MybWluOwotCSAgfQotICAgICAgfQotIGhhdmVfYzJtaW46Ci0gIGlmIChjMm1heCA+IGMybWluKQotICAgIGZvciAoYzIgPSBjMm1heDsgYzIgPj0gYzJtaW47IGMyLS0pCi0gICAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKSB7Ci0JaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFtaW5dW2MyXTsKLQlmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrLCBoaXN0cCArPSBISVNUX0MyX0VMRU1TKQotCSAgaWYgKCpoaXN0cCAhPSAwKSB7Ci0JICAgIGJveHAtPmMybWF4ID0gYzJtYXggPSBjMjsKLQkgICAgZ290byBoYXZlX2MybWF4OwotCSAgfQotICAgICAgfQotIGhhdmVfYzJtYXg6Ci0KLSAgLyogVXBkYXRlIGJveCB2b2x1bWUuCi0gICAqIFdlIHVzZSAyLW5vcm0gcmF0aGVyIHRoYW4gcmVhbCB2b2x1bWUgaGVyZTsgdGhpcyBiaWFzZXMgdGhlIG1ldGhvZAotICAgKiBhZ2FpbnN0IG1ha2luZyBsb25nIG5hcnJvdyBib3hlcywgYW5kIGl0IGhhcyB0aGUgc2lkZSBiZW5lZml0IHRoYXQKLSAgICogYSBib3ggaXMgc3BsaXR0YWJsZSBpZmYgbm9ybSA+IDAuCi0gICAqIFNpbmNlIHRoZSBkaWZmZXJlbmNlcyBhcmUgZXhwcmVzc2VkIGluIGhpc3RvZ3JhbS1jZWxsIHVuaXRzLAotICAgKiB3ZSBoYXZlIHRvIHNoaWZ0IGJhY2sgdG8gSlNBTVBMRSB1bml0cyB0byBnZXQgY29uc2lzdGVudCBkaXN0YW5jZXM7Ci0gICAqIGFmdGVyIHdoaWNoLCB3ZSBzY2FsZSBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGRpc3RhbmNlIHNjYWxlIGZhY3RvcnMuCi0gICAqLwotICBkaXN0MCA9ICgoYzBtYXggLSBjMG1pbikgPDwgQzBfU0hJRlQpICogQzBfU0NBTEU7Ci0gIGRpc3QxID0gKChjMW1heCAtIGMxbWluKSA8PCBDMV9TSElGVCkgKiBDMV9TQ0FMRTsKLSAgZGlzdDIgPSAoKGMybWF4IC0gYzJtaW4pIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFOwotICBib3hwLT52b2x1bWUgPSBkaXN0MCpkaXN0MCArIGRpc3QxKmRpc3QxICsgZGlzdDIqZGlzdDI7Ci0gIAotICAvKiBOb3cgc2NhbiByZW1haW5pbmcgdm9sdW1lIG9mIGJveCBhbmQgY29tcHV0ZSBwb3B1bGF0aW9uICovCi0gIGNjb3VudCA9IDA7Ci0gIGZvciAoYzAgPSBjMG1pbjsgYzAgPD0gYzBtYXg7IGMwKyspCi0gICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykgewotICAgICAgaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MybWluXTsKLSAgICAgIGZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyssIGhpc3RwKyspCi0JaWYgKCpoaXN0cCAhPSAwKSB7Ci0JICBjY291bnQrKzsKLQl9Ci0gICAgfQotICBib3hwLT5jb2xvcmNvdW50ID0gY2NvdW50OwotfQotCi0KLUxPQ0FMKGludCkKLW1lZGlhbl9jdXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJveHB0ciBib3hsaXN0LCBpbnQgbnVtYm94ZXMsCi0JICAgIGludCBkZXNpcmVkX2NvbG9ycykKLS8qIFJlcGVhdGVkbHkgc2VsZWN0IGFuZCBzcGxpdCB0aGUgbGFyZ2VzdCBib3ggdW50aWwgd2UgaGF2ZSBlbm91Z2ggYm94ZXMgKi8KLXsKLSAgaW50IG4sbGI7Ci0gIGludCBjMCxjMSxjMixjbWF4OwotICByZWdpc3RlciBib3hwdHIgYjEsYjI7Ci0KLSAgd2hpbGUgKG51bWJveGVzIDwgZGVzaXJlZF9jb2xvcnMpIHsKLSAgICAvKiBTZWxlY3QgYm94IHRvIHNwbGl0LgotICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBieSBwb3B1bGF0aW9uIGZvciBmaXJzdCBoYWxmLCB0aGVuIGJ5IHZvbHVtZS4KLSAgICAgKi8KLSAgICBpZiAobnVtYm94ZXMqMiA8PSBkZXNpcmVkX2NvbG9ycykgewotICAgICAgYjEgPSBmaW5kX2JpZ2dlc3RfY29sb3JfcG9wKGJveGxpc3QsIG51bWJveGVzKTsKLSAgICB9IGVsc2UgewotICAgICAgYjEgPSBmaW5kX2JpZ2dlc3Rfdm9sdW1lKGJveGxpc3QsIG51bWJveGVzKTsKLSAgICB9Ci0gICAgaWYgKGIxID09IE5VTEwpCQkvKiBubyBzcGxpdHRhYmxlIGJveGVzIGxlZnQhICovCi0gICAgICBicmVhazsKLSAgICBiMiA9ICZib3hsaXN0W251bWJveGVzXTsJLyogd2hlcmUgbmV3IGJveCB3aWxsIGdvICovCi0gICAgLyogQ29weSB0aGUgY29sb3IgYm91bmRzIHRvIHRoZSBuZXcgYm94LiAqLwotICAgIGIyLT5jMG1heCA9IGIxLT5jMG1heDsgYjItPmMxbWF4ID0gYjEtPmMxbWF4OyBiMi0+YzJtYXggPSBiMS0+YzJtYXg7Ci0gICAgYjItPmMwbWluID0gYjEtPmMwbWluOyBiMi0+YzFtaW4gPSBiMS0+YzFtaW47IGIyLT5jMm1pbiA9IGIxLT5jMm1pbjsKLSAgICAvKiBDaG9vc2Ugd2hpY2ggYXhpcyB0byBzcGxpdCB0aGUgYm94IG9uLgotICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBsb25nZXN0IHNjYWxlZCBheGlzLgotICAgICAqIFNlZSBub3RlcyBpbiB1cGRhdGVfYm94IGFib3V0IHNjYWxpbmcgZGlzdGFuY2VzLgotICAgICAqLwotICAgIGMwID0gKChiMS0+YzBtYXggLSBiMS0+YzBtaW4pIDw8IEMwX1NISUZUKSAqIEMwX1NDQUxFOwotICAgIGMxID0gKChiMS0+YzFtYXggLSBiMS0+YzFtaW4pIDw8IEMxX1NISUZUKSAqIEMxX1NDQUxFOwotICAgIGMyID0gKChiMS0+YzJtYXggLSBiMS0+YzJtaW4pIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFOwotICAgIC8qIFdlIHdhbnQgdG8gYnJlYWsgYW55IHRpZXMgaW4gZmF2b3Igb2YgZ3JlZW4sIHRoZW4gcmVkLCBibHVlIGxhc3QuCi0gICAgICogVGhpcyBjb2RlIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGZvciBSLEcsQiBvciBCLEcsUiBjb2xvciBvcmRlcnMgb25seS4KLSAgICAgKi8KLSNpZiBSR0JfUkVEID09IDAKLSAgICBjbWF4ID0gYzE7IG4gPSAxOwotICAgIGlmIChjMCA+IGNtYXgpIHsgY21heCA9IGMwOyBuID0gMDsgfQotICAgIGlmIChjMiA+IGNtYXgpIHsgbiA9IDI7IH0KLSNlbHNlCi0gICAgY21heCA9IGMxOyBuID0gMTsKLSAgICBpZiAoYzIgPiBjbWF4KSB7IGNtYXggPSBjMjsgbiA9IDI7IH0KLSAgICBpZiAoYzAgPiBjbWF4KSB7IG4gPSAwOyB9Ci0jZW5kaWYKLSAgICAvKiBDaG9vc2Ugc3BsaXQgcG9pbnQgYWxvbmcgc2VsZWN0ZWQgYXhpcywgYW5kIHVwZGF0ZSBib3ggYm91bmRzLgotICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBzcGxpdCBhdCBoYWxmd2F5IHBvaW50LgotICAgICAqIChTaW5jZSB0aGUgYm94IGhhcyBiZWVuIHNocnVuayB0byBtaW5pbXVtIHZvbHVtZSwKLSAgICAgKiBhbnkgc3BsaXQgd2lsbCBwcm9kdWNlIHR3byBub25lbXB0eSBzdWJib3hlcy4pCi0gICAgICogTm90ZSB0aGF0IGxiIHZhbHVlIGlzIG1heCBmb3IgbG93ZXIgYm94LCBzbyBtdXN0IGJlIDwgb2xkIG1heC4KLSAgICAgKi8KLSAgICBzd2l0Y2ggKG4pIHsKLSAgICBjYXNlIDA6Ci0gICAgICBsYiA9IChiMS0+YzBtYXggKyBiMS0+YzBtaW4pIC8gMjsKLSAgICAgIGIxLT5jMG1heCA9IGxiOwotICAgICAgYjItPmMwbWluID0gbGIrMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGxiID0gKGIxLT5jMW1heCArIGIxLT5jMW1pbikgLyAyOwotICAgICAgYjEtPmMxbWF4ID0gbGI7Ci0gICAgICBiMi0+YzFtaW4gPSBsYisxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbGIgPSAoYjEtPmMybWF4ICsgYjEtPmMybWluKSAvIDI7Ci0gICAgICBiMS0+YzJtYXggPSBsYjsKLSAgICAgIGIyLT5jMm1pbiA9IGxiKzE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgLyogVXBkYXRlIHN0YXRzIGZvciBib3hlcyAqLwotICAgIHVwZGF0ZV9ib3goY2luZm8sIGIxKTsKLSAgICB1cGRhdGVfYm94KGNpbmZvLCBiMik7Ci0gICAgbnVtYm94ZXMrKzsKLSAgfQotICByZXR1cm4gbnVtYm94ZXM7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWNvbXB1dGVfY29sb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJveHB0ciBib3hwLCBpbnQgaWNvbG9yKQotLyogQ29tcHV0ZSByZXByZXNlbnRhdGl2ZSBjb2xvciBmb3IgYSBib3gsIHB1dCBpdCBpbiBjb2xvcm1hcFtpY29sb3JdICovCi17Ci0gIC8qIEN1cnJlbnQgYWxnb3JpdGhtOiBtZWFuIHdlaWdodGVkIGJ5IHBpeGVscyAobm90IGNvbG9ycykgKi8KLSAgLyogTm90ZSBpdCBpcyBpbXBvcnRhbnQgdG8gZ2V0IHRoZSByb3VuZGluZyBjb3JyZWN0ISAqLwotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOwotICBoaXN0M2QgaGlzdG9ncmFtID0gY3F1YW50aXplLT5oaXN0b2dyYW07Ci0gIGhpc3RwdHIgaGlzdHA7Ci0gIGludCBjMCxjMSxjMjsKLSAgaW50IGMwbWluLGMwbWF4LGMxbWluLGMxbWF4LGMybWluLGMybWF4OwotICBsb25nIGNvdW50OwotICBsb25nIHRvdGFsID0gMDsKLSAgbG9uZyBjMHRvdGFsID0gMDsKLSAgbG9uZyBjMXRvdGFsID0gMDsKLSAgbG9uZyBjMnRvdGFsID0gMDsKLSAgCi0gIGMwbWluID0gYm94cC0+YzBtaW47ICBjMG1heCA9IGJveHAtPmMwbWF4OwotICBjMW1pbiA9IGJveHAtPmMxbWluOyAgYzFtYXggPSBib3hwLT5jMW1heDsKLSAgYzJtaW4gPSBib3hwLT5jMm1pbjsgIGMybWF4ID0gYm94cC0+YzJtYXg7Ci0gIAotICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKQotICAgIGZvciAoYzEgPSBjMW1pbjsgYzEgPD0gYzFtYXg7IGMxKyspIHsKLSAgICAgIGhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07Ci0gICAgICBmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKSB7Ci0JaWYgKChjb3VudCA9ICpoaXN0cCsrKSAhPSAwKSB7Ci0JICB0b3RhbCArPSBjb3VudDsKLQkgIGMwdG90YWwgKz0gKChjMCA8PCBDMF9TSElGVCkgKyAoKDE8PEMwX1NISUZUKT4+MSkpICogY291bnQ7Ci0JICBjMXRvdGFsICs9ICgoYzEgPDwgQzFfU0hJRlQpICsgKCgxPDxDMV9TSElGVCk+PjEpKSAqIGNvdW50OwotCSAgYzJ0b3RhbCArPSAoKGMyIDw8IEMyX1NISUZUKSArICgoMTw8QzJfU0hJRlQpPj4xKSkgKiBjb3VudDsKLQl9Ci0gICAgICB9Ci0gICAgfQotICAKLSAgY2luZm8tPmNvbG9ybWFwWzBdW2ljb2xvcl0gPSAoSlNBTVBMRSkgKChjMHRvdGFsICsgKHRvdGFsPj4xKSkgLyB0b3RhbCk7Ci0gIGNpbmZvLT5jb2xvcm1hcFsxXVtpY29sb3JdID0gKEpTQU1QTEUpICgoYzF0b3RhbCArICh0b3RhbD4+MSkpIC8gdG90YWwpOwotICBjaW5mby0+Y29sb3JtYXBbMl1baWNvbG9yXSA9IChKU0FNUExFKSAoKGMydG90YWwgKyAodG90YWw+PjEpKSAvIHRvdGFsKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotc2VsZWN0X2NvbG9ycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWRfY29sb3JzKQotLyogTWFzdGVyIHJvdXRpbmUgZm9yIGNvbG9yIHNlbGVjdGlvbiAqLwotewotICBib3hwdHIgYm94bGlzdDsKLSAgaW50IG51bWJveGVzOwotICBpbnQgaTsKLQotICAvKiBBbGxvY2F0ZSB3b3Jrc3BhY2UgZm9yIGJveCBsaXN0ICovCi0gIGJveGxpc3QgPSAoYm94cHRyKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGRlc2lyZWRfY29sb3JzICogU0laRU9GKGJveCkpOwotICAvKiBJbml0aWFsaXplIG9uZSBib3ggY29udGFpbmluZyB3aG9sZSBzcGFjZSAqLwotICBudW1ib3hlcyA9IDE7Ci0gIGJveGxpc3RbMF0uYzBtaW4gPSAwOwotICBib3hsaXN0WzBdLmMwbWF4ID0gTUFYSlNBTVBMRSA+PiBDMF9TSElGVDsKLSAgYm94bGlzdFswXS5jMW1pbiA9IDA7Ci0gIGJveGxpc3RbMF0uYzFtYXggPSBNQVhKU0FNUExFID4+IEMxX1NISUZUOwotICBib3hsaXN0WzBdLmMybWluID0gMDsKLSAgYm94bGlzdFswXS5jMm1heCA9IE1BWEpTQU1QTEUgPj4gQzJfU0hJRlQ7Ci0gIC8qIFNocmluayBpdCB0byBhY3R1YWxseS11c2VkIHZvbHVtZSBhbmQgc2V0IGl0cyBzdGF0aXN0aWNzICovCi0gIHVwZGF0ZV9ib3goY2luZm8sICYgYm94bGlzdFswXSk7Ci0gIC8qIFBlcmZvcm0gbWVkaWFuLWN1dCB0byBwcm9kdWNlIGZpbmFsIGJveCBsaXN0ICovCi0gIG51bWJveGVzID0gbWVkaWFuX2N1dChjaW5mbywgYm94bGlzdCwgbnVtYm94ZXMsIGRlc2lyZWRfY29sb3JzKTsKLSAgLyogQ29tcHV0ZSB0aGUgcmVwcmVzZW50YXRpdmUgY29sb3IgZm9yIGVhY2ggYm94LCBmaWxsIGNvbG9ybWFwICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1ib3hlczsgaSsrKQotICAgIGNvbXB1dGVfY29sb3IoY2luZm8sICYgYm94bGlzdFtpXSwgaSk7Ci0gIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyA9IG51bWJveGVzOwotICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19RVUFOVF9TRUxFQ1RFRCwgbnVtYm94ZXMpOwotfQotCi0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggdGhlIHRpbWUtY3JpdGljYWwgdGFzayBvZiBtYXBwaW5nIGlucHV0Ci0gKiBjb2xvcnMgdG8gdGhlIG5lYXJlc3QgY29sb3IgaW4gdGhlIHNlbGVjdGVkIGNvbG9ybWFwLgotICoKLSAqIFdlIHJlLXVzZSB0aGUgaGlzdG9ncmFtIHNwYWNlIGFzIGFuICJpbnZlcnNlIGNvbG9yIG1hcCIsIGVzc2VudGlhbGx5IGEKLSAqIGNhY2hlIGZvciB0aGUgcmVzdWx0cyBvZiBuZWFyZXN0LWNvbG9yIHNlYXJjaGVzLiAgQWxsIGNvbG9ycyB3aXRoaW4gYQotICogaGlzdG9ncmFtIGNlbGwgd2lsbCBiZSBtYXBwZWQgdG8gdGhlIHNhbWUgY29sb3JtYXAgZW50cnksIG5hbWVseSB0aGUgb25lCi0gKiBjbG9zZXN0IHRvIHRoZSBjZWxsJ3MgY2VudGVyLiAgVGhpcyBtYXkgbm90IGJlIHF1aXRlIHRoZSBjbG9zZXN0IGVudHJ5IHRvCi0gKiB0aGUgYWN0dWFsIGlucHV0IGNvbG9yLCBidXQgaXQncyBhbG1vc3QgYXMgZ29vZC4gIEEgemVybyBpbiB0aGUgY2FjaGUKLSAqIGluZGljYXRlcyB3ZSBoYXZlbid0IGZvdW5kIHRoZSBuZWFyZXN0IGNvbG9yIGZvciB0aGF0IGNlbGwgeWV0OyB0aGUgYXJyYXkKLSAqIGlzIGNsZWFyZWQgdG8gemVyb2VzIGJlZm9yZSBzdGFydGluZyB0aGUgbWFwcGluZyBwYXNzLiAgV2hlbiB3ZSBmaW5kIHRoZQotICogbmVhcmVzdCBjb2xvciBmb3IgYSBjZWxsLCBpdHMgY29sb3JtYXAgaW5kZXggcGx1cyBvbmUgaXMgcmVjb3JkZWQgaW4gdGhlCi0gKiBjYWNoZSBmb3IgZnV0dXJlIHVzZS4gIFRoZSBwYXNzMiBzY2FubmluZyByb3V0aW5lcyBjYWxsIGZpbGxfaW52ZXJzZV9jbWFwCi0gKiB3aGVuIHRoZXkgbmVlZCB0byB1c2UgYW4gdW5maWxsZWQgZW50cnkgaW4gdGhlIGNhY2hlLgotICoKLSAqIE91ciBtZXRob2Qgb2YgZWZmaWNpZW50bHkgZmluZGluZyBuZWFyZXN0IGNvbG9ycyBpcyBiYXNlZCBvbiB0aGUgImxvY2FsbHkKLSAqIHNvcnRlZCBzZWFyY2giIGlkZWEgZGVzY3JpYmVkIGJ5IEhlY2tiZXJ0IGFuZCBvbiB0aGUgaW5jcmVtZW50YWwgZGlzdGFuY2UKLSAqIGNhbGN1bGF0aW9uIGRlc2NyaWJlZCBieSBTcGVuY2VyIFcuIFRob21hcyBpbiBjaGFwdGVyIElJSS4xIG9mIEdyYXBoaWNzCi0gKiBHZW1zIElJIChKYW1lcyBBcnZvLCBlZC4gIEFjYWRlbWljIFByZXNzLCAxOTkxKS4gIFRob21hcyBwb2ludHMgb3V0IHRoYXQKLSAqIHRoZSBkaXN0YW5jZXMgZnJvbSBhIGdpdmVuIGNvbG9ybWFwIGVudHJ5IHRvIGVhY2ggY2VsbCBvZiB0aGUgaGlzdG9ncmFtIGNhbgotICogYmUgY29tcHV0ZWQgcXVpY2tseSB1c2luZyBhbiBpbmNyZW1lbnRhbCBtZXRob2Q6IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCi0gKiBkaXN0YW5jZXMgdG8gYWRqYWNlbnQgY2VsbHMgdGhlbXNlbHZlcyBkaWZmZXIgYnkgYSBjb25zdGFudC4gIFRoaXMgYWxsb3dzIGEKLSAqIGZhaXJseSBmYXN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSAiYnJ1dGUgZm9yY2UiIGFwcHJvYWNoIG9mIGNvbXB1dGluZyB0aGUKLSAqIGRpc3RhbmNlIGZyb20gZXZlcnkgY29sb3JtYXAgZW50cnkgdG8gZXZlcnkgaGlzdG9ncmFtIGNlbGwuICBVbmZvcnR1bmF0ZWx5LAotICogaXQgbmVlZHMgYSB3b3JrIGFycmF5IHRvIGhvbGQgdGhlIGJlc3QtZGlzdGFuY2Utc28tZmFyIGZvciBlYWNoIGhpc3RvZ3JhbQotICogY2VsbCAoYmVjYXVzZSB0aGUgaW5uZXIgbG9vcCBoYXMgdG8gYmUgb3ZlciBjZWxscywgbm90IGNvbG9ybWFwIGVudHJpZXMpLgotICogVGhlIHdvcmsgYXJyYXkgZWxlbWVudHMgaGF2ZSB0byBiZSBJTlQzMnMsIHNvIHRoZSB3b3JrIGFycmF5IHdvdWxkIG5lZWQKLSAqIDI1NktiIGF0IG91ciByZWNvbW1lbmRlZCBwcmVjaXNpb24uICBUaGlzIGlzIG5vdCBmZWFzaWJsZSBpbiBET1MgbWFjaGluZXMuCi0gKgotICogVG8gZ2V0IGFyb3VuZCB0aGVzZSBwcm9ibGVtcywgd2UgYXBwbHkgVGhvbWFzJyBtZXRob2QgdG8gY29tcHV0ZSB0aGUKLSAqIG5lYXJlc3QgY29sb3JzIGZvciBvbmx5IHRoZSBjZWxscyB3aXRoaW4gYSBzbWFsbCBzdWJib3ggb2YgdGhlIGhpc3RvZ3JhbS4KLSAqIFRoZSB3b3JrIGFycmF5IG5lZWQgYmUgb25seSBhcyBiaWcgYXMgdGhlIHN1YmJveCwgc28gdGhlIG1lbW9yeSB1c2FnZQotICogcHJvYmxlbSBpcyBzb2x2ZWQuICBGdXJ0aGVybW9yZSwgd2UgbmVlZCBub3QgZmlsbCBzdWJib3hlcyB0aGF0IGFyZSBuZXZlcgotICogcmVmZXJlbmNlZCBpbiBwYXNzMjsgbWFueSBpbWFnZXMgdXNlIG9ubHkgcGFydCBvZiB0aGUgY29sb3IgZ2FtdXQsIHNvIGEKLSAqIGZhaXIgYW1vdW50IG9mIHdvcmsgaXMgc2F2ZWQuICBBbiBhZGRpdGlvbmFsIGFkdmFudGFnZSBvZiB0aGlzCi0gKiBhcHByb2FjaCBpcyB0aGF0IHdlIGNhbiBhcHBseSBIZWNrYmVydCdzIGxvY2FsaXR5IGNyaXRlcmlvbiB0byBxdWlja2x5Ci0gKiBlbGltaW5hdGUgY29sb3JtYXAgZW50cmllcyB0aGF0IGFyZSBmYXIgYXdheSBmcm9tIHRoZSBzdWJib3g7IHR5cGljYWxseQotICogdGhyZWUtZm91cnRocyBvZiB0aGUgY29sb3JtYXAgZW50cmllcyBhcmUgcmVqZWN0ZWQgYnkgSGVja2JlcnQncyBjcml0ZXJpb24sCi0gKiBhbmQgd2UgbmVlZCBub3QgY29tcHV0ZSB0aGVpciBkaXN0YW5jZXMgdG8gaW5kaXZpZHVhbCBjZWxscyBpbiB0aGUgc3ViYm94LgotICogVGhlIHNwZWVkIG9mIHRoaXMgYXBwcm9hY2ggaXMgaGVhdmlseSBpbmZsdWVuY2VkIGJ5IHRoZSBzdWJib3ggc2l6ZTogdG9vCi0gKiBzbWFsbCBtZWFucyB0b28gbXVjaCBvdmVyaGVhZCwgdG9vIGJpZyBsb3NlcyBiZWNhdXNlIEhlY2tiZXJ0J3MgY3JpdGVyaW9uCi0gKiBjYW4ndCBlbGltaW5hdGUgYXMgbWFueSBjb2xvcm1hcCBlbnRyaWVzLiAgRW1waXJpY2FsbHkgdGhlIGJlc3Qgc3ViYm94Ci0gKiBzaXplIHNlZW1zIHRvIGJlIGFib3V0IDEvNTEydGggb2YgdGhlIGhpc3RvZ3JhbSAoMS84dGggaW4gZWFjaCBkaXJlY3Rpb24pLgotICoKLSAqIFRob21hcycgYXJ0aWNsZSBhbHNvIGRlc2NyaWJlcyBhIHJlZmluZWQgbWV0aG9kIHdoaWNoIGlzIGFzeW1wdG90aWNhbGx5Ci0gKiBmYXN0ZXIgdGhhbiB0aGUgYnJ1dGUtZm9yY2UgbWV0aG9kLCBidXQgaXQgaXMgYWxzbyBmYXIgbW9yZSBjb21wbGV4IGFuZAotICogY2Fubm90IGVmZmljaWVudGx5IGJlIGFwcGxpZWQgdG8gc21hbGwgc3ViYm94ZXMuICBJdCBpcyB0aGVyZWZvcmUgbm90Ci0gKiB1c2VmdWwgZm9yIHByb2dyYW1zIGludGVuZGVkIHRvIGJlIHBvcnRhYmxlIHRvIERPUyBtYWNoaW5lcy4gIE9uIG1hY2hpbmVzCi0gKiB3aXRoIHBsZW50eSBvZiBtZW1vcnksIGZpbGxpbmcgdGhlIHdob2xlIGhpc3RvZ3JhbSBpbiBvbmUgc2hvdCB3aXRoIFRob21hcycKLSAqIHJlZmluZWQgbWV0aG9kIG1pZ2h0IGJlIGZhc3RlciB0aGFuIHRoZSBwcmVzZW50IGNvZGUgLS0tIGJ1dCB0aGVuIGFnYWluLAotICogaXQgbWlnaHQgbm90IGJlIGFueSBmYXN0ZXIsIGFuZCBpdCdzIGNlcnRhaW5seSBtb3JlIGNvbXBsaWNhdGVkLgotICovCi0KLQotLyogbG9nMihoaXN0b2dyYW0gY2VsbHMgaW4gdXBkYXRlIGJveCkgZm9yIGVhY2ggYXhpczsgdGhpcyBjYW4gYmUgYWRqdXN0ZWQgKi8KLSNkZWZpbmUgQk9YX0MwX0xPRyAgKEhJU1RfQzBfQklUUy0zKQotI2RlZmluZSBCT1hfQzFfTE9HICAoSElTVF9DMV9CSVRTLTMpCi0jZGVmaW5lIEJPWF9DMl9MT0cgIChISVNUX0MyX0JJVFMtMykKLQotI2RlZmluZSBCT1hfQzBfRUxFTVMgICgxPDxCT1hfQzBfTE9HKSAvKiAjIG9mIGhpc3QgY2VsbHMgaW4gdXBkYXRlIGJveCAqLwotI2RlZmluZSBCT1hfQzFfRUxFTVMgICgxPDxCT1hfQzFfTE9HKQotI2RlZmluZSBCT1hfQzJfRUxFTVMgICgxPDxCT1hfQzJfTE9HKQotCi0jZGVmaW5lIEJPWF9DMF9TSElGVCAgKEMwX1NISUZUICsgQk9YX0MwX0xPRykKLSNkZWZpbmUgQk9YX0MxX1NISUZUICAoQzFfU0hJRlQgKyBCT1hfQzFfTE9HKQotI2RlZmluZSBCT1hfQzJfU0hJRlQgIChDMl9TSElGVCArIEJPWF9DMl9MT0cpCi0KLQotLyoKLSAqIFRoZSBuZXh0IHRocmVlIHJvdXRpbmVzIGltcGxlbWVudCBpbnZlcnNlIGNvbG9ybWFwIGZpbGxpbmcuICBUaGV5IGNvdWxkCi0gKiBhbGwgYmUgZm9sZGVkIGludG8gb25lIGJpZyByb3V0aW5lLCBidXQgc3BsaXR0aW5nIHRoZW0gdXAgdGhpcyB3YXkgc2F2ZXMKLSAqIHNvbWUgc3RhY2sgc3BhY2UgKHRoZSBtaW5kaXN0W10gYW5kIGJlc3RkaXN0W10gYXJyYXlzIG5lZWQgbm90IGNvZXhpc3QpCi0gKiBhbmQgbWF5IGFsbG93IHNvbWUgY29tcGlsZXJzIHRvIHByb2R1Y2UgYmV0dGVyIGNvZGUgYnkgcmVnaXN0ZXJpemluZyBtb3JlCi0gKiBpbm5lci1sb29wIHZhcmlhYmxlcy4KLSAqLwotCi1MT0NBTChpbnQpCi1maW5kX25lYXJieV9jb2xvcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtaW5jMCwgaW50IG1pbmMxLCBpbnQgbWluYzIsCi0JCSAgICBKU0FNUExFIGNvbG9ybGlzdFtdKQotLyogTG9jYXRlIHRoZSBjb2xvcm1hcCBlbnRyaWVzIGNsb3NlIGVub3VnaCB0byBhbiB1cGRhdGUgYm94IHRvIGJlIGNhbmRpZGF0ZXMKLSAqIGZvciB0aGUgbmVhcmVzdCBlbnRyeSB0byBzb21lIGNlbGwocykgaW4gdGhlIHVwZGF0ZSBib3guICBUaGUgdXBkYXRlIGJveAotICogaXMgc3BlY2lmaWVkIGJ5IHRoZSBjZW50ZXIgY29vcmRpbmF0ZXMgb2YgaXRzIGZpcnN0IGNlbGwuICBUaGUgbnVtYmVyIG9mCi0gKiBjYW5kaWRhdGUgY29sb3JtYXAgZW50cmllcyBpcyByZXR1cm5lZCwgYW5kIHRoZWlyIGNvbG9ybWFwIGluZGV4ZXMgYXJlCi0gKiBwbGFjZWQgaW4gY29sb3JsaXN0W10uCi0gKiBUaGlzIHJvdXRpbmUgdXNlcyBIZWNrYmVydCdzICJsb2NhbGx5IHNvcnRlZCBzZWFyY2giIGNyaXRlcmlvbiB0byBzZWxlY3QKLSAqIHRoZSBjb2xvcnMgdGhhdCBuZWVkIGZ1cnRoZXIgY29uc2lkZXJhdGlvbi4KLSAqLwotewotICBpbnQgbnVtY29sb3JzID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOwotICBpbnQgbWF4YzAsIG1heGMxLCBtYXhjMjsKLSAgaW50IGNlbnRlcmMwLCBjZW50ZXJjMSwgY2VudGVyYzI7Ci0gIGludCBpLCB4LCBuY29sb3JzOwotICBJTlQzMiBtaW5tYXhkaXN0LCBtaW5fZGlzdCwgbWF4X2Rpc3QsIHRkaXN0OwotICBJTlQzMiBtaW5kaXN0W01BWE5VTUNPTE9SU107CS8qIG1pbiBkaXN0YW5jZSB0byBjb2xvcm1hcCBlbnRyeSBpICovCi0KLSAgLyogQ29tcHV0ZSB0cnVlIGNvb3JkaW5hdGVzIG9mIHVwZGF0ZSBib3gncyB1cHBlciBjb3JuZXIgYW5kIGNlbnRlci4KLSAgICogQWN0dWFsbHkgd2UgY29tcHV0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciBvZiB0aGUgdXBwZXItY29ybmVyCi0gICAqIGhpc3RvZ3JhbSBjZWxsLCB3aGljaCBhcmUgdGhlIHVwcGVyIGJvdW5kcyBvZiB0aGUgdm9sdW1lIHdlIGNhcmUgYWJvdXQuCi0gICAqIE5vdGUgdGhhdCBzaW5jZSAiPj4iIHJvdW5kcyBkb3duLCB0aGUgImNlbnRlciIgdmFsdWVzIG1heSBiZSBjbG9zZXIgdG8KLSAgICogbWluIHRoYW4gdG8gbWF4OyBoZW5jZSBjb21wYXJpc29ucyB0byB0aGVtIG11c3QgYmUgIjw9Iiwgbm90ICI8Ii4KLSAgICovCi0gIG1heGMwID0gbWluYzAgKyAoKDEgPDwgQk9YX0MwX1NISUZUKSAtICgxIDw8IEMwX1NISUZUKSk7Ci0gIGNlbnRlcmMwID0gKG1pbmMwICsgbWF4YzApID4+IDE7Ci0gIG1heGMxID0gbWluYzEgKyAoKDEgPDwgQk9YX0MxX1NISUZUKSAtICgxIDw8IEMxX1NISUZUKSk7Ci0gIGNlbnRlcmMxID0gKG1pbmMxICsgbWF4YzEpID4+IDE7Ci0gIG1heGMyID0gbWluYzIgKyAoKDEgPDwgQk9YX0MyX1NISUZUKSAtICgxIDw8IEMyX1NISUZUKSk7Ci0gIGNlbnRlcmMyID0gKG1pbmMyICsgbWF4YzIpID4+IDE7Ci0KLSAgLyogRm9yIGVhY2ggY29sb3IgaW4gY29sb3JtYXAsIGZpbmQ6Ci0gICAqICAxLiBpdHMgbWluaW11bSBzcXVhcmVkLWRpc3RhbmNlIHRvIGFueSBwb2ludCBpbiB0aGUgdXBkYXRlIGJveAotICAgKiAgICAgKHplcm8gaWYgY29sb3IgaXMgd2l0aGluIHVwZGF0ZSBib3gpOwotICAgKiAgMi4gaXRzIG1heGltdW0gc3F1YXJlZC1kaXN0YW5jZSB0byBhbnkgcG9pbnQgaW4gdGhlIHVwZGF0ZSBib3guCi0gICAqIEJvdGggb2YgdGhlc2UgY2FuIGJlIGZvdW5kIGJ5IGNvbnNpZGVyaW5nIG9ubHkgdGhlIGNvcm5lcnMgb2YgdGhlIGJveC4KLSAgICogV2Ugc2F2ZSB0aGUgbWluaW11bSBkaXN0YW5jZSBmb3IgZWFjaCBjb2xvciBpbiBtaW5kaXN0W107Ci0gICAqIG9ubHkgdGhlIHNtYWxsZXN0IG1heGltdW0gZGlzdGFuY2UgaXMgb2YgaW50ZXJlc3QuCi0gICAqLwotICBtaW5tYXhkaXN0ID0gMHg3RkZGRkZGRkw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bWNvbG9yczsgaSsrKSB7Ci0gICAgLyogV2UgY29tcHV0ZSB0aGUgc3F1YXJlZC1jMC1kaXN0YW5jZSB0ZXJtLCB0aGVuIGFkZCBpbiB0aGUgb3RoZXIgdHdvLiAqLwotICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFswXVtpXSk7Ci0gICAgaWYgKHggPCBtaW5jMCkgewotICAgICAgdGRpc3QgPSAoeCAtIG1pbmMwKSAqIEMwX1NDQUxFOwotICAgICAgbWluX2Rpc3QgPSB0ZGlzdCp0ZGlzdDsKLSAgICAgIHRkaXN0ID0gKHggLSBtYXhjMCkgKiBDMF9TQ0FMRTsKLSAgICAgIG1heF9kaXN0ID0gdGRpc3QqdGRpc3Q7Ci0gICAgfSBlbHNlIGlmICh4ID4gbWF4YzApIHsKLSAgICAgIHRkaXN0ID0gKHggLSBtYXhjMCkgKiBDMF9TQ0FMRTsKLSAgICAgIG1pbl9kaXN0ID0gdGRpc3QqdGRpc3Q7Ci0gICAgICB0ZGlzdCA9ICh4IC0gbWluYzApICogQzBfU0NBTEU7Ci0gICAgICBtYXhfZGlzdCA9IHRkaXN0KnRkaXN0OwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiB3aXRoaW4gY2VsbCByYW5nZSBzbyBubyBjb250cmlidXRpb24gdG8gbWluX2Rpc3QgKi8KLSAgICAgIG1pbl9kaXN0ID0gMDsKLSAgICAgIGlmICh4IDw9IGNlbnRlcmMwKSB7Ci0JdGRpc3QgPSAoeCAtIG1heGMwKSAqIEMwX1NDQUxFOwotCW1heF9kaXN0ID0gdGRpc3QqdGRpc3Q7Ci0gICAgICB9IGVsc2UgewotCXRkaXN0ID0gKHggLSBtaW5jMCkgKiBDMF9TQ0FMRTsKLQltYXhfZGlzdCA9IHRkaXN0KnRkaXN0OwotICAgICAgfQotICAgIH0KLQotICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsxXVtpXSk7Ci0gICAgaWYgKHggPCBtaW5jMSkgewotICAgICAgdGRpc3QgPSAoeCAtIG1pbmMxKSAqIEMxX1NDQUxFOwotICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7Ci0gICAgICB0ZGlzdCA9ICh4IC0gbWF4YzEpICogQzFfU0NBTEU7Ci0gICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKLSAgICB9IGVsc2UgaWYgKHggPiBtYXhjMSkgewotICAgICAgdGRpc3QgPSAoeCAtIG1heGMxKSAqIEMxX1NDQUxFOwotICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7Ci0gICAgICB0ZGlzdCA9ICh4IC0gbWluYzEpICogQzFfU0NBTEU7Ci0gICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKLSAgICB9IGVsc2UgewotICAgICAgLyogd2l0aGluIGNlbGwgcmFuZ2Ugc28gbm8gY29udHJpYnV0aW9uIHRvIG1pbl9kaXN0ICovCi0gICAgICBpZiAoeCA8PSBjZW50ZXJjMSkgewotCXRkaXN0ID0gKHggLSBtYXhjMSkgKiBDMV9TQ0FMRTsKLQltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKLSAgICAgIH0gZWxzZSB7Ci0JdGRpc3QgPSAoeCAtIG1pbmMxKSAqIEMxX1NDQUxFOwotCW1heF9kaXN0ICs9IHRkaXN0KnRkaXN0OwotICAgICAgfQotICAgIH0KLQotICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsyXVtpXSk7Ci0gICAgaWYgKHggPCBtaW5jMikgewotICAgICAgdGRpc3QgPSAoeCAtIG1pbmMyKSAqIEMyX1NDQUxFOwotICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7Ci0gICAgICB0ZGlzdCA9ICh4IC0gbWF4YzIpICogQzJfU0NBTEU7Ci0gICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKLSAgICB9IGVsc2UgaWYgKHggPiBtYXhjMikgewotICAgICAgdGRpc3QgPSAoeCAtIG1heGMyKSAqIEMyX1NDQUxFOwotICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7Ci0gICAgICB0ZGlzdCA9ICh4IC0gbWluYzIpICogQzJfU0NBTEU7Ci0gICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKLSAgICB9IGVsc2UgewotICAgICAgLyogd2l0aGluIGNlbGwgcmFuZ2Ugc28gbm8gY29udHJpYnV0aW9uIHRvIG1pbl9kaXN0ICovCi0gICAgICBpZiAoeCA8PSBjZW50ZXJjMikgewotCXRkaXN0ID0gKHggLSBtYXhjMikgKiBDMl9TQ0FMRTsKLQltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKLSAgICAgIH0gZWxzZSB7Ci0JdGRpc3QgPSAoeCAtIG1pbmMyKSAqIEMyX1NDQUxFOwotCW1heF9kaXN0ICs9IHRkaXN0KnRkaXN0OwotICAgICAgfQotICAgIH0KLQotICAgIG1pbmRpc3RbaV0gPSBtaW5fZGlzdDsJLyogc2F2ZSBhd2F5IHRoZSByZXN1bHRzICovCi0gICAgaWYgKG1heF9kaXN0IDwgbWlubWF4ZGlzdCkKLSAgICAgIG1pbm1heGRpc3QgPSBtYXhfZGlzdDsKLSAgfQotCi0gIC8qIE5vdyB3ZSBrbm93IHRoYXQgbm8gY2VsbCBpbiB0aGUgdXBkYXRlIGJveCBpcyBtb3JlIHRoYW4gbWlubWF4ZGlzdAotICAgKiBhd2F5IGZyb20gc29tZSBjb2xvcm1hcCBlbnRyeS4gIFRoZXJlZm9yZSwgb25seSBjb2xvcnMgdGhhdCBhcmUKLSAgICogd2l0aGluIG1pbm1heGRpc3Qgb2Ygc29tZSBwYXJ0IG9mIHRoZSBib3ggbmVlZCBiZSBjb25zaWRlcmVkLgotICAgKi8KLSAgbmNvbG9ycyA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1jb2xvcnM7IGkrKykgewotICAgIGlmIChtaW5kaXN0W2ldIDw9IG1pbm1heGRpc3QpCi0gICAgICBjb2xvcmxpc3RbbmNvbG9ycysrXSA9IChKU0FNUExFKSBpOwotICB9Ci0gIHJldHVybiBuY29sb3JzOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1maW5kX2Jlc3RfY29sb3JzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWluYzAsIGludCBtaW5jMSwgaW50IG1pbmMyLAotCQkgIGludCBudW1jb2xvcnMsIEpTQU1QTEUgY29sb3JsaXN0W10sIEpTQU1QTEUgYmVzdGNvbG9yW10pCi0vKiBGaW5kIHRoZSBjbG9zZXN0IGNvbG9ybWFwIGVudHJ5IGZvciBlYWNoIGNlbGwgaW4gdGhlIHVwZGF0ZSBib3gsCi0gKiBnaXZlbiB0aGUgbGlzdCBvZiBjYW5kaWRhdGUgY29sb3JzIHByZXBhcmVkIGJ5IGZpbmRfbmVhcmJ5X2NvbG9ycy4KLSAqIFJldHVybiB0aGUgaW5kZXhlcyBvZiB0aGUgY2xvc2VzdCBlbnRyaWVzIGluIHRoZSBiZXN0Y29sb3JbXSBhcnJheS4KLSAqIFRoaXMgcm91dGluZSB1c2VzIFRob21hcycgaW5jcmVtZW50YWwgZGlzdGFuY2UgY2FsY3VsYXRpb24gbWV0aG9kIHRvCi0gKiBmaW5kIHRoZSBkaXN0YW5jZSBmcm9tIGEgY29sb3JtYXAgZW50cnkgdG8gc3VjY2Vzc2l2ZSBjZWxscyBpbiB0aGUgYm94LgotICovCi17Ci0gIGludCBpYzAsIGljMSwgaWMyOwotICBpbnQgaSwgaWNvbG9yOwotICByZWdpc3RlciBJTlQzMiAqIGJwdHI7CS8qIHBvaW50ZXIgaW50byBiZXN0ZGlzdFtdIGFycmF5ICovCi0gIEpTQU1QTEUgKiBjcHRyOwkJLyogcG9pbnRlciBpbnRvIGJlc3Rjb2xvcltdIGFycmF5ICovCi0gIElOVDMyIGRpc3QwLCBkaXN0MTsJCS8qIGluaXRpYWwgZGlzdGFuY2UgdmFsdWVzICovCi0gIHJlZ2lzdGVyIElOVDMyIGRpc3QyOwkJLyogY3VycmVudCBkaXN0YW5jZSBpbiBpbm5lciBsb29wICovCi0gIElOVDMyIHh4MCwgeHgxOwkJLyogZGlzdGFuY2UgaW5jcmVtZW50cyAqLwotICByZWdpc3RlciBJTlQzMiB4eDI7Ci0gIElOVDMyIGluYzAsIGluYzEsIGluYzI7CS8qIGluaXRpYWwgdmFsdWVzIGZvciBpbmNyZW1lbnRzICovCi0gIC8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGRpc3RhbmNlIHRvIHRoZSBuZWFyZXN0LXNvLWZhciBjb2xvciBmb3IgZWFjaCBjZWxsICovCi0gIElOVDMyIGJlc3RkaXN0W0JPWF9DMF9FTEVNUyAqIEJPWF9DMV9FTEVNUyAqIEJPWF9DMl9FTEVNU107Ci0KLSAgLyogSW5pdGlhbGl6ZSBiZXN0LWRpc3RhbmNlIGZvciBlYWNoIGNlbGwgb2YgdGhlIHVwZGF0ZSBib3ggKi8KLSAgYnB0ciA9IGJlc3RkaXN0OwotICBmb3IgKGkgPSBCT1hfQzBfRUxFTVMqQk9YX0MxX0VMRU1TKkJPWF9DMl9FTEVNUy0xOyBpID49IDA7IGktLSkKLSAgICAqYnB0cisrID0gMHg3RkZGRkZGRkw7Ci0gIAotICAvKiBGb3IgZWFjaCBjb2xvciBzZWxlY3RlZCBieSBmaW5kX25lYXJieV9jb2xvcnMsCi0gICAqIGNvbXB1dGUgaXRzIGRpc3RhbmNlIHRvIHRoZSBjZW50ZXIgb2YgZWFjaCBjZWxsIGluIHRoZSBib3guCi0gICAqIElmIHRoYXQncyBsZXNzIHRoYW4gYmVzdC1zby1mYXIsIHVwZGF0ZSBiZXN0IGRpc3RhbmNlIGFuZCBjb2xvciBudW1iZXIuCi0gICAqLwotICAKLSAgLyogTm9taW5hbCBzdGVwcyBiZXR3ZWVuIGNlbGwgY2VudGVycyAoIngiIGluIFRob21hcyBhcnRpY2xlKSAqLwotI2RlZmluZSBTVEVQX0MwICAoKDEgPDwgQzBfU0hJRlQpICogQzBfU0NBTEUpCi0jZGVmaW5lIFNURVBfQzEgICgoMSA8PCBDMV9TSElGVCkgKiBDMV9TQ0FMRSkKLSNkZWZpbmUgU1RFUF9DMiAgKCgxIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFKQotICAKLSAgZm9yIChpID0gMDsgaSA8IG51bWNvbG9yczsgaSsrKSB7Ci0gICAgaWNvbG9yID0gR0VUSlNBTVBMRShjb2xvcmxpc3RbaV0pOwotICAgIC8qIENvbXB1dGUgKHNxdWFyZSBvZikgZGlzdGFuY2UgZnJvbSBtaW5jMC9jMS9jMiB0byB0aGlzIGNvbG9yICovCi0gICAgaW5jMCA9IChtaW5jMCAtIEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzBdW2ljb2xvcl0pKSAqIEMwX1NDQUxFOwotICAgIGRpc3QwID0gaW5jMCppbmMwOwotICAgIGluYzEgPSAobWluYzEgLSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsxXVtpY29sb3JdKSkgKiBDMV9TQ0FMRTsKLSAgICBkaXN0MCArPSBpbmMxKmluYzE7Ci0gICAgaW5jMiA9IChtaW5jMiAtIEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzJdW2ljb2xvcl0pKSAqIEMyX1NDQUxFOwotICAgIGRpc3QwICs9IGluYzIqaW5jMjsKLSAgICAvKiBGb3JtIHRoZSBpbml0aWFsIGRpZmZlcmVuY2UgaW5jcmVtZW50cyAqLwotICAgIGluYzAgPSBpbmMwICogKDIgKiBTVEVQX0MwKSArIFNURVBfQzAgKiBTVEVQX0MwOwotICAgIGluYzEgPSBpbmMxICogKDIgKiBTVEVQX0MxKSArIFNURVBfQzEgKiBTVEVQX0MxOwotICAgIGluYzIgPSBpbmMyICogKDIgKiBTVEVQX0MyKSArIFNURVBfQzIgKiBTVEVQX0MyOwotICAgIC8qIE5vdyBsb29wIG92ZXIgYWxsIGNlbGxzIGluIGJveCwgdXBkYXRpbmcgZGlzdGFuY2UgcGVyIFRob21hcyBtZXRob2QgKi8KLSAgICBicHRyID0gYmVzdGRpc3Q7Ci0gICAgY3B0ciA9IGJlc3Rjb2xvcjsKLSAgICB4eDAgPSBpbmMwOwotICAgIGZvciAoaWMwID0gQk9YX0MwX0VMRU1TLTE7IGljMCA+PSAwOyBpYzAtLSkgewotICAgICAgZGlzdDEgPSBkaXN0MDsKLSAgICAgIHh4MSA9IGluYzE7Ci0gICAgICBmb3IgKGljMSA9IEJPWF9DMV9FTEVNUy0xOyBpYzEgPj0gMDsgaWMxLS0pIHsKLQlkaXN0MiA9IGRpc3QxOwotCXh4MiA9IGluYzI7Ci0JZm9yIChpYzIgPSBCT1hfQzJfRUxFTVMtMTsgaWMyID49IDA7IGljMi0tKSB7Ci0JICBpZiAoZGlzdDIgPCAqYnB0cikgewotCSAgICAqYnB0ciA9IGRpc3QyOwotCSAgICAqY3B0ciA9IChKU0FNUExFKSBpY29sb3I7Ci0JICB9Ci0JICBkaXN0MiArPSB4eDI7Ci0JICB4eDIgKz0gMiAqIFNURVBfQzIgKiBTVEVQX0MyOwotCSAgYnB0cisrOwotCSAgY3B0cisrOwotCX0KLQlkaXN0MSArPSB4eDE7Ci0JeHgxICs9IDIgKiBTVEVQX0MxICogU1RFUF9DMTsKLSAgICAgIH0KLSAgICAgIGRpc3QwICs9IHh4MDsKLSAgICAgIHh4MCArPSAyICogU1RFUF9DMCAqIFNURVBfQzA7Ci0gICAgfQotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWZpbGxfaW52ZXJzZV9jbWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgYzAsIGludCBjMSwgaW50IGMyKQotLyogRmlsbCB0aGUgaW52ZXJzZS1jb2xvcm1hcCBlbnRyaWVzIGluIHRoZSB1cGRhdGUgYm94IHRoYXQgY29udGFpbnMgKi8KLS8qIGhpc3RvZ3JhbSBjZWxsIGMwL2MxL2MyLiAgKE9ubHkgdGhhdCBvbmUgY2VsbCBNVVNUIGJlIGZpbGxlZCwgYnV0ICovCi0vKiB3ZSBjYW4gZmlsbCBhcyBtYW55IG90aGVycyBhcyB3ZSB3aXNoLikgKi8KLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOwotICBpbnQgbWluYzAsIG1pbmMxLCBtaW5jMjsJLyogbG93ZXIgbGVmdCBjb3JuZXIgb2YgdXBkYXRlIGJveCAqLwotICBpbnQgaWMwLCBpYzEsIGljMjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSAqIGNwdHI7CS8qIHBvaW50ZXIgaW50byBiZXN0Y29sb3JbXSBhcnJheSAqLwotICByZWdpc3RlciBoaXN0cHRyIGNhY2hlcDsJLyogcG9pbnRlciBpbnRvIG1haW4gY2FjaGUgYXJyYXkgKi8KLSAgLyogVGhpcyBhcnJheSBsaXN0cyB0aGUgY2FuZGlkYXRlIGNvbG9ybWFwIGluZGV4ZXMuICovCi0gIEpTQU1QTEUgY29sb3JsaXN0W01BWE5VTUNPTE9SU107Ci0gIGludCBudW1jb2xvcnM7CQkvKiBudW1iZXIgb2YgY2FuZGlkYXRlIGNvbG9ycyAqLwotICAvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBhY3R1YWxseSBjbG9zZXN0IGNvbG9ybWFwIGluZGV4IGZvciBlYWNoIGNlbGwuICovCi0gIEpTQU1QTEUgYmVzdGNvbG9yW0JPWF9DMF9FTEVNUyAqIEJPWF9DMV9FTEVNUyAqIEJPWF9DMl9FTEVNU107Ci0KLSAgLyogQ29udmVydCBjZWxsIGNvb3JkaW5hdGVzIHRvIHVwZGF0ZSBib3ggSUQgKi8KLSAgYzAgPj49IEJPWF9DMF9MT0c7Ci0gIGMxID4+PSBCT1hfQzFfTE9HOwotICBjMiA+Pj0gQk9YX0MyX0xPRzsKLQotICAvKiBDb21wdXRlIHRydWUgY29vcmRpbmF0ZXMgb2YgdXBkYXRlIGJveCdzIG9yaWdpbiBjb3JuZXIuCi0gICAqIEFjdHVhbGx5IHdlIGNvbXB1dGUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNvcm5lcgotICAgKiBoaXN0b2dyYW0gY2VsbCwgd2hpY2ggYXJlIHRoZSBsb3dlciBib3VuZHMgb2YgdGhlIHZvbHVtZSB3ZSBjYXJlIGFib3V0LgotICAgKi8KLSAgbWluYzAgPSAoYzAgPDwgQk9YX0MwX1NISUZUKSArICgoMSA8PCBDMF9TSElGVCkgPj4gMSk7Ci0gIG1pbmMxID0gKGMxIDw8IEJPWF9DMV9TSElGVCkgKyAoKDEgPDwgQzFfU0hJRlQpID4+IDEpOwotICBtaW5jMiA9IChjMiA8PCBCT1hfQzJfU0hJRlQpICsgKCgxIDw8IEMyX1NISUZUKSA+PiAxKTsKLSAgCi0gIC8qIERldGVybWluZSB3aGljaCBjb2xvcm1hcCBlbnRyaWVzIGFyZSBjbG9zZSBlbm91Z2ggdG8gYmUgY2FuZGlkYXRlcwotICAgKiBmb3IgdGhlIG5lYXJlc3QgZW50cnkgdG8gc29tZSBjZWxsIGluIHRoZSB1cGRhdGUgYm94LgotICAgKi8KLSAgbnVtY29sb3JzID0gZmluZF9uZWFyYnlfY29sb3JzKGNpbmZvLCBtaW5jMCwgbWluYzEsIG1pbmMyLCBjb2xvcmxpc3QpOwotCi0gIC8qIERldGVybWluZSB0aGUgYWN0dWFsbHkgbmVhcmVzdCBjb2xvcnMuICovCi0gIGZpbmRfYmVzdF9jb2xvcnMoY2luZm8sIG1pbmMwLCBtaW5jMSwgbWluYzIsIG51bWNvbG9ycywgY29sb3JsaXN0LAotCQkgICBiZXN0Y29sb3IpOwotCi0gIC8qIFNhdmUgdGhlIGJlc3QgY29sb3IgbnVtYmVycyAocGx1cyAxKSBpbiB0aGUgbWFpbiBjYWNoZSBhcnJheSAqLwotICBjMCA8PD0gQk9YX0MwX0xPRzsJCS8qIGNvbnZlcnQgSUQgYmFjayB0byBiYXNlIGNlbGwgaW5kZXhlcyAqLwotICBjMSA8PD0gQk9YX0MxX0xPRzsKLSAgYzIgPDw9IEJPWF9DMl9MT0c7Ci0gIGNwdHIgPSBiZXN0Y29sb3I7Ci0gIGZvciAoaWMwID0gMDsgaWMwIDwgQk9YX0MwX0VMRU1TOyBpYzArKykgewotICAgIGZvciAoaWMxID0gMDsgaWMxIDwgQk9YX0MxX0VMRU1TOyBpYzErKykgewotICAgICAgY2FjaGVwID0gJiBoaXN0b2dyYW1bYzAraWMwXVtjMStpYzFdW2MyXTsKLSAgICAgIGZvciAoaWMyID0gMDsgaWMyIDwgQk9YX0MyX0VMRU1TOyBpYzIrKykgewotCSpjYWNoZXArKyA9IChoaXN0Y2VsbCkgKEdFVEpTQU1QTEUoKmNwdHIrKykgKyAxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogTWFwIHNvbWUgcm93cyBvZiBwaXhlbHMgdG8gdGhlIG91dHB1dCBjb2xvcm1hcHBlZCByZXByZXNlbnRhdGlvbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXBhc3MyX25vX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLS8qIFRoaXMgdmVyc2lvbiBwZXJmb3JtcyBubyBkaXRoZXJpbmcgKi8KLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBoaXN0cHRyIGNhY2hlcDsKLSAgcmVnaXN0ZXIgaW50IGMwLCBjMSwgYzI7Ci0gIGludCByb3c7Ci0gIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgewotICAgIGlucHRyID0gaW5wdXRfYnVmW3Jvd107Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1Zltyb3ddOwotICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgICAvKiBnZXQgcGl4ZWwgdmFsdWUgYW5kIGluZGV4IGludG8gdGhlIGNhY2hlICovCi0gICAgICBjMCA9IEdFVEpTQU1QTEUoKmlucHRyKyspID4+IEMwX1NISUZUOwotICAgICAgYzEgPSBHRVRKU0FNUExFKCppbnB0cisrKSA+PiBDMV9TSElGVDsKLSAgICAgIGMyID0gR0VUSlNBTVBMRSgqaW5wdHIrKykgPj4gQzJfU0hJRlQ7Ci0gICAgICBjYWNoZXAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MyXTsKLSAgICAgIC8qIElmIHdlIGhhdmUgbm90IHNlZW4gdGhpcyBjb2xvciBiZWZvcmUsIGZpbmQgbmVhcmVzdCBjb2xvcm1hcCBlbnRyeSAqLwotICAgICAgLyogYW5kIHVwZGF0ZSB0aGUgY2FjaGUgKi8KLSAgICAgIGlmICgqY2FjaGVwID09IDApCi0JZmlsbF9pbnZlcnNlX2NtYXAoY2luZm8sIGMwLGMxLGMyKTsKLSAgICAgIC8qIE5vdyBlbWl0IHRoZSBjb2xvcm1hcCBpbmRleCBmb3IgdGhpcyBjZWxsICovCi0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCpjYWNoZXAgLSAxKTsKLSAgICB9Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXBhc3MyX2ZzX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLS8qIFRoaXMgdmVyc2lvbiBwZXJmb3JtcyBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nICovCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKLSAgcmVnaXN0ZXIgTE9DRlNFUlJPUiBjdXIwLCBjdXIxLCBjdXIyOwkvKiBjdXJyZW50IGVycm9yIG9yIHBpeGVsIHZhbHVlICovCi0gIExPQ0ZTRVJST1IgYmVsb3dlcnIwLCBiZWxvd2VycjEsIGJlbG93ZXJyMjsgLyogZXJyb3IgZm9yIHBpeGVsIGJlbG93IGN1ciAqLwotICBMT0NGU0VSUk9SIGJwcmV2ZXJyMCwgYnByZXZlcnIxLCBicHJldmVycjI7IC8qIGVycm9yIGZvciBiZWxvdy9wcmV2IGNvbCAqLwotICByZWdpc3RlciBGU0VSUlBUUiBlcnJvcnB0cjsJLyogPT4gZnNlcnJvcnNbXSBhdCBjb2x1bW4gYmVmb3JlIGN1cnJlbnQgKi8KLSAgSlNBTVBST1cgaW5wdHI7CQkvKiA9PiBjdXJyZW50IGlucHV0IHBpeGVsICovCi0gIEpTQU1QUk9XIG91dHB0cjsJCS8qID0+IGN1cnJlbnQgb3V0cHV0IHBpeGVsICovCi0gIGhpc3RwdHIgY2FjaGVwOwotICBpbnQgZGlyOwkJCS8qICsxIG9yIC0xIGRlcGVuZGluZyBvbiBkaXJlY3Rpb24gKi8KLSAgaW50IGRpcjM7CQkJLyogMypkaXIsIGZvciBhZHZhbmNpbmcgaW5wdHIgJiBlcnJvcnB0ciAqLwotICBpbnQgcm93OwotICBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKLSAgaW50ICplcnJvcl9saW1pdCA9IGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlcjsKLSAgSlNBTVBST1cgY29sb3JtYXAwID0gY2luZm8tPmNvbG9ybWFwWzBdOwotICBKU0FNUFJPVyBjb2xvcm1hcDEgPSBjaW5mby0+Y29sb3JtYXBbMV07Ci0gIEpTQU1QUk9XIGNvbG9ybWFwMiA9IGNpbmZvLT5jb2xvcm1hcFsyXTsKLSAgU0hJRlRfVEVNUFMKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgewotICAgIGlucHRyID0gaW5wdXRfYnVmW3Jvd107Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1Zltyb3ddOwotICAgIGlmIChjcXVhbnRpemUtPm9uX29kZF9yb3cpIHsKLSAgICAgIC8qIHdvcmsgcmlnaHQgdG8gbGVmdCBpbiB0aGlzIHJvdyAqLwotICAgICAgaW5wdHIgKz0gKHdpZHRoLTEpICogMzsJLyogc28gcG9pbnQgdG8gcmlnaHRtb3N0IHBpeGVsICovCi0gICAgICBvdXRwdHIgKz0gd2lkdGgtMTsKLSAgICAgIGRpciA9IC0xOwotICAgICAgZGlyMyA9IC0zOwotICAgICAgZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzICsgKHdpZHRoKzEpKjM7IC8qID0+IGVudHJ5IGFmdGVyIGxhc3QgY29sdW1uICovCi0gICAgICBjcXVhbnRpemUtPm9uX29kZF9yb3cgPSBGQUxTRTsgLyogZmxpcCBmb3IgbmV4dCB0aW1lICovCi0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHdvcmsgbGVmdCB0byByaWdodCBpbiB0aGlzIHJvdyAqLwotICAgICAgZGlyID0gMTsKLSAgICAgIGRpcjMgPSAzOwotICAgICAgZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzOyAvKiA9PiBlbnRyeSBiZWZvcmUgZmlyc3QgcmVhbCBjb2x1bW4gKi8KLSAgICAgIGNxdWFudGl6ZS0+b25fb2RkX3JvdyA9IFRSVUU7IC8qIGZsaXAgZm9yIG5leHQgdGltZSAqLwotICAgIH0KLSAgICAvKiBQcmVzZXQgZXJyb3IgdmFsdWVzOiBubyBlcnJvciBwcm9wYWdhdGVkIHRvIGZpcnN0IHBpeGVsIGZyb20gbGVmdCAqLwotICAgIGN1cjAgPSBjdXIxID0gY3VyMiA9IDA7Ci0gICAgLyogYW5kIG5vIGVycm9yIHByb3BhZ2F0ZWQgdG8gcm93IGJlbG93IHlldCAqLwotICAgIGJlbG93ZXJyMCA9IGJlbG93ZXJyMSA9IGJlbG93ZXJyMiA9IDA7Ci0gICAgYnByZXZlcnIwID0gYnByZXZlcnIxID0gYnByZXZlcnIyID0gMDsKLQotICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgICAvKiBjdXJOIGhvbGRzIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIHBpeGVsIG9uIHRoZQotICAgICAgICogY3VycmVudCBsaW5lLiAgQWRkIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIGxpbmUKLSAgICAgICAqIHRvIGZvcm0gdGhlIGNvbXBsZXRlIGVycm9yIGNvcnJlY3Rpb24gdGVybSBmb3IgdGhpcyBwaXhlbCwgYW5kCi0gICAgICAgKiByb3VuZCB0aGUgZXJyb3IgdGVybSAod2hpY2ggaXMgZXhwcmVzc2VkICogMTYpIHRvIGFuIGludGVnZXIuCi0gICAgICAgKiBSSUdIVF9TSElGVCByb3VuZHMgdG93YXJkcyBtaW51cyBpbmZpbml0eSwgc28gYWRkaW5nIDggaXMgY29ycmVjdAotICAgICAgICogZm9yIGVpdGhlciBzaWduIG9mIHRoZSBlcnJvciB2YWx1ZS4KLSAgICAgICAqIE5vdGU6IGVycm9ycHRyIHBvaW50cyB0byAqcHJldmlvdXMqIGNvbHVtbidzIGFycmF5IGVudHJ5LgotICAgICAgICovCi0gICAgICBjdXIwID0gUklHSFRfU0hJRlQoY3VyMCArIGVycm9ycHRyW2RpcjMrMF0gKyA4LCA0KTsKLSAgICAgIGN1cjEgPSBSSUdIVF9TSElGVChjdXIxICsgZXJyb3JwdHJbZGlyMysxXSArIDgsIDQpOwotICAgICAgY3VyMiA9IFJJR0hUX1NISUZUKGN1cjIgKyBlcnJvcnB0cltkaXIzKzJdICsgOCwgNCk7Ci0gICAgICAvKiBMaW1pdCB0aGUgZXJyb3IgdXNpbmcgdHJhbnNmZXIgZnVuY3Rpb24gc2V0IGJ5IGluaXRfZXJyb3JfbGltaXQuCi0gICAgICAgKiBTZWUgY29tbWVudHMgd2l0aCBpbml0X2Vycm9yX2xpbWl0IGZvciByYXRpb25hbGUuCi0gICAgICAgKi8KLSAgICAgIGN1cjAgPSBlcnJvcl9saW1pdFtjdXIwXTsKLSAgICAgIGN1cjEgPSBlcnJvcl9saW1pdFtjdXIxXTsKLSAgICAgIGN1cjIgPSBlcnJvcl9saW1pdFtjdXIyXTsKLSAgICAgIC8qIEZvcm0gcGl4ZWwgdmFsdWUgKyBlcnJvciwgYW5kIHJhbmdlLWxpbWl0IHRvIDAuLk1BWEpTQU1QTEUuCi0gICAgICAgKiBUaGUgbWF4aW11bSBlcnJvciBpcyArLSBNQVhKU0FNUExFIChvciBsZXNzIHdpdGggZXJyb3IgbGltaXRpbmcpOwotICAgICAgICogdGhpcyBzZXRzIHRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSByYW5nZV9saW1pdCBhcnJheS4KLSAgICAgICAqLwotICAgICAgY3VyMCArPSBHRVRKU0FNUExFKGlucHRyWzBdKTsKLSAgICAgIGN1cjEgKz0gR0VUSlNBTVBMRShpbnB0clsxXSk7Ci0gICAgICBjdXIyICs9IEdFVEpTQU1QTEUoaW5wdHJbMl0pOwotICAgICAgY3VyMCA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMF0pOwotICAgICAgY3VyMSA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMV0pOwotICAgICAgY3VyMiA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMl0pOwotICAgICAgLyogSW5kZXggaW50byB0aGUgY2FjaGUgd2l0aCBhZGp1c3RlZCBwaXhlbCB2YWx1ZSAqLwotICAgICAgY2FjaGVwID0gJiBoaXN0b2dyYW1bY3VyMD4+QzBfU0hJRlRdW2N1cjE+PkMxX1NISUZUXVtjdXIyPj5DMl9TSElGVF07Ci0gICAgICAvKiBJZiB3ZSBoYXZlIG5vdCBzZWVuIHRoaXMgY29sb3IgYmVmb3JlLCBmaW5kIG5lYXJlc3QgY29sb3JtYXAgKi8KLSAgICAgIC8qIGVudHJ5IGFuZCB1cGRhdGUgdGhlIGNhY2hlICovCi0gICAgICBpZiAoKmNhY2hlcCA9PSAwKQotCWZpbGxfaW52ZXJzZV9jbWFwKGNpbmZvLCBjdXIwPj5DMF9TSElGVCxjdXIxPj5DMV9TSElGVCxjdXIyPj5DMl9TSElGVCk7Ci0gICAgICAvKiBOb3cgZW1pdCB0aGUgY29sb3JtYXAgaW5kZXggZm9yIHRoaXMgY2VsbCAqLwotICAgICAgeyByZWdpc3RlciBpbnQgcGl4Y29kZSA9ICpjYWNoZXAgLSAxOwotCSpvdXRwdHIgPSAoSlNBTVBMRSkgcGl4Y29kZTsKLQkvKiBDb21wdXRlIHJlcHJlc2VudGF0aW9uIGVycm9yIGZvciB0aGlzIHBpeGVsICovCi0JY3VyMCAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMFtwaXhjb2RlXSk7Ci0JY3VyMSAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMVtwaXhjb2RlXSk7Ci0JY3VyMiAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMltwaXhjb2RlXSk7Ci0gICAgICB9Ci0gICAgICAvKiBDb21wdXRlIGVycm9yIGZyYWN0aW9ucyB0byBiZSBwcm9wYWdhdGVkIHRvIGFkamFjZW50IHBpeGVscy4KLSAgICAgICAqIEFkZCB0aGVzZSBpbnRvIHRoZSBydW5uaW5nIHN1bXMsIGFuZCBzaW11bHRhbmVvdXNseSBzaGlmdCB0aGUKLSAgICAgICAqIG5leHQtbGluZSBlcnJvciBzdW1zIGxlZnQgYnkgMSBjb2x1bW4uCi0gICAgICAgKi8KLSAgICAgIHsgcmVnaXN0ZXIgTE9DRlNFUlJPUiBibmV4dGVyciwgZGVsdGE7Ci0KLQlibmV4dGVyciA9IGN1cjA7CS8qIFByb2Nlc3MgY29tcG9uZW50IDAgKi8KLQlkZWx0YSA9IGN1cjAgKiAyOwotCWN1cjAgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogMyAqLwotCWVycm9ycHRyWzBdID0gKEZTRVJST1IpIChicHJldmVycjAgKyBjdXIwKTsKLQljdXIwICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDUgKi8KLQlicHJldmVycjAgPSBiZWxvd2VycjAgKyBjdXIwOwotCWJlbG93ZXJyMCA9IGJuZXh0ZXJyOwotCWN1cjAgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNyAqLwotCWJuZXh0ZXJyID0gY3VyMTsJLyogUHJvY2VzcyBjb21wb25lbnQgMSAqLwotCWRlbHRhID0gY3VyMSAqIDI7Ci0JY3VyMSArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiAzICovCi0JZXJyb3JwdHJbMV0gPSAoRlNFUlJPUikgKGJwcmV2ZXJyMSArIGN1cjEpOwotCWN1cjEgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNSAqLwotCWJwcmV2ZXJyMSA9IGJlbG93ZXJyMSArIGN1cjE7Ci0JYmVsb3dlcnIxID0gYm5leHRlcnI7Ci0JY3VyMSArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA3ICovCi0JYm5leHRlcnIgPSBjdXIyOwkvKiBQcm9jZXNzIGNvbXBvbmVudCAyICovCi0JZGVsdGEgPSBjdXIyICogMjsKLQljdXIyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDMgKi8KLQllcnJvcnB0clsyXSA9IChGU0VSUk9SKSAoYnByZXZlcnIyICsgY3VyMik7Ci0JY3VyMiArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA1ICovCi0JYnByZXZlcnIyID0gYmVsb3dlcnIyICsgY3VyMjsKLQliZWxvd2VycjIgPSBibmV4dGVycjsKLQljdXIyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDcgKi8KLSAgICAgIH0KLSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgY3VyTiBjb250YWlucyB0aGUgNy8xNiBlcnJvciB2YWx1ZSB0byBiZSBwcm9wYWdhdGVkCi0gICAgICAgKiB0byB0aGUgbmV4dCBwaXhlbCBvbiB0aGUgY3VycmVudCBsaW5lLCBhbmQgYWxsIHRoZSBlcnJvcnMgZm9yIHRoZQotICAgICAgICogbmV4dCBsaW5lIGhhdmUgYmVlbiBzaGlmdGVkIG92ZXIuICBXZSBhcmUgdGhlcmVmb3JlIHJlYWR5IHRvIG1vdmUgb24uCi0gICAgICAgKi8KLSAgICAgIGlucHRyICs9IGRpcjM7CQkvKiBBZHZhbmNlIHBpeGVsIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCi0gICAgICBvdXRwdHIgKz0gZGlyOwotICAgICAgZXJyb3JwdHIgKz0gZGlyMzsJCS8qIGFkdmFuY2UgZXJyb3JwdHIgdG8gY3VycmVudCBjb2x1bW4gKi8KLSAgICB9Ci0gICAgLyogUG9zdC1sb29wIGNsZWFudXA6IHdlIG11c3QgdW5sb2FkIHRoZSBmaW5hbCBlcnJvciB2YWx1ZXMgaW50byB0aGUKLSAgICAgKiBmaW5hbCBmc2Vycm9yc1tdIGVudHJ5LiAgTm90ZSB3ZSBuZWVkIG5vdCB1bmxvYWQgYmVsb3dlcnJOIGJlY2F1c2UKLSAgICAgKiBpdCBpcyBmb3IgdGhlIGR1bW15IGNvbHVtbiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGFjdHVhbCBhcnJheS4KLSAgICAgKi8KLSAgICBlcnJvcnB0clswXSA9IChGU0VSUk9SKSBicHJldmVycjA7IC8qIHVubG9hZCBwcmV2IGVycnMgaW50byBhcnJheSAqLwotICAgIGVycm9ycHRyWzFdID0gKEZTRVJST1IpIGJwcmV2ZXJyMTsKLSAgICBlcnJvcnB0clsyXSA9IChGU0VSUk9SKSBicHJldmVycjI7Ci0gIH0KLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgZXJyb3ItbGltaXRpbmcgdHJhbnNmZXIgZnVuY3Rpb24gKGxvb2t1cCB0YWJsZSkuCi0gKiBUaGUgcmF3IEYtUyBlcnJvciBjb21wdXRhdGlvbiBjYW4gcG90ZW50aWFsbHkgY29tcHV0ZSBlcnJvciB2YWx1ZXMgb2YgdXAgdG8KLSAqICstIE1BWEpTQU1QTEUuICBCdXQgd2Ugd2FudCB0aGUgbWF4aW11bSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gYSBwaXhlbCB0byBiZQotICogbXVjaCBsZXNzLCBvdGhlcndpc2Ugb2J2aW91c2x5IHdyb25nIHBpeGVscyB3aWxsIGJlIGNyZWF0ZWQuICAoVHlwaWNhbAotICogZWZmZWN0cyBpbmNsdWRlIHdlaXJkIGZyaW5nZXMgYXQgY29sb3ItYXJlYSBib3VuZGFyaWVzLCBpc29sYXRlZCBicmlnaHQKLSAqIHBpeGVscyBpbiBhIGRhcmsgYXJlYSwgZXRjLikgIFRoZSBzdGFuZGFyZCBhZHZpY2UgZm9yIGF2b2lkaW5nIHRoaXMgcHJvYmxlbQotICogaXMgdG8gZW5zdXJlIHRoYXQgdGhlICJjb3JuZXJzIiBvZiB0aGUgY29sb3IgY3ViZSBhcmUgYWxsb2NhdGVkIGFzIG91dHB1dAotICogY29sb3JzOyB0aGVuIHJlcGVhdGVkIGVycm9ycyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24gY2Fubm90IGNhdXNlIGNhc2NhZGluZwotICogZXJyb3IgYnVpbGR1cC4gIEhvd2V2ZXIsIHRoYXQgb25seSBwcmV2ZW50cyB0aGUgZXJyb3IgZnJvbSBnZXR0aW5nCi0gKiBjb21wbGV0ZWx5IG91dCBvZiBoYW5kOyBBYXJvbiBHaWxlcyByZXBvcnRzIHRoYXQgZXJyb3IgbGltaXRpbmcgaW1wcm92ZXMKLSAqIHRoZSByZXN1bHRzIGV2ZW4gd2l0aCBjb3JuZXIgY29sb3JzIGFsbG9jYXRlZC4KLSAqIEEgc2ltcGxlIGNsYW1waW5nIG9mIHRoZSBlcnJvciB2YWx1ZXMgdG8gYWJvdXQgKy0gTUFYSlNBTVBMRS84IHdvcmtzIHByZXR0eQotICogd2VsbCwgYnV0IHRoZSBzbW9vdGhlciB0cmFuc2ZlciBmdW5jdGlvbiB1c2VkIGJlbG93IGlzIGV2ZW4gYmV0dGVyLiAgVGhhbmtzCi0gKiB0byBBYXJvbiBHaWxlcyBmb3IgdGhpcyBpZGVhLgotICovCi0KLUxPQ0FMKHZvaWQpCi1pbml0X2Vycm9yX2xpbWl0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIGVycm9yX2xpbWl0ZXIgdGFibGUgKi8KLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgaW50ICogdGFibGU7Ci0gIGludCBpbiwgb3V0OwotCi0gIHRhYmxlID0gKGludCAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIChNQVhKU0FNUExFKjIrMSkgKiBTSVpFT0YoaW50KSk7Ci0gIHRhYmxlICs9IE1BWEpTQU1QTEU7CQkvKiBzbyBjYW4gaW5kZXggLU1BWEpTQU1QTEUgLi4gK01BWEpTQU1QTEUgKi8KLSAgY3F1YW50aXplLT5lcnJvcl9saW1pdGVyID0gdGFibGU7Ci0KLSNkZWZpbmUgU1RFUFNJWkUgKChNQVhKU0FNUExFKzEpLzE2KQotICAvKiBNYXAgZXJyb3JzIDE6MSB1cCB0byArLSBNQVhKU0FNUExFLzE2ICovCi0gIG91dCA9IDA7Ci0gIGZvciAoaW4gPSAwOyBpbiA8IFNURVBTSVpFOyBpbisrLCBvdXQrKykgewotICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7Ci0gIH0KLSAgLyogTWFwIGVycm9ycyAxOjIgdXAgdG8gKy0gMypNQVhKU0FNUExFLzE2ICovCi0gIGZvciAoOyBpbiA8IFNURVBTSVpFKjM7IGluKyssIG91dCArPSAoaW4mMSkgPyAwIDogMSkgewotICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7Ci0gIH0KLSAgLyogQ2xhbXAgdGhlIHJlc3QgdG8gZmluYWwgb3V0IHZhbHVlICh3aGljaCBpcyAoTUFYSlNBTVBMRSsxKS84KSAqLwotICBmb3IgKDsgaW4gPD0gTUFYSlNBTVBMRTsgaW4rKykgewotICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7Ci0gIH0KLSN1bmRlZiBTVEVQU0laRQotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBlYWNoIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzczEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0KLSAgLyogU2VsZWN0IHRoZSByZXByZXNlbnRhdGl2ZSBjb2xvcnMgYW5kIGZpbGwgaW4gY2luZm8tPmNvbG9ybWFwICovCi0gIGNpbmZvLT5jb2xvcm1hcCA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXA7Ci0gIHNlbGVjdF9jb2xvcnMoY2luZm8sIGNxdWFudGl6ZS0+ZGVzaXJlZCk7Ci0gIC8qIEZvcmNlIG5leHQgcGFzcyB0byB6ZXJvIHRoZSBjb2xvciBpbmRleCB0YWJsZSAqLwotICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzczIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgZWFjaCBwcm9jZXNzaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzXzJfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJlX3NjYW4pCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKLSAgaW50IGk7Ci0KLSAgLyogT25seSBGLVMgZGl0aGVyaW5nIG9yIG5vIGRpdGhlcmluZyBpcyBzdXBwb3J0ZWQuICovCi0gIC8qIElmIHVzZXIgYXNrcyBmb3Igb3JkZXJlZCBkaXRoZXIsIGdpdmUgaGltIEYtUy4gKi8KLSAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSAhPSBKRElUSEVSX05PTkUpCi0gICAgY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9GUzsKLQotICBpZiAoaXNfcHJlX3NjYW4pIHsKLSAgICAvKiBTZXQgdXAgbWV0aG9kIHBvaW50ZXJzICovCi0gICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBwcmVzY2FuX3F1YW50aXplOwotICAgIGNxdWFudGl6ZS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3MxOwotICAgIGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkID0gVFJVRTsgLyogQWx3YXlzIHplcm8gaGlzdG9ncmFtICovCi0gIH0gZWxzZSB7Ci0gICAgLyogU2V0IHVwIG1ldGhvZCBwb2ludGVycyAqLwotICAgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9GUykKLSAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcGFzczJfZnNfZGl0aGVyOwotICAgIGVsc2UKLSAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcGFzczJfbm9fZGl0aGVyOwotICAgIGNxdWFudGl6ZS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3MyOwotCi0gICAgLyogTWFrZSBzdXJlIGNvbG9yIGNvdW50IGlzIGFjY2VwdGFibGUgKi8KLSAgICBpID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOwotICAgIGlmIChpIDwgMSkKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX0ZFV19DT0xPUlMsIDEpOwotICAgIGlmIChpID4gTUFYTlVNQ09MT1JTKQotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfTUFOWV9DT0xPUlMsIE1BWE5VTUNPTE9SUyk7Ci0KLSAgICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfRlMpIHsKLSAgICAgIHNpemVfdCBhcnJheXNpemUgPSAoc2l6ZV90KSAoKGNpbmZvLT5vdXRwdXRfd2lkdGggKyAyKSAqCi0JCQkJICAgKDMgKiBTSVpFT0YoRlNFUlJPUikpKTsKLSAgICAgIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2UgaWYgd2UgZGlkbid0IGFscmVhZHkuICovCi0gICAgICBpZiAoY3F1YW50aXplLT5mc2Vycm9ycyA9PSBOVUxMKQotCWNxdWFudGl6ZS0+ZnNlcnJvcnMgPSAoRlNFUlJQVFIpICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpCi0JICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBhcnJheXNpemUpOwotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvcGFnYXRlZCBlcnJvcnMgdG8gemVyby4gKi8KLSAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY3F1YW50aXplLT5mc2Vycm9ycywgYXJyYXlzaXplKTsKLSAgICAgIC8qIE1ha2UgdGhlIGVycm9yLWxpbWl0IHRhYmxlIGlmIHdlIGRpZG4ndCBhbHJlYWR5LiAqLwotICAgICAgaWYgKGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlciA9PSBOVUxMKQotCWluaXRfZXJyb3JfbGltaXQoY2luZm8pOwotICAgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gRkFMU0U7Ci0gICAgfQotCi0gIH0KLSAgLyogWmVybyB0aGUgaGlzdG9ncmFtIG9yIGludmVyc2UgY29sb3IgbWFwLCBpZiBuZWNlc3NhcnkgKi8KLSAgaWYgKGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IEhJU1RfQzBfRUxFTVM7IGkrKykgewotICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBoaXN0b2dyYW1baV0sCi0JCUhJU1RfQzFfRUxFTVMqSElTVF9DMl9FTEVNUyAqIFNJWkVPRihoaXN0Y2VsbCkpOwotICAgIH0KLSAgICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IEZBTFNFOwotICB9Ci19Ci0KLQotLyoKLSAqIFN3aXRjaCB0byBhIG5ldyBleHRlcm5hbCBjb2xvcm1hcCBiZXR3ZWVuIG91dHB1dCBwYXNzZXMuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1uZXdfY29sb3JfbWFwXzJfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0KLSAgLyogUmVzZXQgdGhlIGludmVyc2UgY29sb3IgbWFwICovCi0gIGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkID0gVFJVRTsKLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIDItcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF8ycGFzc19xdWFudGl6ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplOwotICBpbnQgaTsKLQotICBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9jcXVhbnRpemVyKSk7Ci0gIGNpbmZvLT5jcXVhbnRpemUgPSAoc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICopIGNxdWFudGl6ZTsKLSAgY3F1YW50aXplLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfMl9xdWFudDsKLSAgY3F1YW50aXplLT5wdWIubmV3X2NvbG9yX21hcCA9IG5ld19jb2xvcl9tYXBfMl9xdWFudDsKLSAgY3F1YW50aXplLT5mc2Vycm9ycyA9IE5VTEw7CS8qIGZsYWcgb3B0aW9uYWwgYXJyYXlzIG5vdCBhbGxvY2F0ZWQgKi8KLSAgY3F1YW50aXplLT5lcnJvcl9saW1pdGVyID0gTlVMTDsKLQotICAvKiBNYWtlIHN1cmUgamRtYXN0ZXIgZGlkbid0IGdpdmUgbWUgYSBjYXNlIEkgY2FuJ3QgaGFuZGxlICovCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gMykKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVElNUEwpOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBoaXN0b2dyYW0vaW52ZXJzZSBjb2xvcm1hcCBzdG9yYWdlICovCi0gIGNxdWFudGl6ZS0+aGlzdG9ncmFtID0gKGhpc3QzZCkgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBISVNUX0MwX0VMRU1TICogU0laRU9GKGhpc3QyZCkpOwotICBmb3IgKGkgPSAwOyBpIDwgSElTVF9DMF9FTEVNUzsgaSsrKSB7Ci0gICAgY3F1YW50aXplLT5oaXN0b2dyYW1baV0gPSAoaGlzdDJkKSAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgICBISVNUX0MxX0VMRU1TKkhJU1RfQzJfRUxFTVMgKiBTSVpFT0YoaGlzdGNlbGwpKTsKLSAgfQotICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7IC8qIGhpc3RvZ3JhbSBpcyBnYXJiYWdlIG5vdyAqLwotCi0gIC8qIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIHRoZSBjb21wbGV0ZWQgY29sb3JtYXAsIGlmIHJlcXVpcmVkLgotICAgKiBXZSBkbyB0aGlzIG5vdyBzaW5jZSBpdCBpcyBGQVIgc3RvcmFnZSBhbmQgbWF5IGFmZmVjdAotICAgKiB0aGUgbWVtb3J5IG1hbmFnZXIncyBzcGFjZSBjYWxjdWxhdGlvbnMuCi0gICAqLwotICBpZiAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCkgewotICAgIC8qIE1ha2Ugc3VyZSBjb2xvciBjb3VudCBpcyBhY2NlcHRhYmxlICovCi0gICAgaW50IGRlc2lyZWQgPSBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOwotICAgIC8qIExvd2VyIGJvdW5kIG9uICMgb2YgY29sb3JzIC4uLiBzb21ld2hhdCBhcmJpdHJhcnkgYXMgbG9uZyBhcyA+IDAgKi8KLSAgICBpZiAoZGVzaXJlZCA8IDgpCi0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9GRVdfQ09MT1JTLCA4KTsKLSAgICAvKiBNYWtlIHN1cmUgY29sb3JtYXAgaW5kZXhlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgSlNBTVBMRXMgKi8KLSAgICBpZiAoZGVzaXJlZCA+IE1BWE5VTUNPTE9SUykKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX01BTllfQ09MT1JTLCBNQVhOVU1DT0xPUlMpOwotICAgIGNxdWFudGl6ZS0+c3ZfY29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbyxKUE9PTF9JTUFHRSwgKEpESU1FTlNJT04pIGRlc2lyZWQsIChKRElNRU5TSU9OKSAzKTsKLSAgICBjcXVhbnRpemUtPmRlc2lyZWQgPSBkZXNpcmVkOwotICB9IGVsc2UKLSAgICBjcXVhbnRpemUtPnN2X2NvbG9ybWFwID0gTlVMTDsKLQotICAvKiBPbmx5IEYtUyBkaXRoZXJpbmcgb3Igbm8gZGl0aGVyaW5nIGlzIHN1cHBvcnRlZC4gKi8KLSAgLyogSWYgdXNlciBhc2tzIGZvciBvcmRlcmVkIGRpdGhlciwgZ2l2ZSBoaW0gRi1TLiAqLwotICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlICE9IEpESVRIRVJfTk9ORSkKLSAgICBjaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOwotCi0gIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2UgaWYgbmVjZXNzYXJ5LgotICAgKiBUaGlzIGlzbid0IHJlYWxseSBuZWVkZWQgdW50aWwgcGFzcyAyLCBidXQgYWdhaW4gaXQgaXMgRkFSIHN0b3JhZ2UuCi0gICAqIEFsdGhvdWdoIHdlIHdpbGwgY29wZSB3aXRoIGEgbGF0ZXIgY2hhbmdlIGluIGRpdGhlcl9tb2RlLAotICAgKiB3ZSBkbyBub3QgcHJvbWlzZSB0byBob25vciBtYXhfbWVtb3J5X3RvX3VzZSBpZiBkaXRoZXJfbW9kZSBjaGFuZ2VzLgotICAgKi8KLSAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX0ZTKSB7Ci0gICAgY3F1YW50aXplLT5mc2Vycm9ycyA9IChGU0VSUlBUUikgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgKHNpemVfdCkgKChjaW5mby0+b3V0cHV0X3dpZHRoICsgMikgKiAoMyAqIFNJWkVPRihGU0VSUk9SKSkpKTsKLSAgICAvKiBNaWdodCBhcyB3ZWxsIGNyZWF0ZSB0aGUgZXJyb3ItbGltaXRpbmcgdGFibGUgdG9vLiAqLwotICAgIGluaXRfZXJyb3JfbGltaXQoY2luZm8pOwotICB9Ci19Ci0KLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2p1dGlscy5jIGIvbGlianBlZ3R3cnAvanV0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNmFkMDUuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvanV0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIGp1dGlscy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGFibGVzIGFuZCBtaXNjZWxsYW5lb3VzIHV0aWxpdHkgcm91dGluZXMgbmVlZGVkCi0gKiBmb3IgYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KLSAqIE5vdGUgd2UgcHJlZml4IGFsbCBnbG9iYWwgbmFtZXMgd2l0aCAiaiIgdG8gbWluaW1pemUgY29uZmxpY3RzIHdpdGgKLSAqIGEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qCi0gKiBqcGVnX3ppZ3phZ19vcmRlcltpXSBpcyB0aGUgemlnemFnLW9yZGVyIHBvc2l0aW9uIG9mIHRoZSBpJ3RoIGVsZW1lbnQKLSAqIG9mIGEgRENUIGJsb2NrIHJlYWQgaW4gbmF0dXJhbCBvcmRlciAobGVmdCB0byByaWdodCwgdG9wIHRvIGJvdHRvbSkuCi0gKi8KLQotI2lmIDAJCQkJLyogVGhpcyB0YWJsZSBpcyBub3QgYWN0dWFsbHkgbmVlZGVkIGluIHY2YSAqLwotCi1jb25zdCBpbnQganBlZ196aWd6YWdfb3JkZXJbRENUU0laRTJdID0gewotICAgMCwgIDEsICA1LCAgNiwgMTQsIDE1LCAyNywgMjgsCi0gICAyLCAgNCwgIDcsIDEzLCAxNiwgMjYsIDI5LCA0MiwKLSAgIDMsICA4LCAxMiwgMTcsIDI1LCAzMCwgNDEsIDQzLAotICAgOSwgMTEsIDE4LCAyNCwgMzEsIDQwLCA0NCwgNTMsCi0gIDEwLCAxOSwgMjMsIDMyLCAzOSwgNDUsIDUyLCA1NCwKLSAgMjAsIDIyLCAzMywgMzgsIDQ2LCA1MSwgNTUsIDYwLAotICAyMSwgMzQsIDM3LCA0NywgNTAsIDU2LCA1OSwgNjEsCi0gIDM1LCAzNiwgNDgsIDQ5LCA1NywgNTgsIDYyLCA2MwotfTsKLQotI2VuZGlmCi0KLS8qCi0gKiBqcGVnX25hdHVyYWxfb3JkZXJbaV0gaXMgdGhlIG5hdHVyYWwtb3JkZXIgcG9zaXRpb24gb2YgdGhlIGkndGggZWxlbWVudAotICogb2YgemlnemFnIG9yZGVyLgotICoKLSAqIFdoZW4gcmVhZGluZyBjb3JydXB0ZWQgZGF0YSwgdGhlIEh1ZmZtYW4gZGVjb2RlcnMgY291bGQgYXR0ZW1wdAotICogdG8gcmVmZXJlbmNlIGFuIGVudHJ5IGJleW9uZCB0aGUgZW5kIG9mIHRoaXMgYXJyYXkgKGlmIHRoZSBkZWNvZGVkCi0gKiB6ZXJvIHJ1biBsZW5ndGggcmVhY2hlcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJsb2NrKS4gIFRvIHByZXZlbnQKLSAqIHdpbGQgc3RvcmVzIHdpdGhvdXQgYWRkaW5nIGFuIGlubmVyLWxvb3AgdGVzdCwgd2UgcHV0IHNvbWUgZXh0cmEKLSAqICI2MyJzIGFmdGVyIHRoZSByZWFsIGVudHJpZXMuICBUaGlzIHdpbGwgY2F1c2UgdGhlIGV4dHJhIGNvZWZmaWNpZW50Ci0gKiB0byBiZSBzdG9yZWQgaW4gbG9jYXRpb24gNjMgb2YgdGhlIGJsb2NrLCBub3Qgc29tZXdoZXJlIHJhbmRvbS4KLSAqIFRoZSB3b3JzdCBjYXNlIHdvdWxkIGJlIGEgcnVuLWxlbmd0aCBvZiAxNSwgd2hpY2ggbWVhbnMgd2UgbmVlZCAxNgotICogZmFrZSBlbnRyaWVzLgotICovCi0KLWNvbnN0IGludCBqcGVnX25hdHVyYWxfb3JkZXJbRENUU0laRTIrMTZdID0gewotICAwLCAgMSwgIDgsIDE2LCAgOSwgIDIsICAzLCAxMCwKLSAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCAgNCwgIDUsCi0gMTIsIDE5LCAyNiwgMzMsIDQwLCA0OCwgNDEsIDM0LAotIDI3LCAyMCwgMTMsICA2LCAgNywgMTQsIDIxLCAyOCwKLSAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCi0gMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLAotIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwKLSA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMsCi0gNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCAvKiBleHRyYSBlbnRyaWVzIGZvciBzYWZldHkgaW4gZGVjb2RlciAqLwotIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MwotfTsKLQotCi0vKgotICogQXJpdGhtZXRpYyB1dGlsaXRpZXMKLSAqLwotCi1HTE9CQUwobG9uZykKLWpkaXZfcm91bmRfdXAgKGxvbmcgYSwgbG9uZyBiKQotLyogQ29tcHV0ZSBhL2Igcm91bmRlZCB1cCB0byBuZXh0IGludGVnZXIsIGllLCBjZWlsKGEvYikgKi8KLS8qIEFzc3VtZXMgYSA+PSAwLCBiID4gMCAqLwotewotICByZXR1cm4gKGEgKyBiIC0gMUwpIC8gYjsKLX0KLQotCi1HTE9CQUwobG9uZykKLWpyb3VuZF91cCAobG9uZyBhLCBsb25nIGIpCi0vKiBDb21wdXRlIGEgcm91bmRlZCB1cCB0byBuZXh0IG11bHRpcGxlIG9mIGIsIGllLCBjZWlsKGEvYikqYiAqLwotLyogQXNzdW1lcyBhID49IDAsIGIgPiAwICovCi17Ci0gIGEgKz0gYiAtIDFMOwotICByZXR1cm4gYSAtIChhICUgYik7Ci19Ci0KLUdMT0JBTChsb25nKQotam1pbiAobG9uZyBhLCBsb25nIGIpCi17Ci0gIHJldHVybiBhIDwgYiA/IGEgOiBiOwotfQotCi0KLS8qIE9uIG5vcm1hbCBtYWNoaW5lcyB3ZSBjYW4gYXBwbHkgTUVNQ09QWSgpIGFuZCBNRU1aRVJPKCkgdG8gc2FtcGxlIGFycmF5cwotICogYW5kIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cy4gIFRoaXMgd29uJ3Qgd29yayBvbiA4MHg4NiBiZWNhdXNlIHRoZSBhcnJheXMKLSAqIGFyZSBGQVIgYW5kIHdlJ3JlIGFzc3VtaW5nIGEgc21hbGwtcG9pbnRlciBtZW1vcnkgbW9kZWwuICBIb3dldmVyLCBzb21lCi0gKiBET1MgY29tcGlsZXJzIHByb3ZpZGUgZmFyLXBvaW50ZXIgdmVyc2lvbnMgb2YgbWVtY3B5KCkgYW5kIG1lbXNldCgpIGV2ZW4KLSAqIGluIHRoZSBzbWFsbC1tb2RlbCBsaWJyYXJpZXMuICBUaGVzZSB3aWxsIGJlIHVzZWQgaWYgVVNFX0ZNRU0gaXMgZGVmaW5lZC4KLSAqIE90aGVyd2lzZSwgdGhlIHJvdXRpbmVzIGJlbG93IGRvIGl0IHRoZSBoYXJkIHdheS4gIChUaGUgcGVyZm9ybWFuY2UgY29zdAotICogaXMgbm90IGFsbCB0aGF0IGdyZWF0LCBiZWNhdXNlIHRoZXNlIHJvdXRpbmVzIGFyZW4ndCB2ZXJ5IGhlYXZpbHkgdXNlZC4pCi0gKi8KLQotI2lmbmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiBub3JtYWwgY2FzZSwgc2FtZSBhcyByZWd1bGFyIG1hY3JvcyAqLwotI2RlZmluZSBGTUVNQ09QWShkZXN0LHNyYyxzaXplKQlNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCi0jZGVmaW5lIEZNRU1aRVJPKHRhcmdldCxzaXplKQlNRU1aRVJPKHRhcmdldCxzaXplKQotI2Vsc2UJCQkJLyogODB4ODYgY2FzZSwgZGVmaW5lIGlmIHdlIGNhbiAqLwotI2lmZGVmIFVTRV9GTUVNCi0jZGVmaW5lIEZNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCV9mbWVtY3B5KCh2b2lkIEZBUiAqKShkZXN0KSwgKGNvbnN0IHZvaWQgRkFSICopKHNyYyksIChzaXplX3QpKHNpemUpKQotI2RlZmluZSBGTUVNWkVSTyh0YXJnZXQsc2l6ZSkJX2ZtZW1zZXQoKHZvaWQgRkFSICopKHRhcmdldCksIDAsIChzaXplX3QpKHNpemUpKQotI2VuZGlmCi0jZW5kaWYKLQotCi1HTE9CQUwodm9pZCkKLWpjb3B5X3NhbXBsZV9yb3dzIChKU0FNUEFSUkFZIGlucHV0X2FycmF5LCBpbnQgc291cmNlX3JvdywKLQkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYXJyYXksIGludCBkZXN0X3JvdywKLQkJICAgaW50IG51bV9yb3dzLCBKRElNRU5TSU9OIG51bV9jb2xzKQotLyogQ29weSBzb21lIHJvd3Mgb2Ygc2FtcGxlcyBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLgotICogbnVtX3Jvd3Mgcm93cyBhcmUgY29waWVkIGZyb20gaW5wdXRfYXJyYXlbc291cmNlX3JvdysrXQotICogdG8gb3V0cHV0X2FycmF5W2Rlc3Rfcm93KytdOyB0aGVzZSBhcmVhcyBtYXkgb3ZlcmxhcCBmb3IgZHVwbGljYXRpb24uCi0gKiBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcnJheXMgbXVzdCBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIG51bV9jb2xzLgotICovCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0jaWZkZWYgRk1FTUNPUFkKLSAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50ID0gKHNpemVfdCkgKG51bV9jb2xzICogU0laRU9GKEpTQU1QTEUpKTsKLSNlbHNlCi0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY291bnQ7Ci0jZW5kaWYKLSAgcmVnaXN0ZXIgaW50IHJvdzsKLQotICBpbnB1dF9hcnJheSArPSBzb3VyY2Vfcm93OwotICBvdXRwdXRfYXJyYXkgKz0gZGVzdF9yb3c7Ci0KLSAgZm9yIChyb3cgPSBudW1fcm93czsgcm93ID4gMDsgcm93LS0pIHsKLSAgICBpbnB0ciA9ICppbnB1dF9hcnJheSsrOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYXJyYXkrKzsKLSNpZmRlZiBGTUVNQ09QWQotICAgIEZNRU1DT1BZKG91dHB0ciwgaW5wdHIsIGNvdW50KTsKLSNlbHNlCi0gICAgZm9yIChjb3VudCA9IG51bV9jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pCi0gICAgICAqb3V0cHRyKysgPSAqaW5wdHIrKzsJLyogbmVlZG4ndCBib3RoZXIgd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLwotI2VuZGlmCi0gIH0KLX0KLQotCi1HTE9CQUwodm9pZCkKLWpjb3B5X2Jsb2NrX3JvdyAoSkJMT0NLUk9XIGlucHV0X3JvdywgSkJMT0NLUk9XIG91dHB1dF9yb3csCi0JCSBKRElNRU5TSU9OIG51bV9ibG9ja3MpCi0vKiBDb3B5IGEgcm93IG9mIGNvZWZmaWNpZW50IGJsb2NrcyBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLiAqLwotewotI2lmZGVmIEZNRU1DT1BZCi0gIEZNRU1DT1BZKG91dHB1dF9yb3csIGlucHV0X3JvdywgbnVtX2Jsb2NrcyAqIChEQ1RTSVpFMiAqIFNJWkVPRihKQ09FRikpKTsKLSNlbHNlCi0gIHJlZ2lzdGVyIEpDT0VGUFRSIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIGxvbmcgY291bnQ7Ci0KLSAgaW5wdHIgPSAoSkNPRUZQVFIpIGlucHV0X3JvdzsKLSAgb3V0cHRyID0gKEpDT0VGUFRSKSBvdXRwdXRfcm93OwotICBmb3IgKGNvdW50ID0gKGxvbmcpIG51bV9ibG9ja3MgKiBEQ1RTSVpFMjsgY291bnQgPiAwOyBjb3VudC0tKSB7Ci0gICAgKm91dHB0cisrID0gKmlucHRyKys7Ci0gIH0KLSNlbmRpZgotfQotCi0KLUdMT0JBTCh2b2lkKQotanplcm9fZmFyICh2b2lkIEZBUiAqIHRhcmdldCwgc2l6ZV90IGJ5dGVzdG96ZXJvKQotLyogWmVybyBvdXQgYSBjaHVuayBvZiBGQVIgbWVtb3J5LiAqLwotLyogVGhpcyBtaWdodCBiZSBzYW1wbGUtYXJyYXkgZGF0YSwgYmxvY2stYXJyYXkgZGF0YSwgb3IgYWxsb2NfbGFyZ2UgZGF0YS4gKi8KLXsKLSNpZmRlZiBGTUVNWkVSTwotICBGTUVNWkVSTyh0YXJnZXQsIGJ5dGVzdG96ZXJvKTsKLSNlbHNlCi0gIHJlZ2lzdGVyIGNoYXIgRkFSICogcHRyID0gKGNoYXIgRkFSICopIHRhcmdldDsKLSAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50OwotCi0gIGZvciAoY291bnQgPSBieXRlc3RvemVybzsgY291bnQgPiAwOyBjb3VudC0tKSB7Ci0gICAgKnB0cisrID0gMDsKLSAgfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qdmVyc2lvbi5oIGIvbGlianBlZ3R3cnAvanZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3MmM1OC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qdmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoKLSAqIGp2ZXJzaW9uLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBzb2Z0d2FyZSB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uLgotICovCi0KLQotI2RlZmluZSBKVkVSU0lPTgkiNmIgIDI3LU1hci0xOTk4IgotCi0jZGVmaW5lIEpDT1BZUklHSFQJIkNvcHlyaWdodCAoQykgMTk5OCwgVGhvbWFzIEcuIExhbmUiCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9saWJqcGVnLmRvYyBiL2xpYmpwZWd0d3JwL2xpYmpwZWcuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODliMjA2Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2xpYmpwZWcuZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMzAwNiArMCwwIEBACi1VU0lORyBUSEUgSUpHIEpQRUcgTElCUkFSWQotCi1Db3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotCi0KLVRoaXMgZmlsZSBkZXNjcmliZXMgaG93IHRvIHVzZSB0aGUgSUpHIEpQRUcgbGlicmFyeSB3aXRoaW4gYW4gYXBwbGljYXRpb24KLXByb2dyYW0uICBSZWFkIGl0IGlmIHlvdSB3YW50IHRvIHdyaXRlIGEgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIGxpYnJhcnkuCi0KLVRoZSBmaWxlIGV4YW1wbGUuYyBwcm92aWRlcyBoZWF2aWx5IGNvbW1lbnRlZCBza2VsZXRvbiBjb2RlIGZvciBjYWxsaW5nIHRoZQotSlBFRyBsaWJyYXJ5LiAgQWxzbyBzZWUganBlZ2xpYi5oICh0aGUgaW5jbHVkZSBmaWxlIHRvIGJlIHVzZWQgYnkgYXBwbGljYXRpb24KLXByb2dyYW1zKSBmb3IgZnVsbCBkZXRhaWxzIGFib3V0IGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gcGFyYW1ldGVyIGxpc3RzLgotVGhlIGxpYnJhcnkgc291cmNlIGNvZGUsIG9mIGNvdXJzZSwgaXMgdGhlIHVsdGltYXRlIHJlZmVyZW5jZS4KLQotTm90ZSB0aGF0IHRoZXJlIGhhdmUgYmVlbiAqbWFqb3IqIGNoYW5nZXMgZnJvbSB0aGUgYXBwbGljYXRpb24gaW50ZXJmYWNlCi1wcmVzZW50ZWQgYnkgSUpHIHZlcnNpb24gNCBhbmQgZWFybGllciB2ZXJzaW9ucy4gIFRoZSBvbGQgZGVzaWduIGhhZCBzZXZlcmFsCi1pbmhlcmVudCBsaW1pdGF0aW9ucywgYW5kIGl0IGhhZCBhY2N1bXVsYXRlZCBhIGxvdCBvZiBjcnVmdCBhcyB3ZSBhZGRlZAotZmVhdHVyZXMgd2hpbGUgdHJ5aW5nIHRvIG1pbmltaXplIGFwcGxpY2F0aW9uLWludGVyZmFjZSBjaGFuZ2VzLiAgV2UgaGF2ZQotc2FjcmlmaWNlZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGluIHRoZSB2ZXJzaW9uIDUgcmV3cml0ZSwgYnV0IHdlIHRoaW5rIHRoZQotaW1wcm92ZW1lbnRzIGp1c3RpZnkgdGhpcy4KLQotCi1UQUJMRSBPRiBDT05URU5UUwotLS0tLS0tLS0tLS0tLS0tLS0KLQotT3ZlcnZpZXc6Ci0JRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZSBsaWJyYXJ5Ci0JT3V0bGluZSBvZiB0eXBpY2FsIHVzYWdlCi1CYXNpYyBsaWJyYXJ5IHVzYWdlOgotCURhdGEgZm9ybWF0cwotCUNvbXByZXNzaW9uIGRldGFpbHMKLQlEZWNvbXByZXNzaW9uIGRldGFpbHMKLQlNZWNoYW5pY3Mgb2YgdXNhZ2U6IGluY2x1ZGUgZmlsZXMsIGxpbmtpbmcsIGV0YwotQWR2YW5jZWQgZmVhdHVyZXM6Ci0JQ29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbgotCURlY29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbgotCVNwZWNpYWwgY29sb3Igc3BhY2VzCi0JRXJyb3IgaGFuZGxpbmcKLQlDb21wcmVzc2VkIGRhdGEgaGFuZGxpbmcgKHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWFuYWdlcnMpCi0JSS9PIHN1c3BlbnNpb24KLQlQcm9ncmVzc2l2ZSBKUEVHIHN1cHBvcnQKLQlCdWZmZXJlZC1pbWFnZSBtb2RlCi0JQWJicmV2aWF0ZWQgZGF0YXN0cmVhbXMgYW5kIG11bHRpcGxlIGltYWdlcwotCVNwZWNpYWwgbWFya2VycwotCVJhdyAoZG93bnNhbXBsZWQpIGltYWdlIGRhdGEKLQlSZWFsbHkgcmF3IGRhdGE6IERDVCBjb2VmZmljaWVudHMKLQlQcm9ncmVzcyBtb25pdG9yaW5nCi0JTWVtb3J5IG1hbmFnZW1lbnQKLQlNZW1vcnkgdXNhZ2UKLQlMaWJyYXJ5IGNvbXBpbGUtdGltZSBvcHRpb25zCi0JUG9ydGFiaWxpdHkgY29uc2lkZXJhdGlvbnMKLQlOb3RlcyBmb3IgTVMtRE9TIGltcGxlbWVudG9ycwotCi1Zb3Ugc2hvdWxkIHJlYWQgYXQgbGVhc3QgdGhlIG92ZXJ2aWV3IGFuZCBiYXNpYyB1c2FnZSBzZWN0aW9ucyBiZWZvcmUgdHJ5aW5nCi10byBwcm9ncmFtIHdpdGggdGhlIGxpYnJhcnkuICBUaGUgc2VjdGlvbnMgb24gYWR2YW5jZWQgZmVhdHVyZXMgY2FuIGJlIHJlYWQKLWlmIGFuZCB3aGVuIHlvdSBuZWVkIHRoZW0uCi0KLQotT1ZFUlZJRVcKLT09PT09PT09Ci0KLUZ1bmN0aW9ucyBwcm92aWRlZCBieSB0aGUgbGlicmFyeQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBJSkcgSlBFRyBsaWJyYXJ5IHByb3ZpZGVzIEMgY29kZSB0byByZWFkIGFuZCB3cml0ZSBKUEVHLWNvbXByZXNzZWQgaW1hZ2UKLWZpbGVzLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIHByb2dyYW0gcmVjZWl2ZXMgb3Igc3VwcGxpZXMgaW1hZ2UgZGF0YSBhCi1zY2FubGluZSBhdCBhIHRpbWUsIHVzaW5nIGEgc3RyYWlnaHRmb3J3YXJkIHVuY29tcHJlc3NlZCBpbWFnZSBmb3JtYXQuICBBbGwKLWRldGFpbHMgb2YgY29sb3IgY29udmVyc2lvbiBhbmQgb3RoZXIgcHJlcHJvY2Vzc2luZy9wb3N0cHJvY2Vzc2luZyBjYW4gYmUKLWhhbmRsZWQgYnkgdGhlIGxpYnJhcnkuCi0KLVRoZSBsaWJyYXJ5IGluY2x1ZGVzIGEgc3Vic3RhbnRpYWwgYW1vdW50IG9mIGNvZGUgdGhhdCBpcyBub3QgY292ZXJlZCBieSB0aGUKLUpQRUcgc3RhbmRhcmQgYnV0IGlzIG5lY2Vzc2FyeSBmb3IgdHlwaWNhbCBhcHBsaWNhdGlvbnMgb2YgSlBFRy4gIFRoZXNlCi1mdW5jdGlvbnMgcHJlcHJvY2VzcyB0aGUgaW1hZ2UgYmVmb3JlIEpQRUcgY29tcHJlc3Npb24gb3IgcG9zdHByb2Nlc3MgaXQgYWZ0ZXIKLWRlY29tcHJlc3Npb24uICBUaGV5IGluY2x1ZGUgY29sb3JzcGFjZSBjb252ZXJzaW9uLCBkb3duc2FtcGxpbmcvdXBzYW1wbGluZywKLWFuZCBjb2xvciBxdWFudGl6YXRpb24uICBUaGUgYXBwbGljYXRpb24gaW5kaXJlY3RseSBzZWxlY3RzIHVzZSBvZiB0aGlzIGNvZGUKLWJ5IHNwZWNpZnlpbmcgdGhlIGZvcm1hdCBpbiB3aGljaCBpdCB3aXNoZXMgdG8gc3VwcGx5IG9yIHJlY2VpdmUgaW1hZ2UgZGF0YS4KLUZvciBleGFtcGxlLCBpZiBjb2xvcm1hcHBlZCBvdXRwdXQgaXMgcmVxdWVzdGVkLCB0aGVuIHRoZSBkZWNvbXByZXNzaW9uCi1saWJyYXJ5IGF1dG9tYXRpY2FsbHkgaW52b2tlcyBjb2xvciBxdWFudGl6YXRpb24uCi0KLUEgd2lkZSByYW5nZSBvZiBxdWFsaXR5IHZzLiBzcGVlZCB0cmFkZW9mZnMgYXJlIHBvc3NpYmxlIGluIEpQRUcgcHJvY2Vzc2luZywKLWFuZCBldmVuIG1vcmUgc28gaW4gZGVjb21wcmVzc2lvbiBwb3N0cHJvY2Vzc2luZy4gIFRoZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkKLXByb3ZpZGVzIG11bHRpcGxlIGltcGxlbWVudGF0aW9ucyB0aGF0IGNvdmVyIG1vc3Qgb2YgdGhlIHVzZWZ1bCB0cmFkZW9mZnMsCi1yYW5naW5nIGZyb20gdmVyeS1oaWdoLXF1YWxpdHkgZG93biB0byBmYXN0LXByZXZpZXcgb3BlcmF0aW9uLiAgT24gdGhlCi1jb21wcmVzc2lvbiBzaWRlIHdlIGhhdmUgZ2VuZXJhbGx5IG5vdCBwcm92aWRlZCBsb3ctcXVhbGl0eSBjaG9pY2VzLCBzaW5jZQotY29tcHJlc3Npb24gaXMgbm9ybWFsbHkgbGVzcyB0aW1lLWNyaXRpY2FsLiAgSXQgc2hvdWxkIGJlIHVuZGVyc3Rvb2QgdGhhdCB0aGUKLWxvdy1xdWFsaXR5IG1vZGVzIG1heSBub3QgbWVldCB0aGUgSlBFRyBzdGFuZGFyZCdzIGFjY3VyYWN5IHJlcXVpcmVtZW50czsKLW5vbmV0aGVsZXNzLCB0aGV5IGFyZSB1c2VmdWwgZm9yIHZpZXdlcnMuCi0KLUEgd29yZCBhYm91dCBmdW5jdGlvbnMgKm5vdCogcHJvdmlkZWQgYnkgdGhlIGxpYnJhcnkuICBXZSBoYW5kbGUgYSBzdWJzZXQgb2YKLXRoZSBJU08gSlBFRyBzdGFuZGFyZDsgbW9zdCBiYXNlbGluZSwgZXh0ZW5kZWQtc2VxdWVudGlhbCwgYW5kIHByb2dyZXNzaXZlCi1KUEVHIHByb2Nlc3NlcyBhcmUgc3VwcG9ydGVkLiAgKE91ciBzdWJzZXQgaW5jbHVkZXMgYWxsIGZlYXR1cmVzIG5vdyBpbiBjb21tb24KLXVzZS4pICBVbnN1cHBvcnRlZCBJU08gb3B0aW9ucyBpbmNsdWRlOgotCSogSGllcmFyY2hpY2FsIHN0b3JhZ2UKLQkqIExvc3NsZXNzIEpQRUcKLQkqIEFyaXRobWV0aWMgZW50cm9weSBjb2RpbmcgKHVuc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zKQotCSogRE5MIG1hcmtlcgotCSogTm9uaW50ZWdyYWwgc3Vic2FtcGxpbmcgcmF0aW9zCi1XZSBzdXBwb3J0IGJvdGggOC0gYW5kIDEyLWJpdCBkYXRhIHByZWNpc2lvbiwgYnV0IHRoaXMgaXMgYSBjb21waWxlLXRpbWUKLWNob2ljZSByYXRoZXIgdGhhbiBhIHJ1bi10aW1lIGNob2ljZTsgaGVuY2UgaXQgaXMgZGlmZmljdWx0IHRvIHVzZSBib3RoCi1wcmVjaXNpb25zIGluIGEgc2luZ2xlIGFwcGxpY2F0aW9uLgotCi1CeSBpdHNlbGYsIHRoZSBsaWJyYXJ5IGhhbmRsZXMgb25seSBpbnRlcmNoYW5nZSBKUEVHIGRhdGFzdHJlYW1zIC0tLSBpbgotcGFydGljdWxhciB0aGUgd2lkZWx5IHVzZWQgSkZJRiBmaWxlIGZvcm1hdC4gIFRoZSBsaWJyYXJ5IGNhbiBiZSB1c2VkIGJ5Ci1zdXJyb3VuZGluZyBjb2RlIHRvIHByb2Nlc3MgaW50ZXJjaGFuZ2Ugb3IgYWJicmV2aWF0ZWQgSlBFRyBkYXRhc3RyZWFtcyB0aGF0Ci1hcmUgZW1iZWRkZWQgaW4gbW9yZSBjb21wbGV4IGZpbGUgZm9ybWF0cy4gIChGb3IgZXhhbXBsZSwgdGhpcyBsaWJyYXJ5IGlzCi11c2VkIGJ5IHRoZSBmcmVlIExJQlRJRkYgbGlicmFyeSB0byBzdXBwb3J0IEpQRUcgY29tcHJlc3Npb24gaW4gVElGRi4pCi0KLQotT3V0bGluZSBvZiB0eXBpY2FsIHVzYWdlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIHJvdWdoIG91dGxpbmUgb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9wZXJhdGlvbiBpczoKLQotCUFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QKLQlTcGVjaWZ5IHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGNvbXByZXNzZWQgZGF0YSAoZWcsIGEgZmlsZSkKLQlTZXQgcGFyYW1ldGVycyBmb3IgY29tcHJlc3Npb24sIGluY2x1ZGluZyBpbWFnZSBzaXplICYgY29sb3JzcGFjZQotCWpwZWdfc3RhcnRfY29tcHJlc3MoLi4uKTsKLQl3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgd3JpdHRlbikKLQkJanBlZ193cml0ZV9zY2FubGluZXMoLi4uKTsKLQlqcGVnX2ZpbmlzaF9jb21wcmVzcyguLi4pOwotCVJlbGVhc2UgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0Ci0KLUEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QgaG9sZHMgcGFyYW1ldGVycyBhbmQgd29ya2luZyBzdGF0ZSBmb3IgdGhlIEpQRUcKLWxpYnJhcnkuICBXZSBtYWtlIGNyZWF0aW9uL2Rlc3RydWN0aW9uIG9mIHRoZSBvYmplY3Qgc2VwYXJhdGUgZnJvbSBzdGFydGluZwotb3IgZmluaXNoaW5nIGNvbXByZXNzaW9uIG9mIGFuIGltYWdlOyB0aGUgc2FtZSBvYmplY3QgY2FuIGJlIHJlLXVzZWQgZm9yIGEKLXNlcmllcyBvZiBpbWFnZSBjb21wcmVzc2lvbiBvcGVyYXRpb25zLiAgVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHJlLXVzZSB0aGUKLXNhbWUgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBhIHNlcXVlbmNlIG9mIGltYWdlcy4gIFJlLXVzZSBvZiBhIEpQRUcgb2JqZWN0Ci1hbHNvIGhhcyBpbXBvcnRhbnQgaW1wbGljYXRpb25zIGZvciBwcm9jZXNzaW5nIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMsCi1hcyBkaXNjdXNzZWQgbGF0ZXIuCi0KLVRoZSBpbWFnZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc3VwcGxpZWQgdG8ganBlZ193cml0ZV9zY2FubGluZXMoKSBmcm9tCi1pbi1tZW1vcnkgYnVmZmVycy4gIElmIHRoZSBhcHBsaWNhdGlvbiBpcyBkb2luZyBmaWxlLXRvLWZpbGUgY29tcHJlc3Npb24sCi1yZWFkaW5nIGltYWdlIGRhdGEgZnJvbSB0aGUgc291cmNlIGZpbGUgaXMgdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkuCi1UaGUgbGlicmFyeSBlbWl0cyBjb21wcmVzc2VkIGRhdGEgYnkgY2FsbGluZyBhICJkYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXIiLAotd2hpY2ggdHlwaWNhbGx5IHdpbGwgd3JpdGUgdGhlIGRhdGEgaW50byBhIGZpbGU7IGJ1dCB0aGUgYXBwbGljYXRpb24gY2FuCi1wcm92aWRlIGl0cyBvd24gZGVzdGluYXRpb24gbWFuYWdlciB0byBkbyBzb21ldGhpbmcgZWxzZS4KLQotU2ltaWxhcmx5LCB0aGUgcm91Z2ggb3V0bGluZSBvZiBhIEpQRUcgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24gaXM6Ci0KLQlBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QKLQlTcGVjaWZ5IHRoZSBzb3VyY2Ugb2YgdGhlIGNvbXByZXNzZWQgZGF0YSAoZWcsIGEgZmlsZSkKLQlDYWxsIGpwZWdfcmVhZF9oZWFkZXIoKSB0byBvYnRhaW4gaW1hZ2UgaW5mbwotCVNldCBwYXJhbWV0ZXJzIGZvciBkZWNvbXByZXNzaW9uCi0JanBlZ19zdGFydF9kZWNvbXByZXNzKC4uLik7Ci0Jd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHJlYWQpCi0JCWpwZWdfcmVhZF9zY2FubGluZXMoLi4uKTsKLQlqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKC4uLik7Ci0JUmVsZWFzZSB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdAotCi1UaGlzIGlzIGNvbXBhcmFibGUgdG8gdGhlIGNvbXByZXNzaW9uIG91dGxpbmUgZXhjZXB0IHRoYXQgcmVhZGluZyB0aGUKLWRhdGFzdHJlYW0gaGVhZGVyIGlzIGEgc2VwYXJhdGUgc3RlcC4gIFRoaXMgaXMgaGVscGZ1bCBiZWNhdXNlIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgaW1hZ2UncyBzaXplLCBjb2xvcnNwYWNlLCBldGMgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIGFwcGxpY2F0aW9uCi1zZWxlY3RzIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4gIEZvciBleGFtcGxlLCB0aGUgYXBwbGljYXRpb24gY2FuIGNob29zZSBhbgotb3V0cHV0IHNjYWxpbmcgcmF0aW8gdGhhdCB3aWxsIGZpdCB0aGUgaW1hZ2UgaW50byB0aGUgYXZhaWxhYmxlIHNjcmVlbiBzaXplLgotCi1UaGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9idGFpbnMgY29tcHJlc3NlZCBkYXRhIGJ5IGNhbGxpbmcgYSBkYXRhIHNvdXJjZQotbWFuYWdlciwgd2hpY2ggdHlwaWNhbGx5IHdpbGwgcmVhZCB0aGUgZGF0YSBmcm9tIGEgZmlsZTsgYnV0IG90aGVyIGJlaGF2aW9ycwotY2FuIGJlIG9idGFpbmVkIHdpdGggYSBjdXN0b20gc291cmNlIG1hbmFnZXIuICBEZWNvbXByZXNzZWQgZGF0YSBpcyBkZWxpdmVyZWQKLWludG8gaW4tbWVtb3J5IGJ1ZmZlcnMgcGFzc2VkIHRvIGpwZWdfcmVhZF9zY2FubGluZXMoKS4KLQotSXQgaXMgcG9zc2libGUgdG8gYWJvcnQgYW4gaW5jb21wbGV0ZSBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbgotYnkgY2FsbGluZyBqcGVnX2Fib3J0KCk7IG9yLCBpZiB5b3UgZG8gbm90IG5lZWQgdG8gcmV0YWluIHRoZSBKUEVHIG9iamVjdCwKLXNpbXBseSByZWxlYXNlIGl0IGJ5IGNhbGxpbmcganBlZ19kZXN0cm95KCkuCi0KLUpQRUcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb2JqZWN0cyBhcmUgdHdvIHNlcGFyYXRlIHN0cnVjdCB0eXBlcy4KLUhvd2V2ZXIsIHRoZXkgc2hhcmUgc29tZSBjb21tb24gZmllbGRzLCBhbmQgY2VydGFpbiByb3V0aW5lcyBzdWNoIGFzCi1qcGVnX2Rlc3Ryb3koKSBjYW4gd29yayBvbiBlaXRoZXIgdHlwZSBvZiBvYmplY3QuCi0KLVRoZSBKUEVHIGxpYnJhcnkgaGFzIG5vIHN0YXRpYyB2YXJpYWJsZXM6IGFsbCBzdGF0ZSBpcyBpbiB0aGUgY29tcHJlc3Npb24KLW9yIGRlY29tcHJlc3Npb24gb2JqZWN0LiAgVGhlcmVmb3JlIGl0IGlzIHBvc3NpYmxlIHRvIHByb2Nlc3MgbXVsdGlwbGUKLWNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbnMgY29uY3VycmVudGx5LCB1c2luZyBtdWx0aXBsZSBKUEVHCi1vYmplY3RzLgotCi1Cb3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGFuIGluY3JlbWVudGFsIG1lbW9yeS10by0KLW1lbW9yeSBmYXNoaW9uLCBpZiBzdWl0YWJsZSBzb3VyY2UvZGVzdGluYXRpb24gbWFuYWdlcnMgYXJlIHVzZWQuICBTZWUgdGhlCi1zZWN0aW9uIG9uICJJL08gc3VzcGVuc2lvbiIgZm9yIG1vcmUgZGV0YWlscy4KLQotCi1CQVNJQyBMSUJSQVJZIFVTQUdFCi09PT09PT09PT09PT09PT09PT09Ci0KLURhdGEgZm9ybWF0cwotLS0tLS0tLS0tLS0tCi0KLUJlZm9yZSBkaXZpbmcgaW50byBwcm9jZWR1cmFsIGRldGFpbHMsIGl0IGlzIGhlbHBmdWwgdG8gdW5kZXJzdGFuZCB0aGUKLWltYWdlIGRhdGEgZm9ybWF0IHRoYXQgdGhlIEpQRUcgbGlicmFyeSBleHBlY3RzIG9yIHJldHVybnMuCi0KLVRoZSBzdGFuZGFyZCBpbnB1dCBpbWFnZSBmb3JtYXQgaXMgYSByZWN0YW5ndWxhciBhcnJheSBvZiBwaXhlbHMsIHdpdGggZWFjaAotcGl4ZWwgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiAiY29tcG9uZW50IiBvciAic2FtcGxlIiB2YWx1ZXMgKGNvbG9yCi1jaGFubmVscykuICBZb3UgbXVzdCBzcGVjaWZ5IGhvdyBtYW55IGNvbXBvbmVudHMgdGhlcmUgYXJlIGFuZCB0aGUgY29sb3JzcGFjZQotaW50ZXJwcmV0YXRpb24gb2YgdGhlIGNvbXBvbmVudHMuICBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsIHVzZSBSR0IgZGF0YQotKHRocmVlIGNvbXBvbmVudHMgcGVyIHBpeGVsKSBvciBncmF5c2NhbGUgZGF0YSAob25lIGNvbXBvbmVudCBwZXIgcGl4ZWwpLgotUExFQVNFIE5PVEUgVEhBVCBSR0IgREFUQSBJUyBUSFJFRSBTQU1QTEVTIFBFUiBQSVhFTCwgR1JBWVNDQUxFIE9OTFkgT05FLgotQSByZW1hcmthYmxlIG51bWJlciBvZiBwZW9wbGUgbWFuYWdlIHRvIG1pc3MgdGhpcywgb25seSB0byBmaW5kIHRoYXQgdGhlaXIKLXByb2dyYW1zIGRvbid0IHdvcmsgd2l0aCBncmF5c2NhbGUgSlBFRyBmaWxlcy4KLQotVGhlcmUgaXMgbm8gcHJvdmlzaW9uIGZvciBjb2xvcm1hcHBlZCBpbnB1dC4gIEpQRUcgZmlsZXMgYXJlIGFsd2F5cyBmdWxsLWNvbG9yCi1vciBmdWxsIGdyYXlzY2FsZSAob3Igc29tZXRpbWVzIGFub3RoZXIgY29sb3JzcGFjZSBzdWNoIGFzIENNWUspLiAgWW91IGNhbgotZmVlZCBpbiBhIGNvbG9ybWFwcGVkIGltYWdlIGJ5IGV4cGFuZGluZyBpdCB0byBmdWxsLWNvbG9yIGZvcm1hdC4gIEhvd2V2ZXIKLUpQRUcgb2Z0ZW4gZG9lc24ndCB3b3JrIHZlcnkgd2VsbCB3aXRoIHNvdXJjZSBkYXRhIHRoYXQgaGFzIGJlZW4gY29sb3JtYXBwZWQsCi1iZWNhdXNlIG9mIGRpdGhlcmluZyBub2lzZS4gIFRoaXMgaXMgZGlzY3Vzc2VkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBKUEVHIEZBUQotYW5kIHRoZSBvdGhlciByZWZlcmVuY2VzIG1lbnRpb25lZCBpbiB0aGUgUkVBRE1FIGZpbGUuCi0KLVBpeGVscyBhcmUgc3RvcmVkIGJ5IHNjYW5saW5lcywgd2l0aCBlYWNoIHNjYW5saW5lIHJ1bm5pbmcgZnJvbSBsZWZ0IHRvCi1yaWdodC4gIFRoZSBjb21wb25lbnQgdmFsdWVzIGZvciBlYWNoIHBpeGVsIGFyZSBhZGphY2VudCBpbiB0aGUgcm93OyBmb3IKLWV4YW1wbGUsIFIsRyxCLFIsRyxCLFIsRyxCLC4uLiBmb3IgMjQtYml0IFJHQiBjb2xvci4gIEVhY2ggc2NhbmxpbmUgaXMgYW4KLWFycmF5IG9mIGRhdGEgdHlwZSBKU0FNUExFIC0tLSB3aGljaCBpcyB0eXBpY2FsbHkgInVuc2lnbmVkIGNoYXIiLCB1bmxlc3MKLXlvdSd2ZSBjaGFuZ2VkIGptb3JlY2ZnLmguICAoWW91IGNhbiBhbHNvIGNoYW5nZSB0aGUgUkdCIHBpeGVsIGxheW91dCwgc2F5Ci10byBCLEcsUiBvcmRlciwgYnkgbW9kaWZ5aW5nIGptb3JlY2ZnLmguICBCdXQgc2VlIHRoZSByZXN0cmljdGlvbnMgbGlzdGVkIGluCi10aGF0IGZpbGUgYmVmb3JlIGRvaW5nIHNvLikKLQotQSAyLUQgYXJyYXkgb2YgcGl4ZWxzIGlzIGZvcm1lZCBieSBtYWtpbmcgYSBsaXN0IG9mIHBvaW50ZXJzIHRvIHRoZSBzdGFydHMgb2YKLXNjYW5saW5lczsgc28gdGhlIHNjYW5saW5lcyBuZWVkIG5vdCBiZSBwaHlzaWNhbGx5IGFkamFjZW50IGluIG1lbW9yeS4gIEV2ZW4KLWlmIHlvdSBwcm9jZXNzIGp1c3Qgb25lIHNjYW5saW5lIGF0IGEgdGltZSwgeW91IG11c3QgbWFrZSBhIG9uZS1lbGVtZW50Ci1wb2ludGVyIGFycmF5IHRvIGNvbmZvcm0gdG8gdGhpcyBzdHJ1Y3R1cmUuICBQb2ludGVycyB0byBKU0FNUExFIHJvd3MgYXJlIG9mCi10eXBlIEpTQU1QUk9XLCBhbmQgdGhlIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgYXJyYXkgaXMgb2YgdHlwZSBKU0FNUEFSUkFZLgotCi1UaGUgbGlicmFyeSBhY2NlcHRzIG9yIHN1cHBsaWVzIG9uZSBvciBtb3JlIGNvbXBsZXRlIHNjYW5saW5lcyBwZXIgY2FsbC4KLUl0IGlzIG5vdCBwb3NzaWJsZSB0byBwcm9jZXNzIHBhcnQgb2YgYSByb3cgYXQgYSB0aW1lLiAgU2NhbmxpbmVzIGFyZSBhbHdheXMKLXByb2Nlc3NlZCB0b3AtdG8tYm90dG9tLiAgWW91IGNhbiBwcm9jZXNzIGFuIGVudGlyZSBpbWFnZSBpbiBvbmUgY2FsbCBpZiB5b3UKLWhhdmUgaXQgYWxsIGluIG1lbW9yeSwgYnV0IHVzdWFsbHkgaXQncyBzaW1wbGVzdCB0byBwcm9jZXNzIG9uZSBzY2FubGluZSBhdAotYSB0aW1lLgotCi1Gb3IgYmVzdCByZXN1bHRzLCBzb3VyY2UgZGF0YSB2YWx1ZXMgc2hvdWxkIGhhdmUgdGhlIHByZWNpc2lvbiBzcGVjaWZpZWQgYnkKLUJJVFNfSU5fSlNBTVBMRSAobm9ybWFsbHkgOCBiaXRzKS4gIEZvciBpbnN0YW5jZSwgaWYgeW91IGNob29zZSB0byBjb21wcmVzcwotZGF0YSB0aGF0J3Mgb25seSA2IGJpdHMvY2hhbm5lbCwgeW91IHNob3VsZCBsZWZ0LWp1c3RpZnkgZWFjaCB2YWx1ZSBpbiBhCi1ieXRlIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSBjb21wcmVzc29yLiAgSWYgeW91IG5lZWQgdG8gY29tcHJlc3MgZGF0YQotdGhhdCBoYXMgbW9yZSB0aGFuIDggYml0cy9jaGFubmVsLCBjb21waWxlIHdpdGggQklUU19JTl9KU0FNUExFID0gMTIuCi0oU2VlICJMaWJyYXJ5IGNvbXBpbGUtdGltZSBvcHRpb25zIiwgbGF0ZXIuKQotCi0KLVRoZSBkYXRhIGZvcm1hdCByZXR1cm5lZCBieSB0aGUgZGVjb21wcmVzc29yIGlzIHRoZSBzYW1lIGluIGFsbCBkZXRhaWxzLAotZXhjZXB0IHRoYXQgY29sb3JtYXBwZWQgb3V0cHV0IGlzIHN1cHBvcnRlZC4gIChBZ2FpbiwgYSBKUEVHIGZpbGUgaXMgbmV2ZXIKLWNvbG9ybWFwcGVkLiAgQnV0IHlvdSBjYW4gYXNrIHRoZSBkZWNvbXByZXNzb3IgdG8gcGVyZm9ybSBvbi10aGUtZmx5IGNvbG9yCi1xdWFudGl6YXRpb24gdG8gZGVsaXZlciBjb2xvcm1hcHBlZCBvdXRwdXQuKSAgSWYgeW91IHJlcXVlc3QgY29sb3JtYXBwZWQKLW91dHB1dCB0aGVuIHRoZSByZXR1cm5lZCBkYXRhIGFycmF5IGNvbnRhaW5zIGEgc2luZ2xlIEpTQU1QTEUgcGVyIHBpeGVsOwotaXRzIHZhbHVlIGlzIGFuIGluZGV4IGludG8gYSBjb2xvciBtYXAuICBUaGUgY29sb3IgbWFwIGlzIHJlcHJlc2VudGVkIGFzCi1hIDItRCBKU0FNUEFSUkFZIGluIHdoaWNoIGVhY2ggcm93IGhvbGRzIHRoZSB2YWx1ZXMgb2Ygb25lIGNvbG9yIGNvbXBvbmVudCwKLXRoYXQgaXMsIGNvbG9ybWFwW2ldW2pdIGlzIHRoZSB2YWx1ZSBvZiB0aGUgaSd0aCBjb2xvciBjb21wb25lbnQgZm9yIHBpeGVsCi12YWx1ZSAobWFwIGluZGV4KSBqLiAgTm90ZSB0aGF0IHNpbmNlIHRoZSBjb2xvcm1hcCBpbmRleGVzIGFyZSBzdG9yZWQgaW4KLUpTQU1QTEVzLCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29sb3JzIGlzIGxpbWl0ZWQgYnkgdGhlIHNpemUgb2YgSlNBTVBMRQotKGllLCBhdCBtb3N0IDI1NiBjb2xvcnMgZm9yIGFuIDgtYml0IEpQRUcgbGlicmFyeSkuCi0KLQotQ29tcHJlc3Npb24gZGV0YWlscwotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IZXJlIHdlIHJldmlzaXQgdGhlIEpQRUcgY29tcHJlc3Npb24gb3V0bGluZSBnaXZlbiBpbiB0aGUgb3ZlcnZpZXcuCi0KLTEuIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuCi0KLUEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QgaXMgYSAic3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0Ii4gIChJdCBhbHNvIGhhcwotYSBidW5jaCBvZiBzdWJzaWRpYXJ5IHN0cnVjdHVyZXMgd2hpY2ggYXJlIGFsbG9jYXRlZCB2aWEgbWFsbG9jKCksIGJ1dCB0aGUKLWFwcGxpY2F0aW9uIGRvZXNuJ3QgY29udHJvbCB0aG9zZSBkaXJlY3RseS4pICBUaGlzIHN0cnVjdCBjYW4gYmUganVzdCBhIGxvY2FsCi12YXJpYWJsZSBpbiB0aGUgY2FsbGluZyByb3V0aW5lLCBpZiBhIHNpbmdsZSByb3V0aW5lIGlzIGdvaW5nIHRvIGV4ZWN1dGUgdGhlCi13aG9sZSBKUEVHIGNvbXByZXNzaW9uIHNlcXVlbmNlLiAgT3RoZXJ3aXNlIGl0IGNhbiBiZSBzdGF0aWMgb3IgYWxsb2NhdGVkCi1mcm9tIG1hbGxvYygpLgotCi1Zb3Ugd2lsbCBhbHNvIG5lZWQgYSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgSlBFRyBlcnJvciBoYW5kbGVyLiAgVGhlIHBhcnQKLW9mIHRoaXMgdGhhdCB0aGUgbGlicmFyeSBjYXJlcyBhYm91dCBpcyBhICJzdHJ1Y3QganBlZ19lcnJvcl9tZ3IiLiAgSWYgeW91Ci1hcmUgcHJvdmlkaW5nIHlvdXIgb3duIGVycm9yIGhhbmRsZXIsIHlvdSdsbCB0eXBpY2FsbHkgd2FudCB0byBlbWJlZCB0aGUKLWpwZWdfZXJyb3JfbWdyIHN0cnVjdCBpbiBhIGxhcmdlciBzdHJ1Y3R1cmU7IHRoaXMgaXMgZGlzY3Vzc2VkIGxhdGVyIHVuZGVyCi0iRXJyb3IgaGFuZGxpbmciLiAgRm9yIG5vdyB3ZSdsbCBhc3N1bWUgeW91IGFyZSBqdXN0IHVzaW5nIHRoZSBkZWZhdWx0IGVycm9yCi1oYW5kbGVyLiAgVGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciB3aWxsIHByaW50IEpQRUcgZXJyb3Ivd2FybmluZyBtZXNzYWdlcwotb24gc3RkZXJyLCBhbmQgaXQgd2lsbCBjYWxsIGV4aXQoKSBpZiBhIGZhdGFsIGVycm9yIG9jY3Vycy4KLQotWW91IG11c3QgaW5pdGlhbGl6ZSB0aGUgZXJyb3IgaGFuZGxlciBzdHJ1Y3R1cmUsIHN0b3JlIGEgcG9pbnRlciB0byBpdCBpbnRvCi10aGUgSlBFRyBvYmplY3QncyAiZXJyIiBmaWVsZCwgYW5kIHRoZW4gY2FsbCBqcGVnX2NyZWF0ZV9jb21wcmVzcygpIHRvCi1pbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSBKUEVHIG9iamVjdC4KLQotVHlwaWNhbCBjb2RlIGZvciB0aGlzIHN0ZXAsIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciwgaXMKLQotCXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKLQlzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKLQkuLi4KLQljaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7Ci0JanBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKLQotanBlZ19jcmVhdGVfY29tcHJlc3MgYWxsb2NhdGVzIGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeSwgc28gaXQgY291bGQgZmFpbAotaWYgeW91IGFyZSBvdXQgb2YgbWVtb3J5LiAgSW4gdGhhdCBjYXNlIGl0IHdpbGwgZXhpdCB2aWEgdGhlIGVycm9yIGhhbmRsZXI7Ci10aGF0J3Mgd2h5IHRoZSBlcnJvciBoYW5kbGVyIG11c3QgYmUgaW5pdGlhbGl6ZWQgZmlyc3QuCi0KLQotMi4gU3BlY2lmeSB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEgKGVnLCBhIGZpbGUpLgotCi1BcyBwcmV2aW91c2x5IG1lbnRpb25lZCwgdGhlIEpQRUcgbGlicmFyeSBkZWxpdmVycyBjb21wcmVzc2VkIGRhdGEgdG8gYQotImRhdGEgZGVzdGluYXRpb24iIG1vZHVsZS4gIFRoZSBsaWJyYXJ5IGluY2x1ZGVzIG9uZSBkYXRhIGRlc3RpbmF0aW9uCi1tb2R1bGUgd2hpY2gga25vd3MgaG93IHRvIHdyaXRlIHRvIGEgc3RkaW8gc3RyZWFtLiAgWW91IGNhbiB1c2UgeW91ciBvd24KLWRlc3RpbmF0aW9uIG1vZHVsZSBpZiB5b3Ugd2FudCB0byBkbyBzb21ldGhpbmcgZWxzZSwgYXMgZGlzY3Vzc2VkIGxhdGVyLgotCi1JZiB5b3UgdXNlIHRoZSBzdGFuZGFyZCBkZXN0aW5hdGlvbiBtb2R1bGUsIHlvdSBtdXN0IG9wZW4gdGhlIHRhcmdldCBzdGRpbwotc3RyZWFtIGJlZm9yZWhhbmQuICBUeXBpY2FsIGNvZGUgZm9yIHRoaXMgc3RlcCBsb29rcyBsaWtlOgotCi0JRklMRSAqIG91dGZpbGU7Ci0JLi4uCi0JaWYgKChvdXRmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpKSA9PSBOVUxMKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOwotCSAgICBleGl0KDEpOwotCX0KLQlqcGVnX3N0ZGlvX2Rlc3QoJmNpbmZvLCBvdXRmaWxlKTsKLQotd2hlcmUgdGhlIGxhc3QgbGluZSBpbnZva2VzIHRoZSBzdGFuZGFyZCBkZXN0aW5hdGlvbiBtb2R1bGUuCi0KLVdBUk5JTkc6IGl0IGlzIGNyaXRpY2FsIHRoYXQgdGhlIGJpbmFyeSBjb21wcmVzc2VkIGRhdGEgYmUgZGVsaXZlcmVkIHRvIHRoZQotb3V0cHV0IGZpbGUgdW5jaGFuZ2VkLiAgT24gbm9uLVVuaXggc3lzdGVtcyB0aGUgc3RkaW8gbGlicmFyeSBtYXkgcGVyZm9ybQotbmV3bGluZSB0cmFuc2xhdGlvbiBvciBvdGhlcndpc2UgY29ycnVwdCBiaW5hcnkgZGF0YS4gIFRvIHN1cHByZXNzIHRoaXMKLWJlaGF2aW9yLCB5b3UgbWF5IG5lZWQgdG8gdXNlIGEgImIiIG9wdGlvbiB0byBmb3BlbiAoYXMgc2hvd24gYWJvdmUpLCBvciB1c2UKLXNldG1vZGUoKSBvciBhbm90aGVyIHJvdXRpbmUgdG8gcHV0IHRoZSBzdGRpbyBzdHJlYW0gaW4gYmluYXJ5IG1vZGUuICBTZWUKLWNqcGVnLmMgYW5kIGRqcGVnLmMgZm9yIGNvZGUgdGhhdCBoYXMgYmVlbiBmb3VuZCB0byB3b3JrIG9uIG1hbnkgc3lzdGVtcy4KLQotWW91IGNhbiBzZWxlY3QgdGhlIGRhdGEgZGVzdGluYXRpb24gYWZ0ZXIgc2V0dGluZyBvdGhlciBwYXJhbWV0ZXJzIChzdGVwIDMpLAotaWYgdGhhdCdzIG1vcmUgY29udmVuaWVudC4gIFlvdSBtYXkgbm90IGNoYW5nZSB0aGUgZGVzdGluYXRpb24gYmV0d2VlbgotY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIGpwZWdfZmluaXNoX2NvbXByZXNzKCkuCi0KLQotMy4gU2V0IHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW9uLCBpbmNsdWRpbmcgaW1hZ2Ugc2l6ZSAmIGNvbG9yc3BhY2UuCi0KLVlvdSBtdXN0IHN1cHBseSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlIGltYWdlIGJ5IHNldHRpbmcgdGhlIGZvbGxvd2luZwotZmllbGRzIGluIHRoZSBKUEVHIG9iamVjdCAoY2luZm8gc3RydWN0dXJlKToKLQotCWltYWdlX3dpZHRoCQlXaWR0aCBvZiBpbWFnZSwgaW4gcGl4ZWxzCi0JaW1hZ2VfaGVpZ2h0CQlIZWlnaHQgb2YgaW1hZ2UsIGluIHBpeGVscwotCWlucHV0X2NvbXBvbmVudHMJTnVtYmVyIG9mIGNvbG9yIGNoYW5uZWxzIChzYW1wbGVzIHBlciBwaXhlbCkKLQlpbl9jb2xvcl9zcGFjZQkJQ29sb3Igc3BhY2Ugb2Ygc291cmNlIGltYWdlCi0KLVRoZSBpbWFnZSBkaW1lbnNpb25zIGFyZSwgaG9wZWZ1bGx5LCBvYnZpb3VzLiAgSlBFRyBzdXBwb3J0cyBpbWFnZSBkaW1lbnNpb25zCi1vZiAxIHRvIDY0SyBwaXhlbHMgaW4gZWl0aGVyIGRpcmVjdGlvbi4gIFRoZSBpbnB1dCBjb2xvciBzcGFjZSBpcyB0eXBpY2FsbHkKLVJHQiBvciBncmF5c2NhbGUsIGFuZCBpbnB1dF9jb21wb25lbnRzIGlzIDMgb3IgMSBhY2NvcmRpbmdseS4gIChTZWUgIlNwZWNpYWwKLWNvbG9yIHNwYWNlcyIsIGxhdGVyLCBmb3IgbW9yZSBpbmZvLikgIFRoZSBpbl9jb2xvcl9zcGFjZSBmaWVsZCBtdXN0IGJlCi1hc3NpZ25lZCBvbmUgb2YgdGhlIEpfQ09MT1JfU1BBQ0UgZW51bSBjb25zdGFudHMsIHR5cGljYWxseSBKQ1NfUkdCIG9yCi1KQ1NfR1JBWVNDQUxFLgotCi1KUEVHIGhhcyBhIGxhcmdlIG51bWJlciBvZiBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUKLWltYWdlIGlzIGVuY29kZWQuICBNb3N0IGFwcGxpY2F0aW9ucyBkb24ndCBuZWVkIG9yIHdhbnQgdG8ga25vdyBhYm91dCBhbGwKLXRoZXNlIHBhcmFtZXRlcnMuICBZb3UgY2FuIHNldCBhbGwgdGhlIHBhcmFtZXRlcnMgdG8gcmVhc29uYWJsZSBkZWZhdWx0cyBieQotY2FsbGluZyBqcGVnX3NldF9kZWZhdWx0cygpOyB0aGVuLCBpZiB0aGVyZSBhcmUgcGFydGljdWxhciB2YWx1ZXMgeW91IHdhbnQKLXRvIGNoYW5nZSwgeW91IGNhbiBkbyBzbyBhZnRlciB0aGF0LiAgVGhlICJDb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uIgotc2VjdGlvbiB0ZWxscyBhYm91dCBhbGwgdGhlIHBhcmFtZXRlcnMuCi0KLVlvdSBtdXN0IHNldCBpbl9jb2xvcl9zcGFjZSBjb3JyZWN0bHkgYmVmb3JlIGNhbGxpbmcganBlZ19zZXRfZGVmYXVsdHMoKSwKLWJlY2F1c2UgdGhlIGRlZmF1bHRzIGRlcGVuZCBvbiB0aGUgc291cmNlIGltYWdlIGNvbG9yc3BhY2UuICBIb3dldmVyIHRoZQotb3RoZXIgdGhyZWUgc291cmNlIGltYWdlIHBhcmFtZXRlcnMgbmVlZCBub3QgYmUgdmFsaWQgdW50aWwgeW91IGNhbGwKLWpwZWdfc3RhcnRfY29tcHJlc3MoKS4gIFRoZXJlJ3Mgbm8gaGFybSBpbiBjYWxsaW5nIGpwZWdfc2V0X2RlZmF1bHRzKCkgbW9yZQotdGhhbiBvbmNlLCBpZiB0aGF0IGhhcHBlbnMgdG8gYmUgY29udmVuaWVudC4KLQotVHlwaWNhbCBjb2RlIGZvciBhIDI0LWJpdCBSR0Igc291cmNlIGltYWdlIGlzCi0KLQljaW5mby5pbWFnZV93aWR0aCA9IFdpZHRoOyAJLyogaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCwgaW4gcGl4ZWxzICovCi0JY2luZm8uaW1hZ2VfaGVpZ2h0ID0gSGVpZ2h0OwotCWNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSAzOwkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgcGVyIHBpeGVsICovCi0JY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOyAvKiBjb2xvcnNwYWNlIG9mIGlucHV0IGltYWdlICovCi0KLQlqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOwotCS8qIE1ha2Ugb3B0aW9uYWwgcGFyYW1ldGVyIHNldHRpbmdzIGhlcmUgKi8KLQotCi00LiBqcGVnX3N0YXJ0X2NvbXByZXNzKC4uLik7Ci0KLUFmdGVyIHlvdSBoYXZlIGVzdGFibGlzaGVkIHRoZSBkYXRhIGRlc3RpbmF0aW9uIGFuZCBzZXQgYWxsIHRoZSBuZWNlc3NhcnkKLXNvdXJjZSBpbWFnZSBpbmZvIGFuZCBvdGhlciBwYXJhbWV0ZXJzLCBjYWxsIGpwZWdfc3RhcnRfY29tcHJlc3MoKSB0byBiZWdpbgotYSBjb21wcmVzc2lvbiBjeWNsZS4gIFRoaXMgd2lsbCBpbml0aWFsaXplIGludGVybmFsIHN0YXRlLCBhbGxvY2F0ZSB3b3JraW5nCi1zdG9yYWdlLCBhbmQgZW1pdCB0aGUgZmlyc3QgZmV3IGJ5dGVzIG9mIHRoZSBKUEVHIGRhdGFzdHJlYW0gaGVhZGVyLgotCi1UeXBpY2FsIGNvZGU6Ci0KLQlqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7Ci0KLVRoZSAiVFJVRSIgcGFyYW1ldGVyIGVuc3VyZXMgdGhhdCBhIGNvbXBsZXRlIEpQRUcgaW50ZXJjaGFuZ2UgZGF0YXN0cmVhbQotd2lsbCBiZSB3cml0dGVuLiAgVGhpcyBpcyBhcHByb3ByaWF0ZSBpbiBtb3N0IGNhc2VzLiAgSWYgeW91IHRoaW5rIHlvdSBtaWdodAotd2FudCB0byB1c2UgYW4gYWJicmV2aWF0ZWQgZGF0YXN0cmVhbSwgcmVhZCB0aGUgc2VjdGlvbiBvbiBhYmJyZXZpYXRlZAotZGF0YXN0cmVhbXMsIGJlbG93LgotCi1PbmNlIHlvdSBoYXZlIGNhbGxlZCBqcGVnX3N0YXJ0X2NvbXByZXNzKCksIHlvdSBtYXkgbm90IGFsdGVyIGFueSBKUEVHCi1wYXJhbWV0ZXJzIG9yIG90aGVyIGZpZWxkcyBvZiB0aGUgSlBFRyBvYmplY3QgdW50aWwgeW91IGhhdmUgY29tcGxldGVkCi10aGUgY29tcHJlc3Npb24gY3ljbGUuCi0KLQotNS4gd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHdyaXR0ZW4pCi0JanBlZ193cml0ZV9zY2FubGluZXMoLi4uKTsKLQotTm93IHdyaXRlIGFsbCB0aGUgcmVxdWlyZWQgaW1hZ2UgZGF0YSBieSBjYWxsaW5nIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkKLW9uZSBvciBtb3JlIHRpbWVzLiAgWW91IGNhbiBwYXNzIG9uZSBvciBtb3JlIHNjYW5saW5lcyBpbiBlYWNoIGNhbGwsIHVwCi10byB0aGUgdG90YWwgaW1hZ2UgaGVpZ2h0LiAgSW4gbW9zdCBhcHBsaWNhdGlvbnMgaXQgaXMgY29udmVuaWVudCB0byBwYXNzCi1qdXN0IG9uZSBvciBhIGZldyBzY2FubGluZXMgYXQgYSB0aW1lLiAgVGhlIGV4cGVjdGVkIGZvcm1hdCBmb3IgdGhlIHBhc3NlZAotZGF0YSBpcyBkaXNjdXNzZWQgdW5kZXIgIkRhdGEgZm9ybWF0cyIsIGFib3ZlLgotCi1JbWFnZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuIGluIHRvcC10by1ib3R0b20gc2NhbmxpbmUgb3JkZXIuICBUaGUgSlBFRyBzcGVjCi1jb250YWlucyBzb21lIHdlYXNlbCB3b3JkaW5nIGFib3V0IGhvdyB0b3AgYW5kIGJvdHRvbSBhcmUgYXBwbGljYXRpb24tZGVmaW5lZAotdGVybXMgKGEgY3VyaW91cyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgRW5nbGlzaCBsYW5ndWFnZS4uLikgYnV0IGlmIHlvdSB3YW50Ci15b3VyIGZpbGVzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBldmVyeW9uZSBlbHNlJ3MsIHlvdSBXSUxMIHVzZSB0b3AtdG8tYm90dG9tCi1vcmRlci4gIElmIHRoZSBzb3VyY2UgZGF0YSBtdXN0IGJlIHJlYWQgaW4gYm90dG9tLXRvLXRvcCBvcmRlciwgeW91IGNhbiB1c2UKLXRoZSBKUEVHIGxpYnJhcnkncyB2aXJ0dWFsIGFycmF5IG1lY2hhbmlzbSB0byBpbnZlcnQgdGhlIGRhdGEgZWZmaWNpZW50bHkuCi1FeGFtcGxlcyBvZiB0aGlzIGNhbiBiZSBmb3VuZCBpbiB0aGUgc2FtcGxlIGFwcGxpY2F0aW9uIGNqcGVnLgotCi1UaGUgbGlicmFyeSBtYWludGFpbnMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyB3cml0dGVuIHNvIGZhcgotaW4gdGhlIG5leHRfc2NhbmxpbmUgZmllbGQgb2YgdGhlIEpQRUcgb2JqZWN0LiAgVXN1YWxseSB5b3UgY2FuIGp1c3QgdXNlCi10aGlzIHZhcmlhYmxlIGFzIHRoZSBsb29wIGNvdW50ZXIsIHNvIHRoYXQgdGhlIGxvb3AgdGVzdCBsb29rcyBsaWtlCi0id2hpbGUgKGNpbmZvLm5leHRfc2NhbmxpbmUgPCBjaW5mby5pbWFnZV9oZWlnaHQpIi4KLQotQ29kZSBmb3IgdGhpcyBzdGVwIGRlcGVuZHMgaGVhdmlseSBvbiB0aGUgd2F5IHRoYXQgeW91IHN0b3JlIHRoZSBzb3VyY2UgZGF0YS4KLWV4YW1wbGUuYyBzaG93cyB0aGUgZm9sbG93aW5nIGNvZGUgZm9yIHRoZSBjYXNlIG9mIGEgZnVsbC1zaXplIDItRCBzb3VyY2UKLWFycmF5IGNvbnRhaW5pbmcgMy1ieXRlIFJHQiBwaXhlbHM6Ci0KLQlKU0FNUFJPVyByb3dfcG9pbnRlclsxXTsJLyogcG9pbnRlciB0byBhIHNpbmdsZSByb3cgKi8KLQlpbnQgcm93X3N0cmlkZTsJCQkvKiBwaHlzaWNhbCByb3cgd2lkdGggaW4gYnVmZmVyICovCi0KLQlyb3dfc3RyaWRlID0gaW1hZ2Vfd2lkdGggKiAzOwkvKiBKU0FNUExFcyBwZXIgcm93IGluIGltYWdlX2J1ZmZlciAqLwotCi0Jd2hpbGUgKGNpbmZvLm5leHRfc2NhbmxpbmUgPCBjaW5mby5pbWFnZV9oZWlnaHQpIHsKLQkgICAgcm93X3BvaW50ZXJbMF0gPSAmIGltYWdlX2J1ZmZlcltjaW5mby5uZXh0X3NjYW5saW5lICogcm93X3N0cmlkZV07Ci0JICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjaW5mbywgcm93X3BvaW50ZXIsIDEpOwotCX0KLQotanBlZ193cml0ZV9zY2FubGluZXMoKSByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGFjdHVhbGx5IHdyaXR0ZW4uCi1UaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBwYXNzZWQgaW4sIHNvIHlvdSBjYW4gdXN1YWxseQotaWdub3JlIHRoZSByZXR1cm4gdmFsdWUuICBJdCBpcyBkaWZmZXJlbnQgaW4ganVzdCB0d28gY2FzZXM6Ci0gICogSWYgeW91IHRyeSB0byB3cml0ZSBtb3JlIHNjYW5saW5lcyB0aGFuIHRoZSBkZWNsYXJlZCBpbWFnZSBoZWlnaHQsCi0gICAgdGhlIGFkZGl0aW9uYWwgc2NhbmxpbmVzIGFyZSBpZ25vcmVkLgotICAqIElmIHlvdSB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgZGVzdGluYXRpb24gbWFuYWdlciwgb3V0cHV0IGJ1ZmZlciBvdmVycnVuCi0gICAgd2lsbCBjYXVzZSB0aGUgY29tcHJlc3NvciB0byByZXR1cm4gYmVmb3JlIGFjY2VwdGluZyBhbGwgdGhlIHBhc3NlZCBsaW5lcy4KLSAgICBUaGlzIGZlYXR1cmUgaXMgZGlzY3Vzc2VkIHVuZGVyICJJL08gc3VzcGVuc2lvbiIsIGJlbG93LiAgVGhlIG5vcm1hbAotICAgIHN0ZGlvIGRlc3RpbmF0aW9uIG1hbmFnZXIgd2lsbCBOT1QgY2F1c2UgdGhpcyB0byBoYXBwZW4uCi1JbiBhbnkgY2FzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgY2hhbmdlIGluIHRoZSB2YWx1ZSBvZgotbmV4dF9zY2FubGluZS4KLQotCi02LiBqcGVnX2ZpbmlzaF9jb21wcmVzcyguLi4pOwotCi1BZnRlciBhbGwgdGhlIGltYWdlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiwgY2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHRvCi1jb21wbGV0ZSB0aGUgY29tcHJlc3Npb24gY3ljbGUuICBUaGlzIHN0ZXAgaXMgRVNTRU5USUFMIHRvIGVuc3VyZSB0aGF0IHRoZQotbGFzdCBidWZmZXJsb2FkIG9mIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgZGF0YSBkZXN0aW5hdGlvbi4KLWpwZWdfZmluaXNoX2NvbXByZXNzKCkgYWxzbyByZWxlYXNlcyB3b3JraW5nIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIEpQRUcKLW9iamVjdC4KLQotVHlwaWNhbCBjb2RlOgotCi0JanBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKLQotSWYgdXNpbmcgdGhlIHN0ZGlvIGRlc3RpbmF0aW9uIG1hbmFnZXIsIGRvbid0IGZvcmdldCB0byBjbG9zZSB0aGUgb3V0cHV0Ci1zdGRpbyBzdHJlYW0gKGlmIG5lY2Vzc2FyeSkgYWZ0ZXJ3YXJkcy4KLQotSWYgeW91IGhhdmUgcmVxdWVzdGVkIGEgbXVsdGktcGFzcyBvcGVyYXRpbmcgbW9kZSwgc3VjaCBhcyBIdWZmbWFuIGNvZGUKLW9wdGltaXphdGlvbiwganBlZ19maW5pc2hfY29tcHJlc3MoKSB3aWxsIHBlcmZvcm0gdGhlIGFkZGl0aW9uYWwgcGFzc2VzIHVzaW5nCi1kYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBmaXJzdCBwYXNzLiAgSW4gdGhpcyBjYXNlIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgbWF5IHRha2UKLXF1aXRlIGEgd2hpbGUgdG8gY29tcGxldGUuICBXaXRoIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMsIHRoaXMgd2lsbAotbm90IGhhcHBlbi4KLQotSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIGJlZm9yZSB3cml0aW5nIHRoZSBuZWNlc3NhcnkKLXRvdGFsIG51bWJlciBvZiBzY2FubGluZXMuICBJZiB5b3Ugd2lzaCB0byBhYm9ydCBjb21wcmVzc2lvbiwgY2FsbAotanBlZ19hYm9ydCgpIGFzIGRpc2N1c3NlZCBiZWxvdy4KLQotQWZ0ZXIgY29tcGxldGluZyBhIGNvbXByZXNzaW9uIGN5Y2xlLCB5b3UgbWF5IGRpc3Bvc2Ugb2YgdGhlIEpQRUcgb2JqZWN0Ci1hcyBkaXNjdXNzZWQgbmV4dCwgb3IgeW91IG1heSB1c2UgaXQgdG8gY29tcHJlc3MgYW5vdGhlciBpbWFnZS4gIEluIHRoYXQgY2FzZQotcmV0dXJuIHRvIHN0ZXAgMiwgMywgb3IgNCBhcyBhcHByb3ByaWF0ZS4gIElmIHlvdSBkbyBub3QgY2hhbmdlIHRoZQotZGVzdGluYXRpb24gbWFuYWdlciwgdGhlIG5ldyBkYXRhc3RyZWFtIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgc2FtZSB0YXJnZXQuCi1JZiB5b3UgZG8gbm90IGNoYW5nZSBhbnkgSlBFRyBwYXJhbWV0ZXJzLCB0aGUgbmV3IGRhdGFzdHJlYW0gd2lsbCBiZSB3cml0dGVuCi13aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgYmVmb3JlLiAgTm90ZSB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBpbnB1dCBpbWFnZQotZGltZW5zaW9ucyBmcmVlbHkgYmV0d2VlbiBjeWNsZXMsIGJ1dCBpZiB5b3UgY2hhbmdlIHRoZSBpbnB1dCBjb2xvcnNwYWNlLCB5b3UKLXNob3VsZCBjYWxsIGpwZWdfc2V0X2RlZmF1bHRzKCkgdG8gYWRqdXN0IGZvciB0aGUgbmV3IGNvbG9yc3BhY2U7IGFuZCB0aGVuCi15b3UnbGwgbmVlZCB0byByZXBlYXQgYWxsIG9mIHN0ZXAgMy4KLQotCi03LiBSZWxlYXNlIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdC4KLQotV2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LCBkZXN0cm95IGl0IGJ5IGNhbGxpbmcKLWpwZWdfZGVzdHJveV9jb21wcmVzcygpLiAgVGhpcyB3aWxsIGZyZWUgYWxsIHN1YnNpZGlhcnkgbWVtb3J5IChyZWdhcmRsZXNzIG9mCi10aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIG9iamVjdCkuICBPciB5b3UgY2FuIGNhbGwganBlZ19kZXN0cm95KCksIHdoaWNoCi13b3JrcyBmb3IgZWl0aGVyIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb2JqZWN0cyAtLS0gdGhpcyBtYXkgYmUgbW9yZQotY29udmVuaWVudCBpZiB5b3UgYXJlIHNoYXJpbmcgY29kZSBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1jYXNlcy4gIChBY3R1YWxseSwgdGhlc2Ugcm91dGluZXMgYXJlIGVxdWl2YWxlbnQgZXhjZXB0IGZvciB0aGUgZGVjbGFyZWQgdHlwZQotb2YgdGhlIHBhc3NlZCBwb2ludGVyLiAgVG8gYXZvaWQgZ3JpcGVzIGZyb20gQU5TSSBDIGNvbXBpbGVycywganBlZ19kZXN0cm95KCkKLXNob3VsZCBiZSBwYXNzZWQgYSBqX2NvbW1vbl9wdHIuKQotCi1JZiB5b3UgYWxsb2NhdGVkIHRoZSBqcGVnX2NvbXByZXNzX3N0cnVjdCBzdHJ1Y3R1cmUgZnJvbSBtYWxsb2MoKSwgZnJlZWluZwotaXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSAtLS0ganBlZ19kZXN0cm95KCkgd29uJ3QuICBEaXR0byBmb3IgdGhlIGVycm9yCi1oYW5kbGVyIHN0cnVjdHVyZS4KLQotVHlwaWNhbCBjb2RlOgotCi0JanBlZ19kZXN0cm95X2NvbXByZXNzKCZjaW5mbyk7Ci0KLQotOC4gQWJvcnRpbmcuCi0KLUlmIHlvdSBkZWNpZGUgdG8gYWJvcnQgYSBjb21wcmVzc2lvbiBjeWNsZSBiZWZvcmUgZmluaXNoaW5nLCB5b3UgY2FuIGNsZWFuIHVwCi1pbiBlaXRoZXIgb2YgdHdvIHdheXM6Ci0KLSogSWYgeW91IGRvbid0IG5lZWQgdGhlIEpQRUcgb2JqZWN0IGFueSBtb3JlLCBqdXN0IGNhbGwKLSAganBlZ19kZXN0cm95X2NvbXByZXNzKCkgb3IganBlZ19kZXN0cm95KCkgdG8gcmVsZWFzZSBtZW1vcnkuICBUaGlzIGlzCi0gIGxlZ2l0aW1hdGUgYXQgYW55IHBvaW50IGFmdGVyIGNhbGxpbmcganBlZ19jcmVhdGVfY29tcHJlc3MoKSAtLS0gaW4gZmFjdCwKLSAgaXQncyBzYWZlIGV2ZW4gaWYganBlZ19jcmVhdGVfY29tcHJlc3MoKSBmYWlscy4KLQotKiBJZiB5b3Ugd2FudCB0byByZS11c2UgdGhlIEpQRUcgb2JqZWN0LCBjYWxsIGpwZWdfYWJvcnRfY29tcHJlc3MoKSwgb3IgY2FsbAotICBqcGVnX2Fib3J0KCkgd2hpY2ggd29ya3Mgb24gYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvYmplY3RzLgotICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBvYmplY3QgdG8gYW4gaWRsZSBzdGF0ZSwgcmVsZWFzaW5nIGFueSB3b3JraW5nIG1lbW9yeS4KLSAganBlZ19hYm9ydCgpIGlzIGFsbG93ZWQgYXQgYW55IHRpbWUgYWZ0ZXIgc3VjY2Vzc2Z1bCBvYmplY3QgY3JlYXRpb24uCi0KLU5vdGUgdGhhdCBjbGVhbmluZyB1cCB0aGUgZGF0YSBkZXN0aW5hdGlvbiwgaWYgcmVxdWlyZWQsIGlzIHlvdXIKLXJlc3BvbnNpYmlsaXR5OyBuZWl0aGVyIG9mIHRoZXNlIHJvdXRpbmVzIHdpbGwgY2FsbCB0ZXJtX2Rlc3RpbmF0aW9uKCkuCi0oU2VlICJDb21wcmVzc2VkIGRhdGEgaGFuZGxpbmciLCBiZWxvdywgZm9yIG1vcmUgYWJvdXQgdGhhdC4pCi0KLWpwZWdfZGVzdHJveSgpIGFuZCBqcGVnX2Fib3J0KCkgYXJlIHRoZSBvbmx5IHNhZmUgY2FsbHMgdG8gbWFrZSBvbiBhIEpQRUcKLW9iamVjdCB0aGF0IGhhcyByZXBvcnRlZCBhbiBlcnJvciBieSBjYWxsaW5nIGVycm9yX2V4aXQgKHNlZSAiRXJyb3IgaGFuZGxpbmciCi1mb3IgbW9yZSBpbmZvKS4gIFRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBzdWNoIGFuIG9iamVjdCBpcyBsaWtlbHkgdG8gYmUgb3V0IG9mCi13aGFjay4gIEVpdGhlciBvZiB0aGVzZSB0d28gcm91dGluZXMgd2lsbCByZXR1cm4gdGhlIG9iamVjdCB0byBhIGtub3duIHN0YXRlLgotCi0KLURlY29tcHJlc3Npb24gZGV0YWlscwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhlcmUgd2UgcmV2aXNpdCB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG91dGxpbmUgZ2l2ZW4gaW4gdGhlIG92ZXJ2aWV3LgotCi0xLiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuCi0KLVRoaXMgaXMganVzdCBsaWtlIGluaXRpYWxpemF0aW9uIGZvciBjb21wcmVzc2lvbiwgYXMgZGlzY3Vzc2VkIGFib3ZlLAotZXhjZXB0IHRoYXQgdGhlIG9iamVjdCBpcyBhICJzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCIgYW5kIHlvdQotY2FsbCBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCkuICBFcnJvciBoYW5kbGluZyBpcyBleGFjdGx5IHRoZSBzYW1lLgotCi1UeXBpY2FsIGNvZGU6Ci0KLQlzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKLQlzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKLQkuLi4KLQljaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7Ci0JanBlZ19jcmVhdGVfZGVjb21wcmVzcygmY2luZm8pOwotCi0oQm90aCBoZXJlIGFuZCBpbiB0aGUgSUpHIGNvZGUsIHdlIHVzdWFsbHkgdXNlIHZhcmlhYmxlIG5hbWUgImNpbmZvIiBmb3IKLWJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb2JqZWN0cy4pCi0KLQotMi4gU3BlY2lmeSB0aGUgc291cmNlIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgKGVnLCBhIGZpbGUpLgotCi1BcyBwcmV2aW91c2x5IG1lbnRpb25lZCwgdGhlIEpQRUcgbGlicmFyeSByZWFkcyBjb21wcmVzc2VkIGRhdGEgZnJvbSBhICJkYXRhCi1zb3VyY2UiIG1vZHVsZS4gIFRoZSBsaWJyYXJ5IGluY2x1ZGVzIG9uZSBkYXRhIHNvdXJjZSBtb2R1bGUgd2hpY2gga25vd3MgaG93Ci10byByZWFkIGZyb20gYSBzdGRpbyBzdHJlYW0uICBZb3UgY2FuIHVzZSB5b3VyIG93biBzb3VyY2UgbW9kdWxlIGlmIHlvdSB3YW50Ci10byBkbyBzb21ldGhpbmcgZWxzZSwgYXMgZGlzY3Vzc2VkIGxhdGVyLgotCi1JZiB5b3UgdXNlIHRoZSBzdGFuZGFyZCBzb3VyY2UgbW9kdWxlLCB5b3UgbXVzdCBvcGVuIHRoZSBzb3VyY2Ugc3RkaW8gc3RyZWFtCi1iZWZvcmVoYW5kLiAgVHlwaWNhbCBjb2RlIGZvciB0aGlzIHN0ZXAgbG9va3MgbGlrZToKLQotCUZJTEUgKiBpbmZpbGU7Ci0JLi4uCi0JaWYgKChpbmZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpID09IE5VTEwpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7Ci0JICAgIGV4aXQoMSk7Ci0JfQotCWpwZWdfc3RkaW9fc3JjKCZjaW5mbywgaW5maWxlKTsKLQotd2hlcmUgdGhlIGxhc3QgbGluZSBpbnZva2VzIHRoZSBzdGFuZGFyZCBzb3VyY2UgbW9kdWxlLgotCi1XQVJOSU5HOiBpdCBpcyBjcml0aWNhbCB0aGF0IHRoZSBiaW5hcnkgY29tcHJlc3NlZCBkYXRhIGJlIHJlYWQgdW5jaGFuZ2VkLgotT24gbm9uLVVuaXggc3lzdGVtcyB0aGUgc3RkaW8gbGlicmFyeSBtYXkgcGVyZm9ybSBuZXdsaW5lIHRyYW5zbGF0aW9uIG9yCi1vdGhlcndpc2UgY29ycnVwdCBiaW5hcnkgZGF0YS4gIFRvIHN1cHByZXNzIHRoaXMgYmVoYXZpb3IsIHlvdSBtYXkgbmVlZCB0byB1c2UKLWEgImIiIG9wdGlvbiB0byBmb3BlbiAoYXMgc2hvd24gYWJvdmUpLCBvciB1c2Ugc2V0bW9kZSgpIG9yIGFub3RoZXIgcm91dGluZSB0bwotcHV0IHRoZSBzdGRpbyBzdHJlYW0gaW4gYmluYXJ5IG1vZGUuICBTZWUgY2pwZWcuYyBhbmQgZGpwZWcuYyBmb3IgY29kZSB0aGF0Ci1oYXMgYmVlbiBmb3VuZCB0byB3b3JrIG9uIG1hbnkgc3lzdGVtcy4KLQotWW91IG1heSBub3QgY2hhbmdlIHRoZSBkYXRhIHNvdXJjZSBiZXR3ZWVuIGNhbGxpbmcganBlZ19yZWFkX2hlYWRlcigpIGFuZAotanBlZ19maW5pc2hfZGVjb21wcmVzcygpLiAgSWYgeW91IHdpc2ggdG8gcmVhZCBhIHNlcmllcyBvZiBKUEVHIGltYWdlcyBmcm9tCi1hIHNpbmdsZSBzb3VyY2UgZmlsZSwgeW91IHNob3VsZCByZXBlYXQgdGhlIGpwZWdfcmVhZF9oZWFkZXIoKSB0bwotanBlZ19maW5pc2hfZGVjb21wcmVzcygpIHNlcXVlbmNlIHdpdGhvdXQgcmVpbml0aWFsaXppbmcgZWl0aGVyIHRoZSBKUEVHCi1vYmplY3Qgb3IgdGhlIGRhdGEgc291cmNlIG1vZHVsZTsgdGhpcyBwcmV2ZW50cyBidWZmZXJlZCBpbnB1dCBkYXRhIGZyb20KLWJlaW5nIGRpc2NhcmRlZC4KLQotCi0zLiBDYWxsIGpwZWdfcmVhZF9oZWFkZXIoKSB0byBvYnRhaW4gaW1hZ2UgaW5mby4KLQotVHlwaWNhbCBjb2RlIGZvciB0aGlzIHN0ZXAgaXMganVzdAotCi0JanBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOwotCi1UaGlzIHdpbGwgcmVhZCB0aGUgc291cmNlIGRhdGFzdHJlYW0gaGVhZGVyIG1hcmtlcnMsIHVwIHRvIHRoZSBiZWdpbm5pbmcKLW9mIHRoZSBjb21wcmVzc2VkIGRhdGEgcHJvcGVyLiAgT24gcmV0dXJuLCB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhbmQgb3RoZXIKLWluZm8gaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgSlBFRyBvYmplY3QuICBUaGUgYXBwbGljYXRpb24gbWF5IHdpc2ggdG8KLWNvbnN1bHQgdGhpcyBpbmZvcm1hdGlvbiBiZWZvcmUgc2VsZWN0aW5nIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4KLQotTW9yZSBjb21wbGV4IGNvZGUgaXMgbmVjZXNzYXJ5IGlmCi0gICogQSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQgLS0tIGluIHRoYXQgY2FzZSBqcGVnX3JlYWRfaGVhZGVyKCkKLSAgICBtYXkgcmV0dXJuIGJlZm9yZSBpdCBoYXMgcmVhZCBhbGwgdGhlIGhlYWRlciBkYXRhLiAgU2VlICJJL08gc3VzcGVuc2lvbiIsCi0gICAgYmVsb3cuICBUaGUgbm9ybWFsIHN0ZGlvIHNvdXJjZSBtYW5hZ2VyIHdpbGwgTk9UIGNhdXNlIHRoaXMgdG8gaGFwcGVuLgotICAqIEFiYnJldmlhdGVkIEpQRUcgZmlsZXMgYXJlIHRvIGJlIHByb2Nlc3NlZCAtLS0gc2VlIHRoZSBzZWN0aW9uIG9uCi0gICAgYWJicmV2aWF0ZWQgZGF0YXN0cmVhbXMuICBTdGFuZGFyZCBhcHBsaWNhdGlvbnMgdGhhdCBkZWFsIG9ubHkgaW4KLSAgICBpbnRlcmNoYW5nZSBKUEVHIGZpbGVzIG5lZWQgbm90IGJlIGNvbmNlcm5lZCB3aXRoIHRoaXMgY2FzZSBlaXRoZXIuCi0KLUl0IGlzIHBlcm1pc3NpYmxlIHRvIHN0b3AgYXQgdGhpcyBwb2ludCBpZiB5b3UganVzdCB3YW50ZWQgdG8gZmluZCBvdXQgdGhlCi1pbWFnZSBkaW1lbnNpb25zIGFuZCBvdGhlciBoZWFkZXIgaW5mbyBmb3IgYSBKUEVHIGZpbGUuICBJbiB0aGF0IGNhc2UsCi1jYWxsIGpwZWdfZGVzdHJveSgpIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhlIEpQRUcgb2JqZWN0LCBvciBjYWxsCi1qcGVnX2Fib3J0KCkgdG8gcmV0dXJuIGl0IHRvIGFuIGlkbGUgc3RhdGUgYmVmb3JlIHNlbGVjdGluZyBhIG5ldyBkYXRhCi1zb3VyY2UgYW5kIHJlYWRpbmcgYW5vdGhlciBoZWFkZXIuCi0KLQotNC4gU2V0IHBhcmFtZXRlcnMgZm9yIGRlY29tcHJlc3Npb24uCi0KLWpwZWdfcmVhZF9oZWFkZXIoKSBzZXRzIGFwcHJvcHJpYXRlIGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJhc2VkIG9uCi10aGUgcHJvcGVydGllcyBvZiB0aGUgaW1hZ2UgKGluIHBhcnRpY3VsYXIsIGl0cyBjb2xvcnNwYWNlKS4gIEhvd2V2ZXIsIHlvdQotbWF5IHdlbGwgd2FudCB0byBhbHRlciB0aGVzZSBkZWZhdWx0cyBiZWZvcmUgYmVnaW5uaW5nIHRoZSBkZWNvbXByZXNzaW9uLgotRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IGlzIHRvIHByb2R1Y2UgZnVsbCBjb2xvciBvdXRwdXQgZnJvbSBhIGNvbG9yIGZpbGUuCi1JZiB5b3Ugd2FudCBjb2xvcm1hcHBlZCBvdXRwdXQgeW91IG11c3QgYXNrIGZvciBpdC4gIE90aGVyIG9wdGlvbnMgYWxsb3cgdGhlCi1yZXR1cm5lZCBpbWFnZSB0byBiZSBzY2FsZWQgYW5kIGFsbG93IHZhcmlvdXMgc3BlZWQvcXVhbGl0eSB0cmFkZW9mZnMgdG8gYmUKLXNlbGVjdGVkLiAgIkRlY29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbiIsIGJlbG93LCBnaXZlcyBkZXRhaWxzLgotCi1JZiB0aGUgZGVmYXVsdHMgYXJlIGFwcHJvcHJpYXRlLCBub3RoaW5nIG5lZWQgYmUgZG9uZSBhdCB0aGlzIHN0ZXAuCi0KLU5vdGUgdGhhdCBhbGwgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCBieSBlYWNoIGNhbGwgdG8ganBlZ19yZWFkX2hlYWRlcigpLgotSWYgeW91IHJldXNlIGEgZGVjb21wcmVzc2lvbiBvYmplY3QsIHlvdSBjYW5ub3QgZXhwZWN0IHlvdXIgcGFyYW1ldGVyCi1zZXR0aW5ncyB0byBiZSBwcmVzZXJ2ZWQgYWNyb3NzIGN5Y2xlcywgYXMgeW91IGNhbiBmb3IgY29tcHJlc3Npb24uCi1Zb3UgbXVzdCBzZXQgZGVzaXJlZCBwYXJhbWV0ZXIgdmFsdWVzIGVhY2ggdGltZS4KLQotCi01LiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoLi4uKTsKLQotT25jZSB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcmUgc2F0aXNmYWN0b3J5LCBjYWxsIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHRvCi1iZWdpbiBkZWNvbXByZXNzaW9uLiAgVGhpcyB3aWxsIGluaXRpYWxpemUgaW50ZXJuYWwgc3RhdGUsIGFsbG9jYXRlIHdvcmtpbmcKLW1lbW9yeSwgYW5kIHByZXBhcmUgZm9yIHJldHVybmluZyBkYXRhLgotCi1UeXBpY2FsIGNvZGUgaXMganVzdAotCi0JanBlZ19zdGFydF9kZWNvbXByZXNzKCZjaW5mbyk7Ci0KLUlmIHlvdSBoYXZlIHJlcXVlc3RlZCBhIG11bHRpLXBhc3Mgb3BlcmF0aW5nIG1vZGUsIHN1Y2ggYXMgMi1wYXNzIGNvbG9yCi1xdWFudGl6YXRpb24sIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHdpbGwgZG8gZXZlcnl0aGluZyBuZWVkZWQgYmVmb3JlIGRhdGEKLW91dHB1dCBjYW4gYmVnaW4uICBJbiB0aGlzIGNhc2UganBlZ19zdGFydF9kZWNvbXByZXNzKCkgbWF5IHRha2UgcXVpdGUgYSB3aGlsZQotdG8gY29tcGxldGUuICBXaXRoIGEgc2luZ2xlLXNjYW4gKG5vbiBwcm9ncmVzc2l2ZSkgSlBFRyBmaWxlIGFuZCBkZWZhdWx0Ci1kZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMsIHRoaXMgd2lsbCBub3QgaGFwcGVuOyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSB3aWxsCi1yZXR1cm4gcXVpY2tseS4KLQotQWZ0ZXIgdGhpcyBjYWxsLCB0aGUgZmluYWwgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMsIGluY2x1ZGluZyBhbnkgcmVxdWVzdGVkCi1zY2FsaW5nLCBhcmUgYXZhaWxhYmxlIGluIHRoZSBKUEVHIG9iamVjdDsgc28gaXMgdGhlIHNlbGVjdGVkIGNvbG9ybWFwLCBpZgotY29sb3JtYXBwZWQgb3V0cHV0IGhhcyBiZWVuIHJlcXVlc3RlZC4gIFVzZWZ1bCBmaWVsZHMgaW5jbHVkZQotCi0Jb3V0cHV0X3dpZHRoCQlpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0LCBhcyBzY2FsZWQKLQlvdXRwdXRfaGVpZ2h0Ci0Jb3V0X2NvbG9yX2NvbXBvbmVudHMJIyBvZiBjb2xvciBjb21wb25lbnRzIGluIG91dF9jb2xvcl9zcGFjZQotCW91dHB1dF9jb21wb25lbnRzCSMgb2YgY29sb3IgY29tcG9uZW50cyByZXR1cm5lZCBwZXIgcGl4ZWwKLQljb2xvcm1hcAkJdGhlIHNlbGVjdGVkIGNvbG9ybWFwLCBpZiBhbnkKLQlhY3R1YWxfbnVtYmVyX29mX2NvbG9ycwkJbnVtYmVyIG9mIGVudHJpZXMgaW4gY29sb3JtYXAKLQotb3V0cHV0X2NvbXBvbmVudHMgaXMgMSAoYSBjb2xvcm1hcCBpbmRleCkgd2hlbiBxdWFudGl6aW5nIGNvbG9yczsgb3RoZXJ3aXNlIGl0Ci1lcXVhbHMgb3V0X2NvbG9yX2NvbXBvbmVudHMuICBJdCBpcyB0aGUgbnVtYmVyIG9mIEpTQU1QTEUgdmFsdWVzIHRoYXQgd2lsbCBiZQotZW1pdHRlZCBwZXIgcGl4ZWwgaW4gdGhlIG91dHB1dCBhcnJheXMuCi0KLVR5cGljYWxseSB5b3Ugd2lsbCBuZWVkIHRvIGFsbG9jYXRlIGRhdGEgYnVmZmVycyB0byBob2xkIHRoZSBpbmNvbWluZyBpbWFnZS4KLVlvdSB3aWxsIG5lZWQgb3V0cHV0X3dpZHRoICogb3V0cHV0X2NvbXBvbmVudHMgSlNBTVBMRXMgcGVyIHNjYW5saW5lIGluIHlvdXIKLW91dHB1dCBidWZmZXIsIGFuZCBhIHRvdGFsIG9mIG91dHB1dF9oZWlnaHQgc2NhbmxpbmVzIHdpbGwgYmUgcmV0dXJuZWQuCi0KLU5vdGU6IGlmIHlvdSBhcmUgdXNpbmcgdGhlIEpQRUcgbGlicmFyeSdzIGludGVybmFsIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlCi1kYXRhIGJ1ZmZlcnMgKGFzIGRqcGVnIGRvZXMpLCB0aGVuIHRoZSBtYW5hZ2VyJ3MgcHJvdG9jb2wgcmVxdWlyZXMgdGhhdCB5b3UKLXJlcXVlc3QgbGFyZ2UgYnVmZmVycyAqYmVmb3JlKiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgVGhpcyBpcyBhCi1saXR0bGUgdHJpY2t5IHNpbmNlIHRoZSBvdXRwdXRfWFhYIGZpZWxkcyBhcmUgbm90IG5vcm1hbGx5IHZhbGlkIHRoZW4uICBZb3UKLWNhbiBtYWtlIHRoZW0gdmFsaWQgYnkgY2FsbGluZyBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKSBhZnRlciBzZXR0aW5nIHRoZQotcmVsZXZhbnQgcGFyYW1ldGVycyAoc2NhbGluZywgb3V0cHV0IGNvbG9yIHNwYWNlLCBhbmQgcXVhbnRpemF0aW9uIGZsYWcpLgotCi0KLTYuIHdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSByZWFkKQotCWpwZWdfcmVhZF9zY2FubGluZXMoLi4uKTsKLQotTm93IHlvdSBjYW4gcmVhZCB0aGUgZGVjb21wcmVzc2VkIGltYWdlIGRhdGEgYnkgY2FsbGluZyBqcGVnX3JlYWRfc2NhbmxpbmVzKCkKLW9uZSBvciBtb3JlIHRpbWVzLiAgQXQgZWFjaCBjYWxsLCB5b3UgcGFzcyBpbiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2NhbmxpbmVzCi10byBiZSByZWFkIChpZSwgdGhlIGhlaWdodCBvZiB5b3VyIHdvcmtpbmcgYnVmZmVyKTsganBlZ19yZWFkX3NjYW5saW5lcygpCi13aWxsIHJldHVybiB1cCB0byB0aGF0IG1hbnkgbGluZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgbGluZXMKLWFjdHVhbGx5IHJlYWQuICBUaGUgZm9ybWF0IG9mIHRoZSByZXR1cm5lZCBkYXRhIGlzIGRpc2N1c3NlZCB1bmRlciAiRGF0YQotZm9ybWF0cyIsIGFib3ZlLiAgRG9uJ3QgZm9yZ2V0IHRoYXQgZ3JheXNjYWxlIGFuZCBjb2xvciBKUEVHcyB3aWxsIHJldHVybgotZGlmZmVyZW50IGRhdGEgZm9ybWF0cyEKLQotSW1hZ2UgZGF0YSBpcyByZXR1cm5lZCBpbiB0b3AtdG8tYm90dG9tIHNjYW5saW5lIG9yZGVyLiAgSWYgeW91IG11c3Qgd3JpdGUKLW91dCB0aGUgaW1hZ2UgaW4gYm90dG9tLXRvLXRvcCBvcmRlciwgeW91IGNhbiB1c2UgdGhlIEpQRUcgbGlicmFyeSdzIHZpcnR1YWwKLWFycmF5IG1lY2hhbmlzbSB0byBpbnZlcnQgdGhlIGRhdGEgZWZmaWNpZW50bHkuICBFeGFtcGxlcyBvZiB0aGlzIGNhbiBiZQotZm91bmQgaW4gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBkanBlZy4KLQotVGhlIGxpYnJhcnkgbWFpbnRhaW5zIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBzY2FubGluZXMgcmV0dXJuZWQgc28gZmFyCi1pbiB0aGUgb3V0cHV0X3NjYW5saW5lIGZpZWxkIG9mIHRoZSBKUEVHIG9iamVjdC4gIFVzdWFsbHkgeW91IGNhbiBqdXN0IHVzZQotdGhpcyB2YXJpYWJsZSBhcyB0aGUgbG9vcCBjb3VudGVyLCBzbyB0aGF0IHRoZSBsb29wIHRlc3QgbG9va3MgbGlrZQotIndoaWxlIChjaW5mby5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby5vdXRwdXRfaGVpZ2h0KSIuICAoTm90ZSB0aGF0IHRoZSB0ZXN0Ci1zaG91bGQgTk9UIGJlIGFnYWluc3QgaW1hZ2VfaGVpZ2h0LCB1bmxlc3MgeW91IG5ldmVyIHVzZSBzY2FsaW5nLiAgVGhlCi1pbWFnZV9oZWlnaHQgZmllbGQgaXMgdGhlIGhlaWdodCBvZiB0aGUgb3JpZ2luYWwgdW5zY2FsZWQgaW1hZ2UuKQotVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgZXF1YWxzIHRoZSBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIG91dHB1dF9zY2FubGluZS4KLQotSWYgeW91IGRvbid0IHVzZSBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UsIGl0IGlzIHNhZmUgdG8gYXNzdW1lIHRoYXQKLWpwZWdfcmVhZF9zY2FubGluZXMoKSByZWFkcyBhdCBsZWFzdCBvbmUgc2NhbmxpbmUgcGVyIGNhbGwsIHVudGlsIHRoZQotYm90dG9tIG9mIHRoZSBpbWFnZSBoYXMgYmVlbiByZWFjaGVkLgotCi1JZiB5b3UgdXNlIGEgYnVmZmVyIGxhcmdlciB0aGFuIG9uZSBzY2FubGluZSwgaXQgaXMgTk9UIHNhZmUgdG8gYXNzdW1lIHRoYXQKLWpwZWdfcmVhZF9zY2FubGluZXMoKSBmaWxscyBpdC4gIChUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG9ubHkgYQotZmV3IHNjYW5saW5lcyBwZXIgY2FsbCwgbm8gbWF0dGVyIGhvdyBsYXJnZSBhIGJ1ZmZlciB5b3UgcGFzcy4pICBTbyB5b3UgbXVzdAotYWx3YXlzIHByb3ZpZGUgYSBsb29wIHRoYXQgY2FsbHMganBlZ19yZWFkX3NjYW5saW5lcygpIHJlcGVhdGVkbHkgdW50aWwgdGhlCi13aG9sZSBpbWFnZSBoYXMgYmVlbiByZWFkLgotCi0KLTcuIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoLi4uKTsKLQotQWZ0ZXIgYWxsIHRoZSBpbWFnZSBkYXRhIGhhcyBiZWVuIHJlYWQsIGNhbGwganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHRvCi1jb21wbGV0ZSB0aGUgZGVjb21wcmVzc2lvbiBjeWNsZS4gIFRoaXMgY2F1c2VzIHdvcmtpbmcgbWVtb3J5IGFzc29jaWF0ZWQKLXdpdGggdGhlIEpQRUcgb2JqZWN0IHRvIGJlIHJlbGVhc2VkLgotCi1UeXBpY2FsIGNvZGU6Ci0KLQlqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCZjaW5mbyk7Ci0KLUlmIHVzaW5nIHRoZSBzdGRpbyBzb3VyY2UgbWFuYWdlciwgZG9uJ3QgZm9yZ2V0IHRvIGNsb3NlIHRoZSBzb3VyY2Ugc3RkaW8KLXN0cmVhbSBpZiBuZWNlc3NhcnkuCi0KLUl0IGlzIGFuIGVycm9yIHRvIGNhbGwganBlZ19maW5pc2hfZGVjb21wcmVzcygpIGJlZm9yZSByZWFkaW5nIHRoZSBjb3JyZWN0Ci10b3RhbCBudW1iZXIgb2Ygc2NhbmxpbmVzLiAgSWYgeW91IHdpc2ggdG8gYWJvcnQgZGVjb21wcmVzc2lvbiwgY2FsbAotanBlZ19hYm9ydCgpIGFzIGRpc2N1c3NlZCBiZWxvdy4KLQotQWZ0ZXIgY29tcGxldGluZyBhIGRlY29tcHJlc3Npb24gY3ljbGUsIHlvdSBtYXkgZGlzcG9zZSBvZiB0aGUgSlBFRyBvYmplY3QgYXMKLWRpc2N1c3NlZCBuZXh0LCBvciB5b3UgbWF5IHVzZSBpdCB0byBkZWNvbXByZXNzIGFub3RoZXIgaW1hZ2UuICBJbiB0aGF0IGNhc2UKLXJldHVybiB0byBzdGVwIDIgb3IgMyBhcyBhcHByb3ByaWF0ZS4gIElmIHlvdSBkbyBub3QgY2hhbmdlIHRoZSBzb3VyY2UKLW1hbmFnZXIsIHRoZSBuZXh0IGltYWdlIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSBzYW1lIHNvdXJjZS4KLQotCi04LiBSZWxlYXNlIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0LgotCi1XaGVuIHlvdSBhcmUgZG9uZSB3aXRoIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCwgZGVzdHJveSBpdCBieSBjYWxsaW5nCi1qcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygpIG9yIGpwZWdfZGVzdHJveSgpLiAgVGhlIHByZXZpb3VzIGRpc2N1c3Npb24gb2YKLWRlc3Ryb3lpbmcgY29tcHJlc3Npb24gb2JqZWN0cyBhcHBsaWVzIGhlcmUgdG9vLgotCi1UeXBpY2FsIGNvZGU6Ci0KLQlqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotCi0KLTkuIEFib3J0aW5nLgotCi1Zb3UgY2FuIGFib3J0IGEgZGVjb21wcmVzc2lvbiBjeWNsZSBieSBjYWxsaW5nIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCkgb3IKLWpwZWdfZGVzdHJveSgpIGlmIHlvdSBkb24ndCBuZWVkIHRoZSBKUEVHIG9iamVjdCBhbnkgbW9yZSwgb3IKLWpwZWdfYWJvcnRfZGVjb21wcmVzcygpIG9yIGpwZWdfYWJvcnQoKSBpZiB5b3Ugd2FudCB0byByZXVzZSB0aGUgb2JqZWN0LgotVGhlIHByZXZpb3VzIGRpc2N1c3Npb24gb2YgYWJvcnRpbmcgY29tcHJlc3Npb24gY3ljbGVzIGFwcGxpZXMgaGVyZSB0b28uCi0KLQotTWVjaGFuaWNzIG9mIHVzYWdlOiBpbmNsdWRlIGZpbGVzLCBsaW5raW5nLCBldGMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUFwcGxpY2F0aW9ucyB1c2luZyB0aGUgSlBFRyBsaWJyYXJ5IHNob3VsZCBpbmNsdWRlIHRoZSBoZWFkZXIgZmlsZSBqcGVnbGliLmgKLXRvIG9idGFpbiBkZWNsYXJhdGlvbnMgb2YgZGF0YSB0eXBlcyBhbmQgcm91dGluZXMuICBCZWZvcmUgaW5jbHVkaW5nCi1qcGVnbGliLmgsIGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMgdGhhdCBkZWZpbmUgYXQgbGVhc3QgdGhlIHR5cGVkZWZzIEZJTEUgYW5kCi1zaXplX3QuICBPbiBBTlNJLWNvbmZvcm1pbmcgc3lzdGVtcywgaW5jbHVkaW5nIDxzdGRpby5oPiBpcyBzdWZmaWNpZW50OyBvbgotb2xkZXIgVW5peCBzeXN0ZW1zLCB5b3UgbWF5IG5lZWQgPHN5cy90eXBlcy5oPiB0byBkZWZpbmUgc2l6ZV90LgotCi1JZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8gcmVmZXIgdG8gaW5kaXZpZHVhbCBKUEVHIGxpYnJhcnkgZXJyb3IgY29kZXMsIGFsc28KLWluY2x1ZGUgamVycm9yLmggdG8gZGVmaW5lIHRob3NlIHN5bWJvbHMuCi0KLWpwZWdsaWIuaCBpbmRpcmVjdGx5IGluY2x1ZGVzIHRoZSBmaWxlcyBqY29uZmlnLmggYW5kIGptb3JlY2ZnLmguICBJZiB5b3UgYXJlCi1pbnN0YWxsaW5nIHRoZSBKUEVHIGhlYWRlciBmaWxlcyBpbiBhIHN5c3RlbSBkaXJlY3RvcnksIHlvdSB3aWxsIHdhbnQgdG8KLWluc3RhbGwgYWxsIGZvdXIgZmlsZXM6IGpwZWdsaWIuaCwgamVycm9yLmgsIGpjb25maWcuaCwgam1vcmVjZmcuaC4KLQotVGhlIG1vc3QgY29udmVuaWVudCB3YXkgdG8gaW5jbHVkZSB0aGUgSlBFRyBjb2RlIGludG8geW91ciBleGVjdXRhYmxlIHByb2dyYW0KLWlzIHRvIHByZXBhcmUgYSBsaWJyYXJ5IGZpbGUgKCJsaWJqcGVnLmEiLCBvciBhIGNvcnJlc3BvbmRpbmcgbmFtZSBvbiBub24tVW5peAotbWFjaGluZXMpIGFuZCByZWZlcmVuY2UgaXQgYXQgeW91ciBsaW5rIHN0ZXAuICBJZiB5b3UgdXNlIG9ubHkgaGFsZiBvZiB0aGUKLWxpYnJhcnkgKG9ubHkgY29tcHJlc3Npb24gb3Igb25seSBkZWNvbXByZXNzaW9uKSwgb25seSB0aGF0IG11Y2ggY29kZSB3aWxsIGJlCi1pbmNsdWRlZCBmcm9tIHRoZSBsaWJyYXJ5LCB1bmxlc3MgeW91ciBsaW5rZXIgaXMgaG9wZWxlc3NseSBicmFpbi1kYW1hZ2VkLgotVGhlIHN1cHBsaWVkIG1ha2VmaWxlcyBidWlsZCBsaWJqcGVnLmEgYXV0b21hdGljYWxseSAoc2VlIGluc3RhbGwuZG9jKS4KLQotV2hpbGUgeW91IGNhbiBidWlsZCB0aGUgSlBFRyBsaWJyYXJ5IGFzIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIHdoaW0gc3RyaWtlcwoteW91LCB3ZSBkb24ndCByZWFsbHkgcmVjb21tZW5kIGl0LiAgVGhlIHRyb3VibGUgd2l0aCBzaGFyZWQgbGlicmFyaWVzIGlzIHRoYXQKLWF0IHNvbWUgcG9pbnQgeW91J2xsIHByb2JhYmx5IHRyeSB0byBzdWJzdGl0dXRlIGEgbmV3IHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKLXdpdGhvdXQgcmVjb21waWxpbmcgdGhlIGNhbGxpbmcgYXBwbGljYXRpb25zLiAgVGhhdCBnZW5lcmFsbHkgZG9lc24ndCB3b3JrCi1iZWNhdXNlIHRoZSBwYXJhbWV0ZXIgc3RydWN0IGRlY2xhcmF0aW9ucyB1c3VhbGx5IGNoYW5nZSB3aXRoIGVhY2ggbmV3Ci12ZXJzaW9uLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBsaWJyYXJ5J3MgQVBJIGlzICpub3QqIGd1YXJhbnRlZWQgYmluYXJ5Ci1jb21wYXRpYmxlIGFjcm9zcyB2ZXJzaW9uczsgd2Ugb25seSB0cnkgdG8gZW5zdXJlIHNvdXJjZS1jb2RlIGNvbXBhdGliaWxpdHkuCi0oSW4gaGluZHNpZ2h0LCBpdCBtaWdodCBoYXZlIGJlZW4gc21hcnRlciB0byBoaWRlIHRoZSBwYXJhbWV0ZXIgc3RydWN0cyBmcm9tCi1hcHBsaWNhdGlvbnMgYW5kIGludHJvZHVjZSBhIHRvbiBvZiBhY2Nlc3MgZnVuY3Rpb25zIGluc3RlYWQuICBUb28gbGF0ZSBub3csCi1ob3dldmVyLikKLQotT24gc29tZSBzeXN0ZW1zIHlvdXIgYXBwbGljYXRpb24gbWF5IG5lZWQgdG8gc2V0IHVwIGEgc2lnbmFsIGhhbmRsZXIgdG8gZW5zdXJlCi10aGF0IHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcnJ1cHRlZC4gIFRoaXMgaXMgbW9zdAotY3JpdGljYWwgaWYgeW91IGFyZSBvbiBNUy1ET1MgYW5kIHVzZSB0aGUgam1lbWRvcy5jIG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kOwotaXQgd2lsbCB0cnkgdG8gZ3JhYiBleHRlbmRlZCBtZW1vcnkgZm9yIHRlbXAgZmlsZXMsIGFuZCB0aGF0IHNwYWNlIHdpbGwgTk9UIGJlCi1mcmVlZCBhdXRvbWF0aWNhbGx5LiAgU2VlIGNqcGVnLmMgb3IgZGpwZWcuYyBmb3IgYW4gZXhhbXBsZSBzaWduYWwgaGFuZGxlci4KLQotSXQgbWF5IGJlIHdvcnRoIHBvaW50aW5nIG91dCB0aGF0IHRoZSBjb3JlIEpQRUcgbGlicmFyeSBkb2VzIG5vdCBhY3R1YWxseQotcmVxdWlyZSB0aGUgc3RkaW8gbGlicmFyeTogb25seSB0aGUgZGVmYXVsdCBzb3VyY2UvZGVzdGluYXRpb24gbWFuYWdlcnMgYW5kCi1lcnJvciBoYW5kbGVyIG5lZWQgaXQuICBZb3UgY2FuIHVzZSB0aGUgbGlicmFyeSBpbiBhIHN0ZGlvLWxlc3MgZW52aXJvbm1lbnQKLWlmIHlvdSByZXBsYWNlIHRob3NlIG1vZHVsZXMgYW5kIHVzZSBqbWVtbm9icy5jIChvciBhbm90aGVyIG1lbW9yeSBtYW5hZ2VyIG9mCi15b3VyIG93biBkZXZpc2luZykuICBNb3JlIGluZm8gYWJvdXQgdGhlIG1pbmltdW0gc3lzdGVtIGxpYnJhcnkgcmVxdWlyZW1lbnRzCi1tYXkgYmUgZm91bmQgaW4gamluY2x1ZGUuaC4KLQotCi1BRFZBTkNFRCBGRUFUVVJFUwotPT09PT09PT09PT09PT09PT0KLQotQ29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGFsbCB0aGUgb3B0aW9uYWwgcGFyYW1ldGVycyB5b3UgY2FuIHNldCBmb3IgSlBFRwotY29tcHJlc3Npb24sIGFzIHdlbGwgYXMgdGhlICJoZWxwZXIiIHJvdXRpbmVzIHByb3ZpZGVkIHRvIGFzc2lzdCBpbiB0aGlzCi10YXNrLiAgUHJvcGVyIHNldHRpbmcgb2Ygc29tZSBwYXJhbWV0ZXJzIHJlcXVpcmVzIGRldGFpbGVkIHVuZGVyc3RhbmRpbmcKLW9mIHRoZSBKUEVHIHN0YW5kYXJkOyBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0IGEgcGFyYW1ldGVyIGlzIGZvciwgaXQncyBiZXN0Ci1ub3QgdG8gbWVzcyB3aXRoIGl0ISAgU2VlIFJFRkVSRU5DRVMgaW4gdGhlIFJFQURNRSBmaWxlIGZvciBwb2ludGVycyB0bwotbW9yZSBpbmZvIGFib3V0IEpQRUcuCi0KLUl0J3MgYSBnb29kIGlkZWEgdG8gY2FsbCBqcGVnX3NldF9kZWZhdWx0cygpIGZpcnN0LCBldmVuIGlmIHlvdSBwbGFuIHRvIHNldAotYWxsIHRoZSBwYXJhbWV0ZXJzOyB0aGF0IHdheSB5b3VyIGNvZGUgaXMgbW9yZSBsaWtlbHkgdG8gd29yayB3aXRoIGZ1dHVyZSBKUEVHCi1saWJyYXJpZXMgdGhhdCBoYXZlIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIHJlY29tbWVuZAoteW91IHVzZSBhIGhlbHBlciByb3V0aW5lIHdoZXJlIG9uZSBpcyBwcm92aWRlZCwgaW4gcHJlZmVyZW5jZSB0byB0d2lkZGxpbmcKLWNpbmZvIGZpZWxkcyBkaXJlY3RseS4KLQotVGhlIGhlbHBlciByb3V0aW5lcyBhcmU6Ci0KLWpwZWdfc2V0X2RlZmF1bHRzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLQlUaGlzIHJvdXRpbmUgc2V0cyBhbGwgSlBFRyBwYXJhbWV0ZXJzIHRvIHJlYXNvbmFibGUgZGVmYXVsdHMsIHVzaW5nCi0Jb25seSB0aGUgaW5wdXQgaW1hZ2UncyBjb2xvciBzcGFjZSAoZmllbGQgaW5fY29sb3Jfc3BhY2UsIHdoaWNoIG11c3QKLQlhbHJlYWR5IGJlIHNldCBpbiBjaW5mbykuICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIG9ubHkgbmVlZCB0byB1c2UKLQl0aGlzIHJvdXRpbmUgYW5kIHBlcmhhcHMganBlZ19zZXRfcXVhbGl0eSgpLgotCi1qcGVnX3NldF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9DT0xPUl9TUEFDRSBjb2xvcnNwYWNlKQotCVNldHMgdGhlIEpQRUcgZmlsZSdzIGNvbG9yc3BhY2UgKGZpZWxkIGpwZWdfY29sb3Jfc3BhY2UpIGFzIHNwZWNpZmllZCwKLQlhbmQgc2V0cyBvdGhlciBjb2xvci1zcGFjZS1kZXBlbmRlbnQgcGFyYW1ldGVycyBhcHByb3ByaWF0ZWx5LiAgU2VlCi0JIlNwZWNpYWwgY29sb3Igc3BhY2VzIiwgYmVsb3csIGJlZm9yZSB1c2luZyB0aGlzLiAgQSBsYXJnZSBudW1iZXIgb2YKLQlwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgYWxsIHBlci1jb21wb25lbnQgcGFyYW1ldGVycywgYXJlIHNldCBieSB0aGlzCi0Jcm91dGluZTsgaWYgeW91IHdhbnQgdG8gdHdpZGRsZSBpbmRpdmlkdWFsIHBhcmFtZXRlcnMgeW91IHNob3VsZCBjYWxsCi0JanBlZ19zZXRfY29sb3JzcGFjZSgpIGJlZm9yZSByYXRoZXIgdGhhbiBhZnRlci4KLQotanBlZ19kZWZhdWx0X2NvbG9yc3BhY2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotCVNlbGVjdHMgYW4gYXBwcm9wcmlhdGUgSlBFRyBjb2xvcnNwYWNlIGJhc2VkIG9uIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSwKLQlhbmQgY2FsbHMganBlZ19zZXRfY29sb3JzcGFjZSgpLiAgVGhpcyBpcyBhY3R1YWxseSBhIHN1YnJvdXRpbmUgb2YKLQlqcGVnX3NldF9kZWZhdWx0cygpLiAgSXQncyBicm9rZW4gb3V0IGluIGNhc2UgeW91IHdhbnQgdG8gY2hhbmdlCi0JanVzdCB0aGUgY29sb3JzcGFjZS1kZXBlbmRlbnQgSlBFRyBwYXJhbWV0ZXJzLgotCi1qcGVnX3NldF9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHF1YWxpdHksIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCi0JQ29uc3RydWN0cyBKUEVHIHF1YW50aXphdGlvbiB0YWJsZXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbmRpY2F0ZWQKLQlxdWFsaXR5IHNldHRpbmcuICBUaGUgcXVhbGl0eSB2YWx1ZSBpcyBleHByZXNzZWQgb24gdGhlIDAuLjEwMCBzY2FsZQotCXJlY29tbWVuZGVkIGJ5IElKRyAoY2pwZWcncyAiLXF1YWxpdHkiIHN3aXRjaCB1c2VzIHRoaXMgcm91dGluZSkuCi0JTm90ZSB0aGF0IHRoZSBleGFjdCBtYXBwaW5nIGZyb20gcXVhbGl0eSB2YWx1ZXMgdG8gdGFibGVzIG1heSBjaGFuZ2UKLQlpbiBmdXR1cmUgSUpHIHJlbGVhc2VzIGFzIG1vcmUgaXMgbGVhcm5lZCBhYm91dCBEQ1QgcXVhbnRpemF0aW9uLgotCUlmIHRoZSBmb3JjZV9iYXNlbGluZSBwYXJhbWV0ZXIgaXMgVFJVRSwgdGhlbiB0aGUgcXVhbnRpemF0aW9uIHRhYmxlCi0JZW50cmllcyBhcmUgY29uc3RyYWluZWQgdG8gdGhlIHJhbmdlIDEuLjI1NSBmb3IgZnVsbCBKUEVHIGJhc2VsaW5lCi0JY29tcGF0aWJpbGl0eS4gIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGlzIG9ubHkgbWFrZXMgYQotCWRpZmZlcmVuY2UgZm9yIHF1YWxpdHkgc2V0dGluZ3MgYmVsb3cgMjUsIGFuZCBpdCBlZmZlY3RpdmVseSBwcmV2ZW50cwotCXZlcnkgc21hbGwvbG93IHF1YWxpdHkgZmlsZXMgZnJvbSBiZWluZyBnZW5lcmF0ZWQuICBUaGUgSUpHIGRlY29kZXIKLQlpcyBjYXBhYmxlIG9mIHJlYWRpbmcgdGhlIG5vbi1iYXNlbGluZSBmaWxlcyBnZW5lcmF0ZWQgYXQgbG93IHF1YWxpdHkKLQlzZXR0aW5ncyB3aGVuIGZvcmNlX2Jhc2VsaW5lIGlzIEZBTFNFLCBidXQgb3RoZXIgZGVjb2RlcnMgbWF5IG5vdCBiZS4KLQotanBlZ19zZXRfbGluZWFyX3F1YWxpdHkgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgc2NhbGVfZmFjdG9yLAotCQkJIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCi0JU2FtZSBhcyBqcGVnX3NldF9xdWFsaXR5KCkgZXhjZXB0IHRoYXQgdGhlIGdlbmVyYXRlZCB0YWJsZXMgYXJlIHRoZQotCXNhbXBsZSB0YWJsZXMgZ2l2ZW4gaW4gdGhlIEpQRUMgc3BlYyBzZWN0aW9uIEsuMSwgbXVsdGlwbGllZCBieSB0aGUKLQlzcGVjaWZpZWQgc2NhbGUgZmFjdG9yICh3aGljaCBpcyBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlOyB0aHVzCi0Jc2NhbGVfZmFjdG9yID0gMTAwIHJlcHJvZHVjZXMgdGhlIHNwZWMncyB0YWJsZXMpLiAgTm90ZSB0aGF0IGxhcmdlcgotCXNjYWxlIGZhY3RvcnMgZ2l2ZSBsb3dlciBxdWFsaXR5LiAgVGhpcyBlbnRyeSBwb2ludCBpcyB1c2VmdWwgZm9yCi0JY29uZm9ybWluZyB0byB0aGUgQWRvYmUgUG9zdFNjcmlwdCBEQ1QgY29udmVudGlvbnMsIGJ1dCB3ZSBkbyBub3QKLQlyZWNvbW1lbmQgbGluZWFyIHNjYWxpbmcgYXMgYSB1c2VyLXZpc2libGUgcXVhbGl0eSBzY2FsZSBvdGhlcndpc2UuCi0JZm9yY2VfYmFzZWxpbmUgYWdhaW4gY29uc3RyYWlucyB0aGUgY29tcHV0ZWQgdGFibGUgZW50cmllcyB0byAxLi4yNTUuCi0KLWludCBqcGVnX3F1YWxpdHlfc2NhbGluZyAoaW50IHF1YWxpdHkpCi0JQ29udmVydHMgYSB2YWx1ZSBvbiB0aGUgSUpHLXJlY29tbWVuZGVkIHF1YWxpdHkgc2NhbGUgdG8gYSBsaW5lYXIKLQlzY2FsaW5nIHBlcmNlbnRhZ2UuICBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSBjaGFuZ2Ugb3IgZ28gYXdheQotCWluIGZ1dHVyZSByZWxlYXNlcyAtLS0gSUpHIG1heSBjaG9vc2UgdG8gYWRvcHQgYSBzY2FsaW5nIG1ldGhvZCB0aGF0Ci0JY2FuJ3QgYmUgZXhwcmVzc2VkIGFzIGEgc2ltcGxlIHNjYWxhciBtdWx0aXBsaWVyLCBpbiB3aGljaCBjYXNlIHRoZQotCXByZW1pc2Ugb2YgdGhpcyByb3V0aW5lIGNvbGxhcHNlcy4gIENhdmVhdCB1c2VyLgotCi1qcGVnX2FkZF9xdWFudF90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCi0JCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCi0JCSAgICAgIGludCBzY2FsZV9mYWN0b3IsIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCi0JQWxsb3dzIGFuIGFyYml0cmFyeSBxdWFudGl6YXRpb24gdGFibGUgdG8gYmUgY3JlYXRlZC4gIHdoaWNoX3RibAotCWluZGljYXRlcyB3aGljaCB0YWJsZSBzbG90IHRvIGZpbGwuICBiYXNpY190YWJsZSBwb2ludHMgdG8gYW4gYXJyYXkKLQlvZiA2NCB1bnNpZ25lZCBpbnRzIGdpdmVuIGluIG5vcm1hbCBhcnJheSBvcmRlci4gIFRoZXNlIHZhbHVlcyBhcmUKLQltdWx0aXBsaWVkIGJ5IHNjYWxlX2ZhY3Rvci8xMDAgYW5kIHRoZW4gY2xhbXBlZCB0byB0aGUgcmFuZ2UgMS4uNjU1MzUKLQkob3IgdG8gMS4uMjU1IGlmIGZvcmNlX2Jhc2VsaW5lIGlzIFRSVUUpLgotCUNBVVRJT046IHByaW9yIHRvIGxpYnJhcnkgdmVyc2lvbiA2YSwganBlZ19hZGRfcXVhbnRfdGFibGUgZXhwZWN0ZWQKLQl0aGUgYmFzaWMgdGFibGUgdG8gYmUgZ2l2ZW4gaW4gSlBFRyB6aWd6YWcgb3JkZXIuICBJZiB5b3UgbmVlZCB0bwotCXdyaXRlIGNvZGUgdGhhdCB3b3JrcyB3aXRoIGVpdGhlciBvbGRlciBvciBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzCi0Jcm91dGluZSwgeW91IG11c3QgY2hlY2sgdGhlIGxpYnJhcnkgdmVyc2lvbiBudW1iZXIuICBTb21ldGhpbmcgbGlrZQotCSIjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA2MSIgaXMgdGhlIHJpZ2h0IHRlc3QuCi0KLWpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLQlHZW5lcmF0ZXMgYSBkZWZhdWx0IHNjYW4gc2NyaXB0IGZvciB3cml0aW5nIGEgcHJvZ3Jlc3NpdmUtSlBFRyBmaWxlLgotCVRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIG1ldGhvZCBvZiBjcmVhdGluZyBhIHByb2dyZXNzaXZlIGZpbGUsCi0JdW5sZXNzIHlvdSB3YW50IHRvIG1ha2UgYSBjdXN0b20gc2NhbiBzZXF1ZW5jZS4gIFlvdSBtdXN0IGVuc3VyZSB0aGF0Ci0JdGhlIEpQRUcgY29sb3Igc3BhY2UgaXMgc2V0IGNvcnJlY3RseSBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCi0KLQotQ29tcHJlc3Npb24gcGFyYW1ldGVycyAoY2luZm8gZmllbGRzKSBpbmNsdWRlOgotCi1KX0RDVF9NRVRIT0QgZGN0X21ldGhvZAotCVNlbGVjdHMgdGhlIGFsZ29yaXRobSB1c2VkIGZvciB0aGUgRENUIHN0ZXAuICBDaG9pY2VzIGFyZToKLQkJSkRDVF9JU0xPVzogc2xvdyBidXQgYWNjdXJhdGUgaW50ZWdlciBhbGdvcml0aG0KLQkJSkRDVF9JRkFTVDogZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kCi0JCUpEQ1RfRkxPQVQ6IGZsb2F0aW5nLXBvaW50IG1ldGhvZAotCQlKRENUX0RFRkFVTFQ6IGRlZmF1bHQgbWV0aG9kIChub3JtYWxseSBKRENUX0lTTE9XKQotCQlKRENUX0ZBU1RFU1Q6IGZhc3Rlc3QgbWV0aG9kIChub3JtYWxseSBKRENUX0lGQVNUKQotCVRoZSBGTE9BVCBtZXRob2QgaXMgdmVyeSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIElTTE9XIG1ldGhvZCwKLQlidXQgbWF5IGdpdmUgZGlmZmVyZW50IHJlc3VsdHMgb24gZGlmZmVyZW50IG1hY2hpbmVzIGR1ZSB0byB2YXJ5aW5nCi0Jcm91bmRvZmYgYmVoYXZpb3IuICBUaGUgaW50ZWdlciBtZXRob2RzIHNob3VsZCBnaXZlIHRoZSBzYW1lIHJlc3VsdHMKLQlvbiBhbGwgbWFjaGluZXMuICBPbiBtYWNoaW5lcyB3aXRoIHN1ZmZpY2llbnRseSBmYXN0IEZQIGhhcmR3YXJlLCB0aGUKLQlmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IGFsc28gYmUgdGhlIGZhc3Rlc3QuICBUaGUgSUZBU1QgbWV0aG9kIGlzCi0JY29uc2lkZXJhYmx5IGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvOyBpdHMgdXNlIGlzIG5vdAotCXJlY29tbWVuZGVkIGlmIGhpZ2ggcXVhbGl0eSBpcyBhIGNvbmNlcm4uICBKRENUX0RFRkFVTFQgYW5kCi0JSkRDVF9GQVNURVNUIGFyZSBtYWNyb3MgY29uZmlndXJhYmxlIGJ5IGVhY2ggaW5zdGFsbGF0aW9uLgotCi1KX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2UKLWludCBudW1fY29tcG9uZW50cwotCVRoZSBKUEVHIGNvbG9yIHNwYWNlIGFuZCBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBjb21wb25lbnRzOyBzZWUKLQkiU3BlY2lhbCBjb2xvciBzcGFjZXMiLCBiZWxvdywgZm9yIG1vcmUgaW5mby4gIFdlIHJlY29tbWVuZCB1c2luZwotCWpwZWdfc2V0X2NvbG9yX3NwYWNlKCkgaWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZXNlLgotCi1ib29sZWFuIG9wdGltaXplX2NvZGluZwotCVRSVUUgY2F1c2VzIHRoZSBjb21wcmVzc29yIHRvIGNvbXB1dGUgb3B0aW1hbCBIdWZmbWFuIGNvZGluZyB0YWJsZXMKLQlmb3IgdGhlIGltYWdlLiAgVGhpcyByZXF1aXJlcyBhbiBleHRyYSBwYXNzIG92ZXIgdGhlIGRhdGEgYW5kCi0JdGhlcmVmb3JlIGNvc3RzIGEgZ29vZCBkZWFsIG9mIHNwYWNlIGFuZCB0aW1lLiAgVGhlIGRlZmF1bHQgaXMKLQlGQUxTRSwgd2hpY2ggdGVsbHMgdGhlIGNvbXByZXNzb3IgdG8gdXNlIHRoZSBzdXBwbGllZCBvciBkZWZhdWx0Ci0JSHVmZm1hbiB0YWJsZXMuICBJbiBtb3N0IGNhc2VzIG9wdGltYWwgdGFibGVzIHNhdmUgb25seSBhIGZldyBwZXJjZW50Ci0Jb2YgZmlsZSBzaXplIGNvbXBhcmVkIHRvIHRoZSBkZWZhdWx0IHRhYmxlcy4gIE5vdGUgdGhhdCB3aGVuIHRoaXMgaXMKLQlUUlVFLCB5b3UgbmVlZCBub3Qgc3VwcGx5IEh1ZmZtYW4gdGFibGVzIGF0IGFsbCwgYW5kIGFueSB5b3UgZG8KLQlzdXBwbHkgd2lsbCBiZSBvdmVyd3JpdHRlbi4KLQotdW5zaWduZWQgaW50IHJlc3RhcnRfaW50ZXJ2YWwKLWludCByZXN0YXJ0X2luX3Jvd3MKLQlUbyBlbWl0IHJlc3RhcnQgbWFya2VycyBpbiB0aGUgSlBFRyBmaWxlLCBzZXQgb25lIG9mIHRoZXNlIG5vbnplcm8uCi0JU2V0IHJlc3RhcnRfaW50ZXJ2YWwgdG8gc3BlY2lmeSB0aGUgZXhhY3QgaW50ZXJ2YWwgaW4gTUNVIGJsb2Nrcy4KLQlTZXQgcmVzdGFydF9pbl9yb3dzIHRvIHNwZWNpZnkgdGhlIGludGVydmFsIGluIE1DVSByb3dzLiAgKElmCi0JcmVzdGFydF9pbl9yb3dzIGlzIG5vdCAwLCB0aGVuIHJlc3RhcnRfaW50ZXJ2YWwgaXMgc2V0IGFmdGVyIHRoZQotCWltYWdlIHdpZHRoIGluIE1DVXMgaXMgY29tcHV0ZWQuKSAgRGVmYXVsdHMgYXJlIHplcm8gKG5vIHJlc3RhcnRzKS4KLQlPbmUgcmVzdGFydCBtYXJrZXIgcGVyIE1DVSByb3cgaXMgb2Z0ZW4gYSBnb29kIGNob2ljZS4KLQlOT1RFOiB0aGUgb3ZlcmhlYWQgb2YgcmVzdGFydCBtYXJrZXJzIGlzIGhpZ2hlciBpbiBncmF5c2NhbGUgSlBFRwotCWZpbGVzIHRoYW4gaW4gY29sb3IgZmlsZXMsIGFuZCBNVUNIIGhpZ2hlciBpbiBwcm9ncmVzc2l2ZSBKUEVHcy4KLQlJZiB5b3UgdXNlIHJlc3RhcnRzLCB5b3UgbWF5IHdhbnQgdG8gdXNlIGxhcmdlciBpbnRlcnZhbHMgaW4gdGhvc2UKLQljYXNlcy4KLQotY29uc3QganBlZ19zY2FuX2luZm8gKiBzY2FuX2luZm8KLWludCBudW1fc2NhbnMKLQlCeSBkZWZhdWx0LCBzY2FuX2luZm8gaXMgTlVMTDsgdGhpcyBjYXVzZXMgdGhlIGNvbXByZXNzb3IgdG8gd3JpdGUgYQotCXNpbmdsZS1zY2FuIHNlcXVlbnRpYWwgSlBFRyBmaWxlLiAgSWYgbm90IE5VTEwsIHNjYW5faW5mbyBwb2ludHMgdG8KLQlhbiBhcnJheSBvZiBzY2FuIGRlZmluaXRpb24gcmVjb3JkcyBvZiBsZW5ndGggbnVtX3NjYW5zLiAgVGhlCi0JY29tcHJlc3NvciB3aWxsIHRoZW4gd3JpdGUgYSBKUEVHIGZpbGUgaGF2aW5nIG9uZSBzY2FuIGZvciBlYWNoIHNjYW4KLQlkZWZpbml0aW9uIHJlY29yZC4gIFRoaXMgaXMgdXNlZCB0byBnZW5lcmF0ZSBub25pbnRlcmxlYXZlZCBvcgotCXByb2dyZXNzaXZlIEpQRUcgZmlsZXMuICBUaGUgbGlicmFyeSBjaGVja3MgdGhhdCB0aGUgc2NhbiBhcnJheQotCWRlZmluZXMgYSB2YWxpZCBKUEVHIHNjYW4gc2VxdWVuY2UuICAoanBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gY3JlYXRlcwotCWEgc3VpdGFibGUgc2NhbiBkZWZpbml0aW9uIGFycmF5IGZvciBwcm9ncmVzc2l2ZSBKUEVHLikgIFRoaXMgaXMKLQlkaXNjdXNzZWQgZnVydGhlciB1bmRlciAiUHJvZ3Jlc3NpdmUgSlBFRyBzdXBwb3J0Ii4KLQotaW50IHNtb290aGluZ19mYWN0b3IKLQlJZiBub24temVybywgdGhlIGlucHV0IGltYWdlIGlzIHNtb290aGVkOyB0aGUgdmFsdWUgc2hvdWxkIGJlIDEgZm9yCi0JbWluaW1hbCBzbW9vdGhpbmcgdG8gMTAwIGZvciBtYXhpbXVtIHNtb290aGluZy4gIENvbnN1bHQgamNzYW1wbGUuYwotCWZvciBkZXRhaWxzIG9mIHRoZSBzbW9vdGhpbmcgYWxnb3JpdGhtLiAgVGhlIGRlZmF1bHQgaXMgemVyby4KLQotYm9vbGVhbiB3cml0ZV9KRklGX2hlYWRlcgotCUlmIFRSVUUsIGEgSkZJRiBBUFAwIG1hcmtlciBpcyBlbWl0dGVkLiAganBlZ19zZXRfZGVmYXVsdHMoKSBhbmQKLQlqcGVnX3NldF9jb2xvcnNwYWNlKCkgc2V0IHRoaXMgVFJVRSBpZiBhIEpGSUYtbGVnYWwgSlBFRyBjb2xvciBzcGFjZQotCShpZSwgWUNiQ3Igb3IgZ3JheXNjYWxlKSBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIEZBTFNFLgotCi1VSU5UOCBKRklGX21ham9yX3ZlcnNpb24KLVVJTlQ4IEpGSUZfbWlub3JfdmVyc2lvbgotCVRoZSB2ZXJzaW9uIG51bWJlciB0byBiZSB3cml0dGVuIGludG8gdGhlIEpGSUYgbWFya2VyLgotCWpwZWdfc2V0X2RlZmF1bHRzKCkgaW5pdGlhbGl6ZXMgdGhlIHZlcnNpb24gdG8gMS4wMSAobWFqb3I9bWlub3I9MSkuCi0JWW91IHNob3VsZCBzZXQgaXQgdG8gMS4wMiAobWFqb3I9MSwgbWlub3I9MikgaWYgeW91IHBsYW4gdG8gd3JpdGUKLQlhbnkgSkZJRiAxLjAyIGV4dGVuc2lvbiBtYXJrZXJzLgotCi1VSU5UOCBkZW5zaXR5X3VuaXQKLVVJTlQxNiBYX2RlbnNpdHkKLVVJTlQxNiBZX2RlbnNpdHkKLQlUaGUgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiB0byBiZSB3cml0dGVuIGludG8gdGhlIEpGSUYgbWFya2VyOwotCW5vdCB1c2VkIG90aGVyd2lzZS4gIGRlbnNpdHlfdW5pdCBtYXkgYmUgMCBmb3IgdW5rbm93biwKLQkxIGZvciBkb3RzL2luY2gsIG9yIDIgZm9yIGRvdHMvY20uICBUaGUgZGVmYXVsdCB2YWx1ZXMgYXJlIDAsMSwxCi0JaW5kaWNhdGluZyBzcXVhcmUgcGl4ZWxzIG9mIHVua25vd24gc2l6ZS4KLQotYm9vbGVhbiB3cml0ZV9BZG9iZV9tYXJrZXIKLQlJZiBUUlVFLCBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgaXMgZW1pdHRlZC4gIGpwZWdfc2V0X2RlZmF1bHRzKCkgYW5kCi0JanBlZ19zZXRfY29sb3JzcGFjZSgpIHNldCB0aGlzIFRSVUUgaWYgSlBFRyBjb2xvciBzcGFjZSBSR0IsIENNWUssCi0Jb3IgWUNDSyBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIEZBTFNFLiAgSXQgaXMgZ2VuZXJhbGx5IGEgYmFkIGlkZWEKLQl0byBzZXQgYm90aCB3cml0ZV9KRklGX2hlYWRlciBhbmQgd3JpdGVfQWRvYmVfbWFya2VyLiAgSW4gZmFjdCwKLQl5b3UgcHJvYmFibHkgc2hvdWxkbid0IGNoYW5nZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyBhdCBhbGwgLS0tIHRoZQotCWRlZmF1bHQgYmVoYXZpb3IgZW5zdXJlcyB0aGF0IHRoZSBKUEVHIGZpbGUncyBjb2xvciBzcGFjZSBjYW4gYmUKLQlyZWNvZ25pemVkIGJ5IHRoZSBkZWNvZGVyLgotCi1KUVVBTlRfVEJMICogcXVhbnRfdGJsX3B0cnNbTlVNX1FVQU5UX1RCTFNdCi0JUG9pbnRlcnMgdG8gY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIHRhYmxlcywgb25lIHBlciB0YWJsZSBzbG90LAotCW9yIE5VTEwgaWYgbm8gdGFibGUgaXMgZGVmaW5lZCBmb3IgYSBzbG90LiAgVXN1YWxseSB0aGVzZSBzaG91bGQKLQliZSBzZXQgdmlhIG9uZSBvZiB0aGUgYWJvdmUgaGVscGVyIHJvdXRpbmVzOyBqcGVnX2FkZF9xdWFudF90YWJsZSgpCi0JaXMgZ2VuZXJhbCBlbm91Z2ggdG8gZGVmaW5lIGFueSBxdWFudGl6YXRpb24gdGFibGUuICBUaGUgb3RoZXIKLQlyb3V0aW5lcyB3aWxsIHNldCB1cCB0YWJsZSBzbG90IDAgZm9yIGx1bWluYW5jZSBxdWFsaXR5IGFuZCB0YWJsZQotCXNsb3QgMSBmb3IgY2hyb21pbmFuY2UuCi0KLUpIVUZGX1RCTCAqIGRjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU10KLUpIVUZGX1RCTCAqIGFjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU10KLQlQb2ludGVycyB0byBIdWZmbWFuIGNvZGluZyB0YWJsZXMsIG9uZSBwZXIgdGFibGUgc2xvdCwgb3IgTlVMTCBpZgotCW5vIHRhYmxlIGlzIGRlZmluZWQgZm9yIGEgc2xvdC4gIFNsb3RzIDAgYW5kIDEgYXJlIGZpbGxlZCB3aXRoIHRoZQotCUpQRUcgc2FtcGxlIHRhYmxlcyBieSBqcGVnX3NldF9kZWZhdWx0cygpLiAgSWYgeW91IG5lZWQgdG8gYWxsb2NhdGUKLQltb3JlIHRhYmxlIHN0cnVjdHVyZXMsIGpwZWdfYWxsb2NfaHVmZl90YWJsZSgpIG1heSBiZSB1c2VkLgotCU5vdGUgdGhhdCBvcHRpbWFsIEh1ZmZtYW4gdGFibGVzIGNhbiBiZSBjb21wdXRlZCBmb3IgYW4gaW1hZ2UKLQlieSBzZXR0aW5nIG9wdGltaXplX2NvZGluZywgYXMgZGlzY3Vzc2VkIGFib3ZlOyB0aGVyZSdzIHNlbGRvbQotCWFueSBuZWVkIHRvIG1lc3Mgd2l0aCBwcm92aWRpbmcgeW91ciBvd24gSHVmZm1hbiB0YWJsZXMuCi0KLVRoZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgY2luZm8gZmllbGRzIHdoaWNoIGFyZSBub3QgZG9jdW1lbnRlZCBoZXJlCi1iZWNhdXNlIHlvdSBjdXJyZW50bHkgY2FuJ3QgY2hhbmdlIHRoZW07IGZvciBleGFtcGxlLCB5b3UgY2FuJ3Qgc2V0Ci1hcml0aF9jb2RlIFRSVUUgYmVjYXVzZSBhcml0aG1ldGljIGNvZGluZyBpcyB1bnN1cHBvcnRlZC4KLQotCi1QZXItY29tcG9uZW50IHBhcmFtZXRlcnMgYXJlIHN0b3JlZCBpbiB0aGUgc3RydWN0IGNpbmZvLmNvbXBfaW5mb1tpXSBmb3IKLWNvbXBvbmVudCBudW1iZXIgaS4gIE5vdGUgdGhhdCBjb21wb25lbnRzIGhlcmUgcmVmZXIgdG8gY29tcG9uZW50cyBvZiB0aGUKLUpQRUcgY29sb3Igc3BhY2UsICpub3QqIHRoZSBzb3VyY2UgaW1hZ2UgY29sb3Igc3BhY2UuICBBIHN1aXRhYmx5IGxhcmdlCi1jb21wX2luZm9bXSBhcnJheSBpcyBhbGxvY2F0ZWQgYnkganBlZ19zZXRfZGVmYXVsdHMoKTsgaWYgeW91IGNob29zZSBub3QKLXRvIHVzZSB0aGF0IHJvdXRpbmUsIGl0J3MgdXAgdG8geW91IHRvIGFsbG9jYXRlIHRoZSBhcnJheS4KLQotaW50IGNvbXBvbmVudF9pZAotCVRoZSBvbmUtYnl0ZSBpZGVudGlmaWVyIGNvZGUgdG8gYmUgcmVjb3JkZWQgaW4gdGhlIEpQRUcgZmlsZSBmb3IKLQl0aGlzIGNvbXBvbmVudC4gIEZvciB0aGUgc3RhbmRhcmQgY29sb3Igc3BhY2VzLCB3ZSByZWNvbW1lbmQgeW91Ci0JbGVhdmUgdGhlIGRlZmF1bHQgdmFsdWVzIGFsb25lLgotCi1pbnQgaF9zYW1wX2ZhY3RvcgotaW50IHZfc2FtcF9mYWN0b3IKLQlIb3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzYW1wbGluZyBmYWN0b3JzIGZvciB0aGUgY29tcG9uZW50OyBtdXN0Ci0JYmUgMS4uNCBhY2NvcmRpbmcgdG8gdGhlIEpQRUcgc3RhbmRhcmQuICBOb3RlIHRoYXQgbGFyZ2VyIHNhbXBsaW5nCi0JZmFjdG9ycyBpbmRpY2F0ZSBhIGhpZ2hlci1yZXNvbHV0aW9uIGNvbXBvbmVudDsgbWFueSBwZW9wbGUgZmluZAotCXRoaXMgYmVoYXZpb3IgcXVpdGUgdW5pbnR1aXRpdmUuICBUaGUgZGVmYXVsdCB2YWx1ZXMgYXJlIDIsMiBmb3IKLQlsdW1pbmFuY2UgY29tcG9uZW50cyBhbmQgMSwxIGZvciBjaHJvbWluYW5jZSBjb21wb25lbnRzLCBleGNlcHQKLQlmb3IgZ3JheXNjYWxlIHdoZXJlIDEsMSBpcyB1c2VkLgotCi1pbnQgcXVhbnRfdGJsX25vCi0JUXVhbnRpemF0aW9uIHRhYmxlIG51bWJlciBmb3IgY29tcG9uZW50LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKLQkwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cyBhbmQgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4KLQotaW50IGRjX3RibF9ubwotaW50IGFjX3RibF9ubwotCURDIGFuZCBBQyBlbnRyb3B5IGNvZGluZyB0YWJsZSBudW1iZXJzLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGFyZQotCTAgZm9yIGx1bWluYW5jZSBjb21wb25lbnRzIGFuZCAxIGZvciBjaHJvbWluYW5jZSBjb21wb25lbnRzLgotCi1pbnQgY29tcG9uZW50X2luZGV4Ci0JTXVzdCBlcXVhbCB0aGUgY29tcG9uZW50J3MgaW5kZXggaW4gY29tcF9pbmZvW10uICAoQmVnaW5uaW5nIGluCi0JcmVsZWFzZSB2NiwgdGhlIGNvbXByZXNzb3IgbGlicmFyeSB3aWxsIGZpbGwgdGhpcyBpbiBhdXRvbWF0aWNhbGx5OwotCXlvdSBkb24ndCBoYXZlIHRvLikKLQotCi1EZWNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1EZWNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24gaXMgc29tZXdoYXQgc2ltcGxlciB0aGFuIGNvbXByZXNzaW9uCi1wYXJhbWV0ZXIgc2VsZWN0aW9uLCBzaW5jZSBhbGwgb2YgdGhlIEpQRUcgaW50ZXJuYWwgcGFyYW1ldGVycyBhcmUKLXJlY29yZGVkIGluIHRoZSBzb3VyY2UgZmlsZSBhbmQgbmVlZCBub3QgYmUgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotKFVubGVzcyB5b3UgYXJlIHdvcmtpbmcgd2l0aCBhYmJyZXZpYXRlZCBmaWxlcywgaW4gd2hpY2ggY2FzZSBzZWUKLSJBYmJyZXZpYXRlZCBkYXRhc3RyZWFtcyIsIGJlbG93LikgIERlY29tcHJlc3Npb24gcGFyYW1ldGVycyBjb250cm9sCi10aGUgcG9zdHByb2Nlc3NpbmcgZG9uZSBvbiB0aGUgaW1hZ2UgdG8gZGVsaXZlciBpdCBpbiBhIGZvcm1hdCBzdWl0YWJsZQotZm9yIHRoZSBhcHBsaWNhdGlvbidzIHVzZS4gIE1hbnkgb2YgdGhlIHBhcmFtZXRlcnMgY29udHJvbCBzcGVlZC9xdWFsaXR5Ci10cmFkZW9mZnMsIGluIHdoaWNoIGZhc3RlciBkZWNvbXByZXNzaW9uIG1heSBiZSBvYnRhaW5lZCBhdCB0aGUgcHJpY2Ugb2YKLWEgcG9vcmVyLXF1YWxpdHkgaW1hZ2UuICBUaGUgZGVmYXVsdHMgc2VsZWN0IHRoZSBoaWdoZXN0IHF1YWxpdHkgKHNsb3dlc3QpCi1wcm9jZXNzaW5nLgotCi1UaGUgZm9sbG93aW5nIGZpZWxkcyBpbiB0aGUgSlBFRyBvYmplY3QgYXJlIHNldCBieSBqcGVnX3JlYWRfaGVhZGVyKCkgYW5kCi1tYXkgYmUgdXNlZnVsIHRvIHRoZSBhcHBsaWNhdGlvbiBpbiBjaG9vc2luZyBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnM6Ci0KLUpESU1FTlNJT04gaW1hZ2Vfd2lkdGgJCQlXaWR0aCBhbmQgaGVpZ2h0IG9mIGltYWdlCi1KRElNRU5TSU9OIGltYWdlX2hlaWdodAotaW50IG51bV9jb21wb25lbnRzCQkJTnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMKLUpfQ09MT1JfU1BBQ0UganBlZ19jb2xvcl9zcGFjZQkJQ29sb3JzcGFjZSBvZiBpbWFnZQotYm9vbGVhbiBzYXdfSkZJRl9tYXJrZXIJCQlUUlVFIGlmIGEgSkZJRiBBUFAwIG1hcmtlciB3YXMgc2VlbgotICBVSU5UOCBKRklGX21ham9yX3ZlcnNpb24JCVZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBKRklGIG1hcmtlcgotICBVSU5UOCBKRklGX21pbm9yX3ZlcnNpb24KLSAgVUlOVDggZGVuc2l0eV91bml0CQkJUmVzb2x1dGlvbiBkYXRhIGZyb20gSkZJRiBtYXJrZXIKLSAgVUlOVDE2IFhfZGVuc2l0eQotICBVSU5UMTYgWV9kZW5zaXR5Ci1ib29sZWFuIHNhd19BZG9iZV9tYXJrZXIJCVRSVUUgaWYgYW4gQWRvYmUgQVBQMTQgbWFya2VyIHdhcyBzZWVuCi0gIFVJTlQ4IEFkb2JlX3RyYW5zZm9ybQkJCUNvbG9yIHRyYW5zZm9ybSBjb2RlIGZyb20gQWRvYmUgbWFya2VyCi0KLVRoZSBKUEVHIGNvbG9yIHNwYWNlLCB1bmZvcnR1bmF0ZWx5LCBpcyBzb21ldGhpbmcgb2YgYSBndWVzcyBzaW5jZSB0aGUgSlBFRwotc3RhbmRhcmQgcHJvcGVyIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcmVjb3JkIGl0LiAgSW4gcHJhY3RpY2UgbW9zdCBmaWxlcwotYWRoZXJlIHRvIHRoZSBKRklGIG9yIEFkb2JlIGNvbnZlbnRpb25zLCBhbmQgdGhlIGRlY29kZXIgd2lsbCByZWNvZ25pemUgdGhlc2UKLWNvcnJlY3RseS4gIFNlZSAiU3BlY2lhbCBjb2xvciBzcGFjZXMiLCBiZWxvdywgZm9yIG1vcmUgaW5mby4KLQotCi1UaGUgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHRoYXQgZGV0ZXJtaW5lIHRoZSBiYXNpYyBwcm9wZXJ0aWVzIG9mIHRoZQotcmV0dXJuZWQgaW1hZ2UgYXJlOgotCi1KX0NPTE9SX1NQQUNFIG91dF9jb2xvcl9zcGFjZQotCU91dHB1dCBjb2xvciBzcGFjZS4gIGpwZWdfcmVhZF9oZWFkZXIoKSBzZXRzIGFuIGFwcHJvcHJpYXRlIGRlZmF1bHQKLQliYXNlZCBvbiBqcGVnX2NvbG9yX3NwYWNlOyB0eXBpY2FsbHkgaXQgd2lsbCBiZSBSR0Igb3IgZ3JheXNjYWxlLgotCVRoZSBhcHBsaWNhdGlvbiBjYW4gY2hhbmdlIHRoaXMgZmllbGQgdG8gcmVxdWVzdCBvdXRwdXQgaW4gYSBkaWZmZXJlbnQKLQljb2xvcnNwYWNlLiAgRm9yIGV4YW1wbGUsIHNldCBpdCB0byBKQ1NfR1JBWVNDQUxFIHRvIGdldCBncmF5c2NhbGUKLQlvdXRwdXQgZnJvbSBhIGNvbG9yIGZpbGUuICAoVGhpcyBpcyB1c2VmdWwgZm9yIHByZXZpZXdpbmc6IGdyYXlzY2FsZQotCW91dHB1dCBpcyBmYXN0ZXIgdGhhbiBmdWxsIGNvbG9yIHNpbmNlIHRoZSBjb2xvciBjb21wb25lbnRzIG5lZWQgbm90Ci0JYmUgcHJvY2Vzc2VkLikgIE5vdGUgdGhhdCBub3QgYWxsIHBvc3NpYmxlIGNvbG9yIHNwYWNlIHRyYW5zZm9ybXMgYXJlCi0JY3VycmVudGx5IGltcGxlbWVudGVkOyB5b3UgbWF5IG5lZWQgdG8gZXh0ZW5kIGpkY29sb3IuYyBpZiB5b3Ugd2FudCBhbgotCXVudXN1YWwgY29udmVyc2lvbi4KLQotdW5zaWduZWQgaW50IHNjYWxlX251bSwgc2NhbGVfZGVub20KLQlTY2FsZSB0aGUgaW1hZ2UgYnkgdGhlIGZyYWN0aW9uIHNjYWxlX251bS9zY2FsZV9kZW5vbS4gIERlZmF1bHQgaXMKLQkxLzEsIG9yIG5vIHNjYWxpbmcuICBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCBzY2FsaW5nIHJhdGlvcwotCWFyZSAxLzEsIDEvMiwgMS80LCBhbmQgMS84LiAgKFRoZSBsaWJyYXJ5IGRlc2lnbiBhbGxvd3MgZm9yIGFyYml0cmFyeQotCXNjYWxpbmcgcmF0aW9zIGJ1dCB0aGlzIGlzIG5vdCBsaWtlbHkgdG8gYmUgaW1wbGVtZW50ZWQgYW55IHRpbWUgc29vbi4pCi0JU21hbGxlciBzY2FsaW5nIHJhdGlvcyBwZXJtaXQgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZGVjb2Rpbmcgc2luY2UKLQlmZXdlciBwaXhlbHMgbmVlZCBiZSBwcm9jZXNzZWQgYW5kIGEgc2ltcGxlciBJRENUIG1ldGhvZCBjYW4gYmUgdXNlZC4KLQotYm9vbGVhbiBxdWFudGl6ZV9jb2xvcnMKLQlJZiBzZXQgVFJVRSwgY29sb3JtYXBwZWQgb3V0cHV0IHdpbGwgYmUgZGVsaXZlcmVkLiAgRGVmYXVsdCBpcyBGQUxTRSwKLQltZWFuaW5nIHRoYXQgZnVsbC1jb2xvciBvdXRwdXQgd2lsbCBiZSBkZWxpdmVyZWQuCi0KLVRoZSBuZXh0IHRocmVlIHBhcmFtZXRlcnMgYXJlIHJlbGV2YW50IG9ubHkgaWYgcXVhbnRpemVfY29sb3JzIGlzIFRSVUUuCi0KLWludCBkZXNpcmVkX251bWJlcl9vZl9jb2xvcnMKLQlNYXhpbXVtIG51bWJlciBvZiBjb2xvcnMgdG8gdXNlIGluIGdlbmVyYXRpbmcgYSBsaWJyYXJ5LXN1cHBsaWVkIGNvbG9yCi0JbWFwICh0aGUgYWN0dWFsIG51bWJlciBvZiBjb2xvcnMgaXMgcmV0dXJuZWQgaW4gYSBkaWZmZXJlbnQgZmllbGQpLgotCURlZmF1bHQgMjU2LiAgSWdub3JlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdXBwbGllcyBpdHMgb3duIGNvbG9yIG1hcC4KLQotYm9vbGVhbiB0d29fcGFzc19xdWFudGl6ZQotCUlmIFRSVUUsIGFuIGV4dHJhIHBhc3Mgb3ZlciB0aGUgaW1hZ2UgaXMgbWFkZSB0byBzZWxlY3QgYSBjdXN0b20gY29sb3IKLQltYXAgZm9yIHRoZSBpbWFnZS4gIFRoaXMgdXN1YWxseSBsb29rcyBhIGxvdCBiZXR0ZXIgdGhhbiB0aGUgb25lLXNpemUtCi0JZml0cy1hbGwgY29sb3JtYXAgdGhhdCBpcyB1c2VkIG90aGVyd2lzZS4gIERlZmF1bHQgaXMgVFJVRS4gIElnbm9yZWQKLQl3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdXBwbGllcyBpdHMgb3duIGNvbG9yIG1hcC4KLQotSl9ESVRIRVJfTU9ERSBkaXRoZXJfbW9kZQotCVNlbGVjdHMgY29sb3IgZGl0aGVyaW5nIG1ldGhvZC4gIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOgotCQlKRElUSEVSX05PTkUJbm8gZGl0aGVyaW5nOiBmYXN0LCB2ZXJ5IGxvdyBxdWFsaXR5Ci0JCUpESVRIRVJfT1JERVJFRAlvcmRlcmVkIGRpdGhlcjogbW9kZXJhdGUgc3BlZWQgYW5kIHF1YWxpdHkKLQkJSkRJVEhFUl9GUwlGbG95ZC1TdGVpbmJlcmcgZGl0aGVyOiBzbG93LCBoaWdoIHF1YWxpdHkKLQlEZWZhdWx0IGlzIEpESVRIRVJfRlMuICAoQXQgcHJlc2VudCwgb3JkZXJlZCBkaXRoZXIgaXMgaW1wbGVtZW50ZWQKLQlvbmx5IGluIHRoZSBzaW5nbGUtcGFzcywgc3RhbmRhcmQtY29sb3JtYXAgY2FzZS4gIElmIHlvdSBhc2sgZm9yCi0Jb3JkZXJlZCBkaXRoZXIgd2hlbiB0d29fcGFzc19xdWFudGl6ZSBpcyBUUlVFIG9yIHdoZW4geW91IHN1cHBseQotCWFuIGV4dGVybmFsIGNvbG9yIG1hcCwgeW91J2xsIGdldCBGLVMgZGl0aGVyaW5nLikKLQotV2hlbiBxdWFudGl6ZV9jb2xvcnMgaXMgVFJVRSwgdGhlIHRhcmdldCBjb2xvciBtYXAgaXMgZGVzY3JpYmVkIGJ5IHRoZSBuZXh0Ci10d28gZmllbGRzLiAgY29sb3JtYXAgaXMgc2V0IHRvIE5VTEwgYnkganBlZ19yZWFkX2hlYWRlcigpLiAgVGhlIGFwcGxpY2F0aW9uCi1jYW4gc3VwcGx5IGEgY29sb3IgbWFwIGJ5IHNldHRpbmcgY29sb3JtYXAgbm9uLU5VTEwgYW5kIHNldHRpbmcKLWFjdHVhbF9udW1iZXJfb2ZfY29sb3JzIHRvIHRoZSBtYXAgc2l6ZS4gIE90aGVyd2lzZSwganBlZ19zdGFydF9kZWNvbXByZXNzKCkKLXNlbGVjdHMgYSBzdWl0YWJsZSBjb2xvciBtYXAgYW5kIHNldHMgdGhlc2UgdHdvIGZpZWxkcyBpdHNlbGYuCi1bSW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb246IGF0IHByZXNlbnQsIGFuIGV4dGVybmFsbHkgc3VwcGxpZWQgY29sb3JtYXAgaXMKLW9ubHkgYWNjZXB0ZWQgZm9yIDMtY29tcG9uZW50IG91dHB1dCBjb2xvciBzcGFjZXMuXQotCi1KU0FNUEFSUkFZIGNvbG9ybWFwCi0JVGhlIGNvbG9yIG1hcCwgcmVwcmVzZW50ZWQgYXMgYSAyLUQgcGl4ZWwgYXJyYXkgb2Ygb3V0X2NvbG9yX2NvbXBvbmVudHMKLQlyb3dzIGFuZCBhY3R1YWxfbnVtYmVyX29mX2NvbG9ycyBjb2x1bW5zLiAgSWdub3JlZCBpZiBub3QgcXVhbnRpemluZy4KLQlDQVVUSU9OOiBpZiB0aGUgSlBFRyBsaWJyYXJ5IGNyZWF0ZXMgaXRzIG93biBjb2xvcm1hcCwgdGhlIHN0b3JhZ2UKLQlwb2ludGVkIHRvIGJ5IHRoaXMgZmllbGQgaXMgcmVsZWFzZWQgYnkganBlZ19maW5pc2hfZGVjb21wcmVzcygpLgotCUNvcHkgdGhlIGNvbG9ybWFwIHNvbWV3aGVyZSBlbHNlIGZpcnN0LCBpZiB5b3Ugd2FudCB0byBzYXZlIGl0LgotCi1pbnQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnMKLQlUaGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgY29sb3IgbWFwLgotCi1BZGRpdGlvbmFsIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBtYXkgc2V0IGluY2x1ZGU6Ci0KLUpfRENUX01FVEhPRCBkY3RfbWV0aG9kCi0JU2VsZWN0cyB0aGUgYWxnb3JpdGhtIHVzZWQgZm9yIHRoZSBEQ1Qgc3RlcC4gIENob2ljZXMgYXJlIHRoZSBzYW1lCi0JYXMgZGVzY3JpYmVkIGFib3ZlIGZvciBjb21wcmVzc2lvbi4KLQotYm9vbGVhbiBkb19mYW5jeV91cHNhbXBsaW5nCi0JSWYgVFJVRSwgZG8gY2FyZWZ1bCB1cHNhbXBsaW5nIG9mIGNocm9tYSBjb21wb25lbnRzLiAgSWYgRkFMU0UsCi0JYSBmYXN0ZXIgYnV0IHNsb3BwaWVyIG1ldGhvZCBpcyB1c2VkLiAgRGVmYXVsdCBpcyBUUlVFLiAgVGhlIHZpc3VhbAotCWltcGFjdCBvZiB0aGUgc2xvcHBpZXIgbWV0aG9kIGlzIG9mdGVuIHZlcnkgc21hbGwuCi0KLWJvb2xlYW4gZG9fYmxvY2tfc21vb3RoaW5nCi0JSWYgVFJVRSwgaW50ZXJibG9jayBzbW9vdGhpbmcgaXMgYXBwbGllZCBpbiBlYXJseSBzdGFnZXMgb2YgZGVjb2RpbmcKLQlwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzOyBpZiBGQUxTRSwgbm90LiAgRGVmYXVsdCBpcyBUUlVFLiAgRWFybHkKLQlwcm9ncmVzc2lvbiBzdGFnZXMgbG9vayAiZnV6enkiIHdpdGggc21vb3RoaW5nLCAiYmxvY2t5IiB3aXRob3V0LgotCUluIGFueSBjYXNlLCBibG9jayBzbW9vdGhpbmcgY2Vhc2VzIHRvIGJlIGFwcGxpZWQgYWZ0ZXIgdGhlIGZpcnN0IGZldwotCUFDIGNvZWZmaWNpZW50cyBhcmUga25vd24gdG8gZnVsbCBhY2N1cmFjeSwgc28gaXQgaXMgcmVsZXZhbnQgb25seQotCXdoZW4gdXNpbmcgYnVmZmVyZWQtaW1hZ2UgbW9kZSBmb3IgcHJvZ3Jlc3NpdmUgaW1hZ2VzLgotCi1ib29sZWFuIGVuYWJsZV8xcGFzc19xdWFudAotYm9vbGVhbiBlbmFibGVfZXh0ZXJuYWxfcXVhbnQKLWJvb2xlYW4gZW5hYmxlXzJwYXNzX3F1YW50Ci0JVGhlc2UgYXJlIHNpZ25pZmljYW50IG9ubHkgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgd2hpY2ggaXMKLQlkZXNjcmliZWQgaW4gaXRzIG93biBzZWN0aW9uIGJlbG93LgotCi0KLVRoZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBhcmUgZ2l2ZW4gYnkgdGhlIGZvbGxvd2luZyBmaWVsZHMuICBUaGVzZSBhcmUKLWNvbXB1dGVkIGZyb20gdGhlIHNvdXJjZSBpbWFnZSBkaW1lbnNpb25zIGFuZCB0aGUgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCi1ieSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4gIFlvdSBjYW4gYWxzbyBjYWxsIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucygpCi10byBvYnRhaW4gdGhlIHZhbHVlcyB0aGF0IHdpbGwgcmVzdWx0IGZyb20gdGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldHRpbmdzLgotVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIHBpY2sgYSBzY2FsaW5nIHJhdGlvIHRoYXQgd2lsbCBnZXQKLWNsb3NlIHRvIGEgZGVzaXJlZCB0YXJnZXQgc2l6ZS4gIEl0J3MgYWxzbyBpbXBvcnRhbnQgaWYgeW91IGFyZSB1c2luZyB0aGUKLUpQRUcgbGlicmFyeSdzIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIG91dHB1dCBidWZmZXIgc3BhY2UsIGJlY2F1c2UgeW91Ci1hcmUgc3VwcG9zZWQgdG8gcmVxdWVzdCBzdWNoIGJ1ZmZlcnMgKmJlZm9yZSoganBlZ19zdGFydF9kZWNvbXByZXNzKCkuCi0KLUpESU1FTlNJT04gb3V0cHV0X3dpZHRoCQlBY3R1YWwgZGltZW5zaW9ucyBvZiBvdXRwdXQgaW1hZ2UuCi1KRElNRU5TSU9OIG91dHB1dF9oZWlnaHQKLWludCBvdXRfY29sb3JfY29tcG9uZW50cwlOdW1iZXIgb2YgY29sb3IgY29tcG9uZW50cyBpbiBvdXRfY29sb3Jfc3BhY2UuCi1pbnQgb3V0cHV0X2NvbXBvbmVudHMJCU51bWJlciBvZiBjb2xvciBjb21wb25lbnRzIHJldHVybmVkLgotaW50IHJlY19vdXRidWZfaGVpZ2h0CQlSZWNvbW1lbmRlZCBoZWlnaHQgb2Ygc2NhbmxpbmUgYnVmZmVyLgotCi1XaGVuIHF1YW50aXppbmcgY29sb3JzLCBvdXRwdXRfY29tcG9uZW50cyBpcyAxLCBpbmRpY2F0aW5nIGEgc2luZ2xlIGNvbG9yIG1hcAotaW5kZXggcGVyIHBpeGVsLiAgT3RoZXJ3aXNlIGl0IGVxdWFscyBvdXRfY29sb3JfY29tcG9uZW50cy4gIFRoZSBvdXRwdXQgYXJyYXlzCi1hcmUgcmVxdWlyZWQgdG8gYmUgb3V0cHV0X3dpZHRoICogb3V0cHV0X2NvbXBvbmVudHMgSlNBTVBMRXMgd2lkZS4KLQotcmVjX291dGJ1Zl9oZWlnaHQgaXMgdGhlIHJlY29tbWVuZGVkIG1pbmltdW0gaGVpZ2h0IChpbiBzY2FubGluZXMpIG9mIHRoZQotYnVmZmVyIHBhc3NlZCB0byBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuICBJZiB0aGUgYnVmZmVyIGlzIHNtYWxsZXIsIHRoZQotbGlicmFyeSB3aWxsIHN0aWxsIHdvcmssIGJ1dCB0aW1lIHdpbGwgYmUgd2FzdGVkIGR1ZSB0byB1bm5lY2Vzc2FyeSBkYXRhCi1jb3B5aW5nLiAgSW4gaGlnaC1xdWFsaXR5IG1vZGVzLCByZWNfb3V0YnVmX2hlaWdodCBpcyBhbHdheXMgMSwgYnV0IHNvbWUKLWZhc3RlciwgbG93ZXItcXVhbGl0eSBtb2RlcyBzZXQgaXQgdG8gbGFyZ2VyIHZhbHVlcyAodHlwaWNhbGx5IDIgdG8gNCkuCi1JZiB5b3UgYXJlIGdvaW5nIHRvIGFzayBmb3IgYSBoaWdoLXNwZWVkIHByb2Nlc3NpbmcgbW9kZSwgeW91IG1heSBhcyB3ZWxsCi1nbyB0byB0aGUgdHJvdWJsZSBvZiBob25vcmluZyByZWNfb3V0YnVmX2hlaWdodCBzbyBhcyB0byBhdm9pZCBkYXRhIGNvcHlpbmcuCi0oQW4gb3V0cHV0IGJ1ZmZlciBsYXJnZXIgdGhhbiByZWNfb3V0YnVmX2hlaWdodCBsaW5lcyBpcyBPSywgYnV0IHdvbid0Ci1wcm92aWRlIGFueSBtYXRlcmlhbCBzcGVlZCBpbXByb3ZlbWVudCBvdmVyIHRoYXQgaGVpZ2h0LikKLQotCi1TcGVjaWFsIGNvbG9yIHNwYWNlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIEpQRUcgc3RhbmRhcmQgaXRzZWxmIGlzICJjb2xvciBibGluZCIgYW5kIGRvZXNuJ3Qgc3BlY2lmeSBhbnkgcGFydGljdWxhcgotY29sb3Igc3BhY2UuICBJdCBpcyBjdXN0b21hcnkgdG8gY29udmVydCBjb2xvciBkYXRhIHRvIGEgbHVtaW5hbmNlL2Nocm9taW5hbmNlCi1jb2xvciBzcGFjZSBiZWZvcmUgY29tcHJlc3NpbmcsIHNpbmNlIHRoaXMgcGVybWl0cyBncmVhdGVyIGNvbXByZXNzaW9uLiAgVGhlCi1leGlzdGluZyBkZS1mYWN0byBKUEVHIGZpbGUgZm9ybWF0IHN0YW5kYXJkcyBzcGVjaWZ5IFlDYkNyIG9yIGdyYXlzY2FsZSBkYXRhCi0oSkZJRiksIG9yIGdyYXlzY2FsZSwgUkdCLCBZQ2JDciwgQ01ZSywgb3IgWUNDSyAoQWRvYmUpLiAgRm9yIHNwZWNpYWwKLWFwcGxpY2F0aW9ucyBzdWNoIGFzIG11bHRpc3BlY3RyYWwgaW1hZ2VzLCBvdGhlciBjb2xvciBzcGFjZXMgY2FuIGJlIHVzZWQsCi1idXQgaXQgbXVzdCBiZSB1bmRlcnN0b29kIHRoYXQgc3VjaCBmaWxlcyB3aWxsIGJlIHVucG9ydGFibGUuCi0KLVRoZSBKUEVHIGxpYnJhcnkgY2FuIGhhbmRsZSB0aGUgbW9zdCBjb21tb24gY29sb3JzcGFjZSBjb252ZXJzaW9ucyAobmFtZWx5Ci1SR0IgPD0+IFlDYkNyIGFuZCBDTVlLIDw9PiBZQ0NLKS4gIEl0IGNhbiBhbHNvIGRlYWwgd2l0aCBkYXRhIG9mIGFuIHVua25vd24KLWNvbG9yIHNwYWNlLCBwYXNzaW5nIGl0IHRocm91Z2ggd2l0aG91dCBjb252ZXJzaW9uLiAgSWYgeW91IGRlYWwgZXh0ZW5zaXZlbHkKLXdpdGggYW4gdW51c3VhbCBjb2xvciBzcGFjZSwgeW91IGNhbiBlYXNpbHkgZXh0ZW5kIHRoZSBsaWJyYXJ5IHRvIHVuZGVyc3RhbmQKLWFkZGl0aW9uYWwgY29sb3Igc3BhY2VzIGFuZCBwZXJmb3JtIGFwcHJvcHJpYXRlIGNvbnZlcnNpb25zLgotCi1Gb3IgY29tcHJlc3Npb24sIHRoZSBzb3VyY2UgZGF0YSdzIGNvbG9yIHNwYWNlIGlzIHNwZWNpZmllZCBieSBmaWVsZAotaW5fY29sb3Jfc3BhY2UuICBUaGlzIGlzIHRyYW5zZm9ybWVkIHRvIHRoZSBKUEVHIGZpbGUncyBjb2xvciBzcGFjZSBnaXZlbgotYnkganBlZ19jb2xvcl9zcGFjZS4gIGpwZWdfc2V0X2RlZmF1bHRzKCkgY2hvb3NlcyBhIHJlYXNvbmFibGUgSlBFRyBjb2xvcgotc3BhY2UgZGVwZW5kaW5nIG9uIGluX2NvbG9yX3NwYWNlLCBidXQgeW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5IGNhbGxpbmcKLWpwZWdfc2V0X2NvbG9yc3BhY2UoKS4gIE9mIGNvdXJzZSB5b3UgbXVzdCBzZWxlY3QgYSBzdXBwb3J0ZWQgdHJhbnNmb3JtYXRpb24uCi1qY2NvbG9yLmMgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtYXRpb25zOgotCVJHQiA9PiBZQ2JDcgotCVJHQiA9PiBHUkFZU0NBTEUKLQlZQ2JDciA9PiBHUkFZU0NBTEUKLQlDTVlLID0+IFlDQ0sKLXBsdXMgdGhlIG51bGwgdHJhbnNmb3JtczogR1JBWVNDQUxFID0+IEdSQVlTQ0FMRSwgUkdCID0+IFJHQiwKLVlDYkNyID0+IFlDYkNyLCBDTVlLID0+IENNWUssIFlDQ0sgPT4gWUNDSywgYW5kIFVOS05PV04gPT4gVU5LTk9XTi4KLQotVGhlIGRlLWZhY3RvIGZpbGUgZm9ybWF0IHN0YW5kYXJkcyAoSkZJRiBhbmQgQWRvYmUpIHNwZWNpZnkgQVBQbiBtYXJrZXJzIHRoYXQKLWluZGljYXRlIHRoZSBjb2xvciBzcGFjZSBvZiB0aGUgSlBFRyBmaWxlLiAgSXQgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGF0Ci10aGVzZSBhcmUgd3JpdHRlbiBjb3JyZWN0bHksIG9yIG9taXR0ZWQgaWYgdGhlIEpQRUcgZmlsZSdzIGNvbG9yIHNwYWNlIGlzIG5vdAotb25lIG9mIHRoZSBvbmVzIHN1cHBvcnRlZCBieSB0aGUgZGUtZmFjdG8gc3RhbmRhcmRzLiAganBlZ19zZXRfY29sb3JzcGFjZSgpCi13aWxsIHNldCB0aGUgY29tcHJlc3Npb24gcGFyYW1ldGVycyB0byBpbmNsdWRlIG9yIG9taXQgdGhlIEFQUG4gbWFya2VycwotcHJvcGVybHksIHNvIGxvbmcgYXMgaXQgaXMgdG9sZCB0aGUgdHJ1dGggYWJvdXQgdGhlIEpQRUcgY29sb3Igc3BhY2UuCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB3cml0aW5nIHNvbWUgcmFuZG9tIDMtY29tcG9uZW50IGNvbG9yIHNwYWNlIHdpdGhvdXQKLWNvbnZlcnNpb24sIGRvbid0IHRyeSB0byBmYWtlIG91dCB0aGUgbGlicmFyeSBieSBzZXR0aW5nIGluX2NvbG9yX3NwYWNlIGFuZAotanBlZ19jb2xvcl9zcGFjZSB0byBKQ1NfWUNiQ3I7IHVzZSBKQ1NfVU5LTk9XTi4gIFlvdSBtYXkgd2FudCB0byB3cml0ZSBhbgotQVBQbiBtYXJrZXIgb2YgeW91ciBvd24gZGV2aXNpbmcgdG8gaWRlbnRpZnkgdGhlIGNvbG9yc3BhY2UgLS0tIHNlZSAiU3BlY2lhbAotbWFya2VycyIsIGJlbG93LgotCi1XaGVuIHRvbGQgdGhhdCB0aGUgY29sb3Igc3BhY2UgaXMgVU5LTk9XTiwgdGhlIGxpYnJhcnkgd2lsbCBkZWZhdWx0IHRvIHVzaW5nCi1sdW1pbmFuY2UtcXVhbGl0eSBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGZvciBhbGwgY29sb3IgY29tcG9uZW50cy4gIFlvdSBtYXkKLXdlbGwgd2FudCB0byBjaGFuZ2UgdGhlc2UgcGFyYW1ldGVycy4gIFNlZSB0aGUgc291cmNlIGNvZGUgZm9yCi1qcGVnX3NldF9jb2xvcnNwYWNlKCksIGluIGpjcGFyYW0uYywgZm9yIGRldGFpbHMuCi0KLUZvciBkZWNvbXByZXNzaW9uLCB0aGUgSlBFRyBmaWxlJ3MgY29sb3Igc3BhY2UgaXMgZ2l2ZW4gaW4ganBlZ19jb2xvcl9zcGFjZSwKLWFuZCB0aGlzIGlzIHRyYW5zZm9ybWVkIHRvIHRoZSBvdXRwdXQgY29sb3Igc3BhY2Ugb3V0X2NvbG9yX3NwYWNlLgotanBlZ19yZWFkX2hlYWRlcidzIHNldHRpbmcgb2YganBlZ19jb2xvcl9zcGFjZSBjYW4gYmUgcmVsaWVkIG9uIGlmIHRoZSBmaWxlCi1jb25mb3JtcyB0byBKRklGIG9yIEFkb2JlIGNvbnZlbnRpb25zLCBidXQgb3RoZXJ3aXNlIGl0IGlzIG5vIGJldHRlciB0aGFuIGEKLWd1ZXNzLiAgSWYgeW91IGtub3cgdGhlIEpQRUcgZmlsZSdzIGNvbG9yIHNwYWNlIGZvciBjZXJ0YWluLCB5b3UgY2FuIG92ZXJyaWRlCi1qcGVnX3JlYWRfaGVhZGVyJ3MgZ3Vlc3MgYnkgc2V0dGluZyBqcGVnX2NvbG9yX3NwYWNlLiAganBlZ19yZWFkX2hlYWRlciBhbHNvCi1zZWxlY3RzIGEgZGVmYXVsdCBvdXRwdXQgY29sb3Igc3BhY2UgYmFzZWQgb24gKGl0cyBndWVzcyBvZikganBlZ19jb2xvcl9zcGFjZTsKLXNldCBvdXRfY29sb3Jfc3BhY2UgdG8gb3ZlcnJpZGUgdGhpcy4gIEFnYWluLCB5b3UgbXVzdCBzZWxlY3QgYSBzdXBwb3J0ZWQKLXRyYW5zZm9ybWF0aW9uLiAgamRjb2xvci5jIGN1cnJlbnRseSBzdXBwb3J0cwotCVlDYkNyID0+IEdSQVlTQ0FMRQotCVlDYkNyID0+IFJHQgotCUdSQVlTQ0FMRSA9PiBSR0IKLQlZQ0NLID0+IENNWUsKLWFzIHdlbGwgYXMgdGhlIG51bGwgdHJhbnNmb3Jtcy4gIChTaW5jZSBHUkFZU0NBTEU9PlJHQiBpcyBwcm92aWRlZCwgYW4KLWFwcGxpY2F0aW9uIGNhbiBmb3JjZSBncmF5c2NhbGUgSlBFR3MgdG8gbG9vayBsaWtlIGNvbG9yIEpQRUdzIGlmIGl0IG9ubHkKLXdhbnRzIHRvIGhhbmRsZSBvbmUgY2FzZS4pCi0KLVRoZSB0d28tcGFzcyBjb2xvciBxdWFudGl6ZXIsIGpxdWFudDIuYywgaXMgc3BlY2lhbGl6ZWQgdG8gaGFuZGxlIFJHQiBkYXRhCi0oaXQgd2VpZ2h0cyBkaXN0YW5jZXMgYXBwcm9wcmlhdGVseSBmb3IgUkdCIGNvbG9ycykuICBZb3UnbGwgbmVlZCB0byBtb2RpZnkKLXRoZSBjb2RlIGlmIHlvdSB3YW50IHRvIHVzZSBpdCBmb3Igbm9uLVJHQiBvdXRwdXQgY29sb3Igc3BhY2VzLiAgTm90ZSB0aGF0Ci1qcXVhbnQyLmMgaXMgdXNlZCB0byBtYXAgdG8gYW4gYXBwbGljYXRpb24tc3VwcGxpZWQgY29sb3JtYXAgYXMgd2VsbCBhcyBmb3IKLXRoZSBub3JtYWwgdHdvLXBhc3MgY29sb3JtYXAgc2VsZWN0aW9uIHByb2Nlc3MuCi0KLUNBVVRJT046IGl0IGFwcGVhcnMgdGhhdCBBZG9iZSBQaG90b3Nob3Agd3JpdGVzIGludmVydGVkIGRhdGEgaW4gQ01ZSyBKUEVHCi1maWxlczogMCByZXByZXNlbnRzIDEwMCUgaW5rIGNvdmVyYWdlLCByYXRoZXIgdGhhbiAwJSBpbmsgYXMgeW91J2QgZXhwZWN0LgotVGhpcyBpcyBhcmd1YWJseSBhIGJ1ZyBpbiBQaG90b3Nob3AsIGJ1dCBpZiB5b3UgbmVlZCB0byB3b3JrIHdpdGggUGhvdG9zaG9wCi1DTVlLIGZpbGVzLCB5b3Ugd2lsbCBoYXZlIHRvIGRlYWwgd2l0aCBpdCBpbiB5b3VyIGFwcGxpY2F0aW9uLiAgV2UgY2Fubm90Ci0iZml4IiB0aGlzIGluIHRoZSBsaWJyYXJ5IGJ5IGludmVydGluZyB0aGUgZGF0YSBkdXJpbmcgdGhlIENNWUs8PT5ZQ0NLCi10cmFuc2Zvcm0sIGJlY2F1c2UgdGhhdCB3b3VsZCBicmVhayBvdGhlciBhcHBsaWNhdGlvbnMsIG5vdGFibHkgR2hvc3RzY3JpcHQuCi1QaG90b3Nob3AgdmVyc2lvbnMgcHJpb3IgdG8gMy4wIHdyaXRlIEVQUyBmaWxlcyBjb250YWluaW5nIEpQRUctZW5jb2RlZCBDTVlLCi1kYXRhIGluIHRoZSBzYW1lIGludmVydGVkLVlDQ0sgcmVwcmVzZW50YXRpb24gdXNlZCBpbiBiYXJlIEpQRUcgZmlsZXMsIGJ1dAotdGhlIHN1cnJvdW5kaW5nIFBvc3RTY3JpcHQgY29kZSBwZXJmb3JtcyBhbiBpbnZlcnNpb24gdXNpbmcgdGhlIFBTIGltYWdlCi1vcGVyYXRvci4gIEkgYW0gdG9sZCB0aGF0IFBob3Rvc2hvcCAzLjAgd2lsbCB3cml0ZSB1bmludmVydGVkIFlDQ0sgaW4KLUVQUy9KUEVHIGZpbGVzLCBhbmQgd2lsbCBvbWl0IHRoZSBQUy1sZXZlbCBpbnZlcnNpb24uICAoQnV0IHRoZSBkYXRhCi1wb2xhcml0eSB1c2VkIGluIGJhcmUgSlBFRyBmaWxlcyB3aWxsIG5vdCBjaGFuZ2UgaW4gMy4wLikgIEluIGVpdGhlciBjYXNlLAotdGhlIEpQRUcgbGlicmFyeSBtdXN0IG5vdCBpbnZlcnQgdGhlIGRhdGEgaXRzZWxmLCBvciBlbHNlIEdob3N0c2NyaXB0IHdvdWxkCi1yZWFkIHRoZXNlIEVQUyBmaWxlcyBpbmNvcnJlY3RseS4KLQotCi1FcnJvciBoYW5kbGluZwotLS0tLS0tLS0tLS0tLS0KLQotV2hlbiB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyIGlzIHVzZWQsIGFueSBlcnJvciBkZXRlY3RlZCBpbnNpZGUgdGhlIEpQRUcKLXJvdXRpbmVzIHdpbGwgY2F1c2UgYSBtZXNzYWdlIHRvIGJlIHByaW50ZWQgb24gc3RkZXJyLCBmb2xsb3dlZCBieSBleGl0KCkuCi1Zb3UgY2FuIHN1cHBseSB5b3VyIG93biBlcnJvciBoYW5kbGluZyByb3V0aW5lcyB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yCi1hbmQgdG8gY29udHJvbCB0aGUgdHJlYXRtZW50IG9mIG5vbmZhdGFsIHdhcm5pbmdzIGFuZCB0cmFjZS9kZWJ1ZyBtZXNzYWdlcy4KLVRoZSBmaWxlIGV4YW1wbGUuYyBpbGx1c3RyYXRlcyB0aGUgbW9zdCBjb21tb24gY2FzZSwgd2hpY2ggaXMgdG8gaGF2ZSB0aGUKLWFwcGxpY2F0aW9uIHJlZ2FpbiBjb250cm9sIGFmdGVyIGFuIGVycm9yIHJhdGhlciB0aGFuIGV4aXRpbmcuCi0KLVRoZSBKUEVHIGxpYnJhcnkgbmV2ZXIgd3JpdGVzIGFueSBtZXNzYWdlIGRpcmVjdGx5OyBpdCBhbHdheXMgZ29lcyB0aHJvdWdoCi10aGUgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMuICBUaHJlZSBjbGFzc2VzIG9mIG1lc3NhZ2VzIGFyZSByZWNvZ25pemVkOgotICAqIEZhdGFsIGVycm9yczogdGhlIGxpYnJhcnkgY2Fubm90IGNvbnRpbnVlLgotICAqIFdhcm5pbmdzOiB0aGUgbGlicmFyeSBjYW4gY29udGludWUsIGJ1dCB0aGUgZGF0YSBpcyBjb3JydXB0LCBhbmQgYQotICAgIGRhbWFnZWQgb3V0cHV0IGltYWdlIGlzIGxpa2VseSB0byByZXN1bHQuCi0gICogVHJhY2UvaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4gIFRoZXNlIGNvbWUgd2l0aCBhIHRyYWNlIGxldmVsIGluZGljYXRpbmcKLSAgICB0aGUgaW1wb3J0YW5jZSBvZiB0aGUgbWVzc2FnZTsgeW91IGNhbiBjb250cm9sIHRoZSB2ZXJib3NpdHkgb2YgdGhlCi0gICAgcHJvZ3JhbSBieSBhZGp1c3RpbmcgdGhlIG1heGltdW0gdHJhY2UgbGV2ZWwgdGhhdCB3aWxsIGJlIGRpc3BsYXllZC4KLQotWW91IG1heSwgaWYgeW91IHdpc2gsIHNpbXBseSByZXBsYWNlIHRoZSBlbnRpcmUgSlBFRyBlcnJvciBoYW5kbGluZyBtb2R1bGUKLShqZXJyb3IuYykgd2l0aCB5b3VyIG93biBjb2RlLiAgSG93ZXZlciwgeW91IGNhbiBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uIGJ5Ci1vbmx5IHJlcGxhY2luZyBzb21lIG9mIHRoZSByb3V0aW5lcyBkZXBlbmRpbmcgb24gdGhlIGJlaGF2aW9yIHlvdSBuZWVkLgotVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgY2FsbGluZyBqcGVnX3N0ZF9lcnJvcigpIGFzIHVzdWFsLCBidXQgdGhlbiBvdmVycmlkaW5nCi1zb21lIG9mIHRoZSBtZXRob2QgcG9pbnRlcnMgaW4gdGhlIGpwZWdfZXJyb3JfbWdyIHN0cnVjdCwgYXMgaWxsdXN0cmF0ZWQgYnkKLWV4YW1wbGUuYy4KLQotQWxsIG9mIHRoZSBlcnJvciBoYW5kbGluZyByb3V0aW5lcyB3aWxsIHJlY2VpdmUgYSBwb2ludGVyIHRvIHRoZSBKUEVHIG9iamVjdAotKGEgal9jb21tb25fcHRyIHdoaWNoIHBvaW50cyB0byBlaXRoZXIgYSBqcGVnX2NvbXByZXNzX3N0cnVjdCBvciBhCi1qcGVnX2RlY29tcHJlc3Nfc3RydWN0OyBpZiB5b3UgbmVlZCB0byB0ZWxsIHdoaWNoLCB0ZXN0IHRoZSBpc19kZWNvbXByZXNzb3IKLWZpZWxkKS4gIFRoaXMgc3RydWN0IGluY2x1ZGVzIGEgcG9pbnRlciB0byB0aGUgZXJyb3IgbWFuYWdlciBzdHJ1Y3QgaW4gaXRzCi0iZXJyIiBmaWVsZC4gIEZyZXF1ZW50bHksIGN1c3RvbSBlcnJvciBoYW5kbGVyIHJvdXRpbmVzIHdpbGwgbmVlZCB0byBhY2Nlc3MKLWFkZGl0aW9uYWwgZGF0YSB3aGljaCBpcyBub3Qga25vd24gdG8gdGhlIEpQRUcgbGlicmFyeSBvciB0aGUgc3RhbmRhcmQgZXJyb3IKLWhhbmRsZXIuICBUaGUgbW9zdCBjb252ZW5pZW50IHdheSB0byBkbyB0aGlzIGlzIHRvIGVtYmVkIGVpdGhlciB0aGUgSlBFRwotb2JqZWN0IG9yIHRoZSBqcGVnX2Vycm9yX21nciBzdHJ1Y3QgaW4gYSBsYXJnZXIgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKLWFkZGl0aW9uYWwgZmllbGRzOyB0aGVuIGNhc3RpbmcgdGhlIHBhc3NlZCBwb2ludGVyIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUKLWFkZGl0aW9uYWwgZmllbGRzLiAgQWdhaW4sIHNlZSBleGFtcGxlLmMgZm9yIG9uZSB3YXkgdG8gZG8gaXQuICAoQmVnaW5uaW5nCi13aXRoIElKRyB2ZXJzaW9uIDZiLCB0aGVyZSBpcyBhbHNvIGEgdm9pZCBwb2ludGVyICJjbGllbnRfZGF0YSIgaW4gZWFjaAotSlBFRyBvYmplY3QsIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBjYW4gYWxzbyB1c2UgdG8gZmluZCByZWxhdGVkIGRhdGEuCi1UaGUgbGlicmFyeSBkb2VzIG5vdCB0b3VjaCBjbGllbnRfZGF0YSBhdCBhbGwuKQotCi1UaGUgaW5kaXZpZHVhbCBtZXRob2RzIHRoYXQgeW91IG1pZ2h0IHdpc2ggdG8gb3ZlcnJpZGUgYXJlOgotCi1lcnJvcl9leGl0IChqX2NvbW1vbl9wdHIgY2luZm8pCi0JUmVjZWl2ZXMgY29udHJvbCBmb3IgYSBmYXRhbCBlcnJvci4gIEluZm9ybWF0aW9uIHN1ZmZpY2llbnQgdG8KLQlnZW5lcmF0ZSB0aGUgZXJyb3IgbWVzc2FnZSBoYXMgYmVlbiBzdG9yZWQgaW4gY2luZm8tPmVycjsgY2FsbAotCW91dHB1dF9tZXNzYWdlIHRvIGRpc3BsYXkgaXQuICBDb250cm9sIG11c3QgTk9UIHJldHVybiB0byB0aGUgY2FsbGVyOwotCWdlbmVyYWxseSB0aGlzIHJvdXRpbmUgd2lsbCBleGl0KCkgb3IgbG9uZ2ptcCgpIHNvbWV3aGVyZS4KLQlUeXBpY2FsbHkgeW91IHdvdWxkIG92ZXJyaWRlIHRoaXMgcm91dGluZSB0byBnZXQgcmlkIG9mIHRoZSBleGl0KCkKLQlkZWZhdWx0IGJlaGF2aW9yLiAgTm90ZSB0aGF0IGlmIHlvdSBjb250aW51ZSBwcm9jZXNzaW5nLCB5b3Ugc2hvdWxkCi0JY2xlYW4gdXAgdGhlIEpQRUcgb2JqZWN0IHdpdGgganBlZ19hYm9ydCgpIG9yIGpwZWdfZGVzdHJveSgpLgotCi1vdXRwdXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvKQotCUFjdHVhbCBvdXRwdXQgb2YgYW55IEpQRUcgbWVzc2FnZS4gIE92ZXJyaWRlIHRoaXMgdG8gc2VuZCBtZXNzYWdlcwotCXNvbWV3aGVyZSBvdGhlciB0aGFuIHN0ZGVyci4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBrbm93Ci0JaG93IHRvIGdlbmVyYXRlIGEgbWVzc2FnZSwgb25seSB3aGVyZSB0byBzZW5kIGl0LgotCi1mb3JtYXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvLCBjaGFyICogYnVmZmVyKQotCUNvbnN0cnVjdHMgYSByZWFkYWJsZSBlcnJvciBtZXNzYWdlIHN0cmluZyBiYXNlZCBvbiB0aGUgZXJyb3IgaW5mbwotCXN0b3JlZCBpbiBjaW5mby0+ZXJyLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IG91dHB1dF9tZXNzYWdlLiAgRmV3Ci0JYXBwbGljYXRpb25zIHNob3VsZCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiAgT25lIHBvc3NpYmxlCi0JcmVhc29uIGZvciBkb2luZyBzbyBpcyB0byBpbXBsZW1lbnQgZHluYW1pYyBzd2l0Y2hpbmcgb2YgZXJyb3IgbWVzc2FnZQotCWxhbmd1YWdlLgotCi1lbWl0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IG1zZ19sZXZlbCkKLQlEZWNpZGUgd2hldGhlciBvciBub3QgdG8gZW1pdCBhIHdhcm5pbmcgb3IgdHJhY2UgbWVzc2FnZTsgaWYgc28sCi0JY2FsbHMgb3V0cHV0X21lc3NhZ2UuICBUaGUgbWFpbiByZWFzb24gZm9yIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QKLQl3b3VsZCBiZSB0byBhYm9ydCBvbiB3YXJuaW5ncy4gIG1zZ19sZXZlbCBpcyAtMSBmb3Igd2FybmluZ3MsCi0JMCBhbmQgdXAgZm9yIHRyYWNlIG1lc3NhZ2VzLgotCi1Pbmx5IGVycm9yX2V4aXQoKSBhbmQgZW1pdF9tZXNzYWdlKCkgYXJlIGNhbGxlZCBmcm9tIHRoZSByZXN0IG9mIHRoZSBKUEVHCi1saWJyYXJ5OyB0aGUgb3RoZXIgdHdvIGFyZSBpbnRlcm5hbCB0byB0aGUgZXJyb3IgaGFuZGxlci4KLQotVGhlIGFjdHVhbCBtZXNzYWdlIHRleHRzIGFyZSBzdG9yZWQgaW4gYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aGljaCBpcyBwb2ludGVkIHRvCi1ieSB0aGUgZmllbGQgZXJyLT5qcGVnX21lc3NhZ2VfdGFibGUuICBUaGUgbWVzc2FnZXMgYXJlIG51bWJlcmVkIGZyb20gMCB0bwotZXJyLT5sYXN0X2pwZWdfbWVzc2FnZSwgYW5kIGl0IGlzIHRoZXNlIGNvZGUgbnVtYmVycyB0aGF0IGFyZSB1c2VkIGluIHRoZQotSlBFRyBsaWJyYXJ5IGNvZGUuICBZb3UgY291bGQgcmVwbGFjZSB0aGUgbWVzc2FnZSB0ZXh0cyAoZm9yIGluc3RhbmNlLCB3aXRoCi1tZXNzYWdlcyBpbiBGcmVuY2ggb3IgR2VybWFuKSBieSBjaGFuZ2luZyB0aGUgbWVzc2FnZSB0YWJsZSBwb2ludGVyLiAgU2VlCi1qZXJyb3IuaCBmb3IgdGhlIGRlZmF1bHQgdGV4dHMuICBDQVVUSU9OOiB0aGlzIHRhYmxlIHdpbGwgYWxtb3N0IGNlcnRhaW5seQotY2hhbmdlIG9yIGdyb3cgZnJvbSBvbmUgbGlicmFyeSB2ZXJzaW9uIHRvIHRoZSBuZXh0LgotCi1JdCBtYXkgYmUgdXNlZnVsIGZvciBhbiBhcHBsaWNhdGlvbiB0byBhZGQgaXRzIG93biBtZXNzYWdlIHRleHRzIHRoYXQgYXJlCi1oYW5kbGVkIGJ5IHRoZSBzYW1lIG1lY2hhbmlzbS4gIFRoZSBlcnJvciBoYW5kbGVyIHN1cHBvcnRzIGEgc2Vjb25kICJhZGQtb24iCi1tZXNzYWdlIHRhYmxlIGZvciB0aGlzIHB1cnBvc2UuICBUbyBkZWZpbmUgYW4gYWRkb24gdGFibGUsIHNldCB0aGUgcG9pbnRlcgotZXJyLT5hZGRvbl9tZXNzYWdlX3RhYmxlIGFuZCB0aGUgbWVzc2FnZSBudW1iZXJzIGVyci0+Zmlyc3RfYWRkb25fbWVzc2FnZSBhbmQKLWVyci0+bGFzdF9hZGRvbl9tZXNzYWdlLiAgSWYgeW91IG51bWJlciB0aGUgYWRkb24gbWVzc2FnZXMgYmVnaW5uaW5nIGF0IDEwMDAKLW9yIHNvLCB5b3Ugd29uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBjb25mbGljdHMgd2l0aCB0aGUgbGlicmFyeSdzIGJ1aWx0LWluCi1tZXNzYWdlcy4gIFNlZSB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBjanBlZy9kanBlZyBmb3IgYW4gZXhhbXBsZSBvZiB1c2luZwotYWRkb24gbWVzc2FnZXMgKHRoZSBhZGRvbiBtZXNzYWdlcyBhcmUgZGVmaW5lZCBpbiBjZGVycm9yLmgpLgotCi1BY3R1YWwgaW52b2NhdGlvbiBvZiB0aGUgZXJyb3IgaGFuZGxlciBpcyBkb25lIHZpYSBtYWNyb3MgZGVmaW5lZCBpbiBqZXJyb3IuaDoKLQlFUlJFWElUbiguLi4pCWZvciBmYXRhbCBlcnJvcnMKLQlXQVJOTVNuKC4uLikJZm9yIGNvcnJ1cHQtZGF0YSB3YXJuaW5ncwotCVRSQUNFTVNuKC4uLikJZm9yIHRyYWNlIGFuZCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotVGhlc2UgbWFjcm9zIHN0b3JlIHRoZSBtZXNzYWdlIGNvZGUgYW5kIGFueSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgaW50byB0aGUKLWVycm9yIGhhbmRsZXIgc3RydWN0LCB0aGVuIGludm9rZSB0aGUgZXJyb3JfZXhpdCgpIG9yIGVtaXRfbWVzc2FnZSgpIG1ldGhvZC4KLVRoZSB2YXJpYW50cyBvZiBlYWNoIG1hY3JvIGFyZSBmb3IgdmFyeWluZyBudW1iZXJzIG9mIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4KLVRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIGluc2VydGVkIGludG8gdGhlIGdlbmVyYXRlZCBtZXNzYWdlIHVzaW5nCi1zdGFuZGFyZCBwcmludGYoKSBmb3JtYXQgY29kZXMuCi0KLVNlZSBqZXJyb3IuaCBhbmQgamVycm9yLmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KLQotCi1Db21wcmVzc2VkIGRhdGEgaGFuZGxpbmcgKHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWFuYWdlcnMpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBKUEVHIGNvbXByZXNzaW9uIGxpYnJhcnkgc2VuZHMgaXRzIGNvbXByZXNzZWQgZGF0YSB0byBhICJkZXN0aW5hdGlvbgotbWFuYWdlciIgbW9kdWxlLiAgVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gbWFuYWdlciBqdXN0IHdyaXRlcyB0aGUgZGF0YSB0byBhCi1zdGRpbyBzdHJlYW0sIGJ1dCB5b3UgY2FuIHByb3ZpZGUgeW91ciBvd24gbWFuYWdlciB0byBkbyBzb21ldGhpbmcgZWxzZS4KLVNpbWlsYXJseSwgdGhlIGRlY29tcHJlc3Npb24gbGlicmFyeSBjYWxscyBhICJzb3VyY2UgbWFuYWdlciIgdG8gb2J0YWluIHRoZQotY29tcHJlc3NlZCBkYXRhOyB5b3UgY2FuIHByb3ZpZGUgeW91ciBvd24gc291cmNlIG1hbmFnZXIgaWYgeW91IHdhbnQgdGhlIGRhdGEKLXRvIGNvbWUgZnJvbSBzb21ld2hlcmUgb3RoZXIgdGhhbiBhIHN0ZGlvIHN0cmVhbS4KLQotSW4gYm90aCBjYXNlcywgY29tcHJlc3NlZCBkYXRhIGlzIHByb2Nlc3NlZCBhIGJ1ZmZlcmxvYWQgYXQgYSB0aW1lOiB0aGUKLWRlc3RpbmF0aW9uIG9yIHNvdXJjZSBtYW5hZ2VyIHByb3ZpZGVzIGEgd29yayBidWZmZXIsIGFuZCB0aGUgbGlicmFyeSBpbnZva2VzCi10aGUgbWFuYWdlciBvbmx5IHdoZW4gdGhlIGJ1ZmZlciBpcyBmaWxsZWQgb3IgZW1wdGllZC4gIChZb3UgY291bGQgZGVmaW5lIGEKLW9uZS1jaGFyYWN0ZXIgYnVmZmVyIHRvIGZvcmNlIHRoZSBtYW5hZ2VyIHRvIGJlIGludm9rZWQgZm9yIGVhY2ggYnl0ZSwgYnV0Ci10aGF0IHdvdWxkIGJlIHJhdGhlciBpbmVmZmljaWVudC4pICBUaGUgYnVmZmVyJ3Mgc2l6ZSBhbmQgbG9jYXRpb24gYXJlCi1jb250cm9sbGVkIGJ5IHRoZSBtYW5hZ2VyLCBub3QgYnkgdGhlIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwgaWYgeW91IGRlc2lyZWQgdG8KLWRlY29tcHJlc3MgYSBKUEVHIGRhdGFzdHJlYW0gdGhhdCB3YXMgYWxsIGluIG1lbW9yeSwgeW91IGNvdWxkIGp1c3QgbWFrZSB0aGUKLWJ1ZmZlciBwb2ludGVyIGFuZCBsZW5ndGggcG9pbnQgdG8gdGhlIG9yaWdpbmFsIGRhdGEgaW4gbWVtb3J5LiAgVGhlbiB0aGUKLWJ1ZmZlci1yZWxvYWQgcHJvY2VkdXJlIHdvdWxkIGJlIGludm9rZWQgb25seSBpZiB0aGUgZGVjb21wcmVzc29yIHJhbiBvZmYgdGhlCi1lbmQgb2YgdGhlIGRhdGFzdHJlYW0sIHdoaWNoIHdvdWxkIGluZGljYXRlIGFuIGVycm9uZW91cyBkYXRhc3RyZWFtLgotCi1UaGUgd29yayBidWZmZXIgaXMgZGVmaW5lZCBhcyBhbiBhcnJheSBvZiBkYXRhdHlwZSBKT0NURVQsIHdoaWNoIGlzIGdlbmVyYWxseQotImNoYXIiIG9yICJ1bnNpZ25lZCBjaGFyIi4gIE9uIGEgbWFjaGluZSB3aGVyZSBjaGFyIGlzIG5vdCBleGFjdGx5IDggYml0cwotd2lkZSwgeW91IG11c3QgZGVmaW5lIEpPQ1RFVCBhcyBhIHdpZGVyIGRhdGEgdHlwZSBhbmQgdGhlbiBtb2RpZnkgdGhlIGRhdGEKLXNvdXJjZSBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyB0byB0cmFuc2NyaWJlIHRoZSB3b3JrIGFycmF5cyBpbnRvIDgtYml0IHVuaXRzCi1vbiBleHRlcm5hbCBzdG9yYWdlLgotCi1BIGRhdGEgZGVzdGluYXRpb24gbWFuYWdlciBzdHJ1Y3QgY29udGFpbnMgYSBwb2ludGVyIGFuZCBjb3VudCBkZWZpbmluZyB0aGUKLW5leHQgYnl0ZSB0byB3cml0ZSBpbiB0aGUgd29yayBidWZmZXIgYW5kIHRoZSByZW1haW5pbmcgZnJlZSBzcGFjZToKLQotCUpPQ1RFVCAqIG5leHRfb3V0cHV0X2J5dGU7ICAvKiA9PiBuZXh0IGJ5dGUgdG8gd3JpdGUgaW4gYnVmZmVyICovCi0Jc2l6ZV90IGZyZWVfaW5fYnVmZmVyOyAgICAgIC8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLwotCi1UaGUgbGlicmFyeSBpbmNyZW1lbnRzIHRoZSBwb2ludGVyIGFuZCBkZWNyZW1lbnRzIHRoZSBjb3VudCB1bnRpbCB0aGUgYnVmZmVyCi1pcyBmaWxsZWQuICBUaGUgbWFuYWdlcidzIGVtcHR5X291dHB1dF9idWZmZXIgbWV0aG9kIG11c3QgcmVzZXQgdGhlIHBvaW50ZXIKLWFuZCBjb3VudC4gIFRoZSBtYW5hZ2VyIGlzIGV4cGVjdGVkIHRvIHJlbWVtYmVyIHRoZSBidWZmZXIncyBzdGFydGluZyBhZGRyZXNzCi1hbmQgdG90YWwgc2l6ZSBpbiBwcml2YXRlIGZpZWxkcyBub3QgdmlzaWJsZSB0byB0aGUgbGlicmFyeS4KLQotQSBkYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXIgcHJvdmlkZXMgdGhyZWUgbWV0aG9kczoKLQotaW5pdF9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCi0JSW5pdGlhbGl6ZSBkZXN0aW5hdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IGpwZWdfc3RhcnRfY29tcHJlc3MoKQotCWJlZm9yZSBhbnkgZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuLiAgSXQgbXVzdCBpbml0aWFsaXplCi0JbmV4dF9vdXRwdXRfYnl0ZSBhbmQgZnJlZV9pbl9idWZmZXIuICBmcmVlX2luX2J1ZmZlciBtdXN0IGJlCi0JaW5pdGlhbGl6ZWQgdG8gYSBwb3NpdGl2ZSB2YWx1ZS4KLQotZW1wdHlfb3V0cHV0X2J1ZmZlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi0JVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGJ1ZmZlciBoYXMgZmlsbGVkIChmcmVlX2luX2J1ZmZlcgotCXJlYWNoZXMgemVybykuICBJbiB0eXBpY2FsIGFwcGxpY2F0aW9ucywgaXQgc2hvdWxkIHdyaXRlIG91dCB0aGUKLQkqZW50aXJlKiBidWZmZXIgKHVzZSB0aGUgc2F2ZWQgc3RhcnQgYWRkcmVzcyBhbmQgYnVmZmVyIGxlbmd0aDsKLQlpZ25vcmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9vdXRwdXRfYnl0ZSBhbmQgZnJlZV9pbl9idWZmZXIpLgotCVRoZW4gcmVzZXQgdGhlIHBvaW50ZXIgJiBjb3VudCB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciwgYW5kCi0JcmV0dXJuIFRSVUUgaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gZHVtcGVkLgotCWZyZWVfaW5fYnVmZmVyIG11c3QgYmUgc2V0IHRvIGEgcG9zaXRpdmUgdmFsdWUgd2hlbiBUUlVFIGlzCi0JcmV0dXJuZWQuICBBIEZBTFNFIHJldHVybiBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gSS9PIHN1c3BlbnNpb24gaXMKLQlkZXNpcmVkICh0aGlzIG9wZXJhdGluZyBtb2RlIGlzIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uKS4KLQotdGVybV9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCi0JVGVybWluYXRlIGRlc3RpbmF0aW9uIC0tLSBjYWxsZWQgYnkganBlZ19maW5pc2hfY29tcHJlc3MoKSBhZnRlciBhbGwKLQlkYXRhIGhhcyBiZWVuIHdyaXR0ZW4uICBJbiBtb3N0IGFwcGxpY2F0aW9ucywgdGhpcyBtdXN0IGZsdXNoIGFueQotCWRhdGEgcmVtYWluaW5nIGluIHRoZSBidWZmZXIuICBVc2UgZWl0aGVyIG5leHRfb3V0cHV0X2J5dGUgb3IKLQlmcmVlX2luX2J1ZmZlciB0byBkZXRlcm1pbmUgaG93IG11Y2ggZGF0YSBpcyBpbiB0aGUgYnVmZmVyLgotCi10ZXJtX2Rlc3RpbmF0aW9uKCkgaXMgTk9UIGNhbGxlZCBieSBqcGVnX2Fib3J0KCkgb3IganBlZ19kZXN0cm95KCkuICBJZiB5b3UKLXdhbnQgdGhlIGRlc3RpbmF0aW9uIG1hbmFnZXIgdG8gYmUgY2xlYW5lZCB1cCBkdXJpbmcgYW4gYWJvcnQsIHlvdSBtdXN0IGRvIGl0Ci15b3Vyc2VsZi4KLQotWW91IHdpbGwgYWxzbyBuZWVkIGNvZGUgdG8gY3JlYXRlIGEganBlZ19kZXN0aW5hdGlvbl9tZ3Igc3RydWN0LCBmaWxsIGluIGl0cwotbWV0aG9kIHBvaW50ZXJzLCBhbmQgaW5zZXJ0IGEgcG9pbnRlciB0byB0aGUgc3RydWN0IGludG8gdGhlICJkZXN0IiBmaWVsZCBvZgotdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LiAgVGhpcyBjYW4gYmUgZG9uZSBpbi1saW5lIGluIHlvdXIgc2V0dXAgY29kZSBpZgoteW91IGxpa2UsIGJ1dCBpdCdzIHByb2JhYmx5IGNsZWFuZXIgdG8gcHJvdmlkZSBhIHNlcGFyYXRlIHJvdXRpbmUgc2ltaWxhciB0bwotdGhlIGpwZWdfc3RkaW9fZGVzdCgpIHJvdXRpbmUgb2YgdGhlIHN1cHBsaWVkIGRlc3RpbmF0aW9uIG1hbmFnZXIuCi0KLURlY29tcHJlc3Npb24gc291cmNlIG1hbmFnZXJzIGZvbGxvdyBhIHBhcmFsbGVsIGRlc2lnbiwgYnV0IHdpdGggc29tZQotYWRkaXRpb25hbCBmcmFtbWlzaGVzLiAgVGhlIHNvdXJjZSBtYW5hZ2VyIHN0cnVjdCBjb250YWlucyBhIHBvaW50ZXIgYW5kIGNvdW50Ci1kZWZpbmluZyB0aGUgbmV4dCBieXRlIHRvIHJlYWQgZnJvbSB0aGUgd29yayBidWZmZXIgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMKLXJlbWFpbmluZzoKLQotCWNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZTsgLyogPT4gbmV4dCBieXRlIHRvIHJlYWQgZnJvbSBidWZmZXIgKi8KLQlzaXplX3QgYnl0ZXNfaW5fYnVmZmVyOyAgICAgICAgIC8qICMgb2YgYnl0ZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLwotCi1UaGUgbGlicmFyeSBpbmNyZW1lbnRzIHRoZSBwb2ludGVyIGFuZCBkZWNyZW1lbnRzIHRoZSBjb3VudCB1bnRpbCB0aGUgYnVmZmVyCi1pcyBlbXB0aWVkLiAgVGhlIG1hbmFnZXIncyBmaWxsX2lucHV0X2J1ZmZlciBtZXRob2QgbXVzdCByZXNldCB0aGUgcG9pbnRlciBhbmQKLWNvdW50LiAgSW4gbW9zdCBhcHBsaWNhdGlvbnMsIHRoZSBtYW5hZ2VyIG11c3QgcmVtZW1iZXIgdGhlIGJ1ZmZlcidzIHN0YXJ0aW5nCi1hZGRyZXNzIGFuZCB0b3RhbCBzaXplIGluIHByaXZhdGUgZmllbGRzIG5vdCB2aXNpYmxlIHRvIHRoZSBsaWJyYXJ5LgotCi1BIGRhdGEgc291cmNlIG1hbmFnZXIgcHJvdmlkZXMgZml2ZSBtZXRob2RzOgotCi1pbml0X3NvdXJjZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLQlJbml0aWFsaXplIHNvdXJjZS4gIFRoaXMgaXMgY2FsbGVkIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKSBiZWZvcmUgYW55Ci0JZGF0YSBpcyBhY3R1YWxseSByZWFkLiAgVW5saWtlIGluaXRfZGVzdGluYXRpb24oKSwgaXQgbWF5IGxlYXZlCi0JYnl0ZXNfaW5fYnVmZmVyIHNldCB0byAwIChpbiB3aGljaCBjYXNlIGEgZmlsbF9pbnB1dF9idWZmZXIoKSBjYWxsCi0Jd2lsbCBvY2N1ciBpbW1lZGlhdGVseSkuCi0KLWZpbGxfaW5wdXRfYnVmZmVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotCVRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIGJ5dGVzX2luX2J1ZmZlciBoYXMgcmVhY2hlZCB6ZXJvIGFuZCBtb3JlCi0JZGF0YSBpcyB3YW50ZWQuICBJbiB0eXBpY2FsIGFwcGxpY2F0aW9ucywgaXQgc2hvdWxkIHJlYWQgZnJlc2ggZGF0YQotCWludG8gdGhlIGJ1ZmZlciAoaWdub3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9pbnB1dF9ieXRlIGFuZAotCWJ5dGVzX2luX2J1ZmZlciksIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZQotCWJ1ZmZlciwgYW5kIHJldHVybiBUUlVFIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuIHJlbG9hZGVkLgotCUl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZmlsbCB0aGUgYnVmZmVyIGVudGlyZWx5LCBvbmx5IHRvIG9idGFpbiBhdAotCWxlYXN0IG9uZSBtb3JlIGJ5dGUuICBieXRlc19pbl9idWZmZXIgTVVTVCBiZSBzZXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZQotCWlmIFRSVUUgaXMgcmV0dXJuZWQuICBBIEZBTFNFIHJldHVybiBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gSS9PCi0Jc3VzcGVuc2lvbiBpcyBkZXNpcmVkICh0aGlzIG1vZGUgaXMgZGlzY3Vzc2VkIGluIHRoZSBuZXh0IHNlY3Rpb24pLgotCi1za2lwX2lucHV0X2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGxvbmcgbnVtX2J5dGVzKQotCVNraXAgbnVtX2J5dGVzIHdvcnRoIG9mIGRhdGEuICBUaGUgYnVmZmVyIHBvaW50ZXIgYW5kIGNvdW50IHNob3VsZAotCWJlIGFkdmFuY2VkIG92ZXIgbnVtX2J5dGVzIGlucHV0IGJ5dGVzLCByZWZpbGxpbmcgdGhlIGJ1ZmZlciBhcwotCW5lZWRlZC4gIFRoaXMgaXMgdXNlZCB0byBza2lwIG92ZXIgYSBwb3RlbnRpYWxseSBsYXJnZSBhbW91bnQgb2YKLQl1bmludGVyZXN0aW5nIGRhdGEgKHN1Y2ggYXMgYW4gQVBQbiBtYXJrZXIpLiAgSW4gc29tZSBhcHBsaWNhdGlvbnMKLQlpdCBtYXkgYmUgcG9zc2libGUgdG8gb3B0aW1pemUgYXdheSB0aGUgcmVhZGluZyBvZiB0aGUgc2tpcHBlZCBkYXRhLAotCWJ1dCBpdCdzIG5vdCBjbGVhciB0aGF0IGJlaW5nIHNtYXJ0IGlzIHdvcnRoIG11Y2ggdHJvdWJsZTsgbGFyZ2UKLQlza2lwcyBhcmUgdW5jb21tb24uICBieXRlc19pbl9idWZmZXIgbWF5IGJlIHplcm8gb24gcmV0dXJuLgotCUEgemVybyBvciBuZWdhdGl2ZSBza2lwIGNvdW50IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgbm8tb3AuCi0KLXJlc3luY190b19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgZGVzaXJlZCkKLQlUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgZGVjb21wcmVzc29yIGhhcyBmYWlsZWQgdG8gZmluZAotCWEgcmVzdGFydCAoUlNUbikgbWFya2VyIHdoZXJlIG9uZSBpcyBleHBlY3RlZC4gIEl0cyBtaXNzaW9uIGlzIHRvCi0JZmluZCBhIHN1aXRhYmxlIHBvaW50IGZvciByZXN1bWluZyBkZWNvbXByZXNzaW9uLiAgRm9yIG1vc3QKLQlhcHBsaWNhdGlvbnMsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBqdXN0IHVzZSB0aGUgZGVmYXVsdCByZXN5bmMKLQlwcm9jZWR1cmUsIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQoKS4gIEhvd2V2ZXIsIGlmIHlvdSBhcmUgYWJsZSB0byBiYWNrCi0JdXAgaW4gdGhlIGlucHV0IGRhdGEgc3RyZWFtLCBvciBpZiB5b3UgaGF2ZSBhLXByaW9yaSBrbm93bGVkZ2UgYWJvdXQKLQl0aGUgbGlrZWx5IGxvY2F0aW9uIG9mIHJlc3RhcnQgbWFya2VycywgeW91IG1heSBiZSBhYmxlIHRvIGRvIGJldHRlci4KLQlSZWFkIHRoZSByZWFkX3Jlc3RhcnRfbWFya2VyKCkgYW5kIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQoKSByb3V0aW5lcwotCWluIGpkbWFya2VyLmMgaWYgeW91IHRoaW5rIHlvdSdkIGxpa2UgdG8gaW1wbGVtZW50IHlvdXIgb3duIHJlc3luYwotCXByb2NlZHVyZS4KLQotdGVybV9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0JVGVybWluYXRlIHNvdXJjZSAtLS0gY2FsbGVkIGJ5IGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBhZnRlciBhbGwKLQlkYXRhIGhhcyBiZWVuIHJlYWQuICBPZnRlbiBhIG5vLW9wLgotCi1Gb3IgYm90aCBmaWxsX2lucHV0X2J1ZmZlcigpIGFuZCBza2lwX2lucHV0X2RhdGEoKSwgdGhlcmUgaXMgbm8gc3VjaCB0aGluZwotYXMgYW4gRU9GIHJldHVybi4gIElmIHRoZSBlbmQgb2YgdGhlIGZpbGUgaGFzIGJlZW4gcmVhY2hlZCwgdGhlIHJvdXRpbmUgaGFzCi1hIGNob2ljZSBvZiBleGl0aW5nIHZpYSBFUlJFWElUKCkgb3IgaW5zZXJ0aW5nIGZha2UgZGF0YSBpbnRvIHRoZSBidWZmZXIuCi1JbiBtb3N0IGNhc2VzLCBnZW5lcmF0aW5nIGEgd2FybmluZyBtZXNzYWdlIGFuZCBpbnNlcnRpbmcgYSBmYWtlIEVPSSBtYXJrZXIKLWlzIHRoZSBiZXN0IGNvdXJzZSBvZiBhY3Rpb24gLS0tIHRoaXMgd2lsbCBhbGxvdyB0aGUgZGVjb21wcmVzc29yIHRvIG91dHB1dAotaG93ZXZlciBtdWNoIG9mIHRoZSBpbWFnZSBpcyB0aGVyZS4gIEluIHBhdGhvbG9naWNhbCBjYXNlcywgdGhlIGRlY29tcHJlc3NvcgotbWF5IHN3YWxsb3cgdGhlIEVPSSBhbmQgYWdhaW4gZGVtYW5kIGRhdGEgLi4uIGp1c3Qga2VlcCBmZWVkaW5nIGl0IGZha2UgRU9Jcy4KLWpkYXRhc3JjLmMgaWxsdXN0cmF0ZXMgdGhlIHJlY29tbWVuZGVkIGVycm9yIHJlY292ZXJ5IGJlaGF2aW9yLgotCi10ZXJtX3NvdXJjZSgpIGlzIE5PVCBjYWxsZWQgYnkganBlZ19hYm9ydCgpIG9yIGpwZWdfZGVzdHJveSgpLiAgSWYgeW91IHdhbnQKLXRoZSBzb3VyY2UgbWFuYWdlciB0byBiZSBjbGVhbmVkIHVwIGR1cmluZyBhbiBhYm9ydCwgeW91IG11c3QgZG8gaXQgeW91cnNlbGYuCi0KLVlvdSB3aWxsIGFsc28gbmVlZCBjb2RlIHRvIGNyZWF0ZSBhIGpwZWdfc291cmNlX21nciBzdHJ1Y3QsIGZpbGwgaW4gaXRzIG1ldGhvZAotcG9pbnRlcnMsIGFuZCBpbnNlcnQgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgaW50byB0aGUgInNyYyIgZmllbGQgb2YgdGhlIEpQRUcKLWRlY29tcHJlc3Npb24gb2JqZWN0LiAgVGhpcyBjYW4gYmUgZG9uZSBpbi1saW5lIGluIHlvdXIgc2V0dXAgY29kZSBpZiB5b3UKLWxpa2UsIGJ1dCBpdCdzIHByb2JhYmx5IGNsZWFuZXIgdG8gcHJvdmlkZSBhIHNlcGFyYXRlIHJvdXRpbmUgc2ltaWxhciB0byB0aGUKLWpwZWdfc3RkaW9fc3JjKCkgcm91dGluZSBvZiB0aGUgc3VwcGxpZWQgc291cmNlIG1hbmFnZXIuCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBjb25zdWx0IHRoZSBzdGRpbyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzCi1pbiBqZGF0YXNyYy5jIGFuZCBqZGF0YWRzdC5jLgotCi0KLUkvTyBzdXNwZW5zaW9uCi0tLS0tLS0tLS0tLS0tLQotCi1Tb21lIGFwcGxpY2F0aW9ucyBuZWVkIHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGFzIGFuIGluY3JlbWVudGFsIG1lbW9yeS10by0KLW1lbW9yeSBmaWx0ZXI6IHdoZW4gdGhlIGNvbXByZXNzZWQgZGF0YSBidWZmZXIgaXMgZmlsbGVkIG9yIGVtcHRpZWQsIHRoZXkgd2FudAotY29udHJvbCB0byByZXR1cm4gdG8gdGhlIG91dGVyIGxvb3AsIHJhdGhlciB0aGFuIGV4cGVjdGluZyB0aGF0IHRoZSBidWZmZXIgY2FuCi1iZSBlbXB0aWVkIG9yIHJlbG9hZGVkIHdpdGhpbiB0aGUgZGF0YSBzb3VyY2UvZGVzdGluYXRpb24gbWFuYWdlciBzdWJyb3V0aW5lLgotVGhlIGxpYnJhcnkgc3VwcG9ydHMgdGhpcyBuZWVkIGJ5IHByb3ZpZGluZyBhbiAiSS9PIHN1c3BlbnNpb24iIG1vZGUsIHdoaWNoIHdlCi1kZXNjcmliZSBpbiB0aGlzIHNlY3Rpb24uCi0KLVRoZSBJL08gc3VzcGVuc2lvbiBtb2RlIGlzIG5vdCBhIHBhbmFjZWE6IG5vdGhpbmcgaXMgZ3VhcmFudGVlZCBhYm91dCB0aGUKLW1heGltdW0gYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gYW55IG9uZSBjYWxsIHRvIHRoZSBsaWJyYXJ5LCBzbyBpdCB3aWxsIG5vdAotZWxpbWluYXRlIHJlc3BvbnNlLXRpbWUgcHJvYmxlbXMgaW4gc2luZ2xlLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gIElmIHlvdQotbmVlZCBndWFyYW50ZWVkIHJlc3BvbnNlIHRpbWUsIHdlIHN1Z2dlc3QgeW91ICJiaXRlIHRoZSBidWxsZXQiIGFuZCBpbXBsZW1lbnQKLWEgcmVhbCBtdWx0aS10YXNraW5nIGNhcGFiaWxpdHkuCi0KLVRvIHVzZSBJL08gc3VzcGVuc2lvbiwgY29vcGVyYXRpb24gaXMgbmVlZGVkIGJldHdlZW4gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24KLWFuZCB0aGUgZGF0YSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gbWFuYWdlcjsgeW91IHdpbGwgYWx3YXlzIG5lZWQgYSBjdXN0b20KLXNvdXJjZS9kZXN0aW5hdGlvbiBtYW5hZ2VyLiAgKFBsZWFzZSByZWFkIHRoZSBwcmV2aW91cyBzZWN0aW9uIGlmIHlvdSBoYXZlbid0Ci1hbHJlYWR5LikgIFRoZSBiYXNpYyBpZGVhIGlzIHRoYXQgdGhlIGVtcHR5X291dHB1dF9idWZmZXIoKSBvcgotZmlsbF9pbnB1dF9idWZmZXIoKSByb3V0aW5lIGlzIGEgbm8tb3AsIG1lcmVseSByZXR1cm5pbmcgRkFMU0UgdG8gaW5kaWNhdGUKLXRoYXQgaXQgaGFzIGRvbmUgbm90aGluZy4gIFVwb24gc2VlaW5nIHRoaXMsIHRoZSBKUEVHIGxpYnJhcnkgc3VzcGVuZHMKLW9wZXJhdGlvbiBhbmQgcmV0dXJucyB0byBpdHMgY2FsbGVyLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIGlzCi1yZXNwb25zaWJsZSBmb3IgZW1wdHlpbmcgb3IgcmVmaWxsaW5nIHRoZSB3b3JrIGJ1ZmZlciBiZWZvcmUgY2FsbGluZyB0aGUKLUpQRUcgbGlicmFyeSBhZ2Fpbi4KLQotQ29tcHJlc3Npb24gc3VzcGVuc2lvbjoKLQotRm9yIGNvbXByZXNzaW9uIHN1c3BlbnNpb24sIHVzZSBhbiBlbXB0eV9vdXRwdXRfYnVmZmVyKCkgcm91dGluZSB0aGF0IHJldHVybnMKLUZBTFNFOyB0eXBpY2FsbHkgaXQgd2lsbCBub3QgZG8gYW55dGhpbmcgZWxzZS4gIFRoaXMgd2lsbCBjYXVzZSB0aGUKLWNvbXByZXNzb3IgdG8gcmV0dXJuIHRvIHRoZSBjYWxsZXIgb2YganBlZ193cml0ZV9zY2FubGluZXMoKSwgd2l0aCB0aGUgcmV0dXJuCi12YWx1ZSBpbmRpY2F0aW5nIHRoYXQgbm90IGFsbCB0aGUgc3VwcGxpZWQgc2NhbmxpbmVzIGhhdmUgYmVlbiBhY2NlcHRlZC4KLVRoZSBhcHBsaWNhdGlvbiBtdXN0IG1ha2UgbW9yZSByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBhZGp1c3QgdGhlIG91dHB1dAotYnVmZmVyIHBvaW50ZXIvY291bnQgYXBwcm9wcmlhdGVseSwgYW5kIHRoZW4gY2FsbCBqcGVnX3dyaXRlX3NjYW5saW5lcygpCi1hZ2FpbiwgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IHVuY29uc3VtZWQgc2NhbmxpbmUuCi0KLVdoZW4gZm9yY2VkIHRvIHN1c3BlbmQsIHRoZSBjb21wcmVzc29yIHdpbGwgYmFja3RyYWNrIHRvIGEgY29udmVuaWVudCBzdG9wcGluZwotcG9pbnQgKHVzdWFsbHkgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVSk7IGl0IHdpbGwgcmVnZW5lcmF0ZSBzb21lIG91dHB1dAotZGF0YSB3aGVuIHJlc3RhcnRlZC4gIFRoZXJlZm9yZSwgYWx0aG91Z2ggZW1wdHlfb3V0cHV0X2J1ZmZlcigpIGlzIG9ubHkKLWNhbGxlZCB3aGVuIHRoZSBidWZmZXIgaXMgZmlsbGVkLCB5b3Ugc2hvdWxkIE5PVCB3cml0ZSBvdXQgdGhlIGVudGlyZSBidWZmZXIKLWFmdGVyIGEgc3VzcGVuc2lvbi4gIFdyaXRlIG9ubHkgdGhlIGRhdGEgdXAgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YKLW5leHRfb3V0cHV0X2J5dGUvZnJlZV9pbl9idWZmZXIuICBUaGUgZGF0YSBiZXlvbmQgdGhhdCBwb2ludCB3aWxsIGJlCi1yZWdlbmVyYXRlZCBhZnRlciByZXN1bXB0aW9uLgotCi1CZWNhdXNlIG9mIHRoZSBiYWNrdHJhY2tpbmcgYmVoYXZpb3IsIGEgZ29vZC1zaXplIG91dHB1dCBidWZmZXIgaXMgZXNzZW50aWFsCi1mb3IgZWZmaWNpZW5jeTsgeW91IGRvbid0IHdhbnQgdGhlIGNvbXByZXNzb3IgdG8gc3VzcGVuZCBvZnRlbi4gIChJbiBmYWN0LCBhbgotb3Zlcmx5IHNtYWxsIGJ1ZmZlciBjb3VsZCBsZWFkIHRvIGluZmluaXRlIGxvb3BpbmcsIGlmIGEgc2luZ2xlIE1DVSByZXF1aXJlZAotbW9yZSBkYXRhIHRoYW4gd291bGQgZml0IGluIHRoZSBidWZmZXIuKSAgV2UgcmVjb21tZW5kIGEgYnVmZmVyIG9mIGF0IGxlYXN0Ci1zZXZlcmFsIEtieXRlcy4gIFlvdSBtYXkgd2FudCB0byBpbnNlcnQgZXhwbGljaXQgY29kZSB0byBlbnN1cmUgdGhhdCB5b3UgZG9uJ3QKLWNhbGwganBlZ193cml0ZV9zY2FubGluZXMoKSB1bmxlc3MgdGhlcmUgaXMgYSByZWFzb25hYmxlIGFtb3VudCBvZiBzcGFjZSBpbgotdGhlIG91dHB1dCBidWZmZXI7IGluIG90aGVyIHdvcmRzLCBmbHVzaCB0aGUgYnVmZmVyIGJlZm9yZSB0cnlpbmcgdG8gY29tcHJlc3MKLW1vcmUgZGF0YS4KLQotVGhlIGNvbXByZXNzb3IgZG9lcyBub3QgYWxsb3cgc3VzcGVuc2lvbiB3aGlsZSBpdCBpcyB0cnlpbmcgdG8gd3JpdGUgSlBFRwotbWFya2VycyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGZpbGUuICBUaGlzIG1lYW5zIHRoYXQ6Ci0gICogQXQgdGhlIGJlZ2lubmluZyBvZiBhIGNvbXByZXNzaW9uIG9wZXJhdGlvbiwgdGhlcmUgbXVzdCBiZSBlbm91Z2ggZnJlZQotICAgIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIHRvIGhvbGQgdGhlIGhlYWRlciBtYXJrZXJzICh0eXBpY2FsbHkgNjAwIG9yCi0gICAgc28gYnl0ZXMpLiAgVGhlIHJlY29tbWVuZGVkIGJ1ZmZlciBzaXplIGlzIGJpZ2dlciB0aGFuIHRoaXMgYW55d2F5LCBzbwotICAgIHRoaXMgaXMgbm90IGEgcHJvYmxlbSBhcyBsb25nIGFzIHlvdSBzdGFydCB3aXRoIGFuIGVtcHR5IGJ1ZmZlci4gIEhvd2V2ZXIsCi0gICAgdGhpcyByZXN0cmljdGlvbiBtaWdodCBjYXRjaCB5b3UgaWYgeW91IGluc2VydCBsYXJnZSBzcGVjaWFsIG1hcmtlcnMsIHN1Y2gKLSAgICBhcyBhIEpGSUYgdGh1bWJuYWlsIGltYWdlLCB3aXRob3V0IGZsdXNoaW5nIHRoZSBidWZmZXIgYWZ0ZXJ3YXJkcy4KLSAgKiBXaGVuIHlvdSBjYWxsIGpwZWdfZmluaXNoX2NvbXByZXNzKCksIHRoZXJlIG11c3QgYmUgZW5vdWdoIHNwYWNlIGluIHRoZQotICAgIG91dHB1dCBidWZmZXIgdG8gZW1pdCBhbnkgYnVmZmVyZWQgZGF0YSBhbmQgdGhlIGZpbmFsIEVPSSBtYXJrZXIuICBJbiB0aGUKLSAgICBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBoYWxmIGEgZG96ZW4gYnl0ZXMgc2hvdWxkIHN1ZmZpY2UgZm9yIHRoaXMsIGJ1dAotICAgIGZvciBzYWZldHkncyBzYWtlIHdlIHJlY29tbWVuZCBlbnN1cmluZyB0aGF0IGF0IGxlYXN0IDEwMCBieXRlcyBhcmUgZnJlZQotICAgIGJlZm9yZSBjYWxsaW5nIGpwZWdfZmluaXNoX2NvbXByZXNzKCkuCi0KLUEgbW9yZSBzaWduaWZpY2FudCByZXN0cmljdGlvbiBpcyB0aGF0IGpwZWdfZmluaXNoX2NvbXByZXNzKCkgY2Fubm90IHN1c3BlbmQuCi1UaGlzIG1lYW5zIHlvdSBjYW5ub3QgdXNlIHN1c3BlbnNpb24gd2l0aCBtdWx0aS1wYXNzIG9wZXJhdGluZyBtb2RlcywgbmFtZWx5Ci1IdWZmbWFuIGNvZGUgb3B0aW1pemF0aW9uIGFuZCBtdWx0aXBsZS1zY2FuIG91dHB1dC4gIFRob3NlIG1vZGVzIHdyaXRlIHRoZQotd2hvbGUgZmlsZSBkdXJpbmcganBlZ19maW5pc2hfY29tcHJlc3MoKSwgd2hpY2ggd2lsbCBjZXJ0YWlubHkgcmVzdWx0IGluCi1idWZmZXIgb3ZlcnJ1bi4gIChOb3RlIHRoYXQgdGhpcyByZXN0cmljdGlvbiBhcHBsaWVzIG9ubHkgdG8gY29tcHJlc3Npb24sCi1ub3QgZGVjb21wcmVzc2lvbi4gIFRoZSBkZWNvbXByZXNzb3Igc3VwcG9ydHMgaW5wdXQgc3VzcGVuc2lvbiBpbiBhbGwgb2YgaXRzCi1vcGVyYXRpbmcgbW9kZXMuKQotCi1EZWNvbXByZXNzaW9uIHN1c3BlbnNpb246Ci0KLUZvciBkZWNvbXByZXNzaW9uIHN1c3BlbnNpb24sIHVzZSBhIGZpbGxfaW5wdXRfYnVmZmVyKCkgcm91dGluZSB0aGF0IHNpbXBseQotcmV0dXJucyBGQUxTRSAoZXhjZXB0IHBlcmhhcHMgZHVyaW5nIGVycm9yIHJlY292ZXJ5LCBhcyBkaXNjdXNzZWQgYmVsb3cpLgotVGhpcyB3aWxsIGNhdXNlIHRoZSBkZWNvbXByZXNzb3IgdG8gcmV0dXJuIHRvIGl0cyBjYWxsZXIgd2l0aCBhbiBpbmRpY2F0aW9uCi10aGF0IHN1c3BlbnNpb24gaGFzIG9jY3VycmVkLiAgVGhpcyBjYW4gaGFwcGVuIGF0IGZvdXIgcGxhY2VzOgotICAqIGpwZWdfcmVhZF9oZWFkZXIoKTogd2lsbCByZXR1cm4gSlBFR19TVVNQRU5ERUQuCi0gICoganBlZ19zdGFydF9kZWNvbXByZXNzKCk6IHdpbGwgcmV0dXJuIEZBTFNFLCByYXRoZXIgdGhhbiBpdHMgdXN1YWwgVFJVRS4KLSAgKiBqcGVnX3JlYWRfc2NhbmxpbmVzKCk6IHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGFscmVhZHkKLQljb21wbGV0ZWQgKHBvc3NpYmx5IDApLgotICAqIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKTogd2lsbCByZXR1cm4gRkFMU0UsIHJhdGhlciB0aGFuIGl0cyB1c3VhbCBUUlVFLgotVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG11c3QgcmVjb2duaXplIHRoZXNlIGNhc2VzLCBsb2FkIG1vcmUgZGF0YSBpbnRvCi10aGUgaW5wdXQgYnVmZmVyLCBhbmQgcmVwZWF0IHRoZSBjYWxsLiAgSW4gdGhlIGNhc2Ugb2YganBlZ19yZWFkX3NjYW5saW5lcygpLAotaW5jcmVtZW50IHRoZSBwYXNzZWQgcG9pbnRlcnMgcGFzdCBhbnkgc2NhbmxpbmVzIHN1Y2Nlc3NmdWxseSByZWFkLgotCi1KdXN0IGFzIHdpdGggY29tcHJlc3Npb24sIHRoZSBkZWNvbXByZXNzb3Igd2lsbCB0eXBpY2FsbHkgYmFja3RyYWNrIHRvIGEKLWNvbnZlbmllbnQgcmVzdGFydCBwb2ludCBiZWZvcmUgc3VzcGVuZGluZy4gIFdoZW4gZmlsbF9pbnB1dF9idWZmZXIoKSBpcwotY2FsbGVkLCBuZXh0X2lucHV0X2J5dGUvYnl0ZXNfaW5fYnVmZmVyIHBvaW50IHRvIHRoZSBjdXJyZW50IHJlc3RhcnQgcG9pbnQsCi13aGljaCBpcyB3aGVyZSB0aGUgZGVjb21wcmVzc29yIHdpbGwgYmFja3RyYWNrIHRvIGlmIEZBTFNFIGlzIHJldHVybmVkLgotVGhlIGRhdGEgYmV5b25kIHRoYXQgcG9zaXRpb24gbXVzdCBOT1QgYmUgZGlzY2FyZGVkIGlmIHlvdSBzdXNwZW5kOyBpdCBuZWVkcwotdG8gYmUgcmUtcmVhZCB1cG9uIHJlc3VtcHRpb24uICBJbiBtb3N0IGltcGxlbWVudGF0aW9ucywgeW91J2xsIG5lZWQgdG8gc2hpZnQKLXRoaXMgZGF0YSBkb3duIHRvIHRoZSBzdGFydCBvZiB5b3VyIHdvcmsgYnVmZmVyIGFuZCB0aGVuIGxvYWQgbW9yZSBkYXRhIGFmdGVyCi1pdC4gIEFnYWluLCB0aGlzIGJlaGF2aW9yIG1lYW5zIHRoYXQgYSBzZXZlcmFsLUtieXRlIHdvcmsgYnVmZmVyIGlzIGVzc2VudGlhbAotZm9yIGRlY2VudCBwZXJmb3JtYW5jZTsgZnVydGhlcm1vcmUsIHlvdSBzaG91bGQgbG9hZCBhIHJlYXNvbmFibGUgYW1vdW50IG9mCi1uZXcgZGF0YSBiZWZvcmUgcmVzdW1pbmcgZGVjb21wcmVzc2lvbi4gIChJZiB5b3UgbG9hZGVkLCBzYXksIG9ubHkgb25lIG5ldwotYnl0ZSBlYWNoIHRpbWUgYXJvdW5kLCB5b3UgY291bGQgd2FzdGUgYSBMT1Qgb2YgY3ljbGVzLikKLQotVGhlIHNraXBfaW5wdXRfZGF0YSgpIHNvdXJjZSBtYW5hZ2VyIHJvdXRpbmUgcmVxdWlyZXMgc3BlY2lhbCBjYXJlIGluIGEKLXN1c3BlbnNpb24gc2NlbmFyaW8uICBUaGlzIHJvdXRpbmUgaXMgTk9UIGdyYW50ZWQgdGhlIGFiaWxpdHkgdG8gc3VzcGVuZCB0aGUKLWRlY29tcHJlc3NvcjsgaXQgY2FuIGRlY3JlbWVudCBieXRlc19pbl9idWZmZXIgdG8gemVybywgYnV0IG5vIG1vcmUuICBJZiB0aGUKLXJlcXVlc3RlZCBza2lwIGRpc3RhbmNlIGV4Y2VlZHMgdGhlIGFtb3VudCBvZiBkYXRhIGN1cnJlbnRseSBpbiB0aGUgaW5wdXQKLWJ1ZmZlciwgdGhlbiBza2lwX2lucHV0X2RhdGEoKSBtdXN0IHNldCBieXRlc19pbl9idWZmZXIgdG8gemVybyBhbmQgcmVjb3JkIHRoZQotYWRkaXRpb25hbCBza2lwIGRpc3RhbmNlIHNvbWV3aGVyZSBlbHNlLiAgVGhlIGRlY29tcHJlc3NvciB3aWxsIGltbWVkaWF0ZWx5Ci1jYWxsIGZpbGxfaW5wdXRfYnVmZmVyKCksIHdoaWNoIHNob3VsZCByZXR1cm4gRkFMU0UsIHdoaWNoIHdpbGwgY2F1c2UgYQotc3VzcGVuc2lvbiByZXR1cm4uICBUaGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbXVzdCB0aGVuIGFycmFuZ2UgdG8gZGlzY2FyZAotdGhlIHJlY29yZGVkIG51bWJlciBvZiBieXRlcyBiZWZvcmUgaXQgcmVzdW1lcyBsb2FkaW5nIHRoZSBpbnB1dCBidWZmZXIuCi0oWWVzLCB0aGlzIGRlc2lnbiBpcyByYXRoZXIgYmFyb3F1ZSwgYnV0IGl0IGF2b2lkcyBjb21wbGV4aXR5IGluIHRoZSBmYXIgbW9yZQotY29tbW9uIGNhc2Ugd2hlcmUgYSBub24tc3VzcGVuZGluZyBzb3VyY2UgbWFuYWdlciBpcyB1c2VkLikKLQotSWYgdGhlIGlucHV0IGRhdGEgaGFzIGJlZW4gZXhoYXVzdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZW1pdCBhIHdhcm5pbmcKLWFuZCBpbnNlcnQgZHVtbXkgRU9JIG1hcmtlcnMganVzdCBhcyBhIG5vbi1zdXNwZW5kaW5nIGRhdGEgc291cmNlIG1hbmFnZXIKLXdvdWxkIGRvLiAgVGhpcyBjYW4gYmUgaGFuZGxlZCBlaXRoZXIgaW4gdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIGxvZ2ljIG9yCi13aXRoaW4gZmlsbF9pbnB1dF9idWZmZXIoKTsgdGhlIGxhdHRlciBpcyBwcm9iYWJseSBtb3JlIGVmZmljaWVudC4gIElmCi1maWxsX2lucHV0X2J1ZmZlcigpIGtub3dzIHRoYXQgbm8gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSwgaXQgY2FuIHNldCB0aGUKLXBvaW50ZXIvY291bnQgdG8gcG9pbnQgdG8gYSBkdW1teSBFT0kgbWFya2VyIGFuZCB0aGVuIHJldHVybiBUUlVFIGp1c3QgYXMKLXRob3VnaCBpdCBoYWQgcmVhZCBtb3JlIGRhdGEgaW4gYSBub24tc3VzcGVuZGluZyBzaXR1YXRpb24uCi0KLVRoZSBkZWNvbXByZXNzb3IgZG9lcyBub3QgYXR0ZW1wdCB0byBzdXNwZW5kIHdpdGhpbiBzdGFuZGFyZCBKUEVHIG1hcmtlcnM7Ci1pbnN0ZWFkIGl0IHdpbGwgYmFja3RyYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgbWFya2VyIGFuZCByZXByb2Nlc3MgdGhlIHdob2xlCi1tYXJrZXIgbmV4dCB0aW1lLiAgSGVuY2UgdGhlIGlucHV0IGJ1ZmZlciBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQotbG9uZ2VzdCBzdGFuZGFyZCBtYXJrZXIgaW4gdGhlIGZpbGUuICBTdGFuZGFyZCBKUEVHIG1hcmtlcnMgc2hvdWxkIG5vcm1hbGx5Ci1ub3QgZXhjZWVkIGEgZmV3IGh1bmRyZWQgYnl0ZXMgZWFjaCAoREhUIHRhYmxlcyBhcmUgdHlwaWNhbGx5IHRoZSBsb25nZXN0KS4KLVdlIHJlY29tbWVuZCBhdCBsZWFzdCBhIDJLIGJ1ZmZlciBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgd2hpY2ggaXMgbXVjaAotbGFyZ2VyIHRoYW4gYW55IGNvcnJlY3QgbWFya2VyIGlzIGxpa2VseSB0byBiZS4gIEZvciByb2J1c3RuZXNzIGFnYWluc3QKLWRhbWFnZWQgbWFya2VyIGxlbmd0aCBjb3VudHMsIHlvdSBtYXkgd2lzaCB0byBpbnNlcnQgYSB0ZXN0IGluIHlvdXIKLWFwcGxpY2F0aW9uIGZvciB0aGUgY2FzZSB0aGF0IHRoZSBpbnB1dCBidWZmZXIgaXMgY29tcGxldGVseSBmdWxsIGFuZCB5ZXQKLXRoZSBkZWNvZGVyIGhhcyBzdXNwZW5kZWQgd2l0aG91dCBjb25zdW1pbmcgYW55IGRhdGEgLS0tIG90aGVyd2lzZSwgaWYgdGhpcwotc2l0dWF0aW9uIGRpZCBvY2N1ciwgaXQgd291bGQgbGVhZCB0byBhbiBlbmRsZXNzIGxvb3AuICAoVGhlIGxpYnJhcnkgY2FuJ3QKLXByb3ZpZGUgdGhpcyB0ZXN0IHNpbmNlIGl0IGhhcyBubyBpZGVhIHdoZXRoZXIgInRoZSBidWZmZXIgaXMgZnVsbCIsIG9yCi1ldmVuIHdoZXRoZXIgdGhlcmUgaXMgYSBmaXhlZC1zaXplIGlucHV0IGJ1ZmZlci4pCi0KLVRoZSBpbnB1dCBidWZmZXIgd291bGQgbmVlZCB0byBiZSA2NEsgdG8gYWxsb3cgZm9yIGFyYml0cmFyeSBDT00gb3IgQVBQbgotbWFya2VycywgYnV0IHRoZXNlIGFyZSBoYW5kbGVkIHNwZWNpYWxseTogdGhleSBhcmUgZWl0aGVyIHNhdmVkIGludG8gYWxsb2NhdGVkCi1tZW1vcnksIG9yIHNraXBwZWQgb3ZlciBieSBjYWxsaW5nIHNraXBfaW5wdXRfZGF0YSgpLiAgSW4gdGhlIGZvcm1lciBjYXNlLAotc3VzcGVuc2lvbiBpcyBoYW5kbGVkIGNvcnJlY3RseSwgYW5kIGluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIHByb2JsZW0gb2YKLWJ1ZmZlciBvdmVycnVuIGlzIHBsYWNlZCBvbiBza2lwX2lucHV0X2RhdGEncyBzaG91bGRlcnMsIGFzIGV4cGxhaW5lZCBhYm92ZS4KLU5vdGUgdGhhdCBpZiB5b3UgcHJvdmlkZSB5b3VyIG93biBtYXJrZXIgaGFuZGxpbmcgcm91dGluZSBmb3IgbGFyZ2UgbWFya2VycywKLXlvdSBzaG91bGQgY29uc2lkZXIgaG93IHRvIGRlYWwgd2l0aCBidWZmZXIgb3ZlcmZsb3cuCi0KLU11bHRpcGxlLWJ1ZmZlciBtYW5hZ2VtZW50OgotCi1JbiBzb21lIGFwcGxpY2F0aW9ucyBpdCBpcyBkZXNpcmFibGUgdG8gc3RvcmUgdGhlIGNvbXByZXNzZWQgZGF0YSBpbiBhIGxpbmtlZAotbGlzdCBvZiBidWZmZXIgYXJlYXMsIHNvIGFzIHRvIGF2b2lkIGRhdGEgY29weWluZy4gIFRoaXMgY2FuIGJlIGhhbmRsZWQgYnkKLWhhdmluZyBlbXB0eV9vdXRwdXRfYnVmZmVyKCkgb3IgZmlsbF9pbnB1dF9idWZmZXIoKSBzZXQgdGhlIHBvaW50ZXIgYW5kIGNvdW50Ci10byByZWZlcmVuY2UgdGhlIG5leHQgYXZhaWxhYmxlIGJ1ZmZlcjsgRkFMU0UgaXMgcmV0dXJuZWQgb25seSBpZiBubyBtb3JlCi1idWZmZXJzIGFyZSBhdmFpbGFibGUuICBBbHRob3VnaCBzZWVtaW5nbHkgc3RyYWlnaHRmb3J3YXJkLCB0aGVyZSBpcyBhCi1waXRmYWxsIGluIHRoaXMgYXBwcm9hY2g6IHRoZSBiYWNrdHJhY2sgdGhhdCBvY2N1cnMgd2hlbiBGQUxTRSBpcyByZXR1cm5lZAotY291bGQgYmFjayB1cCBpbnRvIGFuIGVhcmxpZXIgYnVmZmVyLiAgRm9yIGV4YW1wbGUsIHdoZW4gZmlsbF9pbnB1dF9idWZmZXIoKQotaXMgY2FsbGVkLCB0aGUgY3VycmVudCBwb2ludGVyICYgY291bnQgaW5kaWNhdGUgdGhlIGJhY2t0cmFjayByZXN0YXJ0IHBvaW50LgotU2luY2UgZmlsbF9pbnB1dF9idWZmZXIoKSB3aWxsIHNldCB0aGUgcG9pbnRlciBhbmQgY291bnQgdG8gcmVmZXIgdG8gYSBuZXcKLWJ1ZmZlciwgdGhlIHJlc3RhcnQgcG9zaXRpb24gbXVzdCBiZSBzYXZlZCBzb21ld2hlcmUgZWxzZS4gIFN1cHBvc2UgYSBzZWNvbmQKLWNhbGwgdG8gZmlsbF9pbnB1dF9idWZmZXIoKSBvY2N1cnMgaW4gdGhlIHNhbWUgbGlicmFyeSBjYWxsLCBhbmQgbm8KLWFkZGl0aW9uYWwgaW5wdXQgZGF0YSBpcyBhdmFpbGFibGUsIHNvIGZpbGxfaW5wdXRfYnVmZmVyIG11c3QgcmV0dXJuIEZBTFNFLgotSWYgdGhlIEpQRUcgbGlicmFyeSBoYXMgbm90IG1vdmVkIHRoZSBwb2ludGVyL2NvdW50IGZvcndhcmQgaW4gdGhlIGN1cnJlbnQKLWJ1ZmZlciwgdGhlbiAqdGhlIGNvcnJlY3QgcmVzdGFydCBwb2ludCBpcyB0aGUgc2F2ZWQgcG9zaXRpb24gaW4gdGhlIHByaW9yCi1idWZmZXIqLiAgUHJpb3IgYnVmZmVycyBtYXkgYmUgZGlzY2FyZGVkIG9ubHkgYWZ0ZXIgdGhlIGxpYnJhcnkgZXN0YWJsaXNoZXMKLWEgcmVzdGFydCBwb2ludCB3aXRoaW4gYSBsYXRlciBidWZmZXIuICBTaW1pbGFyIHJlbWFya3MgYXBwbHkgZm9yIG91dHB1dCBpbnRvCi1hIGNoYWluIG9mIGJ1ZmZlcnMuCi0KLVRoZSBsaWJyYXJ5IHdpbGwgbmV2ZXIgYXR0ZW1wdCB0byBiYWNrdHJhY2sgb3ZlciBhIHNraXBfaW5wdXRfZGF0YSgpIGNhbGwsCi1zbyBhbnkgc2tpcHBlZCBkYXRhIGNhbiBiZSBwZXJtYW5lbnRseSBkaXNjYXJkZWQuICBZb3Ugc3RpbGwgaGF2ZSB0byBkZWFsCi13aXRoIHRoZSBjYXNlIG9mIHNraXBwaW5nIG5vdC15ZXQtcmVjZWl2ZWQgZGF0YSwgaG93ZXZlci4KLQotSXQncyBtdWNoIHNpbXBsZXIgdG8gdXNlIG9ubHkgYSBzaW5nbGUgYnVmZmVyOyB3aGVuIGZpbGxfaW5wdXRfYnVmZmVyKCkgaXMKLWNhbGxlZCwgbW92ZSBhbnkgdW5jb25zdW1lZCBkYXRhIChiZXlvbmQgdGhlIGN1cnJlbnQgcG9pbnRlci9jb3VudCkgZG93biB0bwotdGhlIGJlZ2lubmluZyBvZiB0aGlzIGJ1ZmZlciBhbmQgdGhlbiBsb2FkIG5ldyBkYXRhIGludG8gdGhlIHJlbWFpbmluZyBidWZmZXIKLXNwYWNlLiAgVGhpcyBhcHByb2FjaCByZXF1aXJlcyBhIGxpdHRsZSBtb3JlIGRhdGEgY29weWluZyBidXQgaXMgZmFyIGVhc2llcgotdG8gZ2V0IHJpZ2h0LgotCi0KLVByb2dyZXNzaXZlIEpQRUcgc3VwcG9ydAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVByb2dyZXNzaXZlIEpQRUcgcmVhcnJhbmdlcyB0aGUgc3RvcmVkIGRhdGEgaW50byBhIHNlcmllcyBvZiBzY2FucyBvZgotaW5jcmVhc2luZyBxdWFsaXR5LiAgSW4gc2l0dWF0aW9ucyB3aGVyZSBhIEpQRUcgZmlsZSBpcyB0cmFuc21pdHRlZCBhY3Jvc3MgYQotc2xvdyBjb21tdW5pY2F0aW9ucyBsaW5rLCBhIGRlY29kZXIgY2FuIGdlbmVyYXRlIGEgbG93LXF1YWxpdHkgaW1hZ2UgdmVyeQotcXVpY2tseSBmcm9tIHRoZSBmaXJzdCBzY2FuLCB0aGVuIGdyYWR1YWxseSBpbXByb3ZlIHRoZSBkaXNwbGF5ZWQgcXVhbGl0eSBhcwotbW9yZSBzY2FucyBhcmUgcmVjZWl2ZWQuICBUaGUgZmluYWwgaW1hZ2UgYWZ0ZXIgYWxsIHNjYW5zIGFyZSBjb21wbGV0ZSBpcwotaWRlbnRpY2FsIHRvIHRoYXQgb2YgYSByZWd1bGFyIChzZXF1ZW50aWFsKSBKUEVHIGZpbGUgb2YgdGhlIHNhbWUgcXVhbGl0eQotc2V0dGluZy4gIFByb2dyZXNzaXZlIEpQRUcgZmlsZXMgYXJlIG9mdGVuIHNsaWdodGx5IHNtYWxsZXIgdGhhbiBlcXVpdmFsZW50Ci1zZXF1ZW50aWFsIEpQRUcgZmlsZXMsIGJ1dCB0aGUgcG9zc2liaWxpdHkgb2YgaW5jcmVtZW50YWwgZGlzcGxheSBpcyB0aGUgbWFpbgotcmVhc29uIGZvciB1c2luZyBwcm9ncmVzc2l2ZSBKUEVHLgotCi1UaGUgSUpHIGVuY29kZXIgbGlicmFyeSBnZW5lcmF0ZXMgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcyB3aGVuIGdpdmVuIGEKLXN1aXRhYmxlICJzY2FuIHNjcmlwdCIgZGVmaW5pbmcgaG93IHRvIGRpdmlkZSB0aGUgZGF0YSBpbnRvIHNjYW5zLgotQ3JlYXRpb24gb2YgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcyBpcyBvdGhlcndpc2UgdHJhbnNwYXJlbnQgdG8gdGhlIGVuY29kZXIuCi1Qcm9ncmVzc2l2ZSBKUEVHIGZpbGVzIGNhbiBhbHNvIGJlIHJlYWQgdHJhbnNwYXJlbnRseSBieSB0aGUgZGVjb2RlciBsaWJyYXJ5LgotSWYgdGhlIGRlY29kaW5nIGFwcGxpY2F0aW9uIHNpbXBseSB1c2VzIHRoZSBsaWJyYXJ5IGFzIGRlZmluZWQgYWJvdmUsIGl0Ci13aWxsIHJlY2VpdmUgYSBmaW5hbCBkZWNvZGVkIGltYWdlIHdpdGhvdXQgYW55IGluZGljYXRpb24gdGhhdCB0aGUgZmlsZSB3YXMKLXByb2dyZXNzaXZlLiAgT2YgY291cnNlLCB0aGlzIGFwcHJvYWNoIGRvZXMgbm90IGFsbG93IGluY3JlbWVudGFsIGRpc3BsYXkuCi1UbyBwZXJmb3JtIGluY3JlbWVudGFsIGRpc3BsYXksIGFuIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHVzZSB0aGUgZGVjb2RlcgotbGlicmFyeSdzICJidWZmZXJlZC1pbWFnZSIgbW9kZSwgaW4gd2hpY2ggaXQgcmVjZWl2ZXMgYSBkZWNvZGVkIGltYWdlCi1tdWx0aXBsZSB0aW1lcy4KLQotRWFjaCBkaXNwbGF5ZWQgc2NhbiByZXF1aXJlcyBhYm91dCBhcyBtdWNoIHdvcmsgdG8gZGVjb2RlIGFzIGEgZnVsbCBKUEVHCi1pbWFnZSBvZiB0aGUgc2FtZSBzaXplLCBzbyB0aGUgZGVjb2RlciBtdXN0IGJlIGZhaXJseSBmYXN0IGluIHJlbGF0aW9uIHRvIHRoZQotZGF0YSB0cmFuc21pc3Npb24gcmF0ZSBpbiBvcmRlciB0byBtYWtlIGluY3JlbWVudGFsIGRpc3BsYXkgdXNlZnVsLiAgSG93ZXZlciwKLWl0IGlzIHBvc3NpYmxlIHRvIHNraXAgZGlzcGxheWluZyB0aGUgaW1hZ2UgYW5kIHNpbXBseSBhZGQgdGhlIGluY29taW5nIGJpdHMKLXRvIHRoZSBkZWNvZGVyJ3MgY29lZmZpY2llbnQgYnVmZmVyLiAgVGhpcyBpcyBmYXN0IGJlY2F1c2Ugb25seSBIdWZmbWFuCi1kZWNvZGluZyBuZWVkIGJlIGRvbmUsIG5vdCBJRENULCB1cHNhbXBsaW5nLCBjb2xvcnNwYWNlIGNvbnZlcnNpb24sIGV0Yy4KLVRoZSBJSkcgZGVjb2RlciBsaWJyYXJ5IGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc3dpdGNoIGR5bmFtaWNhbGx5IGJldHdlZW4KLWRpc3BsYXlpbmcgdGhlIGltYWdlIGFuZCBzaW1wbHkgYWJzb3JiaW5nIHRoZSBpbmNvbWluZyBiaXRzLiAgQSBwcm9wZXJseQotY29kZWQgYXBwbGljYXRpb24gY2FuIGF1dG9tYXRpY2FsbHkgYWRhcHQgdGhlIG51bWJlciBvZiBkaXNwbGF5IHBhc3NlcyB0bwotc3VpdCB0aGUgdGltZSBhdmFpbGFibGUgYXMgdGhlIGltYWdlIGlzIHJlY2VpdmVkLiAgQWxzbywgYSBmaW5hbAotaGlnaGVyLXF1YWxpdHkgZGlzcGxheSBjeWNsZSBjYW4gYmUgcGVyZm9ybWVkIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEgYWZ0ZXIKLXRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgcmVhY2hlZC4KLQotUHJvZ3Jlc3NpdmUgY29tcHJlc3Npb246Ci0KLVRvIGNyZWF0ZSBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZSAob3IgYSBtdWx0aXBsZS1zY2FuIHNlcXVlbnRpYWwgSlBFRyBmaWxlKSwKLXNldCB0aGUgc2Nhbl9pbmZvIGNpbmZvIGZpZWxkIHRvIHBvaW50IHRvIGFuIGFycmF5IG9mIHNjYW4gZGVzY3JpcHRvcnMsIGFuZAotcGVyZm9ybSBjb21wcmVzc2lvbiBhcyB1c3VhbC4gIEluc3RlYWQgb2YgY29uc3RydWN0aW5nIHlvdXIgb3duIHNjYW4gbGlzdCwKLXlvdSBjYW4gY2FsbCB0aGUganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24oKSBoZWxwZXIgcm91dGluZSB0byBjcmVhdGUgYQotcmVjb21tZW5kZWQgcHJvZ3Jlc3Npb24gc2VxdWVuY2U7IHRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGJ5IGFsbAotYXBwbGljYXRpb25zIHRoYXQgZG9uJ3Qgd2FudCB0byBnZXQgaW52b2x2ZWQgaW4gdGhlIG5pdHR5LWdyaXR0eSBvZgotcHJvZ3Jlc3NpdmUgc2NhbiBzZXF1ZW5jZSBkZXNpZ24uICAoSWYgeW91IHdhbnQgdG8gcHJvdmlkZSB1c2VyIGNvbnRyb2wgb2YKLXNjYW4gc2VxdWVuY2VzLCB5b3UgbWF5IHdpc2ggdG8gYm9ycm93IHRoZSBzY2FuIHNjcmlwdCByZWFkaW5nIGNvZGUgZm91bmQKLWluIHJkc3dpdGNoLmMsIHNvIHRoYXQgeW91IGNhbiByZWFkIHNjYW4gc2NyaXB0IGZpbGVzIGp1c3QgbGlrZSBjanBlZydzLikKLVdoZW4gc2Nhbl9pbmZvIGlzIG5vdCBOVUxMLCB0aGUgY29tcHJlc3Npb24gbGlicmFyeSB3aWxsIHN0b3JlIERDVCdkIGRhdGEKLWludG8gYSBidWZmZXIgYXJyYXkgYXMganBlZ193cml0ZV9zY2FubGluZXMoKSBpcyBjYWxsZWQsIGFuZCB3aWxsIGVtaXQgYWxsCi10aGUgcmVxdWVzdGVkIHNjYW5zIGR1cmluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLiAgVGhpcyBpbXBsaWVzIHRoYXQKLW11bHRpcGxlLXNjYW4gb3V0cHV0IGNhbm5vdCBiZSBjcmVhdGVkIHdpdGggYSBzdXNwZW5kaW5nIGRhdGEgZGVzdGluYXRpb24KLW1hbmFnZXIsIHNpbmNlIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgZG9lcyBub3Qgc3VwcG9ydCBzdXNwZW5zaW9uLiAgV2UKLXNob3VsZCBhbHNvIG5vdGUgdGhhdCB0aGUgY29tcHJlc3NvciBjdXJyZW50bHkgZm9yY2VzIEh1ZmZtYW4gb3B0aW1pemF0aW9uCi1tb2RlIHdoZW4gY3JlYXRpbmcgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUsIGJlY2F1c2UgdGhlIGRlZmF1bHQgSHVmZm1hbgotdGFibGVzIGFyZSB1bnN1aXRhYmxlIGZvciBwcm9ncmVzc2l2ZSBmaWxlcy4KLQotUHJvZ3Jlc3NpdmUgZGVjb21wcmVzc2lvbjoKLQotV2hlbiBidWZmZXJlZC1pbWFnZSBtb2RlIGlzIG5vdCB1c2VkLCB0aGUgZGVjb2RlciBsaWJyYXJ5IHdpbGwgcmVhZCBhbGwgb2YKLWEgbXVsdGktc2NhbiBmaWxlIGR1cmluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSwgc28gdGhhdCBpdCBjYW4gcHJvdmlkZSBhCi1maW5hbCBkZWNvZGVkIGltYWdlLiAgKEhlcmUgIm11bHRpLXNjYW4iIG1lYW5zIGVpdGhlciBwcm9ncmVzc2l2ZSBvcgotbXVsdGktc2NhbiBzZXF1ZW50aWFsLikgIFRoaXMgbWFrZXMgbXVsdGktc2NhbiBmaWxlcyB0cmFuc3BhcmVudCB0byB0aGUKLWRlY29kaW5nIGFwcGxpY2F0aW9uLiAgSG93ZXZlciwgZXhpc3RpbmcgYXBwbGljYXRpb25zIHRoYXQgdXNlZCBzdXNwZW5kaW5nCi1pbnB1dCB3aXRoIHZlcnNpb24gNSBvZiB0aGUgSUpHIGxpYnJhcnkgd2lsbCBuZWVkIHRvIGJlIG1vZGlmaWVkIHRvIGNoZWNrCi1mb3IgYSBzdXNwZW5zaW9uIHJldHVybiBmcm9tIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgotCi1UbyBwZXJmb3JtIGluY3JlbWVudGFsIGRpc3BsYXksIGFuIGFwcGxpY2F0aW9uIG11c3QgdXNlIHRoZSBsaWJyYXJ5J3MKLWJ1ZmZlcmVkLWltYWdlIG1vZGUuICBUaGlzIGlzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgotCi0KLUJ1ZmZlcmVkLWltYWdlIG1vZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgdGhlIGxpYnJhcnkgc3RvcmVzIHRoZSBwYXJ0aWFsbHkgZGVjb2RlZCBpbWFnZSBpbiBhCi1jb2VmZmljaWVudCBidWZmZXIsIGZyb20gd2hpY2ggaXQgY2FuIGJlIHJlYWQgb3V0IGFzIG1hbnkgdGltZXMgYXMgZGVzaXJlZC4KLVRoaXMgbW9kZSBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgaW5jcmVtZW50YWwgZGlzcGxheSBvZiBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzLAotYnV0IGl0IGNhbiBiZSB1c2VkIHdpdGggYW55IEpQRUcgZmlsZS4gIEVhY2ggc2NhbiBvZiBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZQotYWRkcyBtb3JlIGRhdGEgKG1vcmUgZGV0YWlsKSB0byB0aGUgYnVmZmVyZWQgaW1hZ2UuICBUaGUgYXBwbGljYXRpb24gY2FuCi1kaXNwbGF5IGluIGxvY2tzdGVwIHdpdGggdGhlIHNvdXJjZSBmaWxlIChvbmUgZGlzcGxheSBwYXNzIHBlciBpbnB1dCBzY2FuKSwKLW9yIGl0IGNhbiBhbGxvdyBpbnB1dCBwcm9jZXNzaW5nIHRvIG91dHJ1biBkaXNwbGF5IHByb2Nlc3NpbmcuICBCeSBtYWtpbmcKLWlucHV0IGFuZCBkaXNwbGF5IHByb2Nlc3NpbmcgcnVuIGluZGVwZW5kZW50bHksIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUKLWFwcGxpY2F0aW9uIHRvIGFkYXB0IHByb2dyZXNzaXZlIGRpc3BsYXkgdG8gYSB3aWRlIHJhbmdlIG9mIGRhdGEgdHJhbnNtaXNzaW9uCi1yYXRlcy4KLQotVGhlIGJhc2ljIGNvbnRyb2wgZmxvdyBmb3IgYnVmZmVyZWQtaW1hZ2UgZGVjb2RpbmcgaXMKLQotCWpwZWdfY3JlYXRlX2RlY29tcHJlc3MoKQotCXNldCBkYXRhIHNvdXJjZQotCWpwZWdfcmVhZF9oZWFkZXIoKQotCXNldCBvdmVyYWxsIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycwotCWNpbmZvLmJ1ZmZlcmVkX2ltYWdlID0gVFJVRTsJLyogc2VsZWN0IGJ1ZmZlcmVkLWltYWdlIG1vZGUgKi8KLQlqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKQotCWZvciAoZWFjaCBvdXRwdXQgcGFzcykgewotCSAgICBhZGp1c3Qgb3V0cHV0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyBpZiByZXF1aXJlZAotCSAgICBqcGVnX3N0YXJ0X291dHB1dCgpCQkvKiBzdGFydCBhIG5ldyBvdXRwdXQgcGFzcyAqLwotCSAgICBmb3IgKGFsbCBzY2FubGluZXMgaW4gaW1hZ2UpIHsKLQkgICAgICAgIGpwZWdfcmVhZF9zY2FubGluZXMoKQotCSAgICAgICAgZGlzcGxheSBzY2FubGluZXMKLQkgICAgfQotCSAgICBqcGVnX2ZpbmlzaF9vdXRwdXQoKQkvKiB0ZXJtaW5hdGUgb3V0cHV0IHBhc3MgKi8KLQl9Ci0JanBlZ19maW5pc2hfZGVjb21wcmVzcygpCi0JanBlZ19kZXN0cm95X2RlY29tcHJlc3MoKQotCi1UaGlzIGRpZmZlcnMgZnJvbSBvcmRpbmFyeSB1bmJ1ZmZlcmVkIGRlY29kaW5nIGluIHRoYXQgdGhlcmUgaXMgYW4gYWRkaXRpb25hbAotbGV2ZWwgb2YgbG9vcGluZy4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gY2hvb3NlIGhvdyBtYW55IG91dHB1dCBwYXNzZXMgdG8gbWFrZQotYW5kIGhvdyB0byBkaXNwbGF5IGVhY2ggcGFzcy4KLQotVGhlIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGRpc3BsYXlpbmcgcHJvZ3Jlc3NpdmUgaW1hZ2VzIGlzIHRvIGRvIG9uZSBkaXNwbGF5Ci1wYXNzIGZvciBlYWNoIHNjYW4gYXBwZWFyaW5nIGluIHRoZSBpbnB1dCBmaWxlLiAgSW4gdGhpcyBjYXNlIHRoZSBvdXRlciBsb29wCi1jb25kaXRpb24gaXMgdHlwaWNhbGx5Ci0Jd2hpbGUgKCEganBlZ19pbnB1dF9jb21wbGV0ZSgmY2luZm8pKQotYW5kIHRoZSBzdGFydC1vdXRwdXQgY2FsbCBzaG91bGQgcmVhZAotCWpwZWdfc3RhcnRfb3V0cHV0KCZjaW5mbywgY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIpOwotVGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8ganBlZ19zdGFydF9vdXRwdXQoKSBpbmRpY2F0ZXMgd2hpY2ggc2NhbiBvZiB0aGUgaW5wdXQKLWZpbGUgaXMgdG8gYmUgZGlzcGxheWVkOyB0aGUgc2NhbnMgYXJlIG51bWJlcmVkIHN0YXJ0aW5nIGF0IDEgZm9yIHRoaXMKLXB1cnBvc2UuICAoWW91IGNhbiB1c2UgYSBsb29wIGNvdW50ZXIgc3RhcnRpbmcgYXQgMSBpZiB5b3UgbGlrZSwgYnV0IHVzaW5nCi10aGUgbGlicmFyeSdzIGlucHV0IHNjYW4gY291bnRlciBpcyBlYXNpZXIuKSAgVGhlIGxpYnJhcnkgYXV0b21hdGljYWxseSByZWFkcwotZGF0YSBhcyBuZWNlc3NhcnkgdG8gY29tcGxldGUgZWFjaCByZXF1ZXN0ZWQgc2NhbiwgYW5kIGpwZWdfZmluaXNoX291dHB1dCgpCi1hZHZhbmNlcyB0byB0aGUgbmV4dCBzY2FuIG9yIGVuZC1vZi1pbWFnZSBtYXJrZXIgKGhlbmNlIGlucHV0X3NjYW5fbnVtYmVyCi13aWxsIGJlIGluY3JlbWVudGVkIGJ5IHRoZSB0aW1lIGNvbnRyb2wgYXJyaXZlcyBiYWNrIGF0IGpwZWdfc3RhcnRfb3V0cHV0KCkpLgotV2l0aCB0aGlzIHRlY2huaXF1ZSwgZGF0YSBpcyByZWFkIGZyb20gdGhlIGlucHV0IGZpbGUgb25seSBhcyBuZWVkZWQsIGFuZAotaW5wdXQgYW5kIG91dHB1dCBwcm9jZXNzaW5nIHJ1biBpbiBsb2Nrc3RlcC4KLQotQWZ0ZXIgcmVhZGluZyB0aGUgZmluYWwgc2NhbiBhbmQgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZSwgdGhlCi1idWZmZXJlZCBpbWFnZSByZW1haW5zIGF2YWlsYWJsZTsgaXQgY2FuIGJlIHJlYWQgYWRkaXRpb25hbCB0aW1lcyBieQotcmVwZWF0aW5nIHRoZSBqcGVnX3N0YXJ0X291dHB1dCgpL2pwZWdfcmVhZF9zY2FubGluZXMoKS9qcGVnX2ZpbmlzaF9vdXRwdXQoKQotc2VxdWVuY2UuICBGb3IgZXhhbXBsZSwgYSB1c2VmdWwgdGVjaG5pcXVlIGlzIHRvIHVzZSBmYXN0IG9uZS1wYXNzIGNvbG9yCi1xdWFudGl6YXRpb24gZm9yIGRpc3BsYXkgcGFzc2VzIG1hZGUgd2hpbGUgdGhlIGltYWdlIGlzIGFycml2aW5nLCBmb2xsb3dlZCBieQotYSBmaW5hbCBkaXNwbGF5IHBhc3MgdXNpbmcgdHdvLXBhc3MgcXVhbnRpemF0aW9uIGZvciBoaWdoZXN0IHF1YWxpdHkuICBUaGlzCi1pcyBkb25lIGJ5IGNoYW5naW5nIHRoZSBsaWJyYXJ5IHBhcmFtZXRlcnMgYmVmb3JlIHRoZSBmaW5hbCBvdXRwdXQgcGFzcy4KLUNoYW5naW5nIHBhcmFtZXRlcnMgYmV0d2VlbiBwYXNzZXMgaXMgZGlzY3Vzc2VkIGluIGRldGFpbCBiZWxvdy4KLQotSW4gZ2VuZXJhbCB0aGUgbGFzdCBzY2FuIG9mIGEgcHJvZ3Jlc3NpdmUgZmlsZSBjYW5ub3QgYmUgcmVjb2duaXplZCBhcyBzdWNoCi11bnRpbCBhZnRlciBpdCBpcyByZWFkLCBzbyBhIHBvc3QtaW5wdXQgZGlzcGxheSBwYXNzIGlzIHRoZSBiZXN0IGFwcHJvYWNoIGlmCi15b3Ugd2FudCBzcGVjaWFsIHByb2Nlc3NpbmcgaW4gdGhlIGZpbmFsIHBhc3MuCi0KLVdoZW4gZG9uZSB3aXRoIHRoZSBpbWFnZSwgYmUgc3VyZSB0byBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSB0byByZWxlYXNlCi10aGUgYnVmZmVyZWQgaW1hZ2UgKG9yIGp1c3QgdXNlIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCkpLgotCi1JZiBpbnB1dCBkYXRhIGFycml2ZXMgZmFzdGVyIHRoYW4gaXQgY2FuIGJlIGRpc3BsYXllZCwgdGhlIGFwcGxpY2F0aW9uIGNhbgotY2F1c2UgdGhlIGxpYnJhcnkgdG8gZGVjb2RlIGlucHV0IGRhdGEgaW4gYWR2YW5jZSBvZiB3aGF0J3MgbmVlZGVkIHRvIHByb2R1Y2UKLW91dHB1dC4gIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nIHRoZSByb3V0aW5lIGpwZWdfY29uc3VtZV9pbnB1dCgpLgotVGhlIHJldHVybiB2YWx1ZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQlKUEVHX1JFQUNIRURfU09TOiAgICByZWFjaGVkIGFuIFNPUyBtYXJrZXIgKHRoZSBzdGFydCBvZiBhIG5ldyBzY2FuKQotCUpQRUdfUkVBQ0hFRF9FT0k6ICAgIHJlYWNoZWQgdGhlIEVPSSBtYXJrZXIgKGVuZCBvZiBpbWFnZSkKLQlKUEVHX1JPV19DT01QTEVURUQ6ICBjb21wbGV0ZWQgcmVhZGluZyBvbmUgTUNVIHJvdyBvZiBjb21wcmVzc2VkIGRhdGEKLQlKUEVHX1NDQU5fQ09NUExFVEVEOiBjb21wbGV0ZWQgcmVhZGluZyBsYXN0IE1DVSByb3cgb2YgY3VycmVudCBzY2FuCi0JSlBFR19TVVNQRU5ERUQ6ICAgICAgc3VzcGVuZGVkIGJlZm9yZSBjb21wbGV0aW5nIGFueSBvZiB0aGUgYWJvdmUKLShKUEVHX1NVU1BFTkRFRCBjYW4gb2NjdXIgb25seSBpZiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4pICBUaGlzCi1yb3V0aW5lIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYWZ0ZXIgaW5pdGlhbGl6aW5nIHRoZSBKUEVHIG9iamVjdC4gIEl0Ci1yZWFkcyBzb21lIGFkZGl0aW9uYWwgZGF0YSBhbmQgcmV0dXJucyB3aGVuIG9uZSBvZiB0aGUgaW5kaWNhdGVkIHNpZ25pZmljYW50Ci1ldmVudHMgb2NjdXJzLiAgKElmIGNhbGxlZCBhZnRlciB0aGUgRU9JIG1hcmtlciBpcyByZWFjaGVkLCBpdCB3aWxsCi1pbW1lZGlhdGVseSByZXR1cm4gSlBFR19SRUFDSEVEX0VPSSB3aXRob3V0IGF0dGVtcHRpbmcgdG8gcmVhZCBtb3JlIGRhdGEuKQotCi1UaGUgbGlicmFyeSdzIG91dHB1dCBwcm9jZXNzaW5nIHdpbGwgYXV0b21hdGljYWxseSBjYWxsIGpwZWdfY29uc3VtZV9pbnB1dCgpCi13aGVuZXZlciB0aGUgb3V0cHV0IHByb2Nlc3Npbmcgb3ZlcnRha2VzIHRoZSBpbnB1dDsgdGh1cywgc2ltcGxlIGxvY2tzdGVwCi1kaXNwbGF5IHJlcXVpcmVzIG5vIGRpcmVjdCBjYWxscyB0byBqcGVnX2NvbnN1bWVfaW5wdXQoKS4gIEJ1dCBieSBhZGRpbmcKLWNhbGxzIHRvIGpwZWdfY29uc3VtZV9pbnB1dCgpLCB5b3UgY2FuIGFic29yYiBkYXRhIGluIGFkdmFuY2Ugb2Ygd2hhdCBpcwotYmVpbmcgZGlzcGxheWVkLiAgVGhpcyBoYXMgdHdvIGJlbmVmaXRzOgotICAqIFlvdSBjYW4gbGltaXQgYnVpbGR1cCBvZiB1bnByb2Nlc3NlZCBkYXRhIGluIHlvdXIgaW5wdXQgYnVmZmVyLgotICAqIFlvdSBjYW4gZWxpbWluYXRlIGV4dHJhIGRpc3BsYXkgcGFzc2VzIGJ5IHBheWluZyBhdHRlbnRpb24gdG8gdGhlCi0gICAgc3RhdGUgb2YgdGhlIGxpYnJhcnkncyBpbnB1dCBwcm9jZXNzaW5nLgotCi1UaGUgZmlyc3Qgb2YgdGhlc2UgYmVuZWZpdHMgb25seSByZXF1aXJlcyBpbnRlcnNwZXJzaW5nIGNhbGxzIHRvCi1qcGVnX2NvbnN1bWVfaW5wdXQoKSB3aXRoIHlvdXIgZGlzcGxheSBvcGVyYXRpb25zIGFuZCBhbnkgb3RoZXIgcHJvY2Vzc2luZwoteW91IG1heSBiZSBkb2luZy4gIFRvIGF2b2lkIHdhc3RpbmcgY3ljbGVzIGR1ZSB0byBiYWNrdHJhY2tpbmcsIGl0J3MgYmVzdCB0bwotY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKSBvbmx5IGFmdGVyIGEgaHVuZHJlZCBvciBzbyBuZXcgYnl0ZXMgaGF2ZSBhcnJpdmVkLgotVGhpcyBpcyBkaXNjdXNzZWQgZnVydGhlciB1bmRlciAiSS9PIHN1c3BlbnNpb24iLCBhYm92ZS4gIChOb3RlOiB0aGUgSlBFRwotbGlicmFyeSBjdXJyZW50bHkgaXMgbm90IHRocmVhZC1zYWZlLiAgWW91IG11c3Qgbm90IGNhbGwganBlZ19jb25zdW1lX2lucHV0KCkKLWZyb20gb25lIHRocmVhZCBvZiBjb250cm9sIGlmIGEgZGlmZmVyZW50IGxpYnJhcnkgcm91dGluZSBpcyB3b3JraW5nIG9uIHRoZQotc2FtZSBKUEVHIG9iamVjdCBpbiBhbm90aGVyIHRocmVhZC4pCi0KLVdoZW4gaW5wdXQgYXJyaXZlcyBmYXN0IGVub3VnaCB0aGF0IG1vcmUgdGhhbiBvbmUgbmV3IHNjYW4gaXMgYXZhaWxhYmxlCi1iZWZvcmUgeW91IHN0YXJ0IGEgbmV3IG91dHB1dCBwYXNzLCB5b3UgbWF5IGFzIHdlbGwgc2tpcCB0aGUgb3V0cHV0IHBhc3MKLWNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbXBsZXRlZCBzY2FuLiAgVGhpcyBvY2N1cnMgZm9yIGZyZWUgaWYgeW91IHBhc3MKLWNpbmZvLmlucHV0X3NjYW5fbnVtYmVyIGFzIHRoZSB0YXJnZXQgc2NhbiBudW1iZXIgdG8ganBlZ19zdGFydF9vdXRwdXQoKS4KLVRoZSBpbnB1dF9zY2FuX251bWJlciBmaWVsZCBpcyBzaW1wbHkgdGhlIGluZGV4IG9mIHRoZSBzY2FuIGN1cnJlbnRseSBiZWluZwotY29uc3VtZWQgYnkgdGhlIGlucHV0IHByb2Nlc3Nvci4gIFlvdSBjYW4gZW5zdXJlIHRoYXQgdGhpcyBpcyB1cC10by1kYXRlIGJ5Ci1lbXB0eWluZyB0aGUgaW5wdXQgYnVmZmVyIGp1c3QgYmVmb3JlIGNhbGxpbmcganBlZ19zdGFydF9vdXRwdXQoKTogY2FsbAotanBlZ19jb25zdW1lX2lucHV0KCkgcmVwZWF0ZWRseSB1bnRpbCBpdCByZXR1cm5zIEpQRUdfU1VTUEVOREVEIG9yCi1KUEVHX1JFQUNIRURfRU9JLgotCi1UaGUgdGFyZ2V0IHNjYW4gbnVtYmVyIHBhc3NlZCB0byBqcGVnX3N0YXJ0X291dHB1dCgpIGlzIHNhdmVkIGluIHRoZQotY2luZm8ub3V0cHV0X3NjYW5fbnVtYmVyIGZpZWxkLiAgVGhlIGxpYnJhcnkncyBvdXRwdXQgcHJvY2Vzc2luZyBjYWxscwotanBlZ19jb25zdW1lX2lucHV0KCkgd2hlbmV2ZXIgdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIgYW5kIHJvdyB3aXRoaW4KLXRoYXQgc2NhbiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgb3V0cHV0IHNjYW4gbnVtYmVyIGFuZCByb3cuCi1UaHVzLCBpbnB1dCBwcm9jZXNzaW5nIGNhbiAiZ2V0IGFoZWFkIiBvZiB0aGUgb3V0cHV0IHByb2Nlc3NpbmcgYnV0IGlzIG5vdAotYWxsb3dlZCB0byAiZmFsbCBiZWhpbmQiLiAgWW91IGNhbiBhY2hpZXZlIHNldmVyYWwgZGlmZmVyZW50IGVmZmVjdHMgYnkKLW1hbmlwdWxhdGluZyB0aGlzIGludGVybG9jayBydWxlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBwYXNzIGEgdGFyZ2V0IHNjYW4KLW51bWJlciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIsIHRoZSBvdXRwdXQgcHJvY2Vzc29yIHdpbGwKLXdhaXQgdW50aWwgdGhhdCBzY2FuIHN0YXJ0cyB0byBhcnJpdmUgYmVmb3JlIHByb2R1Y2luZyBhbnkgb3V0cHV0LiAgKFRvIGF2b2lkCi1hbiBpbmZpbml0ZSBsb29wLCB0aGUgdGFyZ2V0IHNjYW4gbnVtYmVyIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQgdG8gdGhlIGxhc3QKLXNjYW4gbnVtYmVyIHdoZW4gdGhlIGVuZCBvZiBpbWFnZSBpcyByZWFjaGVkLiAgVGh1cywgaWYgeW91IHNwZWNpZnkgYSBsYXJnZQotdGFyZ2V0IHNjYW4gbnVtYmVyLCB0aGUgbGlicmFyeSB3aWxsIGp1c3QgYWJzb3JiIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSBhbmQKLXRoZW4gcGVyZm9ybSBhbiBvdXRwdXQgcGFzcy4gIFRoaXMgaXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgd2hhdAotanBlZ19zdGFydF9kZWNvbXByZXNzKCkgZG9lcyB3aGVuIHlvdSBkb24ndCBzZWxlY3QgYnVmZmVyZWQtaW1hZ2UgbW9kZS4pCi1XaGVuIHlvdSBwYXNzIGEgdGFyZ2V0IHNjYW4gbnVtYmVyIGVxdWFsIHRvIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyLAotdGhlIGltYWdlIGlzIGRpc3BsYXllZCBubyBmYXN0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnB1dCBzY2FuIGFycml2ZXMuICBUaGUKLWZpbmFsIHBvc3NpYmlsaXR5IGlzIHRvIHBhc3MgYSB0YXJnZXQgc2NhbiBudW1iZXIgbGVzcyB0aGFuIHRoZSBjdXJyZW50IGlucHV0Ci1zY2FuIG51bWJlcjsgdGhpcyBkaXNhYmxlcyB0aGUgaW5wdXQvb3V0cHV0IGludGVybG9jayBhbmQgY2F1c2VzIHRoZSBvdXRwdXQKLXByb2Nlc3NvciB0byBzaW1wbHkgZGlzcGxheSB3aGF0ZXZlciBpdCBmaW5kcyBpbiB0aGUgaW1hZ2UgYnVmZmVyLCB3aXRob3V0Ci13YWl0aW5nIGZvciBpbnB1dC4gIChIb3dldmVyLCB0aGUgbGlicmFyeSB3aWxsIG5vdCBhY2NlcHQgYSB0YXJnZXQgc2NhbgotbnVtYmVyIGxlc3MgdGhhbiBvbmUsIHNvIHlvdSBjYW4ndCBhdm9pZCB3YWl0aW5nIGZvciB0aGUgZmlyc3Qgc2Nhbi4pCi0KLVdoZW4gZGF0YSBpcyBhcnJpdmluZyBmYXN0ZXIgdGhhbiB0aGUgb3V0cHV0IGRpc3BsYXkgcHJvY2Vzc2luZyBjYW4gYWR2YW5jZQotdGhyb3VnaCB0aGUgaW1hZ2UsIGpwZWdfY29uc3VtZV9pbnB1dCgpIHdpbGwgc3RvcmUgZGF0YSBpbnRvIHRoZSBidWZmZXJlZAotaW1hZ2UgYmV5b25kIHRoZSBwb2ludCBhdCB3aGljaCB0aGUgb3V0cHV0IHByb2Nlc3NpbmcgaXMgcmVhZGluZyBkYXRhIG91dAotYWdhaW4uICBJZiB0aGUgaW5wdXQgYXJyaXZlcyBmYXN0IGVub3VnaCwgaXQgbWF5ICJ3cmFwIGFyb3VuZCIgdGhlIGJ1ZmZlciB0bwotdGhlIHBvaW50IHdoZXJlIHRoZSBpbnB1dCBpcyBtb3JlIHRoYW4gb25lIHdob2xlIHNjYW4gYWhlYWQgb2YgdGhlIG91dHB1dC4KLUlmIHRoZSBvdXRwdXQgcHJvY2Vzc2luZyBzaW1wbHkgcHJvY2VlZHMgdGhyb3VnaCBpdHMgZGlzcGxheSBwYXNzIHdpdGhvdXQKLXBheWluZyBhdHRlbnRpb24gdG8gdGhlIGlucHV0LCB0aGUgZWZmZWN0IHNlZW4gb24tc2NyZWVuIGlzIHRoYXQgdGhlIGxvd2VyCi1wYXJ0IG9mIHRoZSBpbWFnZSBpcyBvbmUgb3IgbW9yZSBzY2FucyBiZXR0ZXIgaW4gcXVhbGl0eSB0aGFuIHRoZSB1cHBlciBwYXJ0LgotVGhlbiwgd2hlbiB0aGUgbmV4dCBvdXRwdXQgc2NhbiBpcyBzdGFydGVkLCB5b3UgaGF2ZSBhIGNob2ljZSBvZiB3aGF0IHRhcmdldAotc2NhbiBudW1iZXIgdG8gdXNlLiAgVGhlIHJlY29tbWVuZGVkIGNob2ljZSBpcyB0byB1c2UgdGhlIGN1cnJlbnQgaW5wdXQgc2NhbgotbnVtYmVyIGF0IHRoYXQgdGltZSwgd2hpY2ggaW1wbGllcyB0aGF0IHlvdSd2ZSBza2lwcGVkIHRoZSBvdXRwdXQgc2NhbnMKLWNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IHNjYW5zIHRoYXQgd2VyZSBjb21wbGV0ZWQgd2hpbGUgeW91IHByb2Nlc3NlZCB0aGUKLXByZXZpb3VzIG91dHB1dCBzY2FuLiAgSW4gdGhpcyB3YXksIHRoZSBkZWNvZGVyIGF1dG9tYXRpY2FsbHkgYWRhcHRzIGl0cwotc3BlZWQgdG8gdGhlIGFycml2aW5nIGRhdGEsIGJ5IHNraXBwaW5nIG91dHB1dCBzY2FucyBhcyBuZWNlc3NhcnkgdG8ga2VlcCB1cAotd2l0aCB0aGUgYXJyaXZpbmcgZGF0YS4KLQotV2hlbiB1c2luZyB0aGlzIHN0cmF0ZWd5LCB5b3UnbGwgd2FudCB0byBiZSBzdXJlIHRoYXQgeW91IHBlcmZvcm0gYSBmaW5hbAotb3V0cHV0IHBhc3MgYWZ0ZXIgcmVjZWl2aW5nIGFsbCB0aGUgZGF0YTsgb3RoZXJ3aXNlIHlvdXIgbGFzdCBkaXNwbGF5IG1heSBub3QKLWJlIGZ1bGwgcXVhbGl0eSBhY3Jvc3MgdGhlIHdob2xlIHNjcmVlbi4gIFNvIHRoZSByaWdodCBvdXRlciBsb29wIGxvZ2ljIGlzCi1zb21ldGhpbmcgbGlrZSB0aGlzOgotCWRvIHsKLQkgICAgYWJzb3JiIGFueSB3YWl0aW5nIGlucHV0IGJ5IGNhbGxpbmcganBlZ19jb25zdW1lX2lucHV0KCkKLQkgICAgZmluYWxfcGFzcyA9IGpwZWdfaW5wdXRfY29tcGxldGUoJmNpbmZvKTsKLQkgICAgYWRqdXN0IG91dHB1dCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQKLQkgICAganBlZ19zdGFydF9vdXRwdXQoJmNpbmZvLCBjaW5mby5pbnB1dF9zY2FuX251bWJlcik7Ci0JICAgIC4uLgotCSAgICBqcGVnX2ZpbmlzaF9vdXRwdXQoKQotCX0gd2hpbGUgKCEgZmluYWxfcGFzcyk7Ci1yYXRoZXIgdGhhbiBxdWl0dGluZyBhcyBzb29uIGFzIGpwZWdfaW5wdXRfY29tcGxldGUoKSByZXR1cm5zIFRSVUUuICBUaGlzCi1hcnJhbmdlbWVudCBtYWtlcyBpdCBzaW1wbGUgdG8gdXNlIGhpZ2hlci1xdWFsaXR5IGRlY29kaW5nIHBhcmFtZXRlcnMKLWZvciB0aGUgZmluYWwgcGFzcy4gIEJ1dCBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2Ugc3BlY2lhbCBwYXJhbWV0ZXJzIGZvcgotdGhlIGZpbmFsIHBhc3MsIHRoZSByaWdodCBsb29wIGxvZ2ljIGlzIGxpa2UgdGhpczoKLQlmb3IgKDs7KSB7Ci0JICAgIGFic29yYiBhbnkgd2FpdGluZyBpbnB1dCBieSBjYWxsaW5nIGpwZWdfY29uc3VtZV9pbnB1dCgpCi0JICAgIGpwZWdfc3RhcnRfb3V0cHV0KCZjaW5mbywgY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIpOwotCSAgICAuLi4KLQkgICAganBlZ19maW5pc2hfb3V0cHV0KCkKLQkgICAgaWYgKGpwZWdfaW5wdXRfY29tcGxldGUoJmNpbmZvKSAmJgotCSAgICAgICAgY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIgPT0gY2luZm8ub3V0cHV0X3NjYW5fbnVtYmVyKQotCSAgICAgIGJyZWFrOwotCX0KLUluIHRoaXMgY2FzZSB5b3UgZG9uJ3QgbmVlZCB0byBrbm93IGluIGFkdmFuY2Ugd2hldGhlciBhbiBvdXRwdXQgcGFzcyBpcyB0bwotYmUgdGhlIGxhc3Qgb25lLCBzbyBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gaGF2ZSByZWFjaGVkIEVPRiBiZWZvcmUgc3RhcnRpbmcKLXRoZSBmaW5hbCBvdXRwdXQgcGFzczsgcmF0aGVyLCB3aGF0IHlvdSB3YW50IHRvIHRlc3QgaXMgd2hldGhlciB0aGUgb3V0cHV0Ci1wYXNzIHdhcyBwZXJmb3JtZWQgaW4gc3luYyB3aXRoIHRoZSBmaW5hbCBpbnB1dCBzY2FuLiAgVGhpcyBmb3JtIG9mIHRoZSBsb29wCi13aWxsIGF2b2lkIGFuIGV4dHJhIG91dHB1dCBwYXNzIHdoZW5ldmVyIHRoZSBkZWNvZGVyIGlzIGFibGUgKG9yIG5lYXJseSBhYmxlKQotdG8ga2VlcCB1cCB3aXRoIHRoZSBpbmNvbWluZyBkYXRhLgotCi1XaGVuIHRoZSBkYXRhIHRyYW5zbWlzc2lvbiBzcGVlZCBpcyBoaWdoLCB5b3UgbWlnaHQgYmVnaW4gYSBkaXNwbGF5IHBhc3MsCi10aGVuIGZpbmQgdGhhdCBtdWNoIG9yIGFsbCBvZiB0aGUgZmlsZSBoYXMgYXJyaXZlZCBiZWZvcmUgeW91IGNhbiBjb21wbGV0ZQotdGhlIHBhc3MuICAoWW91IGNhbiBkZXRlY3QgdGhpcyBieSBub3RpbmcgdGhlIEpQRUdfUkVBQ0hFRF9FT0kgcmV0dXJuIGNvZGUKLWZyb20ganBlZ19jb25zdW1lX2lucHV0KCksIG9yIGVxdWl2YWxlbnRseSBieSB0ZXN0aW5nIGpwZWdfaW5wdXRfY29tcGxldGUoKS4pCi1JbiB0aGlzIHNpdHVhdGlvbiB5b3UgbWF5IHdpc2ggdG8gYWJvcnQgdGhlIGN1cnJlbnQgZGlzcGxheSBwYXNzIGFuZCBzdGFydCBhCi1uZXcgb25lIHVzaW5nIHRoZSBuZXdseSBhcnJpdmVkIGluZm9ybWF0aW9uLiAgVG8gZG8gc28sIGp1c3QgY2FsbAotanBlZ19maW5pc2hfb3V0cHV0KCkgYW5kIHRoZW4gc3RhcnQgYSBuZXcgcGFzcyB3aXRoIGpwZWdfc3RhcnRfb3V0cHV0KCkuCi0KLUEgdmFyaWFudCBzdHJhdGVneSBpcyB0byBhYm9ydCBhbmQgcmVzdGFydCBkaXNwbGF5IGlmIG1vcmUgdGhhbiBvbmUgY29tcGxldGUKLXNjYW4gYXJyaXZlcyBkdXJpbmcgYW4gb3V0cHV0IHBhc3M7IHRoaXMgY2FuIGJlIGRldGVjdGVkIGJ5IG5vdGluZwotSlBFR19SRUFDSEVEX1NPUyByZXR1cm5zIGFuZC9vciBleGFtaW5pbmcgY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIuICBUaGlzCi1pZGVhIHNob3VsZCBiZSBlbXBsb3llZCB3aXRoIGNhdXRpb24sIGhvd2V2ZXIsIHNpbmNlIHRoZSBkaXNwbGF5IHByb2Nlc3MKLW1pZ2h0IG5ldmVyIGdldCB0byB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSBiZWZvcmUgYmVpbmcgYWJvcnRlZCwgcmVzdWx0aW5nCi1pbiB0aGUgbG93ZXIgcGFydCBvZiB0aGUgc2NyZWVuIGJlaW5nIHNldmVyYWwgcGFzc2VzIHdvcnNlIHRoYW4gdGhlIHVwcGVyLgotSW4gbW9zdCBjYXNlcyBpdCdzIHByb2JhYmx5IGJlc3QgdG8gYWJvcnQgYW4gb3V0cHV0IHBhc3Mgb25seSBpZiB0aGUgd2hvbGUKLWZpbGUgaGFzIGFycml2ZWQgYW5kIHlvdSB3YW50IHRvIGJlZ2luIHRoZSBmaW5hbCBvdXRwdXQgcGFzcyBpbW1lZGlhdGVseS4KLQotV2hlbiByZWNlaXZpbmcgZGF0YSBhY3Jvc3MgYSBjb21tdW5pY2F0aW9uIGxpbmssIHdlIHJlY29tbWVuZCBhbHdheXMgdXNpbmcKLXRoZSBjdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyIGZvciB0aGUgb3V0cHV0IHRhcmdldCBzY2FuIG51bWJlcjsgaWYgYQotaGlnaGVyLXF1YWxpdHkgZmluYWwgcGFzcyBpcyB0byBiZSBkb25lLCBpdCBzaG91bGQgYmUgc3RhcnRlZCAoYWJvcnRpbmcgYW55Ci1pbmNvbXBsZXRlIG91dHB1dCBwYXNzKSBhcyBzb29uIGFzIHRoZSBlbmQgb2YgZmlsZSBpcyByZWNlaXZlZC4gIEhvd2V2ZXIsCi1tYW55IG90aGVyIHN0cmF0ZWdpZXMgYXJlIHBvc3NpYmxlLiAgRm9yIGV4YW1wbGUsIHRoZSBhcHBsaWNhdGlvbiBjYW4gZXhhbWluZQotdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBhbmQgZGVjaWRlIHdoZXRoZXIgdG8gZGlzcGxheSBpdCBvcgotbm90LiAgSWYgdGhlIHNjYW4gY29udGFpbnMgb25seSBjaHJvbWEgZGF0YSwgb25lIG1pZ2h0IGNob29zZSBub3QgdG8gdXNlIGl0Ci1hcyB0aGUgdGFyZ2V0IHNjYW4sIGV4cGVjdGluZyB0aGF0IHRoZSBzY2FuIHdpbGwgYmUgc21hbGwgYW5kIHdpbGwgYXJyaXZlCi1xdWlja2x5LiAgVG8gc2tpcCB0byB0aGUgbmV4dCBzY2FuLCBjYWxsIGpwZWdfY29uc3VtZV9pbnB1dCgpIHVudGlsIGl0Ci1yZXR1cm5zIEpQRUdfUkVBQ0hFRF9TT1Mgb3IgSlBFR19SRUFDSEVEX0VPSS4gIE9yIGp1c3QgdXNlIHRoZSBuZXh0IGhpZ2hlcgotbnVtYmVyIGFzIHRoZSB0YXJnZXQgc2NhbiBmb3IganBlZ19zdGFydF9vdXRwdXQoKTsgYnV0IHRoYXQgbWV0aG9kIGRvZXNuJ3QKLWxldCB5b3UgaW5zcGVjdCB0aGUgbmV4dCBzY2FuJ3MgcGFyYW1ldGVycyBiZWZvcmUgZGVjaWRpbmcgdG8gZGlzcGxheSBpdC4KLQotCi1JbiBidWZmZXJlZC1pbWFnZSBtb2RlLCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBuZXZlciBwZXJmb3JtcyBpbnB1dCBhbmQKLXRodXMgbmV2ZXIgc3VzcGVuZHMuICBBbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgaW5wdXQgc3VzcGVuc2lvbiB3aXRoCi1idWZmZXJlZC1pbWFnZSBtb2RlIG11c3QgYmUgcHJlcGFyZWQgZm9yIHN1c3BlbnNpb24gcmV0dXJucyBmcm9tIHRoZXNlCi1yb3V0aW5lczoKLSoganBlZ19zdGFydF9vdXRwdXQoKSBwZXJmb3JtcyBpbnB1dCBvbmx5IGlmIHlvdSByZXF1ZXN0IDItcGFzcyBxdWFudGl6YXRpb24KLSAgYW5kIHRoZSB0YXJnZXQgc2NhbiBpc24ndCBmdWxseSByZWFkIHlldC4gIChUaGlzIGlzIGRpc2N1c3NlZCBiZWxvdy4pCi0qIGpwZWdfcmVhZF9zY2FubGluZXMoKSwgYXMgYWx3YXlzLCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIHRoYXQgaXQKLSAgd2FzIGFibGUgdG8gcHJvZHVjZSBiZWZvcmUgc3VzcGVuZGluZy4KLSoganBlZ19maW5pc2hfb3V0cHV0KCkgd2lsbCByZWFkIGFueSBtYXJrZXJzIGZvbGxvd2luZyB0aGUgdGFyZ2V0IHNjYW4sCi0gIHVwIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgb3IgdGhlIFNPUyBtYXJrZXIgdGhhdCBiZWdpbnMgYW5vdGhlciBzY2FuLgotICAoQnV0IGl0IHJlYWRzIG5vIGlucHV0IGlmIGpwZWdfY29uc3VtZV9pbnB1dCgpIGhhcyBhbHJlYWR5IHJlYWNoZWQgdGhlCi0gIGVuZCBvZiB0aGUgZmlsZSBvciBhIFNPUyBtYXJrZXIgYmV5b25kIHRoZSB0YXJnZXQgb3V0cHV0IHNjYW4uKQotKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgd2lsbCByZWFkIHVudGlsIHRoZSBlbmQgb2YgZmlsZSwgYW5kIHRodXMgY2FuCi0gIHN1c3BlbmQgaWYgdGhlIGVuZCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHJlYWNoZWQgKGFzIGNhbiBiZSB0ZXN0ZWQgYnkKLSAgY2FsbGluZyBqcGVnX2lucHV0X2NvbXBsZXRlKCkpLgotanBlZ19zdGFydF9vdXRwdXQoKSwganBlZ19maW5pc2hfb3V0cHV0KCksIGFuZCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkKLWFsbCByZXR1cm4gVFJVRSBpZiB0aGV5IGNvbXBsZXRlZCB0aGVpciB0YXNrcywgRkFMU0UgaWYgdGhleSBoYWQgdG8gc3VzcGVuZC4KLUluIHRoZSBldmVudCBvZiBhIEZBTFNFIHJldHVybiwgdGhlIGFwcGxpY2F0aW9uIG11c3QgbG9hZCBtb3JlIGlucHV0IGRhdGEKLWFuZCByZXBlYXQgdGhlIGNhbGwuICBBcHBsaWNhdGlvbnMgdGhhdCB1c2Ugbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2VzIG5lZWQKLW5vdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlcyBvZiB0aGVzZSB0aHJlZSByb3V0aW5lcy4KLQotCi1JdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgZGVjb2RpbmcgcGFyYW1ldGVycyBiZXR3ZWVuIG91dHB1dCBwYXNzZXMgaW4gdGhlCi1idWZmZXJlZC1pbWFnZSBtb2RlLiAgVGhlIGRlY29kZXIgbGlicmFyeSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSB2ZXJ5Ci1saW1pdGVkIGNoYW5nZXMgb2YgcGFyYW1ldGVycy4gIE9OTFkgVEhFIEZPTExPV0lORyBwYXJhbWV0ZXIgY2hhbmdlcyBhcmUKLWFsbG93ZWQgYWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzKCkgaXMgY2FsbGVkOgotKiBkY3RfbWV0aG9kIGNhbiBiZSBjaGFuZ2VkIGJlZm9yZSBlYWNoIGNhbGwgdG8ganBlZ19zdGFydF9vdXRwdXQoKS4KLSAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCB1c2UgYSBmYXN0IERDVCBtZXRob2QgZm9yIGVhcmx5IHNjYW5zLCBjaGFuZ2luZwotICB0byBhIGhpZ2hlciBxdWFsaXR5IG1ldGhvZCBmb3IgdGhlIGZpbmFsIHNjYW4uCi0qIGRpdGhlcl9tb2RlIGNhbiBiZSBjaGFuZ2VkIGJlZm9yZSBlYWNoIGNhbGwgdG8ganBlZ19zdGFydF9vdXRwdXQoKTsKLSAgb2YgY291cnNlIHRoaXMgaGFzIG5vIGltcGFjdCBpZiBub3QgdXNpbmcgY29sb3IgcXVhbnRpemF0aW9uLiAgVHlwaWNhbGx5Ci0gIG9uZSB3b3VsZCB1c2Ugb3JkZXJlZCBkaXRoZXIgZm9yIGluaXRpYWwgcGFzc2VzLCB0aGVuIHN3aXRjaCB0bwotICBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyIGZvciB0aGUgZmluYWwgcGFzcy4gIENhdXRpb246IGNoYW5naW5nIGRpdGhlciBtb2RlCi0gIGNhbiBjYXVzZSBtb3JlIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgYnkgdGhlIGxpYnJhcnkuICBBbHRob3VnaCB0aGUgYW1vdW50Ci0gIG9mIG1lbW9yeSBpbnZvbHZlZCBpcyBub3QgbGFyZ2UgKGEgc2NhbmxpbmUgb3Igc28pLCBpdCBtYXkgY2F1c2UgdGhlCi0gIGluaXRpYWwgbWF4X21lbW9yeV90b191c2Ugc3BlY2lmaWNhdGlvbiB0byBiZSBleGNlZWRlZCwgd2hpY2ggaW4gdGhlIHdvcnN0Ci0gIGNhc2Ugd291bGQgcmVzdWx0IGluIGFuIG91dC1vZi1tZW1vcnkgZmFpbHVyZS4KLSogZG9fYmxvY2tfc21vb3RoaW5nIGNhbiBiZSBjaGFuZ2VkIGJlZm9yZSBlYWNoIGNhbGwgdG8ganBlZ19zdGFydF9vdXRwdXQoKS4KLSAgVGhpcyBzZXR0aW5nIGlzIHJlbGV2YW50IG9ubHkgd2hlbiBkZWNvZGluZyBhIHByb2dyZXNzaXZlIEpQRUcgaW1hZ2UuCi0gIER1cmluZyB0aGUgZmlyc3QgREMtb25seSBzY2FuLCBibG9jayBzbW9vdGhpbmcgcHJvdmlkZXMgYSB2ZXJ5ICJmdXp6eSIgbG9vawotICBpbnN0ZWFkIG9mIHRoZSB2ZXJ5ICJibG9ja3kiIGxvb2sgc2VlbiB3aXRob3V0IGl0OyB3aGljaCBpcyBiZXR0ZXIgc2VlbXMgYQotICBtYXR0ZXIgb2YgcGVyc29uYWwgdGFzdGUuICBCdXQgYmxvY2sgc21vb3RoaW5nIGlzIG5lYXJseSBhbHdheXMgYSB3aW4KLSAgZHVyaW5nIGxhdGVyIHN0YWdlcywgZXNwZWNpYWxseSB3aGVuIGRlY29kaW5nIGEgc3VjY2Vzc2l2ZS1hcHByb3hpbWF0aW9uCi0gIGltYWdlOiBzbW9vdGhpbmcgaGVscHMgdG8gaGlkZSB0aGUgc2xpZ2h0IGJsb2NraW5lc3MgdGhhdCBvdGhlcndpc2Ugc2hvd3MKLSAgdXAgb24gc21vb3RoIGdyYWRpZW50cyB1bnRpbCB0aGUgbG93ZXN0IGNvZWZmaWNpZW50IGJpdHMgYXJlIHNlbnQuCi0qIENvbG9yIHF1YW50aXphdGlvbiBtb2RlIGNhbiBiZSBjaGFuZ2VkIHVuZGVyIHRoZSBydWxlcyBkZXNjcmliZWQgYmVsb3cuCi0gIFlvdSAqY2Fubm90KiBjaGFuZ2UgYmV0d2VlbiBmdWxsLWNvbG9yIGFuZCBxdWFudGl6ZWQgb3V0cHV0IChiZWNhdXNlIHRoYXQKLSAgd291bGQgYWx0ZXIgdGhlIHJlcXVpcmVkIEkvTyBidWZmZXIgc2l6ZXMpLCBidXQgeW91IGNhbiBjaGFuZ2Ugd2hpY2gKLSAgcXVhbnRpemF0aW9uIG1ldGhvZCBpcyB1c2VkLgotCi1XaGVuIGdlbmVyYXRpbmcgY29sb3ItcXVhbnRpemVkIG91dHB1dCwgY2hhbmdpbmcgcXVhbnRpemF0aW9uIG1ldGhvZCBpcyBhCi12ZXJ5IHVzZWZ1bCB3YXkgb2Ygc3dpdGNoaW5nIGJldHdlZW4gaGlnaC1zcGVlZCBhbmQgaGlnaC1xdWFsaXR5IGRpc3BsYXkuCi1UaGUgbGlicmFyeSBhbGxvd3MgeW91IHRvIGNoYW5nZSBhbW9uZyBpdHMgdGhyZWUgcXVhbnRpemF0aW9uIG1ldGhvZHM6Ci0xLiBTaW5nbGUtcGFzcyBxdWFudGl6YXRpb24gdG8gYSBmaXhlZCBjb2xvciBjdWJlLgotICAgU2VsZWN0ZWQgYnkgY2luZm8udHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRSBhbmQgY2luZm8uY29sb3JtYXAgPSBOVUxMLgotMi4gU2luZ2xlLXBhc3MgcXVhbnRpemF0aW9uIHRvIGFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGNvbG9ybWFwLgotICAgU2VsZWN0ZWQgYnkgc2V0dGluZyBjaW5mby5jb2xvcm1hcCB0byBwb2ludCB0byB0aGUgY29sb3JtYXAgKHRoZSB2YWx1ZSBvZgotICAgdHdvX3Bhc3NfcXVhbnRpemUgaXMgaWdub3JlZCk7IGFsc28gc2V0IGNpbmZvLmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzLgotMy4gVHdvLXBhc3MgcXVhbnRpemF0aW9uIHRvIGEgY29sb3JtYXAgY2hvc2VuIHNwZWNpZmljYWxseSBmb3IgdGhlIGltYWdlLgotICAgU2VsZWN0ZWQgYnkgY2luZm8udHdvX3Bhc3NfcXVhbnRpemUgPSBUUlVFIGFuZCBjaW5mby5jb2xvcm1hcCA9IE5VTEwuCi0gICAoVGhpcyBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nIHNlbGVjdGVkIGJ5IGpwZWdfcmVhZF9oZWFkZXIsIGJ1dCBpdCBpcwotICAgcHJvYmFibHkgTk9UIHdoYXQgeW91IHdhbnQgZm9yIHRoZSBmaXJzdCBwYXNzIG9mIHByb2dyZXNzaXZlIGRpc3BsYXkhKQotVGhlc2UgbWV0aG9kcyBvZmZlciBzdWNjZXNzaXZlbHkgYmV0dGVyIHF1YWxpdHkgYW5kIGxlc3NlciBzcGVlZC4gIEhvd2V2ZXIsCi1vbmx5IHRoZSBmaXJzdCBtZXRob2QgaXMgYXZhaWxhYmxlIGZvciBxdWFudGl6aW5nIGluIG5vbi1SR0IgY29sb3Igc3BhY2VzLgotCi1JTVBPUlRBTlQ6IGJlY2F1c2UgdGhlIGRpZmZlcmVudCBxdWFudGl6ZXIgbWV0aG9kcyBoYXZlIHZlcnkgZGlmZmVyZW50Ci13b3JraW5nLXN0b3JhZ2UgcmVxdWlyZW1lbnRzLCB0aGUgbGlicmFyeSByZXF1aXJlcyB5b3UgdG8gaW5kaWNhdGUgd2hpY2gKLW9uZShzKSB5b3UgaW50ZW5kIHRvIHVzZSBiZWZvcmUgeW91IGNhbGwganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICAoSWYgd2UgZGlkCi1ub3QgcmVxdWlyZSB0aGlzLCB0aGUgbWF4X21lbW9yeV90b191c2Ugc2V0dGluZyB3b3VsZCBiZSBhIGNvbXBsZXRlIGZpY3Rpb24uKQotWW91IGRvIHRoaXMgYnkgc2V0dGluZyBvbmUgb3IgbW9yZSBvZiB0aGVzZSB0aHJlZSBjaW5mbyBmaWVsZHMgdG8gVFJVRToKLQllbmFibGVfMXBhc3NfcXVhbnQJCUZpeGVkIGNvbG9yIGN1YmUgY29sb3JtYXAKLQllbmFibGVfZXh0ZXJuYWxfcXVhbnQJCUV4dGVybmFsbHktc3VwcGxpZWQgY29sb3JtYXAKLQllbmFibGVfMnBhc3NfcXVhbnQJCVR3by1wYXNzIGN1c3RvbSBjb2xvcm1hcAotQWxsIHRocmVlIGFyZSBpbml0aWFsaXplZCBGQUxTRSBieSBqcGVnX3JlYWRfaGVhZGVyKCkuICBCdXQKLWpwZWdfc3RhcnRfZGVjb21wcmVzcygpIGF1dG9tYXRpY2FsbHkgc2V0cyBUUlVFIHRoZSBvbmUgc2VsZWN0ZWQgYnkgdGhlCi1jdXJyZW50IHR3b19wYXNzX3F1YW50aXplIGFuZCBjb2xvcm1hcCBzZXR0aW5ncywgc28geW91IG9ubHkgbmVlZCB0byBzZXQgdGhlCi1lbmFibGUgZmxhZ3MgZm9yIGFueSBvdGhlciBxdWFudGl6YXRpb24gbWV0aG9kcyB5b3UgcGxhbiB0byBjaGFuZ2UgdG8gbGF0ZXIuCi0KLUFmdGVyIHNldHRpbmcgdGhlIGVuYWJsZSBmbGFncyBjb3JyZWN0bHkgYXQganBlZ19zdGFydF9kZWNvbXByZXNzKCkgdGltZSwgeW91Ci1jYW4gY2hhbmdlIHRvIGFueSBlbmFibGVkIHF1YW50aXphdGlvbiBtZXRob2QgYnkgc2V0dGluZyB0d29fcGFzc19xdWFudGl6ZQotYW5kIGNvbG9ybWFwIHByb3Blcmx5IGp1c3QgYmVmb3JlIGNhbGxpbmcganBlZ19zdGFydF9vdXRwdXQoKS4gIFRoZSBmb2xsb3dpbmcKLXNwZWNpYWwgcnVsZXMgYXBwbHk6Ci0xLiBZb3UgbXVzdCBleHBsaWNpdGx5IHNldCBjaW5mby5jb2xvcm1hcCB0byBOVUxMIHdoZW4gc3dpdGNoaW5nIHRvIDEtcGFzcwotICAgb3IgMi1wYXNzIG1vZGUgZnJvbSBhIGRpZmZlcmVudCBtb2RlLCBvciB3aGVuIHlvdSB3YW50IHRoZSAyLXBhc3MKLSAgIHF1YW50aXplciB0byBiZSByZS1ydW4gdG8gZ2VuZXJhdGUgYSBuZXcgY29sb3JtYXAuCi0yLiBUbyBzd2l0Y2ggdG8gYW4gZXh0ZXJuYWwgY29sb3JtYXAsIG9yIHRvIGNoYW5nZSB0byBhIGRpZmZlcmVudCBleHRlcm5hbAotICAgY29sb3JtYXAgdGhhbiB3YXMgdXNlZCBvbiB0aGUgcHJpb3IgcGFzcywgeW91IG11c3QgY2FsbAotICAganBlZ19uZXdfY29sb3JtYXAoKSBhZnRlciBzZXR0aW5nIGNpbmZvLmNvbG9ybWFwLgotTk9URTogaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBzYW1lIGNvbG9ybWFwIGFzIHdhcyB1c2VkIGluIHRoZSBwcmlvciBwYXNzLAoteW91IHNob3VsZCBub3QgZG8gZWl0aGVyIG9mIHRoZXNlIHRoaW5ncy4gIFRoaXMgd2lsbCBzYXZlIHNvbWUgbm9udHJpdmlhbAotc3dpdGNob3ZlciBjb3N0cy4KLShUaGVzZSByZXF1aXJlbWVudHMgZXhpc3QgYmVjYXVzZSBjaW5mby5jb2xvcm1hcCB3aWxsIGFsd2F5cyBiZSBub24tTlVMTAotYWZ0ZXIgY29tcGxldGluZyBhIHByaW9yIG91dHB1dCBwYXNzLCBzaW5jZSBib3RoIHRoZSAxLXBhc3MgYW5kIDItcGFzcwotcXVhbnRpemVycyBzZXQgaXQgdG8gcG9pbnQgdG8gdGhlaXIgb3V0cHV0IGNvbG9ybWFwcy4gIFRodXMgeW91IGhhdmUgdG8KLWRvIG9uZSBvZiB0aGVzZSB0d28gdGhpbmdzIHRvIG5vdGlmeSB0aGUgbGlicmFyeSB0aGF0IHNvbWV0aGluZyBoYXMgY2hhbmdlZC4KLVl1cCwgaXQncyBhIGJpdCBrbHVneSwgYnV0IGl0J3MgbmVjZXNzYXJ5IHRvIGRvIGl0IHRoaXMgd2F5IGZvciBiYWNrd2FyZHMKLWNvbXBhdGliaWxpdHkuKQotCi1Ob3RlIHRoYXQgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgdGhlIGxpYnJhcnkgZ2VuZXJhdGVzIGFueSByZXF1ZXN0ZWQgY29sb3JtYXAKLWR1cmluZyBqcGVnX3N0YXJ0X291dHB1dCgpLCBub3QgZHVyaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgotCi1XaGVuIHVzaW5nIHR3by1wYXNzIHF1YW50aXphdGlvbiwganBlZ19zdGFydF9vdXRwdXQoKSBtYWtlcyBhIHBhc3Mgb3ZlciB0aGUKLWJ1ZmZlcmVkIGltYWdlIHRvIGRldGVybWluZSB0aGUgb3B0aW11bSBjb2xvciBtYXA7IGl0IHRoZXJlZm9yZSBtYXkgdGFrZSBhCi1zaWduaWZpY2FudCBhbW91bnQgb2YgdGltZSwgd2hlcmVhcyBvcmRpbmFyaWx5IGl0IGRvZXMgbGl0dGxlIHdvcmsuICBUaGUKLXByb2dyZXNzIG1vbml0b3IgaG9vayBpcyBjYWxsZWQgZHVyaW5nIHRoaXMgcGFzcywgaWYgZGVmaW5lZC4gIEl0IGlzIGFsc28KLWltcG9ydGFudCB0byByZWFsaXplIHRoYXQgaWYgdGhlIHNwZWNpZmllZCB0YXJnZXQgc2NhbiBudW1iZXIgaXMgZ3JlYXRlciB0aGFuCi1vciBlcXVhbCB0byB0aGUgY3VycmVudCBpbnB1dCBzY2FuIG51bWJlciwganBlZ19zdGFydF9vdXRwdXQoKSB3aWxsIGF0dGVtcHQKLXRvIGNvbnN1bWUgaW5wdXQgYXMgaXQgbWFrZXMgdGhpcyBwYXNzLiAgSWYgeW91IHVzZSBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UsCi15b3UgbmVlZCB0byBjaGVjayBmb3IgYSBGQUxTRSByZXR1cm4gZnJvbSBqcGVnX3N0YXJ0X291dHB1dCgpIHVuZGVyIHRoZXNlCi1jb25kaXRpb25zLiAgVGhlIGNvbWJpbmF0aW9uIG9mIDItcGFzcyBxdWFudGl6YXRpb24gYW5kIGEgbm90LXlldC1mdWxseS1yZWFkCi10YXJnZXQgc2NhbiBpcyB0aGUgb25seSBjYXNlIGluIHdoaWNoIGpwZWdfc3RhcnRfb3V0cHV0KCkgd2lsbCBjb25zdW1lIGlucHV0LgotCi0KLUFwcGxpY2F0aW9uIGF1dGhvcnMgd2hvIHN1cHBvcnQgYnVmZmVyZWQtaW1hZ2UgbW9kZSBtYXkgYmUgdGVtcHRlZCB0byB1c2UgaXQKLWZvciBhbGwgSlBFRyBpbWFnZXMsIGV2ZW4gc2luZ2xlLXNjYW4gb25lcy4gIFRoaXMgd2lsbCB3b3JrLCBidXQgaXQgaXMKLWluZWZmaWNpZW50OiB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBhbiBpbWFnZS1zaXplZCBjb2VmZmljaWVudCBidWZmZXIgZm9yCi1zaW5nbGUtc2NhbiBpbWFnZXMuICBSZXF1ZXN0aW5nIGJ1ZmZlcmVkLWltYWdlIG1vZGUgZm9yIHN1Y2ggYW4gaW1hZ2Ugd2FzdGVzCi1tZW1vcnkuICBXb3JzZSwgaXQgY2FuIGNvc3QgdGltZSBvbiBsYXJnZSBpbWFnZXMsIHNpbmNlIHRoZSBidWZmZXJlZCBkYXRhIGhhcwotdG8gYmUgc3dhcHBlZCBvdXQgb3Igd3JpdHRlbiB0byBhIHRlbXBvcmFyeSBmaWxlLiAgSWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQKLW1heGltdW0gcGVyZm9ybWFuY2Ugb24gYmFzZWxpbmUgSlBFRyBmaWxlcywgeW91IHNob3VsZCB1c2UgYnVmZmVyZWQtaW1hZ2UKLW1vZGUgb25seSB3aGVuIHRoZSBpbmNvbWluZyBmaWxlIGFjdHVhbGx5IGhhcyBtdWx0aXBsZSBzY2Fucy4gIFRoaXMgY2FuIGJlCi10ZXN0ZWQgYnkgY2FsbGluZyBqcGVnX2hhc19tdWx0aXBsZV9zY2FucygpLCB3aGljaCB3aWxsIHJldHVybiBhIGNvcnJlY3QKLXJlc3VsdCBhdCBhbnkgdGltZSBhZnRlciBqcGVnX3JlYWRfaGVhZGVyKCkgY29tcGxldGVzLgotCi1JdCBpcyBhbHNvIHdvcnRoIG5vdGluZyB0aGF0IHdoZW4geW91IHVzZSBqcGVnX2NvbnN1bWVfaW5wdXQoKSB0byBsZXQgaW5wdXQKLXByb2Nlc3NpbmcgZ2V0IGFoZWFkIG9mIG91dHB1dCBwcm9jZXNzaW5nLCB0aGUgcmVzdWx0aW5nIHBhdHRlcm4gb2YgYWNjZXNzIHRvCi10aGUgY29lZmZpY2llbnQgYnVmZmVyIGlzIHF1aXRlIG5vbnNlcXVlbnRpYWwuICBJdCdzIGJlc3QgdG8gdXNlIHRoZSBtZW1vcnkKLW1hbmFnZXIgam1lbW5vYnMuYyBpZiB5b3UgY2FuIChpZSwgaWYgeW91IGhhdmUgZW5vdWdoIHJlYWwgb3IgdmlydHVhbCBtYWluCi1tZW1vcnkpLiAgSWYgbm90LCBhdCBsZWFzdCBtYWtlIHN1cmUgdGhhdCBtYXhfbWVtb3J5X3RvX3VzZSBpcyBzZXQgYXMgaGlnaCBhcwotcG9zc2libGUuICBJZiB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlciBoYXMgdG8gdXNlIGEgdGVtcG9yYXJ5IGZpbGUsIHlvdSB3aWxsCi1wcm9iYWJseSBzZWUgYSBsb3Qgb2YgZGlzayB0cmFmZmljIGFuZCBwb29yIHBlcmZvcm1hbmNlLiAgKFRoaXMgY291bGQgYmUKLWltcHJvdmVkIHdpdGggYWRkaXRpb25hbCB3b3JrIG9uIHRoZSBtZW1vcnkgbWFuYWdlciwgYnV0IHdlIGhhdmVuJ3QgZ290dGVuCi1hcm91bmQgdG8gaXQgeWV0LikKLQotSW4gc29tZSBhcHBsaWNhdGlvbnMgaXQgbWF5IGJlIGNvbnZlbmllbnQgdG8gdXNlIGpwZWdfY29uc3VtZV9pbnB1dCgpIGZvciBhbGwKLWlucHV0IHByb2Nlc3NpbmcsIGluY2x1ZGluZyByZWFkaW5nIHRoZSBpbml0aWFsIG1hcmtlcnM7IHRoYXQgaXMsIHlvdSBtYXkKLXdpc2ggdG8gY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKSBpbnN0ZWFkIG9mIGpwZWdfcmVhZF9oZWFkZXIoKSBkdXJpbmcKLXN0YXJ0dXAuICBUaGlzIHdvcmtzLCBidXQgbm90ZSB0aGF0IHlvdSBtdXN0IGNoZWNrIGZvciBKUEVHX1JFQUNIRURfU09TIGFuZAotSlBFR19SRUFDSEVEX0VPSSByZXR1cm4gY29kZXMgYXMgdGhlIGVxdWl2YWxlbnQgb2YganBlZ19yZWFkX2hlYWRlcidzIGNvZGVzLgotT25jZSB0aGUgZmlyc3QgU09TIG1hcmtlciBoYXMgYmVlbiByZWFjaGVkLCB5b3UgbXVzdCBjYWxsCi1qcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBiZWZvcmUganBlZ19jb25zdW1lX2lucHV0KCkgd2lsbCBjb25zdW1lIG1vcmUgaW5wdXQ7Ci1pdCdsbCBqdXN0IGtlZXAgcmV0dXJuaW5nIEpQRUdfUkVBQ0hFRF9TT1MgdW50aWwgeW91IGRvLiAgSWYgeW91IHJlYWQgYQotdGFibGVzLW9ubHkgZmlsZSB0aGlzIHdheSwganBlZ19jb25zdW1lX2lucHV0KCkgd2lsbCByZXR1cm4gSlBFR19SRUFDSEVEX0VPSQotd2l0aG91dCBldmVyIHJldHVybmluZyBKUEVHX1JFQUNIRURfU09TOyBiZSBzdXJlIHRvIGNoZWNrIGZvciB0aGlzIGNhc2UuCi1JZiB0aGlzIGhhcHBlbnMsIHRoZSBkZWNvbXByZXNzb3Igd2lsbCBub3QgcmVhZCBhbnkgbW9yZSBpbnB1dCB1bnRpbCB5b3UgY2FsbAotanBlZ19hYm9ydCgpIHRvIHJlc2V0IGl0LiAgSXQgaXMgT0sgdG8gY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKSBldmVuIHdoZW4gbm90Ci11c2luZyBidWZmZXJlZC1pbWFnZSBtb2RlLCBidXQgaW4gdGhhdCBjYXNlIGl0J3MgYmFzaWNhbGx5IGEgbm8tb3AgYWZ0ZXIgdGhlCi1pbml0aWFsIG1hcmtlcnMgaGF2ZSBiZWVuIHJlYWQ6IGl0IHdpbGwganVzdCByZXR1cm4gSlBFR19TVVNQRU5ERUQuCi0KLQotQWJicmV2aWF0ZWQgZGF0YXN0cmVhbXMgYW5kIG11bHRpcGxlIGltYWdlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BIEpQRUcgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvYmplY3QgY2FuIGJlIHJldXNlZCB0byBwcm9jZXNzIG11bHRpcGxlCi1pbWFnZXMuICBUaGlzIHNhdmVzIGEgc21hbGwgYW1vdW50IG9mIHRpbWUgcGVyIGltYWdlIGJ5IGVsaW1pbmF0aW5nIHRoZQotImNyZWF0ZSIgYW5kICJkZXN0cm95IiBvcGVyYXRpb25zLCBidXQgdGhhdCBpc24ndCB0aGUgcmVhbCBwdXJwb3NlIG9mIHRoZQotZmVhdHVyZS4gIFJhdGhlciwgcmV1c2Ugb2YgYW4gb2JqZWN0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIGFiYnJldmlhdGVkIEpQRUcKLWRhdGFzdHJlYW1zLiAgT2JqZWN0IHJldXNlIGNhbiBhbHNvIHNpbXBsaWZ5IHByb2Nlc3NpbmcgYSBzZXJpZXMgb2YgaW1hZ2VzIGluCi1hIHNpbmdsZSBpbnB1dCBvciBvdXRwdXQgZmlsZS4gIFRoaXMgc2VjdGlvbiBleHBsYWlucyB0aGVzZSBmZWF0dXJlcy4KLQotQSBKUEVHIGZpbGUgbm9ybWFsbHkgY29udGFpbnMgc2V2ZXJhbCBodW5kcmVkIGJ5dGVzIHdvcnRoIG9mIHF1YW50aXphdGlvbgotYW5kIEh1ZmZtYW4gdGFibGVzLiAgSW4gYSBzaXR1YXRpb24gd2hlcmUgbWFueSBpbWFnZXMgd2lsbCBiZSBzdG9yZWQgb3IKLXRyYW5zbWl0dGVkIHdpdGggaWRlbnRpY2FsIHRhYmxlcywgdGhpcyBtYXkgcmVwcmVzZW50IGFuIGFubm95aW5nIG92ZXJoZWFkLgotVGhlIEpQRUcgc3RhbmRhcmQgdGhlcmVmb3JlIHBlcm1pdHMgdGFibGVzIHRvIGJlIG9taXR0ZWQuICBUaGUgc3RhbmRhcmQKLWRlZmluZXMgdGhyZWUgY2xhc3NlcyBvZiBKUEVHIGRhdGFzdHJlYW1zOgotICAqICJJbnRlcmNoYW5nZSIgZGF0YXN0cmVhbXMgY29udGFpbiBhbiBpbWFnZSBhbmQgYWxsIHRhYmxlcyBuZWVkZWQgdG8gZGVjb2RlCi0gICAgIHRoZSBpbWFnZS4gIFRoZXNlIGFyZSB0aGUgdXN1YWwga2luZCBvZiBKUEVHIGZpbGUuCi0gICogIkFiYnJldmlhdGVkIGltYWdlIiBkYXRhc3RyZWFtcyBjb250YWluIGFuIGltYWdlLCBidXQgYXJlIG1pc3Npbmcgc29tZSBvcgotICAgIGFsbCBvZiB0aGUgdGFibGVzIG5lZWRlZCB0byBkZWNvZGUgdGhhdCBpbWFnZS4KLSAgKiAiQWJicmV2aWF0ZWQgdGFibGUgc3BlY2lmaWNhdGlvbiIgKGhlbmNlZm9ydGggInRhYmxlcy1vbmx5IikgZGF0YXN0cmVhbXMKLSAgICBjb250YWluIG9ubHkgdGFibGUgc3BlY2lmaWNhdGlvbnMuCi1UbyBkZWNvZGUgYW4gYWJicmV2aWF0ZWQgaW1hZ2UsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb2FkIHRoZSBtaXNzaW5nIHRhYmxlKHMpCi1pbnRvIHRoZSBkZWNvZGVyIGJlZm9yZWhhbmQuICBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgcmVhZGluZyBhIHNlcGFyYXRlCi10YWJsZXMtb25seSBmaWxlLiAgQSB2YXJpYW50IHNjaGVtZSB1c2VzIGEgc2VyaWVzIG9mIGltYWdlcyBpbiB3aGljaCB0aGUgZmlyc3QKLWltYWdlIGlzIGFuIGludGVyY2hhbmdlIChjb21wbGV0ZSkgZGF0YXN0cmVhbSwgd2hpbGUgc3Vic2VxdWVudCBvbmVzIGFyZQotYWJicmV2aWF0ZWQgYW5kIHJlbHkgb24gdGhlIHRhYmxlcyBsb2FkZWQgYnkgdGhlIGZpcnN0IGltYWdlLiAgSXQgaXMgYXNzdW1lZAotdGhhdCBvbmNlIHRoZSBkZWNvZGVyIGhhcyByZWFkIGEgdGFibGUsIGl0IHdpbGwgcmVtZW1iZXIgdGhhdCB0YWJsZSB1bnRpbCBhCi1uZXcgZGVmaW5pdGlvbiBmb3IgdGhlIHNhbWUgdGFibGUgbnVtYmVyIGlzIGVuY291bnRlcmVkLgotCi1JdCBpcyB0aGUgYXBwbGljYXRpb24gZGVzaWduZXIncyByZXNwb25zaWJpbGl0eSB0byBmaWd1cmUgb3V0IGhvdyB0byBhc3NvY2lhdGUKLXRoZSBjb3JyZWN0IHRhYmxlcyB3aXRoIGFuIGFiYnJldmlhdGVkIGltYWdlLiAgV2hpbGUgYWJicmV2aWF0ZWQgZGF0YXN0cmVhbXMKLWNhbiBiZSB1c2VmdWwgaW4gYSBjbG9zZWQgZW52aXJvbm1lbnQsIHRoZWlyIHVzZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCBpbgotYW55IHNpdHVhdGlvbiB3aGVyZSBkYXRhIGV4Y2hhbmdlIHdpdGggb3RoZXIgYXBwbGljYXRpb25zIG1pZ2h0IGJlIG5lZWRlZC4KLUNhdmVhdCBkZXNpZ25lci4KLQotVGhlIEpQRUcgbGlicmFyeSBwcm92aWRlcyBzdXBwb3J0IGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGFueSBjb21iaW5hdGlvbiBvZgotdGFibGVzLW9ubHkgZGF0YXN0cmVhbXMgYW5kIGFiYnJldmlhdGVkIGltYWdlcy4gIEluIGJvdGggY29tcHJlc3Npb24gYW5kCi1kZWNvbXByZXNzaW9uIG9iamVjdHMsIGEgcXVhbnRpemF0aW9uIG9yIEh1ZmZtYW4gdGFibGUgd2lsbCBiZSByZXRhaW5lZCBmb3IKLXRoZSBsaWZldGltZSBvZiB0aGUgb2JqZWN0LCB1bmxlc3MgaXQgaXMgb3ZlcndyaXR0ZW4gYnkgYSBuZXcgdGFibGUgZGVmaW5pdGlvbi4KLQotCi1UbyBjcmVhdGUgYWJicmV2aWF0ZWQgaW1hZ2UgZGF0YXN0cmVhbXMsIGl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRvIHRlbGwgdGhlCi1jb21wcmVzc29yIG5vdCB0byBlbWl0IHNvbWUgb3IgYWxsIG9mIHRoZSB0YWJsZXMgaXQgaXMgdXNpbmcuICBFYWNoCi1xdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGUgc3RydWN0IGNvbnRhaW5zIGEgYm9vbGVhbiBmaWVsZCAic2VudF90YWJsZSIsCi13aGljaCBub3JtYWxseSBpcyBpbml0aWFsaXplZCB0byBGQUxTRS4gIEZvciBlYWNoIHRhYmxlIHVzZWQgYnkgdGhlIGltYWdlLCB0aGUKLWhlYWRlci13cml0aW5nIHByb2Nlc3MgZW1pdHMgdGhlIHRhYmxlIGFuZCBzZXRzIHNlbnRfdGFibGUgPSBUUlVFIHVubGVzcyBpdCBpcwotYWxyZWFkeSBUUlVFLiAgKEluIG5vcm1hbCB1c2FnZSwgdGhpcyBwcmV2ZW50cyBvdXRwdXR0aW5nIHRoZSBzYW1lIHRhYmxlCi1kZWZpbml0aW9uIG11bHRpcGxlIHRpbWVzLCBhcyB3b3VsZCBvdGhlcndpc2Ugb2NjdXIgYmVjYXVzZSB0aGUgY2hyb21hCi1jb21wb25lbnRzIHR5cGljYWxseSBzaGFyZSB0YWJsZXMuKSAgVGh1cywgc2V0dGluZyB0aGlzIGZpZWxkIHRvIFRSVUUgYmVmb3JlCi1jYWxsaW5nIGpwZWdfc3RhcnRfY29tcHJlc3MoKSB3aWxsIHByZXZlbnQgdGhlIHRhYmxlIGZyb20gYmVpbmcgd3JpdHRlbiBhdAotYWxsLgotCi1JZiB5b3Ugd2FudCB0byBjcmVhdGUgYSAicHVyZSIgYWJicmV2aWF0ZWQgaW1hZ2UgZmlsZSBjb250YWluaW5nIG5vIHRhYmxlcywKLWp1c3QgY2FsbCAianBlZ19zdXBwcmVzc190YWJsZXMoJmNpbmZvLCBUUlVFKSIgYWZ0ZXIgY29uc3RydWN0aW5nIGFsbCB0aGUKLXRhYmxlcy4gIElmIHlvdSB3YW50IHRvIGVtaXQgc29tZSBidXQgbm90IGFsbCB0YWJsZXMsIHlvdSdsbCBuZWVkIHRvIHNldCB0aGUKLWluZGl2aWR1YWwgc2VudF90YWJsZSBmaWVsZHMgZGlyZWN0bHkuCi0KLVRvIGNyZWF0ZSBhbiBhYmJyZXZpYXRlZCBpbWFnZSwgeW91IG11c3QgYWxzbyBjYWxsIGpwZWdfc3RhcnRfY29tcHJlc3MoKQotd2l0aCBhIHNlY29uZCBwYXJhbWV0ZXIgb2YgRkFMU0UsIG5vdCBUUlVFLiAgT3RoZXJ3aXNlIGpwZWdfc3RhcnRfY29tcHJlc3MoKQotd2lsbCBmb3JjZSBhbGwgdGhlIHNlbnRfdGFibGUgZmllbGRzIHRvIEZBTFNFLiAgKFRoaXMgaXMgYSBzYWZldHkgZmVhdHVyZSB0bwotcHJldmVudCBhYmJyZXZpYXRlZCBpbWFnZXMgZnJvbSBiZWluZyBjcmVhdGVkIGFjY2lkZW50YWxseS4pCi0KLVRvIGNyZWF0ZSBhIHRhYmxlcy1vbmx5IGZpbGUsIHBlcmZvcm0gdGhlIHNhbWUgcGFyYW1ldGVyIHNldHVwIHRoYXQgeW91Ci1ub3JtYWxseSB3b3VsZCwgYnV0IGluc3RlYWQgb2YgY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIHNvIG9uLCBjYWxsCi1qcGVnX3dyaXRlX3RhYmxlcygmY2luZm8pLiAgVGhpcyB3aWxsIHdyaXRlIGFuIGFiYnJldmlhdGVkIGRhdGFzdHJlYW0KLWNvbnRhaW5pbmcgb25seSBTT0ksIERRVCBhbmQvb3IgREhUIG1hcmtlcnMsIGFuZCBFT0kuICBBbGwgdGhlIHF1YW50aXphdGlvbgotYW5kIEh1ZmZtYW4gdGFibGVzIHRoYXQgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoZSBjb21wcmVzc2lvbiBvYmplY3Qgd2lsbAotYmUgZW1pdHRlZCB1bmxlc3MgdGhlaXIgc2VudF90YWJsZXMgZmxhZyBpcyBhbHJlYWR5IFRSVUUsIGFuZCB0aGVuIGFsbCB0aGUKLXNlbnRfdGFibGVzIGZsYWdzIHdpbGwgYmUgc2V0IFRSVUUuCi0KLUEgc3VyZS1maXJlIHdheSB0byBjcmVhdGUgbWF0Y2hpbmcgdGFibGVzLW9ubHkgYW5kIGFiYnJldmlhdGVkIGltYWdlIGZpbGVzCi1pcyB0byBwcm9jZWVkIGFzIGZvbGxvd3M6Ci0KLQljcmVhdGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QKLQlzZXQgSlBFRyBwYXJhbWV0ZXJzCi0Jc2V0IGRlc3RpbmF0aW9uIHRvIHRhYmxlcy1vbmx5IGZpbGUKLQlqcGVnX3dyaXRlX3RhYmxlcygmY2luZm8pOwotCXNldCBkZXN0aW5hdGlvbiB0byBpbWFnZSBmaWxlCi0JanBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIEZBTFNFKTsKLQl3cml0ZSBkYXRhLi4uCi0JanBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKLQotU2luY2UgdGhlIEpQRUcgcGFyYW1ldGVycyBhcmUgbm90IGFsdGVyZWQgYmV0d2VlbiB3cml0aW5nIHRoZSB0YWJsZSBmaWxlIGFuZAotdGhlIGFiYnJldmlhdGVkIGltYWdlIGZpbGUsIHRoZSBzYW1lIHRhYmxlcyBhcmUgc3VyZSB0byBiZSB1c2VkLiAgT2YgY291cnNlLAoteW91IGNhbiByZXBlYXQgdGhlIGpwZWdfc3RhcnRfY29tcHJlc3MoKSAuLi4ganBlZ19maW5pc2hfY29tcHJlc3MoKSBzZXF1ZW5jZQotbWFueSB0aW1lcyB0byBwcm9kdWNlIG1hbnkgYWJicmV2aWF0ZWQgaW1hZ2UgZmlsZXMgbWF0Y2hpbmcgdGhlIHRhYmxlIGZpbGUuCi0KLVlvdSBjYW5ub3Qgc3VwcHJlc3Mgb3V0cHV0IG9mIHRoZSBjb21wdXRlZCBIdWZmbWFuIHRhYmxlcyB3aGVuIEh1ZmZtYW4KLW9wdGltaXphdGlvbiBpcyBzZWxlY3RlZC4gIChJZiB5b3UgY291bGQsIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIGRlY29kZSB0aGUKLWltYWdlLi4uKSAgR2VuZXJhbGx5LCB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgb3B0aW1pemVfY29kaW5nID0gVFJVRSB3aGVuCi15b3UgYXJlIHRyeWluZyB0byBwcm9kdWNlIGFiYnJldmlhdGVkIGZpbGVzLgotCi1JbiBzb21lIGNhc2VzIHlvdSBtaWdodCB3YW50IHRvIGNvbXByZXNzIGFuIGltYWdlIHVzaW5nIHRhYmxlcyB3aGljaCBhcmUKLW5vdCBzdG9yZWQgaW4gdGhlIGFwcGxpY2F0aW9uLCBidXQgYXJlIGRlZmluZWQgaW4gYW4gaW50ZXJjaGFuZ2Ugb3IKLXRhYmxlcy1vbmx5IGZpbGUgcmVhZGFibGUgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjYW4gYmUgZG9uZSBieSBzZXR0aW5nIHVwCi1hIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QgdG8gcmVhZCB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlLCB0aGVuIGNvcHlpbmcgdGhlCi10YWJsZXMgaW50byB5b3VyIGNvbXByZXNzaW9uIG9iamVjdC4gIFNlZSBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycygpCi1mb3IgYW4gZXhhbXBsZSBvZiBjb3B5aW5nIHF1YW50aXphdGlvbiB0YWJsZXMuCi0KLQotVG8gcmVhZCBhYmJyZXZpYXRlZCBpbWFnZSBmaWxlcywgeW91IHNpbXBseSBuZWVkIHRvIGxvYWQgdGhlIHByb3BlciB0YWJsZXMKLWludG8gdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IGJlZm9yZSB0cnlpbmcgdG8gcmVhZCB0aGUgYWJicmV2aWF0ZWQgaW1hZ2UuCi1JZiB0aGUgcHJvcGVyIHRhYmxlcyBhcmUgc3RvcmVkIGluIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtLCB5b3UgY2FuIGp1c3QKLWFsbG9jYXRlIHRoZSB0YWJsZSBzdHJ1Y3RzIGFuZCBmaWxsIGluIHRoZWlyIGNvbnRlbnRzIGRpcmVjdGx5LiAgRm9yIGV4YW1wbGUsCi10byBsb2FkIGEgZml4ZWQgcXVhbnRpemF0aW9uIHRhYmxlIGludG8gdGFibGUgc2xvdCAibiI6Ci0KLSAgICBpZiAoY2luZm8ucXVhbnRfdGJsX3B0cnNbbl0gPT0gTlVMTCkKLSAgICAgIGNpbmZvLnF1YW50X3RibF9wdHJzW25dID0ganBlZ19hbGxvY19xdWFudF90YWJsZSgoal9jb21tb25fcHRyKSAmY2luZm8pOwotICAgIHF1YW50X3B0ciA9IGNpbmZvLnF1YW50X3RibF9wdHJzW25dOwkvKiBxdWFudF9wdHIgaXMgSlFVQU5UX1RCTCogKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotICAgICAgLyogUXRhYmxlW10gaXMgZGVzaXJlZCBxdWFudGl6YXRpb24gdGFibGUsIGluIG5hdHVyYWwgYXJyYXkgb3JkZXIgKi8KLSAgICAgIHF1YW50X3B0ci0+cXVhbnR2YWxbaV0gPSBRdGFibGVbaV07Ci0gICAgfQotCi1Db2RlIHRvIGxvYWQgYSBmaXhlZCBIdWZmbWFuIHRhYmxlIGlzIHR5cGljYWxseSAoZm9yIEFDIHRhYmxlICJuIik6Ci0KLSAgICBpZiAoY2luZm8uYWNfaHVmZl90YmxfcHRyc1tuXSA9PSBOVUxMKQotICAgICAgY2luZm8uYWNfaHVmZl90YmxfcHRyc1tuXSA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSAmY2luZm8pOwotICAgIGh1ZmZfcHRyID0gY2luZm8uYWNfaHVmZl90YmxfcHRyc1tuXTsJLyogaHVmZl9wdHIgaXMgSkhVRkZfVEJMKiAqLwotICAgIGZvciAoaSA9IDE7IGkgPD0gMTY7IGkrKykgewotICAgICAgLyogY291bnRzW2ldIGlzIG51bWJlciBvZiBIdWZmbWFuIGNvZGVzIG9mIGxlbmd0aCBpIGJpdHMsIGk9MS4uMTYgKi8KLSAgICAgIGh1ZmZfcHRyLT5iaXRzW2ldID0gY291bnRzW2ldOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgIC8qIHN5bWJvbHNbXSBpcyB0aGUgbGlzdCBvZiBIdWZmbWFuIHN5bWJvbHMsIGluIGNvZGUtbGVuZ3RoIG9yZGVyICovCi0gICAgICBodWZmX3B0ci0+aHVmZnZhbFtpXSA9IHN5bWJvbHNbaV07Ci0gICAgfQotCi0oTm90ZSB0aGF0IHRyeWluZyB0byBzZXQgY2luZm8ucXVhbnRfdGJsX3B0cnNbbl0gdG8gcG9pbnQgZGlyZWN0bHkgYXQgYQotY29uc3RhbnQgSlFVQU5UX1RCTCBvYmplY3QgaXMgbm90IHNhZmUuICBJZiB0aGUgaW5jb21pbmcgZmlsZSBoYXBwZW5lZCB0bwotY29udGFpbiBhIHF1YW50aXphdGlvbiB0YWJsZSBkZWZpbml0aW9uLCB5b3VyIG1hc3RlciB0YWJsZSB3b3VsZCBnZXQKLW92ZXJ3cml0dGVuISAgSW5zdGVhZCBhbGxvY2F0ZSBhIHdvcmtpbmcgdGFibGUgY29weSBhbmQgY29weSB0aGUgbWFzdGVyIHRhYmxlCi1pbnRvIGl0LCBhcyBpbGx1c3RyYXRlZCBhYm92ZS4gIERpdHRvIGZvciBIdWZmbWFuIHRhYmxlcywgb2YgY291cnNlLikKLQotWW91IG1pZ2h0IHdhbnQgdG8gcmVhZCB0aGUgdGFibGVzIGZyb20gYSB0YWJsZXMtb25seSBmaWxlLCByYXRoZXIgdGhhbgotaGFyZC13aXJpbmcgdGhlbSBpbnRvIHlvdXIgYXBwbGljYXRpb24uICBUaGUganBlZ19yZWFkX2hlYWRlcigpIGNhbGwgaXMKLXN1ZmZpY2llbnQgdG8gcmVhZCBhIHRhYmxlcy1vbmx5IGZpbGUuICBZb3UgbXVzdCBwYXNzIGEgc2Vjb25kIHBhcmFtZXRlciBvZgotRkFMU0UgdG8gaW5kaWNhdGUgdGhhdCB5b3UgZG8gbm90IHJlcXVpcmUgYW4gaW1hZ2UgdG8gYmUgcHJlc2VudC4gIFRodXMsIHRoZQotdHlwaWNhbCBzY2VuYXJpbyBpcwotCi0JY3JlYXRlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QKLQlzZXQgc291cmNlIHRvIHRhYmxlcy1vbmx5IGZpbGUKLQlqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgRkFMU0UpOwotCXNldCBzb3VyY2UgdG8gYWJicmV2aWF0ZWQgaW1hZ2UgZmlsZQotCWpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKLQlzZXQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCi0JanBlZ19zdGFydF9kZWNvbXByZXNzKCZjaW5mbyk7Ci0JcmVhZCBkYXRhLi4uCi0JanBlZ19maW5pc2hfZGVjb21wcmVzcygmY2luZm8pOwotCi1JbiBzb21lIGNhc2VzLCB5b3UgbWF5IHdhbnQgdG8gcmVhZCBhIGZpbGUgd2l0aG91dCBrbm93aW5nIHdoZXRoZXIgaXQgY29udGFpbnMKLWFuIGltYWdlIG9yIGp1c3QgdGFibGVzLiAgSW4gdGhhdCBjYXNlLCBwYXNzIEZBTFNFIGFuZCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlCi1mcm9tIGpwZWdfcmVhZF9oZWFkZXIoKTogaXQgd2lsbCBiZSBKUEVHX0hFQURFUl9PSyBpZiBhbiBpbWFnZSB3YXMgZm91bmQsCi1KUEVHX0hFQURFUl9UQUJMRVNfT05MWSBpZiBvbmx5IHRhYmxlcyB3ZXJlIGZvdW5kLiAgKEEgdGhpcmQgcmV0dXJuIHZhbHVlLAotSlBFR19TVVNQRU5ERUQsIGlzIHBvc3NpYmxlIHdoZW4gdXNpbmcgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIG1hbmFnZXIuKQotTm90ZSB0aGF0IGpwZWdfcmVhZF9oZWFkZXIoKSB3aWxsIG5vdCBjb21wbGFpbiBpZiB5b3UgcmVhZCBhbiBhYmJyZXZpYXRlZAotaW1hZ2UgZm9yIHdoaWNoIHlvdSBoYXZlbid0IGxvYWRlZCB0aGUgbWlzc2luZyB0YWJsZXM7IHRoZSBtaXNzaW5nLXRhYmxlIGNoZWNrCi1vY2N1cnMgbGF0ZXIsIGluIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgotCi0KLUl0IGlzIHBvc3NpYmxlIHRvIHJlYWQgYSBzZXJpZXMgb2YgaW1hZ2VzIGZyb20gYSBzaW5nbGUgc291cmNlIGZpbGUgYnkKLXJlcGVhdGluZyB0aGUganBlZ19yZWFkX2hlYWRlcigpIC4uLiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgc2VxdWVuY2UsCi13aXRob3V0IHJlbGVhc2luZy9yZWNyZWF0aW5nIHRoZSBKUEVHIG9iamVjdCBvciB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlLgotKElmIHlvdSBkaWQgcmVpbml0aWFsaXplLCBhbnkgcGFydGlhbCBidWZmZXJsb2FkIGxlZnQgaW4gdGhlIGRhdGEgc291cmNlCi1idWZmZXIgYXQgdGhlIGVuZCBvZiBvbmUgaW1hZ2Ugd291bGQgYmUgZGlzY2FyZGVkLCBjYXVzaW5nIHlvdSB0byBsb3NlIHRoZQotc3RhcnQgb2YgdGhlIG5leHQgaW1hZ2UuKSAgV2hlbiB5b3UgdXNlIHRoaXMgbWV0aG9kLCBzdG9yZWQgdGFibGVzIGFyZQotYXV0b21hdGljYWxseSBjYXJyaWVkIGZvcndhcmQsIHNvIHNvbWUgb2YgdGhlIGltYWdlcyBjYW4gYmUgYWJicmV2aWF0ZWQgaW1hZ2VzCi10aGF0IGRlcGVuZCBvbiB0YWJsZXMgZnJvbSBlYXJsaWVyIGltYWdlcy4KLQotSWYgeW91IGludGVuZCB0byB3cml0ZSBhIHNlcmllcyBvZiBpbWFnZXMgaW50byBhIHNpbmdsZSBkZXN0aW5hdGlvbiBmaWxlLAoteW91IG1pZ2h0IHdhbnQgdG8gbWFrZSBhIHNwZWNpYWxpemVkIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlIHRoYXQgZG9lc24ndAotZmx1c2ggdGhlIG91dHB1dCBidWZmZXIgYXQgdGVybV9kZXN0aW5hdGlvbigpIHRpbWUuICBUaGlzIHdvdWxkIHNwZWVkIHRoaW5ncwotdXAgYnkgc29tZSB0cmlmbGluZyBhbW91bnQuICBPZiBjb3Vyc2UsIHlvdSdkIG5lZWQgdG8gcmVtZW1iZXIgdG8gZmx1c2ggdGhlCi1idWZmZXIgYWZ0ZXIgdGhlIGxhc3QgaW1hZ2UuICBZb3UgY2FuIG1ha2UgdGhlIGxhdGVyIGltYWdlcyBiZSBhYmJyZXZpYXRlZAotb25lcyBieSBwYXNzaW5nIEZBTFNFIHRvIGpwZWdfc3RhcnRfY29tcHJlc3MoKS4KLQotCi1TcGVjaWFsIG1hcmtlcnMKLS0tLS0tLS0tLS0tLS0tLQotCi1Tb21lIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0byBpbnNlcnQgb3IgZXh0cmFjdCBzcGVjaWFsIGRhdGEgaW4gdGhlIEpQRUcKLWRhdGFzdHJlYW0uICBUaGUgSlBFRyBzdGFuZGFyZCBwcm92aWRlcyBtYXJrZXIgdHlwZXMgIkNPTSIgKGNvbW1lbnQpIGFuZAotIkFQUDAiIHRocm91Z2ggIkFQUDE1IiAoYXBwbGljYXRpb24pIHRvIGhvbGQgYXBwbGljYXRpb24tc3BlY2lmaWMgZGF0YS4KLVVuZm9ydHVuYXRlbHksIHRoZSB1c2Ugb2YgdGhlc2UgbWFya2VycyBpcyBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBzdGFuZGFyZC4KLUNPTSBtYXJrZXJzIGFyZSBmYWlybHkgd2lkZWx5IHVzZWQgdG8gaG9sZCB1c2VyLXN1cHBsaWVkIHRleHQuICBUaGUgSkZJRiBmaWxlCi1mb3JtYXQgc3BlYyB1c2VzIEFQUDAgbWFya2VycyB3aXRoIHNwZWNpZmllZCBpbml0aWFsIHN0cmluZ3MgdG8gaG9sZCBjZXJ0YWluCi1kYXRhLiAgQWRvYmUgYXBwbGljYXRpb25zIHVzZSBBUFAxNCBtYXJrZXJzIGJlZ2lubmluZyB3aXRoIHRoZSBzdHJpbmcgIkFkb2JlIgotZm9yIG1pc2NlbGxhbmVvdXMgZGF0YS4gIE90aGVyIEFQUG4gbWFya2VycyBhcmUgcmFyZWx5IHNlZW4sIGJ1dCBtaWdodAotY29udGFpbiBhbG1vc3QgYW55dGhpbmcuCi0KLUlmIHlvdSB3aXNoIHRvIHN0b3JlIHVzZXItc3VwcGxpZWQgdGV4dCwgd2UgcmVjb21tZW5kIHlvdSB1c2UgQ09NIG1hcmtlcnMKLWFuZCBwbGFjZSByZWFkYWJsZSA3LWJpdCBBU0NJSSB0ZXh0IGluIHRoZW0uICBOZXdsaW5lIGNvbnZlbnRpb25zIGFyZSBub3QKLXN0YW5kYXJkaXplZCAtLS0gZXhwZWN0IHRvIGZpbmQgTEYgKFVuaXggc3R5bGUpLCBDUi9MRiAoRE9TIHN0eWxlKSwgb3IgQ1IKLShNYWMgc3R5bGUpLiAgQSByb2J1c3QgQ09NIHJlYWRlciBzaG91bGQgYmUgYWJsZSB0byBjb3BlIHdpdGggcmFuZG9tIGJpbmFyeQotZ2FyYmFnZSwgaW5jbHVkaW5nIG51bGxzLCBzaW5jZSBzb21lIGFwcGxpY2F0aW9ucyBnZW5lcmF0ZSBDT00gbWFya2VycwotY29udGFpbmluZyBub24tQVNDSUkganVuay4gIChCdXQgeW91cnMgc2hvdWxkIG5vdCBiZSBvbmUgb2YgdGhlbS4pCi0KLUZvciBwcm9ncmFtLXN1cHBsaWVkIGRhdGEsIHVzZSBhbiBBUFBuIG1hcmtlciwgYW5kIGJlIHN1cmUgdG8gYmVnaW4gaXQgd2l0aCBhbgotaWRlbnRpZnlpbmcgc3RyaW5nIHNvIHRoYXQgeW91IGNhbiB0ZWxsIHdoZXRoZXIgdGhlIG1hcmtlciBpcyBhY3R1YWxseSB5b3Vycy4KLUl0J3MgcHJvYmFibHkgYmVzdCB0byBhdm9pZCB1c2luZyBBUFAwIG9yIEFQUDE0IGZvciBhbnkgcHJpdmF0ZSBtYXJrZXJzLgotKE5PVEU6IHRoZSB1cGNvbWluZyBTUElGRiBzdGFuZGFyZCB3aWxsIHVzZSBBUFA4IG1hcmtlcnM7IHdlIHJlY29tbWVuZCB5b3UKLW5vdCB1c2UgQVBQOCBtYXJrZXJzIGZvciBhbnkgcHJpdmF0ZSBwdXJwb3NlcywgZWl0aGVyLikKLQotS2VlcCBpbiBtaW5kIHRoYXQgYXQgbW9zdCA2NTUzMyBieXRlcyBjYW4gYmUgcHV0IGludG8gb25lIG1hcmtlciwgYnV0IHlvdQotY2FuIGhhdmUgYXMgbWFueSBtYXJrZXJzIGFzIHlvdSBsaWtlLgotCi1CeSBkZWZhdWx0LCB0aGUgSUpHIGNvbXByZXNzaW9uIGxpYnJhcnkgd2lsbCB3cml0ZSBhIEpGSUYgQVBQMCBtYXJrZXIgaWYgdGhlCi1zZWxlY3RlZCBKUEVHIGNvbG9yc3BhY2UgaXMgZ3JheXNjYWxlIG9yIFlDYkNyLCBvciBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgaWYKLXRoZSBzZWxlY3RlZCBjb2xvcnNwYWNlIGlzIFJHQiwgQ01ZSywgb3IgWUNDSy4gIFlvdSBjYW4gZGlzYWJsZSB0aGlzLCBidXQKLXdlIGRvbid0IHJlY29tbWVuZCBpdC4gIFRoZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgd2lsbCByZWNvZ25pemUgSkZJRiBhbmQKLUFkb2JlIG1hcmtlcnMgYW5kIHdpbGwgc2V0IHRoZSBKUEVHIGNvbG9yc3BhY2UgcHJvcGVybHkgd2hlbiBvbmUgaXMgZm91bmQuCi0KLQotWW91IGNhbiB3cml0ZSBzcGVjaWFsIG1hcmtlcnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBkYXRhc3RyZWFtIGhlYWRlciBieQotY2FsbGluZyBqcGVnX3dyaXRlX21hcmtlcigpIGFmdGVyIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBhbmQgYmVmb3JlIHRoZSBmaXJzdAotY2FsbCB0byBqcGVnX3dyaXRlX3NjYW5saW5lcygpLiAgV2hlbiB5b3UgZG8gdGhpcywgdGhlIG1hcmtlcnMgYXBwZWFyIGFmdGVyCi10aGUgU09JIGFuZCB0aGUgSkZJRiBBUFAwIGFuZCBBZG9iZSBBUFAxNCBtYXJrZXJzIChpZiB3cml0dGVuKSwgYnV0IGJlZm9yZQotYWxsIGVsc2UuICBTcGVjaWZ5IHRoZSBtYXJrZXIgdHlwZSBwYXJhbWV0ZXIgYXMgIkpQRUdfQ09NIiBmb3IgQ09NIG9yCi0iSlBFR19BUFAwICsgbiIgZm9yIEFQUG4uICAoQWN0dWFsbHksIGpwZWdfd3JpdGVfbWFya2VyIHdpbGwgbGV0IHlvdSB3cml0ZQotYW55IG1hcmtlciB0eXBlLCBidXQgd2UgZG9uJ3QgcmVjb21tZW5kIHdyaXRpbmcgYW55IG90aGVyIGtpbmRzIG9mIG1hcmtlci4pCi1Gb3IgZXhhbXBsZSwgdG8gd3JpdGUgYSB1c2VyIGNvbW1lbnQgc3RyaW5nIHBvaW50ZWQgdG8gYnkgY29tbWVudF90ZXh0OgotCWpwZWdfd3JpdGVfbWFya2VyKGNpbmZvLCBKUEVHX0NPTSwgY29tbWVudF90ZXh0LCBzdHJsZW4oY29tbWVudF90ZXh0KSk7Ci0KLUlmIGl0J3Mgbm90IGNvbnZlbmllbnQgdG8gc3RvcmUgYWxsIHRoZSBtYXJrZXIgZGF0YSBpbiBtZW1vcnkgYXQgb25jZSwKLXlvdSBjYW4gaW5zdGVhZCBjYWxsIGpwZWdfd3JpdGVfbV9oZWFkZXIoKSBmb2xsb3dlZCBieSBtdWx0aXBsZSBjYWxscyB0bwotanBlZ193cml0ZV9tX2J5dGUoKS4gIElmIHlvdSBkbyBpdCB0aGlzIHdheSwgaXQncyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvCi1jYWxsIGpwZWdfd3JpdGVfbV9ieXRlKCkgZXhhY3RseSB0aGUgbnVtYmVyIG9mIHRpbWVzIGdpdmVuIGluIHRoZSBsZW5ndGgKLXBhcmFtZXRlciB0byBqcGVnX3dyaXRlX21faGVhZGVyKCkuICAoVGhpcyBtZXRob2QgbGV0cyB5b3UgZW1wdHkgdGhlCi1vdXRwdXQgYnVmZmVyIHBhcnR3YXkgdGhyb3VnaCBhIG1hcmtlciwgd2hpY2ggbWlnaHQgYmUgaW1wb3J0YW50IHdoZW4KLXVzaW5nIGEgc3VzcGVuZGluZyBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZS4gIEluIGFueSBjYXNlLCBpZiB5b3UgYXJlIHVzaW5nCi1hIHN1c3BlbmRpbmcgZGVzdGluYXRpb24sIHlvdSBzaG91bGQgZmx1c2ggaXRzIGJ1ZmZlciBhZnRlciBpbnNlcnRpbmcKLWFueSBzcGVjaWFsIG1hcmtlcnMuICBTZWUgIkkvTyBzdXNwZW5zaW9uIi4pCi0KLU9yLCBpZiB5b3UgcHJlZmVyIHRvIHN5bnRoZXNpemUgdGhlIG1hcmtlciBieXRlIHNlcXVlbmNlIHlvdXJzZWxmLAoteW91IGNhbiBqdXN0IGNyYW0gaXQgc3RyYWlnaHQgaW50byB0aGUgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUuCi0KLUlmIHlvdSBhcmUgd3JpdGluZyBKRklGIDEuMDIgZXh0ZW5zaW9uIG1hcmtlcnMgKHRodW1ibmFpbCBpbWFnZXMpLCBkb24ndAotZm9yZ2V0IHRvIHNldCBjaW5mby5KRklGX21pbm9yX3ZlcnNpb24gPSAyIHNvIHRoYXQgdGhlIGVuY29kZXIgd2lsbCB3cml0ZSB0aGUKLWNvcnJlY3QgSkZJRiB2ZXJzaW9uIG51bWJlciBpbiB0aGUgSkZJRiBoZWFkZXIgbWFya2VyLiAgVGhlIGxpYnJhcnkncyBkZWZhdWx0Ci1pcyB0byB3cml0ZSB2ZXJzaW9uIDEuMDEsIGJ1dCB0aGF0J3Mgd3JvbmcgaWYgeW91IGluc2VydCBhbnkgMS4wMiBleHRlbnNpb24KLW1hcmtlcnMuICAoV2UgY291bGQgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCBqdXN0IGRlZmF1bHRpbmcgdG8gMS4wMiwgYnV0IHRoZXJlCi11c2VkIHRvIGJlIGJyb2tlbiBkZWNvZGVycyB0aGF0IHdvdWxkIGNvbXBsYWluIGFib3V0IHVua25vd24gbWlub3IgdmVyc2lvbgotbnVtYmVycy4gIFRvIHJlZHVjZSBjb21wYXRpYmlsaXR5IHJpc2tzIGl0J3Mgc2FmZXN0IG5vdCB0byB3cml0ZSAxLjAyIHVubGVzcwoteW91IGFyZSBhY3R1YWxseSB1c2luZyAxLjAyIGV4dGVuc2lvbnMuKQotCi0KLVdoZW4gcmVhZGluZywgdHdvIG1ldGhvZHMgb2YgaGFuZGxpbmcgc3BlY2lhbCBtYXJrZXJzIGFyZSBhdmFpbGFibGU6Ci0xLiBZb3UgY2FuIGFzayB0aGUgbGlicmFyeSB0byBzYXZlIHRoZSBjb250ZW50cyBvZiBDT00gYW5kL29yIEFQUG4gbWFya2VycwotaW50byBtZW1vcnksIGFuZCB0aGVuIGV4YW1pbmUgdGhlbSBhdCB5b3VyIGxlaXN1cmUgYWZ0ZXJ3YXJkcy4KLTIuIFlvdSBjYW4gc3VwcGx5IHlvdXIgb3duIHJvdXRpbmUgdG8gcHJvY2VzcyBDT00gYW5kL29yIEFQUG4gbWFya2Vycwotb24tdGhlLWZseSBhcyB0aGV5IGFyZSByZWFkLgotVGhlIGZpcnN0IG1ldGhvZCBpcyBzaW1wbGVyIHRvIHVzZSwgZXNwZWNpYWxseSBpZiB5b3UgYXJlIHVzaW5nIGEgc3VzcGVuZGluZwotZGF0YSBzb3VyY2U7IHdyaXRpbmcgYSBtYXJrZXIgcHJvY2Vzc29yIHRoYXQgY29wZXMgd2l0aCBpbnB1dCBzdXNwZW5zaW9uIGlzCi1ub3QgZWFzeSAoY29uc2lkZXIgd2hhdCBoYXBwZW5zIGlmIHRoZSBtYXJrZXIgaXMgbG9uZ2VyIHRoYW4geW91ciBhdmFpbGFibGUKLWlucHV0IGJ1ZmZlcikuICBIb3dldmVyLCB0aGUgc2Vjb25kIG1ldGhvZCBjb25zZXJ2ZXMgbWVtb3J5IHNpbmNlIHRoZSBtYXJrZXIKLWRhdGEgbmVlZCBub3QgYmUga2VwdCBhcm91bmQgYWZ0ZXIgaXQncyBiZWVuIHByb2Nlc3NlZC4KLQotRm9yIGVpdGhlciBtZXRob2QsIHlvdSdkIG5vcm1hbGx5IHNldCB1cCBtYXJrZXIgaGFuZGxpbmcgYWZ0ZXIgY3JlYXRpbmcgYQotZGVjb21wcmVzc2lvbiBvYmplY3QgYW5kIGJlZm9yZSBjYWxsaW5nIGpwZWdfcmVhZF9oZWFkZXIoKSwgYmVjYXVzZSB0aGUKLW1hcmtlcnMgb2YgaW50ZXJlc3Qgd2lsbCB0eXBpY2FsbHkgYmUgbmVhciB0aGUgaGVhZCBvZiB0aGUgZmlsZSBhbmQgc28gd2lsbAotYmUgc2Nhbm5lZCBieSBqcGVnX3JlYWRfaGVhZGVyLiAgT25jZSB5b3UndmUgZXN0YWJsaXNoZWQgYSBtYXJrZXIgaGFuZGxpbmcKLW1ldGhvZCwgaXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgbGlmZSBvZiB0aGF0IGRlY29tcHJlc3Npb24gb2JqZWN0Ci0ocG90ZW50aWFsbHkgbWFueSBkYXRhc3RyZWFtcyksIHVubGVzcyB5b3UgY2hhbmdlIGl0LiAgTWFya2VyIGhhbmRsaW5nIGlzCi1kZXRlcm1pbmVkIHNlcGFyYXRlbHkgZm9yIENPTSBtYXJrZXJzIGFuZCBmb3IgZWFjaCBBUFBuIG1hcmtlciBjb2RlLgotCi0KLVRvIHNhdmUgdGhlIGNvbnRlbnRzIG9mIHNwZWNpYWwgbWFya2VycyBpbiBtZW1vcnksIGNhbGwKLQlqcGVnX3NhdmVfbWFya2VycyhjaW5mbywgbWFya2VyX2NvZGUsIGxlbmd0aF9saW1pdCkKLXdoZXJlIG1hcmtlcl9jb2RlIGlzIHRoZSBtYXJrZXIgdHlwZSB0byBzYXZlLCBKUEVHX0NPTSBvciBKUEVHX0FQUDArbi4KLShUbyBhcnJhbmdlIHRvIHNhdmUgYWxsIHRoZSBzcGVjaWFsIG1hcmtlciB0eXBlcywgeW91IG5lZWQgdG8gY2FsbCB0aGlzCi1yb3V0aW5lIDE3IHRpbWVzLCBmb3IgQ09NIGFuZCBBUFAwLUFQUDE1LikgIElmIHRoZSBpbmNvbWluZyBtYXJrZXIgaXMgbG9uZ2VyCi10aGFuIGxlbmd0aF9saW1pdCBkYXRhIGJ5dGVzLCBvbmx5IGxlbmd0aF9saW1pdCBieXRlcyB3aWxsIGJlIHNhdmVkOyB0aGlzCi1wYXJhbWV0ZXIgYWxsb3dzIHlvdSB0byBhdm9pZCBjaGV3aW5nIHVwIG1lbW9yeSB3aGVuIHlvdSBvbmx5IG5lZWQgdG8gc2VlIHRoZQotZmlyc3QgZmV3IGJ5dGVzIG9mIGEgcG90ZW50aWFsbHkgbGFyZ2UgbWFya2VyLiAgSWYgeW91IHdhbnQgdG8gc2F2ZSBhbGwgdGhlCi1kYXRhLCBzZXQgbGVuZ3RoX2xpbWl0IHRvIDB4RkZGRjsgdGhhdCBpcyBlbm91Z2ggc2luY2UgbWFya2VyIGxlbmd0aHMgYXJlIG9ubHkKLTE2IGJpdHMuICBBcyBhIHNwZWNpYWwgY2FzZSwgc2V0dGluZyBsZW5ndGhfbGltaXQgdG8gMCBwcmV2ZW50cyB0aGF0IG1hcmtlcgotdHlwZSBmcm9tIGJlaW5nIHNhdmVkIGF0IGFsbC4gIChUaGF0IGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBpbiBmYWN0LikKLQotQWZ0ZXIganBlZ19yZWFkX2hlYWRlcigpIGNvbXBsZXRlcywgeW91IGNhbiBleGFtaW5lIHRoZSBzcGVjaWFsIG1hcmtlcnMgYnkKLWZvbGxvd2luZyB0aGUgY2luZm8tPm1hcmtlcl9saXN0IHBvaW50ZXIgY2hhaW4uICBBbGwgdGhlIHNwZWNpYWwgbWFya2VycyBpbgotdGhlIGZpbGUgYXBwZWFyIGluIHRoaXMgbGlzdCwgaW4gb3JkZXIgb2YgdGhlaXIgb2NjdXJyZW5jZSBpbiB0aGUgZmlsZSAoYnV0Ci1vbWl0dGluZyBhbnkgbWFya2VycyBvZiB0eXBlcyB5b3UgZGlkbid0IGFzayBmb3IpLiAgQm90aCB0aGUgb3JpZ2luYWwgZGF0YQotbGVuZ3RoIGFuZCB0aGUgc2F2ZWQgZGF0YSBsZW5ndGggYXJlIHJlY29yZGVkIGZvciBlYWNoIGxpc3QgZW50cnk7IHRoZSBsYXR0ZXIKLXdpbGwgbm90IGV4Y2VlZCBsZW5ndGhfbGltaXQgZm9yIHRoZSBwYXJ0aWN1bGFyIG1hcmtlciB0eXBlLiAgTm90ZSB0aGF0IHRoZXNlCi1sZW5ndGhzIGV4Y2x1ZGUgdGhlIG1hcmtlciBsZW5ndGggd29yZCwgd2hlcmVhcyB0aGUgc3RvcmVkIHJlcHJlc2VudGF0aW9uCi13aXRoaW4gdGhlIEpQRUcgZmlsZSBpbmNsdWRlcyBpdC4gIChIZW5jZSB0aGUgbWF4aW11bSBkYXRhIGxlbmd0aCBpcyByZWFsbHkKLW9ubHkgNjU1MzMuKQotCi1JdCBpcyBwb3NzaWJsZSB0aGF0IGFkZGl0aW9uYWwgc3BlY2lhbCBtYXJrZXJzIGFwcGVhciBpbiB0aGUgZmlsZSBiZXlvbmQgdGhlCi1TT1MgbWFya2VyIGF0IHdoaWNoIGpwZWdfcmVhZF9oZWFkZXIgc3RvcHM7IGlmIHNvLCB0aGUgbWFya2VyIGxpc3Qgd2lsbCBiZQotZXh0ZW5kZWQgZHVyaW5nIHJlYWRpbmcgb2YgdGhlIHJlc3Qgb2YgdGhlIGZpbGUuICBUaGlzIGlzIG5vdCBleHBlY3RlZCB0byBiZQotY29tbW9uLCBob3dldmVyLiAgSWYgeW91IGFyZSBzaG9ydCBvbiBtZW1vcnkgeW91IG1heSB3YW50IHRvIHJlc2V0IHRoZSBsZW5ndGgKLWxpbWl0IHRvIHplcm8gZm9yIGFsbCBtYXJrZXIgdHlwZXMgYWZ0ZXIgZmluaXNoaW5nIGpwZWdfcmVhZF9oZWFkZXIsIHRvCi1lbnN1cmUgdGhhdCB0aGUgbWF4X21lbW9yeV90b191c2Ugc2V0dGluZyBjYW5ub3QgYmUgZXhjZWVkZWQgZHVlIHRvIGFkZGl0aW9uCi1vZiBsYXRlciBtYXJrZXJzLgotCi1UaGUgbWFya2VyIGxpc3QgcmVtYWlucyBzdG9yZWQgdW50aWwgeW91IGNhbGwganBlZ19maW5pc2hfZGVjb21wcmVzcyBvcgotanBlZ19hYm9ydCwgYXQgd2hpY2ggcG9pbnQgdGhlIG1lbW9yeSBpcyBmcmVlZCBhbmQgdGhlIGxpc3QgaXMgc2V0IHRvIGVtcHR5LgotKGpwZWdfZGVzdHJveSBhbHNvIHJlbGVhc2VzIHRoZSBzdG9yYWdlLCBvZiBjb3Vyc2UuKQotCi1Ob3RlIHRoYXQgdGhlIGxpYnJhcnkgaXMgaW50ZXJuYWxseSBpbnRlcmVzdGVkIGluIEFQUDAgYW5kIEFQUDE0IG1hcmtlcnM7Ci1pZiB5b3UgdHJ5IHRvIHNldCBhIHNtYWxsIG5vbnplcm8gbGVuZ3RoIGxpbWl0IG9uIHRoZXNlIHR5cGVzLCB0aGUgbGlicmFyeQotd2lsbCBzaWxlbnRseSBmb3JjZSB0aGUgbGVuZ3RoIHVwIHRvIHRoZSBtaW5pbXVtIGl0IHdhbnRzLiAgKEJ1dCB5b3UgY2FuIHNldAotYSB6ZXJvIGxlbmd0aCBsaW1pdCB0byBwcmV2ZW50IHRoZW0gZnJvbSBiZWluZyBzYXZlZCBhdCBhbGwuKSAgQWxzbywgaW4gYQotMTYtYml0IGVudmlyb25tZW50LCB0aGUgbWF4aW11bSBsZW5ndGggbGltaXQgbWF5IGJlIGNvbnN0cmFpbmVkIHRvIGxlc3MgdGhhbgotNjU1MzMgYnkgbWFsbG9jKCkgbGltaXRhdGlvbnMuICBJdCBpcyB0aGVyZWZvcmUgYmVzdCBub3QgdG8gYXNzdW1lIHRoYXQgdGhlCi1lZmZlY3RpdmUgbGVuZ3RoIGxpbWl0IGlzIGV4YWN0bHkgd2hhdCB5b3Ugc2V0IGl0IHRvIGJlLgotCi0KLUlmIHlvdSB3YW50IHRvIHN1cHBseSB5b3VyIG93biBtYXJrZXItcmVhZGluZyByb3V0aW5lLCB5b3UgZG8gaXQgYnkgY2FsbGluZwotanBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcigpLiAgQSBtYXJrZXIgcHJvY2Vzc29yIHJvdXRpbmUgbXVzdCBoYXZlIHRoZQotc2lnbmF0dXJlCi0JYm9vbGVhbiBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotQWx0aG91Z2ggdGhlIG1hcmtlciBjb2RlIGlzIG5vdCBleHBsaWNpdGx5IHBhc3NlZCwgdGhlIHJvdXRpbmUgY2FuIGZpbmQgaXQKLWluIGNpbmZvLT51bnJlYWRfbWFya2VyLiAgQXQgdGhlIHRpbWUgb2YgY2FsbCwgdGhlIG1hcmtlciBwcm9wZXIgaGFzIGJlZW4KLXJlYWQgZnJvbSB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlLiAgVGhlIHByb2Nlc3NvciByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvcgotcmVhZGluZyB0aGUgbWFya2VyIGxlbmd0aCB3b3JkIGFuZCB0aGUgcmVtYWluaW5nIHBhcmFtZXRlciBieXRlcywgaWYgYW55LgotUmV0dXJuIFRSVUUgdG8gaW5kaWNhdGUgc3VjY2Vzcy4gIChGQUxTRSBzaG91bGQgYmUgcmV0dXJuZWQgb25seSBpZiB5b3UgYXJlCi11c2luZyBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgYW5kIGl0IHRlbGxzIHlvdSB0byBzdXNwZW5kLiAgU2VlIHRoZSBzdGFuZGFyZAotbWFya2VyIHByb2Nlc3NvcnMgaW4gamRtYXJrZXIuYyBmb3IgYXBwcm9wcmlhdGUgY29kaW5nIG1ldGhvZHMgaWYgeW91IG5lZWQgdG8KLXVzZSBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuKQotCi1JZiB5b3Ugb3ZlcnJpZGUgdGhlIGRlZmF1bHQgQVBQMCBvciBBUFAxNCBwcm9jZXNzb3JzLCBpdCBpcyB1cCB0byB5b3UgdG8KLXJlY29nbml6ZSBKRklGIGFuZCBBZG9iZSBtYXJrZXJzIGlmIHlvdSB3YW50IGNvbG9yc3BhY2UgcmVjb2duaXRpb24gdG8gb2NjdXIKLXByb3Blcmx5LiAgV2UgcmVjb21tZW5kIGNvcHlpbmcgYW5kIGV4dGVuZGluZyB0aGUgZGVmYXVsdCBwcm9jZXNzb3JzIGlmIHlvdQotd2FudCB0byBkbyB0aGF0LiAgKEEgYmV0dGVyIGlkZWEgaXMgdG8gc2F2ZSB0aGVzZSBtYXJrZXIgdHlwZXMgZm9yIGxhdGVyCi1leGFtaW5hdGlvbiBieSBjYWxsaW5nIGpwZWdfc2F2ZV9tYXJrZXJzKCk7IHRoYXQgbWV0aG9kIGRvZXNuJ3QgaW50ZXJmZXJlCi13aXRoIHRoZSBsaWJyYXJ5J3Mgb3duIHByb2Nlc3Npbmcgb2YgdGhlc2UgbWFya2Vycy4pCi0KLWpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IoKSBhbmQganBlZ19zYXZlX21hcmtlcnMoKSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlCi0tLS0gaWYgeW91IGNhbGwgb25lIGl0IG92ZXJyaWRlcyBhbnkgcHJldmlvdXMgY2FsbCB0byB0aGUgb3RoZXIsIGZvciB0aGUKLXBhcnRpY3VsYXIgbWFya2VyIHR5cGUgc3BlY2lmaWVkLgotCi1BIHNpbXBsZSBleGFtcGxlIG9mIGFuIGV4dGVybmFsIENPTSBwcm9jZXNzb3IgY2FuIGJlIGZvdW5kIGluIGRqcGVnLmMuCi1BbHNvLCBzZWUganBlZ3RyYW4uYyBmb3IgYW4gZXhhbXBsZSBvZiB1c2luZyBqcGVnX3NhdmVfbWFya2Vycy4KLQotCi1SYXcgKGRvd25zYW1wbGVkKSBpbWFnZSBkYXRhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNvbWUgYXBwbGljYXRpb25zIG5lZWQgdG8gc3VwcGx5IGFscmVhZHktZG93bnNhbXBsZWQgaW1hZ2UgZGF0YSB0byB0aGUgSlBFRwotY29tcHJlc3Nvciwgb3IgdG8gcmVjZWl2ZSByYXcgZG93bnNhbXBsZWQgZGF0YSBmcm9tIHRoZSBkZWNvbXByZXNzb3IuICBUaGUKLWxpYnJhcnkgc3VwcG9ydHMgdGhpcyByZXF1aXJlbWVudCBieSBhbGxvd2luZyB0aGUgYXBwbGljYXRpb24gdG8gd3JpdGUgb3IKLXJlYWQgcmF3IGRhdGEsIGJ5cGFzc2luZyB0aGUgbm9ybWFsIHByZXByb2Nlc3Npbmcgb3IgcG9zdHByb2Nlc3Npbmcgc3RlcHMuCi1UaGUgaW50ZXJmYWNlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzdGFuZGFyZCBvbmUgYW5kIGlzIHNvbWV3aGF0IGhhcmRlciB0bwotdXNlLiAgSWYgeW91ciBpbnRlcmVzdCBpcyBtZXJlbHkgaW4gYnlwYXNzaW5nIGNvbG9yIGNvbnZlcnNpb24sIHdlIHJlY29tbWVuZAotdGhhdCB5b3UgdXNlIHRoZSBzdGFuZGFyZCBpbnRlcmZhY2UgYW5kIHNpbXBseSBzZXQganBlZ19jb2xvcl9zcGFjZSA9Ci1pbl9jb2xvcl9zcGFjZSAob3IganBlZ19jb2xvcl9zcGFjZSA9IG91dF9jb2xvcl9zcGFjZSBmb3IgZGVjb21wcmVzc2lvbikuCi1UaGUgbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24gaXMgbmVjZXNzYXJ5IG9ubHkgdG8gc3VwcGx5IG9yCi1yZWNlaXZlIGRvd25zYW1wbGVkIGltYWdlIGRhdGEsIGluIHdoaWNoIG5vdCBhbGwgY29tcG9uZW50cyBoYXZlIHRoZSBzYW1lCi1kaW1lbnNpb25zLgotCi0KLVRvIGNvbXByZXNzIHJhdyBkYXRhLCB5b3UgbXVzdCBzdXBwbHkgdGhlIGRhdGEgaW4gdGhlIGNvbG9yc3BhY2UgdG8gYmUgdXNlZAotaW4gdGhlIEpQRUcgZmlsZSAocGxlYXNlIHJlYWQgdGhlIGVhcmxpZXIgc2VjdGlvbiBvbiBTcGVjaWFsIGNvbG9yIHNwYWNlcykKLWFuZCBkb3duc2FtcGxlZCB0byB0aGUgc2FtcGxpbmcgZmFjdG9ycyBzcGVjaWZpZWQgaW4gdGhlIEpQRUcgcGFyYW1ldGVycy4KLVlvdSBtdXN0IHN1cHBseSB0aGUgZGF0YSBpbiB0aGUgZm9ybWF0IHVzZWQgaW50ZXJuYWxseSBieSB0aGUgSlBFRyBsaWJyYXJ5LAotbmFtZWx5IGEgSlNBTVBJTUFHRSBhcnJheS4gIFRoaXMgaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdHdvLWRpbWVuc2lvbmFsCi1hcnJheXMsIGVhY2ggb2YgdHlwZSBKU0FNUEFSUkFZLiAgRWFjaCAyLUQgYXJyYXkgaG9sZHMgdGhlIHZhbHVlcyBmb3Igb25lCi1jb2xvciBjb21wb25lbnQuICBUaGlzIHN0cnVjdHVyZSBpcyBuZWNlc3Nhcnkgc2luY2UgdGhlIGNvbXBvbmVudHMgYXJlIG9mCi1kaWZmZXJlbnQgc2l6ZXMuICBJZiB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUgbm90IGEgbXVsdGlwbGUgb2YgdGhlIE1DVSBzaXplLAoteW91IG11c3QgYWxzbyBwYWQgdGhlIGRhdGEgY29ycmVjdGx5ICh1c3VhbGx5LCB0aGlzIGlzIGRvbmUgYnkgcmVwbGljYXRpbmcKLXRoZSBsYXN0IGNvbHVtbiBhbmQvb3Igcm93KS4gIFRoZSBkYXRhIG11c3QgYmUgcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2YgYSBEQ1QKLWJsb2NrIGluIGVhY2ggY29tcG9uZW50OiB0aGF0IGlzLCBlYWNoIGRvd25zYW1wbGVkIHJvdyBtdXN0IGNvbnRhaW4gYQotbXVsdGlwbGUgb2YgOCB2YWxpZCBzYW1wbGVzLCBhbmQgdGhlcmUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggc2FtcGxlIHJvd3MKLWZvciBlYWNoIGNvbXBvbmVudC4gIChGb3IgYXBwbGljYXRpb25zIHN1Y2ggYXMgY29udmVyc2lvbiBvZiBkaWdpdGFsIFRWCi1pbWFnZXMsIHRoZSBzdGFuZGFyZCBpbWFnZSBzaXplIGlzIHVzdWFsbHkgYSBtdWx0aXBsZSBvZiB0aGUgRENUIGJsb2NrIHNpemUsCi1zbyB0aGF0IG5vIHBhZGRpbmcgbmVlZCBhY3R1YWxseSBiZSBkb25lLikKLQotVGhlIHByb2NlZHVyZSBmb3IgY29tcHJlc3Npb24gb2YgcmF3IGRhdGEgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIG5vcm1hbAotY29tcHJlc3Npb24sIGV4Y2VwdCB0aGF0IHlvdSBjYWxsIGpwZWdfd3JpdGVfcmF3X2RhdGEoKSBpbiBwbGFjZSBvZgotanBlZ193cml0ZV9zY2FubGluZXMoKS4gIEJlZm9yZSBjYWxsaW5nIGpwZWdfc3RhcnRfY29tcHJlc3MoKSwgeW91IG11c3QgZG8KLXRoZSBmb2xsb3dpbmc6Ci0gICogU2V0IGNpbmZvLT5yYXdfZGF0YV9pbiB0byBUUlVFLiAgKEl0IGlzIHNldCBGQUxTRSBieSBqcGVnX3NldF9kZWZhdWx0cygpLikKLSAgICBUaGlzIG5vdGlmaWVzIHRoZSBsaWJyYXJ5IHRoYXQgeW91IHdpbGwgYmUgc3VwcGx5aW5nIHJhdyBkYXRhLgotICAqIEVuc3VyZSBqcGVnX2NvbG9yX3NwYWNlIGlzIGNvcnJlY3QgLS0tIGFuIGV4cGxpY2l0IGpwZWdfc2V0X2NvbG9yc3BhY2UoKQotICAgIGNhbGwgaXMgYSBnb29kIGlkZWEuICBOb3RlIHRoYXQgc2luY2UgY29sb3IgY29udmVyc2lvbiBpcyBieXBhc3NlZCwKLSAgICBpbl9jb2xvcl9zcGFjZSBpcyBpZ25vcmVkLCBleGNlcHQgdGhhdCBqcGVnX3NldF9kZWZhdWx0cygpIHVzZXMgaXQgdG8KLSAgICBjaG9vc2UgdGhlIGRlZmF1bHQganBlZ19jb2xvcl9zcGFjZSBzZXR0aW5nLgotICAqIEVuc3VyZSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgY2luZm8tPmNvbXBfaW5mb1tpXS5oX3NhbXBfZmFjdG9yIGFuZAotICAgIGNpbmZvLT5jb21wX2luZm9baV0udl9zYW1wX2ZhY3RvciwgYXJlIGNvcnJlY3QuICBTaW5jZSB0aGVzZSBpbmRpY2F0ZSB0aGUKLSAgICBkaW1lbnNpb25zIG9mIHRoZSBkYXRhIHlvdSBhcmUgc3VwcGx5aW5nLCBpdCdzIHdpc2UgdG8gc2V0IHRoZW0KLSAgICBleHBsaWNpdGx5LCByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGUgbGlicmFyeSdzIGRlZmF1bHRzIGFyZSB3aGF0IHlvdSB3YW50LgotCi1UbyBwYXNzIHJhdyBkYXRhIHRvIHRoZSBsaWJyYXJ5LCBjYWxsIGpwZWdfd3JpdGVfcmF3X2RhdGEoKSBpbiBwbGFjZSBvZgotanBlZ193cml0ZV9zY2FubGluZXMoKS4gIFRoZSB0d28gcm91dGluZXMgd29yayBzaW1pbGFybHkgZXhjZXB0IHRoYXQKLWpwZWdfd3JpdGVfcmF3X2RhdGEgdGFrZXMgYSBKU0FNUElNQUdFIGRhdGEgYXJyYXkgcmF0aGVyIHRoYW4gSlNBTVBBUlJBWS4KLVRoZSBzY2FubGluZXMgY291bnQgcGFzc2VkIHRvIGFuZCByZXR1cm5lZCBmcm9tIGpwZWdfd3JpdGVfcmF3X2RhdGEgaXMKLW1lYXN1cmVkIGluIHRlcm1zIG9mIHRoZSBjb21wb25lbnQgd2l0aCB0aGUgbGFyZ2VzdCB2X3NhbXBfZmFjdG9yLgotCi1qcGVnX3dyaXRlX3Jhd19kYXRhKCkgcHJvY2Vzc2VzIG9uZSBNQ1Ugcm93IHBlciBjYWxsLCB3aGljaCBpcyB0byBzYXkKLXZfc2FtcF9mYWN0b3IqRENUU0laRSBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIFRoZSBwYXNzZWQgbnVtX2xpbmVzCi12YWx1ZSBtdXN0IGJlIGF0IGxlYXN0IG1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwKLWJlIGV4YWN0bHkgdGhhdCBhbW91bnQgKG9yIHBvc3NpYmx5IHNvbWUgbXVsdGlwbGUgb2YgdGhhdCBhbW91bnQsIGluIGZ1dHVyZQotbGlicmFyeSB2ZXJzaW9ucykuICBUaGlzIGlzIHRydWUgZXZlbiBvbiB0aGUgbGFzdCBjYWxsIGF0IHRoZSBib3R0b20gb2YgdGhlCi1pbWFnZTsgZG9uJ3QgZm9yZ2V0IHRvIHBhZCB5b3VyIGRhdGEgYXMgbmVjZXNzYXJ5LgotCi1UaGUgcmVxdWlyZWQgZGltZW5zaW9ucyBvZiB0aGUgc3VwcGxpZWQgZGF0YSBjYW4gYmUgY29tcHV0ZWQgZm9yIGVhY2gKLWNvbXBvbmVudCBhcwotCWNpbmZvLT5jb21wX2luZm9baV0ud2lkdGhfaW5fYmxvY2tzKkRDVFNJWkUgIHNhbXBsZXMgcGVyIHJvdwotCWNpbmZvLT5jb21wX2luZm9baV0uaGVpZ2h0X2luX2Jsb2NrcypEQ1RTSVpFIHJvd3MgaW4gaW1hZ2UKLWFmdGVyIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBoYXMgaW5pdGlhbGl6ZWQgdGhvc2UgZmllbGRzLiAgSWYgdGhlIHZhbGlkIGRhdGEKLWlzIHNtYWxsZXIgdGhhbiB0aGlzLCBpdCBtdXN0IGJlIHBhZGRlZCBhcHByb3ByaWF0ZWx5LiAgRm9yIHNvbWUgc2FtcGxpbmcKLWZhY3RvcnMgYW5kIGltYWdlIHNpemVzLCBhZGRpdGlvbmFsIGR1bW15IERDVCBibG9ja3MgYXJlIGluc2VydGVkIHRvIG1ha2UKLXRoZSBpbWFnZSBhIG11bHRpcGxlIG9mIHRoZSBNQ1UgZGltZW5zaW9ucy4gIFRoZSBsaWJyYXJ5IGNyZWF0ZXMgc3VjaCBkdW1teQotYmxvY2tzIGl0c2VsZjsgaXQgZG9lcyBub3QgcmVhZCB0aGVtIGZyb20geW91ciBzdXBwbGllZCBkYXRhLiAgVGhlcmVmb3JlIHlvdQotbmVlZCBuZXZlciBwYWQgYnkgbW9yZSB0aGFuIERDVFNJWkUgc2FtcGxlcy4gIEFuIGV4YW1wbGUgbWF5IGhlbHAgaGVyZS4KLUFzc3VtZSAyaDJ2IGRvd25zYW1wbGluZyBvZiBZQ2JDciBkYXRhLCB0aGF0IGlzCi0JY2luZm8tPmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yID0gMgkJZm9yIFkKLQljaW5mby0+Y29tcF9pbmZvWzBdLnZfc2FtcF9mYWN0b3IgPSAyCi0JY2luZm8tPmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yID0gMQkJZm9yIENiCi0JY2luZm8tPmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yID0gMQotCWNpbmZvLT5jb21wX2luZm9bMl0uaF9zYW1wX2ZhY3RvciA9IDEJCWZvciBDcgotCWNpbmZvLT5jb21wX2luZm9bMl0udl9zYW1wX2ZhY3RvciA9IDEKLWFuZCBzdXBwb3NlIHRoYXQgdGhlIG5vbWluYWwgaW1hZ2UgZGltZW5zaW9ucyAoY2luZm8tPmltYWdlX3dpZHRoIGFuZAotY2luZm8tPmltYWdlX2hlaWdodCkgYXJlIDEwMXgxMDEgcGl4ZWxzLiAgVGhlbiBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgd2lsbAotY29tcHV0ZSBkb3duc2FtcGxlZF93aWR0aCA9IDEwMSBhbmQgd2lkdGhfaW5fYmxvY2tzID0gMTMgZm9yIFksCi1kb3duc2FtcGxlZF93aWR0aCA9IDUxIGFuZCB3aWR0aF9pbl9ibG9ja3MgPSA3IGZvciBDYiBhbmQgQ3IgKGFuZCB0aGUgc2FtZQotZm9yIHRoZSBoZWlnaHQgZmllbGRzKS4gIFlvdSBtdXN0IHBhZCB0aGUgWSBkYXRhIHRvIGF0IGxlYXN0IDEzKjggPSAxMDQKLWNvbHVtbnMgYW5kIHJvd3MsIHRoZSBDYi9DciBkYXRhIHRvIGF0IGxlYXN0IDcqOCA9IDU2IGNvbHVtbnMgYW5kIHJvd3MuICBUaGUKLU1DVSBoZWlnaHQgaXMgbWF4X3Zfc2FtcF9mYWN0b3IgPSAyIERDVCByb3dzIHNvIHlvdSBtdXN0IHBhc3MgYXQgbGVhc3QgMTYKLXNjYW5saW5lcyBvbiBlYWNoIGNhbGwgdG8ganBlZ193cml0ZV9yYXdfZGF0YSgpLCB3aGljaCBpcyB0byBzYXkgMTYgYWN0dWFsCi1zYW1wbGUgcm93cyBvZiBZIGFuZCA4IGVhY2ggb2YgQ2IgYW5kIENyLiAgQSB0b3RhbCBvZiA3IE1DVSByb3dzIGFyZSBuZWVkZWQsCi1zbyB5b3UgbXVzdCBwYXNzIGEgdG90YWwgb2YgNyoxNiA9IDExMiAic2NhbmxpbmVzIi4gIFRoZSBsYXN0IERDVCBibG9jayByb3cKLW9mIFkgZGF0YSBpcyBkdW1teSwgc28gaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB5b3UgcGFzcyBmb3IgaXQgaW4gdGhlIGRhdGEKLWFycmF5cywgYnV0IHRoZSBzY2FubGluZXMgY291bnQgbXVzdCB0b3RhbCB1cCB0byAxMTIgc28gdGhhdCBhbGwgb2YgdGhlIENiCi1hbmQgQ3IgZGF0YSBnZXRzIHBhc3NlZC4KLQotT3V0cHV0IHN1c3BlbnNpb24gaXMgc3VwcG9ydGVkIHdpdGggcmF3LWRhdGEgY29tcHJlc3Npb246IGlmIHRoZSBkYXRhCi1kZXN0aW5hdGlvbiBtb2R1bGUgc3VzcGVuZHMsIGpwZWdfd3JpdGVfcmF3X2RhdGEoKSB3aWxsIHJldHVybiAwLgotSW4gdGhpcyBjYXNlIHRoZSBzYW1lIGRhdGEgcm93cyBtdXN0IGJlIHBhc3NlZCBhZ2FpbiBvbiB0aGUgbmV4dCBjYWxsLgotCi0KLURlY29tcHJlc3Npb24gd2l0aCByYXcgZGF0YSBvdXRwdXQgaW1wbGllcyBieXBhc3NpbmcgYWxsIHBvc3Rwcm9jZXNzaW5nOgoteW91IGNhbm5vdCBhc2sgZm9yIHJlc2NhbGluZyBvciBjb2xvciBxdWFudGl6YXRpb24sIGZvciBpbnN0YW5jZS4gIE1vcmUKLXNlcmlvdXNseSwgeW91IG11c3QgZGVhbCB3aXRoIHRoZSBjb2xvciBzcGFjZSBhbmQgc2FtcGxpbmcgZmFjdG9ycyBwcmVzZW50IGluCi10aGUgaW5jb21pbmcgZmlsZS4gIElmIHlvdXIgYXBwbGljYXRpb24gb25seSBoYW5kbGVzLCBzYXksIDJoMXYgWUNiQ3IgZGF0YSwKLXlvdSBtdXN0IGNoZWNrIGZvciBhbmQgZmFpbCBvbiBvdGhlciBjb2xvciBzcGFjZXMgb3Igb3RoZXIgc2FtcGxpbmcgZmFjdG9ycy4KLVRoZSBsaWJyYXJ5IHdpbGwgbm90IGNvbnZlcnQgdG8gYSBkaWZmZXJlbnQgY29sb3Igc3BhY2UgZm9yIHlvdS4KLQotVG8gb2J0YWluIHJhdyBkYXRhIG91dHB1dCwgc2V0IGNpbmZvLT5yYXdfZGF0YV9vdXQgPSBUUlVFIGJlZm9yZQotanBlZ19zdGFydF9kZWNvbXByZXNzKCkgKGl0IGlzIHNldCBGQUxTRSBieSBqcGVnX3JlYWRfaGVhZGVyKCkpLiAgQmUgc3VyZSB0bwotdmVyaWZ5IHRoYXQgdGhlIGNvbG9yIHNwYWNlIGFuZCBzYW1wbGluZyBmYWN0b3JzIGFyZSBvbmVzIHlvdSBjYW4gaGFuZGxlLgotVGhlbiBjYWxsIGpwZWdfcmVhZF9yYXdfZGF0YSgpIGluIHBsYWNlIG9mIGpwZWdfcmVhZF9zY2FubGluZXMoKS4gIFRoZQotZGVjb21wcmVzc2lvbiBwcm9jZXNzIGlzIG90aGVyd2lzZSB0aGUgc2FtZSBhcyB1c3VhbC4KLQotanBlZ19yZWFkX3Jhd19kYXRhKCkgcmV0dXJucyBvbmUgTUNVIHJvdyBwZXIgY2FsbCwgYW5kIHRodXMgeW91IG11c3QgcGFzcyBhCi1idWZmZXIgb2YgYXQgbGVhc3QgbWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSBzY2FubGluZXMgKHNjYW5saW5lIGNvdW50aW5nIGlzCi10aGUgc2FtZSBhcyBmb3IgcmF3LWRhdGEgY29tcHJlc3Npb24pLiAgVGhlIGJ1ZmZlciB5b3UgcGFzcyBtdXN0IGJlIGxhcmdlCi1lbm91Z2ggdG8gaG9sZCB0aGUgYWN0dWFsIGRhdGEgcGx1cyBwYWRkaW5nIHRvIERDVC1ibG9jayBib3VuZGFyaWVzLiAgQXMgd2l0aAotY29tcHJlc3Npb24sIGFueSBlbnRpcmVseSBkdW1teSBEQ1QgYmxvY2tzIGFyZSBub3QgcHJvY2Vzc2VkIHNvIHlvdSBuZWVkIG5vdAotYWxsb2NhdGUgc3BhY2UgZm9yIHRoZW0sIGJ1dCB0aGUgdG90YWwgc2NhbmxpbmUgY291bnQgaW5jbHVkZXMgdGhlbS4gIFRoZQotYWJvdmUgZXhhbXBsZSBvZiBjb21wdXRpbmcgYnVmZmVyIGRpbWVuc2lvbnMgZm9yIHJhdy1kYXRhIGNvbXByZXNzaW9uIGlzCi1lcXVhbGx5IHZhbGlkIGZvciBkZWNvbXByZXNzaW9uLgotCi1JbnB1dCBzdXNwZW5zaW9uIGlzIHN1cHBvcnRlZCB3aXRoIHJhdy1kYXRhIGRlY29tcHJlc3Npb246IGlmIHRoZSBkYXRhIHNvdXJjZQotbW9kdWxlIHN1c3BlbmRzLCBqcGVnX3JlYWRfcmF3X2RhdGEoKSB3aWxsIHJldHVybiAwLiAgWW91IGNhbiBhbHNvIHVzZQotYnVmZmVyZWQtaW1hZ2UgbW9kZSB0byByZWFkIHJhdyBkYXRhIGluIG11bHRpcGxlIHBhc3Nlcy4KLQotCi1SZWFsbHkgcmF3IGRhdGE6IERDVCBjb2VmZmljaWVudHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JdCBpcyBwb3NzaWJsZSB0byByZWFkIG9yIHdyaXRlIHRoZSBjb250ZW50cyBvZiBhIEpQRUcgZmlsZSBhcyByYXcgRENUCi1jb2VmZmljaWVudHMuICBUaGlzIGZhY2lsaXR5IGlzIG1haW5seSBpbnRlbmRlZCBmb3IgdXNlIGluIGxvc3NsZXNzCi10cmFuc2NvZGluZyBiZXR3ZWVuIGRpZmZlcmVudCBKUEVHIGZpbGUgZm9ybWF0cy4gIE90aGVyIHBvc3NpYmxlIGFwcGxpY2F0aW9ucwotaW5jbHVkZSBsb3NzbGVzcyBjcm9wcGluZyBvZiBhIEpQRUcgaW1hZ2UsIGxvc3NsZXNzIHJlYXNzZW1ibHkgb2YgYQotbXVsdGktc3RyaXAgb3IgbXVsdGktdGlsZSBUSUZGL0pQRUcgZmlsZSBpbnRvIGEgc2luZ2xlIEpQRUcgZGF0YXN0cmVhbSwgZXRjLgotCi1UbyByZWFkIHRoZSBjb250ZW50cyBvZiBhIEpQRUcgZmlsZSBhcyBEQ1QgY29lZmZpY2llbnRzLCBvcGVuIHRoZSBmaWxlIGFuZCBkbwotanBlZ19yZWFkX2hlYWRlcigpIGFzIHVzdWFsLiAgQnV0IGluc3RlYWQgb2YgY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKQotYW5kIGpwZWdfcmVhZF9zY2FubGluZXMoKSwgY2FsbCBqcGVnX3JlYWRfY29lZmZpY2llbnRzKCkuICBUaGlzIHdpbGwgcmVhZCB0aGUKLWVudGlyZSBpbWFnZSBpbnRvIGEgc2V0IG9mIHZpcnR1YWwgY29lZmZpY2llbnQtYmxvY2sgYXJyYXlzLCBvbmUgYXJyYXkgcGVyCi1jb21wb25lbnQuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB2aXJ0dWFsLWFycmF5Ci1kZXNjcmlwdG9ycy4gIEVhY2ggdmlydHVhbCBhcnJheSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgdXNpbmcgdGhlIEpQRUcKLW1lbW9yeSBtYW5hZ2VyJ3MgYWNjZXNzX3ZpcnRfYmFycmF5IG1ldGhvZCAoc2VlIE1lbW9yeSBtYW5hZ2VtZW50LCBiZWxvdywKLWFuZCBhbHNvIHJlYWQgc3RydWN0dXJlLmRvYydzIGRpc2N1c3Npb24gb2YgdmlydHVhbCBhcnJheSBoYW5kbGluZykuICBPciwKLWZvciBzaW1wbGUgdHJhbnNjb2RpbmcgdG8gYSBkaWZmZXJlbnQgSlBFRyBmaWxlIGZvcm1hdCwgdGhlIGFycmF5IGxpc3QgY2FuCi1qdXN0IGJlIGhhbmRlZCBkaXJlY3RseSB0byBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgotCi1FYWNoIGJsb2NrIGluIHRoZSBibG9jayBhcnJheXMgY29udGFpbnMgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlcyBpbgotbm9ybWFsIGFycmF5IG9yZGVyIChub3QgSlBFRyB6aWd6YWcgb3JkZXIpLiAgVGhlIGJsb2NrIGFycmF5cyBjb250YWluIG9ubHkKLURDVCBibG9ja3MgY29udGFpbmluZyByZWFsIGRhdGE7IGFueSBlbnRpcmVseS1kdW1teSBibG9ja3MgYWRkZWQgdG8gZmlsbCBvdXQKLWludGVybGVhdmVkIE1DVXMgYXQgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlcyBvZiB0aGUgaW1hZ2UgYXJlIGRpc2NhcmRlZAotZHVyaW5nIHJlYWRpbmcgYW5kIGFyZSBub3Qgc3RvcmVkIGluIHRoZSBibG9jayBhcnJheXMuICAoVGhlIHNpemUgb2YgZWFjaAotYmxvY2sgYXJyYXkgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgd2lkdGhfaW5fYmxvY2tzIGFuZCBoZWlnaHRfaW5fYmxvY2tzCi1maWVsZHMgb2YgdGhlIGNvbXBvbmVudCdzIGNvbXBfaW5mbyBlbnRyeS4pICBUaGlzIGlzIGFsc28gdGhlIGRhdGEgZm9ybWF0Ci1leHBlY3RlZCBieSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgotCi1XaGVuIHlvdSBhcmUgZG9uZSB1c2luZyB0aGUgdmlydHVhbCBhcnJheXMsIGNhbGwganBlZ19maW5pc2hfZGVjb21wcmVzcygpCi10byByZWxlYXNlIHRoZSBhcnJheSBzdG9yYWdlIGFuZCByZXR1cm4gdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IHRvIGFuIGlkbGUKLXN0YXRlOyBvciBqdXN0IGNhbGwganBlZ19kZXN0cm95KCkgaWYgeW91IGRvbid0IG5lZWQgdG8gcmV1c2UgdGhlIG9iamVjdC4KLQotSWYgeW91IHVzZSBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UsIGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKSB3aWxsIHJldHVybgotTlVMTCBpZiBpdCBpcyBmb3JjZWQgdG8gc3VzcGVuZDsgYSBub24tTlVMTCByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHN1Y2Nlc3NmdWwKLWNvbXBsZXRpb24uICBZb3UgbmVlZCBub3QgdGVzdCBmb3IgYSBOVUxMIHJldHVybiB2YWx1ZSB3aGVuIHVzaW5nIGEKLW5vbi1zdXNwZW5kaW5nIGRhdGEgc291cmNlLgotCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNhbGwganBlZ19yZWFkX2NvZWZmaWNpZW50cygpIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlCi1kZWNvZGVyJ3MgY29lZmZpY2llbnQgYXJyYXlzIGR1cmluZyBhIG5vcm1hbCBkZWNvZGUgY3ljbGUgaW4gYnVmZmVyZWQtaW1hZ2UKLW1vZGUuICBUaGlzIGZyYW1taXNoIG1pZ2h0IGJlIHVzZWZ1bCBmb3IgcHJvZ3Jlc3NpdmVseSBkaXNwbGF5aW5nIGFuIGluY29taW5nCi1pbWFnZSBhbmQgdGhlbiByZS1lbmNvZGluZyBpdCB3aXRob3V0IGxvc3MuICBUbyBkbyB0aGlzLCBkZWNvZGUgaW4gYnVmZmVyZWQtCi1pbWFnZSBtb2RlIGFzIGRpc2N1c3NlZCBwcmV2aW91c2x5LCB0aGVuIGNhbGwganBlZ19yZWFkX2NvZWZmaWNpZW50cygpIGFmdGVyCi10aGUgbGFzdCBqcGVnX2ZpbmlzaF9vdXRwdXQoKSBjYWxsLiAgVGhlIGFycmF5cyB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgeW91ciB1c2UKLXVudGlsIHlvdSBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKS4KLQotCi1UbyB3cml0ZSB0aGUgY29udGVudHMgb2YgYSBKUEVHIGZpbGUgYXMgRENUIGNvZWZmaWNpZW50cywgeW91IG11c3QgcHJvdmlkZQotdGhlIERDVCBjb2VmZmljaWVudHMgc3RvcmVkIGluIHZpcnR1YWwgYmxvY2sgYXJyYXlzLiAgWW91IGNhbiBlaXRoZXIgcGFzcwotYmxvY2sgYXJyYXlzIHJlYWQgZnJvbSBhbiBpbnB1dCBKUEVHIGZpbGUgYnkganBlZ19yZWFkX2NvZWZmaWNpZW50cygpLCBvcgotYWxsb2NhdGUgdmlydHVhbCBhcnJheXMgZnJvbSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QgYW5kIGZpbGwgdGhlbQoteW91cnNlbGYuICBJbiBlaXRoZXIgY2FzZSwganBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBpcyBzdWJzdGl0dXRlZCBmb3IKLWpwZWdfc3RhcnRfY29tcHJlc3MoKSBhbmQganBlZ193cml0ZV9zY2FubGluZXMoKS4gIFRodXMgdGhlIHNlcXVlbmNlIGlzCi0gICogQ3JlYXRlIGNvbXByZXNzaW9uIG9iamVjdAotICAqIFNldCBhbGwgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhcyBuZWNlc3NhcnkKLSAgKiBSZXF1ZXN0IHZpcnR1YWwgYXJyYXlzIGlmIG5lZWRlZAotICAqIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkKLSAgKiBqcGVnX2ZpbmlzaF9jb21wcmVzcygpCi0gICogRGVzdHJveSBvciByZS11c2UgY29tcHJlc3Npb24gb2JqZWN0Ci1qcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIGlzIHBhc3NlZCBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdmlydHVhbCBibG9jawotYXJyYXkgZGVzY3JpcHRvcnM7IHRoZSBudW1iZXIgb2YgYXJyYXlzIGlzIGVxdWFsIHRvIGNpbmZvLm51bV9jb21wb25lbnRzLgotCi1UaGUgdmlydHVhbCBhcnJheXMgbmVlZCBvbmx5IGhhdmUgYmVlbiByZXF1ZXN0ZWQsIG5vdCByZWFsaXplZCwgYmVmb3JlCi1qcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIGlzIGNhbGxlZC4gIEEgc2lkZS1lZmZlY3Qgb2YKLWpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgaXMgdG8gcmVhbGl6ZSBhbnkgdmlydHVhbCBhcnJheXMgdGhhdCBoYXZlIGJlZW4KLXJlcXVlc3RlZCBmcm9tIHRoZSBjb21wcmVzc2lvbiBvYmplY3QncyBtZW1vcnkgbWFuYWdlci4gIFRodXMsIHdoZW4gb2J0YWluaW5nCi10aGUgdmlydHVhbCBhcnJheXMgZnJvbSB0aGUgY29tcHJlc3Npb24gb2JqZWN0LCB5b3Ugc2hvdWxkIGZpbGwgdGhlIGFycmF5cwotYWZ0ZXIgY2FsbGluZyBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLiAgVGhlIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiBvdXQKLXdoZW4geW91IGNhbGwganBlZ19maW5pc2hfY29tcHJlc3MoKTsganBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBvbmx5IHdyaXRlcwotdGhlIGZpbGUgaGVhZGVyLgotCi1XaGVuIHdyaXRpbmcgcmF3IERDVCBjb2VmZmljaWVudHMsIGl0IGlzIGNydWNpYWwgdGhhdCB0aGUgSlBFRyBxdWFudGl6YXRpb24KLXRhYmxlcyBhbmQgc2FtcGxpbmcgZmFjdG9ycyBtYXRjaCB0aGUgd2F5IHRoZSBkYXRhIHdhcyBlbmNvZGVkLCBvciB0aGUKLXJlc3VsdGluZyBmaWxlIHdpbGwgYmUgaW52YWxpZC4gIEZvciB0cmFuc2NvZGluZyBmcm9tIGFuIGV4aXN0aW5nIEpQRUcgZmlsZSwKLXdlIHJlY29tbWVuZCB1c2luZyBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycygpLiAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzCi1hbGwgdGhlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdG8gZGVmYXVsdCB2YWx1ZXMgKGxpa2UganBlZ19zZXRfZGVmYXVsdHMoKSksCi10aGVuIGNvcGllcyB0aGUgY3JpdGljYWwgaW5mb3JtYXRpb24gZnJvbSBhIHNvdXJjZSBkZWNvbXByZXNzaW9uIG9iamVjdC4KLVRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCBzaG91bGQgaGF2ZSBqdXN0IGJlZW4gdXNlZCB0byByZWFkIHRoZSBlbnRpcmUKLUpQRUcgaW5wdXQgZmlsZSAtLS0gdGhhdCBpcywgaXQgc2hvdWxkIGJlIGF3YWl0aW5nIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKS4KLQotanBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBtYXJrcyBhbGwgdGFibGVzIHN0b3JlZCBpbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0Ci1hcyBuZWVkaW5nIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBmaWxlICh0aHVzLCBpdCBhY3RzIGxpa2UKLWpwZWdfc3RhcnRfY29tcHJlc3MoY2luZm8sIFRSVUUpKS4gIFRoaXMgaXMgZm9yIHNhZmV0eSdzIHNha2UsIHRvIGF2b2lkCi1lbWl0dGluZyBhYmJyZXZpYXRlZCBKUEVHIGZpbGVzIGJ5IGFjY2lkZW50LiAgSWYgeW91IHJlYWxseSB3YW50IHRvIGVtaXQgYW4KLWFiYnJldmlhdGVkIEpQRUcgZmlsZSwgY2FsbCBqcGVnX3N1cHByZXNzX3RhYmxlcygpLCBvciBzZXQgdGhlIHRhYmxlcycKLWluZGl2aWR1YWwgc2VudF90YWJsZSBmbGFncywgYmV0d2VlbiBjYWxsaW5nIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgYW5kCi1qcGVnX2ZpbmlzaF9jb21wcmVzcygpLgotCi0KLVByb2dyZXNzIG1vbml0b3JpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU29tZSBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gcmVnYWluIGNvbnRyb2wgZnJvbSB0aGUgSlBFRyBsaWJyYXJ5IGV2ZXJ5IHNvCi1vZnRlbi4gIFRoZSB0eXBpY2FsIHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gcHJvZHVjZSBhIHBlcmNlbnQtZG9uZSBiYXIgb3IKLW90aGVyIHByb2dyZXNzIGRpc3BsYXkuICAoRm9yIGEgc2ltcGxlIGV4YW1wbGUsIHNlZSBjanBlZy5jIG9yIGRqcGVnLmMuKQotQWx0aG91Z2ggeW91IGRvIGdldCBjb250cm9sIGJhY2sgZnJlcXVlbnRseSBkdXJpbmcgdGhlIGRhdGEtdHJhbnNmZXJyaW5nIHBhc3MKLSh0aGUganBlZ19yZWFkX3NjYW5saW5lcyBvciBqcGVnX3dyaXRlX3NjYW5saW5lcyBsb29wKSwgYW55IGFkZGl0aW9uYWwgcGFzc2VzCi13aWxsIG9jY3VyIGluc2lkZSBqcGVnX2ZpbmlzaF9jb21wcmVzcyBvciBqcGVnX3N0YXJ0X2RlY29tcHJlc3M7IHRob3NlCi1yb3V0aW5lcyBtYXkgdGFrZSBhIGxvbmcgdGltZSB0byBleGVjdXRlLCBhbmQgeW91IGRvbid0IGdldCBjb250cm9sIGJhY2sKLXVudGlsIHRoZXkgYXJlIGRvbmUuCi0KLVlvdSBjYW4gZGVmaW5lIGEgcHJvZ3Jlc3MtbW9uaXRvciByb3V0aW5lIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHBlcmlvZGljYWxseQotYnkgdGhlIGxpYnJhcnkuICBObyBndWFyYW50ZWVzIGFyZSBtYWRlIGFib3V0IGhvdyBvZnRlbiB0aGlzIGNhbGwgd2lsbCBvY2N1ciwKLXNvIHdlIGRvbid0IHJlY29tbWVuZCB5b3UgdXNlIGl0IGZvciBtb3VzZSB0cmFja2luZyBvciBhbnl0aGluZyBsaWtlIHRoYXQuCi1BdCBwcmVzZW50LCBhIGNhbGwgd2lsbCBvY2N1ciBvbmNlIHBlciBNQ1Ugcm93LCBzY2FubGluZSwgb3Igc2FtcGxlIHJvdwotZ3JvdXAsIHdoaWNoZXZlciB1bml0IGlzIGNvbnZlbmllbnQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NpbmcgbW9kZTsgc28gdGhlCi13aWRlciB0aGUgaW1hZ2UsIHRoZSBsb25nZXIgdGhlIHRpbWUgYmV0d2VlbiBjYWxscy4gIER1cmluZyB0aGUgZGF0YQotdHJhbnNmZXJyaW5nIHBhc3MsIG9ubHkgb25lIGNhbGwgb2NjdXJzIHBlciBjYWxsIG9mIGpwZWdfcmVhZF9zY2FubGluZXMgb3IKLWpwZWdfd3JpdGVfc2NhbmxpbmVzLCBzbyBkb24ndCBwYXNzIGEgbGFyZ2UgbnVtYmVyIG9mIHNjYW5saW5lcyBhdCBvbmNlIGlmCi15b3Ugd2FudCBmaW5lIHJlc29sdXRpb24gaW4gdGhlIHByb2dyZXNzIGNvdW50LiAgKElmIHlvdSByZWFsbHkgbmVlZCB0byB1c2UKLXRoZSBjYWxsYmFjayBtZWNoYW5pc20gZm9yIHRpbWUtY3JpdGljYWwgdGFza3MgbGlrZSBtb3VzZSB0cmFja2luZywgeW91IGNvdWxkCi1pbnNlcnQgYWRkaXRpb25hbCBjYWxscyBpbnNpZGUgc29tZSBvZiB0aGUgbGlicmFyeSdzIGlubmVyIGxvb3BzLikKLQotVG8gZXN0YWJsaXNoIGEgcHJvZ3Jlc3MtbW9uaXRvciBjYWxsYmFjaywgY3JlYXRlIGEgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyLAotZmlsbCBpbiBpdHMgcHJvZ3Jlc3NfbW9uaXRvciBmaWVsZCB3aXRoIGEgcG9pbnRlciB0byB5b3VyIGNhbGxiYWNrIHJvdXRpbmUsCi1hbmQgc2V0IGNpbmZvLT5wcm9ncmVzcyB0byBwb2ludCB0byB0aGUgc3RydWN0LiAgVGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkCi13aGVuZXZlciBjaW5mby0+cHJvZ3Jlc3MgaXMgbm9uLU5VTEwuICAoVGhpcyBwb2ludGVyIGlzIHNldCB0byBOVUxMIGJ5Ci1qcGVnX2NyZWF0ZV9jb21wcmVzcyBvciBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzOyB0aGUgbGlicmFyeSB3aWxsIG5vdCBjaGFuZ2UKLWl0IHRoZXJlYWZ0ZXIuICBTbyBpZiB5b3UgYWxsb2NhdGUgZHluYW1pYyBzdG9yYWdlIGZvciB0aGUgcHJvZ3Jlc3Mgc3RydWN0LAotbWFrZSBzdXJlIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIHRoZSBKUEVHIG9iamVjdCBkb2VzLiAgQWxsb2NhdGluZyBmcm9tIHRoZQotSlBFRyBtZW1vcnkgbWFuYWdlciB3aXRoIGxpZmV0aW1lIEpQT09MX1BFUk1BTkVOVCB3aWxsIHdvcmsgbmljZWx5LikgIFlvdQotY2FuIHVzZSB0aGUgc2FtZSBjYWxsYmFjayByb3V0aW5lIGZvciBib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgotCi1UaGUganBlZ19wcm9ncmVzc19tZ3Igc3RydWN0IGNvbnRhaW5zIGZvdXIgZmllbGRzIHdoaWNoIGFyZSBzZXQgYnkgdGhlIGxpYnJhcnk6Ci0JbG9uZyBwYXNzX2NvdW50ZXI7CS8qIHdvcmsgdW5pdHMgY29tcGxldGVkIGluIHRoaXMgcGFzcyAqLwotCWxvbmcgcGFzc19saW1pdDsJLyogdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgaW4gdGhpcyBwYXNzICovCi0JaW50IGNvbXBsZXRlZF9wYXNzZXM7CS8qIHBhc3NlcyBjb21wbGV0ZWQgc28gZmFyICovCi0JaW50IHRvdGFsX3Bhc3NlczsJLyogdG90YWwgbnVtYmVyIG9mIHBhc3NlcyBleHBlY3RlZCAqLwotRHVyaW5nIGFueSBvbmUgcGFzcywgcGFzc19jb3VudGVyIGluY3JlYXNlcyBmcm9tIDAgdXAgdG8gKG5vdCBpbmNsdWRpbmcpCi1wYXNzX2xpbWl0OyB0aGUgc3RlcCBzaXplIGlzIHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSAxLiAgVGhlIHBhc3NfbGltaXQKLXZhbHVlIG1heSBjaGFuZ2UgZnJvbSBvbmUgcGFzcyB0byBhbm90aGVyLiAgVGhlIGV4cGVjdGVkIHRvdGFsIG51bWJlciBvZgotcGFzc2VzIGlzIGluIHRvdGFsX3Bhc3NlcywgYW5kIHRoZSBudW1iZXIgb2YgcGFzc2VzIGFscmVhZHkgY29tcGxldGVkIGlzIGluCi1jb21wbGV0ZWRfcGFzc2VzLiAgVGh1cyB0aGUgZnJhY3Rpb24gb2Ygd29yayBjb21wbGV0ZWQgbWF5IGJlIGVzdGltYXRlZCBhcwotCQljb21wbGV0ZWRfcGFzc2VzICsgKHBhc3NfY291bnRlci9wYXNzX2xpbWl0KQotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCXRvdGFsX3Bhc3NlcwotaWdub3JpbmcgdGhlIGZhY3QgdGhhdCB0aGUgcGFzc2VzIG1heSBub3QgYmUgZXF1YWwgYW1vdW50cyBvZiB3b3JrLgotCi1XaGVuIGRlY29tcHJlc3NpbmcsIHBhc3NfbGltaXQgY2FuIGV2ZW4gY2hhbmdlIHdpdGhpbiBhIHBhc3MsIGJlY2F1c2UgaXQKLWRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBzY2FucyBpbiB0aGUgSlBFRyBmaWxlLCB3aGljaCBpc24ndCBhbHdheXMga25vd24gaW4KLWFkdmFuY2UuICBUaGUgY29tcHV0ZWQgZnJhY3Rpb24tb2Ytd29yay1kb25lIG1heSBqdW1wIHN1ZGRlbmx5IChpZiB0aGUgbGlicmFyeQotZGlzY292ZXJzIGl0IGhhcyBvdmVyZXN0aW1hdGVkIHRoZSBudW1iZXIgb2Ygc2NhbnMpIG9yIGV2ZW4gZGVjcmVhc2UgKGluIHRoZQotb3Bwb3NpdGUgY2FzZSkuICBJdCBpcyBub3Qgd2lzZSB0byBwdXQgZ3JlYXQgZmFpdGggaW4gdGhlIHdvcmsgZXN0aW1hdGUuCi0KLVdoZW4gdXNpbmcgdGhlIGRlY29tcHJlc3NvcidzIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBwcm9ncmVzcyBtb25pdG9yIHdvcmsKLWVzdGltYXRlIGlzIGxpa2VseSB0byBiZSBjb21wbGV0ZWx5IHVuaGVscGZ1bCwgYmVjYXVzZSB0aGUgbGlicmFyeSBoYXMgbm8gd2F5Ci10byBrbm93IGhvdyBtYW55IG91dHB1dCBwYXNzZXMgd2lsbCBiZSBkZW1hbmRlZCBvZiBpdC4gIEN1cnJlbnRseSwgdGhlIGxpYnJhcnkKLXNldHMgdG90YWxfcGFzc2VzIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlcmUgd2lsbCBiZSBvbmUgbW9yZSBvdXRwdXQKLXBhc3MgaWYgdGhlIGlucHV0IGZpbGUgZW5kIGhhc24ndCB5ZXQgYmVlbiByZWFkIChqcGVnX2lucHV0X2NvbXBsZXRlKCkgaXNuJ3QKLVRSVUUpLCBidXQgbm8gbW9yZSBvdXRwdXQgcGFzc2VzIGlmIHRoZSBmaWxlIGVuZCBoYXMgYmVlbiByZWFjaGVkIHdoZW4gdGhlCi1vdXRwdXQgcGFzcyBpcyBzdGFydGVkLiAgVGhpcyBtZWFucyB0aGF0IHRvdGFsX3Bhc3NlcyB3aWxsIHJpc2UgYXMgYWRkaXRpb25hbAotb3V0cHV0IHBhc3NlcyBhcmUgcmVxdWVzdGVkLiAgSWYgeW91IGhhdmUgYSB3YXkgb2YgZGV0ZXJtaW5pbmcgdGhlIGlucHV0IGZpbGUKLXNpemUsIGVzdGltYXRpbmcgcHJvZ3Jlc3MgYmFzZWQgb24gdGhlIGZyYWN0aW9uIG9mIHRoZSBmaWxlIHRoYXQncyBiZWVuIHJlYWQKLXdpbGwgcHJvYmFibHkgYmUgbW9yZSB1c2VmdWwgdGhhbiB1c2luZyB0aGUgbGlicmFyeSdzIHZhbHVlLgotCi0KLU1lbW9yeSBtYW5hZ2VtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIHNlY3Rpb24gY292ZXJzIHNvbWUga2V5IGZhY3RzIGFib3V0IHRoZSBKUEVHIGxpYnJhcnkncyBidWlsdC1pbiBtZW1vcnkKLW1hbmFnZXIuICBGb3IgbW9yZSBpbmZvLCBwbGVhc2UgcmVhZCBzdHJ1Y3R1cmUuZG9jJ3Mgc2VjdGlvbiBhYm91dCB0aGUgbWVtb3J5Ci1tYW5hZ2VyLCBhbmQgY29uc3VsdCB0aGUgc291cmNlIGNvZGUgaWYgbmVjZXNzYXJ5LgotCi1BbGwgbWVtb3J5IGFuZCB0ZW1wb3JhcnkgZmlsZSBhbGxvY2F0aW9uIHdpdGhpbiB0aGUgbGlicmFyeSBpcyBkb25lIHZpYSB0aGUKLW1lbW9yeSBtYW5hZ2VyLiAgSWYgbmVjZXNzYXJ5LCB5b3UgY2FuIHJlcGxhY2UgdGhlICJiYWNrIGVuZCIgb2YgdGhlIG1lbW9yeQotbWFuYWdlciB0byBjb250cm9sIGFsbG9jYXRpb24geW91cnNlbGYgKGZvciBleGFtcGxlLCBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUKLWxpYnJhcnkgdG8gdXNlIG1hbGxvYygpIGFuZCBmcmVlKCkgZm9yIHNvbWUgcmVhc29uKS4KLQotU29tZSBkYXRhIGlzIGFsbG9jYXRlZCAicGVybWFuZW50bHkiIGFuZCB3aWxsIG5vdCBiZSBmcmVlZCB1bnRpbCB0aGUgSlBFRwotb2JqZWN0IGlzIGRlc3Ryb3llZC4gIE1vc3QgZGF0YSBpcyBhbGxvY2F0ZWQgInBlciBpbWFnZSIgYW5kIGlzIGZyZWVkIGJ5Ci1qcGVnX2ZpbmlzaF9jb21wcmVzcywganBlZ19maW5pc2hfZGVjb21wcmVzcywgb3IganBlZ19hYm9ydC4gIFlvdSBjYW4gY2FsbCB0aGUKLW1lbW9yeSBtYW5hZ2VyIHlvdXJzZWxmIHRvIGFsbG9jYXRlIHN0cnVjdHVyZXMgdGhhdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKLWZyZWVkIGF0IHRoZXNlIHRpbWVzLiAgVHlwaWNhbCBjb2RlIGZvciB0aGlzIGlzCi0gIHB0ciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIHNpemUpOwotVXNlIEpQT09MX1BFUk1BTkVOVCB0byBnZXQgc3RvcmFnZSB0aGF0IGxhc3RzIGFzIGxvbmcgYXMgdGhlIEpQRUcgb2JqZWN0LgotVXNlIGFsbG9jX2xhcmdlIGluc3RlYWQgb2YgYWxsb2Nfc21hbGwgZm9yIGFueXRoaW5nIGJpZ2dlciB0aGFuIGEgZmV3IEtieXRlcy4KLVRoZXJlIGFyZSBhbHNvIGFsbG9jX3NhcnJheSBhbmQgYWxsb2NfYmFycmF5IHJvdXRpbmVzIHRoYXQgYXV0b21hdGljYWxseQotYnVpbGQgMi1EIHNhbXBsZSBvciBibG9jayBhcnJheXMuCi0KLVRoZSBsaWJyYXJ5J3MgbWluaW11bSBzcGFjZSByZXF1aXJlbWVudHMgdG8gcHJvY2VzcyBhbiBpbWFnZSBkZXBlbmQgb24gdGhlCi1pbWFnZSdzIHdpZHRoLCBidXQgbm90IG9uIGl0cyBoZWlnaHQsIGJlY2F1c2UgdGhlIGxpYnJhcnkgb3JkaW5hcmlseSB3b3Jrcwotd2l0aCAic3RyaXAiIGJ1ZmZlcnMgdGhhdCBhcmUgYXMgd2lkZSBhcyB0aGUgaW1hZ2UgYnV0IGp1c3QgYSBmZXcgcm93cyBoaWdoLgotU29tZSBvcGVyYXRpbmcgbW9kZXMgKGVnLCB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24pIHJlcXVpcmUgZnVsbC1pbWFnZQotYnVmZmVycy4gIFN1Y2ggYnVmZmVycyBhcmUgdHJlYXRlZCBhcyAidmlydHVhbCBhcnJheXMiOiBvbmx5IHRoZSBjdXJyZW50IHN0cmlwCi1uZWVkIGJlIGluIG1lbW9yeSwgYW5kIHRoZSByZXN0IGNhbiBiZSBzd2FwcGVkIG91dCB0byBhIHRlbXBvcmFyeSBmaWxlLgotCi1JZiB5b3UgdXNlIHRoZSBzaW1wbGVzdCBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZCAoam1lbW5vYnMuYyksIHRoZW4gbm8KLXRlbXBvcmFyeSBmaWxlcyBhcmUgdXNlZDsgdmlydHVhbCBhcnJheXMgYXJlIHNpbXBseSBtYWxsb2MoKSdkLiAgSW1hZ2VzIGJpZ2dlcgotdGhhbiBtZW1vcnkgY2FuIGJlIHByb2Nlc3NlZCBvbmx5IGlmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIHZpcnR1YWwgbWVtb3J5LgotVGhlIG90aGVyIG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kcyBzdXBwb3J0IHRlbXBvcmFyeSBmaWxlcyBvZiB2YXJpb3VzIGZsYXZvcnMKLWFuZCB0aHVzIHdvcmsgaW4gbWFjaGluZXMgd2l0aG91dCB2aXJ0dWFsIG1lbW9yeS4gIFRoZXkgbWF5IGFsc28gYmUgdXNlZnVsIG9uCi1Vbml4IG1hY2hpbmVzIGlmIHlvdSBuZWVkIHRvIHByb2Nlc3MgaW1hZ2VzIHRoYXQgZXhjZWVkIGF2YWlsYWJsZSBzd2FwIHNwYWNlLgotCi1XaGVuIHVzaW5nIHRlbXBvcmFyeSBmaWxlcywgdGhlIGxpYnJhcnkgd2lsbCBtYWtlIHRoZSBpbi1tZW1vcnkgYnVmZmVycyBmb3IKLWl0cyB2aXJ0dWFsIGFycmF5cyBqdXN0IGJpZyBlbm91Z2ggdG8gc3RheSB3aXRoaW4gYSAibWF4aW11bSBtZW1vcnkiIHNldHRpbmcuCi1Zb3VyIGFwcGxpY2F0aW9uIGNhbiBzZXQgdGhpcyBsaW1pdCBieSBzZXR0aW5nIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlCi1hZnRlciBjcmVhdGluZyB0aGUgSlBFRyBvYmplY3QuICAoT2YgY291cnNlLCB0aGVyZSBpcyBzdGlsbCBhIG1pbmltdW0gc2l6ZSBmb3IKLXRoZSBidWZmZXJzLCBzbyB0aGUgbWF4LW1lbW9yeSBzZXR0aW5nIGlzIGVmZmVjdGl2ZSBvbmx5IGlmIGl0IGlzIGJpZ2dlciB0aGFuCi10aGUgbWluaW11bSBzcGFjZSBuZWVkZWQuKSAgSWYgeW91IGFsbG9jYXRlIGFueSBsYXJnZSBzdHJ1Y3R1cmVzIHlvdXJzZWxmLCB5b3UKLW11c3QgYWxsb2NhdGUgdGhlbSBiZWZvcmUganBlZ19zdGFydF9jb21wcmVzcygpIG9yIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIGluCi1vcmRlciB0byBoYXZlIHRoZW0gY291bnRlZCBhZ2FpbnN0IHRoZSBtYXggbWVtb3J5IGxpbWl0LiAgQWxzbyBrZWVwIGluIG1pbmQKLXRoYXQgc3BhY2UgYWxsb2NhdGVkIHdpdGggYWxsb2Nfc21hbGwoKSBpcyBpZ25vcmVkLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0Ci1pdCdzIHRvbyBzbWFsbCB0byBiZSB3b3J0aCB3b3JyeWluZyBhYm91dDsgc28gYSByZWFzb25hYmxlIHNhZmV0eSBtYXJnaW4KLXNob3VsZCBiZSBsZWZ0IHdoZW4gc2V0dGluZyBtYXhfbWVtb3J5X3RvX3VzZS4KLQotSWYgeW91IHVzZSB0aGUgam1lbW5hbWUuYyBvciBqbWVtZG9zLmMgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmQsIGl0IGlzCi1pbXBvcnRhbnQgdG8gY2xlYW4gdXAgdGhlIEpQRUcgb2JqZWN0IHByb3Blcmx5IHRvIGVuc3VyZSB0aGF0IHRoZSB0ZW1wb3JhcnkKLWZpbGVzIGdldCBkZWxldGVkLiAgKFRoaXMgaXMgZXNwZWNpYWxseSBjcnVjaWFsIHdpdGggam1lbWRvcy5jLCB3aGVyZSB0aGUKLSJ0ZW1wb3JhcnkgZmlsZXMiIG1heSBiZSBleHRlbmRlZC1tZW1vcnkgc2VnbWVudHM7IGlmIHRoZXkgYXJlIG5vdCBmcmVlZCwKLURPUyB3aWxsIHJlcXVpcmUgYSByZWJvb3QgdG8gcmVjb3ZlciB0aGUgbWVtb3J5LikgIFRodXMsIHdpdGggdGhlc2UgbWVtb3J5Ci1tYW5hZ2VycywgaXQncyBhIGdvb2QgaWRlYSB0byBwcm92aWRlIGEgc2lnbmFsIGhhbmRsZXIgdGhhdCB3aWxsIHRyYXAgYW55Ci1lYXJseSBleGl0IGZyb20geW91ciBwcm9ncmFtLiAgVGhlIGhhbmRsZXIgc2hvdWxkIGNhbGwgZWl0aGVyIGpwZWdfYWJvcnQoKQotb3IganBlZ19kZXN0cm95KCkgZm9yIGFueSBhY3RpdmUgSlBFRyBvYmplY3RzLiAgQSBoYW5kbGVyIGlzIG5vdCBuZWVkZWQgd2l0aAotam1lbW5vYnMuYywgYW5kIHNob3VsZG4ndCBiZSBuZWNlc3Nhcnkgd2l0aCBqbWVtYW5zaS5jIG9yIGptZW1tYWMuYyBlaXRoZXIsCi1zaW5jZSB0aGUgQyBsaWJyYXJ5IGlzIHN1cHBvc2VkIHRvIHRha2UgY2FyZSBvZiBkZWxldGluZyBmaWxlcyBtYWRlIHdpdGgKLXRtcGZpbGUoKS4KLQotCi1NZW1vcnkgdXNhZ2UKLS0tLS0tLS0tLS0tLQotCi1Xb3JraW5nIG1lbW9yeSByZXF1aXJlbWVudHMgd2hpbGUgcGVyZm9ybWluZyBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uCi1kZXBlbmQgb24gaW1hZ2UgZGltZW5zaW9ucywgaW1hZ2UgY2hhcmFjdGVyaXN0aWNzIChzdWNoIGFzIGNvbG9yc3BhY2UgYW5kCi1KUEVHIHByb2Nlc3MpLCBhbmQgb3BlcmF0aW5nIG1vZGUgKGFwcGxpY2F0aW9uLXNlbGVjdGVkIG9wdGlvbnMpLgotCi1BcyBvZiB2NmIsIHRoZSBkZWNvbXByZXNzb3IgcmVxdWlyZXM6Ci0gMS4gQWJvdXQgMjRLIGluIG1vcmUtb3ItbGVzcy1maXhlZC1zaXplIGRhdGEuICBUaGlzIHZhcmllcyBhIGJpdCBkZXBlbmRpbmcKLSAgICBvbiBvcGVyYXRpbmcgbW9kZSBhbmQgaW1hZ2UgY2hhcmFjdGVyaXN0aWNzIChwYXJ0aWN1bGFybHkgY29sb3IgdnMuCi0gICAgZ3JheXNjYWxlKSwgYnV0IGl0IGRvZXNuJ3QgZGVwZW5kIG9uIGltYWdlIGRpbWVuc2lvbnMuCi0gMi4gU3RyaXAgYnVmZmVycyAob2Ygc2l6ZSBwcm9wb3J0aW9uYWwgdG8gdGhlIGltYWdlIHdpZHRoKSBmb3IgSURDVCBhbmQKLSAgICB1cHNhbXBsaW5nIHJlc3VsdHMuICBUaGUgd29yc3QgY2FzZSBmb3IgY29tbW9ubHkgdXNlZCBzYW1wbGluZyBmYWN0b3JzCi0gICAgaXMgYWJvdXQgMzQgYnl0ZXMgKiB3aWR0aCBpbiBwaXhlbHMgZm9yIGEgY29sb3IgaW1hZ2UuICBBIGdyYXlzY2FsZSBpbWFnZQotICAgIG9ubHkgbmVlZHMgYWJvdXQgOCBieXRlcyBwZXIgcGl4ZWwgY29sdW1uLgotIDMuIEEgZnVsbC1pbWFnZSBEQ1QgY29lZmZpY2llbnQgYnVmZmVyIGlzIG5lZWRlZCB0byBkZWNvZGUgYSBtdWx0aS1zY2FuIEpQRUcKLSAgICBmaWxlIChpbmNsdWRpbmcgcHJvZ3Jlc3NpdmUgSlBFR3MpLCBvciB3aGVuZXZlciB5b3Ugc2VsZWN0IGJ1ZmZlcmVkLWltYWdlCi0gICAgbW9kZS4gIFRoaXMgdGFrZXMgMiBieXRlcy9jb2VmZmljaWVudC4gIEF0IHR5cGljYWwgMngyIHNhbXBsaW5nLCB0aGF0J3MKLSAgICAzIGJ5dGVzIHBlciBwaXhlbCBmb3IgYSBjb2xvciBpbWFnZS4gIFdvcnN0IGNhc2UgKDF4MSBzYW1wbGluZykgcmVxdWlyZXMKLSAgICA2IGJ5dGVzL3BpeGVsLiAgRm9yIGdyYXlzY2FsZSwgZmlndXJlIDIgYnl0ZXMvcGl4ZWwuCi0gNC4gVG8gcGVyZm9ybSAyLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLCB0aGUgZGVjb21wcmVzc29yIGFsc28gbmVlZHMgYQotICAgIDEyOEsgY29sb3IgbG9va3VwIHRhYmxlIGFuZCBhIGZ1bGwtaW1hZ2UgcGl4ZWwgYnVmZmVyICgzIGJ5dGVzL3BpeGVsKS4KLVRoaXMgZG9lcyBub3QgY291bnQgYW55IG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCBzdWNoIGFzIGEKLWJ1ZmZlciB0byBob2xkIHRoZSBmaW5hbCBvdXRwdXQgaW1hZ2UuCi0KLVRoZSBhYm92ZSBmaWd1cmVzIGFyZSB2YWxpZCBmb3IgOC1iaXQgSlBFRyBkYXRhIHByZWNpc2lvbiBhbmQgYSBtYWNoaW5lIHdpdGgKLTMyLWJpdCBpbnRzLiAgRm9yIDEyLWJpdCBKUEVHIGRhdGEsIGRvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgc3RyaXAgYnVmZmVycyBhbmQKLXF1YW50aXphdGlvbiBwaXhlbCBidWZmZXIuICBUaGUgImZpeGVkLXNpemUiIGRhdGEgd2lsbCBiZSBzb21ld2hhdCBzbWFsbGVyCi13aXRoIDE2LWJpdCBpbnRzLCBsYXJnZXIgd2l0aCA2NC1iaXQgaW50cy4gIEFsc28sIENNWUsgb3Igb3RoZXIgdW51c3VhbAotY29sb3Igc3BhY2VzIHdpbGwgcmVxdWlyZSBkaWZmZXJlbnQgYW1vdW50cyBvZiBzcGFjZS4KLQotVGhlIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYW5kIHBpeGVsIGJ1ZmZlcnMsIGlmIG5lZWRlZCBhdCBhbGwsIGRvIG5vdAotaGF2ZSB0byBiZSBmdWxseSBSQU0gcmVzaWRlbnQ7IHlvdSBjYW4gaGF2ZSB0aGUgbGlicmFyeSB1c2UgdGVtcG9yYXJ5Ci1maWxlcyBpbnN0ZWFkIHdoZW4gdGhlIHRvdGFsIG1lbW9yeSB1c2FnZSB3b3VsZCBleGNlZWQgYSBsaW1pdCB5b3Ugc2V0LgotKEJ1dCBpZiB5b3VyIE9TIHN1cHBvcnRzIHZpcnR1YWwgbWVtb3J5LCBpdCdzIHByb2JhYmx5IGJldHRlciB0byBqdXN0IHVzZQotam1lbW5vYnMgYW5kIGxldCB0aGUgT1MgZG8gdGhlIHN3YXBwaW5nLikKLQotVGhlIGNvbXByZXNzb3IncyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFyZSBzaW1pbGFyLCBleGNlcHQgdGhhdCBpdCBoYXMgbm8gbmVlZAotZm9yIGNvbG9yIHF1YW50aXphdGlvbi4gIEFsc28sIGl0IG5lZWRzIGEgZnVsbC1pbWFnZSBEQ1QgY29lZmZpY2llbnQgYnVmZmVyCi1pZiBIdWZmbWFuLXRhYmxlIG9wdGltaXphdGlvbiBpcyBhc2tlZCBmb3IsIGV2ZW4gaWYgcHJvZ3Jlc3NpdmUgbW9kZSBpcyBub3QKLXJlcXVlc3RlZC4KLQotSWYgeW91IG5lZWQgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBtZW1vcnkgdXNhZ2UgaW4gYSBwYXJ0aWN1bGFyCi1zaXR1YXRpb24sIHlvdSBjYW4gZW5hYmxlIHRoZSBNRU1fU1RBVFMgY29kZSBpbiBqbWVtbWdyLmMuCi0KLQotTGlicmFyeSBjb21waWxlLXRpbWUgb3B0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BIG51bWJlciBvZiBjb21waWxlLXRpbWUgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIGJ5IG1vZGlmeWluZyBqbW9yZWNmZy5oLgotCi1UaGUgSlBFRyBzdGFuZGFyZCBwcm92aWRlcyBmb3IgYm90aCB0aGUgYmFzZWxpbmUgOC1iaXQgRENUIHByb2Nlc3MgYW5kCi1hIDEyLWJpdCBEQ1QgcHJvY2Vzcy4gIFRoZSBJSkcgY29kZSBzdXBwb3J0cyAxMi1iaXQgbG9zc3kgSlBFRyBpZiB5b3UgZGVmaW5lCi1CSVRTX0lOX0pTQU1QTEUgYXMgMTIgcmF0aGVyIHRoYW4gOC4gIE5vdGUgdGhhdCB0aGlzIGNhdXNlcyBKU0FNUExFIHRvIGJlCi1sYXJnZXIgdGhhbiBhIGNoYXIsIHNvIGl0IGFmZmVjdHMgdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uJ3MgaW1hZ2UgZGF0YS4KLVRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnIGFuZCBkanBlZyBjYW4gc3VwcG9ydCAxMi1iaXQgbW9kZSBvbmx5IGZvciBQUE0KLWFuZCBHSUYgZmlsZSBmb3JtYXRzOyB5b3UgbXVzdCBkaXNhYmxlIHRoZSBvdGhlciBmaWxlIGZvcm1hdHMgdG8gY29tcGlsZSBhCi0xMi1iaXQgY2pwZWcgb3IgZGpwZWcuICAoaW5zdGFsbC5kb2MgaGFzIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdC4pCi1BdCBwcmVzZW50LCBhIDEyLWJpdCBsaWJyYXJ5IGNhbiBoYW5kbGUgKm9ubHkqIDEyLWJpdCBpbWFnZXMsIG5vdCBib3RoCi1wcmVjaXNpb25zLiAgKElmIHlvdSBuZWVkIHRvIGluY2x1ZGUgYm90aCA4LSBhbmQgMTItYml0IGxpYnJhcmllcyBpbiBhIHNpbmdsZQotYXBwbGljYXRpb24sIHlvdSBjb3VsZCBwcm9iYWJseSBkbyBpdCBieSBkZWZpbmluZyBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi1mb3IganVzdCBvbmUgb2YgdGhlIGNvcGllcy4gIFlvdSdkIGhhdmUgdG8gYWNjZXNzIHRoZSA4LWJpdCBhbmQgMTItYml0IGNvcGllcwotZnJvbSBzZXBhcmF0ZSBhcHBsaWNhdGlvbiBzb3VyY2UgZmlsZXMuICBUaGlzIGlzIHVudGVzdGVkIC4uLiBpZiB5b3UgdHJ5IGl0LAotd2UnZCBsaWtlIHRvIGhlYXIgd2hldGhlciBpdCB3b3JrcyEpCi0KLU5vdGUgdGhhdCBhIDEyLWJpdCBsaWJyYXJ5IGFsd2F5cyBjb21wcmVzc2VzIGluIEh1ZmZtYW4gb3B0aW1pemF0aW9uIG1vZGUsCi1pbiBvcmRlciB0byBnZW5lcmF0ZSB2YWxpZCBIdWZmbWFuIHRhYmxlcy4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3VyCi1kZWZhdWx0IEh1ZmZtYW4gdGFibGVzIG9ubHkgY292ZXIgOC1iaXQgZGF0YS4gIElmIHlvdSBuZWVkIHRvIG91dHB1dCAxMi1iaXQKLWZpbGVzIGluIG9uZSBwYXNzLCB5b3UnbGwgaGF2ZSB0byBzdXBwbHkgc3VpdGFibGUgZGVmYXVsdCBIdWZmbWFuIHRhYmxlcy4KLVlvdSBtYXkgYWxzbyB3YW50IHRvIHN1cHBseSB5b3VyIG93biBEQ1QgcXVhbnRpemF0aW9uIHRhYmxlczsgdGhlIGV4aXN0aW5nCi1xdWFsaXR5LXNjYWxpbmcgY29kZSBoYXMgYmVlbiBkZXZlbG9wZWQgZm9yIDgtYml0IHVzZSwgYW5kIHByb2JhYmx5IGRvZXNuJ3QKLWdlbmVyYXRlIGVzcGVjaWFsbHkgZ29vZCB0YWJsZXMgZm9yIDEyLWJpdC4KLQotVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbXBvbmVudHMgKGNvbG9yIGNoYW5uZWxzKSBpbiB0aGUgaW1hZ2UgaXMgZGV0ZXJtaW5lZAotYnkgTUFYX0NPTVBPTkVOVFMuICBUaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgdXAgdG8gMjU1IGNvbXBvbmVudHMsIGJ1dCB3ZQotZXhwZWN0IHRoYXQgZmV3IGFwcGxpY2F0aW9ucyB3aWxsIG5lZWQgbW9yZSB0aGFuIGZvdXIgb3Igc28uCi0KLU9uIG1hY2hpbmVzIHdpdGggdW51c3VhbCBkYXRhIHR5cGUgc2l6ZXMsIHlvdSBtYXkgYmUgYWJsZSB0byBpbXByb3ZlCi1wZXJmb3JtYW5jZSBvciByZWR1Y2UgbWVtb3J5IHNwYWNlIGJ5IHR3ZWFraW5nIHRoZSB2YXJpb3VzIHR5cGVkZWZzIGluCi1qbW9yZWNmZy5oLiAgSW4gcGFydGljdWxhciwgb24gc29tZSBSSVNDIENQVXMsIGFjY2VzcyB0byBhcnJheXMgb2YgInNob3J0InMKLWlzIHF1aXRlIHNsb3c7IGNvbnNpZGVyIHRyYWRpbmcgbWVtb3J5IGZvciBzcGVlZCBieSBtYWtpbmcgSkNPRUYsIElOVDE2LCBhbmQKLVVJTlQxNiBiZSAiaW50IiBvciAidW5zaWduZWQgaW50Ii4gIFVJTlQ4IGlzIGFsc28gYSBjYW5kaWRhdGUgdG8gYmVjb21lIGludC4KLVlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIG1ha2UgSlNBTVBMRSBiZSBpbnQgdW5sZXNzIHlvdSBoYXZlIGxvdHMgb2YgbWVtb3J5Ci10byBidXJuLgotCi1Zb3UgY2FuIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgbGlicmFyeSBieSBjb21waWxpbmcgb3V0IHZhcmlvdXMgb3B0aW9uYWwKLWZ1bmN0aW9ucy4gIFRvIGRvIHRoaXMsIHVuZGVmaW5lIHh4eF9TVVBQT1JURUQgc3ltYm9scyBhcyBuZWNlc3NhcnkuCi0KLVlvdSBjYW4gYWxzbyBzYXZlIGEgZmV3IEsgYnkgbm90IGhhdmluZyB0ZXh0IGVycm9yIG1lc3NhZ2VzIGluIHRoZSBsaWJyYXJ5OwotdGhlIHN0YW5kYXJkIGVycm9yIG1lc3NhZ2UgdGFibGUgb2NjdXBpZXMgYWJvdXQgNUtiLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkKLXJlYXNvbmFibGUgZm9yIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyB3aGVyZSB0aGVyZSdzIG5vIGdvb2Qgd2F5IHRvIGRpc3BsYXkgCi1hIG1lc3NhZ2UgYW55d2F5LiAgVG8gZG8gdGhpcywgcmVtb3ZlIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVzc2FnZSB0YWJsZQotKGpwZWdfc3RkX21lc3NhZ2VfdGFibGVbXSkgZnJvbSBqZXJyb3IuYywgYW5kIGFsdGVyIGZvcm1hdF9tZXNzYWdlIHRvIGRvCi1zb21ldGhpbmcgcmVhc29uYWJsZSB3aXRob3V0IGl0LiAgWW91IGNvdWxkIG91dHB1dCB0aGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUKLW1lc3NhZ2UgY29kZSBudW1iZXIsIGZvciBleGFtcGxlLiAgSWYgeW91IGRvIHRoaXMsIHlvdSBjYW4gYWxzbyBzYXZlIGEgY291cGxlCi1tb3JlIEsgYnkgbW9kaWZ5aW5nIHRoZSBUUkFDRU1TbigpIG1hY3JvcyBpbiBqZXJyb3IuaCB0byBleHBhbmQgdG8gbm90aGluZzsKLXlvdSBkb24ndCBuZWVkIHRyYWNlIGNhcGFiaWxpdHkgYW55d2F5LCByaWdodD8KLQotCi1Qb3J0YWJpbGl0eSBjb25zaWRlcmF0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIEpQRUcgbGlicmFyeSBoYXMgYmVlbiB3cml0dGVuIHRvIGJlIGV4dHJlbWVseSBwb3J0YWJsZTsgdGhlIHNhbXBsZQotYXBwbGljYXRpb25zIGNqcGVnIGFuZCBkanBlZyBhcmUgc2xpZ2h0bHkgbGVzcyBzby4gIFRoaXMgc2VjdGlvbiBzdW1tYXJpemVzCi10aGUgZGVzaWduIGdvYWxzIGluIHRoaXMgYXJlYS4gIChJZiB5b3UgZW5jb3VudGVyIGFueSBidWdzIHRoYXQgY2F1c2UgdGhlCi1saWJyYXJ5IHRvIGJlIGxlc3MgcG9ydGFibGUgdGhhbiBpcyBjbGFpbWVkIGhlcmUsIHdlJ2QgYXBwcmVjaWF0ZSBoZWFyaW5nCi1hYm91dCB0aGVtLikKLQotVGhlIGNvZGUgd29ya3MgZmluZSBvbiBBTlNJIEMsIEMrKywgYW5kIHByZS1BTlNJIEMgY29tcGlsZXJzLCB1c2luZyBhbnkgb2YKLXRoZSBwb3B1bGFyIHN5c3RlbSBpbmNsdWRlIGZpbGUgc2V0dXBzLCBhbmQgc29tZSBub3Qtc28tcG9wdWxhciBvbmVzIHRvby4KLVNlZSBpbnN0YWxsLmRvYyBmb3IgY29uZmlndXJhdGlvbiBwcm9jZWR1cmVzLgotCi1UaGUgY29kZSBpcyBub3QgZGVwZW5kZW50IG9uIHRoZSBleGFjdCBzaXplcyBvZiB0aGUgQyBkYXRhIHR5cGVzLiAgQXMKLWRpc3RyaWJ1dGVkLCB3ZSBtYWtlIHRoZSBhc3N1bXB0aW9ucyB0aGF0Ci0JY2hhcglpcyBhdCBsZWFzdCA4IGJpdHMgd2lkZQotCXNob3J0CWlzIGF0IGxlYXN0IDE2IGJpdHMgd2lkZQotCWludAlpcyBhdCBsZWFzdCAxNiBiaXRzIHdpZGUKLQlsb25nCWlzIGF0IGxlYXN0IDMyIGJpdHMgd2lkZQotKFRoZXNlIGFyZSB0aGUgbWluaW11bSByZXF1aXJlbWVudHMgb2YgdGhlIEFOU0kgQyBzdGFuZGFyZC4pICBXaWRlciB0eXBlcyB3aWxsCi13b3JrIGZpbmUsIGFsdGhvdWdoIG1lbW9yeSBtYXkgYmUgdXNlZCBpbmVmZmljaWVudGx5IGlmIGNoYXIgaXMgbXVjaCBsYXJnZXIKLXRoYW4gOCBiaXRzIG9yIHNob3J0IGlzIG11Y2ggYmlnZ2VyIHRoYW4gMTYgYml0cy4gIFRoZSBjb2RlIHNob3VsZCB3b3JrCi1lcXVhbGx5IHdlbGwgd2l0aCAxNi0gb3IgMzItYml0IGludHMuCi0KLUluIGEgc3lzdGVtIHdoZXJlIHRoZXNlIGFzc3VtcHRpb25zIGFyZSBub3QgbWV0LCB5b3UgbWF5IGJlIGFibGUgdG8gbWFrZSB0aGUKLWNvZGUgd29yayBieSBtb2RpZnlpbmcgdGhlIHR5cGVkZWZzIGluIGptb3JlY2ZnLmguICBIb3dldmVyLCB5b3Ugd2lsbCBwcm9iYWJseQotaGF2ZSBkaWZmaWN1bHR5IGlmIGludCBpcyBsZXNzIHRoYW4gMTYgYml0cyB3aWRlLCBzaW5jZSByZWZlcmVuY2VzIHRvIHBsYWluCi1pbnQgYWJvdW5kIGluIHRoZSBjb2RlLgotCi1jaGFyIGNhbiBiZSBlaXRoZXIgc2lnbmVkIG9yIHVuc2lnbmVkLCBhbHRob3VnaCB0aGUgY29kZSBydW5zIGZhc3RlciBpZiBhbgotdW5zaWduZWQgY2hhciB0eXBlIGlzIGF2YWlsYWJsZS4gIElmIGNoYXIgaXMgd2lkZXIgdGhhbiA4IGJpdHMsIHlvdSB3aWxsIG5lZWQKLXRvIHJlZGVmaW5lIEpPQ1RFVCBhbmQvb3IgcHJvdmlkZSBjdXN0b20gZGF0YSBzb3VyY2UvZGVzdGluYXRpb24gbWFuYWdlcnMgc28KLXRoYXQgSk9DVEVUIHJlcHJlc2VudHMgZXhhY3RseSA4IGJpdHMgb2YgZGF0YSBvbiBleHRlcm5hbCBzdG9yYWdlLgotCi1UaGUgSlBFRyBsaWJyYXJ5IHByb3BlciBkb2VzIG5vdCBhc3N1bWUgQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgY2hhcmFjdGVycy4KLUJ1dCBzb21lIG9mIHRoZSBpbWFnZSBmaWxlIEkvTyBtb2R1bGVzIGluIGNqcGVnL2RqcGVnIGRvIGhhdmUgQVNDSUkKLWRlcGVuZGVuY2llcyBpbiBmaWxlLWhlYWRlciBtYW5pcHVsYXRpb247IHNvIGRvZXMgY2pwZWcncyBzZWxlY3RfZmlsZV90eXBlKCkKLXJvdXRpbmUuCi0KLVRoZSBKUEVHIGxpYnJhcnkgZG9lcyBub3QgcmVseSBoZWF2aWx5IG9uIHRoZSBDIGxpYnJhcnkuICBJbiBwYXJ0aWN1bGFyLCBDCi1zdGRpbyBpcyB1c2VkIG9ubHkgYnkgdGhlIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1vZHVsZXMgYW5kIHRoZSBlcnJvcgotaGFuZGxlciwgYWxsIG9mIHdoaWNoIGFyZSBhcHBsaWNhdGlvbi1yZXBsYWNlYWJsZS4gIChjanBlZy9kanBlZyBhcmUgbW9yZQotaGVhdmlseSBkZXBlbmRlbnQgb24gc3RkaW8uKSAgbWFsbG9jIGFuZCBmcmVlIGFyZSBjYWxsZWQgb25seSBmcm9tIHRoZSBtZW1vcnkKLW1hbmFnZXIgImJhY2sgZW5kIiBtb2R1bGUsIHNvIHlvdSBjYW4gdXNlIGEgZGlmZmVyZW50IG1lbW9yeSBhbGxvY2F0b3IgYnkKLXJlcGxhY2luZyB0aGF0IG9uZSBmaWxlLgotCi1UaGUgY29kZSBnZW5lcmFsbHkgYXNzdW1lcyB0aGF0IEMgbmFtZXMgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGZpcnN0IDE1Ci1jaGFyYWN0ZXJzLiAgSG93ZXZlciwgZ2xvYmFsIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBtYWRlIHVuaXF1ZSBpbiB0aGUKLWZpcnN0IDYgY2hhcmFjdGVycyBieSBkZWZpbmluZyBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTLgotCi1Nb3JlIGluZm8gYWJvdXQgcG9ydGluZyB0aGUgY29kZSBtYXkgYmUgZ2xlYW5lZCBieSByZWFkaW5nIGpjb25maWcuZG9jLAotam1vcmVjZmcuaCwgYW5kIGppbmNsdWRlLmguCi0KLQotTm90ZXMgZm9yIE1TLURPUyBpbXBsZW1lbnRvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBJSkcgY29kZSBpcyBkZXNpZ25lZCB0byB3b3JrIGVmZmljaWVudGx5IGluIDgweDg2ICJzbWFsbCIgb3IgIm1lZGl1bSIKLW1lbW9yeSBtb2RlbHMgKGkuZS4sIGRhdGEgcG9pbnRlcnMgYXJlIDE2IGJpdHMgdW5sZXNzIGV4cGxpY2l0bHkgZGVjbGFyZWQKLSJmYXIiOyBjb2RlIHBvaW50ZXJzIGNhbiBiZSBlaXRoZXIgc2l6ZSkuICBZb3UgbWF5IGJlIGFibGUgdG8gdXNlIHNtYWxsCi1tb2RlbCB0byBjb21waWxlIGNqcGVnIG9yIGRqcGVnIGJ5IGl0c2VsZiwgYnV0IHlvdSB3aWxsIHByb2JhYmx5IGhhdmUgdG8gdXNlCi1tZWRpdW0gbW9kZWwgZm9yIGFueSBsYXJnZXIgYXBwbGljYXRpb24uICBUaGlzIHdvbid0IG1ha2UgbXVjaCBkaWZmZXJlbmNlIGluCi1wZXJmb3JtYW5jZS4gIFlvdSAqd2lsbCogdGFrZSBhIG5vdGljZWFibGUgcGVyZm9ybWFuY2UgaGl0IGlmIHlvdSB1c2UgYQotbGFyZ2UtZGF0YSBtZW1vcnkgbW9kZWwgKHBlcmhhcHMgMTAlLTI1JSksIGFuZCB5b3Ugc2hvdWxkIGF2b2lkICJodWdlIiBtb2RlbAotaWYgYXQgYWxsIHBvc3NpYmxlLgotCi1UaGUgSlBFRyBsaWJyYXJ5IHR5cGljYWxseSBuZWVkcyAyS2ItM0tiIG9mIHN0YWNrIHNwYWNlLiAgSXQgd2lsbCBhbHNvCi1tYWxsb2MgYWJvdXQgMjBLLTMwSyBvZiBuZWFyIGhlYXAgc3BhY2Ugd2hpbGUgZXhlY3V0aW5nIChhbmQgbG90cyBvZiBmYXIKLWhlYXAsIGJ1dCB0aGF0IGRvZXNuJ3QgY291bnQgaW4gdGhpcyBjYWxjdWxhdGlvbikuICBUaGlzIGZpZ3VyZSB3aWxsIHZhcnkKLWRlcGVuZGluZyBvbiBzZWxlY3RlZCBvcGVyYXRpbmcgbW9kZSwgYW5kIHRvIGEgbGVzc2VyIGV4dGVudCBvbiBpbWFnZSBzaXplLgotVGhlcmUgaXMgYWxzbyBhYm91dCA1S2ItNktiIG9mIGNvbnN0YW50IGRhdGEgd2hpY2ggd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhlCi1uZWFyIGRhdGEgc2VnbWVudCAoYWJvdXQgNEtiIG9mIHRoaXMgaXMgdGhlIGVycm9yIG1lc3NhZ2UgdGFibGUpLgotVGh1cyB5b3UgaGF2ZSBwZXJoYXBzIDIwSyBhdmFpbGFibGUgZm9yIG90aGVyIG1vZHVsZXMnIHN0YXRpYyBkYXRhIGFuZCBuZWFyCi1oZWFwIHNwYWNlIGJlZm9yZSB5b3UgbmVlZCB0byBnbyB0byBhIGxhcmdlciBtZW1vcnkgbW9kZWwuICBUaGUgQyBsaWJyYXJ5J3MKLXN0YXRpYyBkYXRhIHdpbGwgYWNjb3VudCBmb3Igc2V2ZXJhbCBLIG9mIHRoaXMsIGJ1dCB0aGF0IHN0aWxsIGxlYXZlcyBhIGdvb2QKLWRlYWwgZm9yIHlvdXIgbmVlZHMuICAoSWYgeW91IGFyZSB0aWdodCBvbiBzcGFjZSwgeW91IGNvdWxkIHJlZHVjZSB0aGUgc2l6ZXMKLW9mIHRoZSBJL08gYnVmZmVycyBhbGxvY2F0ZWQgYnkgamRhdGFzcmMuYyBhbmQgamRhdGFkc3QuYywgc2F5IGZyb20gNEsgdG8KLTFLLiAgQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0byBtb3ZlIHRoZSBlcnJvciBtZXNzYWdlIHRhYmxlIHRvIGZhciBtZW1vcnk7Ci10aGlzIHNob3VsZCBiZSBkb2FibGUgd2l0aCBvbmx5IGxvY2FsaXplZCBoYWNraW5nIG9uIGplcnJvci5jLikKLQotQWJvdXQgMksgb2YgdGhlIG5lYXIgaGVhcCBzcGFjZSBpcyAicGVybWFuZW50IiBtZW1vcnkgdGhhdCB3aWxsIG5vdCBiZQotcmVsZWFzZWQgdW50aWwgeW91IGRlc3Ryb3kgdGhlIEpQRUcgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IGFuIGlzc3VlIGlmIHlvdQotc2F2ZSBhIEpQRUcgb2JqZWN0IGJldHdlZW4gY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvcGVyYXRpb25zLgotCi1GYXIgZGF0YSBzcGFjZSBtYXkgYWxzbyBiZSBhIHRpZ2h0IHJlc291cmNlIHdoZW4geW91IGFyZSBkZWFsaW5nIHdpdGggbGFyZ2UKLWltYWdlcy4gIFRoZSBtb3N0IG1lbW9yeS1pbnRlbnNpdmUgY2FzZSBpcyBkZWNvbXByZXNzaW9uIHdpdGggdHdvLXBhc3MgY29sb3IKLXF1YW50aXphdGlvbiwgb3Igc2luZ2xlLXBhc3MgcXVhbnRpemF0aW9uIHRvIGFuIGV4dGVybmFsbHkgc3VwcGxpZWQgY29sb3IKLW1hcC4gIFRoaXMgcmVxdWlyZXMgYSAxMjhLYiBjb2xvciBsb29rdXAgdGFibGUgcGx1cyBzdHJpcCBidWZmZXJzIGFtb3VudGluZwotdG8gYWJvdXQgNDAgYnl0ZXMgcGVyIGNvbHVtbiBmb3IgdHlwaWNhbCBzYW1wbGluZyByYXRpb3MgKGVnLCBhYm91dCAyNTYwMAotYnl0ZXMgZm9yIGEgNjQwLXBpeGVsLXdpZGUgaW1hZ2UpLiAgWW91IG1heSBub3QgYmUgYWJsZSB0byBwcm9jZXNzIHdpZGUKLWltYWdlcyBpZiB5b3UgaGF2ZSBsYXJnZSBkYXRhIHN0cnVjdHVyZXMgb2YgeW91ciBvd24uCi0KLU9mIGNvdXJzZSwgYWxsIG9mIHRoZXNlIGNvbmNlcm5zIHZhbmlzaCBpZiB5b3UgdXNlIGEgMzItYml0IGZsYXQtbWVtb3J5LW1vZGVsCi1jb21waWxlciwgc3VjaCBhcyBESkdQUCBvciBXYXRjb20gQy4gIFdlIGhpZ2hseSByZWNvbW1lbmQgZmxhdCBtb2RlbCBpZiB5b3UKLWNhbiB1c2UgaXQ7IHRoZSBKUEVHIGxpYnJhcnkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgaW4gZmxhdCBtb2RlbC4KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2x0Y29uZmlnIGIvbGlianBlZ3R3cnAvbHRjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzNDdlNjkuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvbHRjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBsdGNvbmZpZyAtIENyZWF0ZSBhIHN5c3RlbS1zcGVjaWZpYyBsaWJ0b29sLgotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBBIGxvdCBvZiB0aGlzIHNjcmlwdCBpcyB0YWtlbiBmcm9tIGF1dG9jb25mLTIuMTAuCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0ICIke0NEUEFUSCtzZXR9IiA9IHNldDsgdGhlbiBDRFBBVEg9OyBleHBvcnQgQ0RQQVRIOyBmaQotCi1lY2hvPWVjaG8KLWlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbiA6Ci1lbHNlCi0gICMgVGhlIFNvbGFyaXMgYW5kIEFJWCBkZWZhdWx0IGVjaG8gcHJvZ3JhbSB1bnF1b3RlcyBiYWNrc2xhc2hlcy4KLSAgIyBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgIyBTbywgd2UgZW11bGF0ZSBlY2hvIHdpdGggcHJpbnRmICclc1xuJwotICBlY2hvPSJwcmludGYgJXNcXG4iCi0gIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbiA6Ci0gIGVsc2UKLSAgICAjIE9vcHMuICBXZSBoYXZlIG5vIHdvcmtpbmcgcHJpbnRmLiAgVHJ5IHRvIGZpbmQgYSBub3Qtc28tYnVnZ3kgZWNoby4KLSAgICBlY2hvPWVjaG8KLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvZWNobyAmJiB0ZXN0ICJYYCRkaXIvZWNobyAnXHQnYCIgPSAnWFx0JzsgdGhlbgotICAgICAgICBlY2hvPSIkZGlyL2VjaG8iCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLSAgZmkKLWZpCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYCRcXFxcXVwpL1xcXDEvZycKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCi1kb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgXFxcXF1cKS9cXFwxL2cnCi0KLSMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgotcHJvZ25hbWU9YCRlY2hvICJYJDAiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotIyBDb25zdGFudHM6Ci1QUk9HUkFNPWx0Y29uZmlnCi1QQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049MS4yCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC5jIDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC5jICRMSUJTIDE+JjUnCi1ybT0icm0gLWYiCi0KLWhlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBHbG9iYWwgdmFyaWFibGVzOgotY2FuX2J1aWxkX3NoYXJlZD15ZXMKLWVuYWJsZV9zaGFyZWQ9eWVzCi0jIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nLgotZW5hYmxlX3N0YXRpYz15ZXMKLWx0bWFpbj0KLXNpbGVudD0KLXNyY2Rpcj0KLWFjX2NvbmZpZ19ndWVzcz0KLWFjX2NvbmZpZ19zdWI9Ci1ob3N0PQotbm9ub3B0PQotdmVyaWZ5X2hvc3Q9eWVzCi13aXRoX2djYz1ubwotd2l0aF9nbnVfbGQ9bm8KLQotb2xkX0FSPSIkQVIiCi1vbGRfQ0M9IiRDQyIKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi1vbGRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLW9sZF9MRD0iJExEIgotb2xkX0xOX1M9IiRMTl9TIgotb2xkX05NPSIkTk0iCi1vbGRfUkFOTElCPSIkUkFOTElCIgotCi0jIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLWFyZ3M9Ci1wcmV2PQotZm9yIG9wdGlvbgotZG8KLSAgY2FzZSAiJG9wdGlvbiIgaW4KLSAgLSo9Kikgb3B0YXJnPWBlY2hvICIkb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIG9wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICBldmFsICIkcHJldj1cJG9wdGlvbiIKLSAgICBwcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJG9wdGlvbiIgaW4KLSAgLS1oZWxwKSBjYXQgPDxFT00KLVVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gTFRNQUlOIFtIT1NUXQotCi1HZW5lcmF0ZSBhIHN5c3RlbS1zcGVjaWZpYyBsaWJ0b29sIHNjcmlwdC4KLQotICAgIC0tZGlzYWJsZS1zaGFyZWQgICAgICAgZG8gbm90IGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMKLSAgICAtLWRpc2FibGUtc3RhdGljICAgICAgIGRvIG5vdCBidWlsZCBzdGF0aWMgbGlicmFyaWVzCi0gICAgLS1oZWxwICAgICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAgIC0tbm8tdmVyaWZ5ICAgICAgICAgICAgZG8gbm90IHZlcmlmeSB0aGF0IEhPU1QgaXMgYSB2YWxpZCBob3N0IHR5cGUKLSAgICAtLXF1aWV0ICAgICAgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKLSAgICAtLXNpbGVudCAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCi0gICAgLS1zcmNkaXI9RElSICAgICAgICAgICBmaW5kIFxgY29uZmlnLmd1ZXNzJyBpbiBESVIKLSAgICAtLXZlcnNpb24gICAgICAgICAgICAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gICAgLS13aXRoLWdjYyAgICAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgR05VIEMgY29tcGlsZXIgd2lsbCBiZSB1c2VkCi0gICAgLS13aXRoLWdudS1sZCAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgQyBjb21waWxlciB1c2VzIHRoZSBHTlUgbGlua2VyCi0KLUxUTUFJTiBpcyB0aGUgXGBsdG1haW4uc2gnIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHByb3ZpZGVzIGJhc2ljIGxpYnRvb2wKLWZ1bmN0aW9uYWxpdHkuCi0KLUhPU1QgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHN5c3RlbSBuYW1lIFtkZWZhdWx0PWd1ZXNzZWRdLgotRU9NCi0gIGV4aXQgMAotICA7OwotCi0gIC0tZGlzYWJsZS1zaGFyZWQpIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLQotICAtLWRpc2FibGUtc3RhdGljKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KSBzaWxlbnQ9eWVzIDs7Ci0KLSAgLS1zcmNkaXIpIHByZXY9c3JjZGlyIDs7Ci0gIC0tc3JjZGlyPSopIHNyY2Rpcj0iJG9wdGFyZyIgOzsKLQotICAtLW5vLXZlcmlmeSkgdmVyaWZ5X2hvc3Q9bm8gOzsKLQotICAtLXZlcnNpb24pIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OIjsgZXhpdCAwIDs7Ci0KLSAgLS13aXRoLWdjYykgd2l0aF9nY2M9eWVzIDs7Ci0gIC0td2l0aC1nbnUtbGQpIHdpdGhfZ251X2xkPXllcyA7OwotCi0gIC0qKQotICAgIGVjaG8gIiRwcm9nbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRvcHRpb24nIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAteiAiJGx0bWFpbiI7IHRoZW4KLSAgICAgIGx0bWFpbj0iJG9wdGlvbiIKLSAgICBlbGlmIHRlc3QgLXogIiRob3N0IjsgdGhlbgotIyBUaGlzIGdlbmVyYXRlcyBhbiB1bm5lY2Vzc2FyeSB3YXJuaW5nIGZvciBzcGFyYy1zdW4tc29sYXJpczQuMS4zX1UxCi0jICAgICAgaWYgdGVzdCAtbiAiYGVjaG8gJG9wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSMgICAgICAgIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZyBcYCRvcHRpb24nIGlzIG5vdCBhIHZhbGlkIGhvc3QgdHlwZSIgMT4mMgotIyAgICAgIGZpCi0gICAgICBob3N0PSIkb3B0aW9uIgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogdG9vIG1hbnkgYXJndW1lbnRzIiAxPiYyCi0gICAgICBlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC16ICIkbHRtYWluIjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBMVE1BSU4gZmlsZSIgMT4mMgotICBlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWZpCi0KLWlmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuIDoKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBcYCRsdG1haW4nIGRvZXMgbm90IGV4aXN0IiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBRdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotbHRjb25maWdfYXJncz0KLWZvciBhcmcKLWRvCi0gIGNhc2UgIiRhcmciIGluCi0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGx0Y29uZmlnX2FyZ3M9IiRsdGNvbmZpZ19hcmdzICckYXJnJyIgOzsKLSAgKikgbHRjb25maWdfYXJncz0iJGx0Y29uZmlnX2FyZ3MgJGFyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIEEgcmVsZXZhbnQgc3Vic2V0IG9mIEFDX0lOSVQuCi0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCi0jIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAotIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLQotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgIyBBc3N1bWUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdGhlIHNhbWUgb25lIGFzIHRoZSBwYXRoIHRvIGx0bWFpbi5zaC4KLSAgc3JjZGlyPWAkZWNobyAiJGx0bWFpbiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICB0ZXN0ICIkc3JjZGlyIiA9ICIkbHRtYWluIiAmJiBzcmNkaXI9LgotZmkKLQotdHJhcCAiJHJtIGNvbmZ0ZXN0KjsgZXhpdCAxIiAxIDIgMTUKLWlmIHRlc3QgIiR2ZXJpZnlfaG9zdCIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBmb3IgY29uZmlnLmd1ZXNzIGFuZCBjb25maWcuc3ViLgotICBhY19hdXhfZGlyPQotICBmb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9jb25maWcuZ3Vlc3M7IHRoZW4KLSAgICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIGlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGZpbmQgY29uZmlnLmd1ZXNzIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLSAgYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotICBhY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLQotICAjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi0gIGlmICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMgotICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci0KLSAgaG9zdF9hbGlhcz0kaG9zdAotICBjYXNlICIkaG9zdF9hbGlhcyIgaW4KLSAgIiIpCi0gICAgaWYgaG9zdF9hbGlhcz1gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjIKLSAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaSA7OwotICBlc2FjCi0gIGhvc3Q9YCRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotICBlY2hvICIkYWNfdCRob3N0IiAxPiY2Ci0KLSAgIyBNYWtlIHN1cmUgdGhlIGhvc3QgdmVyaWZpZWQuCi0gIHRlc3QgLXogIiRob3N0IiAmJiBleGl0IDEKLQotZWxpZiB0ZXN0IC16ICIkaG9zdCI7IHRoZW4KLSAgZWNobyAiJHByb2duYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgaG9zdCB0eXBlIGlmIHlvdSB1c2UgXGAtLW5vLXZlcmlmeSciIDE+JjIKLSAgZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1lbHNlCi0gIGhvc3RfYWxpYXM9JGhvc3QKLWZpCi0KLSMgVHJhbnNmb3JtIGxpbnV4KiB0byAqLSotbGludXgtZ251KiwgdG8gc3VwcG9ydCBvbGQgY29uZmlndXJlIHNjcmlwdHMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWxpbnV4LWdudSopIDs7Ci1saW51eCopIGhvc3Q9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoLiotLiotbGludXhcKVwoLipcKSQvXDEtZ251XDIvJ2AKLWVzYWMKLQotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi0KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4MyopCi0gICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotICBpZiB0ZXN0ICIke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gc2V0OyB0aGVuCi0gICAgQ09MTEVDVF9OQU1FUz0KLSAgICBleHBvcnQgQ09MTEVDVF9OQU1FUwotICBmaQotICA7OwotZXNhYwotCi0jIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KLW9sZF9hcmNoaXZlX2NtZHM9JyRBUiBjcnUgJG9sZGxpYiRvbGRvYmpzJwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KLQotIyBTZXQgYSBzYW5lIGRlZmF1bHQgZm9yIGBBUicuCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi0KLSMgSWYgUkFOTElCIGlzIG5vdCBzZXQsIHRoZW4gcnVuIHRoZSB0ZXN0LgotaWYgdGVzdCAiJHtSQU5MSUIrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgcmVzdWx0PW5vCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJhbmxpYi4uLiAkYWNfYyIgMT4mNgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgaWYgdGVzdCAtZiAkZGlyL3JhbmxpYjsgdGhlbgotICAgICAgUkFOTElCPSJyYW5saWIiCi0gICAgICByZXN1bHQ9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICBlY2hvICIkYWNfdCRyZXN1bHQiIDE+JjYKLWZpCi0KLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzO1wkUkFOTElCIFwkb2xkbGliIgotICBvbGRfcG9zdGluc3RhbGxfY21kcz0iXCRSQU5MSUIgXCRvbGRsaWI7JG9sZF9wb3N0aW5zdGFsbF9jbWRzIgotZmkKLQotIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIHVzaW5nIEdDQy4KLWlmIHRlc3QgIiR3aXRoX2djYyIgIT0geWVzIHx8IHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBJZiBDQyBpcyBub3Qgc2V0LCB0aGVuIHRyeSB0byBmaW5kIEdDQyBvciBhIHVzYWJsZSBDQy4KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnY2MuLi4gJGFjX2MiIDE+JjYKLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjOyB0aGVuCi0JQ0M9ImdjYyIKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCRDQyIgMT4mNgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgICBmaQotICBmaQotCi0gICMgTm90ICJnY2MiLCBzbyB0cnkgImNjIiwgcmVqZWN0aW5nICIvdXNyL3VjYi9jYyIuCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2MuLi4gJGFjX2MiIDE+JjYKLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGNjX3JlamVjdGVkPW5vCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvY2M7IHRoZW4KLQlpZiB0ZXN0ICIkZGlyL2NjIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLQkgIGNjX3JlamVjdGVkPXllcwotCSAgY29udGludWUKLQlmaQotCUNDPSJjYyIKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgaWYgdGVzdCAkY2NfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgICAgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgICAgIHNldCBkdW1teSAkQ0MKLSAgICAgIHNoaWZ0Ci0gICAgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0JIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0JIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0JIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLQlzaGlmdAotCXNldCBkdW1teSAiJGRpci9jYyIgIiRAIgotCXNoaWZ0Ci0JQ0M9IiRAIgotICAgICAgZmkKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotICBmaQotCi0gICMgTm93IHNlZSBpZiB0aGUgY29tcGlsZXIgaXMgcmVhbGx5IEdDQy4KLSAgd2l0aF9nY2M9bm8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMuLi4gJGFjX2MiIDE+JjYKLSAgZWNobyAiJHByb2duYW1lOjQyNDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotCi0gICRybSBjb25mdGVzdC5jCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotICBpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NDMyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICB3aXRoX2djYz15ZXMKLSAgZmkKLSAgJHJtIGNvbmZ0ZXN0LmMKLSAgZWNobyAiJGFjX3Qkd2l0aF9nY2MiIDE+JjYKLWZpCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1zZXQgZHVtbXkgJENDCi1jb21waWxlcj0iJDIiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICRhY19jIiAxPiY2Ci1waWNfZmxhZz0KLXNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0KLXdsPQotbGlua19zdGF0aWNfZmxhZz0KLW5vX2J1aWx0aW5fZmxhZz0KLQotaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICB3bD0nLVdsLCcKLSAgbGlua19zdGF0aWNfZmxhZz0nLXN0YXRpYycKLSAgbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJwotCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKiB8IGFpeDQqIHwgaXJpeDUqIHwgaXJpeDYqIHwgb3NmMyogfCBvc2Y0KikKLSAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICA7OwotICBvczIqKQotICAgICMgV2UgY2FuIGJ1aWxkIERMTHMgZnJvbSBub24tUElDLgotICAgIDs7Ci0gIGFtaWdhb3MqKQotICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKLSAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgIHBpY19mbGFnPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCi0gICAgOzsKLSAgKikKLSAgICBwaWNfZmxhZz0nLWZQSUMnCi0gICAgOzsKLSAgZXNhYwotZWxzZQotICAjIFBPUlRNRSBDaGVjayBmb3IgUElDIGZsYWdzIGZvciB0aGUgc3lzdGVtIGNvbXBpbGVyLgotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYWl4MyogfCBhaXg0KikKLSAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotICAgIDs7Ci0KLSAgaHB1eDkqIHwgaHB1eDEwKikKLSAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGxpbmtfc3RhdGljX2ZsYWcgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPwotICAgIHdsPSctV2wsJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9IiR7d2x9LWEgJHt3bH1hcmNoaXZlIgotICAgIHBpY19mbGFnPScrWicKLSAgICA7OwotCi0gIGlyaXg1KiB8IGlyaXg2KikKLSAgICB3bD0nLVdsLCcKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctbm9uX3NoYXJlZCcKLSAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCi0gICAgOzsKLQotICBvczIqKQotICAgICMgV2UgY2FuIGJ1aWxkIERMTHMgZnJvbSBub24tUElDLgotICAgIDs7Ci0KLSAgb3NmMyogfCBvc2Y0KikKLSAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KLSAgICB3bD0nLVdsLCcKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctbm9uX3NoYXJlZCcKLSAgICA7OwotCi0gIHNjbzMuMnY1KikKLSAgICBwaWNfZmxhZz0nLUtwaWMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLWRuJwotICAgIHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0nLWJlbGYnCi0gICAgOzsKLQotICBzb2xhcmlzMiopCi0gICAgcGljX2ZsYWc9Jy1LUElDJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIHdsPSctV2wsJwotICAgIDs7Ci0KLSAgc3Vub3M0KikKLSAgICBwaWNfZmxhZz0nLVBJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVFvcHRpb24gbGQgJwotICAgIDs7Ci0KLSAgc3lzdjQuMnV3MiopCi0gICAgcGljX2ZsYWc9Jy1LUElDJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIHdsPSctV2wsJwotICAgIDs7Ci0KLSAgdXRzNCopCi0gICAgcGljX2ZsYWc9Jy1waWMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgOzsKLQotICAqKQotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICA7OwotICBlc2FjCi1maQotCi1pZiB0ZXN0IC1uICIkcGljX2ZsYWciOyB0aGVuCi0gIGVjaG8gIiRhY190JHBpY19mbGFnIiAxPiY2Ci0KLSAgIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHBpY19mbGFnIGFjdHVhbGx5IHdvcmtzLgotICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJHBpY19mbGFnIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0gICRybSBjb25mdGVzdCoKLSAgZWNobyA+IGNvbmZ0ZXN0LmMKLSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAkcGljX2ZsYWcgLURQSUMiCi0gIGVjaG8gIiRwcm9nbmFtZTo1NDc6IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkcGljX2ZsYWcgd29ya3MiID4mNQotICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjU0ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCi0gICAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotCi0gICAgIyBPbiBIUC1VWCwgYm90aCBDQyBhbmQgR0NDIG9ubHkgd2FybiB0aGF0IFBJQyBpcyBzdXBwb3J0ZWQuLi4gdGhlbiB0aGV5Ci0gICAgIyBjcmVhdGUgbm9uLVBJQyBvYmplY3RzLiAgU28sIGlmIHRoZXJlIHdlcmUgYW55IHdhcm5pbmdzLCB3ZSBhc3N1bWUgdGhhdAotICAgICMgUElDIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIHBpY19mbGFnPQotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190InllcyAxPiY2Ci0gICAgICBwaWNfZmxhZz0iICRwaWNfZmxhZyIKLSAgICBmaQotICBlbHNlCi0gICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgcGljX2ZsYWc9Ci0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSAgJHJtIGNvbmZ0ZXN0KgotZWxzZQotICBlY2hvICIkYWNfdCJub25lIDE+JjYKLWZpCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIHNoYXJlZCBsaWJyYXJ5IGNvbXBpbGF0aW9uIGZsYWdzLgotaWYgdGVzdCAtbiAiJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncyI7IHRoZW4KLSAgZWNobyAiJHByb2duYW1lOiB3YXJuaW5nOiBcYCRDQycgcmVxdWlyZXMgXGAkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzJyB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0gIGlmIGVjaG8gIiRvbGRfQ0MgJG9sZF9DRkxBR1MgIiB8IGVncmVwIC1lICJbIAldJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFnc1sgCV0iID4vZGV2L251bGw7IHRoZW4gOgotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBhZGQgXGAkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzJyB0byB0aGUgQ0Mgb3IgQ0ZMQUdTIGVudiB2YXJpYWJsZSBhbmQgcmVjb25maWd1cmUiIDE+JjIKLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gIGZpCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGxpbmtfc3RhdGljX2ZsYWcgd29ya3MuLi4gJGFjX2MiIDE+JjYKLSRybSBjb25mdGVzdCoKLWVjaG8gJ21haW4oKXtyZXR1cm4oMCk7fScgPiBjb25mdGVzdC5jCi1zYXZlX0xERkxBR1M9IiRMREZMQUdTIgotTERGTEFHUz0iJExERkxBR1MgJGxpbmtfc3RhdGljX2ZsYWciCi1lY2hvICIkcHJvZ25hbWU6NTkxOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGxpbmtfc3RhdGljX2ZsYWcgd29ya3MiID4mNQotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo1OTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBlY2hvICIkYWNfdCRsaW5rX3N0YXRpY19mbGFnIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190Im5vbmUgMT4mNgotICBsaW5rX3N0YXRpY19mbGFnPQotZmkKLUxERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0kcm0gY29uZnRlc3QqCi0KLWlmIHRlc3QgLXogIiRMTl9TIjsgdGhlbgotICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gdXNlIGxuIC1zLCBvciB3ZSBuZWVkIGhhcmQgbGlua3MuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0ZGF0YQotICBpZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbDsgdGhlbgotICAgICRybSBjb25mdGVzdGRhdGEKLSAgICBMTl9TPSJsbiAtcyIKLSAgZWxzZQotICAgIExOX1M9bG4KLSAgZmkKLSAgaWYgdGVzdCAiJExOX1MiID0gImxuIC1zIjsgdGhlbgotICAgIGVjaG8gIiRhY190InllcyAxPiY2Ci0gIGVsc2UKLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi1maQotCi0jIE1ha2Ugc3VyZSBMRCBpcyBhbiBhYnNvbHV0ZSBwYXRoLgotaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBhY19wcm9nPWxkCi0gIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6NjI0OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICAvKiB8IFtBLVphLXpdOlxcKikKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgICAiIikKLSAgICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmUgbm90IHVzaW5nIEdDQy4KLSAgICAgIGFjX3Byb2c9bGQKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjY0MjogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci0gIGVsc2UKLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjY0NTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotICBmaQotCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLQlMRD0iJGFjX2Rpci8kYWNfcHJvZyIKLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0JIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotCSMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotCWlmICIkTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0JZWxzZQotCSAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLQlmaQotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIGZpCi0KLSAgaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICAgIGVjaG8gIiRhY190JExEIiAxPiY2Ci0gIGVsc2UKLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0KLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi1maQotCi0jIENoZWNrIHRvIHNlZSBpZiBpdCByZWFsbHkgaXMgb3IgaXMgbm90IEdOVSBsZC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICRhY19jIiAxPiY2Ci0jIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi1lY2hvICIkYWNfdCR3aXRoX2dudV9sZCIgMT4mNgotCi0jIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgotCi1hbGxvd191bmRlZmluZWRfZmxhZz0KLW5vX3VuZGVmaW5lZF9mbGFnPQotYXJjaGl2ZV9jbWRzPQotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQotaGFyZGNvZGVfZGlyZWN0PW5vCi1oYXJkY29kZV9taW51c19MPW5vCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCi1ydW5wYXRoX3Zhcj0KLQotY2FzZSAiJGhvc3Rfb3MiIGluCi1hbWlnYW9zKiB8IHN1bm9zNCopCi0gICMgT24gdGhlc2Ugb3BlcmF0aW5nIHN5c3RlbXMsIHdlIHNob3VsZCB0cmVhdCBHTlUgbGQgbGlrZSB0aGUgc3lzdGVtIGxkLgotICBnbnVfbGRfYWN0c19uYXRpdmU9eWVzCi0gIDs7Ci0qKQotICBnbnVfbGRfYWN0c19uYXRpdmU9bm8KLSAgOzsKLWVzYWMKLQotbGRfc2hsaWJzPXllcwotaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllcyAmJiB0ZXN0ICIkZ251X2xkX2FjdHNfbmF0aXZlIiAhPSB5ZXM7IHRoZW4KLQotICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYiRsaWJvYmpzJwotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgbGRfc2hsaWJzPXllcwotICBlbHNlCi0gICAgbGRfc2hsaWJzPW5vCi0gIGZpCi0KLSAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSB5ZXM7IHRoZW4KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotICBmaQotZWxzZQotICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKikKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFyY2hpdmVfY21kcz0nJE5NJGxpYm9ianMgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgc2VkICdcJydzLy4qIC8vJ1wnJyA+ICRsaWIuZXhwOyRMRCAtbyAkb2JqZGlyLyRzb25hbWUkbGlib2JqcyAtYkU6JGxpYi5leHAgLVQ1MTIgLUg1MTIgLWJNOlNSRTskQVIgY3J1ICRsaWIgJG9iamRpci8kc29uYW1lJwotICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLSAgICAgICMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQotICAgICAgIyBicm9rZW4gY29sbGVjdDIuCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKLSAgICBmaQotICAgIDs7Ci0KLSAgYWl4NCopCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICBhcmNoaXZlX2NtZHM9JyROTSRsaWJvYmpzIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnXCcncy8uKiAvLydcJycgPiAkbGliLmV4cDskQ0MgLW8gJG9iamRpci8kc29uYW1lJGxpYm9ianMgJHt3bH0tYkU6JGxpYi5leHAgJHt3bH0tYk06U1JFICR7d2x9LWJub2VudHJ5OyRBUiBjcnUgJGxpYiAkb2JqZGlyLyRzb25hbWUnCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgOzsKLQotICBhbWlnYW9zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YTskZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YTskQVIgY3J1ICRsaWIkbGlib2JqczskUkFOTElCICRsaWI7KGNkICRvYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICA7OwotCi0gICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgotICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCi0gICMgZXh0cmEgc3BhY2UpLgotICBmcmVlYnNkMi4yKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliJGxpYm9ianMgL3Vzci9saWIvYysrcnQwLm8nCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgZnJlZWJzZDIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIkbGlib2JqcycKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAjIEZyZWVCU0QgMywgYXQgbGFzdCwgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgotICBmcmVlYnNkMyopCi0gICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliJGxpYm9ianMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIGhwdXg5KikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyLyRzb25hbWU7JExEIC1iICtzICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb2JqZGlyLyRzb25hbWUkbGlib2JqczttdiAkb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgOzsKLQotICBocHV4MTAqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK3MgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIkbGlib2JqcycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgOzsKLQotICBpcml4NSogfCBpcml4NiopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliIC1zb25hbWUgJHNvbmFtZSAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyRsaWJvYmpzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICA7OwotCi0gIG5ldGJzZCopCi0gICAgIyBUZXN0ZWQgd2l0aCBOZXRCU0QgMS4yIGxkCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiRsaWJvYmpzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgb3BlbmJzZCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiRsaWJvYmpzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgb3MyKikKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRlY2hvIERBVEEgPj4gJG9iamRpci8kbGlibmFtZS5kZWY7JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZjskZWNobyBFWFBPUlRTID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmO2VteGV4cCRsaWJvYmpzID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliJGxpYm9ianMgJG9iamRpci8kbGlibmFtZS5kZWYnCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvYmpkaXIvJGxpYm5hbWUuYSAkb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICA7OwotCi0gIG9zZjMqIHwgb3NmNCopCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1vICRsaWIgLXNvbmFtZSAkc29uYW1lIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nJGxpYm9ianMkZGVwbGlicycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgOzsKLQotICBzY28zLjJ2NSopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLW8gJGxpYiRsaWJvYmpzJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICA7OwotCi0gIHNvbGFyaXMyKikKLSAgICBub191bmRlZmluZWRfZmxhZz0nIC16IHRleHQnCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIkbGlib2JqcycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotCi0gICAgIyBTb2xhcmlzIDIgYmVmb3JlIDIuNSBoYXJkY29kZXMgLUwgcGF0aHMuCi0gICAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gICAgc29sYXJpczIuWzAtNF0qKQotICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgc3Vub3M0KikKLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1vICRsaWIkbGlib2JqcycKLSAgICBlbHNlCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliJGxpYm9ianMnCi0gICAgZmkKLQotICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tZXhwb3J0LWR5bmFtaWMnCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgdXRzNCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliJGxpYm9ianMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD1ubwotICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAqKQotICAgIGxkX3NobGlicz1ubwotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICA7OwotICBlc2FjCi1maQotZWNobyAiJGFjX3QkbGRfc2hsaWJzIiAxPiY2Ci0KLWlmIHRlc3QgLXogIiROTSI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tLi4uICRhY19jIiAxPiY2Ci0gIGNhc2UgIiROTSIgaW4KLSAgLyogfCBbQS1aYS16XTpcXCopIDs7ICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICAqKQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gICAgZm9yIGFjX2RpciBpbiAvdXNyL3VjYiAvdXNyL2Njcy9iaW4gJFBBVEggL2JpbjsgZG8KLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICAgTk09IiRhY19kaXIvbm0gLUIiCi0gICAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICAgTk09IiRhY19kaXIvbm0gLXAiCi0JZWxzZQotICAgICAgICAgIE5NPSIkYWNfZGlyL25tIgotCWZpCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgICB0ZXN0IC16ICIkTk0iICYmIE5NPW5tCi0gICAgOzsKLSAgZXNhYwotICBlY2hvICIkYWNfdCROTSIgMT4mNgotZmkKLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dC4uLiAkYWNfYyIgMT4mNgotCi0jIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCi0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLXN5bWNvZGU9J1tCQ0RFR1JTVFVdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLXN5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLXN5bXhmcm09J1wxIFwxJwotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBzeW1jb2RlPSdbQkNEVFVdJwotICA7OwotaXJpeCopCi0gICMgQ2Fubm90IHVzZSB1bmRlZmluZWQgc3ltYm9scyBvbiBJUklYIGJlY2F1c2UgaW5saW5lZCBmdW5jdGlvbnMgbWVzcyB1cyB1cC4KLSAgc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMyKikKLSAgc3ltY29kZT0nW0JEVFVdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBzeW1jb2RlPSdbQUJDREdJU1RVV10nCi1maQotCi0jIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLiogJHN5bWNvZGUgJHN5bXBhdCQvJHN5bXhmcm0vcCciCi0KLSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotcGlwZV93b3Jrcz1ubwotJHJtIGNvbmZ0ZXN0KgotY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLW1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KLUVPRgotCi1lY2hvICIkcHJvZ25hbWU6OTcxOiBjaGVja2luZyBpZiBnbG9iYWxfc3ltYm9sX3BpcGUgd29ya3MiID4mNQotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo5NzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBubGlzdD1jb25mdGVzdC5ubQotICBpZiB7IGVjaG8gIiRwcm9nbmFtZTo5NzU6IGV2YWwgXCIkTk0gY29uZnRlc3QubyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3RcIiIgPiY1OyBldmFsICIkTk0gY29uZnRlc3QubyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3QgMj4mNSI7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgotCi0gICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgotICAgICAgbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCi0gICAgICB3Y291dD1gd2MgIiRubGlzdCIgMj4vZGV2L251bGxgCi0gICAgICBjb3VudD1gJGVjaG8gIlgkd2NvdXQiIHwgJFhzZWQgLWUgJ3MvXlsgCV0qXChbMC05XVswLTldKlwpLiokL1wxLydgCi0gICAgICAodGVzdCAiJGNvdW50IiAtZ2UgMCkgMj4vZGV2L251bGwgfHwgY291bnQ9LTEKLSAgICBlbHNlCi0gICAgICBybSAtZiAiJG5saXN0IlQKLSAgICAgIGNvdW50PS0xCi0gICAgZmkKLQotICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLSAgICAgICAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotICAgICAgICBzZWQgJ3MvXi4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7LycgPCAiJG5saXN0IiA+PiBjb25mdGVzdC5jCi0KLQljYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgX19wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBfX3B0cl90IGNoYXIgKgotI2VuZGlmCi0KLS8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBkbGRfcHJlbG9hZGVkX3N5bWJvbHMsIC0xIGlmIHVuc29ydGVkLiAqLwotaW50IGRsZF9wcmVsb2FkZWRfc3ltYm9sX2NvdW50ID0gJGNvdW50OwotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLXN0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIF9fcHRyX3QgYWRkcmVzczsKLX0KLWRsZF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotICAgICAgICBzZWQgJ3MvXlwoLipcKSBcKC4qXCkkLyAgeyJcMSIsIChfX3B0cl90KSBcJlwyfSwvJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLSAgICAgICAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAoX19wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLSAgICAgICAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLSAgICAgICAgbXYgY29uZnRlc3QubyBjb25mdGVzdG0ubwotCXNhdmVfTElCUz0iJExJQlMiCi0Jc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gICAgICAgIExJQlM9J2NvbmZ0ZXN0bS5vJwotCUNGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0gICAgICAgIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MTAzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gICAgICAgICAgcGlwZV93b3Jrcz15ZXMKLSAgICAgICAgZWxzZQotICAgICAgICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgICAgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0gICAgICAgIGZpCi0gICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCi0gICAgICBlbHNlCi0gICAgICAgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjYW5ub3QgcnVuICRnbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICBmaQotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi0kcm0gY29uZnRlc3QqCi0KLSMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLWVjaG8gIiRhY190JHBpcGVfd29ya3MiIDE+JjYKLXRlc3QgIiRwaXBlX3dvcmtzIiA9IHllcyB8fCBnbG9iYWxfc3ltYm9sX3BpcGU9Ci0KLSMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAkYWNfYyIgMT4mNgotaGFyZGNvZGVfYWN0aW9uPQotaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKLSAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQotICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCi0gIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IG5vICYmIFwKLSAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vICYmIFwKLSAgICAgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiICE9IG5vOyB0aGVuCi0KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKLSAgZWxzZQotICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCi0gICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQotICBmaQotZWxpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYgXAotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0geWVzICYmIFwKLSAgICAgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiICE9IHllczsgdGhlbgotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZy4KLSAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCi1lbHNlCi0gICMgV2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcgZGlyZWN0b3JpZXMuCi0gIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKLWZpCi1lY2hvICIkYWNfdCRoYXJkY29kZV9hY3Rpb24iIDE+JjYKLXRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gdW5zdXBwb3J0ZWQgJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0KLXJlbG9hZF9mbGFnPQotcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAkYWNfYyIgMT4mNgotIyBQT1JUTUUgU29tZSBsaW5rZXIgbWF5IG5lZWQgYSBkaWZmZXJlbnQgcmVsb2FkIGZsYWcuCi1yZWxvYWRfZmxhZz0nLXInCi1lY2hvICIkYWNfdCRyZWxvYWRfZmxhZyIKLXRlc3QgLW4gIiRyZWxvYWRfZmxhZyIgJiYgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciCi0KLSMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXBvc3RpbnN0YWxsX2NtZHM9Ci1wb3N0dW5pbnN0YWxsX2NtZHM9Ci1maW5pc2hfY21kcz0KLWZpbmlzaF9ldmFsPQotc2hsaWJwYXRoX3Zhcj0KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAkYWNfYyIgMT4mNgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgzKiB8IGFpeDQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgIihjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSI7IChjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSB8fCBleGl0IDE7IGRvbmUnCi0gIDs7Ci0KLWZyZWVic2QyKiB8IGZyZWVic2QzKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAkbGlibmFtZS5zbycKLSAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1nbnUqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1ocHV4OSogfCBocHV4MTAqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wuJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbC4kbWFqb3IgJGxpYm5hbWUuc2wnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbC4kbWFqb3InCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi0jIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCi1saW51eC1nbnVvbGRsZCogfCBsaW51eC1nbnVhb3V0KiB8IGxpbnV4LWdudWNvZmYqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eC1nbnUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotCi0gIGlmIHRlc3QgLWYgL2xpYi9sZC5zby4xOyB0aGVuCi0gICAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgZWxzZQotICAgICMgT25seSB0aGUgR05VIGxkLnNvIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMgb24gTWtMaW51eC4KLSAgICBjYXNlICIkaG9zdF9jcHUiIGluCi0gICAgcG93ZXJwYyopIGR5bmFtaWNfbGlua2VyPW5vIDs7Ci0gICAgKikgZHluYW1pY19saW5rZXI9J0xpbnV4IGxkLnNvJyA7OwotICAgIGVzYWMKLSAgZmkKLSAgOzsKLQotbmV0YnNkKiB8IG9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLW9zMiopCi0gIGxpYm5hbWVfc3BlYz0nJG5hbWUnCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXNjbzMuMnY1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1zb2xhcmlzMiopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1zdW5vczQqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXN5c3Y0LjJ1dzIqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi0qKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotZXNhYwotZWNobyAiJGFjX3QkZHluYW1pY19saW5rZXIiCi10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0jIFJlcG9ydCB0aGUgZmluYWwgY29uc2VxdWVuY2VzLgotZWNobyAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRjYW5fYnVpbGRfc2hhcmVkIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgotdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kcztcJFJBTkxJQiBcJGxpYiIKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLWVjaG8gIiRhY190JGVuYWJsZV9zaGFyZWQiIDE+JjYKLQotIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLQotZWNobyAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICRlbmFibGVfc3RhdGljIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gJGFjX2MiIDE+JjYKLXJtIC1mIC5saWJzIDI+L2Rldi9udWxsCi1ta2RpciAubGlicyAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAubGliczsgdGhlbgotICBvYmpkaXI9LmxpYnMKLWVsc2UKLSAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KLSAgb2JqZGlyPV9saWJzCi1maQotcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKLWVjaG8gIiRhY190JG9iamRpciIgMT4mNgotCi0jIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHksIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsLCBiZWNhdXNlIGl0IGlzCi0jIHVzZWQgbGF0ZXIuCi1sdGVjaG89IiRlY2hvIgotCi0jIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzLgotZm9yIHZhciBpbiBsdGVjaG8gb2xkX0NDIG9sZF9DRkxBR1Mgb2xkX0NQUEZMQUdTIG9sZF9MRCBvbGRfTk0gb2xkX1JBTkxJQiBcCi0gIG9sZF9MTl9TIEFSIENDIExEIExOX1MgTk0gcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgd2wgcGljX2ZsYWcgXAotICBsaW5rX3N0YXRpY19mbGFnIG5vX2J1aWx0aW5fZmxhZyBleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAotICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIFJBTkxJQiBcCi0gIG9sZF9hcmNoaXZlX2NtZHMgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyBvbGRfcG9zdGluc3RhbGxfY21kcyBcCi0gIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgYXJjaGl2ZV9jbWRzIHBvc3RpbnN0YWxsX2NtZHMgcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWcgbm9fdW5kZWZpbmVkX2ZsYWcgXAotICBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBnbG9iYWxfc3ltYm9sX3BpcGUgXAotICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I7IGRvCi0KLSAgY2FzZSAiJHZhciIgaW4KLSAgcmVsb2FkX2NtZHMgfCBvbGRfYXJjaGl2ZV9jbWRzIHwgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyB8IFwKLSAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgYXJjaGl2ZV9jbWRzIHwgXAotICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgZmluaXNoX2NtZHMpCi0gICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgIGV2YWwgIiR2YXI9XGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgIgotICAgIDs7Ci0gICopCi0gICAgZXZhbCAiJHZhcj1cYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYCIKLSAgICA7OwotICBlc2FjCi1kb25lCi0KLW9maWxlPWxpYnRvb2wKLXRyYXAgIiRybSAkb2ZpbGU7IGV4aXQgMSIgMSAyIDE1Ci1lY2hvIGNyZWF0aW5nICRvZmlsZQotJHJtICRvZmlsZQotY2F0IDw8RU9GID4gJG9maWxlCi0jISAvYmluL3NoCi0KLSMgbGlidG9vbCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTgotIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdGNvbmZpZyBvciBsdG1haW4uc2guCi0jCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFRoaXMgcHJvZ3JhbSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgQ0M9IiRvbGRfQ0MiIENGTEFHUz0iJG9sZF9DRkxBR1MiIENQUEZMQUdTPSIkb2xkX0NQUEZMQUdTIiBcXAotIyBMRD0iJG9sZF9MRCIgTk09IiRvbGRfTk0iIFJBTkxJQj0iJG9sZF9SQU5MSUIiIExOX1M9IiRvbGRfTE5fUyIgXFwKLSMgICAkMCRsdGNvbmZpZ19hcmdzCi0jCi0jIENvbXBpbGVyIGFuZCBvdGhlciB0ZXN0IG91dHB1dCBwcm9kdWNlZCBieSAkcHJvZ25hbWUsIHVzZWZ1bCBmb3IKLSMgZGVidWdnaW5nICRwcm9nbmFtZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KLVhzZWQ9InNlZCAtZSBzL15YLy8iCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0ICJcJHtDRFBBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSIkbHRlY2hvIgotCi0jIFRoZSB2ZXJzaW9uIG9mICRwcm9nbmFtZSB0aGF0IGdlbmVyYXRlZCB0aGlzIHNjcmlwdC4KLUxUQ09ORklHX1ZFUlNJT049IiRWRVJTSU9OIgotCi0jIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCi1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIGxpYnRvb2wgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgb2xkLXN0eWxlIGxpYnJhcmllcy4KLWJ1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0iJGhvc3RfYWxpYXMiCi1ob3N0PSIkaG9zdCIKLQotIyBUaGUgYXJjaGl2ZXIuCi1BUj0iJEFSIgotCi0jIFRoZSBkZWZhdWx0IEMgY29tcGlsZXIuCi1DQz0iJENDIgotCi0jIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCi1MRD0iJExEIgotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSIkTE5fUyIKLQotIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCi1OTT0iJE5NIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0iJG9iamRpciIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9IiRyZWxvYWRfZmxhZyIKLXJlbG9hZF9jbWRzPSIkcmVsb2FkX2NtZHMiCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSIkd2wiCi0KLSMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgotcGljX2ZsYWc9IiRwaWNfZmxhZyIKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0iJGxpbmtfc3RhdGljX2ZsYWciCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0iJG5vX2J1aWx0aW5fZmxhZyIKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIgotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKLQotIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KLWxpYm5hbWVfc3BlYz0iJGxpYm5hbWVfc3BlYyIKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSIkbGlicmFyeV9uYW1lc19zcGVjIgotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9IiRzb25hbWVfc3BlYyIKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgotUkFOTElCPSIkUkFOTElCIgotb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHMiCi1vbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzIgotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0iJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMiCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9IiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIgotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kcyIKLXBvc3RpbnN0YWxsX2NtZHM9IiRwb3N0aW5zdGFsbF9jbWRzIgotcG9zdHVuaW5zdGFsbF9jbWRzPSIkcG9zdHVuaW5zdGFsbF9jbWRzIgotCi0jIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRhbGxvd191bmRlZmluZWRfZmxhZyIKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKLQotIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCi1maW5pc2hfY21kcz0iJGZpbmlzaF9jbWRzIgotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCi1maW5pc2hfZXZhbD0iJGZpbmlzaF9ldmFsIgotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9IiRnbG9iYWxfc3ltYm9sX3BpcGUiCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KLWhhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0iJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiCi0KLSMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCi1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyCi0KLUVPRgotCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICBjYXQgPDxcRU9GID4+ICRvZmlsZQotIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0jIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLWlmIHRlc3QgIiR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgQ09MTEVDVF9OQU1FUz0KLSAgZXhwb3J0IENPTExFQ1RfTkFNRVMKLWZpCi0KLUVPRgotICA7OwotZXNhYwotCi0jIEFwcGVuZCB0aGUgbHRtYWluLnNoIHNjcmlwdC4KLWNhdCAiJGx0bWFpbiIgPj4gJG9maWxlIHx8IChybSAtZiAkb2ZpbGU7IGV4aXQgMSkKLQotY2htb2QgK3ggJG9maWxlCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6c2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOjIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvbHRtYWluLnNoIGIvbGlianBlZ3R3cnAvbHRtYWluLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTM1MGIzLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2x0bWFpbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NTMgKzAsMCBAQAotIyBsdG1haW4uc2ggLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgTk9URTogQ2hhbmdpbmcgdGhpcyBmaWxlIHdpbGwgbm90IGFmZmVjdCBhbnl0aGluZyB1bnRpbCB5b3UgcmVydW4gbHRjb25maWcuCi0jCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbS4KLXByb2duYW1lPWAkZWNobyAiJDAiIHwgc2VkICdzJV4uKi8lJSdgCi1tb2RlbmFtZT0iJHByb2duYW1lIgotCi0jIENvbnN0YW50cy4KLVBST0dSQU09bHRtYWluLnNoCi1QQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049MS4yCi0KLWRlZmF1bHRfbW9kZT0KLWhlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLW1hZ2ljPSIlJSVNQUdJQyB2YXJpYWJsZSUlJSIKLW1rZGlyPSJta2RpciIKLW12PSJtdiAtZiIKLXJtPSJybSAtZiIKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSBzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFxgXFwiJFxcXFxdXCkvXFxcMS9nJwotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgotIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKLSMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi0KLWlmIHRlc3QgIiRMVENPTkZJR19WRVJTSU9OIiAhPSAiJFZFUlNJT04iOyB0aGVuCi0gIGVjaG8gIiRtb2RlbmFtZTogbHRjb25maWcgdmVyc2lvbiBcYCRMVENPTkZJR19WRVJTSU9OJyBkb2VzIG5vdCBtYXRjaCAkUFJPR1JBTSB2ZXJzaW9uIFxgJFZFUlNJT04nIiAxPiYyCi0gIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCi0gIGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIgMT4mMgotICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICBleGl0IDEKLWZpCi0KLSMgR2xvYmFsIHZhcmlhYmxlcy4KLW1vZGU9JGRlZmF1bHRfbW9kZQotbm9ub3B0PQotcHJldj0KLXByZXZvcHQ9Ci1ydW49Ci1zaG93PSIkZWNobyIKLXNob3dfaGVscD0KLWV4ZWN1dGVfZGxmaWxlcz0KLQotIyBQYXJzZSBvdXIgY29tbWFuZCBsaW5lIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4KLXdoaWxlIHRlc3QgJCMgLWd0IDAKLWRvCi0gIGFyZz0iJDEiCi0gIHNoaWZ0Ci0KLSAgY2FzZSAiJGFyZyIgaW4KLSAgLSo9Kikgb3B0YXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBvcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgY2FzZSAiJHByZXYiIGluCi0gICAgZXhlY3V0ZV9kbGZpbGVzKQotICAgICAgZXZhbCAiJHByZXY9XCJcJCRwcmV2IFwkYXJnXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICIkcHJldj1cJGFyZyIKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgcHJldj0KLSAgICBwcmV2b3B0PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgIyBIYXZlIHdlIHNlZW4gYSBub24tb3B0aW9uYWwgYXJndW1lbnQgeWV0PwotICBjYXNlICIkYXJnIiBpbgotICAtLWhlbHApCi0gICAgc2hvd19oZWxwPXllcwotICAgIDs7Ci0KLSAgLS12ZXJzaW9uKQotICAgIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OIgotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1kcnktcnVuIHwgLW4pCi0gICAgcnVuPToKLSAgICA7OwotCi0gIC0tZmVhdHVyZXMpCi0gICAgZWNobyAiaG9zdDogJGhvc3QiCi0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgIGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKLSAgICBmaQotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGVjaG8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgIGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBmaQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1maW5pc2gpIG1vZGU9ImZpbmlzaCIgOzsKLQotICAtLW1vZGUpIHByZXZvcHQ9Ii0tbW9kZSIgcHJldj1tb2RlIDs7Ci0gIC0tbW9kZT0qKSBtb2RlPSIkb3B0YXJnIiA7OwotCi0gIC0tcXVpZXQgfCAtLXNpbGVudCkKLSAgICBzaG93PToKLSAgICA7OwotCi0gIC1kbG9wZW4pCi0gICAgcHJldm9wdD0iLWRsb3BlbiIKLSAgICBwcmV2PWV4ZWN1dGVfZGxmaWxlcwotICAgIDs7Ci0KLSAgLSopCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRhcmcnIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICAqKQotICAgIG5vbm9wdD0iJGFyZyIKLSAgICBicmVhawotICAgIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCi0gICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1maQotCi1pZiB0ZXN0IC16ICIkc2hvd19oZWxwIjsgdGhlbgotCi0gICMgSW5mZXIgdGhlIG9wZXJhdGlvbiBtb2RlLgotICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KLSAgICBjYXNlICIkbm9ub3B0IiBpbgotICAgICpjYyB8ICorKyB8IGdjYyogfCAqLWdjYyopCi0gICAgICBtb2RlPWxpbmsKLSAgICAgIGZvciBhcmcKLSAgICAgIGRvCi0gICAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAgIC1jKQotICAgICAgICAgICBtb2RlPWNvbXBpbGUKLSAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgZG9uZQotICAgICAgOzsKLSAgICAqZGIgfCAqZGJ4KQotICAgICAgbW9kZT1leGVjdXRlCi0gICAgICA7OwotICAgICppbnN0YWxsKnxjcHxtdikKLSAgICAgIG1vZGU9aW5zdGFsbAotICAgICAgOzsKLSAgICAqcm0pCi0gICAgICBtb2RlPXVuaW5zdGFsbAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KLSAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQotCi0gICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgotICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCi0gICAgICAgIGlmIHRlc3QgLW4gIiRub25vcHQiOyB0aGVuCi0gICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIGZyb20gXGAkbm9ub3B0JyIgMT4mMgotICAgICAgICBlbHNlCi0gICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIHdpdGhvdXQgTU9ERS1BUkdTIiAxPiYyCi0gICAgICAgIGZpCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0KLSAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KLSAgaWYgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgdGVzdCAiJG1vZGUiICE9IGV4ZWN1dGU7IHRoZW4KLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLQotICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCi0gIGdlbmVyaWNfaGVscD0iJGhlbHAiCi0gIGhlbHA9IlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPSRtb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSAgIyBUaGVzZSBtb2RlcyBhcmUgaW4gb3JkZXIgb2YgZXhlY3V0aW9uIGZyZXF1ZW5jeSBzbyB0aGF0IHRoZXkgcnVuIHF1aWNrbHkuCi0gIGNhc2UgIiRtb2RlIiBpbgotICAjIGxpYnRvb2wgY29tcGlsZSBtb2RlCi0gIGNvbXBpbGUpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogY29tcGlsZSIKLSAgICAjIEdldCB0aGUgY29tcGlsYXRpb24gY29tbWFuZCBhbmQgdGhlIHNvdXJjZSBmaWxlLgotICAgIGJhc2VfY29tcGlsZT0KLSAgICBsYXN0YXJnPQotICAgIHNyY2ZpbGU9IiRub25vcHQiCi0gICAgc3VwcHJlc3Nfb3V0cHV0PQotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICAjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLW8pCi0JJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZW5hbWUgd2l0aCBcYC1vJyIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotCWV4aXQgMQotCTs7Ci0KLSAgICAgIC1zdGF0aWMpCi0JYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JYnVpbGRfb2xkX2xpYnM9eWVzCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCi0gICAgICBsYXN0YXJnPSIkc3JjZmlsZSIKLSAgICAgIHNyY2ZpbGU9IiRhcmciCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgcHJldmlvdXMgYXJndW1lbnQuCi0KLSAgICAgICMgQmFja3NsYXNoaWZ5IGFueSBiYWNrc2xhc2hlcywgZG91YmxlIHF1b3RlcywgYW5kIGRvbGxhciBzaWducy4KLSAgICAgICMgVGhlc2UgYXJlIHRoZSBvbmx5IGNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgc3BlY2lhbGx5Ci0gICAgICAjIGludGVycHJldGVkIGluc2lkZSBvZiBkb3VibGUtcXVvdGVkIHNjcmluZ3MuCi0gICAgICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQotICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkgaW4gc2NhbgotICAgICAgIyBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCi0gICAgICBjYXNlICIkbGFzdGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFkZCB0aGUgcHJldmlvdXMgYXJndW1lbnQgdG8gYmFzZV9jb21waWxlLgotICAgICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLQliYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgotICAgICAgZWxzZQotCWJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgotICAgIGxpYm9iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgIyBSZWNvZ25pemUgc2V2ZXJhbCBkaWZmZXJlbnQgZmlsZSBzdWZmaXhlcy4KLSAgICB4Zm9ybT0nW2NDRlNmbXNdJwotICAgIGNhc2UgIiRsaWJvYmoiIGluCi0gICAgKi5hZGEpIHhmb3JtPWFkYSA7OwotICAgICouYWRiKSB4Zm9ybT1hZGIgOzsKLSAgICAqLmFkcykgeGZvcm09YWRzIDs7Ci0gICAgKi5hc20pIHhmb3JtPWFzbSA7OwotICAgICouYysrKSB4Zm9ybT1jKysgOzsKLSAgICAqLmNjKSB4Zm9ybT1jYyA7OwotICAgICouY3BwKSB4Zm9ybT1jcHAgOzsKLSAgICAqLmN4eCkgeGZvcm09Y3h4IDs7Ci0gICAgKi5mOTApIHhmb3JtPWY5MCA7OwotICAgICouZm9yKSB4Zm9ybT1mb3IgOzsKLSAgICBlc2FjCi0KLSAgICBsaWJvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAicy9cLiR4Zm9ybSQvLmxvLyJgCi0KLSAgICBjYXNlICIkbGlib2JqIiBpbgotICAgICoubG8pIG9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzL1wubG8kLy5vLydgIDs7Ci0gICAgKikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgbmFtZSBvZiBsaWJyYXJ5IG9iamVjdCBmcm9tIFxgJHNyY2ZpbGUnIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagotICAgICAgdHJhcCAiJHJ1biAkcm0gJG9iaiAkbGlib2JqOyBleGl0IDEiIDEgMiAxNQotICAgIGVsc2UKLSAgICAgICRydW4gJHJtICRsaWJvYmoKLSAgICAgIHRyYXAgIiRydW4gJHJtICRsaWJvYmo7IGV4aXQgMSIgMSAyIDE1Ci0gICAgZmkKLQotICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgotICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCi0KLSAgICAgICMgQWxsIHBsYXRmb3JtcyB1c2UgLURQSUMsIHRvIG5vdGlmeSBwcmVwcm9jZXNzZWQgYXNzZW1ibGVyIGNvZGUuCi0gICAgICAkc2hvdyAiJGJhc2VfY29tcGlsZSRwaWNfZmxhZyAtRFBJQyAkc3JjZmlsZSIKLSAgICAgIGlmICRydW4gZXZhbCAiJGJhc2VfY29tcGlsZVwkcGljX2ZsYWcgLURQSUMgXCRzcmNmaWxlIjsgdGhlbiA6Ci0gICAgICBlbHNlCi0gICAgICAgIHRlc3QgLW4gIiRvYmoiICYmICRydW4gJHJtICRvYmoKLSAgICAgICAgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gY29weSB0aGUgb2JqZWN0IGludG8gcGxhY2UgYW5kIGZpbmlzaC4KLSAgICAgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyI7IHRoZW4KLSAgICAgICAgJHNob3cgIiRMTl9TICRvYmogJGxpYm9iaiIKLSAgICAgICAgJHJ1biAkTE5fUyAkb2JqICRsaWJvYmoKLSAgICAgICAgZXhpdCAkPwotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCwgdGhlbiBnbyBvbiB0byBjb21waWxlIHRoZSBuZXh0IG9uZQotICAgICAgJHNob3cgIiRtdiAkb2JqICRsaWJvYmoiCi0gICAgICAkcnVuICRtdiAkb2JqICRsaWJvYmogfHwgZXhpdCAxCi0KLSAgICAgICMgQWxsb3cgZXJyb3IgbWVzc2FnZXMgb25seSBmcm9tIHRoZSBmaXJzdCBjb21waWxhdGlvbi4KLSAgICAgIHN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKLSAgICBmaQotCi0gICAgIyBPbmx5IGJ1aWxkIGEgcG9zaXRpb24tZGVwZW5kZW50IG9iamVjdCBpZiB3ZSBidWlsZCBvbGQgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgotICAgICAgJHNob3cgIiRiYXNlX2NvbXBpbGUgJHNyY2ZpbGUkc3VwcHJlc3Nfb3V0cHV0IgotICAgICAgaWYgJHJ1biBldmFsICIkYmFzZV9jb21waWxlIFwkc3JjZmlsZSRzdXBwcmVzc19vdXRwdXQiOyB0aGVuIDoKLSAgICAgIGVsc2UKLSAgICAgICAgJHJ1biAkcm0gJG9iaiAkbGlib2JqCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG8gbm90Ci0gICAgIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLSAgICAgICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCi0gICAgICAkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gXCRsaWJvYmoiIHx8IGV4aXQgJD8KLSAgICBmaQotCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgbGluayBtb2RlCi0gIGxpbmspCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogbGluayIKLSAgICBDQz0iJG5vbm9wdCIKLSAgICBhbGxvd191bmRlZmluZWQ9eWVzCi0gICAgY29tcGlsZV9jb21tYW5kPSIkQ0MiCi0gICAgZmluYWxpemVfY29tbWFuZD0iJENDIgotCi0gICAgY29tcGlsZV9zaGxpYnBhdGg9Ci0gICAgZmluYWxpemVfc2hsaWJwYXRoPQotICAgIGRlcGxpYnM9Ci0gICAgZGxmaWxlcz0KLSAgICBkbHByZWZpbGVzPQotICAgIGV4cG9ydF9keW5hbWljPW5vCi0gICAgaGFyZGNvZGVfbGliZGlycz0KLSAgICBsaWJvYmpzPQotICAgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9Ci0gICAgbHRsaWJzPQotICAgIG9ianM9Ci0gICAgcHJldj0KLSAgICBwcmV2YXJnPQotICAgIHJlbGVhc2U9Ci0gICAgcnBhdGg9Ci0gICAgcGVybV9ycGF0aD0KLSAgICB0ZW1wX3JwYXRoPQotICAgIHZpbmZvPQotCi0gICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYykKLSAgICAgICAgaWYgdGVzdCAiWCRhcmciID0gIlgtYWxsLXN0YXRpYyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCi0gICAgICAgIGZpCi0gICAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotICAgICAgICBicmVhawotICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgU2VlIGlmIG91ciBzaGFyZWQgYXJjaGl2ZXMgZGVwZW5kIG9uIHN0YXRpYyBhcmNoaXZlcy4KLSAgICB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgYnVpbGRfb2xkX2xpYnM9eWVzCi0KLSAgICAjIEdvIHRocm91Z2ggdGhlIGFyZ3VtZW50cywgdHJhbnNmb3JtaW5nIHRoZW0gb24gdGhlIHdheS4KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICAgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAgIGNhc2UgIiRwcmV2IiBpbgotICAgICAgICBvdXRwdXQpCi0gICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBPVVRQVVRAIgotICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBPVVRQVVRAIgotICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBjYXNlICIkcHJldiIgaW4KLSAgICAgICAgZGxmaWxlc3xkbHByZWZpbGVzKQotICAgICAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAgICAgKi5sYSB8ICoubG8pIDs7ICAjIFdlIGhhbmRsZSB0aGVzZSBjYXNlcyBiZWxvdy4KLSAgICAgICAgICAqKQotICAgICAgICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKLSAgICAgICAgICAgIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXMgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLSAgICAgICAgICAgIHByZXY9Ci0gICAgICAgICAgICA7OwotICAgICAgICAgIGVzYWMKLSAgICAgICAgICA7OwotCXJlbGVhc2UpCi0JICByZWxlYXNlPSItJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLSAgICAgICAgcnBhdGgpCi0gICAgICAgICAgcnBhdGg9IiRycGF0aCAkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotICAgICAgICAqKQotICAgICAgICAgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKLSAgICAgICAgICBwcmV2PQotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgZmkKLQotICAgICAgcHJldmFyZz0iJGFyZyIKLQotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1hbGwtc3RhdGljKQotCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotICAgICAgICBmaQotICAgICAgICBjb250aW51ZQotCTs7Ci0KLSAgICAgIC1hbGxvdy11bmRlZmluZWQpCi0JIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgotCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZGxvcGVuKQotICAgICAgICBwcmV2PWRsZmlsZXMKLSAgICAgICAgY29udGludWUKLSAgICAgICAgOzsKLQotICAgICAgLWRscHJlb3BlbikKLSAgICAgICAgcHJldj1kbHByZWZpbGVzCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICAgIDs7Ci0KLSAgICAgIC1leHBvcnQtZHluYW1pYykKLSAgICAgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiAhPSB5ZXM7IHRoZW4KLSAgICAgICAgICBleHBvcnRfZHluYW1pYz15ZXMKLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiOyB0aGVuCi0JICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0JICBlbHNlCi0JICAgIGFyZz0KLQkgIGZpCi0KLSAgICAgICAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBTWU1GSUxFQCIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBTWU1GSUxFQCIKLSAgICAgICAgZmkKLSAgICAgICAgOzsKLQotICAgICAgLUwqKQotICAgICAgICBkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyVeLUxcKC4qXCkkJVwxJSdgCi0gICAgICAgIGNhc2UgIiRkaXIiIGluCi0gICAgICAgIC8qIHwgW0EtWmEtel06XFwqKQotCSAgIyBBZGQgdGhlIGNvcnJlc3BvbmRpbmcgaGFyZGNvZGVfbGliZGlyX2ZsYWcsIGlmIGl0IGlzIG5vdCBpZGVudGljYWwuCi0gICAgICAgICAgOzsKLSAgICAgICAgKikKLSAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYC1MJGRpcicgY2Fubm90IHNwZWNpZnkgYSByZWxhdGl2ZSBkaXJlY3RvcnkiIDE+JjIKLSAgICAgICAgICBleGl0IDEKLSAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0gICAgICAgIDs7Ci0KLSAgICAgIC1sKikgZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIgOzsKLQotICAgICAgLW5vLXVuZGVmaW5lZCkKLQlhbGxvd191bmRlZmluZWQ9bm8KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1vKSBwcmV2PW91dHB1dCA7OwotCi0gICAgICAtcmVsZWFzZSkKLQlwcmV2PXJlbGVhc2UKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1ycGF0aCkKLSAgICAgICAgcHJldj1ycGF0aAotICAgICAgICBjb250aW51ZQotICAgICAgICA7OwotCi0gICAgICAtc3RhdGljKQotCSMgSWYgd2UgaGF2ZSBubyBwaWNfZmxhZywgdGhlbiB0aGlzIGlzIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljLgotCWlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0gICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0gICAgICAgIGZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtdmVyc2lvbi1pbmZvKQotICAgICAgICBwcmV2PXZpbmZvCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICAgIDs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgotICAgICAgLSogfCArKikKLQkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKLQkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQljYXNlICIkYXJnIiBpbgotCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotICAgICAgICA7OwotCi0gICAgICAqLm8gfCAqLmEpCi0gICAgICAgICMgQSBzdGFuZGFyZCBvYmplY3QuCi0gICAgICAgIG9ianM9IiRvYmpzICRhcmciCi0gICAgICAgIDs7Ci0KLSAgICAgICoubG8pCi0gICAgICAgICMgQSBsaWJyYXJ5IG9iamVjdC4KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgotCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgIGVsc2UKLQkgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkgICAgcHJldj1kbHByZWZpbGVzCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0JICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9cLmxvJC9cLm8vJ2AKLQkgIHByZXY9Ci0JZmkKLQlsaWJvYmpzPSIkbGlib2JqcyAkYXJnIgotICAgICAgICA7OwotCi0gICAgICAqLmxhKQotICAgICAgICAjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCi0KLSAgICAgICAgZGxuYW1lPQotICAgICAgICBsaWJkaXI9Ci0gICAgICAgIGxpYnJhcnlfbmFtZXM9Ci0gICAgICAgIG9sZF9saWJyYXJ5PQotCi0gICAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0gICAgICAgIGlmIChzZWQgLWUgJzJxJyAkYXJnIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgICAgICAgZWxzZQotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0gICAgICAgICAgZXhpdCAxCi0gICAgICAgIGZpCi0KLSAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0gICAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAgICovKiB8ICpcXCopIC4gJGFyZyA7OwotICAgICAgICAqKSAuIC4vJGFyZyA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLSAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGNvbnRhaW5zIG5vIC1ycGF0aCBpbmZvcm1hdGlvbiIgMT4mMgotICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotCi0gICAgICAgICMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KLSAgICAgICAgbGlua2xpYj0KLSAgICAgICAgZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbwotICAgICAgICAgIGxpbmtsaWI9IiRsIgotICAgICAgICBkb25lCi0KLSAgICAgICAgaWYgdGVzdCAteiAiJGxpbmtsaWIiOyB0aGVuCi0gICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGFyZyciIDE+JjIKLSAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKLQotICAgICAgICAjIEZpbmQgdGhlIHJlbGV2YW50IG9iamVjdCBkaXJlY3RvcnkgYW5kIGxpYnJhcnkgbmFtZS4KLSAgICAgICAgbmFtZT1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKLSAgICAgICAgZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgICAgaWYgdGVzdCAiWCRkaXIiID0gIlgkYXJnIjsgdGhlbgotICAgICAgICAgIGRpcj0iJG9iamRpciIKLSAgICAgICAgZWxzZQotICAgICAgICAgIGRpcj0iJGRpci8kb2JqZGlyIgotICAgICAgICBmaQotCi0gICAgICAgICMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgotICAgICAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0gICAgICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLSAgICAgICAgICBpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgotICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIHdlIG5lZWQgdG8gcHJlbG9hZC4KLSAgICAgICAgICAgIHByZXY9ZGxwcmVmaWxlcwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICMgV2Ugc2hvdWxkIG5vdCBjcmVhdGUgYSBkZXBlbmRlbmN5IG9uIHRoaXMgbGlicmFyeSwgYnV0IHdlCi0JICAgICMgbWF5IG5lZWQgYW55IGxpYnJhcmllcyBpdCByZXF1aXJlcy4KLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotICAgICAgICAgICAgcHJldj0KLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgZmkKLSAgICAgICAgZmkKLQotICAgICAgICAjIFRoZSBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgotICAgICAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0gICAgICAgICAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCi0gICAgICAgICAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotICAgICAgICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRpci8kbGlua2xpYiIKLSAgICAgICAgICBmaQotICAgICAgICAgIHByZXY9Ci0gICAgICAgIGZpCi0KLSAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCi0gICAgICAgICAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0iJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMgJGFyZyIKLSAgICAgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLSAgICAgICAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoICIgaW4KLSAgICAgICAgICAgICoiICRkaXIgIiopIDs7Ci0gICAgICAgICAgICAqKSB0ZW1wX3JwYXRoPSIkdGVtcF9ycGF0aCAkZGlyIiA7OwotICAgICAgICAgICAgZXNhYwotICAgICAgICAgIGZpCi0KLQkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLSAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLSAgICAgICAgICAgICAgICAjIFB1dCB0aGUgbWFnaWMgbGliZGlyIHdpdGggdGhlIGhhcmRjb2RlIGZsYWcuCi0gICAgICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLSAgICAgICAgICAgICAgICBsaWJkaXI9IkBIQVJEQ09ERV9MSUJESVJTQCIKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkJY2FzZSAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiBpbgotCQkqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCSAgOzsKLQkJKikKLQkJICBoYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJICA7OwotCQllc2FjCi0gICAgICAgICAgICAgICAgbGliZGlyPQotICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGxpYmRpciI7IHRoZW4KLSAgICAgICAgICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0gICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZmxhZyIKLSAgICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZsYWciCi0gICAgICAgICAgICBmaQotICAgICAgICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotICAgICAgICAgICAgIyBEbyB0aGUgc2FtZSBmb3IgdGhlIHBlcm1hbmVudCBydW4gcGF0aC4KLSAgICAgICAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KLSAgICAgICAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0gICAgICAgICAgICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OwotICAgICAgICAgICAgZXNhYwotICAgICAgICAgIGZpCi0KLQotICAgICAgICAgIGNhc2UgIiRoYXJkY29kZV9hY3Rpb24iIGluCi0gICAgICAgICAgaW1tZWRpYXRlKQotICAgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSBubzsgdGhlbgotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLSAgICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KLSAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGRpciAtbCRuYW1lIgotICAgICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSBubzsgdGhlbgotICAgICAgICAgICAgICBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGRpcjoiCi0gICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgotICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIDs7Ci0KLSAgICAgICAgICByZWxpbmspCi0gICAgICAgICAgICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLSAgICAgICAgICAgIGNhc2UgIiRkaXIiIGluCi0gICAgICAgICAgICAvKiB8IFtBLVphLXpdOlxcKikgOzsKLSAgICAgICAgICAgICopCi0gICAgICAgICAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLSAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KLSAgICAgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciIDE+JjIKLSAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgZGlyPSIkYWJzZGlyIgotICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLSAgICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCi0gICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIgLWwkbmFtZSIKLSAgICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0gICAgICAgICAgICAgIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiIKLSAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgOzsKLQotICAgICAgICAgICopCi0gICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRoYXJkY29kZV9hY3Rpb24nIGlzIGFuIHVua25vd24gaGFyZGNvZGUgYWN0aW9uIiAxPiYyCi0gICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgIDs7Ci0gICAgICAgICAgZXNhYwotCi0gICAgICAgICAgIyBGaW5hbGl6ZSBjb21tYW5kIGZvciBib3RoIGlzIHNpbXBsZToganVzdCBoYXJkY29kZSBpdC4KLSAgICAgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgotICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpYmRpci8kbGlua2xpYiIKLSAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLUwkbGliZGlyIC1sJG5hbWUiCi0gICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICAgIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IgotICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLWwkbmFtZSIKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgotICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLUwkbGliZGlyIC1sJG5hbWUiCi0gICAgICAgICAgZmkKLSAgICAgICAgZWxzZQotICAgICAgICAgICMgVHJhbnNmb3JtIGRpcmVjdGx5IHRvIG9sZCBhcmNoaXZlcyBpZiB3ZSBkb24ndCBidWlsZCBuZXcgbGlicmFyaWVzLgotICAgICAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgJiYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgc3RhdGljIGxpYnJhcnkgZm9yIFxgJGFyZyciIDE+JjIKLSAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgIGZpCi0KLQkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAotCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgZWxzZQotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIC1sJG5hbWUiCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGRpciAtbCRuYW1lIgotCSAgZmkKLSAgICAgICAgZmkKLQotCSMgQWRkIGluIGFueSBsaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCi0JY29udGludWUKLSAgICAgICAgOzsKLQotICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGFyZ3VtZW50LgotICAgICAgKikKLQkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKLQkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQljYXNlICIkYXJnIiBpbgotCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotICAgICAgICA7OwotICAgICAgZXNhYwotCi0gICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggXGAtdmVyc2lvbi1pbmZvJyBhbmQgXGAtcmVsZWFzZSciIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIG9sZGxpYj0KLSAgICBvbGRvYmpzPQotICAgIGNhc2UgIiRvdXRwdXQiIGluCi0gICAgIiIpCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLQotICAgICovKiB8ICpcXCopCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiBvdXRwdXQgZmlsZSBcYCRvdXRwdXQnIG11c3QgaGF2ZSBubyBkaXJlY3RvcnkgY29tcG9uZW50cyIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotCi0gICAgKi5hKQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIGJ1aWxkX29sZF9saWJzPXllcwotICAgICAgb2xkbGliPSIkb3V0cHV0IgotICAgICAgJHNob3cgIiRybSAkb2xkbGliIgotICAgICAgJHJ1biAkcm0gJG9sZGxpYgotICAgICAgOzsKLQotICAgICoubGEpCi0gICAgICAjIE1ha2Ugc3VyZSB3ZSBvbmx5IGdlbmVyYXRlIGxpYnJhcmllcyBvZiB0aGUgZm9ybSBgbGliTkFNRS5sYScuCi0gICAgICBjYXNlICIkb3V0cHV0IiBpbgotICAgICAgbGliKikgOzsKLSAgICAgICopCi0JJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJGFyZycgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotCWV4aXQgMQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIG5hbWU9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAotICAgICAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0KLSAgICAgICMgQWxsIHRoZSBsaWJyYXJ5LXNwZWNpZmljIHZhcmlhYmxlcyAoaW5zdGFsbF9saWJkaXIgaXMgc2V0IGFib3ZlKS4KLSAgICAgIGxpYnJhcnlfbmFtZXM9Ci0gICAgICBvbGRfbGlicmFyeT0KLSAgICAgIGRsbmFtZT0KLSAgICAgIGN1cnJlbnQ9MAotICAgICAgcmV2aXNpb249MAotICAgICAgYWdlPTAKLQotICAgICAgaWYgdGVzdCAtbiAiJG9ianMiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHM6JG9ianMiIDI+JjEKLSAgICAgICAgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIEhvdyB0aGUgaGVjayBhcmUgd2Ugc3VwcG9zZWQgdG8gd3JpdGUgYSB3cmFwcGVyIGZvciBhIHNoYXJlZCBsaWJyYXJ5PwotICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG1heSBub3QgZGVwZW5kIG9uIHVuaW5zdGFsbGVkIGxpYnJhcmllczokbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyIgMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBsaWJ0b29sIGxpYnJhcmllcyIgMT4mMgotICAgICAgICAjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgotICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC16ICIkcnBhdGgiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB3aXRoIFxgLXJwYXRoJyIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIHNldCBkdW1teSAkcnBhdGgKLSAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIgMT4mMgotICAgICAgZmkKLSAgICAgIGluc3RhbGxfbGliZGlyPSIkMiIKLQotICAgICAgIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KLSAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzonCi0gICAgICBzZXQgZHVtbXkgJHZpbmZvCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgICAgaWYgdGVzdCAtbiAiJDUiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIgMT4mMgotICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICB0ZXN0IC1uICIkMiIgJiYgY3VycmVudD0iJDIiCi0gICAgICB0ZXN0IC1uICIkMyIgJiYgcmV2aXNpb249IiQzIgotICAgICAgdGVzdCAtbiAiJDQiICYmIGFnZT0iJDQiCi0KLSAgICAgICMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCi0gICAgICBjYXNlICIkY3VycmVudCIgaW4KLSAgICAgIDAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OwotICAgICAgKikKLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogQ1VSUkVOVCBcYCRjdXJyZW50JyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLQotICAgICAgY2FzZSAiJHJldmlzaW9uIiBpbgotICAgICAgMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7Ci0gICAgICAqKQotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGNhc2UgIiRhZ2UiIGluCi0gICAgICAwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKLSAgICAgICopCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotICAgICAgZXNhYwotCi0gICAgICBpZiB0ZXN0ICRhZ2UgLWd0ICRjdXJyZW50OyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIiAxPiYyCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgICMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KLSAgICAgIHZlcnNpb25fdmFycz0idmVyc2lvbl90eXBlIGN1cnJlbnQgYWdlIHJldmlzaW9uIgotICAgICAgY2FzZSAiJHZlcnNpb25fdHlwZSIgaW4KLSAgICAgIG5vbmUpIDs7Ci0KLSAgICAgIGxpbnV4KQotICAgICAgICB2ZXJzaW9uX3ZhcnM9IiR2ZXJzaW9uX3ZhcnMgbWFqb3IgdmVyc3VmZml4IgotICAgICAgICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0gICAgICAgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotICAgICAgICA7OwotCi0gICAgICBvc2YpCi0gICAgICAgIHZlcnNpb25fdmFycz0iJHZlcnNpb25fdmFycyB2ZXJzdWZmaXggdmVyc3RyaW5nIgotICAgICAgICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0gICAgICAgIHZlcnN1ZmZpeD0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0gICAgICAgIHZlcnN0cmluZz0iJHZlcnN1ZmZpeCIKLQotICAgICAgICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotICAgICAgICBsb29wPSRhZ2UKLSAgICAgICAgd2hpbGUgdGVzdCAkbG9vcCAhPSAwOyBkbwotICAgICAgICAgIGlmYWNlPWBleHByICRjdXJyZW50IC0gJGxvb3BgCi0gICAgICAgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0gICAgICAgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7aWZhY2V9LjAiCi0gICAgICAgIGRvbmUKLQotICAgICAgICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCi0gICAgICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2N1cnJlbnR9LjAiCi0gICAgICAgIDs7Ci0KLSAgICAgIHN1bm9zKQotICAgICAgICB2ZXJzaW9uX3ZhcnM9IiR2ZXJzaW9uX3ZhcnMgbWFqb3IgdmVyc3VmZml4IgotICAgICAgICBtYWpvcj0iJGN1cnJlbnQiCi0gICAgICAgIHZlcnN1ZmZpeD0iJGN1cnJlbnQuJHJldmlzaW9uIgotICAgICAgICA7OwotCi0gICAgICAqKQotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIGxpYnJhcnkgdmVyc2lvbiB0eXBlIFxgJHZlcnNpb25fdHlwZSciIDE+JjIKLSAgICAgICAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBvciByZW1vdmUgb3VyIG91dHB1dHMgaWYgd2UgbmVlZCB0by4KLSAgICAgIGlmIHRlc3QgLWQgJG9iamRpcjsgdGhlbgotICAgICAgICAkc2hvdyAiJHJtICRvYmpkaXIvJG91dHB1dCAkb2JqZGlyLyRsaWJuYW1lLiogJG9iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qIgotICAgICAgICAkcnVuICRybSAkb2JqZGlyLyRvdXRwdXQgJG9iamRpci8kbGlibmFtZS4qICRvYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKgotICAgICAgZWxzZQotICAgICAgICAkc2hvdyAiJG1rZGlyICRvYmpkaXIiCi0gICAgICAgICRydW4gJG1rZGlyICRvYmpkaXIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLWVxIDAgfHwgdGVzdCAtZCAkb2JqZGlyOyB0aGVuIDoKLQllbHNlCi0JICBleGl0ICRzdGF0dXMKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgotICAgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCi0gICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdW5kZWZpbmVkIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gJGhvc3Qgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotICAgICAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgYnVpbGRfb2xkX2xpYnM9eWVzCi0gICAgICAgIGZpCi0gICAgICBlbHNlCi0gICAgICAgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCi0gICAgICBmaQotCi0gICAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIHN5c3RlbXMuCi0gICAgICBkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWJzIgotICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWxjIgotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgICAjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KLSAgICAgICAgZXZhbCBsaWJyYXJ5X25hbWVzPVwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiCi0gICAgICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotICAgICAgICByZWFsbmFtZT0iJDIiCi0gICAgICAgIHNoaWZ0OyBzaGlmdAotCi0gICAgICAgIGlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KLSAgICAgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKLSAgICAgICAgZmkKLQotICAgICAgICBsaWI9IiRvYmpkaXIvJHJlYWxuYW1lIgotCWZvciBsaW5rCi0JZG8KLQkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKLQlkb25lCi0KLSAgICAgICAgIyBVc2Ugc3RhbmRhcmQgb2JqZWN0cyBpZiB0aGV5IGFyZSBQSUMuCi0gICAgICAgIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyAiIHwgJFhzZWQgLWUgJ3MvXC5sbyAvLm8gL2cnIC1lICdzLyAkLy9nJ2AKLQotICAgICAgICAjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0gICAgICAgIGV2YWwgY21kcz1cIiRhcmNoaXZlX2NtZHNcIgotICAgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JwotICAgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotICAgICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAgICRzaG93ICIkY21kIgotICAgICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgICBkb25lCi0gICAgICAgIElGUz0iJHNhdmVfaWZzIgotCi0gICAgICAgICMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCi0gICAgICAgIGZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbwotICAgICAgICAgICRzaG93ICIoY2QgJG9iamRpciAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLSAgICAgICAgICAkcnVuIGV2YWwgJyhjZCAkb2JqZGlyICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpJyB8fCBleGl0ICQ/Ci0gICAgICAgIGRvbmUKLQotICAgICAgICAjIElmIC1leHBvcnQtZHluYW1pYyB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGRsbmFtZS4KLSAgICAgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgotICAgICAgICAgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgotICAgICAgICAgIGRsbmFtZT0iJHNvbmFtZSIKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgb2xkbGliPSIkb2JqZGlyLyRsaWJuYW1lLmEiCi0gICAgICA7OwotCi0gICAgKi5sbyB8ICoubykKLSAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGxpbmsgbGlidG9vbCBsaWJyYXJpZXMgaW50byByZWxvYWRhYmxlIG9iamVjdHMiIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGVwbGlicyI7IHRoZW4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCi0gICAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0gICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAgICoubG8pCi0gICAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgotICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotICAgICAgICBsaWJvYmo9IiRvdXRwdXQiCi0gICAgICAgIG9iaj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzL1wubG8kLy5vLydgCi0gICAgICAgIDs7Ci0gICAgICAqKQotICAgICAgICBsaWJvYmo9Ci0gICAgICAgIG9iaj0iJG91dHB1dCIKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgotICAgICAgJHJ1biAkcm0gJG9iaiAkbGlib2JqCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotICAgICAgcmVsb2FkX29ianM9IiRvYmpzImAkZWNobyAiWCRsaWJvYmpzICIgfCAkWHNlZCAtZSAncy9bXiAgICAgICBdKlwuYSAvL2cnIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vZydgCi0KLSAgICAgIG91dHB1dD0iJG9iaiIKLSAgICAgIGV2YWwgY21kcz1cIiRyZWxvYWRfY21kc1wiCi0gICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLSAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgICAgICRzaG93ICIkY21kIgotICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotCi0gICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KLSAgICAgIHRlc3QgLXogIiRsaWJvYmoiICYmIGV4aXQgMAotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLSAgICAgICAgIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKLSAgICAgICAgIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KLSAgICAgICAgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKLSAgICAgICAgJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KLSAgICAgICAgZXhpdCAwCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciOyB0aGVuCi0gICAgICAgICMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCi0gICAgICAgIHJlbG9hZF9vYmpzPSIkbGlib2JqcyIKLSAgICAgICAgb3V0cHV0PSIkbGlib2JqIgotICAgICAgICBldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgotICAgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JwotICAgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotICAgICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAgICRzaG93ICIkY21kIgotICAgICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgICBkb25lCi0gICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgZWxzZQotICAgICAgICAjIEp1c3QgY3JlYXRlIGEgc3ltbGluay4KLSAgICAgICAgJHNob3cgIiRMTl9TICRvYmogJGxpYm9iaiIKLSAgICAgICAgJHJ1biAkTE5fUyAkb2JqICRsaWJvYmogfHwgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBleGl0IDAKLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgd2hpbGUgbGlua2luZyBwcm9ncmFtcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgotCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KLQlmb3IgbGliZGlyIGluICRycGF0aDsgZG8KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLSAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLSAgICAgICAgICAgICAgICAjIFB1dCB0aGUgbWFnaWMgbGliZGlyIHdpdGggdGhlIGhhcmRjb2RlIGZsYWcuCi0gICAgICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLSAgICAgICAgICAgICAgICBsaWJkaXI9IkBIQVJEQ09ERV9MSUJESVJTQCIKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkJY2FzZSAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiBpbgotCQkqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCSAgOzsKLQkJKikKLQkJICBoYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJICA7OwotCQllc2FjCi0gICAgICAgICAgICAgICAgbGliZGlyPQotICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGxpYmRpciI7IHRoZW4KLSAgICAgICAgICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0gICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZmxhZyIKLSAgICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZsYWciCi0gICAgICAgICAgICBmaQotICAgICAgICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotICAgICAgICAgICAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgotICAgICAgICAgICAgKiIgJGxpYmRpciAiKikgOzsKLSAgICAgICAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0gICAgICAgICAgICBlc2FjCi0gICAgICAgICAgZmkKLQlkb25lCi0gICAgICBmaQotCi0gICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIGNvbXBpbGUgY29tbWFuZHMuCi0gICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVASEFSRENPREVfTElCRElSU0AlJGhhcmRjb2RlX2xpYmRpcnMlZyJgCi0JZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVASEFSRENPREVfTElCRElSU0AlJGhhcmRjb2RlX2xpYmRpcnMlZyJgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkbGlib2JqcyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgICAjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kICIgfCAkWHNlZCAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvLydgCi0gICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQgIiB8ICRYc2VkIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vJ2AKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXMgJiYgdGVzdCAtbiAiJE5NIiAmJiB0ZXN0IC1uICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgICAgICBkbHN5bXM9IiR7b3V0cHV0fVMuYyIKLSAgICAgIGVsc2UKLSAgICAgICAgZGxzeW1zPQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KLSAgICAgICAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHByZWxvYWRlZCBsaXN0LgotICAgICAgICBkbHByZWZpbGVzPWAkZWNobyAiWCRvYmpzJGRscHJlZmlsZXMgIiB8ICRYc2VkIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vJ2AKLQotCSMgRGlzY292ZXIgdGhlIG5saXN0IG9mIGVhY2ggb2YgdGhlIGRsZmlsZXMuCi0gICAgICAgIG5saXN0PSIkb2JqZGlyLyR7b3V0cHV0fS5ubSIKLQotCWlmIHRlc3QgLWQgJG9iamRpcjsgdGhlbgotCSAgJHNob3cgIiRybSAkbmxpc3QgJHtubGlzdH1UIgotCSAgJHJ1biAkcm0gIiRubGlzdCIgIiR7bmxpc3R9VCIKLQllbHNlCi0JICAkc2hvdyAiJG1rZGlyICRvYmpkaXIiCi0JICAkcnVuICRta2RpciAkb2JqZGlyCi0JICBzdGF0dXM9JD8KLQkgIGlmIHRlc3QgJHN0YXR1cyAtZXEgMCB8fCB0ZXN0IC1kICRvYmpkaXI7IHRoZW4gOgotCSAgZWxzZQotCSAgICBleGl0ICRzdGF0dXMKLQkgIGZpCi0JZmkKLQotICAgICAgICBmb3IgYXJnIGluICRkbHByZWZpbGVzOyBkbwotCSAgJHNob3cgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGFyZyciCi0JICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLSAgICAgICAgZG9uZQotCi0gICAgICAgICMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCi0gICAgICAgICRzaG93ICJjcmVhdGluZyAkb2JqZGlyLyRkbHN5bXMiCi0gICAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICAjIE1ha2Ugc3VyZSB3ZSBhdCBsZWFzdCBoYXZlIGFuIGVtcHR5IGZpbGUuCi0JICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgotCi0JICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotCSAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KLQkgICAgbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCi0JICAgIHdjb3V0PWB3YyAiJG5saXN0IiAyPi9kZXYvbnVsbGAKLQkgICAgY291bnQ9YGVjaG8gIlgkd2NvdXQiIHwgJFhzZWQgLWUgJ3MvXlsgCV0qXChbMC05XVswLTldKlwpLiokL1wxLydgCi0JICAgICh0ZXN0ICIkY291bnQiIC1nZSAwKSAyPi9kZXYvbnVsbCB8fCBjb3VudD0tMQotCSAgZWxzZQotCSAgICAkcm0gIiRubGlzdCJUCi0JICAgIGNvdW50PS0xCi0JICBmaQotCi0JICBjYXNlICIkZGxzeW1zIiBpbgotCSAgIiIpIDs7Ci0JICAqLmMpCi0JICAgICRlY2hvID4gIiRvYmpkaXIvJGRsc3ltcyIgIlwKLS8qICRkbHN5bXMgLSBzeW1ib2wgcmVzb2x1dGlvbiB0YWJsZSBmb3IgXGAkb3V0cHV0JyBkbHN5bSBlbXVsYXRpb24uICovCi0vKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gXCJDXCIgewotI2VuZGlmCi0KLS8qIFByZXZlbnQgdGhlIG9ubHkga2luZCBvZiBkZWNsYXJhdGlvbiBjb25mbGljdHMgd2UgY2FuIG1ha2UuICovCi0jZGVmaW5lIGRsZF9wcmVsb2FkZWRfc3ltYm9sX2NvdW50IHNvbWVfb3RoZXJfc3ltYm9sCi0jZGVmaW5lIGRsZF9wcmVsb2FkZWRfc3ltYm9scyBzb21lX290aGVyX3N5bWJvbAotCi0vKiBFeHRlcm5hbCBzeW1ib2wgZGVjbGFyYXRpb25zIGZvciB0aGUgY29tcGlsZXIuICovXAotIgotCi0JICAgIGlmIHRlc3QgLWYgIiRubGlzdCI7IHRoZW4KLQkgICAgICBzZWQgLWUgJ3MvXi4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7LycgPCAiJG5saXN0IiA+PiAiJG9iamRpci8kZGxzeW1zIgotCSAgICBlbHNlCi0JICAgICAgZWNobyAnLyogTk9ORSAqLycgPj4gIiRvYmpkaXIvJGRsc3ltcyIKLQkgICAgZmkKLQotCSAgICAkZWNobyA+PiAiJG9iamRpci8kZGxzeW1zIiAiXAotCi0jdW5kZWYgZGxkX3ByZWxvYWRlZF9zeW1ib2xfY291bnQKLSN1bmRlZiBkbGRfcHJlbG9hZGVkX3N5bWJvbHMKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgX19wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBfX3B0cl90IGNoYXIgKgotI2VuZGlmCi0KLS8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBkbGRfcHJlbG9hZGVkX3N5bWJvbHMsIC0xIGlmIHVuc29ydGVkLiAqLwotaW50IGRsZF9wcmVsb2FkZWRfc3ltYm9sX2NvdW50ID0gJGNvdW50OwotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLXN0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIF9fcHRyX3QgYWRkcmVzczsKLX0KLWRsZF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXtcCi0iCi0KLQkgICAgaWYgdGVzdCAtZiAiJG5saXN0IjsgdGhlbgotCSAgICAgIHNlZCAncy9eXCguKlwpIFwoLipcKSQvICB7IlwxIiwgKF9fcHRyX3QpIFwmXDJ9LC8nIDwgIiRubGlzdCIgPj4gIiRvYmpkaXIvJGRsc3ltcyIKLQkgICAgZmkKLQotCSAgICAkZWNobyA+PiAiJG9iamRpci8kZGxzeW1zIiAiXAotICB7MCwgKF9fcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZlwKLSIKLQkgICAgOzsKLQotCSAgKikKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBzdWZmaXggZm9yIFxgJGRsc3ltcyciIDE+JjIKLQkgICAgZXhpdCAxCi0JICAgIDs7Ci0JICBlc2FjCi0gICAgICAgIGZpCi0KLSAgICAgICAgIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KLSAgICAgICAgJHNob3cgIihjZCAkb2JqZGlyICYmICRDQyAtYyRub19idWlsdGluX2ZsYWcgXCIkZGxzeW1zXCIpIgotICAgICAgICAkcnVuIGV2YWwgJyhjZCAkb2JqZGlyICYmICRDQyAtYyRub19idWlsdGluX2ZsYWcgIiRkbHN5bXMiKScgfHwgZXhpdCAkPwotCi0gICAgICAgICMgVHJhbnNmb3JtIHRoZSBzeW1ib2wgZmlsZSBpbnRvIHRoZSBjb3JyZWN0IG5hbWUuCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb2JqZGlyLyR7b3V0cHV0fVMubyUiYAotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb2JqZGlyLyR7b3V0cHV0fVMubyUiYAotICAgICAgZWxpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiICE9IHllczsgdGhlbgotICAgICAgICB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGFuZCBcYC1kbHByZW9wZW4nIGFyZSBpZ25vcmVkIHdpdGhvdXQgXGAtZXhwb3J0LWR5bmFtaWMnIiAxPiYyCi0gICAgICBlbHNlCi0gICAgICAgICMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCi0gICAgICAgICMgZGxkX3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCi0gICAgICAgICMgcmVhbGx5IHdhcyByZXF1aXJlZC4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCi0KLSAgICAgICAgIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KLSAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAteiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotICAgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotCi0gICAgICAgICMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgotICAgICAgICAkc2hvdyAiJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgICAgJHJ1biBldmFsICIkY29tcGlsZV9jb21tYW5kIgotICAgICAgICBleGl0ICQ/Ci0gICAgICBmaQotCi0gICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0gICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvYmpkaXIvJG91dHB1dCInJWcnYAotICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvYmpkaXIvJG91dHB1dCInVCVnJ2AKLQotICAgICAgIyBDcmVhdGUgdGhlIGJpbmFyeSBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeSwgdGhlbiB3cmFwIGl0LgotICAgICAgaWYgdGVzdCAtZCAkb2JqZGlyOyB0aGVuIDoKLSAgICAgIGVsc2UKLSAgICAgICAgJHNob3cgIiRta2RpciAkb2JqZGlyIgotCSRydW4gJG1rZGlyICRvYmpkaXIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLWVxIDAgfHwgdGVzdCAtZCAkb2JqZGlyOyB0aGVuIDoKLQllbHNlCi0JICBleGl0ICRzdGF0dXMKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgc2hsaWJwYXRoX3ZhcgotICAgICAgICBycGF0aD0KLSAgICAgICAgZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KLSAgICAgICAgICBjYXNlICIkZGlyIiBpbgotICAgICAgICAgIC8qIHwgW0EtWmEtel06XFwqKQotICAgICAgICAgICAgIyBBYnNvbHV0ZSBwYXRoLgotICAgICAgICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotICAgICAgICAgICAgOzsKLSAgICAgICAgICAqKQotICAgICAgICAgICAgIyBSZWxhdGl2ZSBwYXRoOiBhZGQgYSB0aGlzZGlyIGVudHJ5LgotICAgICAgICAgICAgcnBhdGg9IiRycGF0aFwkdGhpc2Rpci8kZGlyOiIKLSAgICAgICAgICAgIDs7Ci0gICAgICAgICAgZXNhYwotICAgICAgICBkb25lCi0gICAgICAgIHRlbXBfcnBhdGg9IiRycGF0aCIKLSAgICAgIGZpCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGUuCi0gICAgICAkcnVuICRybSAkb3V0cHV0Ci0KLSAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCI7IHRoZW4KLSAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCi0gICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCi0gICAgICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0gICAgICAgIHJwYXRoPQotICAgICAgICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbwotICAgICAgICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLSAgICAgICAgZG9uZQotICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiRoYXJkY29kZV9hY3Rpb24iIGluCi0gICAgICByZWxpbmspCi0gICAgICAgICMgQUdIISBGbGFtZSB0aGUgQUlYIGFuZCBIUC1VWCBwZW9wbGUgZm9yIG1lLCB3aWxsIHlhPwotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1c2luZyBhIGJ1Z2d5IHN5c3RlbSBsaW5rZXIiIDE+JjIKLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogcmVsaW5raW5nIHdpbGwgYmUgcmVxdWlyZWQgYmVmb3JlIFxgJG91dHB1dCcgY2FuIGJlIGluc3RhbGxlZCIgMT4mMgotICAgICAgICA7OwotICAgICAgZXNhYwotCi0gICAgICAkc2hvdyAiJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgICRydW4gZXZhbCAiJGNvbXBpbGVfY29tbWFuZCIgfHwgZXhpdCAkPwotCi0gICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgICMgUXVvdGUgdGhlIGZpbmFsaXplIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgotICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0KLSAgICAgICMgUXVvdGUgJGVjaG8gZm9yIHNoaXBwaW5nLgotICAgICAgcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCi0gICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG91ciBydW4gY29tbWFuZCBpcyBub24tbnVsbC4KLSAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0gICAgICAgICRybSAkb3V0cHV0Ci0gICAgICAgIHRyYXAgIiRybSAkb3V0cHV0OyBleGl0IDEiIDEgMiAxNQotCi0gICAgICAgICRlY2hvID4gJG91dHB1dCAiXAotIyEgL2Jpbi9zaAotCi0jICRvdXRwdXQgLSB0ZW1wb3Jhcnkgd3JhcHBlciBzY3JpcHQgZm9yICRvYmpkaXIvJG91dHB1dAotIyBHZW5lcmF0ZWQgYnkgbHRtYWluLnNoIC0gR05VICRQQUNLQUdFICRWRVJTSU9OCi0jCi0jIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAotIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCi0jCi0jIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiBcYGBwd2RgJy4KLSMgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIHMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgXCJcJHtDRFBBVEgrc2V0fVwiID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCi0KLSMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KLWlmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgotICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKLSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0nJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMnCi0gIGZpbmFsaXplX2NvbW1hbmQ9XCIkZmluYWxpemVfY29tbWFuZFwiCi1lbHNlCi0gICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRlY2hvIGFyZSBhbHJlYWR5IHNldC4KLSAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuIDoKLSAgZWxzZQotICAgIGVjaG89XCIkcWVjaG9cIgotICAgIGZpbGU9XCJcJDBcIgotICBmaVwKLSIKLSAgICAgICAgJGVjaG8gPj4gJG91dHB1dCAiXAotCi0gICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCi0gIHRoaXNkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCi0gIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KLQotICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KLSAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCi0gIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KLSAgICBkZXN0ZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKLQotICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KLSAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCi0gICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KLSAgICAgIC8qIHwgW0EtWmEtel06XFwqKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKLSAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotCi0gICAgZmlsZT1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKLSAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCi0gIGRvbmUKLQotICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgotICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCi0gIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCi0KLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLSAgcHJvZ3JhbT0nJG91dHB1dCcKLQotICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgotCi0gICAgICAgICMgRXhwb3J0IG91ciBzaGxpYnBhdGhfdmFyIGlmIHdlIGhhdmUgb25lLgotICAgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCi0gICAgICAgICAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCi0gICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgotCi0gICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCi0gICAgJHNobGlicGF0aF92YXI9XGBcJGVjaG8gXCJYXCQkc2hsaWJwYXRoX3ZhclwiIHwgXCRYc2VkIC1lICdzLzoqXCQvLydcYAotCi0gICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCi0iCi0gICAgICAgIGZpCi0KLSAgICAgICAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCi0KLSAgICAgICMgRXhwb3J0IHRoZSBwYXRoIHRvIHRoZSBwcm9ncmFtLgotICAgICAgUEFUSD1cIlwkcHJvZ2RpcjpcJFBBVEhcIgotICAgICAgZXhwb3J0IFBBVEgKLQotICAgICAgZXhlYyBcJHByb2dyYW0gXCR7MStcIlwkQFwifQotCi0gICAgICBcJGVjaG8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9XCIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCi0gICAgXCRlY2hvIFwiXCQwOiBlcnJvcjogXCRwcm9nZGlyL1wkcHJvZ3JhbSBkb2VzIG5vdCBleGlzdFwiIDE+JjIKLSAgICBcJGVjaG8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKLSAgICBlY2hvIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpXAotIgotICAgICAgICBjaG1vZCAreCAkb3V0cHV0Ci0gICAgICBmaQotICAgICAgZXhpdCAwCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gb2xkLWZhc2hpb25lZCBhcmNoaXZlLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSAieWVzIjsgdGhlbgotICAgICAgIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgotICAgICAgb2xkb2Jqcz0iJG9ianMiYCRlY2hvICJYJGxpYm9ianMgIiB8ICRYc2VkIC1lICdzL1teICAgXSpcLmEgLy9nJyAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvL2cnYAotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXCIKLSAgICAgIGVsc2UKLQlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCi0gICAgICBmaQotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0gICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBmaQotCi0gICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCi0gICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAqLmxhKQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS5hIgotCi0gICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKLQotICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotICAgICAgICAkZWNobyA+ICRvdXRwdXQgIlwKLSMgJG91dHB1dCAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKLSMgR2VuZXJhdGVkIGJ5IGx0bWFpbi5zaCAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTgotCi0jIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KLWRsbmFtZT0nJGRsbmFtZScKLQotIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCi1saWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKLQotIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCi1vbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JwotCi0jIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KLWRlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKLQotIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciAkbGlibmFtZS4KLWN1cnJlbnQ9JGN1cnJlbnQKLWFnZT0kYWdlCi1yZXZpc2lvbj0kcmV2aXNpb24KLQotIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgotbGliZGlyPSckaW5zdGFsbF9saWJkaXInXAotIgotICAgICAgZmkKLQotICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgotICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KLSAgICAgICRzaG93ICIoY2QgJG9iamRpciAmJiAkTE5fUyAuLi8kb3V0cHV0ICRvdXRwdXQpIgotICAgICAgJHJ1biBldmFsICIoY2QgJG9iamRpciAmJiAkTE5fUyAuLi8kb3V0cHV0ICRvdXRwdXQpIiB8fCBleGl0IDEKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGluc3RhbGwgbW9kZQotICBpbnN0YWxsKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGluc3RhbGwiCi0KLSAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCAvYmluL3NoIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KLSAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiOyB0aGVuCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgICBhcmc9YCRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkYXJnICIKLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotICAgIGVsc2UKLSAgICAgIGluc3RhbGxfcHJvZz0KLSAgICAgIGFyZz0iJG5vbm9wdCIKLSAgICBmaQotCi0gICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgotICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgY2FzZSAiJGFyZyIgaW4KLSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLSAgICAgIGFyZz0iXCIkYXJnXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2ckYXJnIgotCi0gICAgIyBXZSBuZWVkIHRvIGFjY2VwdCBhdCBsZWFzdCBhbGwgdGhlIEJTRCBpbnN0YWxsIGZsYWdzLgotICAgIGRlc3Q9Ci0gICAgZmlsZXM9Ci0gICAgb3B0cz0KLSAgICBwcmV2PQotICAgIGluc3RhbGxfdHlwZT0KLSAgICBpc2Rpcj0KLSAgICBzdHJpcG1lPQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCi0gICAgICAgIGZpbGVzPSIkZmlsZXMgJGRlc3QiCi0gICAgICAgIGRlc3Q9IiRhcmciCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICBmaQotCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLWQpIGlzZGlyPXllcyA7OwotICAgICAgLWYpIHByZXY9Ii1mIiA7OwotICAgICAgLWcpIHByZXY9Ii1nIiA7OwotICAgICAgLW0pIHByZXY9Ii1tIiA7OwotICAgICAgLW8pIHByZXY9Ii1vIiA7OwotICAgICAgLXMpCi0gICAgICAgIHN0cmlwbWU9IiAtcyIKLSAgICAgICAgY29udGludWUKLSAgICAgICAgOzsKLSAgICAgIC0qKSA7OwotCi0gICAgICAqKQotICAgICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZGVkIGFuIGFyZ3VtZW50LCB0aGVuIHNraXAgaXQuCi0gICAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgICAgICAgIHByZXY9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBkZXN0PSIkYXJnIgotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCi0gICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRhcmciCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJGluc3RhbGxfcHJvZyI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgotICAgICAgZWxzZQotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgZGVzdGluYXRpb24iIDE+JjIKLSAgICAgIGZpCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIFN0cmlwIGFueSB0cmFpbGluZyBzbGFzaCBmcm9tIHRoZSBkZXN0aW5hdGlvbi4KLSAgICBkZXN0PWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS8kJSUnYAotCi0gICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnkuCi0gICAgdGVzdCAtZCAiJGRlc3QiICYmIGlzZGlyPXllcwotICAgIGlmIHRlc3QgLW4gIiRpc2RpciI7IHRoZW4KLSAgICAgIGRlc3RkaXI9IiRkZXN0IgotICAgICAgZGVzdG5hbWU9Ci0gICAgZWxzZQotICAgICAgZGVzdGRpcj1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGRlc3QiICYmIGRlc3RkaXI9LgotICAgICAgZGVzdG5hbWU9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgotICAgICAgc2V0IGR1bW15ICRmaWxlcwotICAgICAgaWYgdGVzdCAkIyAtZ3QgMjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiIDE+JjIKLSAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLSAgICBmaQotICAgIGNhc2UgIiRkZXN0ZGlyIiBpbgotICAgIC8qIHwgW0EtWmEtel06XFwqKSA7OwotICAgICopCi0gICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0gICAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgICAqLmxvKSA7OwotICAgICAgICAqKQotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiIDE+JjIKLSAgICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgICAgICBleGl0IDEKLSAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgc3RhdGljbGlicz0KLSAgICBmdXR1cmVfbGliZGlycz0KLSAgICBjdXJyZW50X2xpYmRpcnM9Ci0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCi0gICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAqLmEpCi0gICAgICAgICMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCi0gICAgICAgIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgotICAgICAgICA7OwotCi0gICAgICAqLmxhKQotICAgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotICAgICAgICBpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAnXiMgR2VuZXJhdGVkIGJ5IGx0bWFpblwuc2gnKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICAgICAgICBlbHNlCi0gICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0gICAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICAgICAgZXhpdCAxCi0gICAgICAgIGZpCi0KLSAgICAgICAgbGlicmFyeV9uYW1lcz0KLSAgICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotICAgICAgICBjYXNlICIkZmlsZSIgaW4KLSAgICAgICAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotICAgICAgICAqKSAuIC4vJGZpbGUgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgICMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KLSAgICAgICAgaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KLSAgICAgICAgICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KLSAgICAgICAgICAqIiAkbGliZGlyICIqKSA7OwotICAgICAgICAgICopIGN1cnJlbnRfbGliZGlycz0iJGN1cnJlbnRfbGliZGlycyAkbGliZGlyIiA7OwotICAgICAgICAgIGVzYWMKLSAgICAgICAgZWxzZQotICAgICAgICAgICMgTm90ZSB0aGUgbGliZGlyIGFzIGEgZnV0dXJlIGxpYmRpci4KLSAgICAgICAgICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgotICAgICAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0gICAgICAgICAgKikgZnV0dXJlX2xpYmRpcnM9IiRmdXR1cmVfbGliZGlycyAkbGliZGlyIiA7OwotICAgICAgICAgIGVzYWMKLSAgICAgICAgZmkKLQotICAgICAgICBkaXI9ImAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgLyIKLSAgICAgICAgdGVzdCAiWCRkaXIiID0gIlgkZmlsZS8iICYmIGRpcj0KLSAgICAgICAgZGlyPSIkZGlyJG9iamRpciIKLQotICAgICAgICAjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgotICAgICAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLSAgICAgICAgaWYgdGVzdCAtbiAiJDIiOyB0aGVuCi0gICAgICAgICAgcmVhbG5hbWU9IiQyIgotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgc2hpZnQKLQotICAgICAgICAgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KLSAgICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRyZWFsbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiCi0gICAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHJlYWxuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPwotICAgICAgICAgIHRlc3QgIlgkZGxuYW1lIiA9ICJYJHJlYWxuYW1lIiAmJiBkbG5hbWU9Ci0KLSAgICAgICAgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgICAgICAgICAjIERlbGV0ZSB0aGUgb2xkIHN5bWxpbmtzLgotICAgICAgICAgICAgcm1jbWQ9IiRybSIKLSAgICAgICAgICAgIGZvciBsaW5rbmFtZQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgcm1jbWQ9IiRybWNtZCAkZGVzdGRpci8kbGlua25hbWUiCi0gICAgICAgICAgICBkb25lCi0gICAgICAgICAgICAkc2hvdyAiJHJtY21kIgotICAgICAgICAgICAgJHJ1biAkcm1jbWQKLQotICAgICAgICAgICAgIyAuLi4gYW5kIGNyZWF0ZSBuZXcgb25lcy4KLSAgICAgICAgICAgIGZvciBsaW5rbmFtZQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgdGVzdCAiWCRkbG5hbWUiID0gIlgkbGlua25hbWUiICYmIGRsbmFtZT0KLSAgICAgICAgICAgICAgJHNob3cgIihjZCAkZGVzdGRpciAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLSAgICAgICAgICAgICAgJHJ1biBldmFsICIoY2QgJGRlc3RkaXIgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0gICAgICAgICAgICBkb25lCi0gICAgICAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCi0gICAgICAgICAgICAjIEluc3RhbGwgdGhlIGR5bmFtaWNhbGx5LWxvYWRhYmxlIGxpYnJhcnkuCi0gICAgICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgJGRlc3RkaXIvJGRsbmFtZSIKLSAgICAgICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgJGRlc3RkaXIvJGRsbmFtZSIgfHwgZXhpdCAkPwotICAgICAgICAgIGZpCi0KLSAgICAgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0gICAgICAgICAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCi0gICAgICAgICAgZXZhbCBjbWRzPVwiJHBvc3RpbnN0YWxsX2NtZHNcIgotICAgICAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCi0gICAgICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLSAgICAgICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAgICAgJHNob3cgIiRjbWQiCi0gICAgICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgICAgICBkb25lCi0gICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgICAgIGZpCi0KLSAgICAgICAgIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCi0gICAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RkaXIvJG5hbWUiCi0gICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGRpci8kbmFtZSIgfHwgZXhpdCAkPwotCi0gICAgICAgICMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KLSAgICAgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKLSAgICAgICAgOzsKLQotICAgICAgKi5sbykKLSAgICAgICAgIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCi0KLSAgICAgICAgIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgotICAgICAgICBpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0gICAgICAgICAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLSAgICAgICAgZWxzZQotICAgICAgICAgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICAgICAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKLSAgICAgICAgZmkKLQotICAgICAgICAjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgotICAgICAgICBjYXNlICIkZGVzdGZpbGUiIGluCi0gICAgICAgICoubG8pCi0gICAgICAgICAgc3RhdGljZGVzdD1gJGVjaG8gIlgkZGVzdGZpbGUiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvXC5vLydgCi0gICAgICAgICAgOzsKLSAgICAgICAgKi5vKQotICAgICAgICAgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKLSAgICAgICAgICBkZXN0ZmlsZT0KLSAgICAgICAgICA7OwotICAgICAgICAqKQotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBjb3B5IGEgbGlidG9vbCBvYmplY3QgdG8gXGAkZGVzdGZpbGUnIiAxPiYyCi0gICAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgICMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgotICAgICAgICBpZiB0ZXN0IC1uICIkZGVzdGZpbGUiOyB0aGVuCi0gICAgICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIgotICAgICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiIHx8IGV4aXQgJD8KLSAgICAgICAgZmkKLQotICAgICAgICAjIEluc3RhbGwgdGhlIG9sZCBvYmplY3QgaWYgZW5hYmxlZC4KLSAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgICAgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0gICAgICAgICAgc3RhdGljb2JqPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzL1wubG8kL1wuby8nYAotCi0gICAgICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJHN0YXRpY29iaiAkc3RhdGljZGVzdCIKLSAgICAgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRzdGF0aWNvYmogXCRzdGF0aWNkZXN0IiB8fCBleGl0ICQ/Ci0gICAgICAgIGZpCi0gICAgICAgIGV4aXQgMAotICAgICAgICA7OwotCi0gICAgICAqKQotICAgICAgICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0gICAgICAgIGlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICAgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9Ci0gICAgICAgICAgZmluYWxpemVfY29tbWFuZD0KLQotICAgICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotICAgICAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgICAgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKLSAgICAgICAgICAqKSAuIC4vJGZpbGUgOzsKLSAgICAgICAgICBlc2FjCi0KLSAgICAgICAgICAjIENoZWNrIHRoZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHNldC4KLSAgICAgICAgICBpZiB0ZXN0IC16ICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyIgfHwgdGVzdCAteiAiJGZpbmFsaXplX2NvbW1hbmQiOyB0aGVuCi0gICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgXGAkZmlsZSciIDE+JjIKLSAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgIGZpCi0KLSAgICAgICAgICBmaW5hbGl6ZT15ZXMKLSAgICAgICAgICBmb3IgbGliIGluICRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzOyBkbwotICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgotICAgICAgICAgICAgbGliZGlyPQotICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KLSAgICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0gICAgICAgICAgICAgIGNhc2UgIiRsaWIiIGluCi0gICAgICAgICAgICAgICovKiB8ICpcXCopIC4gJGxpYiA7OwotICAgICAgICAgICAgICAqKSAuIC4vJGxpYiA7OwotICAgICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgbGliZmlsZT0iJGxpYmRpci9gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCIKLSAgICAgICAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0gICAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGxpYicgY29udGFpbnMgbm8gLXJwYXRoIGluZm9ybWF0aW9uIiAxPiYyCi0gICAgICAgICAgICBlbGlmIHRlc3QgLWYgIiRsaWJmaWxlIjsgdGhlbiA6Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIiAxPiYyCi0gICAgICAgICAgICAgIGZpbmFsaXplPW5vCi0gICAgICAgICAgICBmaQotICAgICAgICAgIGRvbmUKLQotICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCi0gICAgICAgICAgICBpZiB0ZXN0ICIkZmluYWxpemUiID0geWVzOyB0aGVuCi0gICAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbGlua2luZyBcYCRmaWxlJyBvbiBiZWhhbGYgb2YgeW91ciBidWdneSBzeXN0ZW0gbGlua2VyIiAxPiYyCi0gICAgICAgICAgICAgICRzaG93ICIkZmluYWxpemVfY29tbWFuZCIKLSAgICAgICAgICAgICAgaWYgJHJ1biBldmFsICIkZmluYWxpemVfY29tbWFuZCI7IHRoZW4gOgotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgZmlsZT0iJG9iamRpci8kZmlsZSJUCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCByZWxpbmsgXGAkZmlsZScgb24gYmVoYWxmIG9mIHlvdXIgYnVnZ3kgc3lzdGVtIGxpbmtlciIgMT4mMgotICAgICAgICAgICAgZmkKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAjIEluc3RhbGwgdGhlIGJpbmFyeSB0aGF0IHdlIGNvbXBpbGVkIGVhcmxpZXIuCi0JICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgInMlXChbXi9dKlwpJCUkb2JqZGlyL1wxJSJgCi0gICAgICAgICAgZmkKLSAgICAgICAgZmkKLQotICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyRzdHJpcG1lICRmaWxlICRkZXN0IgotICAgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2dcJHN0cmlwbWUgXCRmaWxlIFwkZGVzdCIgfHwgZXhpdCAkPwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIGZvciBmaWxlIGluICRzdGF0aWNsaWJzOyBkbwotICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCi0gICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgotCi0gICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkb2xkbGliIgotICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgfHwgZXhpdCAkPwotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0gICAgICBldmFsIGNtZHM9XCIkb2xkX3Bvc3RpbnN0YWxsX2NtZHNcIgotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0gICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIiAxPiYyCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCi0gICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgotICAgICAgdGVzdCAtbiAiJHJ1biIgJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgotICAgICAgZXhlYyAkU0hFTEwgJDAgLS1maW5pc2gkY3VycmVudF9saWJkaXJzCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZmluaXNoIG1vZGUKLSAgZmluaXNoKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGZpbmlzaCIKLSAgICBsaWJkaXJzPSIkbm9ub3B0IgotCi0gICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KLSAgICAgIGZvciBkaXIKLSAgICAgIGRvCi0gICAgICAgIGxpYmRpcnM9IiRsaWJkaXJzICRkaXIiCi0gICAgICBkb25lCi0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgotCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KLQkgIGV2YWwgY21kcz1cIiRmaW5pc2hfY21kc1wiCi0gICAgICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotICAgICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgICAgICRydW4gZXZhbCAiJGNtZCIKLSAgICAgICAgICBkb25lCi0gICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JZmkKLQlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCi0JICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCi0JICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgotCSAgJHJ1biBldmFsICIkY21kcyIKLQlmaQotICAgICAgZG9uZQotICAgIGZpCi0KLSAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgotICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0gICAgICBlY2hvICIgICAkbGliZGlyIgotICAgIGRvbmUKLSAgICBlY2hvCi0gICAgZWNobyAiVG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMgaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwiCi0gICAgZWNobyAieW91IG11c3QgdXNlIHRoZSBcYC1MTElCRElSJyBmbGFnIGR1cmluZyBsaW5raW5nLiIKLSAgICBlY2hvCi0gICAgZWNobyAiIFlvdSB3aWxsIGFsc28gbmVlZCB0byBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotICAgICAgZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICBlY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0gICAgICBsaWJkaXI9TElCRElSCi0gICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0KLSAgICAgIGVjaG8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKLSAgICBmaQotICAgIGVjaG8KLSAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKLSAgICBlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKLSAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZXhlY3V0ZSBtb2RlCi0gIGV4ZWN1dGUpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZXhlY3V0ZSIKLQotICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCi0gICAgY21kPSIkbm9ub3B0IgotICAgIGlmIHRlc3QgLXogIiRjbWQiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCi0gICAgZm9yIGZpbGUgaW4gJGV4ZWN1dGVfZGxmaWxlczsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRmaWxlIjsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgZmlsZSIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgZGlyPQotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAqLmxhKQotICAgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotICAgICAgICBpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAnXiMgR2VuZXJhdGVkIGJ5IGx0bWFpblwuc2gnKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICAgICAgICBlbHNlCi0gICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLSAgICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKLQotCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgotCWRsbmFtZT0KLQlsaWJyYXJ5X25hbWVzPQotCi0gICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgIiRmaWxlIiBpbgotCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKLSAgICAgICAgKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCi0JaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KLQkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KLQkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKLQkgIGNvbnRpbnVlCi0JZmkKLQotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0KLQlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KLQkgIGRpcj0iJGRpci8kb2JqZGlyIgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLQk7OwotCi0gICAgICAqKQotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmcgXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiIDE+JjIKLSAgICAgICAgY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCi0gICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0gICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCi0KLSAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCi0gICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKLSAgICAgIGVsc2UKLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCi0gICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgotCi0gICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgotICAgIGFyZ3M9Ci0gICAgZm9yIGZpbGUKLSAgICBkbwotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAtKikgOzsKLSAgICAgICopCi0gICAgICAgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLSAgICAgICAgaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgIiRmaWxlIiBpbgotCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSAgKikgLiAuLyRmaWxlIDs7Ci0JICBlc2FjCi0KLQkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCi0JICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKLQlmaQotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KLSAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgYXJncz0iJGFyZ3MgXCIkZmlsZVwiIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0gICAgICAjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KLSAgICAgIGV2YWwgImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLQotICAgICAgIyBOb3cgYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KLSAgICAgIGV2YWwgImV4ZWMgXCRjbWQkYXJncyIKLQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGV4ZWMgXCRjbWQkYXJncyIKLSAgICAgIGV4aXQgMQotICAgIGVsc2UKLSAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCi0gICAgICBldmFsICJcJGVjaG8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgotICAgICAgJGVjaG8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLSAgICAgICRlY2hvICIkY21kJGFyZ3MiCi0gICAgICBleGl0IDAKLSAgICBmaQotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIHVuaW5zdGFsbCBtb2RlCi0gIHVuaW5zdGFsbCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiB1bmluc3RhbGwiCi0gICAgcm09IiRub25vcHQiCi0gICAgZmlsZXM9Ci0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtKikgcm09IiRybSAkYXJnIiA7OwotICAgICAgKikgZmlsZXM9IiRmaWxlcyAkYXJnIiA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRybSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotICAgICAgZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICB0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICBybWZpbGVzPSIkZmlsZSIKLQotICAgICAgY2FzZSAiJG5hbWUiIGluCi0gICAgICAqLmxhKQotICAgICAgICAjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCi0gICAgICAgIGlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICAgIC4gJGRpci8kbmFtZQotCi0gICAgICAgICAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KLSAgICAgICAgICBmb3IgbiBpbiAkbGlicmFyeV9uYW1lczsgZG8KLSAgICAgICAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG4iCi0gICAgICAgICAgICB0ZXN0ICJYJG4iID0gIlgkZGxuYW1lIiAmJiBkbG5hbWU9Ci0gICAgICAgICAgZG9uZQotICAgICAgICAgIHRlc3QgLW4gIiRkbG5hbWUiICYmIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJGRsbmFtZSIKLSAgICAgICAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgotCi0JICAkc2hvdyAiJHJtICRybWZpbGVzIgotCSAgJHJ1biAkcm0gJHJtZmlsZXMKLQotCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCi0JICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICBldmFsIGNtZHM9XCIkcG9zdHVuaW5zdGFsbF9jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiCi0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgIGV2YWwgY21kcz1cIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiCi0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICBmaQotCi0gICAgICAgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0KLSAgICAgICoubG8pCi0gICAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICBvbGRvYmo9YCRlY2hvICJYJG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvXC5vLydgCi0gICAgICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kb2xkb2JqIgotICAgICAgICBmaQotCSRzaG93ICIkcm0gJHJtZmlsZXMiCi0JJHJ1biAkcm0gJHJtZmlsZXMKLSAgICAgICAgOzsKLQotICAgICAgKikKLSAgICAgIAkkc2hvdyAiJHJtICRybWZpbGVzIgotCSRydW4gJHJtICRybWZpbGVzCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAiIikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERSIgMT4mMgotICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gICAgOzsKLSAgZXNhYwotCi0gICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKLSAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKLSAgZXhpdCAxCi1maSAjIHRlc3QgLXogIiRzaG93X2hlbHAiCi0KLSMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgotY2FzZSAiJG1vZGUiIGluCi0iIikgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gW01PREUtQVJHXS4uLgotCi1Qcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLQotLW4sIC0tZHJ5LXJ1biAgICAgICAgIGRpc3BsYXkgY29tbWFuZHMgd2l0aG91dCBtb2RpZnlpbmcgYW55IGZpbGVzCi0gICAgLS1mZWF0dXJlcyAgICAgICAgZGlzcGxheSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gICAgLS1maW5pc2ggICAgICAgICAgc2FtZSBhcyBcYC0tbW9kZT1maW5pc2gnCi0gICAgLS1oZWxwICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAgIC0tbW9kZT1NT0RFICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFIFtkZWZhdWx0PWluZmVycmVkIGZyb20gTU9ERS1BUkdTXQotICAgIC0tcXVpZXQgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKLSAgICAtLXNpbGVudCAgICAgICAgICBkb24ndCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCi0gICAgLS12ZXJzaW9uICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgotCi1NT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgIGNvbXBpbGUgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0Ci0gICAgICBleGVjdXRlICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KLSAgICAgIGZpbmlzaCAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgICBpbnN0YWxsICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKLSAgICAgIGxpbmsgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKLSAgICAgIHVuaW5zdGFsbCAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQotCi1NT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IKLWEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLiIKLSAgZXhpdCAwCi0gIDs7Ci0KLWNvbXBpbGUpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCi0KLUNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KLQotQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKLWZyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCi0KLVRoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQotU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCi1saWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCi0gIDs7Ci0KLWV4ZWN1dGUpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCi0KLUF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAotCi1UaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCi1mbGFncy4KLQotSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAotaW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5Ci1kaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KLQotVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCi0gIDs7Ci0KLWZpbmlzaCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgotCi1Db21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgotCi1FYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgotCi1UaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKLXRoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgotICA7OwotCi1pbnN0YWxsKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KLQotSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCi0KLUlOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQotZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCi0KLVRoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5Ci1CU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKLSAgOzsKLQotbGluaykKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCi0KLUxpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KLWNyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCi0KLUxJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQotYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCi0KLVRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgotCi0gIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAotICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKLSAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gZGxkX3ByZWxvYWRlZF9zeW1ib2xzCi0gIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCi0gIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKLSAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKLSAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCi0gIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cwotICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgotICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCi0gIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCi0gICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KLQotQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KLQotRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKLXRyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5Ci1vYmplY3QgZmlsZXMuCi0KLUlmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLCBvbmx5Ci1saWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcyByZXF1aXJlZC4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZCB1c2luZyBcYGFyJwotYW5kIFxgcmFubGliJy4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAubycsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlIGlzCi1jcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgotICA7OwotCi11bmluc3RhbGwpCi0gICRlY2hvCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KLQotUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0KLVJNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQotKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAotdG8gUk0uCi0KLUlmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgotT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgotICA7OwotCi0qKQotICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLSAgOzsKLWVzYWMKLQotZWNobwotJGVjaG8gIlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKLQotZXhpdCAwCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOnNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjoyCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2NqcGVnLnN0IGIvbGlianBlZ3R3cnAvbWFrY2pwZWcuc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzJjODkuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvbWFrY2pwZWcuc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi07IFByb2plY3QgZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi07Ci07IFRoaXMgcHJvamVjdCBmaWxlIGlzIGZvciBBdGFyaSBTVC9TVEUvVFQgc3lzdGVtcyB1c2luZyBQdXJlIEMgb3IgVHVyYm8gQy4KLTsgVGhhbmtzIHRvIEZyYW5rIE1vZWhsZSAoRnJhbmsuTW9laGxlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlKSwKLTsgRHIuIEIuIFNldHplcGZhbmR0IChiZXJuZEBnaW5hLnVuaS1tdWVuc3Rlci5kZSksCi07IGFuZCBHdWlkbyBWb2xsYmVkaW5nIChndWl2b2xAZXNjLmRlKS4KLTsKLTsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGNqcGVnLnByai4KLTsgSWYgeW91IGFyZSB1c2luZyBUdXJibyBDLCBjaGFuZ2UgZmlsZW5hbWVzIGJlZ2lubmluZyB3aXRoICJwYy4uLiIgdG8gInRjLi4uIgotOyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHRyeWluZyB0byBtYWtlIHRoZSBwcm9ncmFtIQotOwotOwotOyAgICAgICogKiAqIE91dHB1dCBmaWxlICogKiAqCi1janBlZy50dHAKLTsKLTsgKiAqICogQ09NUElMRVIgT1BUSU9OUyAqICogKiAgCi0uQ1stUF0gICAgICAgIDsgYWJzb2x1dGUgY2FsbHMKLS5DWy1NXSAgICAgICAgOyBhbmQgbm8gc3RyaW5nIG1lcmdpbmcsIGZvbGtzCi0uQ1stdy1jbG5dICAgIDsgbm8gImNvbnN0YW50IGlzIGxvbmciIHdhcm5pbmdzCi0uQ1stdy1wYXJdICAgIDsgbm8gInBhcmFtZXRlciB4eHh4IHVudXNlZCIKLS5DWy13LXJjaF0gICAgOyBubyAidW5yZWFjaGFibGUgY29kZSIKLS5DWy13c2lnXSAgICAgOyB3YXJuIGlmIHNpZ25pZmljYW50IGRpZ2l0cyBtYXkgYmUgbG9zdAotPQotOyAqICogKiAqIExpc3Qgb2YgbW9kdWxlcyAqICogKiAqIAotcGNzdGFydC5vCi1janBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgsanZlcnNpb24uaCkKLWNkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZHN3aXRjaC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZHBwbS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZGdpZi5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZHRhcmdhLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXJkYm1wLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXJkcmxlLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLWxpYmpwZWcubGliICAgICAgICA7IGJ1aWx0IGJ5IGxpYmpwZWcucHJqCi1wY2ZsdGxpYi5saWIgICAgICAgOyBmbG9hdGluZyBwb2ludCBsaWJyYXJ5Ci07IHRoZSBmbG9hdCBsaWJyYXJ5IGNhbiBiZSBvbWl0dGVkIGlmIHlvdSd2ZSB0dXJuZWQgb2ZmIERDVF9GTE9BVF9TVVBQT1JURUQKLXBjc3RkbGliLmxpYiAgICAgICA7IHN0YW5kYXJkIGxpYnJhcnkKLXBjZXh0bGliLmxpYiAgICAgICA7IGV4dGVuZGVkIGxpYnJhcnkKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2RqcGVnLnN0IGIvbGlianBlZ3R3cnAvbWFrZGpwZWcuc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMjY3MjYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvbWFrZGpwZWcuc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi07IFByb2plY3QgZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi07Ci07IFRoaXMgcHJvamVjdCBmaWxlIGlzIGZvciBBdGFyaSBTVC9TVEUvVFQgc3lzdGVtcyB1c2luZyBQdXJlIEMgb3IgVHVyYm8gQy4KLTsgVGhhbmtzIHRvIEZyYW5rIE1vZWhsZSAoRnJhbmsuTW9laGxlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlKSwKLTsgRHIuIEIuIFNldHplcGZhbmR0IChiZXJuZEBnaW5hLnVuaS1tdWVuc3Rlci5kZSksCi07IGFuZCBHdWlkbyBWb2xsYmVkaW5nIChndWl2b2xAZXNjLmRlKS4KLTsKLTsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGRqcGVnLnByai4KLTsgSWYgeW91IGFyZSB1c2luZyBUdXJibyBDLCBjaGFuZ2UgZmlsZW5hbWVzIGJlZ2lubmluZyB3aXRoICJwYy4uLiIgdG8gInRjLi4uIgotOyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHRyeWluZyB0byBtYWtlIHRoZSBwcm9ncmFtIQotOwotOwotOyAgICAgICogKiAqIE91dHB1dCBmaWxlICogKiAqCi1kanBlZy50dHAKLTsKLTsgKiAqICogQ09NUElMRVIgT1BUSU9OUyAqICogKiAgCi0uQ1stUF0gICAgICAgIDsgYWJzb2x1dGUgY2FsbHMKLS5DWy1NXSAgICAgICAgOyBhbmQgbm8gc3RyaW5nIG1lcmdpbmcsIGZvbGtzCi0uQ1stdy1jbG5dICAgIDsgbm8gImNvbnN0YW50IGlzIGxvbmciIHdhcm5pbmdzCi0uQ1stdy1wYXJdICAgIDsgbm8gInBhcmFtZXRlciB4eHh4IHVudXNlZCIKLS5DWy13LXJjaF0gICAgOyBubyAidW5yZWFjaGFibGUgY29kZSIKLS5DWy13c2lnXSAgICAgOyB3YXJuIGlmIHNpZ25pZmljYW50IGRpZ2l0cyBtYXkgYmUgbG9zdAotPQotOyAqICogKiAqIExpc3Qgb2YgbW9kdWxlcyAqICogKiAqIAotcGNzdGFydC5vCi1kanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgsanZlcnNpb24uaCkKLWNkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZGNvbG1hcC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi13cnBwbS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi13cmdpZi5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi13cnRhcmdhLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXdyYm1wLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXdycmxlLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLWxpYmpwZWcubGliICAgICAgICA7IGJ1aWx0IGJ5IGxpYmpwZWcucHJqCi1wY2ZsdGxpYi5saWIgICAgICAgOyBmbG9hdGluZyBwb2ludCBsaWJyYXJ5Ci07IHRoZSBmbG9hdCBsaWJyYXJ5IGNhbiBiZSBvbWl0dGVkIGlmIHlvdSd2ZSB0dXJuZWQgb2ZmIERDVF9GTE9BVF9TVVBQT1JURUQKLXBjc3RkbGliLmxpYiAgICAgICA7IHN0YW5kYXJkIGxpYnJhcnkKLXBjZXh0bGliLmxpYiAgICAgICA7IGV4dGVuZGVkIGxpYnJhcnkKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2VhcHBzLmRzIGIvbGlianBlZ3R3cnAvbWFrZWFwcHMuZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGQwMzguLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvbWFrZWFwcHMuZHMKKysrIC9kZXYvbnVsbApAQCAtMSw4MjggKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNC4yMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKLQotIUlGICIkKENGRykiID09ICIiCi1DRkc9Y2pwZWcgLSBXaW4zMgotIU1FU1NBR0UgTm8gY29uZmlndXJhdGlvbiBzcGVjaWZpZWQuICBEZWZhdWx0aW5nIHRvIGNqcGVnIC0gV2luMzIuCi0hRU5ESUYgCi0KLSFJRiAiJChDRkcpIiAhPSAiY2pwZWcgLSBXaW4zMiIgJiYgIiQoQ0ZHKSIgIT0gImRqcGVnIC0gV2luMzIiICYmXAotICIkKENGRykiICE9ICJqcGVndHJhbiAtIFdpbjMyIiAmJiAiJChDRkcpIiAhPSAicmRqcGdjb20gLSBXaW4zMiIgJiZcCi0gIiQoQ0ZHKSIgIT0gIndyanBnY29tIC0gV2luMzIiCi0hTUVTU0FHRSBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gIiQoQ0ZHKSIgc3BlY2lmaWVkLgotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0Ugb24gdGhpcyBtYWtlZmlsZQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJhcHBzLm1hayIgQ0ZHPSJjanBlZyAtIFdpbjMyIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgImNqcGVnIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAiZGpwZWcgLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJqcGVndHJhbiAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgInJkanBnY29tIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAid3JqcGdjb20gLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFIAotIUVSUk9SIEFuIGludmFsaWQgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQuCi0hRU5ESUYgCi0KLSFJRiAiJChPUykiID09ICJXaW5kb3dzX05UIgotTlVMTD0KLSFFTFNFIAotTlVMTD1udWwKLSFFTkRJRiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBUYXJnZXRfTGFzdF9TY2FubmVkICJjanBlZyAtIFdpbjMyIgotQ1BQPWNsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJjanBlZyAtIFdpbjMyIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiY2pwZWdcUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImNqcGVnXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICJjanBlZyIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJjanBlZ1xSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImNqcGVnXFJlbGVhc2UiCi0jIFBST1AgVGFyZ2V0X0RpciAiY2pwZWciCi1PVVRESVI9LlxjanBlZ1xSZWxlYXNlCi1JTlRESVI9LlxjanBlZ1xSZWxlYXNlCi0KLUFMTCA6ICIkKE9VVERJUilcY2pwZWcuZXhlIgotCi1DTEVBTiA6IAotCS1AZXJhc2UgIiQoSU5URElSKVxjanBlZy5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHJkcHBtLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilccmRnaWYub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxyZHRhcmdhLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilccmRybGUub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxyZGJtcC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHJkc3dpdGNoLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcY2RqcGVnLm9iaiIKLQktQGVyYXNlICIkKE9VVERJUilcY2pwZWcuZXhlIgotCi0iJChPVVRESVIpIiA6Ci0gICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKLQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi1DUFBfUFJPSj0vbm9sb2dvIC9NTCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSJcCi0gL0ZwIiQoSU5URElSKS9janBlZy5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCi1DUFBfT0JKUz0uXGNqcGVnXFJlbGVhc2UvCi1DUFBfU0JSUz0uXC4KLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUJTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpL2NqcGVnLmJzYyIgCi1CU0MzMl9TQlJTPSBcCi0JCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBSZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLUxJTkszMl9GTEFHUz1SZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWJcCi0gY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliXAotIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpub1wKLSAvcGRiOiIkKE9VVERJUikvY2pwZWcucGRiIiAvbWFjaGluZTpJMzg2IC9vdXQ6IiQoT1VURElSKS9janBlZy5leGUiIAotTElOSzMyX09CSlM9IFwKLQkiJChJTlRESVIpXGNqcGVnLm9iaiIgXAotCSIkKElOVERJUilccmRwcG0ub2JqIiBcCi0JIiQoSU5URElSKVxyZGdpZi5vYmoiIFwKLQkiJChJTlRESVIpXHJkdGFyZ2Eub2JqIiBcCi0JIiQoSU5URElSKVxyZHJsZS5vYmoiIFwKLQkiJChJTlRESVIpXHJkYm1wLm9iaiIgXAotCSIkKElOVERJUilccmRzd2l0Y2gub2JqIiBcCi0JIiQoSU5URElSKVxjZGpwZWcub2JqIiBcCi0KLQotIiQoT1VURElSKVxjanBlZy5leGUiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSU5LMzJfT0JKUykKLSAgICAkKExJTkszMikgQDw8Ci0gICQoTElOSzMyX0ZMQUdTKSAkKExJTkszMl9PQkpTKQotPDwKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImRqcGVnIC0gV2luMzIiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJkanBlZ1xSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZGpwZWdcUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgImRqcGVnIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgImRqcGVnXFJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiZGpwZWdcUmVsZWFzZSIKLSMgUFJPUCBUYXJnZXRfRGlyICJkanBlZyIKLU9VVERJUj0uXGRqcGVnXFJlbGVhc2UKLUlOVERJUj0uXGRqcGVnXFJlbGVhc2UKLQotQUxMIDogIiQoT1VURElSKVxkanBlZy5leGUiCi0KLUNMRUFOIDogCi0JLUBlcmFzZSAiJChJTlRESVIpXGRqcGVnLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcd3JwcG0ub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVx3cmdpZi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHdydGFyZ2Eub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVx3cnJsZS5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHdyYm1wLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilccmRjb2xtYXAub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxjZGpwZWcub2JqIgotCS1AZXJhc2UgIiQoT1VURElSKVxkanBlZy5leGUiCi0KLSIkKE9VVERJUikiIDoKLSAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgotCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLUNQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKLSAvRnAiJChJTlRESVIpL2RqcGVnLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKLUNQUF9PQkpTPS5cZGpwZWdcUmVsZWFzZS8KLUNQUF9TQlJTPS5cLgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvZGpwZWcuYnNjIiAKLUJTQzMyX1NCUlM9IFwKLQkKLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKLSBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCi0gb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAotIC9wZGI6IiQoT1VURElSKS9kanBlZy5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL2RqcGVnLmV4ZSIgCi1MSU5LMzJfT0JKUz0gXAotCSIkKElOVERJUilcZGpwZWcub2JqIiBcCi0JIiQoSU5URElSKVx3cnBwbS5vYmoiIFwKLQkiJChJTlRESVIpXHdyZ2lmLm9iaiIgXAotCSIkKElOVERJUilcd3J0YXJnYS5vYmoiIFwKLQkiJChJTlRESVIpXHdycmxlLm9iaiIgXAotCSIkKElOVERJUilcd3JibXAub2JqIiBcCi0JIiQoSU5URElSKVxyZGNvbG1hcC5vYmoiIFwKLQkiJChJTlRESVIpXGNkanBlZy5vYmoiIFwKLQotCi0iJChPVVRESVIpXGRqcGVnLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQotICAgICQoTElOSzMyKSBAPDwKLSAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCi08PAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAianBlZ3RyYW4gLSBXaW4zMiIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImpwZWd0cmFuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJqcGVndHJhblxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAianBlZ3RyYW4iCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAianBlZ3RyYW5cUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJqcGVndHJhblxSZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgImpwZWd0cmFuIgotT1VURElSPS5canBlZ3RyYW5cUmVsZWFzZQotSU5URElSPS5canBlZ3RyYW5cUmVsZWFzZQotCi1BTEwgOiAiJChPVVRESVIpXGpwZWd0cmFuLmV4ZSIKLQotQ0xFQU4gOiAKLQktQGVyYXNlICIkKElOVERJUilcanBlZ3RyYW4ub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGNkanBlZy5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHRyYW5zdXBwLm9iaiIKLQktQGVyYXNlICIkKE9VVERJUilcanBlZ3RyYW4uZXhlIgotCi0iJChPVVRESVIpIiA6Ci0gICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKLQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi1DUFBfUFJPSj0vbm9sb2dvIC9NTCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSJcCi0gL0ZwIiQoSU5URElSKS9qcGVndHJhbi5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCi1DUFBfT0JKUz0uXGpwZWd0cmFuXFJlbGVhc2UvCi1DUFBfU0JSUz0uXC4KLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUJTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpL2pwZWd0cmFuLmJzYyIgCi1CU0MzMl9TQlJTPSBcCi0JCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBSZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLUxJTkszMl9GTEFHUz1SZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWJcCi0gY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliXAotIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpub1wKLSAvcGRiOiIkKE9VVERJUikvanBlZ3RyYW4ucGRiIiAvbWFjaGluZTpJMzg2IC9vdXQ6IiQoT1VURElSKS9qcGVndHJhbi5leGUiIAotTElOSzMyX09CSlM9IFwKLQkiJChJTlRESVIpXGpwZWd0cmFuLm9iaiIgXAotCSIkKElOVERJUilccmRzd2l0Y2gub2JqIiBcCi0JIiQoSU5URElSKVxjZGpwZWcub2JqIiBcCi0JIiQoSU5URElSKVx0cmFuc3VwcC5vYmoiIFwKLQotCi0iJChPVVRESVIpXGpwZWd0cmFuLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQotICAgICQoTElOSzMyKSBAPDwKLSAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCi08PAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAicmRqcGdjb20gLSBXaW4zMiIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgInJkanBnY29tXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJyZGpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAicmRqcGdjb20iCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAicmRqcGdjb21cUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJyZGpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgInJkanBnY29tIgotT1VURElSPS5ccmRqcGdjb21cUmVsZWFzZQotSU5URElSPS5ccmRqcGdjb21cUmVsZWFzZQotCi1BTEwgOiAiJChPVVRESVIpXHJkanBnY29tLmV4ZSIKLQotQ0xFQU4gOiAKLQktQGVyYXNlICIkKElOVERJUilccmRqcGdjb20ub2JqIgotCS1AZXJhc2UgIiQoT1VURElSKVxyZGpwZ2NvbS5leGUiCi0KLSIkKE9VVERJUikiIDoKLSAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgotCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLUNQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKLSAvRnAiJChJTlRESVIpL3JkanBnY29tLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKLUNQUF9PQkpTPS5ccmRqcGdjb21cUmVsZWFzZS8KLUNQUF9TQlJTPS5cLgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvcmRqcGdjb20uYnNjIiAKLUJTQzMyX1NCUlM9IFwKLQkKLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKLSBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCi0gb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAotIC9wZGI6IiQoT1VURElSKS9yZGpwZ2NvbS5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL3JkanBnY29tLmV4ZSIgCi1MSU5LMzJfT0JKUz0gXAotCSIkKElOVERJUilccmRqcGdjb20ub2JqIgotCi0iJChPVVRESVIpXHJkanBnY29tLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQotICAgICQoTElOSzMyKSBAPDwKLSAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCi08PAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAid3JqcGdjb20gLSBXaW4zMiIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIndyanBnY29tXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ3cmpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAid3JqcGdjb20iCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAid3JqcGdjb21cUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ3cmpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgIndyanBnY29tIgotT1VURElSPS5cd3JqcGdjb21cUmVsZWFzZQotSU5URElSPS5cd3JqcGdjb21cUmVsZWFzZQotCi1BTEwgOiAiJChPVVRESVIpXHdyanBnY29tLmV4ZSIKLQotQ0xFQU4gOiAKLQktQGVyYXNlICIkKElOVERJUilcd3JqcGdjb20ub2JqIgotCS1AZXJhc2UgIiQoT1VURElSKVx3cmpwZ2NvbS5leGUiCi0KLSIkKE9VVERJUikiIDoKLSAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgotCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLUNQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKLSAvRnAiJChJTlRESVIpL3dyanBnY29tLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKLUNQUF9PQkpTPS5cd3JqcGdjb21cUmVsZWFzZS8KLUNQUF9TQlJTPS5cLgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvd3JqcGdjb20uYnNjIiAKLUJTQzMyX1NCUlM9IFwKLQkKLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKLSBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCi0gb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAotIC9wZGI6IiQoT1VURElSKS93cmpwZ2NvbS5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL3dyanBnY29tLmV4ZSIgCi1MSU5LMzJfT0JKUz0gXAotCSIkKElOVERJUilcd3JqcGdjb20ub2JqIgotCi0iJChPVVRESVIpXHdyanBnY29tLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQotICAgICQoTElOSzMyKSBAPDwKLSAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCi08PAotCi0hRU5ESUYgCi0KLS5jeyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3BweyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3h4eyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3skKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmNwcHskKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmN4eHskKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiY2pwZWcgLSBXaW4zMiIKLQotIUlGICAiJChDRkcpIiA9PSAiY2pwZWcgLSBXaW4zMiIKLQotIUVORElGIAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImNqcGVnLmMiCi1ERVBfQ1BQX0NKUEVHPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkianZlcnNpb24uaCJcCi0JCi0KLSIkKElOVERJUilcY2pwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0pQRUcpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iY2RqcGVnLmMiCi1ERVBfQ1BQX0NESlBFPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxjZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0RKUEUpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmRzd2l0Y2guYyIKLURFUF9DUFBfUkRTV0k9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHJkc3dpdGNoLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEU1dJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InJkcHBtLmMiCi1ERVBfQ1BQX1JEUFBNPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxyZHBwbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRFBQTSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZGdpZi5jIgotREVQX0NQUF9SREdJRj1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilccmRnaWYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRHSUYpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmR0YXJnYS5jIgotREVQX0NQUF9SRFRBUj1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilccmR0YXJnYS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRFRBUikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZGJtcC5jIgotREVQX0NQUF9SREJNUD1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilccmRibXAub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRCTVApICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmRybGUuYyIKLURFUF9DUFBfUkRSTEU9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHJkcmxlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEUkxFKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImRqcGVnIC0gV2luMzIiCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImRqcGVnIC0gV2luMzIiCi0KLSFFTkRJRiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJkanBlZy5jIgotREVQX0NQUF9ESlBFRz1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JImp2ZXJzaW9uLmgiXAotCQotCi0iJChJTlRESVIpXGRqcGVnLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0RKUEVHKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImNkanBlZy5jIgotREVQX0NQUF9DREpQRT1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcY2RqcGVnLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0NESlBFKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InJkY29sbWFwLmMiCi1ERVBfQ1BQX1JEQ09MPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxyZGNvbG1hcC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRENPTCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJ3cnBwbS5jIgotREVQX0NQUF9XUlBQTT1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcd3JwcG0ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JQUE0pICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0id3JnaWYuYyIKLURFUF9DUFBfV1JHSUY9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHdyZ2lmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSR0lGKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9IndydGFyZ2EuYyIKLURFUF9DUFBfV1JUQVI9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHdydGFyZ2Eub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JUQVIpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0id3JibXAuYyIKLURFUF9DUFBfV1JCTVA9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHdyYm1wLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSQk1QKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9IndycmxlLmMiCi1ERVBfQ1BQX1dSUkxFPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVx3cnJsZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUlJMRSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJqcGVndHJhbiAtIFdpbjMyIgotCi0hSUYgICIkKENGRykiID09ICJqcGVndHJhbiAtIFdpbjMyIgotCi0hRU5ESUYgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0ianBlZ3RyYW4uYyIKLURFUF9DUFBfSlBFR1Q9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCSJ0cmFuc3VwcC5oIlwKLQkianZlcnNpb24uaCJcCi0JCi0KLSIkKElOVERJUilcanBlZ3RyYW4ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSlBFR1QpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iY2RqcGVnLmMiCi1ERVBfQ1BQX0NESlBFPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxjZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0RKUEUpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmRzd2l0Y2guYyIKLURFUF9DUFBfUkRTV0k9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHJkc3dpdGNoLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEU1dJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InRyYW5zdXBwLmMiCi1ERVBfQ1BQX1RSQU5TPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JInRyYW5zdXBwLmgiXAotCQotCi0iJChJTlRESVIpXHRyYW5zdXBwLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1RSQU5TKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgInJkanBnY29tIC0gV2luMzIiCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInJkanBnY29tIC0gV2luMzIiCi0KLSFFTkRJRiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZGpwZ2NvbS5jIgotREVQX0NQUF9SREpQRz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCQotCi0iJChJTlRESVIpXHJkanBnY29tLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JESlBHKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIndyanBnY29tIC0gV2luMzIiCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIndyanBnY29tIC0gV2luMzIiCi0KLSFFTkRJRiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJ3cmpwZ2NvbS5jIgotREVQX0NQUF9XUkpQRz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCQotCi0iJChJTlRESVIpXHdyanBnY29tLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSSlBHKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLmFuc2kgYi9saWJqcGVndHdycC9tYWtlZmlsZS5hbnNpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjkxOTEzLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLmFuc2kKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBzdWl0YWJsZSBmb3IgVW5peC1saWtlIHN5c3RlbXMgd2l0aCBBTlNJLWNhcGFibGUgY29tcGlsZXJzLgotIyBJZiB5b3UgaGF2ZSBhIG5vbi1BTlNJIGNvbXBpbGVyLCBtYWtlZmlsZS51bml4IGlzIGEgYmV0dGVyIHN0YXJ0aW5nIHBvaW50LgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQotCi0jIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKLUNDPSBjYwotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKLUNGTEFHUz0gLU8KLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLUxERkxBR1M9IAotCi0jIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSAtbCBjb21tYW5kcyBoZXJlLgotTERMSUJTPSAKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLiAgRm9yIFVuaXggdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgbWF5IHdhbnQKLSMgdG8gdXNlIGptZW1hbnNpLm8gb3Igam1lbW5hbWUubyBpZiB5b3UgaGF2ZSBsaW1pdGVkIHN3YXAgc3BhY2UuCi1TWVNERVBNRU09IGptZW1ub2JzLm8KLQotIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgotIyBsaW5rZXIKLUxOPSAkKENDKQotIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKLVJNPSBybSAtZgotIyBsaWJyYXJ5ICguYSkgZmlsZSBjcmVhdGlvbiBjb21tYW5kCi1BUj0gYXIgcmMKLSMgc2Vjb25kIHN0ZXAgaW4gLmEgY3JlYXRpb24gKHVzZSAidG91Y2giIGlmIG5vdCBuZWVkZWQpCi1BUjI9IHJhbmxpYgotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAotICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKLSAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIGpmZGN0Zmx0Lm8gXAotICAgICAgICBqZmRjdGludC5vCi0jIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCi0gICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAotICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCi0gICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCi0jIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmEKLUxJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy5vIHJkcHBtLm8gcmRnaWYubyByZHRhcmdhLm8gcmRybGUubyByZGJtcC5vIHJkc3dpdGNoLm8gXAotICAgICAgICBjZGpwZWcubwotRE9CSkVDVFM9IGRqcGVnLm8gd3JwcG0ubyB3cmdpZi5vIHdydGFyZ2EubyB3cnJsZS5vIHdyYm1wLm8gcmRjb2xtYXAubyBcCi0gICAgICAgIGNkanBlZy5vCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm8gcmRzd2l0Y2gubyBjZGpwZWcubyB0cmFuc3VwcC5vCi0KLQotYWxsOiBsaWJqcGVnLmEgY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20KLQotbGlianBlZy5hOiAkKExJQk9CSkVDVFMpCi0JJChSTSkgbGlianBlZy5hCi0JJChBUikgbGlianBlZy5hICAkKExJQk9CSkVDVFMpCi0JJChBUjIpIGxpYmpwZWcuYQotCi1janBlZzogJChDT0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBjanBlZyAkKENPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLWRqcGVnOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmEKLQkkKExOKSAkKExERkxBR1MpIC1vIGRqcGVnICQoRE9CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKLQotanBlZ3RyYW46ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEKLQkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLXJkanBnY29tOiByZGpwZ2NvbS5vCi0JJChMTikgJChMREZMQUdTKSAtbyByZGpwZ2NvbSByZGpwZ2NvbS5vICQoTERMSUJTKQotCi13cmpwZ2NvbTogd3JqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20gd3JqcGdjb20ubyAkKExETElCUykKLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLWNsZWFuOgotCSQoUk0pICoubyBjanBlZyBkanBlZyBqcGVndHJhbiBsaWJqcGVnLmEgcmRqcGdjb20gd3JqcGdjb20KLQkkKFJNKSBjb3JlIHRlc3RvdXQqCi0KLXRlc3Q6IGNqcGVnIGRqcGVnIGpwZWd0cmFuCi0JJChSTSkgdGVzdG91dCoKLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZwotCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCi0JLi9janBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCS4vY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0JLi9qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0JY21wIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCi0JY21wIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JY21wIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JY21wIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQotCWNtcCB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JY21wIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotCi1qY2FwaW1pbi5vOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQubzogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3QubzogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMubzogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3QubzogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3IubzogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRkY3RtZ3IubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2UubzogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkdHJhbnMubzogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm86IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLWpmZGN0Zmx0Lm86IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3Rmc3QubzogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC5vOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iubzogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm86IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUubzogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mubzogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMubzogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm86IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm86IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm86IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ubzogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ubzogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm86IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAubzogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm86IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ubzogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm86IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm86IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm86IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUubzogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm86IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtlZmlsZS5iY2MgYi9saWJqcGVndHdycC9tYWtlZmlsZS5iY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExY2ZjZGUuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvbWFrZWZpbGUuYmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotCi0jIFRoaXMgbWFrZWZpbGUgaXMgc3VpdGFibGUgZm9yIEJvcmxhbmQgQyBvbiBNUy1ET1Mgb3IgT1MvMi4KLSMgSXQgd29ya3Mgd2l0aCBCb3JsYW5kIEMrKyBmb3IgRE9TLCByZXZpc2lvbiAzLjAgb3IgbGF0ZXIsCi0jIGFuZCBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBCb3JsYW5kIEMrKyBmb3IgT1MvMi4KLSMgV2F0Y2ggb3V0IGZvciBvcHRpbWl6YXRpb24gYnVncyBpbiB0aGUgT1MvMiBjb21waWxlcnMgLS0tIHNlZSBub3RlcyBiZWxvdyEKLSMgVGhhbmtzIHRvIFRvbSBXcmlnaHQgYW5kIEdlJyBXZWlqZXJzIChvcmlnaW5hbCBET1MpIGFuZAotIyBLZW4gUG9ydGVyIChPUy8yKSBmb3IgdGhpcyBmaWxlLgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQotCi0jIEFyZSB3ZSB1bmRlciBET1Mgb3IgT1MvMj8KLSFpZiAhJGQoRE9TKSAmJiAhJGQoT1MyKQotIWlmICRkKF9fT1MyX18pCi1PUzI9MQotIWVsc2UKLURPUz0xCi0hZW5kaWYKLSFlbmRpZgotCi0jIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKLUNDPSBiY2MKLQotIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6Ci0haWYgJGQoRE9TKQotQ0ZMQUdTPSAtTzIgLW1tIC13LXBhciAtdy1zdHUgLXctY2NjIC13LXJjaAotIWVsc2UKLUNGTEFHUz0gLU8xIC13LXBhciAtdy1zdHUgLXctY2NjIC13LXJjaAotIWVuZGlmCi0jIC1PMiBlbmFibGVzIGZ1bGwgY29kZSBvcHRpbWl6YXRpb24gKGZvciBwcmUtMy4wIEJvcmxhbmQgQysrLCB1c2UgLU8gLUcgLVopLgotIyAtTzIgaXMgYnVnZ3kgaW4gQm9ybGFuZCBPUy8yIEMrKyByZXZpc2lvbiAyLjAsIHNvIHVzZSAtTzEgdGhlcmUgZm9yIG5vdy4KLSMgSWYgeW91IGhhdmUgQm9ybGFuZCBPUy8yIEMrKyByZXZpc2lvbiAxLjAsIHVzZSAtTyBvciBubyBvcHRpbWl6YXRpb24gYXQgYWxsLgotIyAtbW0gc2VsZWN0cyBtZWRpdW0gbWVtb3J5IG1vZGVsIChuZWFyIGRhdGEsIGZhciBjb2RlIHBvaW50ZXJzOyBET1Mgb25seSEpCi0jIC13LXBhciBzdXBwcmVzc2VzIHdhcm5pbmdzIGFib3V0IHVudXNlZCBmdW5jdGlvbiBwYXJhbWV0ZXJzCi0jIC13LXN0dSBzdXBwcmVzc2VzIHdhcm5pbmdzIGFib3V0IGluY29tcGxldGUgc3RydWN0dXJlcwotIyAtdy1jY2Mgc3VwcHJlc3NlcyB3YXJuaW5ncyBhYm91dCBjb21waWxlLXRpbWUtY29uc3RhbnQgY29uZGl0aW9ucwotIyAtdy1yY2ggc3VwcHJlc3NlcyB3YXJuaW5ncyBhYm91dCB1bnJlYWNoYWJsZSBjb2RlCi0jIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAotIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCi0KLSMgTGluay10aW1lIGNjIG9wdGlvbnM6Ci0haWYgJGQoRE9TKQotTERGTEFHUz0gLW1tCi0jIG1lbW9yeSBtb2RlbCBvcHRpb24gaGVyZSBtdXN0IG1hdGNoIENGTEFHUyEKLSFlbHNlCi1MREZMQUdTPQotIyAtbGFpIGZ1bGwtc2NyZWVuIGFwcAotIyAtbGMgY2FzZS1zaWduaWZpY2FudCBsaW5rCi0hZW5kaWYKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLgotIyBGb3IgRE9TLCB3ZSByZWNvbW1lbmQgam1lbWRvcy5jIGFuZCBqbWVtZG9zYS5hc20uCi0jIEZvciBPUy8yLCB3ZSByZWNvbW1lbmQgam1lbW5vYnMuYyAoZmxhdCBtZW1vcnkhKQotIyBTWVNERVBNRU1MSUIgbXVzdCBsaXN0IHRoZSBzYW1lIGZpbGVzIHdpdGggIisiIHNpZ25zIGZvciB0aGUgbGlicmFyaWFuLgotIWlmICRkKERPUykKLVNZU0RFUE1FTT0gam1lbWRvcy5vYmogam1lbWRvc2Eub2JqCi1TWVNERVBNRU1MSUI9ICtqbWVtZG9zLm9iaiAram1lbWRvc2Eub2JqCi0hZWxzZQotU1lTREVQTUVNPSBqbWVtbm9icy5vYmoKLVNZU0RFUE1FTUxJQj0gK2ptZW1ub2JzLm9iagotIWVuZGlmCi0KLSMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgotCi0KLSMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKLSAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwotIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKLVNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKLSMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KLUFQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCi0gICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAotICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKLVNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCi0jIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCi0jIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKLSAgICAgICAgbWFrdm1zLm9wdAotQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAotICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKLSAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCi1URVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAotICAgICAgICB0ZXN0aW1ncC5qcGcKLURJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAotICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQotIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiBcCi0gICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqIFwKLSAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqIFwKLSAgICAgICAgamNkY3RtZ3Iub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogamZkY3RpbnQub2JqCi0jIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiBcCi0gICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiBcCi0gICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogXAotICAgICAgICBqaWRjdGZsdC5vYmogamlkY3RpbnQub2JqIGppZGN0cmVkLm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmogXAotICAgICAgICBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iagotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKLUxJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy5vYmogcmRwcG0ub2JqIHJkZ2lmLm9iaiByZHRhcmdhLm9iaiByZHJsZS5vYmogcmRibXAub2JqIFwKLSAgICAgICAgcmRzd2l0Y2gub2JqIGNkanBlZy5vYmoKLURPQkpFQ1RTPSBkanBlZy5vYmogd3JwcG0ub2JqIHdyZ2lmLm9iaiB3cnRhcmdhLm9iaiB3cnJsZS5vYmogd3JibXAub2JqIFwKLSAgICAgICAgcmRjb2xtYXAub2JqIGNkanBlZy5vYmoKLVRST0JKRUNUUz0ganBlZ3RyYW4ub2JqIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqIHRyYW5zdXBwLm9iagotCi0KLWFsbDogbGlianBlZy5saWIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQotCi1saWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQotCS0gZGVsIGxpYmpwZWcubGliCi0JdGxpYiBsaWJqcGVnLmxpYiAvRSAvQyBAJiZ8Ci0ramNhcGltaW4ub2JqICtqY2FwaXN0ZC5vYmogK2pjdHJhbnMub2JqICtqY3BhcmFtLm9iaiAramRhdGFkc3Qub2JqICYKLStqY2luaXQub2JqICtqY21hc3Rlci5vYmogK2pjbWFya2VyLm9iaiAramNtYWluY3Qub2JqICtqY3ByZXBjdC5vYmogJgotK2pjY29lZmN0Lm9iaiAramNjb2xvci5vYmogK2pjc2FtcGxlLm9iaiAramNodWZmLm9iaiAramNwaHVmZi5vYmogJgotK2pjZGN0bWdyLm9iaiAramZkY3Rmc3Qub2JqICtqZmRjdGZsdC5vYmogK2pmZGN0aW50Lm9iaiAramRhcGltaW4ub2JqICYKLStqZGFwaXN0ZC5vYmogK2pkdHJhbnMub2JqICtqZGF0YXNyYy5vYmogK2pkbWFzdGVyLm9iaiAramRpbnB1dC5vYmogJgotK2pkbWFya2VyLm9iaiAramRodWZmLm9iaiAramRwaHVmZi5vYmogK2pkbWFpbmN0Lm9iaiAramRjb2VmY3Qub2JqICYKLStqZHBvc3RjdC5vYmogK2pkZGN0bWdyLm9iaiAramlkY3Rmc3Qub2JqICtqaWRjdGZsdC5vYmogK2ppZGN0aW50Lm9iaiAmCi0ramlkY3RyZWQub2JqICtqZHNhbXBsZS5vYmogK2pkY29sb3Iub2JqICtqcXVhbnQxLm9iaiAranF1YW50Mi5vYmogJgotK2pkbWVyZ2Uub2JqICtqY29tYXBpLm9iaiAranV0aWxzLm9iaiAramVycm9yLm9iaiAram1lbW1nci5vYmogJgotJChTWVNERVBNRU1MSUIpCi18Ci0KLWNqcGVnLmV4ZTogJChDT0JKRUNUUykgbGlianBlZy5saWIKLQkkKENDKSAkKExERkxBR1MpIC1lY2pwZWcuZXhlICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCi0KLWRqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5saWIKLQkkKENDKSAkKExERkxBR1MpIC1lZGpwZWcuZXhlICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCi0KLWpwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCi0JJChDQykgJChMREZMQUdTKSAtZWpwZWd0cmFuLmV4ZSAkKFRST0JKRUNUUykgbGlianBlZy5saWIKLQotcmRqcGdjb20uZXhlOiByZGpwZ2NvbS5jCi0haWYgJGQoRE9TKQotCSQoQ0MpIC1tcyAtTyByZGpwZ2NvbS5jCi0hZWxzZQotCSQoQ0MpICQoQ0ZMQUdTKSByZGpwZ2NvbS5jCi0hZW5kaWYKLQotIyBPbiBET1MsIHdyanBnY29tIG5lZWRzIGxhcmdlIG1vZGVsIHNvIGl0IGNhbiBtYWxsb2MgYSA2NEsgY2h1bmsKLXdyanBnY29tLmV4ZTogd3JqcGdjb20uYwotIWlmICRkKERPUykKLQkkKENDKSAtbWwgLU8gd3JqcGdjb20uYwotIWVsc2UKLQkkKENDKSAkKENGTEFHUykgd3JqcGdjb20uYwotIWVuZGlmCi0KLSMgVGhpcyAie30iIHN5bnRheCBhbGxvd3MgQm9ybGFuZCBNYWtlIHRvICJiYXRjaCIgc291cmNlIGZpbGVzLgotIyBJbiB0aGlzIHdheSwgZWFjaCBydW4gb2YgdGhlIGNvbXBpbGVyIGNhbiBidWlsZCBtYW55IG1vZHVsZXMuCi0uYy5vYmo6Ci0JJChDQykgJChDRkxBR1MpIC1jeyAkPH0KLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLWNsZWFuOgotCS0gZGVsICoub2JqCi0JLSBkZWwgbGlianBlZy5saWIKLQktIGRlbCBjanBlZy5leGUKLQktIGRlbCBkanBlZy5leGUKLQktIGRlbCBqcGVndHJhbi5leGUKLQktIGRlbCByZGpwZ2NvbS5leGUKLQktIGRlbCB3cmpwZ2NvbS5leGUKLQktIGRlbCB0ZXN0b3V0Ki4qCi0KLXRlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCi0JLSBkZWwgdGVzdG91dCouKgotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZwotCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZwotCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotCWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKLSFpZiAkZChET1MpCi0JZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLSFlbHNlCi0JZWNobyBuID4gbi50bXAKLQljb21wIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtIDwgbi50bXAKLQljb21wIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wIDwgbi50bXAKLQljb21wIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnIDwgbi50bXAKLQljb21wIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbSA8IG4udG1wCi0JY29tcCB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnIDwgbi50bXAKLQljb21wIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcgPCBuLnRtcAotCWRlbCBuLnRtcAotIWVuZGlmCi0KLQotamNhcGltaW4ub2JqOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQub2JqOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2VmY3Qub2JqOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci5vYmo6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjZGN0bWdyLm9iajogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qY2h1ZmYub2JqOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjaW5pdC5vYmo6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYWluY3Qub2JqOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXJrZXIub2JqOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXN0ZXIub2JqOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNvbWFwaS5vYmo6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGFyYW0ub2JqOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLm9iajogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNwcmVwY3Qub2JqOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNzYW1wbGUub2JqOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRkY3RtZ3Iub2JqOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC5vYmo6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm9iajogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFya2VyLm9iajogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFzdGVyLm9iajogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2Uub2JqOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLm9iajogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRwb3N0Y3Qub2JqOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUub2JqOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vYmo6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLWpmZGN0Zmx0Lm9iajogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGZzdC5vYmo6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3RpbnQub2JqOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotam1lbW1nci5vYmo6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtYW5zaS5vYmo6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUub2JqOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1ub2JzLm9iajogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtZG9zLm9iajogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMub2JqOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotY2pwZWcub2JqOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1kanBlZy5vYmo6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm9iajoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCi1yZGpwZ2NvbS5vYmo6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLXdyanBnY29tLm9iajogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm9iajogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGNvbG1hcC5vYmo6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHN3aXRjaC5vYmo6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vYmo6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKLXJkcHBtLm9iajogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycHBtLm9iajogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm9iajogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyZ2lmLm9iajogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkdGFyZ2Eub2JqOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm9iajogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRibXAub2JqOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JibXAub2JqOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUub2JqOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JybGUub2JqOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotam1lbWRvc2Eub2JqOiBqbWVtZG9zYS5hc20KLQl0YXNtIC9teCBqbWVtZG9zYS5hc20KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLmNmZyBiL2xpYmpwZWd0d3JwL21ha2VmaWxlLmNmZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1ZTQyZS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWtlZmlsZS5jZmcKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0KLSMgbWFrZWZpbGUuY2ZnIGlzIGVkaXRlZCBieSBjb25maWd1cmUgdG8gcHJvZHVjZSBhIGN1c3RvbSBNYWtlZmlsZS4KLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKLQotIyBGb3IgY29tcGlsaW5nIHdpdGggc291cmNlIGFuZCBvYmplY3QgZmlsZXMgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLgotc3JjZGlyID0gQHNyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotIyBXaGVyZSB0byBpbnN0YWxsIHRoZSBwcm9ncmFtcyBhbmQgbWFuIHBhZ2VzLgotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotYmluZGlyID0gJChleGVjX3ByZWZpeCkvYmluCi1saWJkaXIgPSAkKGV4ZWNfcHJlZml4KS9saWIKLWluY2x1ZGVkaXIgPSAkKHByZWZpeCkvaW5jbHVkZQotYmlucHJlZml4ID0KLW1hbnByZWZpeCA9Ci1tYW5leHQgPSAxCi1tYW5kaXIgPSAkKHByZWZpeCkvbWFuL21hbiQobWFuZXh0KQotCi0jIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKLUNDPSBAQ0NACi0KLSMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgotQ0ZMQUdTPSBAQ0ZMQUdTQCBAQ1BQRkxBR1NAIEBJTkNMVURFRkxBR1NACi0jIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAotIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCi0jIEhvd2V2ZXIsIGFueSBzcGVjaWFsIGRlZmluZXMgZm9yIGFuc2kya25yLmMgbWF5IGJlIGluY2x1ZGVkIGhlcmU6Ci1BTlNJMktOUkZMQUdTPSBAQU5TSTJLTlJGTEFHU0AKLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLUxERkxBR1M9IEBMREZMQUdTQAotCi0jIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSAtbCBjb21tYW5kcyBoZXJlLgotTERMSUJTPSBATElCU0AKLQotIyBJZiB1c2luZyBHTlUgbGlidG9vbCwgTElCVE9PTCByZWZlcmVuY2VzIGl0OyBpZiBub3QsIExJQlRPT0wgaXMgZW1wdHkuCi1MSUJUT09MID0gQExJQlRPT0xACi0jICQoTykgZXhwYW5kcyB0byAibG8iIGlmIHVzaW5nIGxpYnRvb2wsIHBsYWluICJvIiBpZiBub3QuCi0jIFNpbWlsYXJseSwgJChBKSBleHBhbmRzIHRvICJsYSIgb3IgImEiLgotTyA9IEBPQAotQSA9IEBBQAotCi0jIExpYnJhcnkgdmVyc2lvbiBJRDsgbGlidG9vbCB1c2VzIHRoaXMgZm9yIHRoZSBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uIG51bWJlci4KLSMgTm90ZTogd2Ugc3VnZ2VzdCB0aGlzIG1hdGNoIHRoZSBtYWNybyBvZiB0aGUgc2FtZSBuYW1lIGluIGpwZWdsaWIuaC4KLUpQRUdfTElCX1ZFUlNJT04gPSBASlBFR19MSUJfVkVSU0lPTkAKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLiAgRm9yIFVuaXggdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgbWF5IHdhbnQKLSMgdG8gdXNlIGptZW1hbnNpLm8gb3Igam1lbW5hbWUubyBpZiB5b3UgaGF2ZSBsaW1pdGVkIHN3YXAgc3BhY2UuCi1TWVNERVBNRU09IEBNRU1PUllNR1JACi0KLSMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKLVNIRUxMPSAvYmluL3NoCi0jIGxpbmtlcgotTE49IEBMTkAKLSMgZmlsZSBkZWxldGlvbiBjb21tYW5kCi1STT0gcm0gLWYKLSMgZGlyZWN0b3J5IGNyZWF0aW9uIGNvbW1hbmQKLU1LRElSPSBta2RpcgotIyBsaWJyYXJ5ICguYSkgZmlsZSBjcmVhdGlvbiBjb21tYW5kCi1BUj0gYXIgcmMKLSMgc2Vjb25kIHN0ZXAgaW4gLmEgY3JlYXRpb24gKHVzZSAidG91Y2giIGlmIG5vdCBuZWVkZWQpCi1BUjI9IEBSQU5MSUJACi0jIGluc3RhbGxhdGlvbiBwcm9ncmFtCi1JTlNUQUxMPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTT0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfTElCPSBASU5TVEFMTF9MSUJACi1JTlNUQUxMX0RBVEE9IEBJTlNUQUxMX0RBVEFACi0KLSMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgotCi0KLSMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKLSAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwotIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKLVNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKLSMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KLUFQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCi0gICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAotICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKLVNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCi0jIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCi0jIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKLSAgICAgICAgbWFrdm1zLm9wdAotQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAotICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKLSAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCi1URVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAotICAgICAgICB0ZXN0aW1ncC5qcGcKLURJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAotICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQotIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkuJChPKSBqdXRpbHMuJChPKSBqZXJyb3IuJChPKSBqbWVtbWdyLiQoTykgJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4uJChPKSBqY2FwaXN0ZC4kKE8pIGpjdHJhbnMuJChPKSBqY3BhcmFtLiQoTykgXAotICAgICAgICBqZGF0YWRzdC4kKE8pIGpjaW5pdC4kKE8pIGpjbWFzdGVyLiQoTykgamNtYXJrZXIuJChPKSBqY21haW5jdC4kKE8pIFwKLSAgICAgICAgamNwcmVwY3QuJChPKSBqY2NvZWZjdC4kKE8pIGpjY29sb3IuJChPKSBqY3NhbXBsZS4kKE8pIGpjaHVmZi4kKE8pIFwKLSAgICAgICAgamNwaHVmZi4kKE8pIGpjZGN0bWdyLiQoTykgamZkY3Rmc3QuJChPKSBqZmRjdGZsdC4kKE8pIFwKLSAgICAgICAgamZkY3RpbnQuJChPKQotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4uJChPKSBqZGFwaXN0ZC4kKE8pIGpkdHJhbnMuJChPKSBqZGF0YXNyYy4kKE8pIFwKLSAgICAgICAgamRtYXN0ZXIuJChPKSBqZGlucHV0LiQoTykgamRtYXJrZXIuJChPKSBqZGh1ZmYuJChPKSBqZHBodWZmLiQoTykgXAotICAgICAgICBqZG1haW5jdC4kKE8pIGpkY29lZmN0LiQoTykgamRwb3N0Y3QuJChPKSBqZGRjdG1nci4kKE8pIFwKLSAgICAgICAgamlkY3Rmc3QuJChPKSBqaWRjdGZsdC4kKE8pIGppZGN0aW50LiQoTykgamlkY3RyZWQuJChPKSBcCi0gICAgICAgIGpkc2FtcGxlLiQoTykgamRjb2xvci4kKE8pIGpxdWFudDEuJChPKSBqcXVhbnQyLiQoTykgamRtZXJnZS4kKE8pCi0jIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmEKLUxJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy4kKE8pIHJkcHBtLiQoTykgcmRnaWYuJChPKSByZHRhcmdhLiQoTykgcmRybGUuJChPKSBcCi0gICAgICAgIHJkYm1wLiQoTykgcmRzd2l0Y2guJChPKSBjZGpwZWcuJChPKQotRE9CSkVDVFM9IGRqcGVnLiQoTykgd3JwcG0uJChPKSB3cmdpZi4kKE8pIHdydGFyZ2EuJChPKSB3cnJsZS4kKE8pIFwKLSAgICAgICAgd3JibXAuJChPKSByZGNvbG1hcC4kKE8pIGNkanBlZy4kKE8pCi1UUk9CSkVDVFM9IGpwZWd0cmFuLiQoTykgcmRzd2l0Y2guJChPKSBjZGpwZWcuJChPKSB0cmFuc3VwcC4kKE8pCi0KLQotYWxsOiBAQTJLX0RFUFNAIGxpYmpwZWcuJChBKSBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQotCi0jIFNwZWNpYWwgY29tcGlsYXRpb24gcnVsZXMgdG8gc3VwcG9ydCBhbnNpMmtuciBhbmQgbGlidG9vbC4KLS5TVUZGSVhFUzogLmxvIC5sYQotCi0jIEhvdyB0byBjb21waWxlIHdpdGggbGlidG9vbC4KLUBDT01fTFRALmMubG86Ci1AQ09NX0xUQAkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoQ0ZMQUdTKSAtYyAkKHNyY2RpcikvJCouYwotCi0jIEhvdyB0byB1c2UgYW5zaTJrbnIsIHdoZW4gbm90IHVzaW5nIGxpYnRvb2wuCi1AQ09NX0EyS0AuYy5vOgotQENPTV9BMktACS4vYW5zaTJrbnIgJChzcmNkaXIpLyQqLmMga25yLyQqLmMKLUBDT01fQTJLQAkkKENDKSAkKENGTEFHUykgLWMga25yLyQqLmMKLUBDT01fQTJLQAkkKFJNKSBrbnIvJCouYwotCi0jIEhvdyB0byB1c2UgYW5zaTJrbnIgQU5EIGxpYnRvb2wuCi1AQ09NX0EyS0AuYy5sbzoKLUBDT01fQTJLQAkuL2Fuc2kya25yICQoc3JjZGlyKS8kKi5jIGtuci8kKi5jCi1AQ09NX0EyS0AJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKENGTEFHUykgLWMga25yLyQqLmMKLUBDT01fQTJLQAkkKFJNKSBrbnIvJCouYwotCi1hbnNpMmtucjogYW5zaTJrbnIuYwotCSQoQ0MpICQoQ0ZMQUdTKSAkKEFOU0kyS05SRkxBR1MpIC1vIGFuc2kya25yICQoc3JjZGlyKS9hbnNpMmtuci5jCi0JJChNS0RJUikga25yCi0KLSMgdGhlIGxpYnJhcnk6Ci0KLSMgd2l0aG91dCBsaWJ0b29sOgotbGlianBlZy5hOiBAQTJLX0RFUFNAICQoTElCT0JKRUNUUykKLQkkKFJNKSBsaWJqcGVnLmEKLQkkKEFSKSBsaWJqcGVnLmEgICQoTElCT0JKRUNUUykKLQkkKEFSMikgbGlianBlZy5hCi0KLSMgd2l0aCBsaWJ0b29sOgotbGlianBlZy5sYTogQEEyS19ERVBTQCAkKExJQk9CSkVDVFMpCi0JJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDKSAtbyBsaWJqcGVnLmxhICQoTElCT0JKRUNUUykgXAotCQktcnBhdGggJChsaWJkaXIpIC12ZXJzaW9uLWluZm8gJChKUEVHX0xJQl9WRVJTSU9OKQotCi0jIHNhbXBsZSBwcm9ncmFtczoKLQotY2pwZWc6ICQoQ09CSkVDVFMpIGxpYmpwZWcuJChBKQotCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcgJChDT0JKRUNUUykgbGlianBlZy4kKEEpICQoTERMSUJTKQotCi1kanBlZzogJChET0JKRUNUUykgbGlianBlZy4kKEEpCi0JJChMTikgJChMREZMQUdTKSAtbyBkanBlZyAkKERPQkpFQ1RTKSBsaWJqcGVnLiQoQSkgJChMRExJQlMpCi0KLWpwZWd0cmFuOiAkKFRST0JKRUNUUykgbGlianBlZy4kKEEpCi0JJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbiAkKFRST0JKRUNUUykgbGlianBlZy4kKEEpICQoTERMSUJTKQotCi1yZGpwZ2NvbTogcmRqcGdjb20uJChPKQotCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20gcmRqcGdjb20uJChPKSAkKExETElCUykKLQotd3JqcGdjb206IHdyanBnY29tLiQoTykKLQkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tIHdyanBnY29tLiQoTykgJChMRExJQlMpCi0KLSMgSW5zdGFsbGF0aW9uIHJ1bGVzOgotCi1pbnN0YWxsOiBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbSBARk9SQ0VfSU5TVEFMTF9MSUJACi0JJChJTlNUQUxMX1BST0dSQU0pIGNqcGVnICQoYmluZGlyKS8kKGJpbnByZWZpeCljanBlZwotCSQoSU5TVEFMTF9QUk9HUkFNKSBkanBlZyAkKGJpbmRpcikvJChiaW5wcmVmaXgpZGpwZWcKLQkkKElOU1RBTExfUFJPR1JBTSkganBlZ3RyYW4gJChiaW5kaXIpLyQoYmlucHJlZml4KWpwZWd0cmFuCi0JJChJTlNUQUxMX1BST0dSQU0pIHJkanBnY29tICQoYmluZGlyKS8kKGJpbnByZWZpeClyZGpwZ2NvbQotCSQoSU5TVEFMTF9QUk9HUkFNKSB3cmpwZ2NvbSAkKGJpbmRpcikvJChiaW5wcmVmaXgpd3JqcGdjb20KLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2NqcGVnLjEgJChtYW5kaXIpLyQobWFucHJlZml4KWNqcGVnLiQobWFuZXh0KQotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvZGpwZWcuMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpZGpwZWcuJChtYW5leHQpCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qcGVndHJhbi4xICQobWFuZGlyKS8kKG1hbnByZWZpeClqcGVndHJhbi4kKG1hbmV4dCkKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL3JkanBnY29tLjEgJChtYW5kaXIpLyQobWFucHJlZml4KXJkanBnY29tLiQobWFuZXh0KQotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2Rpcikvd3JqcGdjb20uMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpd3JqcGdjb20uJChtYW5leHQpCi0KLWluc3RhbGwtbGliOiBsaWJqcGVnLiQoQSkgaW5zdGFsbC1oZWFkZXJzCi0JJChJTlNUQUxMX0xJQikgbGlianBlZy4kKEEpICQobGliZGlyKS8kKGJpbnByZWZpeClsaWJqcGVnLiQoQSkKLQotaW5zdGFsbC1oZWFkZXJzOiBqY29uZmlnLmgKLQkkKElOU1RBTExfREFUQSkgamNvbmZpZy5oICQoaW5jbHVkZWRpcikvamNvbmZpZy5oCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qcGVnbGliLmggJChpbmNsdWRlZGlyKS9qcGVnbGliLmgKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2ptb3JlY2ZnLmggJChpbmNsdWRlZGlyKS9qbW9yZWNmZy5oCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qZXJyb3IuaCAkKGluY2x1ZGVkaXIpL2plcnJvci5oCi0KLWNsZWFuOgotCSQoUk0pICoubyAqLmxvIGxpYmpwZWcuYSBsaWJqcGVnLmxhCi0JJChSTSkgY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20KLQkkKFJNKSBhbnNpMmtuciBjb3JlIHRlc3RvdXQqIGNvbmZpZy5sb2cgY29uZmlnLnN0YXR1cwotCSQoUk0pIC1yIGtuciAubGlicyBfbGlicwotCi1kaXN0Y2xlYW46IGNsZWFuCi0JJChSTSkgTWFrZWZpbGUgamNvbmZpZy5oIGxpYnRvb2wgY29uZmlnLmNhY2hlCi0KLXRlc3Q6IGNqcGVnIGRqcGVnIGpwZWd0cmFuCi0JJChSTSkgdGVzdG91dCoKLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gICQoc3JjZGlyKS90ZXN0b3JpZy5qcGcKLQkuL2RqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgICQoc3JjZGlyKS90ZXN0b3JpZy5qcGcKLQkuL2NqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICAkKHNyY2RpcikvdGVzdGltZy5wcG0KLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtICQoc3JjZGlyKS90ZXN0cHJvZy5qcGcKLQkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyAkKHNyY2RpcikvdGVzdGltZy5wcG0KLQkuL2pwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyAkKHNyY2RpcikvdGVzdHByb2cuanBnCi0JY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWNtcCAkKHNyY2RpcikvdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQljbXAgJChzcmNkaXIpL3Rlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQljbXAgJChzcmNkaXIpL3Rlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQljbXAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotY2hlY2s6IHRlc3QKLQotIyBNaXN0YWtlIGNhdGNoZXI6Ci0KLWpjb25maWcuaDogamNvbmZpZy5kb2MKLQllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgotCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgotCWV4aXQgMQotCi0jIEdOVSBNYWtlIGxpa2VzIHRvIGtub3cgd2hpY2ggdGFyZ2V0IG5hbWVzIGFyZSBub3QgcmVhbGx5IGZpbGVzIHRvIGJlIG1hZGU6Ci0uUEhPTlk6IGFsbCBpbnN0YWxsIGluc3RhbGwtbGliIGluc3RhbGwtaGVhZGVycyBjbGVhbiBkaXN0Y2xlYW4gdGVzdCBjaGVjawotCi0KLWpjYXBpbWluLiQoTyk6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC4kKE8pOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2VmY3QuJChPKTogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29sb3IuJChPKTogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNkY3RtZ3IuJChPKTogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qY2h1ZmYuJChPKTogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQuJChPKTogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC4kKE8pOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXJrZXIuJChPKTogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLiQoTyk6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLiQoTyk6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGFyYW0uJChPKTogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi4kKE8pOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC4kKE8pOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNzYW1wbGUuJChPKTogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjdHJhbnMuJChPKTogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4uJChPKTogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLiQoTyk6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC4kKE8pOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy4kKE8pOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC4kKE8pOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci4kKE8pOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGRjdG1nci4kKE8pOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi4kKE8pOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkaW5wdXQuJChPKTogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3QuJChPKTogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFya2VyLiQoTyk6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hc3Rlci4kKE8pOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS4kKE8pOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLiQoTyk6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0LiQoTyk6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS4kKE8pOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamR0cmFucy4kKE8pOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3IuJChPKTogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotamZkY3RmbHQuJChPKTogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGZzdC4kKE8pOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0aW50LiQoTyk6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RmbHQuJChPKTogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZzdC4kKE8pOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0aW50LiQoTyk6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RyZWQuJChPKTogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qcXVhbnQxLiQoTyk6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpxdWFudDIuJChPKToganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLiQoTyk6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotam1lbW1nci4kKE8pOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWFuc2kuJChPKTogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS4kKE8pOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1ub2JzLiQoTyk6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWRvcy4kKE8pOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy4kKE8pOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotY2pwZWcuJChPKTogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotZGpwZWcuJChPKTogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4uJChPKToganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCi1yZGpwZ2NvbS4kKE8pOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi13cmpwZ2NvbS4kKE8pOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcuJChPKTogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGNvbG1hcC4kKE8pOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRzd2l0Y2guJChPKTogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLiQoTyk6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKLXJkcHBtLiQoTyk6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnBwbS4kKE8pOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYuJChPKTogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyZ2lmLiQoTyk6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHRhcmdhLiQoTyk6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2EuJChPKTogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRibXAuJChPKTogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyYm1wLiQoTyk6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS4kKE8pOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JybGUuJChPKTogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLmRqIGIvbGlianBlZ3R3cnAvbWFrZWZpbGUuZGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NjZkMjUuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvbWFrZWZpbGUuZGoKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgREpHUFAgKERlbG9yaWUncyBHTlUgQyBwb3J0IG9uIE1TLURPUyksIHYyLjAgb3IgbGF0ZXIuCi0jIFRoYW5rcyB0byBGcmFuayBKLiBEb25haG9lIGZvciB0aGlzIHZlcnNpb24uCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCi0KLSMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgotQ0M9IGdjYwotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKLUNGTEFHUz0gLU8yIC1XYWxsIC1JLgotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgotCi0jIExpbmstdGltZSBjYyBvcHRpb25zOgotTERGTEFHUz0gLXMKLQotIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgLWwgY29tbWFuZHMgaGVyZS4KLUxETElCUz0gCi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4gIEZvciBESkdQUCB0aGlzIGlzIHVzdWFsbHkgam1lbW5vYnMubywgYnV0IHlvdSBjb3VsZAotIyB1c2Ugam1lbW5hbWUubyBpZiB5b3Ugd2FudCB0byB1c2UgbmFtZWQgdGVtcCBmaWxlcyBpbnN0ZWFkIG9mIHN3YXAgc3BhY2UuCi1TWVNERVBNRU09IGptZW1ub2JzLm8KLQotIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgotIyBsaW5rZXIKLUxOPSAkKENDKQotIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKLVJNPSBkZWwKLSMgbGlicmFyeSAoLmEpIGZpbGUgY3JlYXRpb24gY29tbWFuZAotQVI9IGFyIHJjCi0jIHNlY29uZCBzdGVwIGluIC5hIGNyZWF0aW9uICh1c2UgInRvdWNoIiBpZiBub3QgbmVlZGVkKQotQVIyPSByYW5saWIKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKLSAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCi0gICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZkY3RpbnQubwotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkdHJhbnMubyBqZGF0YXNyYy5vIGpkbWFzdGVyLm8gXAotICAgICAgICBqZGlucHV0Lm8gamRtYXJrZXIubyBqZGh1ZmYubyBqZHBodWZmLm8gamRtYWluY3QubyBqZGNvZWZjdC5vIFwKLSAgICAgICAgamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBqaWRjdGludC5vIGppZGN0cmVkLm8gXAotICAgICAgICBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIGpkbWVyZ2UubwotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5hCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcubyByZHBwbS5vIHJkZ2lmLm8gcmR0YXJnYS5vIHJkcmxlLm8gcmRibXAubyByZHN3aXRjaC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLURPQkpFQ1RTPSBkanBlZy5vIHdycHBtLm8gd3JnaWYubyB3cnRhcmdhLm8gd3JybGUubyB3cmJtcC5vIHJkY29sbWFwLm8gXAotICAgICAgICBjZGpwZWcubwotVFJPQkpFQ1RTPSBqcGVndHJhbi5vIHJkc3dpdGNoLm8gY2RqcGVnLm8gdHJhbnN1cHAubwotCi0KLWFsbDogbGlianBlZy5hIGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlIHJkanBnY29tLmV4ZSB3cmpwZ2NvbS5leGUKLQotbGlianBlZy5hOiAkKExJQk9CSkVDVFMpCi0JJChSTSkgbGlianBlZy5hCi0JJChBUikgbGlianBlZy5hICAkKExJQk9CSkVDVFMpCi0JJChBUjIpIGxpYmpwZWcuYQotCi1janBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcuYQotCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcuZXhlICQoQ09CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKLQotZGpwZWcuZXhlOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmEKLQkkKExOKSAkKExERkxBR1MpIC1vIGRqcGVnLmV4ZSAkKERPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLWpwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpIGxpYmpwZWcuYQotCSQoTE4pICQoTERGTEFHUykgLW8ganBlZ3RyYW4uZXhlICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLXJkanBnY29tLmV4ZTogcmRqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20uZXhlIHJkanBnY29tLm8gJChMRExJQlMpCi0KLXdyanBnY29tLmV4ZTogd3JqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20uZXhlIHdyanBnY29tLm8gJChMRExJQlMpCi0KLWpjb25maWcuaDogamNvbmZpZy5kb2MKLQllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgotCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgotCWV4aXQgMQotCi1jbGVhbjoKLQkkKFJNKSAqLm8KLQkkKFJNKSBjanBlZy5leGUKLQkkKFJNKSBkanBlZy5leGUKLQkkKFJNKSBqcGVndHJhbi5leGUKLQkkKFJNKSByZGpwZ2NvbS5leGUKLQkkKFJNKSB3cmpwZ2NvbS5leGUKLQkkKFJNKSBsaWJqcGVnLmEKLQkkKFJNKSB0ZXN0b3V0Ki4qCi0KLXRlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCi0JJChSTSkgdGVzdG91dCouKgotCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCi0JLi9kanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKLQkuL2NqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQotCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCi0JLi9janBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KLQkuL2pwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWZjIC9iIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JZmMgL2IgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQlmYyAvYiB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JZmMgL2IgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotCi0KLWpjYXBpbWluLm86IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2VmY3QubzogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29sb3IubzogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNkY3RtZ3IubzogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qY2h1ZmYubzogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQubzogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXJrZXIubzogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm86IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm86IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGFyYW0ubzogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNzYW1wbGUubzogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjdHJhbnMubzogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ubzogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLm86IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3IubzogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotamZkY3RmbHQubzogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGZzdC5vOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0aW50Lm86IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RmbHQubzogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZzdC5vOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0aW50Lm86IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RyZWQubzogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qcXVhbnQxLm86IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpxdWFudDIubzoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm86IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotam1lbW1nci5vOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWFuc2kubzogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1ub2JzLm86IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWRvcy5vOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotY2pwZWcubzogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotZGpwZWcubzogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ubzoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCi1yZGpwZ2NvbS5vOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi13cmpwZ2NvbS5vOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcubzogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGNvbG1hcC5vOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRzd2l0Y2gubzogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm86IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKLXJkcHBtLm86IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnBwbS5vOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYubzogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyZ2lmLm86IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHRhcmdhLm86IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eubzogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRibXAubzogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyYm1wLm86IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JybGUubzogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLm1hbnggYi9saWJqcGVndHdycC9tYWtlZmlsZS5tYW54CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2I0MmQxLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLm1hbngKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgQW1pZ2Egc3lzdGVtcyB1c2luZyBNYW54IEF6dGVjIEMgdmVyIDUueC4KLSMgVGhhbmtzIHRvIEQuSi4gSmFtZXMgKGRqamFtZXNAY3VwLnBvcnRhbC5jb20pIGZvciB0aGlzIHZlcnNpb24uCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCi0KLSMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgotQ0M9IGNjCi0KLSMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgotIyBVbmNvbW1lbnQgZm9yIGdlbmVyaWMgNjgwMDAgY29kZSAod2lsbCB3b3JrIG9uIGFueSBBbWlnYSkKLUFSQ0hGTEFHUz0gLXNuCi0KLSMgVW5jb21tZW50IGZvciA2ODAyMC82ODAzMCBjb2RlIChmYXN0ZXIsIGJ1dCB3b24ndCBydW4gb24gNjgwMDAgQ1BVKQotI0FSQ0hGTEFHUz0gLWMyCi0KLUNGTEFHUz0gLU1DIC1NRCAkKEFSQ0hGTEFHUykgLXNwZmFtIC1yNAotCi0jIExpbmstdGltZSBjYyBvcHRpb25zOgotTERGTEFHUz0gLWcKLQotIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgLWwgY29tbWFuZHMgaGVyZS4KLUxETElCUz0gLWxtbCAtbGNsCi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4gIEZvciBBbWlnYSB3ZSByZWNvbW1lbmQgam1lbW5hbWUuby4KLVNZU0RFUE1FTT0gam1lbW5hbWUubwotCi0jIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCi0jIGxpbmtlcgotTE49IGxuCi0jIGZpbGUgZGVsZXRpb24gY29tbWFuZAotUk09IGRlbGV0ZSBxdWlldAotIyBsaWJyYXJ5ICgubGliKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKLUFSPSBsYgotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAotICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKLSAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIGpmZGN0Zmx0Lm8gXAotICAgICAgICBqZmRjdGludC5vCi0jIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCi0gICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAotICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCi0gICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCi0jIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCi0gICAgICAgIGNkanBlZy5vCi1ET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLVRST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KLQotCi1hbGw6IGxpYmpwZWcubGliIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCi0KLWxpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpCi0JLSQoUk0pIGxpYmpwZWcubGliCi0JJChBUikgbGlianBlZy5saWIgICQoTElCT0JKRUNUUykKLQotY2pwZWc6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCi0JJChMTikgJChMREZMQUdTKSAtbyBjanBlZyAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKLQotZGpwZWc6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCi0JJChMTikgJChMREZMQUdTKSAtbyBkanBlZyAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKLQotanBlZ3RyYW46ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoTE4pICQoTERGTEFHUykgLW8ganBlZ3RyYW4gJChUUk9CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQotCi1yZGpwZ2NvbTogcmRqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20gcmRqcGdjb20ubyAkKExETElCUykKLQotd3JqcGdjb206IHdyanBnY29tLm8KLQkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tIHdyanBnY29tLm8gJChMRExJQlMpCi0KLWpjb25maWcuaDogamNvbmZpZy5kb2MKLQllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgotCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgotCWV4aXQgMQotCi1jbGVhbjoKLQktJChSTSkgKi5vIGNqcGVnIGRqcGVnIGpwZWd0cmFuIGxpYmpwZWcubGliIHJkanBnY29tIHdyanBnY29tCi0JLSQoUk0pIGNvcmUgdGVzdG91dCouKgotCi10ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgotCS0kKFJNKSB0ZXN0b3V0Ki4qCi0JZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCi0JZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCi0JY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCi0JZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCi0JY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0JanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZwotCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWNtcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWNtcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQljbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWNtcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0KLQotamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi1qZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1kanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLXdyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvbWFrZWZpbGUubWM2IGIvbGlianBlZ3R3cnAvbWFrZWZpbGUubWM2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWZmMDU0Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLm1jNgorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLQotIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBNaWNyb3NvZnQgQyBmb3IgTVMtRE9TLCB2ZXJzaW9uIDYuMDBBIGFuZCB1cC4KLSMgVXNlIE5NQUtFLCBub3QgTWljcm9zb2Z0J3MgYnJhaW4tZGFtYWdlZCBNQUtFLgotIyBUaGFua3MgdG8gQWxhbiBXcmlnaHQgYW5kIENocmlzIFR1cm5lciBvZiBPbGl2ZXR0aSBSZXNlYXJjaCBMdGQuCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm5tYWtlIiAhIQotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY29tcGlsZXIgb3B0aW9uczoKLUNGTEFHUyA9IC1BTSAtT2VjaWd0IC1HcyAtVzMKLSMgLUFNIG1lZGl1bSBtZW1vcnkgbW9kZWwgKG9yIHVzZSAtQVMgZm9yIHNtYWxsIG1vZGVsLCBpZiB5b3UgcmVtb3ZlIGZlYXR1cmVzKQotIyAtT2VjaWd0IC1HcyAgbWF4aW11bSBzYWZlIG9wdGltaXNhdGlvbiAoLU9sIGhhcyBidWdzIGluIE1TQyA2LjAwQSkKLSMgLVczIHdhcm5pbmcgbGV2ZWwgMwotIyBZb3UgbWlnaHQgYWxzbyB3YW50IHRvIGFkZCAtRzIgaWYgeW91IGhhdmUgYW4gODAyODYsIGV0Yy4KLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KLQotIyBKYW4tSGVybWFuIEJ1aW5pbmcgc3VnZ2VzdHMgdGhlIGZvbGxvd2luZyBzd2l0Y2hlcyBmb3IgTVMgQyA4LjAgYW5kIGEgNDg2OgotIyBDRkxBR1MgPSAvQU0gL2YtIC9GUGk4NyAvRzMgL0dzIC9HeSAvT2IxIC9PYyAvT2UgL09nIC9PaSAvT2wgL09uIC9PbyAvT3QgXAotIyAgICAgICAgICAvT1Y0IC9XMwotIyBleGNlcHQgZm9yIGpxdWFudDEuYywgd2hpY2ggbXVzdCBiZSBjb21waWxlZCB3aXRoIC9Pby0gdG8gYXZvaWQgYSBjb21waWxlcgotIyBjcmFzaC4KLQotIyBJbmdhciBTdGVpbnNsYW5kIHN1Z2dlc3RzIHRoZSBmb2xsb3dpbmcgc3dpdGNoZXMgd2hlbiBidWlsZGluZwotIyBhIDE2LWJpdCBXaW5kb3dzIERMTDoKLSMgQ0ZMQUdTID0gLUFMdyAtR3N3IC1acGUgLVczIC1PMiAtWmkgLVpkCi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4gIEZvciBET1MsIHdlIHJlY29tbWVuZCBqbWVtZG9zLmMgYW5kIGptZW1kb3NhLmFzbS4KLSMgKEJ1dCBub3QgZm9yIFdpbmRvd3M7IHNlZSBpbnN0YWxsLmRvYyBpZiB5b3UgdXNlIHRoaXMgbWFrZWZpbGUgZm9yIFdpbmRvd3MuKQotU1lTREVQTUVNPSBqbWVtZG9zLm9iaiBqbWVtZG9zYS5vYmoKLSMgU1lTREVQTUVNTElCIG11c3QgbGlzdCB0aGUgc2FtZSBmaWxlcyB3aXRoICIrIiBzaWducyBmb3IgdGhlIGxpYnJhcmlhbi4KLVNZU0RFUE1FTUxJQj0gK2ptZW1kb3Mub2JqICtqbWVtZG9zYS5vYmoKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqIFwKLSAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogXAotICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogXAotICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKLSAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqIFwKLSAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBcCi0gICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiBcCi0gICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCi0jIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogXAotICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagotRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogXAotICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagotVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCi0KLSMgbmVlZCBsaW5rZXIgcmVzcG9uc2UgZmlsZSBiZWNhdXNlIGZpbGUgbGlzdCA+IDEyOCBjaGFycwotUkZJTEUgPSBsaWJqcGVnLmFucwotCi0KLWFsbDogbGlianBlZy5saWIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQotCi1saWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKSAkKFJGSUxFKQotCWRlbCBsaWJqcGVnLmxpYgotCWxpYiBAJChSRklMRSkKLQotIyBsaW5rZXIgcmVzcG9uc2UgZmlsZSBmb3IgYnVpbGRpbmcgbGlianBlZy5saWIKLSQoUkZJTEUpIDogbWFrZWZpbGUKLQlkZWwgJChSRklMRSkKLQllY2hvIGxpYmpwZWcubGliID4kKFJGSUxFKQotIyBzaWxseSB3YW50LXRvLWNyZWF0ZS1pdCBwcm9tcHQ6Ci0JZWNobyB5ID4+JChSRklMRSkKLQllY2hvICtqY2FwaW1pbi5vYmogK2pjYXBpc3RkLm9iaiAramN0cmFucy5vYmogK2pjcGFyYW0ub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2pkYXRhZHN0Lm9iaiAramNpbml0Lm9iaiAramNtYXN0ZXIub2JqICtqY21hcmtlci5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramNtYWluY3Qub2JqICtqY3ByZXBjdC5vYmogK2pjY29lZmN0Lm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqY2NvbG9yLm9iaiAramNzYW1wbGUub2JqICtqY2h1ZmYub2JqICtqY3BodWZmLm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqY2RjdG1nci5vYmogK2pmZGN0ZnN0Lm9iaiAramZkY3RmbHQub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2pmZGN0aW50Lm9iaiAramRhcGltaW4ub2JqICtqZGFwaXN0ZC5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramR0cmFucy5vYmogK2pkYXRhc3JjLm9iaiAramRtYXN0ZXIub2JqICtqZGlucHV0Lm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqZG1hcmtlci5vYmogK2pkaHVmZi5vYmogK2pkcGh1ZmYub2JqICtqZG1haW5jdC5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramRjb2VmY3Qub2JqICtqZHBvc3RjdC5vYmogK2pkZGN0bWdyLm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqaWRjdGZzdC5vYmogK2ppZGN0Zmx0Lm9iaiAramlkY3RpbnQub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2ppZGN0cmVkLm9iaiAramRzYW1wbGUub2JqICtqZGNvbG9yLm9iaiAranF1YW50MS5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAranF1YW50Mi5vYmogK2pkbWVyZ2Uub2JqICtqY29tYXBpLm9iaiAranV0aWxzLm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqZXJyb3Iub2JqICtqbWVtbWdyLm9iaiAmID4+JChSRklMRSkKLQllY2hvICQoU1lTREVQTUVNTElCKSA7ID4+JChSRklMRSkKLQotY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCWVjaG8gJChDT0JKRUNUUykgPmNqcGVnLmxzdAotCWxpbmsgL1NUQUNLOjQwOTYgL0VYRVBBQ0sgQGNqcGVnLmxzdCwgY2pwZWcuZXhlLCAsIGxpYmpwZWcubGliLCA7Ci0JZGVsIGNqcGVnLmxzdAotCi1kanBlZy5leGU6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCi0JZWNobyAkKERPQkpFQ1RTKSA+ZGpwZWcubHN0Ci0JbGluayAvU1RBQ0s6NDA5NiAvRVhFUEFDSyBAZGpwZWcubHN0LCBkanBlZy5leGUsICwgbGlianBlZy5saWIsIDsKLQlkZWwgZGpwZWcubHN0Ci0KLWpwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCi0JbGluayAvU1RBQ0s6NDA5NiAvRVhFUEFDSyAkKFRST0JKRUNUUyksIGpwZWd0cmFuLmV4ZSwgLCBsaWJqcGVnLmxpYiwgOwotCi1yZGpwZ2NvbS5leGU6IHJkanBnY29tLmMKLQkkKENDKSAtQVMgLU8gLVczIHJkanBnY29tLmMKLQotIyB3cmpwZ2NvbSBuZWVkcyBsYXJnZSBtb2RlbCBzbyBpdCBjYW4gbWFsbG9jIGEgNjRLIGNodW5rCi13cmpwZ2NvbS5leGU6IHdyanBnY29tLmMKLQkkKENDKSAtQUwgLU8gLVczIHdyanBnY29tLmMKLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLWNsZWFuOgotCWRlbCAqLm9iagotCWRlbCBsaWJqcGVnLmxpYgotCWRlbCBjanBlZy5leGUKLQlkZWwgZGpwZWcuZXhlCi0JZGVsIGpwZWd0cmFuLmV4ZQotCWRlbCByZGpwZ2NvbS5leGUKLQlkZWwgd3JqcGdjb20uZXhlCi0JZGVsIHRlc3RvdXQqLioKLQotdGVzdDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUKLQlkZWwgdGVzdG91dCouKgotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZwotCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZwotCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotCWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWZjIC9iIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JZmMgL2IgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQlmYyAvYiB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JZmMgL2IgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotCi0KLWpjYXBpbWluLm9iajogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm9iajogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm9iajogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29sb3Iub2JqOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2RjdG1nci5vYmo6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQub2JqOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm9iajogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm9iajogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm9iajogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkub2JqOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm9iajogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vYmo6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm9iajogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm9iajogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjdHJhbnMub2JqOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vYmo6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vYmo6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vYmo6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm9iajogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3Qub2JqOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vYmo6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkZGN0bWdyLm9iajogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYub2JqOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkaW5wdXQub2JqOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC5vYmo6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vYmo6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hc3Rlci5vYmo6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLm9iajogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vYmo6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm9iajogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm9iajogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkdHJhbnMub2JqOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3Iub2JqOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi1qZmRjdGZsdC5vYmo6IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3Rmc3Qub2JqOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0aW50Lm9iajogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZsdC5vYmo6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3Rmc3Qub2JqOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0aW50Lm9iajogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vYmo6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vYmo6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpxdWFudDIub2JqOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMub2JqOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iub2JqOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWFuc2kub2JqOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLm9iajogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vYmo6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWRvcy5vYmo6IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm9iajogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm9iajogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotZGpwZWcub2JqOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi5vYmo6IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ub2JqOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi13cmpwZ2NvbS5vYmo6IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy5vYmo6IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAub2JqOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRzd2l0Y2gub2JqOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAub2JqOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vYmo6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnBwbS5vYmo6IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi5vYmo6IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vYmo6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHRhcmdhLm9iajogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS5vYmo6IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm9iajogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyYm1wLm9iajogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLm9iajogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm9iajogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLWptZW1kb3NhLm9iaiA6IGptZW1kb3NhLmFzbQotCW1hc20gL214ICQqOwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvbWFrZWZpbGUubW1zIGIvbGlianBlZ3R3cnAvbWFrZWZpbGUubW1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjEzMGU1Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLm1tcworKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLQotIyBUaGlzIG1ha2VmaWxlIGlzIGZvciB1c2Ugd2l0aCBNTVMgb24gRGlnaXRhbCBWTVMgc3lzdGVtcy4KLSMgVGhhbmtzIHRvIFJpY2sgRHlzb24gKGR5c29uQGlvd2FzcC5waHlzaWNzLnVpb3dhLmVkdSkKLSMgYW5kIFRpbSBCZWxsICh0YmVsbEBuZXRjb20uY29tKSBmb3IgdGhlaXIgaGVscC4KLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAiTU1TIiAhIQotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKLUNGTEFHUz0gJChDRkxBR1MpIC9Ob0RlYnVnIC9PcHRpbWl6ZQotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAvRGVmaW5lIHN3aXRjaGVzIGhlcmUuCi0uaWZkZWYgQUxQSEEKLU9QVD0KLS5lbHNlCi1PUFQ9ICxTeXMkRGlzazpbXU1BS1ZNUy5PUFQvT3B0aW9uCi0uZW5kaWYKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLiAgRm9yIFVuaXggdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgbWF5IHdhbnQKLSMgdG8gdXNlIGptZW1hbnNpLm8gb3Igam1lbW5hbWUubyBpZiB5b3UgaGF2ZSBsaW1pdGVkIHN3YXAgc3BhY2UuCi1TWVNERVBNRU09IGptZW1ub2JzLm9iagotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBqZGF0YWRzdC5vYmogXAotICAgICAgICBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIGpjcHJlcGN0Lm9iaiBcCi0gICAgICAgIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBqY3BodWZmLm9iaiBcCi0gICAgICAgIGpjZGN0bWdyLm9iaiBqZmRjdGZzdC5vYmogamZkY3RmbHQub2JqIGpmZGN0aW50Lm9iagotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogXAotICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRwaHVmZi5vYmogXAotICAgICAgICBqZG1haW5jdC5vYmogamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqIFwKLSAgICAgICAgamlkY3RmbHQub2JqIGppZGN0aW50Lm9iaiBqaWRjdHJlZC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqIFwKLSAgICAgICAganF1YW50MS5vYmoganF1YW50Mi5vYmogamRtZXJnZS5vYmoKLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcub2xiCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcub2JqIHJkcHBtLm9iaiByZGdpZi5vYmogcmR0YXJnYS5vYmogcmRybGUub2JqIHJkYm1wLm9iaiBcCi0gICAgICAgIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqCi1ET0JKRUNUUz0gZGpwZWcub2JqIHdycHBtLm9iaiB3cmdpZi5vYmogd3J0YXJnYS5vYmogd3JybGUub2JqIHdyYm1wLm9iaiBcCi0gICAgICAgIHJkY29sbWFwLm9iaiBjZGpwZWcub2JqCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm9iaiByZHN3aXRjaC5vYmogY2RqcGVnLm9iaiB0cmFuc3VwcC5vYmoKLSMgb2JqZWN0ZmlsZSBsaXN0cyB3aXRoIGNvbW1hcyAtLS0gd2hhdCBhIGNyb2NrCi1DT0JKTElTVD0gY2pwZWcub2JqLHJkcHBtLm9iaixyZGdpZi5vYmoscmR0YXJnYS5vYmoscmRybGUub2JqLHJkYm1wLm9iaixcCi0gICAgICAgICAgcmRzd2l0Y2gub2JqLGNkanBlZy5vYmoKLURPQkpMSVNUPSBkanBlZy5vYmosd3JwcG0ub2JqLHdyZ2lmLm9iaix3cnRhcmdhLm9iaix3cnJsZS5vYmosd3JibXAub2JqLFwKLSAgICAgICAgICByZGNvbG1hcC5vYmosY2RqcGVnLm9iagotVFJPQkpMSVNUPSBqcGVndHJhbi5vYmoscmRzd2l0Y2gub2JqLGNkanBlZy5vYmosdHJhbnN1cHAub2JqCi1MSUJPQkpMSVNUPSBqY2FwaW1pbi5vYmosamNhcGlzdGQub2JqLGpjdHJhbnMub2JqLGpjcGFyYW0ub2JqLGpkYXRhZHN0Lm9iaixcCi0gICAgICAgICAgamNpbml0Lm9iaixqY21hc3Rlci5vYmosamNtYXJrZXIub2JqLGpjbWFpbmN0Lm9iaixqY3ByZXBjdC5vYmosXAotICAgICAgICAgIGpjY29lZmN0Lm9iaixqY2NvbG9yLm9iaixqY3NhbXBsZS5vYmosamNodWZmLm9iaixqY3BodWZmLm9iaixcCi0gICAgICAgICAgamNkY3RtZ3Iub2JqLGpmZGN0ZnN0Lm9iaixqZmRjdGZsdC5vYmosamZkY3RpbnQub2JqLGpkYXBpbWluLm9iaixcCi0gICAgICAgICAgamRhcGlzdGQub2JqLGpkdHJhbnMub2JqLGpkYXRhc3JjLm9iaixqZG1hc3Rlci5vYmosamRpbnB1dC5vYmosXAotICAgICAgICAgIGpkbWFya2VyLm9iaixqZGh1ZmYub2JqLGpkcGh1ZmYub2JqLGpkbWFpbmN0Lm9iaixqZGNvZWZjdC5vYmosXAotICAgICAgICAgIGpkcG9zdGN0Lm9iaixqZGRjdG1nci5vYmosamlkY3Rmc3Qub2JqLGppZGN0Zmx0Lm9iaixqaWRjdGludC5vYmosXAotICAgICAgICAgIGppZGN0cmVkLm9iaixqZHNhbXBsZS5vYmosamRjb2xvci5vYmosanF1YW50MS5vYmosanF1YW50Mi5vYmosXAotICAgICAgICAgIGpkbWVyZ2Uub2JqLGpjb21hcGkub2JqLGp1dGlscy5vYmosamVycm9yLm9iaixqbWVtbWdyLm9iaiwkKFNZU0RFUE1FTSkKLQotCi0uZmlyc3QKLQlALSBEZWZpbmUgL05vTG9nIFN5cyBTeXMkTGlicmFyeQotCi1BTEwgOiBsaWJqcGVnLm9sYiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCi0JQCBDb250aW51ZQotCi1saWJqcGVnLm9sYiA6ICQoTElCT0JKRUNUUykKLQlMaWJyYXJ5IC9DcmVhdGUgbGlianBlZy5vbGIgJChMSUJPQkpMSVNUKQotCi1janBlZy5leGUgOiAkKENPQkpFQ1RTKSBsaWJqcGVnLm9sYgotCSQoTElOSykgJChMRkxBR1MpIC9FeGVjdXRhYmxlID0gY2pwZWcuZXhlICQoQ09CSkxJU1QpLGxpYmpwZWcub2xiL0xpYnJhcnkkKE9QVCkKLQotZGpwZWcuZXhlIDogJChET0JKRUNUUykgbGlianBlZy5vbGIKLQkkKExJTkspICQoTEZMQUdTKSAvRXhlY3V0YWJsZSA9IGRqcGVnLmV4ZSAkKERPQkpMSVNUKSxsaWJqcGVnLm9sYi9MaWJyYXJ5JChPUFQpCi0KLWpwZWd0cmFuLmV4ZSA6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLm9sYgotCSQoTElOSykgJChMRkxBR1MpIC9FeGVjdXRhYmxlID0ganBlZ3RyYW4uZXhlICQoVFJPQkpMSVNUKSxsaWJqcGVnLm9sYi9MaWJyYXJ5JChPUFQpCi0KLXJkanBnY29tLmV4ZSA6IHJkanBnY29tLm9iagotCSQoTElOSykgJChMRkxBR1MpIC9FeGVjdXRhYmxlID0gcmRqcGdjb20uZXhlIHJkanBnY29tLm9iaiQoT1BUKQotCi13cmpwZ2NvbS5leGUgOiB3cmpwZ2NvbS5vYmoKLQkkKExJTkspICQoTEZMQUdTKSAvRXhlY3V0YWJsZSA9IHdyanBnY29tLmV4ZSB3cmpwZ2NvbS5vYmokKE9QVCkKLQotamNvbmZpZy5oIDogamNvbmZpZy52bXMKLQlALSBDb3B5IGpjb25maWcudm1zIGpjb25maWcuaAotCi1jbGVhbiA6Ci0JQC0gU2V0IFByb3RlY3Rpb24gPSBPd25lcjpSV0VEICouKjstMQotCUAtIFNldCBQcm90ZWN0aW9uID0gT3duZXI6UldFRCAqLk9CSgotCS0gUHVyZ2UgL05vTG9nIC9Ob0NvbmZpcm0gKi4qCi0JLSBEZWxldGUgL05vTG9nIC9Ob0NvbmZpcm0gKi5PQko7Ci0KLXRlc3QgOiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZQotCW1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gdGVzdG9yaWcuanBnCi0JbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCB0ZXN0b3JpZy5qcGcKLQltY3Igc3lzJGRpc2s6W11janBlZyAtZGN0IGludCAgICAgIC1vdXRmaWxlIHRlc3RvdXQuanBnIHRlc3RpbWcucHBtCi0JbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCi0JbWNyIHN5cyRkaXNrOltdY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0JbWNyIHN5cyRkaXNrOltdanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZwotCS0gQmFja3VwIC9Db21wYXJlL0xvZwkgIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCi0JLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCS0gQmFja3VwIC9Db21wYXJlL0xvZwkgIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQotCS0gQmFja3VwIC9Db21wYXJlL0xvZwkgIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0KLQotamNhcGltaW4ub2JqIDogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm9iaiA6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vYmogOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci5vYmogOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2RjdG1nci5vYmogOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vYmogOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjaW5pdC5vYmogOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm9iaiA6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vYmogOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXN0ZXIub2JqIDogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkub2JqIDogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vYmogOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLm9iaiA6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm9iaiA6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vYmogOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamN0cmFucy5vYmogOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vYmogOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQub2JqIDogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0Lm9iaiA6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm9iaiA6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm9iaiA6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLm9iaiA6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkZGN0bWdyLm9iaiA6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm9iaiA6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC5vYmogOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC5vYmogOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIub2JqIDogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFzdGVyLm9iaiA6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLm9iaiA6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYub2JqIDogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRwb3N0Y3Qub2JqIDogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm9iaiA6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHRyYW5zLm9iaiA6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vYmogOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi1qZmRjdGZsdC5vYmogOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0ZnN0Lm9iaiA6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3RpbnQub2JqIDogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZsdC5vYmogOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0ZnN0Lm9iaiA6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RpbnQub2JqIDogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vYmogOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEub2JqIDoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanF1YW50Mi5vYmogOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMub2JqIDoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm9iaiA6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtYW5zaS5vYmogOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLm9iaiA6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMub2JqIDogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtZG9zLm9iaiA6IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm9iaiA6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vYmogOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1kanBlZy5vYmogOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi5vYmogOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm9iaiA6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLXdyanBnY29tLm9iaiA6IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy5vYmogOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm9iaiA6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHN3aXRjaC5vYmogOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAub2JqIDogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ub2JqIDogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycHBtLm9iaiA6IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi5vYmogOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYub2JqIDogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkdGFyZ2Eub2JqIDogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS5vYmogOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vYmogOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JibXAub2JqIDogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLm9iaiA6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vYmogOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvbWFrZWZpbGUuc2FzIGIvbGlianBlZ3R3cnAvbWFrZWZpbGUuc2FzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjk2ZmFmLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLnNhcworKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLQotIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBBbWlnYSBzeXN0ZW1zIHVzaW5nIFNBUyBDIDYuMCBhbmQgdXAuCi0jIFRoYW5rcyB0byBFZCBIYW53YXksIE1hcmsgUmluZnJldCwgYW5kIEppbSBaZXBlZGEuCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCi0KLSMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgotQ0M9IHNjCi0KLSMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgotIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyBmb3IgZ2VuZXJpYyA2ODB4MCB2ZXJzaW9uCi1BUkNIRkxBR1M9IGNwdT1hbnkKLVNVRkZJWD0KLQotIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyBmb3IgNjgwMzAtb25seSB2ZXJzaW9uCi0jQVJDSEZMQUdTPSBjcHU9NjgwMzAKLSNTVUZGSVg9LjAzMAotCi1DRkxBR1M9IG5vc3RhY2tjaGVjayBkYXRhPW5lYXIgcGFybXM9cmVnaXN0ZXIgb3B0aW1pemUgJChBUkNIRkxBR1MpIFwKLQlpZ25vcmU9MTA0IGlnbm9yZT0zMDQgaWdub3JlPTMwNgotIyBpZ25vcmU9MTA0IGRpc2FibGVzIHdhcm5pbmdzIGZvciBtaXNtYXRjaGVkIGNvbnN0IHF1YWxpZmllcnMKLSMgaWdub3JlPTMwNCBkaXNhYmxlcyB3YXJuaW5ncyBmb3IgdmFyaWFibGVzIGJlaW5nIG9wdGltaXplZCBvdXQKLSMgaWdub3JlPTMwNiBkaXNhYmxlcyB3YXJuaW5ncyBmb3IgdGhlIGlubGluaW5nIG9mIGZ1bmN0aW9ucwotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSBkZWZpbmUgc3dpdGNoZXMgaGVyZS4KLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLUxERkxBR1M9IFNDIFNEIE5EIEJBVENICi0KLSMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IGNvbW1hbmRzIGhlcmUuCi1MRExJQlM9IExJQjpzY20ubGliIExJQjpzYy5saWIKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLiAgRm9yIEFtaWdhIHdlIHJlY29tbWVuZCBqbWVtbmFtZS5vLgotU1lTREVQTUVNPSBqbWVtbmFtZS5vCi0KLSMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKLSMgbGlua2VyCi1MTj0gc2xpbmsKLSMgZmlsZSBkZWxldGlvbiBjb21tYW5kCi1STT0gZGVsZXRlIHF1aWV0Ci0jIGxpYnJhcnkgKC5saWIpIGZpbGUgY3JlYXRpb24gY29tbWFuZAotQVI9IG9tbAotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAotICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKLSAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIGpmZGN0Zmx0Lm8gXAotICAgICAgICBqZmRjdGludC5vCi0jIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCi0gICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAotICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCi0gICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCi0jIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCi0gICAgICAgIGNkanBlZy5vCi1ET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLVRST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KLQotCi1hbGw6IGxpYmpwZWcubGliIGNqcGVnJChTVUZGSVgpIGRqcGVnJChTVUZGSVgpIGpwZWd0cmFuJChTVUZGSVgpIHJkanBnY29tJChTVUZGSVgpIHdyanBnY29tJChTVUZGSVgpCi0KLSMgbm90ZTogZG8gc2V2ZXJhbCBBUiBzdGVwcyB0byBhdm9pZCBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0YXRpb25zCi0KLWxpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpCi0JLSQoUk0pIGxpYmpwZWcubGliCi0JJChBUikgbGlianBlZy5saWIgciAkKENMSUJPQkpFQ1RTKQotCSQoQVIpIGxpYmpwZWcubGliIHIgJChETElCT0JKRUNUUykKLQkkKEFSKSBsaWJqcGVnLmxpYiByICQoQ09NT0JKRUNUUykKLQotY2pwZWckKFNVRkZJWCk6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCi0JJChMTikgPFdJVEggPAotJChMREZMQUdTKQotVE8gY2pwZWckKFNVRkZJWCkKLUZST00gTElCOmMubyAkKENPQkpFQ1RTKQotTElCIGxpYmpwZWcubGliICQoTERMSUJTKQotPAotCi1kanBlZyQoU1VGRklYKTogJChET0JKRUNUUykgbGlianBlZy5saWIKLQkkKExOKSA8V0lUSCA8Ci0kKExERkxBR1MpCi1UTyBkanBlZyQoU1VGRklYKQotRlJPTSBMSUI6Yy5vICQoRE9CSkVDVFMpCi1MSUIgbGlianBlZy5saWIgJChMRExJQlMpCi08Ci0KLWpwZWd0cmFuJChTVUZGSVgpOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKLQkkKExOKSA8V0lUSCA8Ci0kKExERkxBR1MpCi1UTyBqcGVndHJhbiQoU1VGRklYKQotRlJPTSBMSUI6Yy5vICQoVFJPQkpFQ1RTKQotTElCIGxpYmpwZWcubGliICQoTERMSUJTKQotPAotCi1yZGpwZ2NvbSQoU1VGRklYKTogcmRqcGdjb20ubwotCSQoTE4pIDxXSVRIIDwKLSQoTERGTEFHUykKLVRPIHJkanBnY29tJChTVUZGSVgpCi1GUk9NIExJQjpjLm8gcmRqcGdjb20ubwotTElCICQoTERMSUJTKQotPAotCi13cmpwZ2NvbSQoU1VGRklYKTogd3JqcGdjb20ubwotCSQoTE4pIDxXSVRIIDwKLSQoTERGTEFHUykKLVRPIHdyanBnY29tJChTVUZGSVgpCi1GUk9NIExJQjpjLm8gd3JqcGdjb20ubwotTElCICQoTERMSUJTKQotPAotCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCi0JZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KLQlleGl0IDEKLQotY2xlYW46Ci0JLSQoUk0pICoubyBjanBlZyBkanBlZyBqcGVndHJhbiBjanBlZy4wMzAgZGpwZWcuMDMwIGpwZWd0cmFuLjAzMAotCS0kKFJNKSByZGpwZ2NvbSB3cmpwZ2NvbSByZGpwZ2NvbS4wMzAgd3JqcGdjb20uMDMwCi0JLSQoUk0pIGxpYmpwZWcubGliIGNvcmUgdGVzdG91dCouKgotCi10ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgotCS0kKFJNKSB0ZXN0b3V0Ki4qCi0JZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCi0JZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCi0JY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCi0JZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCi0JY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0JanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZwotCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWNtcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWNtcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQljbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWNtcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0KLQotamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi1qZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1kanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLXdyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvbWFrZWZpbGUudW5peCBiL2xpYmpwZWd0d3JwL21ha2VmaWxlLnVuaXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDU1YWIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvbWFrZWZpbGUudW5peAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLQotIyBUaGlzIG1ha2VmaWxlIGlzIHN1aXRhYmxlIGZvciBVbml4LWxpa2Ugc3lzdGVtcyB3aXRoIG5vbi1BTlNJIGNvbXBpbGVycy4KLSMgSWYgeW91IGhhdmUgYW4gQU5TSSBjb21waWxlciwgbWFrZWZpbGUuYW5zaSBpcyBhIGJldHRlciBzdGFydGluZyBwb2ludC4KLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKLQotIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6Ci1DQz0gY2MKLQotIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6Ci1DRkxBR1M9IC1PCi0jIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAotIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCi0jIEhvd2V2ZXIsIGFueSBzcGVjaWFsIGRlZmluZXMgZm9yIGFuc2kya25yLmMgbWF5IGJlIGluY2x1ZGVkIGhlcmU6Ci1BTlNJMktOUkZMQUdTPSAKLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLUxERkxBR1M9IAotCi0jIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSAtbCBjb21tYW5kcyBoZXJlLgotTERMSUJTPSAKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLiAgRm9yIFVuaXggdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgbWF5IHdhbnQKLSMgdG8gdXNlIGptZW1hbnNpLm8gb3Igam1lbW5hbWUubyBpZiB5b3UgaGF2ZSBsaW1pdGVkIHN3YXAgc3BhY2UuCi1TWVNERVBNRU09IGptZW1ub2JzLm8KLQotIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgotIyBsaW5rZXIKLUxOPSAkKENDKQotIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKLVJNPSBybSAtZgotIyBmaWxlIHJlbmFtZSBjb21tYW5kCi1NVj0gbXYKLSMgbGlicmFyeSAoLmEpIGZpbGUgY3JlYXRpb24gY29tbWFuZAotQVI9IGFyIHJjCi0jIHNlY29uZCBzdGVwIGluIC5hIGNyZWF0aW9uICh1c2UgInRvdWNoIiBpZiBub3QgbmVlZGVkKQotQVIyPSByYW5saWIKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKLSAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCi0gICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZkY3RpbnQubwotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkdHJhbnMubyBqZGF0YXNyYy5vIGpkbWFzdGVyLm8gXAotICAgICAgICBqZGlucHV0Lm8gamRtYXJrZXIubyBqZGh1ZmYubyBqZHBodWZmLm8gamRtYWluY3QubyBqZGNvZWZjdC5vIFwKLSAgICAgICAgamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBqaWRjdGludC5vIGppZGN0cmVkLm8gXAotICAgICAgICBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIGpkbWVyZ2UubwotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5hCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcubyByZHBwbS5vIHJkZ2lmLm8gcmR0YXJnYS5vIHJkcmxlLm8gcmRibXAubyByZHN3aXRjaC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLURPQkpFQ1RTPSBkanBlZy5vIHdycHBtLm8gd3JnaWYubyB3cnRhcmdhLm8gd3JybGUubyB3cmJtcC5vIHJkY29sbWFwLm8gXAotICAgICAgICBjZGpwZWcubwotVFJPQkpFQ1RTPSBqcGVndHJhbi5vIHJkc3dpdGNoLm8gY2RqcGVnLm8gdHJhbnN1cHAubwotCi0KLWFsbDogYW5zaTJrbnIgbGlianBlZy5hIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCi0KLSMgVGhpcyBydWxlIGNhdXNlcyBhbnNpMmtuciB0byBiZSBpbnZva2VkLgotLmMubzoKLQkuL2Fuc2kya25yICQqLmMgVCQqLmMKLQkkKENDKSAkKENGTEFHUykgLWMgVCQqLmMKLQkkKFJNKSBUJCouYyAkKi5vCi0JJChNVikgVCQqLm8gJCoubwotCi1hbnNpMmtucjogYW5zaTJrbnIuYwotCSQoQ0MpICQoQ0ZMQUdTKSAkKEFOU0kyS05SRkxBR1MpIC1vIGFuc2kya25yIGFuc2kya25yLmMKLQotbGlianBlZy5hOiBhbnNpMmtuciAkKExJQk9CSkVDVFMpCi0JJChSTSkgbGlianBlZy5hCi0JJChBUikgbGlianBlZy5hICAkKExJQk9CSkVDVFMpCi0JJChBUjIpIGxpYmpwZWcuYQotCi1janBlZzogYW5zaTJrbnIgJChDT0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBjanBlZyAkKENPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLWRqcGVnOiBhbnNpMmtuciAkKERPQkpFQ1RTKSBsaWJqcGVnLmEKLQkkKExOKSAkKExERkxBR1MpIC1vIGRqcGVnICQoRE9CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKLQotanBlZ3RyYW46IGFuc2kya25yICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEKLQkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLXJkanBnY29tOiByZGpwZ2NvbS5vCi0JJChMTikgJChMREZMQUdTKSAtbyByZGpwZ2NvbSByZGpwZ2NvbS5vICQoTERMSUJTKQotCi13cmpwZ2NvbTogd3JqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20gd3JqcGdjb20ubyAkKExETElCUykKLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLWNsZWFuOgotCSQoUk0pICoubyBjanBlZyBkanBlZyBqcGVndHJhbiBsaWJqcGVnLmEgcmRqcGdjb20gd3JqcGdjb20KLQkkKFJNKSBhbnNpMmtuciBjb3JlIHRlc3RvdXQqCi0KLXRlc3Q6IGNqcGVnIGRqcGVnIGpwZWd0cmFuCi0JJChSTSkgdGVzdG91dCoKLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZwotCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCi0JLi9janBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCS4vY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0JLi9qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0JY21wIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCi0JY21wIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JY21wIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JY21wIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQotCWNtcCB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JY21wIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotCi1qY2FwaW1pbi5vOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQubzogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3QubzogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMubzogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3QubzogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3IubzogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRkY3RtZ3IubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2UubzogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkdHJhbnMubzogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm86IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLWpmZGN0Zmx0Lm86IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3Rmc3QubzogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC5vOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iubzogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm86IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUubzogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mubzogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMubzogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm86IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm86IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm86IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ubzogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ubzogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm86IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAubzogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm86IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ubzogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm86IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm86IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm86IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUubzogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm86IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtlZmlsZS52YyBiL2xpYmpwZWd0d3JwL21ha2VmaWxlLnZjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWNmMDY5Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLnZjCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotCi0jIFRoaXMgbWFrZWZpbGUgaXMgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIG9uIFdpbmRvd3MgTlQgKGFuZCA5NT8pLgotIyBJdCBidWlsZHMgdGhlIElKRyBsaWJyYXJ5IGFzIGEgc3RhdGljYWxseSBsaW5rYWJsZSBsaWJyYXJ5ICguTElCKSwKLSMgYW5kIGJ1aWxkcyB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBhcyBjb25zb2xlLW1vZGUgYXBwcy4KLSMgVGhhbmtzIHRvIFhpbmdvbmcgQ2hhbmcsIFJheW1vbmQgRXZlcmx5IGFuZCBvdGhlcnMuCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm5tYWtlIiAhIQotIyBUbyBidWlsZCBhbiBvcHRpbWl6ZWQgbGlicmFyeSB3aXRob3V0IGRlYnVnIGluZm8sIHNheSAibm1ha2Ugbm9kZWJ1Zz0xIi4KLQotIyBQdWxsIGluIHN0YW5kYXJkIHZhcmlhYmxlIGRlZmluaXRpb25zCi0haW5jbHVkZSA8d2luMzIubWFrPgotCi0jIFlvdSBtYXkgd2FudCB0byBhZGp1c3QgdGhlc2UgY29tcGlsZXIgb3B0aW9uczoKLUNGTEFHUz0gJChjZmxhZ3MpICQoY2RlYnVnKSAkKGN2YXJzKSAtSS4KLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KLQotIyBMaW5rLXRpbWUgb3B0aW9uczoKLUxERkxBR1M9ICQobGRlYnVnKSAkKGNvbmxmbGFncykKLQotIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgY29tbWFuZHMgaGVyZS4KLUxETElCUz0gJChjb25saWJzKQotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuICBGb3IgTlQgd2Ugc3VnZ2VzdCBqbWVtbm9icy5vYmosIHdoaWNoIGV4cGVjdHMgdGhlIE9TIHRvCi0jIHByb3ZpZGUgYWRlcXVhdGUgdmlydHVhbCBtZW1vcnkuCi1TWVNERVBNRU09IGptZW1ub2JzLm9iagotCi0jIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCi0jIGZpbGUgZGVsZXRpb24gY29tbWFuZAotUk09IGRlbAotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBqZGF0YWRzdC5vYmogXAotICAgICAgICBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIGpjcHJlcGN0Lm9iaiBcCi0gICAgICAgIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBqY3BodWZmLm9iaiBcCi0gICAgICAgIGpjZGN0bWdyLm9iaiBqZmRjdGZzdC5vYmogamZkY3RmbHQub2JqIGpmZGN0aW50Lm9iagotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogXAotICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRwaHVmZi5vYmogXAotICAgICAgICBqZG1haW5jdC5vYmogamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqIFwKLSAgICAgICAgamlkY3RmbHQub2JqIGppZGN0aW50Lm9iaiBqaWRjdHJlZC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqIFwKLSAgICAgICAganF1YW50MS5vYmoganF1YW50Mi5vYmogamRtZXJnZS5vYmoKLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcub2JqIHJkcHBtLm9iaiByZGdpZi5vYmogcmR0YXJnYS5vYmogcmRybGUub2JqIHJkYm1wLm9iaiBcCi0gICAgICAgIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqCi1ET0JKRUNUUz0gZGpwZWcub2JqIHdycHBtLm9iaiB3cmdpZi5vYmogd3J0YXJnYS5vYmogd3JybGUub2JqIHdyYm1wLm9iaiBcCi0gICAgICAgIHJkY29sbWFwLm9iaiBjZGpwZWcub2JqCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm9iaiByZHN3aXRjaC5vYmogY2RqcGVnLm9iaiB0cmFuc3VwcC5vYmoKLQotIyBUZW1wbGF0ZSBjb21tYW5kIGZvciBjb21waWxpbmcgLmMgdG8gLm9iagotLmMub2JqOgotCSQoY2MpICQoQ0ZMQUdTKSAkKi5jCi0KLQotYWxsOiBsaWJqcGVnLmxpYiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCi0KLWxpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpCi0JJChSTSkgbGlianBlZy5saWIKLQlsaWIgLW91dDpsaWJqcGVnLmxpYiAgJChMSUJPQkpFQ1RTKQotCi1janBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCi0JJChsaW5rKSAkKExERkxBR1MpIC1vdXQ6Y2pwZWcuZXhlICQoQ09CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQotCi1kanBlZy5leGU6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCi0JJChsaW5rKSAkKExERkxBR1MpIC1vdXQ6ZGpwZWcuZXhlICQoRE9CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQotCi1qcGVndHJhbi5leGU6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQobGluaykgJChMREZMQUdTKSAtb3V0OmpwZWd0cmFuLmV4ZSAkKFRST0JKRUNUUykgbGlianBlZy5saWIgJChMRExJQlMpCi0KLXJkanBnY29tLmV4ZTogcmRqcGdjb20ub2JqCi0JJChsaW5rKSAkKExERkxBR1MpIC1vdXQ6cmRqcGdjb20uZXhlIHJkanBnY29tLm9iaiAkKExETElCUykKLQotd3JqcGdjb20uZXhlOiB3cmpwZ2NvbS5vYmoKLQkkKGxpbmspICQoTERGTEFHUykgLW91dDp3cmpwZ2NvbS5leGUgd3JqcGdjb20ub2JqICQoTERMSUJTKQotCi0KLWNsZWFuOgotCSQoUk0pICoub2JqICouZXhlIGxpYmpwZWcubGliCi0JJChSTSkgdGVzdG91dCoKLQotdGVzdDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUKLQkkKFJNKSB0ZXN0b3V0KgotCS5cZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCi0JLlxkanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKLQkuXGNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQotCS5cZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCi0JLlxjanBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KLQkuXGpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWZjIC9iIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JZmMgL2IgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQlmYyAvYiB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JZmMgL2IgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotCi0KLWpjYXBpbWluLm9iajogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm9iajogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm9iajogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29sb3Iub2JqOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2RjdG1nci5vYmo6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQub2JqOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm9iajogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm9iajogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm9iajogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkub2JqOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm9iajogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vYmo6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm9iajogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm9iajogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjdHJhbnMub2JqOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vYmo6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vYmo6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vYmo6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm9iajogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3Qub2JqOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vYmo6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkZGN0bWdyLm9iajogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYub2JqOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkaW5wdXQub2JqOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC5vYmo6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vYmo6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hc3Rlci5vYmo6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLm9iajogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vYmo6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm9iajogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm9iajogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkdHJhbnMub2JqOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3Iub2JqOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi1qZmRjdGZsdC5vYmo6IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3Rmc3Qub2JqOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0aW50Lm9iajogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZsdC5vYmo6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3Rmc3Qub2JqOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0aW50Lm9iajogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vYmo6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vYmo6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpxdWFudDIub2JqOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMub2JqOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iub2JqOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWFuc2kub2JqOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLm9iajogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vYmo6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWRvcy5vYmo6IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm9iajogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm9iajogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotZGpwZWcub2JqOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi5vYmo6IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ub2JqOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi13cmpwZ2NvbS5vYmo6IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy5vYmo6IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAub2JqOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRzd2l0Y2gub2JqOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAub2JqOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vYmo6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnBwbS5vYmo6IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi5vYmo6IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vYmo6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHRhcmdhLm9iajogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS5vYmo6IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm9iajogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyYm1wLm9iajogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLm9iajogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm9iajogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLnZtcyBiL2xpYmpwZWd0d3JwL21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyMzU4ZC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotJCEgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotJCEKLSQhIFRoaXMgaXMgYSBjb21tYW5kIHByb2NlZHVyZSBmb3IgRGlnaXRhbCBWTVMgc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlIE1NUy4KLSQhIEl0IGJ1aWxkcyB0aGUgSlBFRyBzb2Z0d2FyZSBieSBicnV0ZSBmb3JjZSwgcmVjb21waWxpbmcgZXZlcnl0aGluZyB3aGV0aGVyCi0kISBvciBub3QgaXQgaXMgbmVjZXNzYXJ5LiAgSXQgdGhlbiBydW5zIHRoZSBiYXNpYyBzZWxmLXRlc3QuCi0kISBUaGFua3MgdG8gUmljayBEeXNvbiAoZHlzb25AaW93YXNwLnBoeXNpY3MudWlvd2EuZWR1KQotJCEgYW5kIFRpbSBCZWxsICh0YmVsbEBuZXRjb20uY29tKSBmb3IgdGhlaXIgaGVscC4KLSQhCi0kISBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHJ1bm5pbmcgdGhpcyEhCi0kIQotJCBJZiBGJE1vZGUgKCkgLmVxcy4gIklOVEVSQUNUSVZFIgotJCAgIFRoZW4KLSQgICAgICAgVkVSSUZZID0gRiRWZXJpZnkgKDApCi0kICAgRWxzZQotJCAgICAgICBWRVJJRlkgPSBGJFZlcmlmeSAoMSkKLSQgRW5kSWYKLSQgT24gQ29udHJvbF9ZIFRoZW4gR29UbyBFbmQKLSQgT24gRXJyb3IgICAgIFRoZW4gR29UbyBFbmQKLSQKLSQgSWYgRiRHZXRTeWkgKCJIV19NT0RFTCIpIC5ndC4gMTAyMyAKLSQgICBUaGVuCi0kICAgICAgIE9QVCA9ICIiCi0kICAgRWxzZQotJCAgICAgICBPUFQgPSAiLFN5cyREaXNrOltdbWFrdm1zLm9wdC9PcHRpb24iCi0kIEVuZElmCi0kIAotJCBEb0NvbXBpbGUgOj0gQ0MgL05vRGVidWcgL09wdGltaXplIC9Ob0xpc3QKLSQhCi0kIERvQ29tcGlsZSBqY2FwaW1pbi5jCi0kIERvQ29tcGlsZSBqY2FwaXN0ZC5jCi0kIERvQ29tcGlsZSBqY3RyYW5zLmMKLSQgRG9Db21waWxlIGpjcGFyYW0uYwotJCBEb0NvbXBpbGUgamRhdGFkc3QuYwotJCBEb0NvbXBpbGUgamNpbml0LmMKLSQgRG9Db21waWxlIGpjbWFzdGVyLmMKLSQgRG9Db21waWxlIGpjbWFya2VyLmMKLSQgRG9Db21waWxlIGpjbWFpbmN0LmMKLSQgRG9Db21waWxlIGpjcHJlcGN0LmMKLSQgRG9Db21waWxlIGpjY29lZmN0LmMKLSQgRG9Db21waWxlIGpjY29sb3IuYwotJCBEb0NvbXBpbGUgamNzYW1wbGUuYwotJCBEb0NvbXBpbGUgamNodWZmLmMKLSQgRG9Db21waWxlIGpjcGh1ZmYuYwotJCBEb0NvbXBpbGUgamNkY3RtZ3IuYwotJCBEb0NvbXBpbGUgamZkY3Rmc3QuYwotJCBEb0NvbXBpbGUgamZkY3RmbHQuYwotJCBEb0NvbXBpbGUgamZkY3RpbnQuYwotJCBEb0NvbXBpbGUgamRhcGltaW4uYwotJCBEb0NvbXBpbGUgamRhcGlzdGQuYwotJCBEb0NvbXBpbGUgamR0cmFucy5jCi0kIERvQ29tcGlsZSBqZGF0YXNyYy5jCi0kIERvQ29tcGlsZSBqZG1hc3Rlci5jCi0kIERvQ29tcGlsZSBqZGlucHV0LmMKLSQgRG9Db21waWxlIGpkbWFya2VyLmMKLSQgRG9Db21waWxlIGpkaHVmZi5jCi0kIERvQ29tcGlsZSBqZHBodWZmLmMKLSQgRG9Db21waWxlIGpkbWFpbmN0LmMKLSQgRG9Db21waWxlIGpkY29lZmN0LmMKLSQgRG9Db21waWxlIGpkcG9zdGN0LmMKLSQgRG9Db21waWxlIGpkZGN0bWdyLmMKLSQgRG9Db21waWxlIGppZGN0ZnN0LmMKLSQgRG9Db21waWxlIGppZGN0Zmx0LmMKLSQgRG9Db21waWxlIGppZGN0aW50LmMKLSQgRG9Db21waWxlIGppZGN0cmVkLmMKLSQgRG9Db21waWxlIGpkc2FtcGxlLmMKLSQgRG9Db21waWxlIGpkY29sb3IuYwotJCBEb0NvbXBpbGUganF1YW50MS5jCi0kIERvQ29tcGlsZSBqcXVhbnQyLmMKLSQgRG9Db21waWxlIGpkbWVyZ2UuYwotJCBEb0NvbXBpbGUgamNvbWFwaS5jCi0kIERvQ29tcGlsZSBqdXRpbHMuYwotJCBEb0NvbXBpbGUgamVycm9yLmMKLSQgRG9Db21waWxlIGptZW1tZ3IuYwotJCBEb0NvbXBpbGUgam1lbW5vYnMuYwotJCEKLSQgTGlicmFyeSAvQ3JlYXRlIGxpYmpwZWcub2xiICBqY2FwaW1pbi5vYmosamNhcGlzdGQub2JqLGpjdHJhbnMub2JqLCAtCi0gICAgICAgICAgamNwYXJhbS5vYmosamRhdGFkc3Qub2JqLGpjaW5pdC5vYmosamNtYXN0ZXIub2JqLGpjbWFya2VyLm9iaiwgLQotICAgICAgICAgIGpjbWFpbmN0Lm9iaixqY3ByZXBjdC5vYmosamNjb2VmY3Qub2JqLGpjY29sb3Iub2JqLGpjc2FtcGxlLm9iaiwgLQotICAgICAgICAgIGpjaHVmZi5vYmosamNwaHVmZi5vYmosamNkY3RtZ3Iub2JqLGpmZGN0ZnN0Lm9iaixqZmRjdGZsdC5vYmosIC0KLSAgICAgICAgICBqZmRjdGludC5vYmosamRhcGltaW4ub2JqLGpkYXBpc3RkLm9iaixqZHRyYW5zLm9iaixqZGF0YXNyYy5vYmosIC0KLSAgICAgICAgICBqZG1hc3Rlci5vYmosamRpbnB1dC5vYmosamRtYXJrZXIub2JqLGpkaHVmZi5vYmosamRwaHVmZi5vYmosIC0KLSAgICAgICAgICBqZG1haW5jdC5vYmosamRjb2VmY3Qub2JqLGpkcG9zdGN0Lm9iaixqZGRjdG1nci5vYmosamlkY3Rmc3Qub2JqLCAtCi0gICAgICAgICAgamlkY3RmbHQub2JqLGppZGN0aW50Lm9iaixqaWRjdHJlZC5vYmosamRzYW1wbGUub2JqLGpkY29sb3Iub2JqLCAtCi0gICAgICAgICAganF1YW50MS5vYmosanF1YW50Mi5vYmosamRtZXJnZS5vYmosamNvbWFwaS5vYmosanV0aWxzLm9iaiwgLQotICAgICAgICAgIGplcnJvci5vYmosam1lbW1nci5vYmosam1lbW5vYnMub2JqCi0kIQotJCBEb0NvbXBpbGUgY2pwZWcuYwotJCBEb0NvbXBpbGUgcmRwcG0uYwotJCBEb0NvbXBpbGUgcmRnaWYuYwotJCBEb0NvbXBpbGUgcmR0YXJnYS5jCi0kIERvQ29tcGlsZSByZHJsZS5jCi0kIERvQ29tcGlsZSByZGJtcC5jCi0kIERvQ29tcGlsZSByZHN3aXRjaC5jCi0kIERvQ29tcGlsZSBjZGpwZWcuYwotJCEKLSQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSBjanBlZy5leGUgIGNqcGVnLm9iaixyZHBwbS5vYmoscmRnaWYub2JqLCAtCi0gICAgICAgICAgcmR0YXJnYS5vYmoscmRybGUub2JqLHJkYm1wLm9iaixyZHN3aXRjaC5vYmosY2RqcGVnLm9iaixsaWJqcGVnLm9sYi9MaWJyYXJ5J09QVCcKLSQhCi0kIERvQ29tcGlsZSBkanBlZy5jCi0kIERvQ29tcGlsZSB3cnBwbS5jCi0kIERvQ29tcGlsZSB3cmdpZi5jCi0kIERvQ29tcGlsZSB3cnRhcmdhLmMKLSQgRG9Db21waWxlIHdycmxlLmMKLSQgRG9Db21waWxlIHdyYm1wLmMKLSQgRG9Db21waWxlIHJkY29sbWFwLmMKLSQgRG9Db21waWxlIGNkanBlZy5jCi0kIQotJCBMaW5rIC9Ob01hcCAvRXhlY3V0YWJsZSA9IGRqcGVnLmV4ZSAgZGpwZWcub2JqLHdycHBtLm9iaix3cmdpZi5vYmosIC0KLSAgICAgICAgICB3cnRhcmdhLm9iaix3cnJsZS5vYmosd3JibXAub2JqLHJkY29sbWFwLm9iaixjZGpwZWcub2JqLGxpYmpwZWcub2xiL0xpYnJhcnknT1BUJwotJCEKLSQgRG9Db21waWxlIGpwZWd0cmFuLmMKLSQgRG9Db21waWxlIHJkc3dpdGNoLmMKLSQgRG9Db21waWxlIGNkanBlZy5jCi0kIERvQ29tcGlsZSB0cmFuc3VwcC5jCi0kIQotJCBMaW5rIC9Ob01hcCAvRXhlY3V0YWJsZSA9IGpwZWd0cmFuLmV4ZSAganBlZ3RyYW4ub2JqLHJkc3dpdGNoLm9iaiwgLQotICAgICAgICAgIGNkanBlZy5vYmosdHJhbnN1cHAub2JqLGxpYmpwZWcub2xiL0xpYnJhcnknT1BUJwotJCEKLSQgRG9Db21waWxlIHJkanBnY29tLmMKLSQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSByZGpwZ2NvbS5leGUgIHJkanBnY29tLm9iaidPUFQnCi0kIQotJCBEb0NvbXBpbGUgd3JqcGdjb20uYwotJCBMaW5rIC9Ob01hcCAvRXhlY3V0YWJsZSA9IHdyanBnY29tLmV4ZSAgd3JqcGdjb20ub2JqJ09QVCcKLSQhCi0kISBSdW4gdGhlIHNlbGYtdGVzdAotJCEKLSQgbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSB0ZXN0b3JpZy5qcGcKLSQgbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCB0ZXN0b3JpZy5qcGcKLSQgbWNyIHN5cyRkaXNrOltdY2pwZWcgLWRjdCBpbnQgICAgICAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyB0ZXN0aW1nLnBwbQotJCBtY3Igc3lzJGRpc2s6W11kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKLSQgbWNyIHN5cyRkaXNrOltdY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0kIG1jciBzeXMkZGlzazpbXWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKLSQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotJCBCYWNrdXAgL0NvbXBhcmUvTG9nIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0kIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLSQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLSQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0kIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotJCEKLSRFbmQ6Ci0kICAgSWYgVmVyaWZ5IFRoZW4gU2V0IFZlcmlmeQotJCBFeGl0CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtlZmlsZS53YXQgYi9saWJqcGVndHdycC9tYWtlZmlsZS53YXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTNlNDYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvbWFrZWZpbGUud2F0CisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotCi0jIFRoaXMgbWFrZWZpbGUgaXMgc3VpdGFibGUgZm9yIFdhdGNvbSBDL0MrKyAxMC4wIG9uIE1TLURPUyAodXNpbmcKLSMgZG9zNGcgZXh0ZW5kZXIpLCBPUy8yLCBhbmQgV2luZG93cyBOVCBjb25zb2xlIG1vZGUuCi0jIFRoYW5rcyB0byBKYW5vcyBIYWlkZSwgamhhaWRlQGJ0cnZ0ZWNoLmNvbS4KLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAid21ha2UiICEhCi0KLSMgVW5jb21tZW50IGxpbmUgZm9yIGRlc2lyZWQgc3lzdGVtCi1TWVNURU09RE9TCi0jU1lTVEVNPU9TMgotI1NZU1RFTT1OVAotCi0jIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKLUNDPSB3Y2wzODYKLQotIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6Ci1DRkxBR1M9IC00ciAtb3J0IC13eCAtenEgLWJ0PSQoU1lTVEVNKQotIyBDYXV0aW9uOiBhdm9pZCAtb2wgb3IgLW94OyB0aGVzZSBnZW5lcmF0ZSBiYWQgY29kZSB3aXRoIDEwLjAgb3IgMTAuMGEuCi0jIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAotIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCi0KLSMgTGluay10aW1lIGNjIG9wdGlvbnM6Ci0haWZlcSBTWVNURU0gRE9TCi1MREZMQUdTPSAtenEgLWw9ZG9zNGcKLSFlbHNlIGlmZXEgU1lTVEVNIE9TMgotTERGTEFHUz0gLXpxIC1sPW9zMnYyCi0hZWxzZSBpZmVxIFNZU1RFTSBOVAotTERGTEFHUz0gLXpxIC1sPW50Ci0hZW5kaWYKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLiAgam1lbW5vYnMgc2hvdWxkIHdvcmsgZmluZSBmb3IgZG9zNGcgb3IgT1MvMiBlbnZpcm9ubWVudC4KLVNZU0RFUE1FTT0gam1lbW5vYnMub2JqCi0KLSMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgotCi0KLSMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyAmCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgJgotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgJgotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyAmCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jICYKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgJgotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jICYKLSAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwotIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKLVNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKLSMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KLUFQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyAmCi0gICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgJgotICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKLVNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCi0jIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oICYKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCi0jIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgJgotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgJgotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgJgotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgJgotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgJgotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zICYKLSAgICAgICAgbWFrdm1zLm9wdAotQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgJgotICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzICYKLSAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCi1URVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgJgotICAgICAgICB0ZXN0aW1ncC5qcGcKLURJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgJgotICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQotIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiAmCi0gICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqICYKLSAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqICYKLSAgICAgICAgamNkY3RtZ3Iub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogamZkY3RpbnQub2JqCi0jIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiAmCi0gICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiAmCi0gICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogJgotICAgICAgICBqaWRjdGZsdC5vYmogamlkY3RpbnQub2JqIGppZGN0cmVkLm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmogJgotICAgICAgICBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iagotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKLUxJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy5vYmogcmRwcG0ub2JqIHJkZ2lmLm9iaiByZHRhcmdhLm9iaiByZHJsZS5vYmogcmRibXAub2JqICYKLSAgICAgICAgcmRzd2l0Y2gub2JqIGNkanBlZy5vYmoKLURPQkpFQ1RTPSBkanBlZy5vYmogd3JwcG0ub2JqIHdyZ2lmLm9iaiB3cnRhcmdhLm9iaiB3cnJsZS5vYmogd3JibXAub2JqICYKLSAgICAgICAgcmRjb2xtYXAub2JqIGNkanBlZy5vYmoKLVRST0JKRUNUUz0ganBlZ3RyYW4ub2JqIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqIHRyYW5zdXBwLm9iagotCi0KLWFsbDogbGlianBlZy5saWIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQotCi1saWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQotCS0gZGVsIGxpYmpwZWcubGliCi0JKiB3bGliIC1uIGxpYmpwZWcubGliICQoTElCT0JKRUNUUykKLQotY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoQ0MpICQoTERGTEFHUykgJChDT0JKRUNUUykgbGlianBlZy5saWIKLQotZGpwZWcuZXhlOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoQ0MpICQoTERGTEFHUykgJChET0JKRUNUUykgbGlianBlZy5saWIKLQotanBlZ3RyYW4uZXhlOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKLQkkKENDKSAkKExERkxBR1MpICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCi1yZGpwZ2NvbS5leGU6IHJkanBnY29tLmMKLQkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSByZGpwZ2NvbS5jCi0KLXdyanBnY29tLmV4ZTogd3JqcGdjb20uYwotCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHdyanBnY29tLmMKLQotLmMub2JqOgotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAotCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCi0JZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KLQlleGl0IDEKLQotY2xlYW46IC5TWU1CT0xJQwotCS0gZGVsICoub2JqCi0JLSBkZWwgbGlianBlZy5saWIKLQktIGRlbCBjanBlZy5leGUKLQktIGRlbCBkanBlZy5leGUKLQktIGRlbCBqcGVndHJhbi5leGUKLQktIGRlbCByZGpwZ2NvbS5leGUKLQktIGRlbCB3cmpwZ2NvbS5leGUKLQktIGRlbCB0ZXN0b3V0Ki4qCi0KLXRlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlICAuU1lNQk9MSUMKLQktIGRlbCB0ZXN0b3V0Ki4qCi0JZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCi0JZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCi0JY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCi0JZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCi0JY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0JanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZwotIWlmZXEgU1lTVEVNIERPUwotCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCi0JZmMgL2IgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQlmYyAvYiB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQotCWZjIC9iIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQlmYyAvYiB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0hZWxzZQotCWVjaG8gbiA+IG4udG1wCi0JY29tcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbSA8IG4udG1wCi0JY29tcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcCA8IG4udG1wCi0JY29tcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZyA8IG4udG1wCi0JY29tcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0gPCBuLnRtcAotCWNvbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZyA8IG4udG1wCi0JY29tcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnIDwgbi50bXAKLQlkZWwgbi50bXAKLSFlbmRpZgotCi0KLWpjYXBpbWluLm9iajogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm9iajogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm9iajogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29sb3Iub2JqOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2RjdG1nci5vYmo6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQub2JqOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm9iajogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm9iajogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm9iajogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkub2JqOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm9iajogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vYmo6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm9iajogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm9iajogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjdHJhbnMub2JqOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vYmo6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vYmo6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vYmo6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm9iajogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3Qub2JqOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vYmo6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkZGN0bWdyLm9iajogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYub2JqOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkaW5wdXQub2JqOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC5vYmo6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vYmo6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hc3Rlci5vYmo6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLm9iajogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vYmo6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm9iajogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm9iajogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkdHJhbnMub2JqOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3Iub2JqOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi1qZmRjdGZsdC5vYmo6IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3Rmc3Qub2JqOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0aW50Lm9iajogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZsdC5vYmo6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3Rmc3Qub2JqOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0aW50Lm9iajogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vYmo6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vYmo6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpxdWFudDIub2JqOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMub2JqOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iub2JqOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWFuc2kub2JqOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLm9iajogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vYmo6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWRvcy5vYmo6IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm9iajogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm9iajogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotZGpwZWcub2JqOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi5vYmo6IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ub2JqOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi13cmpwZ2NvbS5vYmo6IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy5vYmo6IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAub2JqOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRzd2l0Y2gub2JqOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAub2JqOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vYmo6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnBwbS5vYmo6IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi5vYmo6IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vYmo6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHRhcmdhLm9iajogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS5vYmo6IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm9iajogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyYm1wLm9iajogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLm9iajogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm9iajogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2VsaWIuZHMgYi9saWJqcGVndHdycC9tYWtlbGliLmRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2FkMzZkLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VsaWIuZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ2ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIE5NQUtFIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDQuMjAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiIDB4MDEwNAotCi0hSUYgIiQoQ0ZHKSIgPT0gIiIKLUNGRz1qcGVnIC0gV2luMzIKLSFNRVNTQUdFIE5vIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLiAgRGVmYXVsdGluZyB0byBqcGVnIC0gV2luMzIuCi0hRU5ESUYgCi0KLSFJRiAiJChDRkcpIiAhPSAianBlZyAtIFdpbjMyIgotIU1FU1NBR0UgSW52YWxpZCBjb25maWd1cmF0aW9uICIkKENGRykiIHNwZWNpZmllZC4KLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFIG9uIHRoaXMgbWFrZWZpbGUKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAianBlZy5tYWsiIENGRz0ianBlZyAtIFdpbjMyIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgImpwZWcgLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCi0hTUVTU0FHRSAKLSFFUlJPUiBBbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gaXMgc3BlY2lmaWVkLgotIUVORElGIAotCi0hSUYgIiQoT1MpIiA9PSAiV2luZG93c19OVCIKLU5VTEw9Ci0hRUxTRSAKLU5VTEw9bnVsCi0hRU5ESUYgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgVGFyZ2V0X0xhc3RfU2Nhbm5lZCAianBlZyAtIFdpbjMyIgotQ1BQPWNsLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJqcGVnIC0gV2luMzIiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotT1VURElSPS5cUmVsZWFzZQotSU5URElSPS5cUmVsZWFzZQotCi1BTEwgOiAiJChPVVRESVIpXGpwZWcubGliIgotCi1DTEVBTiA6IAotCS1AZXJhc2UgIiQoSU5URElSKVxqY2FwaW1pbi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjYXBpc3RkLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamN0cmFucy5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjcGFyYW0ub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGF0YWRzdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjaW5pdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjbWFzdGVyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNtYXJrZXIub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY21haW5jdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjcHJlcGN0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNjb2VmY3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY2NvbG9yLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNzYW1wbGUub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY2h1ZmYub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY3BodWZmLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNkY3RtZ3Iub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZmRjdGZzdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpmZGN0Zmx0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamZkY3RpbnQub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGFwaW1pbi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkYXBpc3RkLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamR0cmFucy5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkYXRhc3JjLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRtYXN0ZXIub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGlucHV0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRtYXJrZXIub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGh1ZmYub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZHBodWZmLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRtYWluY3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGNvZWZjdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkcG9zdGN0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRkY3RtZ3Iub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqaWRjdGZzdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGppZGN0Zmx0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamlkY3RpbnQub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqaWRjdHJlZC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkc2FtcGxlLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRjb2xvci5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpxdWFudDEub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqcXVhbnQyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRtZXJnZS5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjb21hcGkub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqdXRpbHMub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZXJyb3Iub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqbWVtbWdyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcam1lbW5vYnMub2JqIgotCS1AZXJhc2UgIiQoT1VURElSKVxqcGVnLmxpYiIKLQotIiQoT1VURElSKSIgOgotICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCi0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiXAotIC9GcCIkKElOVERJUikvanBlZy5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCi1DUFBfT0JKUz0uXFJlbGVhc2UvCi1DUFBfU0JSUz0uXC4KLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUJTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpL2pwZWcuYnNjIiAKLUJTQzMyX1NCUlM9IFwKLQkKLUxJQjMyPWxpbmsuZXhlIC1saWIKLSMgQUREIEJBU0UgTElCMzIgL25vbG9nbwotIyBBREQgTElCMzIgL25vbG9nbwotTElCMzJfRkxBR1M9L25vbG9nbyAvb3V0OiIkKE9VVERJUikvanBlZy5saWIiIAotTElCMzJfT0JKUz0gXAotCSIkKElOVERJUilcamNhcGltaW4ub2JqIiBcCi0JIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiIFwKLQkiJChJTlRESVIpXGpjdHJhbnMub2JqIiBcCi0JIiQoSU5URElSKVxqY3BhcmFtLm9iaiIgXAotCSIkKElOVERJUilcamRhdGFkc3Qub2JqIiBcCi0JIiQoSU5URElSKVxqY2luaXQub2JqIiBcCi0JIiQoSU5URElSKVxqY21hc3Rlci5vYmoiIFwKLQkiJChJTlRESVIpXGpjbWFya2VyLm9iaiIgXAotCSIkKElOVERJUilcamNtYWluY3Qub2JqIiBcCi0JIiQoSU5URElSKVxqY3ByZXBjdC5vYmoiIFwKLQkiJChJTlRESVIpXGpjY29lZmN0Lm9iaiIgXAotCSIkKElOVERJUilcamNjb2xvci5vYmoiIFwKLQkiJChJTlRESVIpXGpjc2FtcGxlLm9iaiIgXAotCSIkKElOVERJUilcamNodWZmLm9iaiIgXAotCSIkKElOVERJUilcamNwaHVmZi5vYmoiIFwKLQkiJChJTlRESVIpXGpjZGN0bWdyLm9iaiIgXAotCSIkKElOVERJUilcamZkY3Rmc3Qub2JqIiBcCi0JIiQoSU5URElSKVxqZmRjdGZsdC5vYmoiIFwKLQkiJChJTlRESVIpXGpmZGN0aW50Lm9iaiIgXAotCSIkKElOVERJUilcamRhcGltaW4ub2JqIiBcCi0JIiQoSU5URElSKVxqZGFwaXN0ZC5vYmoiIFwKLQkiJChJTlRESVIpXGpkdHJhbnMub2JqIiBcCi0JIiQoSU5URElSKVxqZGF0YXNyYy5vYmoiIFwKLQkiJChJTlRESVIpXGpkbWFzdGVyLm9iaiIgXAotCSIkKElOVERJUilcamRpbnB1dC5vYmoiIFwKLQkiJChJTlRESVIpXGpkbWFya2VyLm9iaiIgXAotCSIkKElOVERJUilcamRodWZmLm9iaiIgXAotCSIkKElOVERJUilcamRwaHVmZi5vYmoiIFwKLQkiJChJTlRESVIpXGpkbWFpbmN0Lm9iaiIgXAotCSIkKElOVERJUilcamRjb2VmY3Qub2JqIiBcCi0JIiQoSU5URElSKVxqZHBvc3RjdC5vYmoiIFwKLQkiJChJTlRESVIpXGpkZGN0bWdyLm9iaiIgXAotCSIkKElOVERJUilcamlkY3Rmc3Qub2JqIiBcCi0JIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiIFwKLQkiJChJTlRESVIpXGppZGN0aW50Lm9iaiIgXAotCSIkKElOVERJUilcamlkY3RyZWQub2JqIiBcCi0JIiQoSU5URElSKVxqZHNhbXBsZS5vYmoiIFwKLQkiJChJTlRESVIpXGpkY29sb3Iub2JqIiBcCi0JIiQoSU5URElSKVxqcXVhbnQxLm9iaiIgXAotCSIkKElOVERJUilcanF1YW50Mi5vYmoiIFwKLQkiJChJTlRESVIpXGpkbWVyZ2Uub2JqIiBcCi0JIiQoSU5URElSKVxqY29tYXBpLm9iaiIgXAotCSIkKElOVERJUilcanV0aWxzLm9iaiIgXAotCSIkKElOVERJUilcamVycm9yLm9iaiIgXAotCSIkKElOVERJUilcam1lbW1nci5vYmoiIFwKLQkiJChJTlRESVIpXGptZW1ub2JzLm9iaiIKLQotIiQoT1VURElSKVxqcGVnLmxpYiIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJQjMyX09CSlMpCi0gICAgJChMSUIzMikgQDw8Ci0gICQoTElCMzJfRkxBR1MpICQoREVGX0ZMQUdTKSAkKExJQjMyX09CSlMpCi08PAotCi0hRU5ESUYgCi0KLS5jeyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3BweyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3h4eyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3skKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmNwcHskKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmN4eHskKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAianBlZyAtIFdpbjMyIgotCi0hSUYgICIkKENGRykiID09ICJqcGVnIC0gV2luMzIiCi0KLSFFTkRJRiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY2FwaW1pbi5jIgotREVQX0NQUF9KQ0FQST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjYXBpbWluLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDQVBJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjYXBpc3RkLmMiCi1ERVBfQ1BQX0pDQVBJUz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjYXBpc3RkLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDQVBJUykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY2NvZWZjdC5jIgotREVQX0NQUF9KQ0NPRT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjY29lZmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDQ09FKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjY29sb3IuYyIKLURFUF9DUFBfSkNDT0w9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY2NvbG9yLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDQ09MKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjZGN0bWdyLmMiCi1ERVBfQ1BQX0pDRENUPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamNkY3RtZ3Iub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNEQ1QpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNodWZmLmMiCi1ERVBfQ1BQX0pDSFVGPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpjaHVmZi5oIlwKLQkKLQotIiQoSU5URElSKVxqY2h1ZmYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNIVUYpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNpbml0LmMiCi1ERVBfQ1BQX0pDSU5JPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNpbml0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDSU5JKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjbWFpbmN0LmMiCi1ERVBfQ1BQX0pDTUFJPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNtYWluY3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNNQUkpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNtYXJrZXIuYyIKLURFUF9DUFBfSkNNQVI9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY21hcmtlci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ01BUikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY21hc3Rlci5jIgotREVQX0NQUF9KQ01BUz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjbWFzdGVyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDTUFTKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Impjb21hcGkuYyIKLURFUF9DUFBfSkNPTUE9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY29tYXBpLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDT01BKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjcGFyYW0uYyIKLURFUF9DUFBfSkNQQVI9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY3BhcmFtLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDUEFSKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjcGh1ZmYuYyIKLURFUF9DUFBfSkNQSFU9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamNodWZmLmgiXAotCQotCi0iJChJTlRESVIpXGpjcGh1ZmYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNQSFUpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNwcmVwY3QuYyIKLURFUF9DUFBfSkNQUkU9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY3ByZXBjdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1BSRSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY3NhbXBsZS5jIgotREVQX0NQUF9KQ1NBTT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjc2FtcGxlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDU0FNKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjdHJhbnMuYyIKLURFUF9DUFBfSkNUUkE9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY3RyYW5zLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDVFJBKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkYXBpbWluLmMiCi1ERVBfQ1BQX0pEQVBJPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRhcGltaW4ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRBUEkpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRhcGlzdGQuYyIKLURFUF9DUFBfSkRBUElTPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRhcGlzdGQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRBUElTKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkYXRhZHN0LmMiCi1ERVBfQ1BQX0pEQVRBPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRhdGFkc3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRBVEEpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRhdGFzcmMuYyIKLURFUF9DUFBfSkRBVEFTPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRhdGFzcmMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRBVEFTKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkY29lZmN0LmMiCi1ERVBfQ1BQX0pEQ09FPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRjb2VmY3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRDT0UpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRjb2xvci5jIgotREVQX0NQUF9KRENPTD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkY29sb3Iub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRDT0wpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRkY3RtZ3IuYyIKLURFUF9DUFBfSkREQ1Q9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRjdC5oIlwKLQkKLQotIiQoSU5URElSKVxqZGRjdG1nci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRERDVCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZGh1ZmYuYyIKLURFUF9DUFBfSkRIVUY9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRodWZmLmgiXAotCQotCi0iJChJTlRESVIpXGpkaHVmZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KREhVRikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZGlucHV0LmMiCi1ERVBfQ1BQX0pESU5QPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRpbnB1dC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRElOUCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZG1haW5jdC5jIgotREVQX0NQUF9KRE1BST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkbWFpbmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pETUFJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkbWFya2VyLmMiCi1ERVBfQ1BQX0pETUFSPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRtYXJrZXIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRNQVIpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRtYXN0ZXIuYyIKLURFUF9DUFBfSkRNQVM9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqZG1hc3Rlci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRE1BUykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZG1lcmdlLmMiCi1ERVBfQ1BQX0pETUVSPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRtZXJnZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRE1FUikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZHBodWZmLmMiCi1ERVBfQ1BQX0pEUEhVPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkaHVmZi5oIlwKLQkKLQotIiQoSU5URElSKVxqZHBodWZmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEUEhVKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkcG9zdGN0LmMiCi1ERVBfQ1BQX0pEUE9TPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRwb3N0Y3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRQT1MpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRzYW1wbGUuYyIKLURFUF9DUFBfSkRTQU09XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqZHNhbXBsZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRFNBTSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZHRyYW5zLmMiCi1ERVBfQ1BQX0pEVFJBPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamR0cmFucy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRFRSQSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZXJyb3IuYyIKLURFUF9DUFBfSkVSUk89XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImp2ZXJzaW9uLmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamVycm9yLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pFUlJPKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpmZGN0Zmx0LmMiCi1ERVBfQ1BQX0pGRENUPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamZkY3RmbHQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkZEQ1QpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamZkY3Rmc3QuYyIKLURFUF9DUFBfSkZEQ1RGPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamZkY3Rmc3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkZEQ1RGKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpmZGN0aW50LmMiCi1ERVBfQ1BQX0pGRENUST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGpmZGN0aW50Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pGRENUSSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqaWRjdGZsdC5jIgotREVQX0NQUF9KSURDVD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGppZGN0Zmx0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pJRENUKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImppZGN0ZnN0LmMiCi1ERVBfQ1BQX0pJRENURj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGppZGN0ZnN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pJRENURikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqaWRjdGludC5jIgotREVQX0NQUF9KSURDVEk9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRjdC5oIlwKLQkKLQotIiQoSU5URElSKVxqaWRjdGludC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KSURDVEkpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamlkY3RyZWQuYyIKLURFUF9DUFBfSklEQ1RSPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamlkY3RyZWQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSklEQ1RSKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpxdWFudDEuYyIKLURFUF9DUFBfSlFVQU49XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqcXVhbnQxLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pRVUFOKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpxdWFudDIuYyIKLURFUF9DUFBfSlFVQU5UPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcanF1YW50Mi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KUVVBTlQpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0ianV0aWxzLmMiCi1ERVBfQ1BQX0pVVElMPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcanV0aWxzLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pVVElMKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImptZW1tZ3IuYyIKLURFUF9DUFBfSk1FTU09XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiam1lbXN5cy5oIlwKLQkKLQotIiQoSU5URElSKVxqbWVtbWdyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pNRU1NKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImptZW1ub2JzLmMiCi1ERVBfQ1BQX0pNRU1OPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImptZW1zeXMuaCJcCi0JCi0KLSIkKElOVERJUilcam1lbW5vYnMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSk1FTU4pICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvbWFrZXByb2oubWFjIGIvbGlianBlZ3R3cnAvbWFrZXByb2oubWFjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDI3N2M4Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2Vwcm9qLm1hYworKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0tLQotLS0gbWFrZXByb2oubWFjCi0tLQotLS0gVGhpcyBBcHBsZVNjcmlwdCBidWlsZHMgQ29kZSBXYXJyaW9yIFBSTyBSZWxlYXNlIDIgcHJvamVjdCBmaWxlcyBmb3IgdGhlCi0tLSBsaWJqcGVnIGxpYnJhcnkgYXMgd2VsbCBhcyB0aGUgdGVzdCBwcm9ncmFtcyAnY2pwZWcnLCAnZGpwZWcnLCAnanBlZ3RyYW4nLgotLS0gKFdlJ2QgZGlzdHJpYnV0ZSByZWFsIHByb2plY3QgZmlsZXMsIGV4Y2VwdCB0aGV5J3JlIG5vdCB0ZXh0Ci0tLSBhbmQgd291bGQgY3JlYXRlIG1haW50ZW5hbmNlIGhlYWRhY2hlcy4pCi0tLQotLS0gVGhlIHNjcmlwdCB0aGVuIGNvbXBpbGVzIGFuZCBsaW5rcyB0aGUgbGlicmFyeSBhbmQgdGhlIHRlc3QgcHJvZ3JhbXMuCi0tLSBOT1RFOiBpZiB5b3UgaGF2ZW4ndCBhbHJlYWR5IGNyZWF0ZWQgYSAnamNvbmZpZy5oJyBmaWxlLCB0aGUgc2NyaXB0Ci0tLSBhdXRvbWF0aWNhbGx5IGNvcGllcyAnamNvbmZpZy5tYWMnIHRvICdqY29uZmlnLmgnLgotLS0KLS0tIFRvIHVzZSB0aGlzIHNjcmlwdCwgeW91IG11c3QgaGF2ZSBBcHBsZVNjcmlwdCAxLjEgb3IgbGF0ZXIgaW5zdGFsbGVkCi0tLSBhbmQgYSBzdWl0YWJsZSBBcHBsZVNjcmlwdCBlZGl0b3IgbGlrZSBTY3JpcHQgRWRpdG9yIG9yIFNjcmlwdCBEZWJ1Z2dlcgotLS0gKGh0dHA6Ly93d3cubGF0ZW5pZ2h0c3cuY29tKS4gT3BlbiB0aGlzIGZpbGUgd2l0aCB5b3VyIEFwcGxlU2NyaXB0Ci0tLSBlZGl0b3IgYW5kIGV4ZWN1dGUgdGhlICJydW4iIGNvbW1hbmQgdG8gYnVpbGQgdGhlIHByb2plY3RzLgotLS0KLS0tIFRoYW5rcyB0byBEYW4gU2VhcnMgYW5kIERvbiBBZ3JvIGZvciB0aGlzIHNjcmlwdC4KLS0tIFF1ZXN0aW9ucyBhYm91dCB0aGlzIHNjcmlwdCBjYW4gYmUgYWRkcmVzc2VkIHRvIGRvZ3BhcmtAaW50ZXJsb2cuY29tCi0tLQotCi1vbiBydW4KLQotCWNob29zZSBmb2xkZXIgd2l0aCBwcm9tcHQgIj4+PiBTZWxlY3QgSUpHIHNvdXJjZSBmb2xkZXIgPDw8IgotCXNldCBpamdfZm9sZGVyIHRvIHJlc3VsdAotCi0JY2hvb3NlIGZvbGRlciB3aXRoIHByb21wdCAiPj4+IFNlbGVjdCBNZXRyb1dlcmtzIGZvbGRlciA8PDwiCi0Jc2V0IGN3X2ZvbGRlciB0byByZXN1bHQKLQotCS0tIGlmIGpjb25maWcuaCBkb2Vzbid0IGFscmVhZHkgZXhpc3QsIGNvcHkgamNvbmZpZy5tYWMKLQotCXRlbGwgYXBwbGljYXRpb24gIkZpbmRlciIKLQkJaWYgbm90IChleGlzdHMgZmlsZSAiamNvbmZpZy5oIiBvZiBpamdfZm9sZGVyKSB0aGVuCi0JCQlkdXBsaWNhdGUge2ZpbGUgImpjb25maWcubWFjIiBvZiBmb2xkZXIgaWpnX2ZvbGRlcn0KLQkJCXNlbGVjdCBmaWxlICJqY29uZmlnLm1hYyBjb3B5IiBvZiBmb2xkZXIgaWpnX2ZvbGRlcgotCQkJc2V0IG5hbWUgb2Ygc2VsZWN0aW9uIHRvICJqY29uZmlnLmgiCi0JCWVuZCBpZgotCWVuZCB0ZWxsCi0KLQl0ZWxsIGFwcGxpY2F0aW9uICJDb2RlV2FycmlvciBJREUgMi4xIgotCSAgd2l0aCB0aW1lb3V0IG9mIDEwMDAwIHNlY29uZHMKLQotCQktLSBjcmVhdGUgbGlianBlZyBwcm9qZWN0Ci0KLQkJYWN0aXZhdGUKLQkJQ3JlYXRlIFByb2plY3QgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJsaWJqcGVnLnByb2oiCi0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7VGFyZ2V0IE5hbWU6ImxpYmpwZWcifQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7RmlsZSBOYW1lOiJsaWJqcGVnIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtMaW5rZXI6Ik1hY09TIFBQQyBMaW5rZXIifQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7UHJvamVjdCBUeXBlOmxpYnJhcnl9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtBTlNJIFN0cmljdDp0cnVlfQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7RW51bXMgQWx3YXlzIEludHM6dHJ1ZX0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgQ29kZWdlbiIgdG8ge1N0cnVjdCBBbGlnbm1lbnQ6UG93ZXJQQ30KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgTGlua2VyIiB0byB7R2VuZXJhdGUgU1lNIEZpbGU6ZmFsc2V9Ci0KLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNhcGltaW4uYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjYXBpc3RkLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3RyYW5zLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3BhcmFtLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGF0YWRzdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNpbml0LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY21hc3Rlci5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNtYXJrZXIuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjbWFpbmN0LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3ByZXBjdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNjb2VmY3QuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjY29sb3IuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjc2FtcGxlLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2h1ZmYuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjcGh1ZmYuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjZGN0bWdyLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZmRjdGZzdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamZkY3RmbHQuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpmZGN0aW50LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGFwaW1pbi5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhcGlzdGQuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkdHJhbnMuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkYXRhc3JjLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZG1hc3Rlci5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRpbnB1dC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtYXJrZXIuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkaHVmZi5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRwaHVmZi5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtYWluY3QuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkY29lZmN0LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZHBvc3RjdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRkY3RtZ3IuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImppZGN0ZnN0LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqaWRjdGZsdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamlkY3RpbnQuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImppZGN0cmVkLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZHNhbXBsZS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRjb2xvci5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianF1YW50MS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianF1YW50Mi5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtZXJnZS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNvbWFwaS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianV0aWxzLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZXJyb3IuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImptZW1tZ3IuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImptZW1tYWMuYyIgVG8gU2VnbWVudCAxCi0KLQkJLS0gY29tcGlsZSBhbmQgbGluayB0aGUgbGlicmFyeQotCi0JCU1ha2UgUHJvamVjdAotCQlDbG9zZSBQcm9qZWN0Ci0KLQkJLS0gY3JlYXRlIGNqcGVnIHByb2plY3QKLQotCQlhY3RpdmF0ZQotCQlDcmVhdGUgUHJvamVjdCAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNqcGVnLnByb2oiCi0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7VGFyZ2V0IE5hbWU6ImNqcGVnIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge0ZpbGUgTmFtZToiY2pwZWcifQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge0xpbmtlcjoiTWFjT1MgUFBDIExpbmtlciJ9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtBTlNJIFN0cmljdDp0cnVlfQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7RW51bXMgQWx3YXlzIEludHM6dHJ1ZX0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgQ29kZWdlbiIgdG8ge1N0cnVjdCBBbGlnbm1lbnQ6UG93ZXJQQ30KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgTGlua2VyIiB0byB7R2VuZXJhdGUgU1lNIEZpbGU6ZmFsc2V9Ci0KLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiY2pwZWcuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkcHBtLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZGdpZi5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmR0YXJnYS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRybGUuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkYm1wLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZHN3aXRjaC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiY2RqcGVnLmMiIFRvIFNlZ21lbnQgMQotCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImxpYmpwZWciIFRvIFNlZ21lbnQgMgotCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBDLlBQQy5MaWIiIFRvIFNlZ21lbnQgMwotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgU0lPVVguUFBDLkxpYiIgVG8gU2VnbWVudCAzCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpSdW50aW1lOlJ1bnRpbWUgUFBDOk1TTCBSdW50aW1lUFBDLkxpYiIgVG8gU2VnbWVudCAzCi0KLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpJbnRlcmZhY2VMaWIiIFRvIFNlZ21lbnQgNAotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOk1hdGhMaWIiIFRvIFNlZ21lbnQgNAotCi0JCS0tIGNvbXBpbGUgYW5kIGxpbmsgY2pwZWcKLQotCQlNYWtlIFByb2plY3QKLQkJQ2xvc2UgUHJvamVjdAotCi0JCS0tIGNyZWF0ZSBkanBlZyBwcm9qZWN0Ci0KLQkJYWN0aXZhdGUKLQkJQ3JlYXRlIFByb2plY3QgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJkanBlZy5wcm9qIgotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge1RhcmdldCBOYW1lOiJkanBlZyJ9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIFByb2plY3QiIHRvIHtGaWxlIE5hbWU6ImRqcGVnIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtMaW5rZXI6Ik1hY09TIFBQQyBMaW5rZXIifQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7QU5TSSBTdHJpY3Q6dHJ1ZX0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0VudW1zIEFsd2F5cyBJbnRzOnRydWV9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIENvZGVnZW4iIHRvIHtTdHJ1Y3QgQWxpZ25tZW50OlBvd2VyUEN9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIExpbmtlciIgdG8ge0dlbmVyYXRlIFNZTSBGaWxlOmZhbHNlfQotCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImRqcGVnLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cnBwbS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAid3JnaWYuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgIndydGFyZ2EuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgIndycmxlLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cmJtcC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRjb2xtYXAuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNkanBlZy5jIiBUbyBTZWdtZW50IDEKLQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJsaWJqcGVnIiBUbyBTZWdtZW50IDIKLQotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgQy5QUEMuTGliIiBUbyBTZWdtZW50IDMKLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIFNJT1VYLlBQQy5MaWIiIFRvIFNlZ21lbnQgMwotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6UnVudGltZTpSdW50aW1lIFBQQzpNU0wgUnVudGltZVBQQy5MaWIiIFRvIFNlZ21lbnQgMwotCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246SW50ZXJmYWNlTGliIiBUbyBTZWdtZW50IDQKLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpNYXRoTGliIiBUbyBTZWdtZW50IDQKLQotCQktLSBjb21waWxlIGFuZCBsaW5rIGRqcGVnCi0KLQkJTWFrZSBQcm9qZWN0Ci0JCUNsb3NlIFByb2plY3QKLQotCQktLSBjcmVhdGUganBlZ3RyYW4gcHJvamVjdAotCi0JCWFjdGl2YXRlCi0JCUNyZWF0ZSBQcm9qZWN0IChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianBlZ3RyYW4ucHJvaiIKLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtUYXJnZXQgTmFtZToianBlZ3RyYW4ifQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7RmlsZSBOYW1lOiJqcGVndHJhbiJ9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7TGlua2VyOiJNYWNPUyBQUEMgTGlua2VyIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0FOU0kgU3RyaWN0OnRydWV9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtFbnVtcyBBbHdheXMgSW50czp0cnVlfQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBDb2RlZ2VuIiB0byB7U3RydWN0IEFsaWdubWVudDpQb3dlclBDfQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBMaW5rZXIiIHRvIHtHZW5lcmF0ZSBTWU0gRmlsZTpmYWxzZX0KLQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqcGVndHJhbi5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRzd2l0Y2guYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNkanBlZy5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAidHJhbnN1cHAuYyIgVG8gU2VnbWVudCAxCi0KLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAibGlianBlZyIgVG8gU2VnbWVudCAyCi0KLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIEMuUFBDLkxpYiIgVG8gU2VnbWVudCAzCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBTSU9VWC5QUEMuTGliIiBUbyBTZWdtZW50IDMKLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOlJ1bnRpbWU6UnVudGltZSBQUEM6TVNMIFJ1bnRpbWVQUEMuTGliIiBUbyBTZWdtZW50IDMKLQotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOkludGVyZmFjZUxpYiIgVG8gU2VnbWVudCA0Ci0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246TWF0aExpYiIgVG8gU2VnbWVudCA0Ci0KLQkJLS0gY29tcGlsZSBhbmQgbGluayBqcGVndHJhbgotCi0JCU1ha2UgUHJvamVjdAotCQlDbG9zZSBQcm9qZWN0Ci0KLQkJcXVpdAotCi0JICBlbmQgdGltZW91dAotCWVuZCB0ZWxsCi1lbmQgcnVuCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtsanBlZy5zdCBiL2xpYmpwZWd0d3JwL21ha2xqcGVnLnN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTM0OTNlLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2xqcGVnLnN0CisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotOwotOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCi07IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCi07IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAotOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCi07Ci07IFRvIHVzZSB0aGlzIGZpbGUsIHJlbmFtZSBpdCB0byBsaWJqcGVnLnByai4KLTsgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0cnlpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSEKLTsKLTsKLTsgICAgICAqICogKiBPdXRwdXQgZmlsZSAqICogKgotbGlianBlZy5saWIKLTsKLTsgKiAqICogQ09NUElMRVIgT1BUSU9OUyAqICogKiAgCi0uQ1stUF0gICAgICAgIDsgYWJzb2x1dGUgY2FsbHMKLS5DWy1NXSAgICAgICAgOyBhbmQgbm8gc3RyaW5nIG1lcmdpbmcsIGZvbGtzCi0uQ1stdy1jbG5dICAgIDsgbm8gImNvbnN0YW50IGlzIGxvbmciIHdhcm5pbmdzCi0uQ1stdy1wYXJdICAgIDsgbm8gInBhcmFtZXRlciB4eHh4IHVudXNlZCIKLS5DWy13LXJjaF0gICAgOyBubyAidW5yZWFjaGFibGUgY29kZSIKLS5DWy13c2lnXSAgICAgOyB3YXJuIGlmIHNpZ25pZmljYW50IGRpZ2l0cyBtYXkgYmUgbG9zdAotLkxbLUpdICAgICAgICA7IGxpbmsgbmV3IE9iai1mb3JtYXQgKHNvIHdlIGdldCBhIGxpYnJhcnkpCi09Ci07ICogKiAqICogTGlzdCBvZiBtb2R1bGVzICogKiAqICogCi1qY2FwaW1pbi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY2FwaXN0ZC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY2NvZWZjdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY2NvbG9yLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpjZGN0bWdyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qY2h1ZmYuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpjaHVmZi5oKQotamNpbml0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpjbWFpbmN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpjbWFya2VyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpjbWFzdGVyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpjb21hcGkuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamNwYXJhbS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY3BodWZmLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqY2h1ZmYuaCkKLWpjcHJlcGN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpjc2FtcGxlLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpjdHJhbnMuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamRhcGltaW4uYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamRhcGlzdGQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamRhdGFkc3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgpCi1qZGF0YXNyYy5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCkKLWpkY29lZmN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkY29sb3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamRkY3RtZ3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKLWpkaHVmZi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRodWZmLmgpCi1qZGlucHV0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkbWFpbmN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkbWFya2VyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkbWFzdGVyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkbWVyZ2UuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamRwaHVmZi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRodWZmLmgpCi1qZHBvc3RjdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZHNhbXBsZS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZHRyYW5zLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWplcnJvci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqdmVyc2lvbi5oLGplcnJvci5oKQotamZkY3RmbHQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKLWpmZGN0ZnN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qZmRjdGludC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQotamlkY3RmbHQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKLWppZGN0ZnN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qaWRjdGludC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQotamlkY3RyZWQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKLWpxdWFudDEuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotanF1YW50Mi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qdXRpbHMuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotam1lbW1nci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsam1lbXN5cy5oKQotam1lbWFuc2kuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGptZW1zeXMuaCkKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha3RqcGVnLnN0IGIvbGlianBlZ3R3cnAvbWFrdGpwZWcuc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjRkMTYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvbWFrdGpwZWcuc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi07IFByb2plY3QgZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi07Ci07IFRoaXMgcHJvamVjdCBmaWxlIGlzIGZvciBBdGFyaSBTVC9TVEUvVFQgc3lzdGVtcyB1c2luZyBQdXJlIEMgb3IgVHVyYm8gQy4KLTsgVGhhbmtzIHRvIEZyYW5rIE1vZWhsZSAoRnJhbmsuTW9laGxlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlKSwKLTsgRHIuIEIuIFNldHplcGZhbmR0IChiZXJuZEBnaW5hLnVuaS1tdWVuc3Rlci5kZSksCi07IGFuZCBHdWlkbyBWb2xsYmVkaW5nIChndWl2b2xAZXNjLmRlKS4KLTsKLTsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGpwZWd0cmFuLnByai4KLTsgSWYgeW91IGFyZSB1c2luZyBUdXJibyBDLCBjaGFuZ2UgZmlsZW5hbWVzIGJlZ2lubmluZyB3aXRoICJwYy4uLiIgdG8gInRjLi4uIgotOyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHRyeWluZyB0byBtYWtlIHRoZSBwcm9ncmFtIQotOwotOwotOyAgICAgICogKiAqIE91dHB1dCBmaWxlICogKiAqCi1qcGVndHJhbi50dHAKLTsKLTsgKiAqICogQ09NUElMRVIgT1BUSU9OUyAqICogKiAgCi0uQ1stUF0gICAgICAgIDsgYWJzb2x1dGUgY2FsbHMKLS5DWy1NXSAgICAgICAgOyBhbmQgbm8gc3RyaW5nIG1lcmdpbmcsIGZvbGtzCi0uQ1stdy1jbG5dICAgIDsgbm8gImNvbnN0YW50IGlzIGxvbmciIHdhcm5pbmdzCi0uQ1stdy1wYXJdICAgIDsgbm8gInBhcmFtZXRlciB4eHh4IHVudXNlZCIKLS5DWy13LXJjaF0gICAgOyBubyAidW5yZWFjaGFibGUgY29kZSIKLS5DWy13c2lnXSAgICAgOyB3YXJuIGlmIHNpZ25pZmljYW50IGRpZ2l0cyBtYXkgYmUgbG9zdAotPQotOyAqICogKiAqIExpc3Qgb2YgbW9kdWxlcyAqICogKiAqIAotcGNzdGFydC5vCi1qcGVndHJhbi5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgsdHJhbnN1cHAuaCxqdmVyc2lvbi5oKQotY2RqcGVnLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXJkc3dpdGNoLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXRyYW5zdXBwLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCx0cmFuc3VwcC5oKQotbGlianBlZy5saWIgICAgICAgIDsgYnVpbHQgYnkgbGlianBlZy5wcmoKLXBjc3RkbGliLmxpYiAgICAgICA7IHN0YW5kYXJkIGxpYnJhcnkKLXBjZXh0bGliLmxpYiAgICAgICA7IGV4dGVuZGVkIGxpYnJhcnkKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha3Ztcy5vcHQgYi9saWJqcGVndHdycC9tYWt2bXMub3B0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVlOGZlLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha3Ztcy5vcHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSEgQSBwb2ludGVyIHRvIHRoZSBWQVgvVk1TIEMgUnVuLVRpbWUgU2hhcmVhYmxlIExpYnJhcnkuCi0hIFRoaXMgZmlsZSBpcyBuZWVkZWQgYnkgbWFrZWZpbGUubW1zIGFuZCBtYWtlZmlsZS52bXMsCi0hIGJ1dCBvbmx5IGZvciB0aGUgb2xkZXIgVkFYIEMgY29tcGlsZXIuICBERUMgQyBkb2VzIG5vdCBuZWVkIGl0LgotU3lzJExpYnJhcnk6VkFYQ1JUTC5FWEUgL1NoYXJlCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9yZGJtcC5jIGIvbGlianBlZ3R3cnAvcmRibXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1ZmUyYS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9yZGJtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8qCi0gKiByZGJtcC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcmVhZCBpbnB1dCBpbWFnZXMgaW4gTWljcm9zb2Z0ICJCTVAiCi0gKiBmb3JtYXQgKE1TIFdpbmRvd3MgMy54LCBPUy8yIDEueCwgYW5kIE9TLzIgMi54IGZsYXZvcnMpLgotICogQ3VycmVudGx5LCBvbmx5IDgtYml0IGFuZCAyNC1iaXQgaW1hZ2VzIGFyZSBzdXBwb3J0ZWQsIG5vdCAxLWJpdCBvcgotICogNC1iaXQgKGZlZWRpbmcgc3VjaCBsb3ctZGVwdGggaW1hZ2VzIGludG8gSlBFRyB3b3VsZCBiZSBzaWxseSBhbnl3YXkpLgotICogQWxzbywgd2UgZG9uJ3Qgc3VwcG9ydCBSTEUtY29tcHJlc3NlZCBmaWxlcy4KLSAqCi0gKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgotICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgaW5wdXQgZnJvbQotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLiAgVGhleSBmdXJ0aGVyIGFzc3VtZSB0aGF0IHJlYWRpbmcgYmVnaW5zCi0gKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGU7IHN0YXJ0X2lucHV0IG1heSBuZWVkIHdvcmsgaWYgdGhlCi0gKiB1c2VyIGludGVyZmFjZSBoYXMgYWxyZWFkeSByZWFkIHNvbWUgZGF0YSAoZS5nLiwgdG8gZGV0ZXJtaW5lIHRoYXQKLSAqIHRoZSBmaWxlIGlzIGluZGVlZCBCTVAgZm9ybWF0KS4KLSAqCi0gKiBUaGlzIGNvZGUgY29udHJpYnV0ZWQgYnkgSmFtZXMgQXJ0aHVyIEJvdWNoZXIuCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLQotI2lmZGVmIEJNUF9TVVBQT1JURUQKLQotCi0vKiBNYWNyb3MgdG8gZGVhbCB3aXRoIHVuc2lnbmVkIGNoYXJzIGFzIGVmZmljaWVudGx5IGFzIGNvbXBpbGVyIGFsbG93cyAqLwotCi0jaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgVV9DSEFSOwotI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSkKLSNlbHNlIC8qICFIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLSNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECi10eXBlZGVmIGNoYXIgVV9DSEFSOwotI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSkKLSNlbHNlCi10eXBlZGVmIGNoYXIgVV9DSEFSOwotI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSAmIDB4RkYpCi0jZW5kaWYKLSNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLQotCi0jZGVmaW5lCVJlYWRPSyhmaWxlLGJ1ZmZlcixsZW4pCShKRlJFQUQoZmlsZSxidWZmZXIsbGVuKSA9PSAoKHNpemVfdCkgKGxlbikpKQotCi0KLS8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIHNvdXJjZSBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2JtcF9zb3VyY2Vfc3RydWN0ICogYm1wX3NvdXJjZV9wdHI7Ci0KLXR5cGVkZWYgc3RydWN0IF9ibXBfc291cmNlX3N0cnVjdCB7Ci0gIHN0cnVjdCBjanBlZ19zb3VyY2Vfc3RydWN0IHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGpfY29tcHJlc3NfcHRyIGNpbmZvOwkJLyogYmFjayBsaW5rIHNhdmVzIHBhc3Npbmcgc2VwYXJhdGUgcGFybSAqLwotCi0gIEpTQU1QQVJSQVkgY29sb3JtYXA7CQkvKiBCTVAgY29sb3JtYXAgKGNvbnZlcnRlZCB0byBteSBmb3JtYXQpICovCi0KLSAganZpcnRfc2FycmF5X3B0ciB3aG9sZV9pbWFnZTsJLyogTmVlZGVkIHRvIHJldmVyc2Ugcm93IG9yZGVyICovCi0gIEpESU1FTlNJT04gc291cmNlX3JvdzsJLyogQ3VycmVudCBzb3VyY2Ugcm93IG51bWJlciAqLwotICBKRElNRU5TSU9OIHJvd193aWR0aDsJCS8qIFBoeXNpY2FsIHdpZHRoIG9mIHNjYW5saW5lcyBpbiBmaWxlICovCi0KLSAgaW50IGJpdHNfcGVyX3BpeGVsOwkJLyogcmVtZW1iZXJzIDgtIG9yIDI0LWJpdCBmb3JtYXQgKi8KLX0gYm1wX3NvdXJjZV9zdHJ1Y3Q7Ci0KLQotTE9DQUwoaW50KQotcmVhZF9ieXRlIChibXBfc291cmNlX3B0ciBzaW5mbykKLS8qIFJlYWQgbmV4dCBieXRlIGZyb20gQk1QIGZpbGUgKi8KLXsKLSAgcmVnaXN0ZXIgRklMRSAqaW5maWxlID0gc2luZm8tPnB1Yi5pbnB1dF9maWxlOwotICByZWdpc3RlciBpbnQgYzsKLQotICBpZiAoKGMgPSBnZXRjKGluZmlsZSkpID09IEVPRikKLSAgICBFUlJFWElUKHNpbmZvLT5jaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICByZXR1cm4gYzsKLX0KLQotCi1MT0NBTCh2b2lkKQotcmVhZF9jb2xvcm1hcCAoYm1wX3NvdXJjZV9wdHIgc2luZm8sIGludCBjbWFwbGVuLCBpbnQgbWFwZW50cnlzaXplKQotLyogUmVhZCB0aGUgY29sb3JtYXAgZnJvbSBhIEJNUCBmaWxlICovCi17Ci0gIGludCBpOwotCi0gIHN3aXRjaCAobWFwZW50cnlzaXplKSB7Ci0gIGNhc2UgMzoKLSAgICAvKiBCR1IgZm9ybWF0IChvY2N1cnMgaW4gT1MvMiBmaWxlcykgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY21hcGxlbjsgaSsrKSB7Ci0gICAgICBzaW5mby0+Y29sb3JtYXBbMl1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKLSAgICAgIHNpbmZvLT5jb2xvcm1hcFsxXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOwotICAgICAgc2luZm8tPmNvbG9ybWFwWzBdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIDQ6Ci0gICAgLyogQkdSMCBmb3JtYXQgKG9jY3VycyBpbiBNUyBXaW5kb3dzIGZpbGVzKSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBjbWFwbGVuOyBpKyspIHsKLSAgICAgIHNpbmZvLT5jb2xvcm1hcFsyXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOwotICAgICAgc2luZm8tPmNvbG9ybWFwWzFdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgICBzaW5mby0+Y29sb3JtYXBbMF1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKLSAgICAgICh2b2lkKSByZWFkX2J5dGUoc2luZm8pOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKHNpbmZvLT5jaW5mbywgSkVSUl9CTVBfQkFEQ01BUCk7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotCi0vKgotICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KLSAqIFRoZSBpbWFnZSBoYXMgYmVlbiByZWFkIGludG8gdGhlIHdob2xlX2ltYWdlIGFycmF5LCBidXQgaXMgb3RoZXJ3aXNlCi0gKiB1bnByb2Nlc3NlZC4gIFdlIG11c3QgcmVhZCBpdCBvdXQgaW4gdG9wLXRvLWJvdHRvbSByb3cgb3JkZXIsIGFuZCBpZgotICogaXQgaXMgYW4gOC1iaXQgaW1hZ2UsIHdlIG11c3QgZXhwYW5kIGNvbG9ybWFwcGVkIHBpeGVscyB0byAyNGJpdCBmb3JtYXQuCi0gKi8KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfOGJpdF9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDgtYml0IGNvbG9ybWFwIGluZGV4ZXMgKi8KLXsKLSAgYm1wX3NvdXJjZV9wdHIgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBBUlJBWSBjb2xvcm1hcCA9IHNvdXJjZS0+Y29sb3JtYXA7Ci0gIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOwotICByZWdpc3RlciBpbnQgdDsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgLyogRmV0Y2ggbmV4dCByb3cgZnJvbSB2aXJ0dWFsIGFycmF5ICovCi0gIHNvdXJjZS0+c291cmNlX3Jvdy0tOwotICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+d2hvbGVfaW1hZ2UsCi0gICAgIHNvdXJjZS0+c291cmNlX3JvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKLQotICAvKiBFeHBhbmQgdGhlIGNvbG9ybWFwIGluZGV4ZXMgdG8gcmVhbCBkYXRhICovCi0gIGlucHRyID0gaW1hZ2VfcHRyWzBdOwotICBvdXRwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07Ci0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIHQgPSBHRVRKU0FNUExFKCppbnB0cisrKTsKLSAgICAqb3V0cHRyKysgPSBjb2xvcm1hcFswXVt0XTsJLyogY2FuIG9taXQgR0VUSlNBTVBMRSgpIHNhZmVseSAqLwotICAgICpvdXRwdHIrKyA9IGNvbG9ybWFwWzFdW3RdOwotICAgICpvdXRwdHIrKyA9IGNvbG9ybWFwWzJdW3RdOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfMjRiaXRfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyAyNC1iaXQgcGl4ZWxzICovCi17Ci0gIGJtcF9zb3VyY2VfcHRyIHNvdXJjZSA9IChibXBfc291cmNlX3B0cikgc2luZm87Ci0gIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLQotICAvKiBGZXRjaCBuZXh0IHJvdyBmcm9tIHZpcnR1YWwgYXJyYXkgKi8KLSAgc291cmNlLT5zb3VyY2Vfcm93LS07Ci0gIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT53aG9sZV9pbWFnZSwKLSAgICAgc291cmNlLT5zb3VyY2Vfcm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOwotCi0gIC8qIFRyYW5zZmVyIGRhdGEuICBOb3RlIHNvdXJjZSB2YWx1ZXMgYXJlIGluIEJHUiBvcmRlcgotICAgKiAoZXZlbiB0aG91Z2ggTWljcm9zb2Z0J3Mgb3duIGRvY3VtZW50cyBzYXkgdGhlIG9wcG9zaXRlKS4KLSAgICovCi0gIGlucHRyID0gaW1hZ2VfcHRyWzBdOwotICBvdXRwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07Ci0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIG91dHB0clsyXSA9ICppbnB0cisrOwkvKiBjYW4gb21pdCBHRVRKU0FNUExFKCkgc2FmZWx5ICovCi0gICAgb3V0cHRyWzFdID0gKmlucHRyKys7Ci0gICAgb3V0cHRyWzBdID0gKmlucHRyKys7Ci0gICAgb3V0cHRyICs9IDM7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogVGhpcyBtZXRob2QgbG9hZHMgdGhlIGltYWdlIGludG8gd2hvbGVfaW1hZ2UgZHVyaW5nIHRoZSBmaXJzdCBjYWxsIG9uCi0gKiBnZXRfcGl4ZWxfcm93cy4gIFRoZSBnZXRfcGl4ZWxfcm93cyBwb2ludGVyIGlzIHRoZW4gYWRqdXN0ZWQgdG8gY2FsbAotICogZ2V0XzhiaXRfcm93IG9yIGdldF8yNGJpdF9yb3cgb24gc3Vic2VxdWVudCBjYWxscy4KLSAqLwotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLXByZWxvYWRfaW1hZ2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICBibXBfc291cmNlX3B0ciBzb3VyY2UgPSAoYm1wX3NvdXJjZV9wdHIpIHNpbmZvOwotICByZWdpc3RlciBGSUxFICppbmZpbGUgPSBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlOwotICByZWdpc3RlciBpbnQgYzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0X3B0cjsKLSAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7Ci0gIEpESU1FTlNJT04gcm93LCBjb2w7Ci0gIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKLQotICAvKiBSZWFkIHRoZSBkYXRhIGludG8gYSB2aXJ0dWFsIGFycmF5IGluIGlucHV0LWZpbGUgcm93IG9yZGVyLiAqLwotICBmb3IgKHJvdyA9IDA7IHJvdyA8IGNpbmZvLT5pbWFnZV9oZWlnaHQ7IHJvdysrKSB7Ci0gICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKLSAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gKGxvbmcpIHJvdzsKLSAgICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OwotICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgfQotICAgIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPndob2xlX2ltYWdlLAotICAgICAgIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOwotICAgIG91dF9wdHIgPSBpbWFnZV9wdHJbMF07Ci0gICAgZm9yIChjb2wgPSBzb3VyY2UtPnJvd193aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAgIC8qIGlubGluZSBjb3B5IG9mIHJlYWRfYnl0ZSgpIGZvciBzcGVlZCAqLwotICAgICAgaWYgKChjID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCi0JRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICAgICAgKm91dF9wdHIrKyA9IChKU0FNUExFKSBjOwotICAgIH0KLSAgfQotICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkKLSAgICBwcm9ncmVzcy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcysrOwotCi0gIC8qIFNldCB1cCB0byByZWFkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXkgaW4gdG9wLXRvLWJvdHRvbSBvcmRlciAqLwotICBzd2l0Y2ggKHNvdXJjZS0+Yml0c19wZXJfcGl4ZWwpIHsKLSAgY2FzZSA4OgotICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0XzhiaXRfcm93OwotICAgIGJyZWFrOwotICBjYXNlIDI0OgotICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0XzI0Yml0X3JvdzsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURERVBUSCk7Ci0gIH0KLSAgc291cmNlLT5zb3VyY2Vfcm93ID0gY2luZm8tPmltYWdlX2hlaWdodDsKLQotICAvKiBBbmQgcmVhZCB0aGUgZmlyc3Qgcm93ICovCi0gIHJldHVybiAoKnNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzKSAoY2luZm8sIHNpbmZvKTsKLX0KLQotCi0vKgotICogUmVhZCB0aGUgZmlsZSBoZWFkZXI7IHJldHVybiBpbWFnZSBzaXplIGFuZCBjb21wb25lbnQgY291bnQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9pbnB1dF9ibXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICBibXBfc291cmNlX3B0ciBzb3VyY2UgPSAoYm1wX3NvdXJjZV9wdHIpIHNpbmZvOwotICBVX0NIQVIgYm1wZmlsZWhlYWRlclsxNF07Ci0gIFVfQ0hBUiBibXBpbmZvaGVhZGVyWzY0XTsKLSNkZWZpbmUgR0VUXzJCKGFycmF5LG9mZnNldCkgICgodW5zaWduZWQgaW50KSBVQ0goYXJyYXlbb2Zmc2V0XSkgKyBcCi0JCQkgICAgICAgKCgodW5zaWduZWQgaW50KSBVQ0goYXJyYXlbb2Zmc2V0KzFdKSkgPDwgOCkpCi0jZGVmaW5lIEdFVF80QihhcnJheSxvZmZzZXQpICAoKElOVDMyKSBVQ0goYXJyYXlbb2Zmc2V0XSkgKyBcCi0JCQkgICAgICAgKCgoSU5UMzIpIFVDSChhcnJheVtvZmZzZXQrMV0pKSA8PCA4KSArIFwKLQkJCSAgICAgICAoKChJTlQzMikgVUNIKGFycmF5W29mZnNldCsyXSkpIDw8IDE2KSArIFwKLQkJCSAgICAgICAoKChJTlQzMikgVUNIKGFycmF5W29mZnNldCszXSkpIDw8IDI0KSkKLSAgSU5UMzIgYmZPZmZCaXRzOwotICBJTlQzMiBoZWFkZXJTaXplOwotICBJTlQzMiBiaVdpZHRoID0gMDsJCS8qIGluaXRpYWxpemUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyAqLwotICBJTlQzMiBiaUhlaWdodCA9IDA7Ci0gIHVuc2lnbmVkIGludCBiaVBsYW5lczsKLSAgSU5UMzIgYmlDb21wcmVzc2lvbjsKLSAgSU5UMzIgYmlYUGVsc1Blck1ldGVyLGJpWVBlbHNQZXJNZXRlcjsKLSAgSU5UMzIgYmlDbHJVc2VkID0gMDsKLSAgaW50IG1hcGVudHJ5c2l6ZSA9IDA7CQkvKiAwIGluZGljYXRlcyBubyBjb2xvcm1hcCAqLwotICBJTlQzMiBiUGFkOwotICBKRElNRU5TSU9OIHJvd193aWR0aDsKLQotICAvKiBSZWFkIGFuZCB2ZXJpZnkgdGhlIGJpdG1hcCBmaWxlIGhlYWRlciAqLwotICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgYm1wZmlsZWhlYWRlciwgMTQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgaWYgKEdFVF8yQihibXBmaWxlaGVhZGVyLDApICE9IDB4NEQ0MikgLyogJ0JNJyAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX05PVCk7Ci0gIGJmT2ZmQml0cyA9IChJTlQzMikgR0VUXzRCKGJtcGZpbGVoZWFkZXIsMTApOwotICAvKiBXZSBpZ25vcmUgdGhlIHJlbWFpbmluZyBmaWxlaGVhZGVyIGZpZWxkcyAqLwotCi0gIC8qIFRoZSBpbmZvaGVhZGVyIG1pZ2h0IGJlIDEyIGJ5dGVzIChPUy8yIDEueCksIDQwIGJ5dGVzIChXaW5kb3dzKSwKLSAgICogb3IgNjQgYnl0ZXMgKE9TLzIgMi54KS4gIENoZWNrIHRoZSBmaXJzdCA0IGJ5dGVzIHRvIGZpbmQgb3V0IHdoaWNoLgotICAgKi8KLSAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIGJtcGluZm9oZWFkZXIsIDQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgaGVhZGVyU2l6ZSA9IChJTlQzMikgR0VUXzRCKGJtcGluZm9oZWFkZXIsMCk7Ci0gIGlmIChoZWFkZXJTaXplIDwgMTIgfHwgaGVhZGVyU2l6ZSA+IDY0KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBREhFQURFUik7Ci0gIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBibXBpbmZvaGVhZGVyKzQsIGhlYWRlclNpemUtNCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotCi0gIHN3aXRjaCAoKGludCkgaGVhZGVyU2l6ZSkgewotICBjYXNlIDEyOgotICAgIC8qIERlY29kZSBPUy8yIDEueCBoZWFkZXIgKE1pY3Jvc29mdCBjYWxscyB0aGlzIGEgQklUTUFQQ09SRUhFQURFUikgKi8KLSAgICBiaVdpZHRoID0gKElOVDMyKSBHRVRfMkIoYm1waW5mb2hlYWRlciw0KTsKLSAgICBiaUhlaWdodCA9IChJTlQzMikgR0VUXzJCKGJtcGluZm9oZWFkZXIsNik7Ci0gICAgYmlQbGFuZXMgPSBHRVRfMkIoYm1waW5mb2hlYWRlciw4KTsKLSAgICBzb3VyY2UtPmJpdHNfcGVyX3BpeGVsID0gKGludCkgR0VUXzJCKGJtcGluZm9oZWFkZXIsMTApOwotCi0gICAgc3dpdGNoIChzb3VyY2UtPmJpdHNfcGVyX3BpeGVsKSB7Ci0gICAgY2FzZSA4OgkJCS8qIGNvbG9ybWFwcGVkIGltYWdlICovCi0gICAgICBtYXBlbnRyeXNpemUgPSAzOwkJLyogT1MvMiB1c2VzIFJHQlRSSVBMRSBjb2xvcm1hcCAqLwotICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfQk1QX09TMl9NQVBQRUQsIChpbnQpIGJpV2lkdGgsIChpbnQpIGJpSGVpZ2h0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6CQkJLyogUkdCIGltYWdlICovCi0gICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19CTVBfT1MyLCAoaW50KSBiaVdpZHRoLCAoaW50KSBiaUhlaWdodCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEREVQVEgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChiaVBsYW5lcyAhPSAxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEUExBTkVTKTsKLSAgICBicmVhazsKLSAgY2FzZSA0MDoKLSAgY2FzZSA2NDoKLSAgICAvKiBEZWNvZGUgV2luZG93cyAzLnggaGVhZGVyIChNaWNyb3NvZnQgY2FsbHMgdGhpcyBhIEJJVE1BUElORk9IRUFERVIpICovCi0gICAgLyogb3IgT1MvMiAyLnggaGVhZGVyLCB3aGljaCBoYXMgYWRkaXRpb25hbCBmaWVsZHMgdGhhdCB3ZSBpZ25vcmUgKi8KLSAgICBiaVdpZHRoID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsNCk7Ci0gICAgYmlIZWlnaHQgPSBHRVRfNEIoYm1waW5mb2hlYWRlciw4KTsKLSAgICBiaVBsYW5lcyA9IEdFVF8yQihibXBpbmZvaGVhZGVyLDEyKTsKLSAgICBzb3VyY2UtPmJpdHNfcGVyX3BpeGVsID0gKGludCkgR0VUXzJCKGJtcGluZm9oZWFkZXIsMTQpOwotICAgIGJpQ29tcHJlc3Npb24gPSBHRVRfNEIoYm1waW5mb2hlYWRlciwxNik7Ci0gICAgYmlYUGVsc1Blck1ldGVyID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsMjQpOwotICAgIGJpWVBlbHNQZXJNZXRlciA9IEdFVF80QihibXBpbmZvaGVhZGVyLDI4KTsKLSAgICBiaUNsclVzZWQgPSBHRVRfNEIoYm1waW5mb2hlYWRlciwzMik7Ci0gICAgLyogYmlTaXplSW1hZ2UsIGJpQ2xySW1wb3J0YW50IGZpZWxkcyBhcmUgaWdub3JlZCAqLwotCi0gICAgc3dpdGNoIChzb3VyY2UtPmJpdHNfcGVyX3BpeGVsKSB7Ci0gICAgY2FzZSA4OgkJCS8qIGNvbG9ybWFwcGVkIGltYWdlICovCi0gICAgICBtYXBlbnRyeXNpemUgPSA0OwkJLyogV2luZG93cyB1c2VzIFJHQlFVQUQgY29sb3JtYXAgKi8KLSAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0JNUF9NQVBQRUQsIChpbnQpIGJpV2lkdGgsIChpbnQpIGJpSGVpZ2h0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6CQkJLyogUkdCIGltYWdlICovCi0gICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19CTVAsIChpbnQpIGJpV2lkdGgsIChpbnQpIGJpSGVpZ2h0KTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURERVBUSCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGJpUGxhbmVzICE9IDEpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURQTEFORVMpOwotICAgIGlmIChiaUNvbXByZXNzaW9uICE9IDApCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9DT01QUkVTU0VEKTsKLQotICAgIGlmIChiaVhQZWxzUGVyTWV0ZXIgPiAwICYmIGJpWVBlbHNQZXJNZXRlciA+IDApIHsKLSAgICAgIC8qIFNldCBKRklGIGRlbnNpdHkgcGFyYW1ldGVycyBmcm9tIHRoZSBCTVAgZGF0YSAqLwotICAgICAgY2luZm8tPlhfZGVuc2l0eSA9IChVSU5UMTYpIChiaVhQZWxzUGVyTWV0ZXIvMTAwKTsgLyogMTAwIGNtIHBlciBtZXRlciAqLwotICAgICAgY2luZm8tPllfZGVuc2l0eSA9IChVSU5UMTYpIChiaVlQZWxzUGVyTWV0ZXIvMTAwKTsKLSAgICAgIGNpbmZvLT5kZW5zaXR5X3VuaXQgPSAyOwkvKiBkb3RzL2NtICovCi0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBREhFQURFUik7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBDb21wdXRlIGRpc3RhbmNlIHRvIGJpdG1hcCBkYXRhIC0tLSB3aWxsIGFkanVzdCBmb3IgY29sb3JtYXAgYmVsb3cgKi8KLSAgYlBhZCA9IGJmT2ZmQml0cyAtIChoZWFkZXJTaXplICsgMTQpOwotCi0gIC8qIFJlYWQgdGhlIGNvbG9ybWFwLCBpZiBhbnkgKi8KLSAgaWYgKG1hcGVudHJ5c2l6ZSA+IDApIHsKLSAgICBpZiAoYmlDbHJVc2VkIDw9IDApCi0gICAgICBiaUNsclVzZWQgPSAyNTY7CQkvKiBhc3N1bWUgaXQncyAyNTYgKi8KLSAgICBlbHNlIGlmIChiaUNsclVzZWQgPiAyNTYpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURDTUFQKTsKLSAgICAvKiBBbGxvY2F0ZSBzcGFjZSB0byBzdG9yZSB0aGUgY29sb3JtYXAgKi8KLSAgICBzb3VyY2UtPmNvbG9ybWFwID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgIChKRElNRU5TSU9OKSBiaUNsclVzZWQsIChKRElNRU5TSU9OKSAzKTsKLSAgICAvKiBhbmQgcmVhZCBpdCBmcm9tIHRoZSBmaWxlICovCi0gICAgcmVhZF9jb2xvcm1hcChzb3VyY2UsIChpbnQpIGJpQ2xyVXNlZCwgbWFwZW50cnlzaXplKTsKLSAgICAvKiBhY2NvdW50IGZvciBzaXplIG9mIGNvbG9ybWFwICovCi0gICAgYlBhZCAtPSBiaUNsclVzZWQgKiBtYXBlbnRyeXNpemU7Ci0gIH0KLQotICAvKiBTa2lwIGFueSByZW1haW5pbmcgcGFkIGJ5dGVzICovCi0gIGlmIChiUGFkIDwgMCkJCQkvKiBpbmNvcnJlY3QgYmZPZmZCaXRzIHZhbHVlPyAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBREhFQURFUik7Ci0gIHdoaWxlICgtLWJQYWQgPj0gMCkgewotICAgICh2b2lkKSByZWFkX2J5dGUoc291cmNlKTsKLSAgfQotCi0gIC8qIENvbXB1dGUgcm93IHdpZHRoIGluIGZpbGUsIGluY2x1ZGluZyBwYWRkaW5nIHRvIDQtYnl0ZSBib3VuZGFyeSAqLwotICBpZiAoc291cmNlLT5iaXRzX3Blcl9waXhlbCA9PSAyNCkKLSAgICByb3dfd2lkdGggPSAoSkRJTUVOU0lPTikgKGJpV2lkdGggKiAzKTsKLSAgZWxzZQotICAgIHJvd193aWR0aCA9IChKRElNRU5TSU9OKSBiaVdpZHRoOwotICB3aGlsZSAoKHJvd193aWR0aCAmIDMpICE9IDApIHJvd193aWR0aCsrOwotICBzb3VyY2UtPnJvd193aWR0aCA9IHJvd193aWR0aDsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgaW52ZXJzaW9uIGFycmF5LCBwcmVwYXJlIGZvciBwcmVsb2FkIHBhc3MgKi8KLSAgc291cmNlLT53aG9sZV9pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLSAgICAgcm93X3dpZHRoLCAoSkRJTUVOU0lPTikgYmlIZWlnaHQsIChKRElNRU5TSU9OKSAxKTsKLSAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBwcmVsb2FkX2ltYWdlOwotICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLSAgICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7Ci0gICAgcHJvZ3Jlc3MtPnRvdGFsX2V4dHJhX3Bhc3NlcysrOyAvKiBjb3VudCBmaWxlIGlucHV0IGFzIHNlcGFyYXRlIHBhc3MgKi8KLSAgfQotCi0gIC8qIEFsbG9jYXRlIG9uZS1yb3cgYnVmZmVyIGZvciByZXR1cm5lZCBkYXRhICovCi0gIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgIChKRElNRU5TSU9OKSAoYmlXaWR0aCAqIDMpLCAoSkRJTUVOU0lPTikgMSk7Ci0gIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotCi0gIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7Ci0gIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMzsKLSAgY2luZm8tPmRhdGFfcHJlY2lzaW9uID0gODsKLSAgY2luZm8tPmltYWdlX3dpZHRoID0gKEpESU1FTlNJT04pIGJpV2lkdGg7Ci0gIGNpbmZvLT5pbWFnZV9oZWlnaHQgPSAoSkRJTUVOU0lPTikgYmlIZWlnaHQ7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX2lucHV0X2JtcCAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgQk1QIGZvcm1hdCBpbnB1dC4KLSAqLwotCi1HTE9CQUwoY2pwZWdfc291cmNlX3B0cikKLWppbml0X3JlYWRfYm1wIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgYm1wX3NvdXJjZV9wdHIgc291cmNlOwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCAqLwotICBzb3VyY2UgPSAoYm1wX3NvdXJjZV9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKGJtcF9zb3VyY2Vfc3RydWN0KSk7Ci0gIHNvdXJjZS0+Y2luZm8gPSBjaW5mbzsJLyogbWFrZSBiYWNrIGxpbmsgZm9yIHN1YnJvdXRpbmVzICovCi0gIC8qIEZpbGwgaW4gbWV0aG9kIHB0cnMsIGV4Y2VwdCBnZXRfcGl4ZWxfcm93cyB3aGljaCBzdGFydF9pbnB1dCBzZXRzICovCi0gIHNvdXJjZS0+cHViLnN0YXJ0X2lucHV0ID0gc3RhcnRfaW5wdXRfYm1wOwotICBzb3VyY2UtPnB1Yi5maW5pc2hfaW5wdXQgPSBmaW5pc2hfaW5wdXRfYm1wOwotCi0gIHJldHVybiAoY2pwZWdfc291cmNlX3B0cikgc291cmNlOwotfQotCi0jZW5kaWYgLyogQk1QX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvcmRjb2xtYXAuYyBiL2xpYmpwZWd0d3JwL3JkY29sbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjM0MzcuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvcmRjb2xtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKgotICogcmRjb2xtYXAuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGltcGxlbWVudHMgZGpwZWcncyAiLW1hcCBmaWxlIiBzd2l0Y2guICBJdCByZWFkcyBhIHNvdXJjZSBpbWFnZQotICogYW5kIGNvbnN0cnVjdHMgYSBjb2xvcm1hcCB0byBiZSBzdXBwbGllZCB0byB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCi0gKgotICogQ3VycmVudGx5LCB0aGVzZSBmaWxlIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCBmb3IgdGhlIG1hcCBmaWxlOgotICogICBHSUY6IHRoZSBjb250ZW50cyBvZiB0aGUgR0lGJ3MgZ2xvYmFsIGNvbG9ybWFwIGFyZSB1c2VkLgotICogICBQUE0gKGVpdGhlciB0ZXh0IG9yIHJhdyBmbGF2b3IpOiB0aGUgZW50aXJlIGZpbGUgaXMgcmVhZCBhbmQKLSAqICAgICAgZWFjaCB1bmlxdWUgcGl4ZWwgdmFsdWUgaXMgZW50ZXJlZCBpbiB0aGUgbWFwLgotICogTm90ZSB0aGF0IHJlYWRpbmcgYSBsYXJnZSBQUE0gZmlsZSB3aWxsIGJlIGhvcnJlbmRvdXNseSBzbG93LgotICogVHlwaWNhbGx5LCBhIFBQTS1mb3JtYXQgbWFwIGZpbGUgc2hvdWxkIGNvbnRhaW4ganVzdCBvbmUgcGl4ZWwKLSAqIG9mIGVhY2ggZGVzaXJlZCBjb2xvci4gIFN1Y2ggYSBmaWxlIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBhbgotICogb3JkaW5hcnkgaW1hZ2UgUFBNIGZpbGUgd2l0aCBwcG10b21hcCgxKS4KLSAqCi0gKiBSZXNjYWxpbmcgYSBQUE0gdGhhdCBoYXMgYSBtYXh2YWwgdW5lcXVhbCB0byBNQVhKU0FNUExFIGlzIG5vdAotICogY3VycmVudGx5IGltcGxlbWVudGVkLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQJLyogb3RoZXJ3aXNlIGNhbid0IHF1YW50aXplIHRvIHN1cHBsaWVkIG1hcCAqLwotCi0vKiBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgYXJlIGJhc2VkIG9uIHRoZSBQQk1QTFVTIGxpYnJhcnksIHdoaWNoIGlzOgotKioKLSoqIENvcHlyaWdodCAoQykgMTk4OCBieSBKZWYgUG9za2FuemVyLgotKioKLSoqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotKiogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAotKiogdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSoqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSoqIGRvY3VtZW50YXRpb24uICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yCi0qKiBpbXBsaWVkIHdhcnJhbnR5LgotKi8KLQotCi0vKgotICogQWRkIGEgKHBvdGVudGlhbGx5KSBuZXcgY29sb3IgdG8gdGhlIGNvbG9yIG1hcC4KLSAqLwotCi1MT0NBTCh2b2lkKQotYWRkX21hcF9lbnRyeSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IFIsIGludCBHLCBpbnQgQikKLXsKLSAgSlNBTVBST1cgY29sb3JtYXAwID0gY2luZm8tPmNvbG9ybWFwWzBdOwotICBKU0FNUFJPVyBjb2xvcm1hcDEgPSBjaW5mby0+Y29sb3JtYXBbMV07Ci0gIEpTQU1QUk9XIGNvbG9ybWFwMiA9IGNpbmZvLT5jb2xvcm1hcFsyXTsKLSAgaW50IG5jb2xvcnMgPSBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnM7Ci0gIGludCBpbmRleDsKLQotICAvKiBDaGVjayBmb3IgZHVwbGljYXRlIGNvbG9yLiAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuY29sb3JzOyBpbmRleCsrKSB7Ci0gICAgaWYgKEdFVEpTQU1QTEUoY29sb3JtYXAwW2luZGV4XSkgPT0gUiAmJgotCUdFVEpTQU1QTEUoY29sb3JtYXAxW2luZGV4XSkgPT0gRyAmJgotCUdFVEpTQU1QTEUoY29sb3JtYXAyW2luZGV4XSkgPT0gQikKLSAgICAgIHJldHVybjsJCQkvKiBjb2xvciBpcyBhbHJlYWR5IGluIG1hcCAqLwotICB9Ci0KLSAgLyogQ2hlY2sgZm9yIG1hcCBvdmVyZmxvdy4gKi8KLSAgaWYgKG5jb2xvcnMgPj0gKE1BWEpTQU1QTEUrMSkpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfTUFOWV9DT0xPUlMsIChNQVhKU0FNUExFKzEpKTsKLQotICAvKiBPSywgYWRkIGNvbG9yIHRvIG1hcC4gKi8KLSAgY29sb3JtYXAwW25jb2xvcnNdID0gKEpTQU1QTEUpIFI7Ci0gIGNvbG9ybWFwMVtuY29sb3JzXSA9IChKU0FNUExFKSBHOwotICBjb2xvcm1hcDJbbmNvbG9yc10gPSAoSlNBTVBMRSkgQjsKLSAgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzKys7Ci19Ci0KLQotLyoKLSAqIEV4dHJhY3QgY29sb3IgbWFwIGZyb20gYSBHSUYgZmlsZS4KLSAqLwotCi1MT0NBTCh2b2lkKQotcmVhZF9naWZfbWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQotewotICBpbnQgaGVhZGVyWzEzXTsKLSAgaW50IGksIGNvbG9ybWFwbGVuOwotICBpbnQgUiwgRywgQjsKLQotICAvKiBJbml0aWFsICdHJyBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgYnkgcmVhZF9jb2xvcl9tYXAgKi8KLSAgLyogUmVhZCB0aGUgcmVzdCBvZiB0aGUgR0lGIGhlYWRlciBhbmQgbG9naWNhbCBzY3JlZW4gZGVzY3JpcHRvciAqLwotICBmb3IgKGkgPSAxOyBpIDwgMTM7IGkrKykgewotICAgIGlmICgoaGVhZGVyW2ldID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotICB9Ci0KLSAgLyogVmVyaWZ5IEdJRiBIZWFkZXIgKi8KLSAgaWYgKGhlYWRlclsxXSAhPSAnSScgfHwgaGVhZGVyWzJdICE9ICdGJykKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotCi0gIC8qIFRoZXJlIG11c3QgYmUgYSBnbG9iYWwgY29sb3IgbWFwLiAqLwotICBpZiAoKGhlYWRlclsxMF0gJiAweDgwKSA9PSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7Ci0KLSAgLyogT0ssIGZldGNoIGl0LiAqLwotICBjb2xvcm1hcGxlbiA9IDIgPDwgKGhlYWRlclsxMF0gJiAweDA3KTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY29sb3JtYXBsZW47IGkrKykgewotICAgIFIgPSBnZXRjKGluZmlsZSk7Ci0gICAgRyA9IGdldGMoaW5maWxlKTsKLSAgICBCID0gZ2V0YyhpbmZpbGUpOwotICAgIGlmIChSID09IEVPRiB8fCBHID09IEVPRiB8fCBCID09IEVPRikKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7Ci0gICAgYWRkX21hcF9lbnRyeShjaW5mbywKLQkJICBSIDw8IChCSVRTX0lOX0pTQU1QTEUtOCksCi0JCSAgRyA8PCAoQklUU19JTl9KU0FNUExFLTgpLAotCQkgIEIgPDwgKEJJVFNfSU5fSlNBTVBMRS04KSk7Ci0gIH0KLX0KLQotCi0vKiBTdXBwb3J0IHJvdXRpbmVzIGZvciByZWFkaW5nIFBQTSAqLwotCi0KLUxPQ0FMKGludCkKLXBibV9nZXRjIChGSUxFICogaW5maWxlKQotLyogUmVhZCBuZXh0IGNoYXIsIHNraXBwaW5nIG92ZXIgYW55IGNvbW1lbnRzICovCi0vKiBBIGNvbW1lbnQvbmV3bGluZSBzZXF1ZW5jZSBpcyByZXR1cm5lZCBhcyBhIG5ld2xpbmUgKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGNoOwotICAKLSAgY2ggPSBnZXRjKGluZmlsZSk7Ci0gIGlmIChjaCA9PSAnIycpIHsKLSAgICBkbyB7Ci0gICAgICBjaCA9IGdldGMoaW5maWxlKTsKLSAgICB9IHdoaWxlIChjaCAhPSAnXG4nICYmIGNoICE9IEVPRik7Ci0gIH0KLSAgcmV0dXJuIGNoOwotfQotCi0KLUxPQ0FMKHVuc2lnbmVkIGludCkKLXJlYWRfcGJtX2ludGVnZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCi0vKiBSZWFkIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlciBmcm9tIHRoZSBQUE0gZmlsZSAqLwotLyogU3dhbGxvd3Mgb25lIHRyYWlsaW5nIGNoYXJhY3RlciBhZnRlciB0aGUgaW50ZWdlciAqLwotLyogTm90ZSB0aGF0IG9uIGEgMTYtYml0LWludCBtYWNoaW5lLCBvbmx5IHZhbHVlcyB1cCB0byA2NGsgY2FuIGJlIHJlYWQuICovCi0vKiBUaGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtIGluIHByYWN0aWNlLiAqLwotewotICByZWdpc3RlciBpbnQgY2g7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCB2YWw7Ci0gIAotICAvKiBTa2lwIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgZG8gewotICAgIGNoID0gcGJtX2dldGMoaW5maWxlKTsKLSAgICBpZiAoY2ggPT0gRU9GKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKLSAgfSB3aGlsZSAoY2ggPT0gJyAnIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInKTsKLSAgCi0gIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotICAKLSAgdmFsID0gY2ggLSAnMCc7Ci0gIHdoaWxlICgoY2ggPSBwYm1fZ2V0YyhpbmZpbGUpKSA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgdmFsICo9IDEwOwotICAgIHZhbCArPSBjaCAtICcwJzsKLSAgfQotICByZXR1cm4gdmFsOwotfQotCi0KLS8qCi0gKiBFeHRyYWN0IGNvbG9yIG1hcCBmcm9tIGEgUFBNIGZpbGUuCi0gKi8KLQotTE9DQUwodm9pZCkKLXJlYWRfcHBtX21hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKLXsKLSAgaW50IGM7Ci0gIHVuc2lnbmVkIGludCB3LCBoLCBtYXh2YWwsIHJvdywgY29sOwotICBpbnQgUiwgRywgQjsKLQotICAvKiBJbml0aWFsICdQJyBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgYnkgcmVhZF9jb2xvcl9tYXAgKi8KLSAgYyA9IGdldGMoaW5maWxlKTsJCS8qIHNhdmUgZm9ybWF0IGRpc2NyaW1pbmF0b3IgZm9yIGEgc2VjICovCi0KLSAgLyogd2hpbGUgd2UgZmV0Y2ggdGhlIHJlbWFpbmluZyBoZWFkZXIgaW5mbyAqLwotICB3ID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKLSAgaCA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSk7Ci0gIG1heHZhbCA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSk7Ci0KLSAgaWYgKHcgPD0gMCB8fCBoIDw9IDAgfHwgbWF4dmFsIDw9IDApIC8qIGVycm9yIGNoZWNrICovCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKLQotICAvKiBGb3Igbm93LCB3ZSBkb24ndCBzdXBwb3J0IHJlc2NhbGluZyBmcm9tIGFuIHVudXN1YWwgbWF4dmFsLiAqLwotICBpZiAobWF4dmFsICE9ICh1bnNpZ25lZCBpbnQpIE1BWEpTQU1QTEUpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKLQotICBzd2l0Y2ggKGMpIHsKLSAgY2FzZSAnMyc6CQkJLyogaXQncyBhIHRleHQtZm9ybWF0IFBQTSBmaWxlICovCi0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBoOyByb3crKykgewotICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3OyBjb2wrKykgewotCVIgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOwotCUcgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOwotCUIgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOwotCWFkZF9tYXBfZW50cnkoY2luZm8sIFIsIEcsIEIpOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlICc2JzoJCQkvKiBpdCdzIGEgcmF3LWZvcm1hdCBQUE0gZmlsZSAqLwotICAgIGZvciAocm93ID0gMDsgcm93IDwgaDsgcm93KyspIHsKLSAgICAgIGZvciAoY29sID0gMDsgY29sIDwgdzsgY29sKyspIHsKLQlSID0gZ2V0YyhpbmZpbGUpOwotCUcgPSBnZXRjKGluZmlsZSk7Ci0JQiA9IGdldGMoaW5maWxlKTsKLQlpZiAoUiA9PSBFT0YgfHwgRyA9PSBFT0YgfHwgQiA9PSBFT0YpCi0JICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotCWFkZF9tYXBfZW50cnkoY2luZm8sIFIsIEcsIEIpOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotCi0vKgotICogTWFpbiBlbnRyeSBwb2ludCBmcm9tIGRqcGVnLmMuCi0gKiAgSW5wdXQ6IG9wZW5lZCBpbnB1dCBmaWxlIChmcm9tIGZpbGUgbmFtZSBhcmd1bWVudCBvbiBjb21tYW5kIGxpbmUpLgotICogIE91dHB1dDogY29sb3JtYXAgYW5kIGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzIGZpZWxkcyBhcmUgc2V0IGluIGNpbmZvLgotICovCi0KLUdMT0JBTCh2b2lkKQotcmVhZF9jb2xvcl9tYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCi17Ci0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNvbG9yIG1hcCBvZiBtYXhpbXVtIHN1cHBvcnRlZCBzaXplLiAqLwotICBjaW5mby0+Y29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAoSkRJTUVOU0lPTikgKE1BWEpTQU1QTEUrMSksIChKRElNRU5TSU9OKSAzKTsKLSAgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzID0gMDsgLyogaW5pdGlhbGl6ZSBtYXAgdG8gZW1wdHkgKi8KLQotICAvKiBSZWFkIGZpcnN0IGJ5dGUgdG8gZGV0ZXJtaW5lIGZpbGUgZm9ybWF0ICovCi0gIHN3aXRjaCAoZ2V0YyhpbmZpbGUpKSB7Ci0gIGNhc2UgJ0cnOgotICAgIHJlYWRfZ2lmX21hcChjaW5mbywgaW5maWxlKTsKLSAgICBicmVhazsKLSAgY2FzZSAnUCc6Ci0gICAgcmVhZF9wcG1fbWFwKGNpbmZvLCBpbmZpbGUpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvcmRnaWYuYyBiL2xpYmpwZWd0d3JwL3JkZ2lmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyN2MxNjcuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvcmRnaWYuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiByZGdpZi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcmVhZCBpbnB1dCBpbWFnZXMgaW4gR0lGIGZvcm1hdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE5PVEU6IHRvIGF2b2lkIGVudGFuZ2xlbWVudHMgd2l0aCBVbmlzeXMnIHBhdGVudCBvbiBMWlcgY29tcHJlc3Npb24sICAgICAgKgotICogdGhlIGFiaWxpdHkgdG8gcmVhZCBHSUYgZmlsZXMgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBJSkcgZGlzdHJpYnV0aW9uLiAqCi0gKiBTb3JyeSBhYm91dCB0aGF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFdlIGFyZSByZXF1aXJlZCB0byBzdGF0ZSB0aGF0Ci0gKiAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCi0gKiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4gR0lGKHNtKSBpcyBhIFNlcnZpY2UgTWFyayBwcm9wZXJ0eSBvZgotICogICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBHSUZfU1VQUE9SVEVECi0KLS8qCi0gKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBHSUYgZm9ybWF0IGlucHV0LgotICovCi0KLUdMT0JBTChjanBlZ19zb3VyY2VfcHRyKQotamluaXRfcmVhZF9naWYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBmcHJpbnRmKHN0ZGVyciwgIkdJRiBpbnB1dCBpcyB1bnN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4gIFNvcnJ5LlxuIik7Ci0gIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgcmV0dXJuIE5VTEw7CQkJLyoga2VlcCBjb21waWxlciBoYXBweSAqLwotfQotCi0jZW5kaWYgLyogR0lGX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvcmRqcGdjb20uMSBiL2xpYmpwZWd0d3JwL3JkanBnY29tLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYmEwNGUuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvcmRqcGdjb20uMQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS5USCBSREpQR0NPTSAxICIxMSBPY3RvYmVyIDE5OTciCi0uU0ggTkFNRQotcmRqcGdjb20gXC0gZGlzcGxheSB0ZXh0IGNvbW1lbnRzIGZyb20gYSBKUEVHIGZpbGUKLS5TSCBTWU5PUFNJUwotLkIgcmRqcGdjb20KLVsKLS5CIFwtdmVyYm9zZQotXQotWwotLkkgZmlsZW5hbWUKLV0KLS5MUAotLlNIIERFU0NSSVBUSU9OCi0uTFAKLS5CIHJkanBnY29tCi1yZWFkcyB0aGUgbmFtZWQgSlBFRy9KRklGIGZpbGUsIG9yIHRoZSBzdGFuZGFyZCBpbnB1dCBpZiBubyBmaWxlIGlzIG5hbWVkLAotYW5kIHByaW50cyBhbnkgdGV4dCBjb21tZW50cyBmb3VuZCBpbiB0aGUgZmlsZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotLlBQCi1UaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgImNvbW1lbnQiIChDT00pIGJsb2NrcyB0byBvY2N1ciB3aXRoaW4gYSBKUEVHIGZpbGUuCi1BbHRob3VnaCB0aGUgc3RhbmRhcmQgZG9lc24ndCBhY3R1YWxseSBkZWZpbmUgd2hhdCBDT00gYmxvY2tzIGFyZSBmb3IsIHRoZXkKLWFyZSB3aWRlbHkgdXNlZCB0byBob2xkIHVzZXItc3VwcGxpZWQgdGV4dCBzdHJpbmdzLiAgVGhpcyBsZXRzIHlvdSBhZGQKLWFubm90YXRpb25zLCB0aXRsZXMsIGluZGV4IHRlcm1zLCBldGMgdG8geW91ciBKUEVHIGZpbGVzLCBhbmQgbGF0ZXIgcmV0cmlldmUKLXRoZW0gYXMgdGV4dC4gIENPTSBibG9ja3MgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBpbWFnZSBzdG9yZWQgaW4gdGhlIEpQRUcKLWZpbGUuICBUaGUgbWF4aW11bSBzaXplIG9mIGEgQ09NIGJsb2NrIGlzIDY0SywgYnV0IHlvdSBjYW4gaGF2ZSBhcyBtYW55IG9mCi10aGVtIGFzIHlvdSBsaWtlIGluIG9uZSBKUEVHIGZpbGUuCi0uU0ggT1BUSU9OUwotLlRQCi0uQiBcLXZlcmJvc2UKLUNhdXNlcwotLkIgcmRqcGdjb20KLXRvIGFsc28gZGlzcGxheSB0aGUgSlBFRyBpbWFnZSBkaW1lbnNpb25zLgotLlBQCi1Td2l0Y2ggbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkLCBhbmQgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZS4KLS5TSCBISU5UUwotLkIgcmRqcGdjb20KLWRvZXMgbm90IGRlcGVuZCBvbiB0aGUgSUpHIEpQRUcgbGlicmFyeS4gIEl0cyBzb3VyY2UgY29kZSBpcyBpbnRlbmRlZCBhcyBhbgotaWxsdXN0cmF0aW9uIG9mIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb2RlIHJlcXVpcmVkIHRvIHBhcnNlIGEgSlBFRyBmaWxlCi1oZWFkZXIgY29ycmVjdGx5LgotLlBQCi1JbgotLkIgXC12ZXJib3NlCi1tb2RlLAotLkIgcmRqcGdjb20KLXdpbGwgYWxzbyBhdHRlbXB0IHRvIHByaW50IHRoZSBjb250ZW50cyBvZiBhbnkgIkFQUDEyIiBtYXJrZXJzIGFzIHRleHQuCi1Tb21lIGRpZ2l0YWwgY2FtZXJhcyBwcm9kdWNlIEFQUDEyIG1hcmtlcnMgY29udGFpbmluZyB1c2VmdWwgdGV4dHVhbAotaW5mb3JtYXRpb24uICBJZiB5b3UgbGlrZSwgeW91IGNhbiBtb2RpZnkgdGhlIHNvdXJjZSBjb2RlIHRvIHByaW50Ci1vdGhlciBBUFBuIG1hcmtlciB0eXBlcyBhcyB3ZWxsLgotLlNIIFNFRSBBTFNPCi0uQlIgY2pwZWcgKDEpLAotLkJSIGRqcGVnICgxKSwKLS5CUiBqcGVndHJhbiAoMSksCi0uQlIgd3JqcGdjb20gKDEpCi0uU0ggQVVUSE9SCi1JbmRlcGVuZGVudCBKUEVHIEdyb3VwCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9yZGpwZ2NvbS5jIGIvbGlianBlZ3R3cnAvcmRqcGdjb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlNmZjNi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9yZGpwZ2NvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLS8qCi0gKiByZGpwZ2NvbS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYSB2ZXJ5IHNpbXBsZSBzdGFuZC1hbG9uZSBhcHBsaWNhdGlvbiB0aGF0IGRpc3BsYXlzCi0gKiB0aGUgdGV4dCBpbiBDT00gKGNvbW1lbnQpIG1hcmtlcnMgaW4gYSBKRklGIGZpbGUuCi0gKiBUaGlzIG1heSBiZSB1c2VmdWwgYXMgYW4gZXhhbXBsZSBvZiB0aGUgbWluaW11bSBsb2dpYyBuZWVkZWQgdG8gcGFyc2UKLSAqIEpQRUcgbWFya2Vycy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfQ0pQRUdfREpQRUcJLyogdG8gZ2V0IHRoZSBjb21tYW5kLWxpbmUgY29uZmlnIHN5bWJvbHMgKi8KLSNpbmNsdWRlICJqaW5jbHVkZS5oIgkJLyogZ2V0IGF1dG8tY29uZmlnIHN5bWJvbHMsIDxzdGRpby5oPiAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXN1cHBlcigpLCB0b2xvd2VyKCkgKi8KLSNpZmRlZiBVU0VfU0VUTU9ERQotI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSdzIHBhcmFtZXRlciBtYWNyb3MgKi8KLS8qIElmIHlvdSBoYXZlIHNldG1vZGUoKSBidXQgbm90IDxpby5oPiwganVzdCBkZWxldGUgdGhpcyBsaW5lOiAqLwotI2luY2x1ZGUgPGlvLmg+CQkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkgKi8KLSNlbmRpZgotCi0jaWZkZWYgVVNFX0NDT01NQU5ECQkvKiBjb21tYW5kLWxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KLSNpZmRlZiBfX01XRVJLU19fCi0jaW5jbHVkZSA8U0lPVVguaD4gICAgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgbmVlZHMgdGhpcyAqLwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIC4uLiBhbmQgdGhpcyAqLwotI2VuZGlmCi0jaWZkZWYgVEhJTktfQwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIFRoaW5rIGRlY2xhcmVzIGl0IGhlcmUgKi8KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCi0jZWxzZQotI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgotI2Vsc2UJCQkJLyogc3RhbmRhcmQgQU5TSS1jb21wbGlhbnQgY2FzZSAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEVYSVRfRkFJTFVSRQkJLyogZGVmaW5lIGV4aXQoKSBjb2RlcyBpZiBub3QgcHJvdmlkZWQgKi8KLSNkZWZpbmUgRVhJVF9GQUlMVVJFICAxCi0jZW5kaWYKLSNpZm5kZWYgRVhJVF9TVUNDRVNTCi0jaWZkZWYgVk1TCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KLSNlbHNlCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMAotI2VuZGlmCi0jZW5kaWYKLQotCi0vKgotICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIHJlYWQgdGhlIGlucHV0IGZpbGUuCi0gKiBUbyByZXVzZSB0aGlzIGNvZGUgaW4gYW5vdGhlciBhcHBsaWNhdGlvbiwgeW91IG1pZ2h0IG5lZWQgdG8gY2hhbmdlIHRoZXNlLgotICovCi0KLXN0YXRpYyBGSUxFICogaW5maWxlOwkJLyogaW5wdXQgSlBFRyBmaWxlICovCi0KLS8qIFJldHVybiBuZXh0IGlucHV0IGJ5dGUsIG9yIEVPRiBpZiBubyBtb3JlICovCi0jZGVmaW5lIE5FWFRCWVRFKCkgIGdldGMoaW5maWxlKQotCi0KLS8qIEVycm9yIGV4aXQgaGFuZGxlciAqLwotI2RlZmluZSBFUlJFWElUKG1zZykgIChmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtc2cpLCBleGl0KEVYSVRfRkFJTFVSRSkpCi0KLQotLyogUmVhZCBvbmUgYnl0ZSwgdGVzdGluZyBmb3IgRU9GICovCi1zdGF0aWMgaW50Ci1yZWFkXzFfYnl0ZSAodm9pZCkKLXsKLSAgaW50IGM7Ci0KLSAgYyA9IE5FWFRCWVRFKCk7Ci0gIGlmIChjID09IEVPRikKLSAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOwotICByZXR1cm4gYzsKLX0KLQotLyogUmVhZCAyIGJ5dGVzLCBjb252ZXJ0IHRvIHVuc2lnbmVkIGludCAqLwotLyogQWxsIDItYnl0ZSBxdWFudGl0aWVzIGluIEpQRUcgbWFya2VycyBhcmUgTVNCIGZpcnN0ICovCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzJfYnl0ZXMgKHZvaWQpCi17Ci0gIGludCBjMSwgYzI7Ci0KLSAgYzEgPSBORVhUQllURSgpOwotICBpZiAoYzEgPT0gRU9GKQotICAgIEVSUkVYSVQoIlByZW1hdHVyZSBFT0YgaW4gSlBFRyBmaWxlIik7Ci0gIGMyID0gTkVYVEJZVEUoKTsKLSAgaWYgKGMyID09IEVPRikKLSAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOwotICByZXR1cm4gKCgodW5zaWduZWQgaW50KSBjMSkgPDwgOCkgKyAoKHVuc2lnbmVkIGludCkgYzIpOwotfQotCi0KLS8qCi0gKiBKUEVHIG1hcmtlcnMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSAweEZGIGJ5dGVzLCBmb2xsb3dlZCBieSBhIG1hcmtlcgotICogY29kZSBieXRlICh3aGljaCBpcyBub3QgYW4gRkYpLiAgSGVyZSBhcmUgdGhlIG1hcmtlciBjb2RlcyBvZiBpbnRlcmVzdAotICogaW4gdGhpcyBwcm9ncmFtLiAgKFNlZSBqZG1hcmtlci5jIGZvciBhIG1vcmUgY29tcGxldGUgbGlzdC4pCi0gKi8KLQotI2RlZmluZSBNX1NPRjAgIDB4QzAJCS8qIFN0YXJ0IE9mIEZyYW1lIE4gKi8KLSNkZWZpbmUgTV9TT0YxICAweEMxCQkvKiBOIGluZGljYXRlcyB3aGljaCBjb21wcmVzc2lvbiBwcm9jZXNzICovCi0jZGVmaW5lIE1fU09GMiAgMHhDMgkJLyogT25seSBTT0YwLVNPRjIgYXJlIG5vdyBpbiBjb21tb24gdXNlICovCi0jZGVmaW5lIE1fU09GMyAgMHhDMwotI2RlZmluZSBNX1NPRjUgIDB4QzUJCS8qIE5COiBjb2RlcyBDNCBhbmQgQ0MgYXJlIE5PVCBTT0YgbWFya2VycyAqLwotI2RlZmluZSBNX1NPRjYgIDB4QzYKLSNkZWZpbmUgTV9TT0Y3ICAweEM3Ci0jZGVmaW5lIE1fU09GOSAgMHhDOQotI2RlZmluZSBNX1NPRjEwIDB4Q0EKLSNkZWZpbmUgTV9TT0YxMSAweENCCi0jZGVmaW5lIE1fU09GMTMgMHhDRAotI2RlZmluZSBNX1NPRjE0IDB4Q0UKLSNkZWZpbmUgTV9TT0YxNSAweENGCi0jZGVmaW5lIE1fU09JICAgMHhEOAkJLyogU3RhcnQgT2YgSW1hZ2UgKGJlZ2lubmluZyBvZiBkYXRhc3RyZWFtKSAqLwotI2RlZmluZSBNX0VPSSAgIDB4RDkJCS8qIEVuZCBPZiBJbWFnZSAoZW5kIG9mIGRhdGFzdHJlYW0pICovCi0jZGVmaW5lIE1fU09TICAgMHhEQQkJLyogU3RhcnQgT2YgU2NhbiAoYmVnaW5zIGNvbXByZXNzZWQgZGF0YSkgKi8KLSNkZWZpbmUgTV9BUFAwCTB4RTAJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIG1hcmtlciwgdHlwZSBOICovCi0jZGVmaW5lIE1fQVBQMTIJMHhFQwkJLyogKHdlIGRvbid0IGJvdGhlciB0byBsaXN0IGFsbCAxNiBBUFBuJ3MpICovCi0jZGVmaW5lIE1fQ09NICAgMHhGRQkJLyogQ09NbWVudCAqLwotCi0KLS8qCi0gKiBGaW5kIHRoZSBuZXh0IEpQRUcgbWFya2VyIGFuZCByZXR1cm4gaXRzIG1hcmtlciBjb2RlLgotICogV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBGRiBieXRlLCBwb3NzaWJseSBtb3JlIGlmIHRoZSBjb21wcmVzc29yIHVzZWQgRkZzCi0gKiB0byBwYWQgdGhlIGZpbGUuCi0gKiBUaGVyZSBjb3VsZCBhbHNvIGJlIG5vbi1GRiBnYXJiYWdlIGJldHdlZW4gbWFya2Vycy4gIFRoZSB0cmVhdG1lbnQgb2Ygc3VjaAotICogZ2FyYmFnZSBpcyB1bnNwZWNpZmllZDsgd2UgY2hvb3NlIHRvIHNraXAgb3ZlciBpdCBidXQgZW1pdCBhIHdhcm5pbmcgbXNnLgotICogTkI6IHRoaXMgcm91dGluZSBtdXN0IG5vdCBiZSB1c2VkIGFmdGVyIHNlZWluZyBTT1MgbWFya2VyLCBzaW5jZSBpdCB3aWxsCi0gKiBub3QgZGVhbCBjb3JyZWN0bHkgd2l0aCBGRi8wMCBzZXF1ZW5jZXMgaW4gdGhlIGNvbXByZXNzZWQgaW1hZ2UgZGF0YS4uLgotICovCi0KLXN0YXRpYyBpbnQKLW5leHRfbWFya2VyICh2b2lkKQotewotICBpbnQgYzsKLSAgaW50IGRpc2NhcmRlZF9ieXRlcyA9IDA7Ci0KLSAgLyogRmluZCAweEZGIGJ5dGU7IGNvdW50IGFuZCBza2lwIGFueSBub24tRkZzLiAqLwotICBjID0gcmVhZF8xX2J5dGUoKTsKLSAgd2hpbGUgKGMgIT0gMHhGRikgewotICAgIGRpc2NhcmRlZF9ieXRlcysrOwotICAgIGMgPSByZWFkXzFfYnl0ZSgpOwotICB9Ci0gIC8qIEdldCBtYXJrZXIgY29kZSBieXRlLCBzd2FsbG93aW5nIGFueSBkdXBsaWNhdGUgRkYgYnl0ZXMuICBFeHRyYSBGRnMKLSAgICogYXJlIGxlZ2FsIGFzIHBhZCBieXRlcywgc28gZG9uJ3QgY291bnQgdGhlbSBpbiBkaXNjYXJkZWRfYnl0ZXMuCi0gICAqLwotICBkbyB7Ci0gICAgYyA9IHJlYWRfMV9ieXRlKCk7Ci0gIH0gd2hpbGUgKGMgPT0gMHhGRik7Ci0KLSAgaWYgKGRpc2NhcmRlZF9ieXRlcyAhPSAwKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBnYXJiYWdlIGRhdGEgZm91bmQgaW4gSlBFRyBmaWxlXG4iKTsKLSAgfQotCi0gIHJldHVybiBjOwotfQotCi0KLS8qCi0gKiBSZWFkIHRoZSBpbml0aWFsIG1hcmtlciwgd2hpY2ggc2hvdWxkIGJlIFNPSS4KLSAqIEZvciBhIEpGSUYgZmlsZSwgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgZmlsZSBzaG91bGQgYmUgbGl0ZXJhbGx5Ci0gKiAweEZGIE1fU09JLiAgVG8gYmUgbW9yZSBnZW5lcmFsLCB3ZSBjb3VsZCB1c2UgbmV4dF9tYXJrZXIsIGJ1dCBpZiB0aGUKLSAqIGlucHV0IGZpbGUgd2VyZW4ndCBhY3R1YWxseSBKUEVHIGF0IGFsbCwgbmV4dF9tYXJrZXIgbWlnaHQgcmVhZCB0aGUgd2hvbGUKLSAqIGZpbGUgYW5kIHRoZW4gcmV0dXJuIGEgbWlzbGVhZGluZyBlcnJvciBtZXNzYWdlLi4uCi0gKi8KLQotc3RhdGljIGludAotZmlyc3RfbWFya2VyICh2b2lkKQotewotICBpbnQgYzEsIGMyOwotCi0gIGMxID0gTkVYVEJZVEUoKTsKLSAgYzIgPSBORVhUQllURSgpOwotICBpZiAoYzEgIT0gMHhGRiB8fCBjMiAhPSBNX1NPSSkKLSAgICBFUlJFWElUKCJOb3QgYSBKUEVHIGZpbGUiKTsKLSAgcmV0dXJuIGMyOwotfQotCi0KLS8qCi0gKiBNb3N0IHR5cGVzIG9mIG1hcmtlciBhcmUgZm9sbG93ZWQgYnkgYSB2YXJpYWJsZS1sZW5ndGggcGFyYW1ldGVyIHNlZ21lbnQuCi0gKiBUaGlzIHJvdXRpbmUgc2tpcHMgb3ZlciB0aGUgcGFyYW1ldGVycyBmb3IgYW55IG1hcmtlciB3ZSBkb24ndCBvdGhlcndpc2UKLSAqIHdhbnQgdG8gcHJvY2Vzcy4KLSAqIE5vdGUgdGhhdCB3ZSBNVVNUIHNraXAgdGhlIHBhcmFtZXRlciBzZWdtZW50IGV4cGxpY2l0bHkgaW4gb3JkZXIgbm90IHRvCi0gKiBiZSBmb29sZWQgYnkgMHhGRiBieXRlcyB0aGF0IG1pZ2h0IGFwcGVhciB3aXRoaW4gdGhlIHBhcmFtZXRlciBzZWdtZW50OwotICogc3VjaCBieXRlcyBkbyBOT1QgaW50cm9kdWNlIG5ldyBtYXJrZXJzLgotICovCi0KLXN0YXRpYyB2b2lkCi1za2lwX3ZhcmlhYmxlICh2b2lkKQotLyogU2tpcCBvdmVyIGFuIHVua25vd24gb3IgdW5pbnRlcmVzdGluZyB2YXJpYWJsZS1sZW5ndGggbWFya2VyICovCi17Ci0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0KLSAgLyogR2V0IHRoZSBtYXJrZXIgcGFyYW1ldGVyIGxlbmd0aCBjb3VudCAqLwotICBsZW5ndGggPSByZWFkXzJfYnl0ZXMoKTsKLSAgLyogTGVuZ3RoIGluY2x1ZGVzIGl0c2VsZiwgc28gbXVzdCBiZSBhdCBsZWFzdCAyICovCi0gIGlmIChsZW5ndGggPCAyKQotICAgIEVSUkVYSVQoIkVycm9uZW91cyBKUEVHIG1hcmtlciBsZW5ndGgiKTsKLSAgbGVuZ3RoIC09IDI7Ci0gIC8qIFNraXAgb3ZlciB0aGUgcmVtYWluaW5nIGJ5dGVzICovCi0gIHdoaWxlIChsZW5ndGggPiAwKSB7Ci0gICAgKHZvaWQpIHJlYWRfMV9ieXRlKCk7Ci0gICAgbGVuZ3RoLS07Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBhIENPTSBtYXJrZXIuCi0gKiBXZSB3YW50IHRvIHByaW50IG91dCB0aGUgbWFya2VyIGNvbnRlbnRzIGFzIGxlZ2libGUgdGV4dDsKLSAqIHdlIG11c3QgZ3VhcmQgYWdhaW5zdCBub24tdGV4dCBqdW5rIGFuZCB2YXJ5aW5nIG5ld2xpbmUgcmVwcmVzZW50YXRpb25zLgotICovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX0NPTSAodm9pZCkKLXsKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSAgaW50IGNoOwotICBpbnQgbGFzdGNoID0gMDsKLQotICAvKiBHZXQgdGhlIG1hcmtlciBwYXJhbWV0ZXIgbGVuZ3RoIGNvdW50ICovCi0gIGxlbmd0aCA9IHJlYWRfMl9ieXRlcygpOwotICAvKiBMZW5ndGggaW5jbHVkZXMgaXRzZWxmLCBzbyBtdXN0IGJlIGF0IGxlYXN0IDIgKi8KLSAgaWYgKGxlbmd0aCA8IDIpCi0gICAgRVJSRVhJVCgiRXJyb25lb3VzIEpQRUcgbWFya2VyIGxlbmd0aCIpOwotICBsZW5ndGggLT0gMjsKLQotICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgIGNoID0gcmVhZF8xX2J5dGUoKTsKLSAgICAvKiBFbWl0IHRoZSBjaGFyYWN0ZXIgaW4gYSByZWFkYWJsZSBmb3JtLgotICAgICAqIE5vbnByaW50YWJsZXMgYXJlIGNvbnZlcnRlZCB0byBcbm5uIGZvcm0sCi0gICAgICogd2hpbGUgXCBpcyBjb252ZXJ0ZWQgdG8gXFwuCi0gICAgICogTmV3bGluZXMgaW4gQ1IsIENSL0xGLCBvciBMRiBmb3JtIHdpbGwgYmUgcHJpbnRlZCBhcyBvbmUgbmV3bGluZS4KLSAgICAgKi8KLSAgICBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgaWYgKGxhc3RjaCAhPSAnXHInKQotCXByaW50ZigiXG4iKTsKLSAgICB9IGVsc2UgaWYgKGNoID09ICdcXCcpIHsKLSAgICAgIHByaW50ZigiXFxcXCIpOwotICAgIH0gZWxzZSBpZiAoaXNwcmludChjaCkpIHsKLSAgICAgIHB1dGMoY2gsIHN0ZG91dCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZigiXFwlMDNvIiwgY2gpOwotICAgIH0KLSAgICBsYXN0Y2ggPSBjaDsKLSAgICBsZW5ndGgtLTsKLSAgfQotICBwcmludGYoIlxuIik7Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3MgYSBTT0ZuIG1hcmtlci4KLSAqIFRoaXMgY29kZSBpcyBvbmx5IG5lZWRlZCBpZiB5b3Ugd2FudCB0byBrbm93IHRoZSBpbWFnZSBkaW1lbnNpb25zLi4uCi0gKi8KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfU09GbiAoaW50IG1hcmtlcikKLXsKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSAgdW5zaWduZWQgaW50IGltYWdlX2hlaWdodCwgaW1hZ2Vfd2lkdGg7Ci0gIGludCBkYXRhX3ByZWNpc2lvbiwgbnVtX2NvbXBvbmVudHM7Ci0gIGNvbnN0IGNoYXIgKiBwcm9jZXNzOwotICBpbnQgY2k7Ci0KLSAgbGVuZ3RoID0gcmVhZF8yX2J5dGVzKCk7CS8qIHVzdWFsIHBhcmFtZXRlciBsZW5ndGggY291bnQgKi8KLQotICBkYXRhX3ByZWNpc2lvbiA9IHJlYWRfMV9ieXRlKCk7Ci0gIGltYWdlX2hlaWdodCA9IHJlYWRfMl9ieXRlcygpOwotICBpbWFnZV93aWR0aCA9IHJlYWRfMl9ieXRlcygpOwotICBudW1fY29tcG9uZW50cyA9IHJlYWRfMV9ieXRlKCk7Ci0KLSAgc3dpdGNoIChtYXJrZXIpIHsKLSAgY2FzZSBNX1NPRjA6CXByb2Nlc3MgPSAiQmFzZWxpbmUiOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0YxOglwcm9jZXNzID0gIkV4dGVuZGVkIHNlcXVlbnRpYWwiOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0YyOglwcm9jZXNzID0gIlByb2dyZXNzaXZlIjsgIGJyZWFrOwotICBjYXNlIE1fU09GMzoJcHJvY2VzcyA9ICJMb3NzbGVzcyI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjU6CXByb2Nlc3MgPSAiRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwiOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0Y2Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjc6CXByb2Nlc3MgPSAiRGlmZmVyZW50aWFsIGxvc3NsZXNzIjsgIGJyZWFrOwotICBjYXNlIE1fU09GOToJcHJvY2VzcyA9ICJFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjEwOglwcm9jZXNzID0gIlByb2dyZXNzaXZlLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjExOglwcm9jZXNzID0gIkxvc3NsZXNzLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjEzOglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjE0Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyBjb2RpbmciOyBicmVhazsKLSAgY2FzZSBNX1NPRjE1Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBsb3NzbGVzcywgYXJpdGhtZXRpYyBjb2RpbmciOyAgYnJlYWs7Ci0gIGRlZmF1bHQ6CXByb2Nlc3MgPSAiVW5rbm93biI7ICBicmVhazsKLSAgfQotCi0gIHByaW50ZigiSlBFRyBpbWFnZSBpcyAldXcgKiAldWgsICVkIGNvbG9yIGNvbXBvbmVudHMsICVkIGJpdHMgcGVyIHNhbXBsZVxuIiwKLQkgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgbnVtX2NvbXBvbmVudHMsIGRhdGFfcHJlY2lzaW9uKTsKLSAgcHJpbnRmKCJKUEVHIHByb2Nlc3M6ICVzXG4iLCBwcm9jZXNzKTsKLQotICBpZiAobGVuZ3RoICE9ICh1bnNpZ25lZCBpbnQpICg4ICsgbnVtX2NvbXBvbmVudHMgKiAzKSkKLSAgICBFUlJFWElUKCJCb2d1cyBTT0YgbWFya2VyIGxlbmd0aCIpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IG51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgKHZvaWQpIHJlYWRfMV9ieXRlKCk7CS8qIENvbXBvbmVudCBJRCBjb2RlICovCi0gICAgKHZvaWQpIHJlYWRfMV9ieXRlKCk7CS8qIEgsIFYgc2FtcGxpbmcgZmFjdG9ycyAqLwotICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOwkvKiBRdWFudGl6YXRpb24gdGFibGUgbnVtYmVyICovCi0gIH0KLX0KLQotCi0vKgotICogUGFyc2UgdGhlIG1hcmtlciBzdHJlYW0gdW50aWwgU09TIG9yIEVPSSBpcyBzZWVuOwotICogZGlzcGxheSBhbnkgQ09NIG1hcmtlcnMuCi0gKiBXaGlsZSB0aGUgY29tcGFuaW9uIHByb2dyYW0gd3JqcGdjb20gd2lsbCBhbHdheXMgaW5zZXJ0IENPTSBtYXJrZXJzIGJlZm9yZQotICogU09Gbiwgb3RoZXIgaW1wbGVtZW50YXRpb25zIG1pZ2h0IG5vdCwgc28gd2Ugc2NhbiB0byBTT1MgYmVmb3JlIHN0b3BwaW5nLgotICogSWYgd2Ugd2VyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGltYWdlIGRpbWVuc2lvbnMsIHdlIHdvdWxkIHN0b3AgYXQgU09Gbi4KLSAqIChDb252ZXJzZWx5LCBpZiB3ZSBvbmx5IGNhcmVkIGFib3V0IENPTSBtYXJrZXJzLCB0aGVyZSB3b3VsZCBiZSBubyBuZWVkCi0gKiBmb3Igc3BlY2lhbCBjb2RlIHRvIGhhbmRsZSBTT0ZuOyB3ZSBjb3VsZCB0cmVhdCBpdCBsaWtlIG90aGVyIG1hcmtlcnMuKQotICovCi0KLXN0YXRpYyBpbnQKLXNjYW5fSlBFR19oZWFkZXIgKGludCB2ZXJib3NlKQotewotICBpbnQgbWFya2VyOwotCi0gIC8qIEV4cGVjdCBTT0kgYXQgc3RhcnQgb2YgZmlsZSAqLwotICBpZiAoZmlyc3RfbWFya2VyKCkgIT0gTV9TT0kpCi0gICAgRVJSRVhJVCgiRXhwZWN0ZWQgU09JIG1hcmtlciBmaXJzdCIpOwotCi0gIC8qIFNjYW4gbWlzY2VsbGFuZW91cyBtYXJrZXJzIHVudGlsIHdlIHJlYWNoIFNPUy4gKi8KLSAgZm9yICg7OykgewotICAgIG1hcmtlciA9IG5leHRfbWFya2VyKCk7Ci0gICAgc3dpdGNoIChtYXJrZXIpIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBtYXJrZXIgY29kZXMgMHhDNCwgMHhDOCwgMHhDQyBhcmUgbm90LCBhbmQgbXVzdCBub3QgYmUsCi0gICAgICAgKiB0cmVhdGVkIGFzIFNPRm4uICBDNCBpbiBwYXJ0aWN1bGFyIGlzIGFjdHVhbGx5IERIVC4KLSAgICAgICAqLwotICAgIGNhc2UgTV9TT0YwOgkJLyogQmFzZWxpbmUgKi8KLSAgICBjYXNlIE1fU09GMToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GMjoJCS8qIFByb2dyZXNzaXZlLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjM6CQkvKiBMb3NzbGVzcywgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y1OgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GNjoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y3OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjk6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjEwOgkJLyogUHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KLSAgICBjYXNlIE1fU09GMTE6CQkvKiBMb3NzbGVzcywgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxMzoJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE0OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE1OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBhcml0aG1ldGljICovCi0gICAgICBpZiAodmVyYm9zZSkKLQlwcm9jZXNzX1NPRm4obWFya2VyKTsKLSAgICAgIGVsc2UKLQlza2lwX3ZhcmlhYmxlKCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TT1M6CQkJLyogc3RvcCBiZWZvcmUgaGl0dGluZyBjb21wcmVzc2VkIGRhdGEgKi8KLSAgICAgIHJldHVybiBtYXJrZXI7Ci0KLSAgICBjYXNlIE1fRU9JOgkJCS8qIGluIGNhc2UgaXQncyBhIHRhYmxlcy1vbmx5IEpQRUcgc3RyZWFtICovCi0gICAgICByZXR1cm4gbWFya2VyOwotCi0gICAgY2FzZSBNX0NPTToKLSAgICAgIHByb2Nlc3NfQ09NKCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9BUFAxMjoKLSAgICAgIC8qIFNvbWUgZGlnaXRhbCBjYW1lcmEgbWFrZXJzIHB1dCB1c2VmdWwgdGV4dHVhbCBpbmZvcm1hdGlvbiBpbnRvCi0gICAgICAgKiBBUFAxMiBtYXJrZXJzLCBzbyB3ZSBwcmludCB0aG9zZSBvdXQgdG9vIHdoZW4gaW4gLXZlcmJvc2UgbW9kZS4KLSAgICAgICAqLwotICAgICAgaWYgKHZlcmJvc2UpIHsKLQlwcmludGYoIkFQUDEyIGNvbnRhaW5zOlxuIik7Ci0JcHJvY2Vzc19DT00oKTsKLSAgICAgIH0gZWxzZQotCXNraXBfdmFyaWFibGUoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoJCQkvKiBBbnl0aGluZyBlbHNlIGp1c3QgZ2V0cyBza2lwcGVkICovCi0gICAgICBza2lwX3ZhcmlhYmxlKCk7CQkvKiB3ZSBhc3N1bWUgaXQgaGFzIGEgcGFyYW1ldGVyIGNvdW50Li4uICovCi0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gLyogZW5kIGxvb3AgKi8KLX0KLQotCi0vKiBDb21tYW5kIGxpbmUgcGFyc2luZyBjb2RlICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogcHJvZ25hbWU7CS8qIHByb2dyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KLQotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHZvaWQpCi0vKiBjb21wbGFpbiBhYm91dCBiYWQgY29tbWFuZCBsaW5lICovCi17Ci0gIGZwcmludGYoc3RkZXJyLCAicmRqcGdjb20gZGlzcGxheXMgYW55IHRleHR1YWwgY29tbWVudHMgaW4gYSBKUEVHIGZpbGUuXG4iKTsKLQotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbc3dpdGNoZXNdIFtpbnB1dGZpbGVdXG4iLCBwcm9nbmFtZSk7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyAobmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkKTpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcmJvc2UgICAgQWxzbyBkaXNwbGF5IGRpbWVuc2lvbnMgb2YgSlBFRyBpbWFnZVxuIik7Ci0KLSAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLXN0YXRpYyBpbnQKLWtleW1hdGNoIChjaGFyICogYXJnLCBjb25zdCBjaGFyICoga2V5d29yZCwgaW50IG1pbmNoYXJzKQotLyogQ2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZyBvZiAocG9zc2libHkgYWJicmV2aWF0ZWQpIGtleXdvcmQgc3dpdGNoZXMuICovCi0vKiBrZXl3b3JkIGlzIHRoZSBjb25zdGFudCBrZXl3b3JkIChtdXN0IGJlIGxvd2VyIGNhc2UgYWxyZWFkeSksICovCi0vKiBtaW5jaGFycyBpcyBsZW5ndGggb2YgbWluaW11bSBsZWdhbCBhYmJyZXZpYXRpb24uICovCi17Ci0gIHJlZ2lzdGVyIGludCBjYSwgY2s7Ci0gIHJlZ2lzdGVyIGludCBubWF0Y2hlZCA9IDA7Ci0KLSAgd2hpbGUgKChjYSA9ICphcmcrKykgIT0gJ1wwJykgewotICAgIGlmICgoY2sgPSAqa2V5d29yZCsrKSA9PSAnXDAnKQotICAgICAgcmV0dXJuIDA7CQkJLyogYXJnIGxvbmdlciB0aGFuIGtleXdvcmQsIG5vIGdvb2QgKi8KLSAgICBpZiAoaXN1cHBlcihjYSkpCQkvKiBmb3JjZSBhcmcgdG8gbGNhc2UgKGFzc3VtZSBjayBpcyBhbHJlYWR5KSAqLwotICAgICAgY2EgPSB0b2xvd2VyKGNhKTsKLSAgICBpZiAoY2EgIT0gY2spCi0gICAgICByZXR1cm4gMDsJCQkvKiBubyBnb29kICovCi0gICAgbm1hdGNoZWQrKzsJCQkvKiBjb3VudCBtYXRjaGVkIGNoYXJhY3RlcnMgKi8KLSAgfQotICAvKiByZWFjaGVkIGVuZCBvZiBhcmd1bWVudDsgZmFpbCBpZiBpdCdzIHRvbyBzaG9ydCBmb3IgdW5pcXVlIGFiYnJldiAqLwotICBpZiAobm1hdGNoZWQgPCBtaW5jaGFycykKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7CQkJLyogQS1PSyAqLwotfQotCi0KLS8qCi0gKiBUaGUgbWFpbiBwcm9ncmFtLgotICovCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBpbnQgYXJnbjsKLSAgY2hhciAqIGFyZzsKLSAgaW50IHZlcmJvc2UgPSAwOwotCi0gIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCi0jaWZkZWYgVVNFX0NDT01NQU5ECi0gIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7Ci0jZW5kaWYKLQotICBwcm9nbmFtZSA9IGFyZ3ZbMF07Ci0gIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCi0gICAgcHJvZ25hbWUgPSAicmRqcGdjb20iOwkvKiBpbiBjYXNlIEMgbGlicmFyeSBkb2Vzbid0IHByb3ZpZGUgaXQgKi8KLQotICAvKiBQYXJzZSBzd2l0Y2hlcywgaWYgYW55ICovCi0gIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKLSAgICBhcmcgPSBhcmd2W2FyZ25dOwotICAgIGlmIChhcmdbMF0gIT0gJy0nKQotICAgICAgYnJlYWs7CQkJLyogbm90IHN3aXRjaCwgbXVzdCBiZSBmaWxlIG5hbWUgKi8KLSAgICBhcmcrKzsJCQkvKiBhZHZhbmNlIG92ZXIgJy0nICovCi0gICAgaWYgKGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgewotICAgICAgdmVyYm9zZSsrOwotICAgIH0gZWxzZQotICAgICAgdXNhZ2UoKTsKLSAgfQotCi0gIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCi0gIC8qIFVuaXggc3R5bGU6IGV4cGVjdCB6ZXJvIG9yIG9uZSBmaWxlIG5hbWUgKi8KLSAgaWYgKGFyZ24gPCBhcmdjLTEpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvbmx5IG9uZSBpbnB1dCBmaWxlXG4iLCBwcm9nbmFtZSk7Ci0gICAgdXNhZ2UoKTsKLSAgfQotICBpZiAoYXJnbiA8IGFyZ2MpIHsKLSAgICBpZiAoKGluZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbl0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbYXJnbl0pOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KLSNpZmRlZiBVU0VfU0VUTU9ERQkJLyogbmVlZCB0byBoYWNrIGZpbGUgbW9kZT8gKi8KLSAgICBzZXRtb2RlKGZpbGVubyhzdGRpbiksIE9fQklOQVJZKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KLSAgICBpZiAoKGluZmlsZSA9IGZkb3BlbihmaWxlbm8oc3RkaW4pLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gc3RkaW5cbiIsIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0jZWxzZQotICAgIGluZmlsZSA9IHN0ZGluOwotI2VuZGlmCi0gIH0KLQotICAvKiBTY2FuIHRoZSBKUEVHIGhlYWRlcnMuICovCi0gICh2b2lkKSBzY2FuX0pQRUdfaGVhZGVyKHZlcmJvc2UpOwotCi0gIC8qIEFsbCBkb25lLiAqLwotICBleGl0KEVYSVRfU1VDQ0VTUyk7Ci0gIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvcmRwcG0uYyBiL2xpYmpwZWd0d3JwL3JkcHBtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjM1YzEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvcmRwcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKgotICogcmRwcG0uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIFBQTS9QR00gZm9ybWF0LgotICogVGhlIGV4dGVuZGVkIDItYnl0ZS1wZXItc2FtcGxlIHJhdyBQUE0vUEdNIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4KLSAqIFRoZSBQQk1QTFVTIGxpYnJhcnkgaXMgTk9UIHJlcXVpcmVkIHRvIGNvbXBpbGUgdGhpcyBzb2Z0d2FyZQotICogKGJ1dCBpdCBpcyBoaWdobHkgdXNlZnVsIGFzIGEgc2V0IG9mIFBQTSBpbWFnZSBtYW5pcHVsYXRpb24gcHJvZ3JhbXMpLgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBpbnB1dCBmcm9tCi0gKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uICBUaGV5IGZ1cnRoZXIgYXNzdW1lIHRoYXQgcmVhZGluZyBiZWdpbnMKLSAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZTsgc3RhcnRfaW5wdXQgbWF5IG5lZWQgd29yayBpZiB0aGUKLSAqIHVzZXIgaW50ZXJmYWNlIGhhcyBhbHJlYWR5IHJlYWQgc29tZSBkYXRhIChlLmcuLCB0byBkZXRlcm1pbmUgdGhhdAotICogdGhlIGZpbGUgaXMgaW5kZWVkIFBQTSBmb3JtYXQpLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBQUE1fU1VQUE9SVEVECi0KLQotLyogUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGFyZSBiYXNlZCBvbiB0aGUgUEJNUExVUyBsaWJyYXJ5LCB3aGljaCBpczoKLSoqCi0qKiBDb3B5cmlnaHQgKEMpIDE5ODggYnkgSmVmIFBvc2thbnplci4KLSoqCi0qKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSoqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKLSoqIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0qKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0qKiBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvcgotKiogaW1wbGllZCB3YXJyYW50eS4KLSovCi0KLQotLyogTWFjcm9zIHRvIGRlYWwgd2l0aCB1bnNpZ25lZCBjaGFycyBhcyBlZmZpY2llbnRseSBhcyBjb21waWxlciBhbGxvd3MgKi8KLQotI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVfQ0hBUjsKLSNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCi0jZWxzZSAvKiAhSEFWRV9VTlNJR05FRF9DSEFSICovCi0jaWZkZWYgQ0hBUl9JU19VTlNJR05FRAotdHlwZWRlZiBjaGFyIFVfQ0hBUjsKLSNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCi0jZWxzZQotdHlwZWRlZiBjaGFyIFVfQ0hBUjsKLSNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkgJiAweEZGKQotI2VuZGlmCi0jZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLQotI2RlZmluZQlSZWFkT0soZmlsZSxidWZmZXIsbGVuKQkoSkZSRUFEKGZpbGUsYnVmZmVyLGxlbikgPT0gKChzaXplX3QpIChsZW4pKSkKLQotCi0vKgotICogT24gbW9zdCBzeXN0ZW1zLCByZWFkaW5nIGluZGl2aWR1YWwgYnl0ZXMgd2l0aCBnZXRjKCkgaXMgZHJhc3RpY2FsbHkgbGVzcwotICogZWZmaWNpZW50IHRoYW4gYnVmZmVyaW5nIGEgcm93IGF0IGEgdGltZSB3aXRoIGZyZWFkKCkuICBPbiBQQ3MsIHdlIG11c3QKLSAqIGFsbG9jYXRlIHRoZSBidWZmZXIgaW4gbmVhciBkYXRhIHNwYWNlLCBiZWNhdXNlIHdlIGFyZSBhc3N1bWluZyBzbWFsbC1kYXRhCi0gKiBtZW1vcnkgbW9kZWwsIHdoZXJlaW4gZnJlYWQoKSBjYW4ndCByZWFjaCBmYXIgbWVtb3J5LiAgSWYgeW91IG5lZWQgdG8KLSAqIHByb2Nlc3MgdmVyeSB3aWRlIGltYWdlcyBvbiBhIFBDLCB5b3UgbWlnaHQgaGF2ZSB0byBjb21waWxlIGluIGxhcmdlLW1lbW9yeQotICogbW9kZWwsIG9yIGVsc2UgcmVwbGFjZSBmcmVhZCgpIHdpdGggYSBnZXRjKCkgbG9vcCAtLS0gd2hpY2ggd2lsbCBiZSBtdWNoCi0gKiBzbG93ZXIuCi0gKi8KLQotCi0vKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBzb3VyY2Ugb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgVV9DSEFSICppb2J1ZmZlcjsJCS8qIG5vbi1GQVIgcG9pbnRlciB0byBJL08gYnVmZmVyICovCi0gIEpTQU1QUk9XIHBpeHJvdzsJCS8qIEZBUiBwb2ludGVyIHRvIHNhbWUgKi8KLSAgc2l6ZV90IGJ1ZmZlcl93aWR0aDsJCS8qIHdpZHRoIG9mIEkvTyBidWZmZXIgKi8KLSAgSlNBTVBMRSAqcmVzY2FsZTsJCS8qID0+IG1heHZhbC1yZW1hcHBpbmcgYXJyYXksIG9yIE5VTEwgKi8KLX0gcHBtX3NvdXJjZV9zdHJ1Y3Q7Ci0KLXR5cGVkZWYgcHBtX3NvdXJjZV9zdHJ1Y3QgKiBwcG1fc291cmNlX3B0cjsKLQotCi1MT0NBTChpbnQpCi1wYm1fZ2V0YyAoRklMRSAqIGluZmlsZSkKLS8qIFJlYWQgbmV4dCBjaGFyLCBza2lwcGluZyBvdmVyIGFueSBjb21tZW50cyAqLwotLyogQSBjb21tZW50L25ld2xpbmUgc2VxdWVuY2UgaXMgcmV0dXJuZWQgYXMgYSBuZXdsaW5lICovCi17Ci0gIHJlZ2lzdGVyIGludCBjaDsKLQotICBjaCA9IGdldGMoaW5maWxlKTsKLSAgaWYgKGNoID09ICcjJykgewotICAgIGRvIHsKLSAgICAgIGNoID0gZ2V0YyhpbmZpbGUpOwotICAgIH0gd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKLSAgfQotICByZXR1cm4gY2g7Ci19Ci0KLQotTE9DQUwodW5zaWduZWQgaW50KQotcmVhZF9wYm1faW50ZWdlciAoal9jb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCi0vKiBSZWFkIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlciBmcm9tIHRoZSBQUE0gZmlsZSAqLwotLyogU3dhbGxvd3Mgb25lIHRyYWlsaW5nIGNoYXJhY3RlciBhZnRlciB0aGUgaW50ZWdlciAqLwotLyogTm90ZSB0aGF0IG9uIGEgMTYtYml0LWludCBtYWNoaW5lLCBvbmx5IHZhbHVlcyB1cCB0byA2NGsgY2FuIGJlIHJlYWQuICovCi0vKiBUaGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtIGluIHByYWN0aWNlLiAqLwotewotICByZWdpc3RlciBpbnQgY2g7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCB2YWw7Ci0KLSAgLyogU2tpcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIGRvIHsKLSAgICBjaCA9IHBibV9nZXRjKGluZmlsZSk7Ci0gICAgaWYgKGNoID09IEVPRikKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgfSB3aGlsZSAoY2ggPT0gJyAnIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInKTsKLQotICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9QUE1fTk9OTlVNRVJJQyk7Ci0KLSAgdmFsID0gY2ggLSAnMCc7Ci0gIHdoaWxlICgoY2ggPSBwYm1fZ2V0YyhpbmZpbGUpKSA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgdmFsICo9IDEwOwotICAgIHZhbCArPSBjaCAtICcwJzsKLSAgfQotICByZXR1cm4gdmFsOwotfQotCi0KLS8qCi0gKiBSZWFkIG9uZSByb3cgb2YgcGl4ZWxzLgotICoKLSAqIFdlIHByb3ZpZGUgc2V2ZXJhbCBkaWZmZXJlbnQgdmVyc2lvbnMgZGVwZW5kaW5nIG9uIGlucHV0IGZpbGUgZm9ybWF0LgotICogSW4gYWxsIGNhc2VzLCBpbnB1dCBpcyBzY2FsZWQgdG8gdGhlIHNpemUgb2YgSlNBTVBMRS4KLSAqCi0gKiBBIHJlYWxseSBmYXN0IHBhdGggaXMgcHJvdmlkZWQgZm9yIHJlYWRpbmcgYnl0ZS9zYW1wbGUgcmF3IGZpbGVzIHdpdGgKLSAqIG1heHZhbCA9IE1BWEpTQU1QTEUsIHdoaWNoIGlzIHRoZSBub3JtYWwgY2FzZSBmb3IgOC1iaXQgZGF0YS4KLSAqLwotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0X3RleHRfZ3JheV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHRleHQtZm9ybWF0IFBHTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KLXsKLSAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgRklMRSAqIGluZmlsZSA9IHNvdXJjZS0+cHViLmlucHV0X2ZpbGU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAqcHRyKysgPSByZXNjYWxlW3JlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSldOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0X3RleHRfcmdiX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgdGV4dC1mb3JtYXQgUFBNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLwotewotICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOwotICBGSUxFICogaW5maWxlID0gc291cmNlLT5wdWIuaW5wdXRfZmlsZTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBKU0FNUExFICpyZXNjYWxlID0gc291cmNlLT5yZXNjYWxlOwotICBKRElNRU5TSU9OIGNvbDsKLQotICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07Ci0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICpwdHIrKyA9IHJlc2NhbGVbcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKV07Ci0gICAgKnB0cisrID0gcmVzY2FsZVtyZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpXTsKLSAgICAqcHRyKysgPSByZXNjYWxlW3JlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSldOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0X3NjYWxlZF9ncmF5X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgcmF3LWJ5dGUtZm9ybWF0IFBHTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KLXsKLSAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBVX0NIQVIgKiBidWZmZXJwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgKnJlc2NhbGUgPSBzb3VyY2UtPnJlc2NhbGU7Ci0gIEpESU1FTlNJT04gY29sOwotCi0gIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBzb3VyY2UtPmlvYnVmZmVyLCBzb3VyY2UtPmJ1ZmZlcl93aWR0aCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07Ci0gIGJ1ZmZlcnB0ciA9IHNvdXJjZS0+aW9idWZmZXI7Ci0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICpwdHIrKyA9IHJlc2NhbGVbVUNIKCpidWZmZXJwdHIrKyldOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0X3NjYWxlZF9yZ2Jfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyByYXctYnl0ZS1mb3JtYXQgUFBNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLwotewotICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIFVfQ0hBUiAqIGJ1ZmZlcnB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHNvdXJjZS0+aW9idWZmZXIsIHNvdXJjZS0+YnVmZmVyX3dpZHRoKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgYnVmZmVycHRyID0gc291cmNlLT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgKnB0cisrID0gcmVzY2FsZVtVQ0goKmJ1ZmZlcnB0cisrKV07Ci0gICAgKnB0cisrID0gcmVzY2FsZVtVQ0goKmJ1ZmZlcnB0cisrKV07Ci0gICAgKnB0cisrID0gcmVzY2FsZVtVQ0goKmJ1ZmZlcnB0cisrKV07Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfcmF3X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgcmF3LWJ5dGUtZm9ybWF0IGZpbGVzIHdpdGggbWF4dmFsID0gTUFYSlNBTVBMRS4KLSAqIEluIHRoaXMgY2FzZSB3ZSBqdXN0IHJlYWQgcmlnaHQgaW50byB0aGUgSlNBTVBMRSBidWZmZXIhCi0gKiBOb3RlIHRoYXQgc2FtZSBjb2RlIHdvcmtzIGZvciBQUE0gYW5kIFBHTSBmaWxlcy4KLSAqLwotewotICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOwotCi0gIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBzb3VyY2UtPmlvYnVmZmVyLCBzb3VyY2UtPmJ1ZmZlcl93aWR0aCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICByZXR1cm4gMTsKLX0KLQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF93b3JkX2dyYXlfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyByYXctd29yZC1mb3JtYXQgUEdNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLwotewotICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIFVfQ0hBUiAqIGJ1ZmZlcnB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHNvdXJjZS0+aW9idWZmZXIsIHNvdXJjZS0+YnVmZmVyX3dpZHRoKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgYnVmZmVycHRyID0gc291cmNlLT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKTsKLSAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7Ci0gICAgKnB0cisrID0gcmVzY2FsZVt0ZW1wXTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF93b3JkX3JnYl9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHJhdy13b3JkLWZvcm1hdCBQUE0gZmlsZXMgd2l0aCBhbnkgbWF4dmFsICovCi17Ci0gIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgVV9DSEFSICogYnVmZmVycHRyOwotICByZWdpc3RlciBKU0FNUExFICpyZXNjYWxlID0gc291cmNlLT5yZXNjYWxlOwotICBKRElNRU5TSU9OIGNvbDsKLQotICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgc291cmNlLT5pb2J1ZmZlciwgc291cmNlLT5idWZmZXJfd2lkdGgpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBidWZmZXJwdHIgPSBzb3VyY2UtPmlvYnVmZmVyOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICByZWdpc3RlciBpbnQgdGVtcDsKLSAgICB0ZW1wICA9IFVDSCgqYnVmZmVycHRyKyspOwotICAgIHRlbXAgfD0gVUNIKCpidWZmZXJwdHIrKykgPDwgODsKLSAgICAqcHRyKysgPSByZXNjYWxlW3RlbXBdOwotICAgIHRlbXAgID0gVUNIKCpidWZmZXJwdHIrKyk7Ci0gICAgdGVtcCB8PSBVQ0goKmJ1ZmZlcnB0cisrKSA8PCA4OwotICAgICpwdHIrKyA9IHJlc2NhbGVbdGVtcF07Ci0gICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKTsKLSAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7Ci0gICAgKnB0cisrID0gcmVzY2FsZVt0ZW1wXTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogUmVhZCB0aGUgZmlsZSBoZWFkZXI7IHJldHVybiBpbWFnZSBzaXplIGFuZCBjb21wb25lbnQgY291bnQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9pbnB1dF9wcG0gKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOwotICBpbnQgYzsKLSAgdW5zaWduZWQgaW50IHcsIGgsIG1heHZhbDsKLSAgYm9vbGVhbiBuZWVkX2lvYnVmZmVyLCB1c2VfcmF3X2J1ZmZlciwgbmVlZF9yZXNjYWxlOwotCi0gIGlmIChnZXRjKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUpICE9ICdQJykKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1BQTV9OT1QpOwotCi0gIGMgPSBnZXRjKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUpOyAvKiBzdWJmb3JtYXQgZGlzY3JpbWluYXRvciBjaGFyYWN0ZXIgKi8KLQotICAvKiBkZXRlY3QgdW5zdXBwb3J0ZWQgdmFyaWFudHMgKGllLCBQQk0pIGJlZm9yZSB0cnlpbmcgdG8gcmVhZCBoZWFkZXIgKi8KLSAgc3dpdGNoIChjKSB7Ci0gIGNhc2UgJzInOgkJCS8qIGl0J3MgYSB0ZXh0LWZvcm1hdCBQR00gZmlsZSAqLwotICBjYXNlICczJzoJCQkvKiBpdCdzIGEgdGV4dC1mb3JtYXQgUFBNIGZpbGUgKi8KLSAgY2FzZSAnNSc6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUEdNIGZpbGUgKi8KLSAgY2FzZSAnNic6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUFBNIGZpbGUgKi8KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1BQTV9OT1QpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogZmV0Y2ggdGhlIHJlbWFpbmluZyBoZWFkZXIgaW5mbyAqLwotICB3ID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgc291cmNlLT5wdWIuaW5wdXRfZmlsZSk7Ci0gIGggPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlKTsKLSAgbWF4dmFsID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgc291cmNlLT5wdWIuaW5wdXRfZmlsZSk7Ci0KLSAgaWYgKHcgPD0gMCB8fCBoIDw9IDAgfHwgbWF4dmFsIDw9IDApIC8qIGVycm9yIGNoZWNrICovCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9QUE1fTk9UKTsKLQotICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gPSBCSVRTX0lOX0pTQU1QTEU7IC8qIHdlIGFsd2F5cyByZXNjYWxlIGRhdGEgdG8gdGhpcyAqLwotICBjaW5mby0+aW1hZ2Vfd2lkdGggPSAoSkRJTUVOU0lPTikgdzsKLSAgY2luZm8tPmltYWdlX2hlaWdodCA9IChKRElNRU5TSU9OKSBoOwotCi0gIC8qIGluaXRpYWxpemUgZmxhZ3MgdG8gbW9zdCBjb21tb24gc2V0dGluZ3MgKi8KLSAgbmVlZF9pb2J1ZmZlciA9IFRSVUU7CQkvKiBkbyB3ZSBuZWVkIGFuIEkvTyBidWZmZXI/ICovCi0gIHVzZV9yYXdfYnVmZmVyID0gRkFMU0U7CS8qIGRvIHdlIG1hcCBpbnB1dCBidWZmZXIgb250byBJL08gYnVmZmVyPyAqLwotICBuZWVkX3Jlc2NhbGUgPSBUUlVFOwkJLyogZG8gd2UgbmVlZCBhIHJlc2NhbGUgYXJyYXk/ICovCi0KLSAgc3dpdGNoIChjKSB7Ci0gIGNhc2UgJzInOgkJCS8qIGl0J3MgYSB0ZXh0LWZvcm1hdCBQR00gZmlsZSAqLwotICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMTsKLSAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOwotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1BHTV9URVhULCB3LCBoKTsKLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF90ZXh0X2dyYXlfcm93OwotICAgIG5lZWRfaW9idWZmZXIgPSBGQUxTRTsKLSAgICBicmVhazsKLQotICBjYXNlICczJzoJCQkvKiBpdCdzIGEgdGV4dC1mb3JtYXQgUFBNIGZpbGUgKi8KLSAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDM7Ci0gICAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19QUE1fVEVYVCwgdywgaCk7Ci0gICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfdGV4dF9yZ2Jfcm93OwotICAgIG5lZWRfaW9idWZmZXIgPSBGQUxTRTsKLSAgICBicmVhazsKLQotICBjYXNlICc1JzoJCQkvKiBpdCdzIGEgcmF3LWZvcm1hdCBQR00gZmlsZSAqLwotICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMTsKLSAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOwotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1BHTSwgdywgaCk7Ci0gICAgaWYgKG1heHZhbCA+IDI1NSkgewotICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfd29yZF9ncmF5X3JvdzsKLSAgICB9IGVsc2UgaWYgKG1heHZhbCA9PSBNQVhKU0FNUExFICYmIFNJWkVPRihKU0FNUExFKSA9PSBTSVpFT0YoVV9DSEFSKSkgewotICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfcmF3X3JvdzsKLSAgICAgIHVzZV9yYXdfYnVmZmVyID0gVFJVRTsKLSAgICAgIG5lZWRfcmVzY2FsZSA9IEZBTFNFOwotICAgIH0gZWxzZSB7Ci0gICAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9zY2FsZWRfZ3JheV9yb3c7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgJzYnOgkJCS8qIGl0J3MgYSByYXctZm9ybWF0IFBQTSBmaWxlICovCi0gICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAzOwotICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7Ci0gICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfUFBNLCB3LCBoKTsKLSAgICBpZiAobWF4dmFsID4gMjU1KSB7Ci0gICAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF93b3JkX3JnYl9yb3c7Ci0gICAgfSBlbHNlIGlmIChtYXh2YWwgPT0gTUFYSlNBTVBMRSAmJiBTSVpFT0YoSlNBTVBMRSkgPT0gU0laRU9GKFVfQ0hBUikpIHsKLSAgICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3Jhd19yb3c7Ci0gICAgICB1c2VfcmF3X2J1ZmZlciA9IFRSVUU7Ci0gICAgICBuZWVkX3Jlc2NhbGUgPSBGQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfc2NhbGVkX3JnYl9yb3c7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIEkvTyBidWZmZXI6IDEgb3IgMyBieXRlcyBvciB3b3Jkcy9waXhlbC4gKi8KLSAgaWYgKG5lZWRfaW9idWZmZXIpIHsKLSAgICBzb3VyY2UtPmJ1ZmZlcl93aWR0aCA9IChzaXplX3QpIHcgKiBjaW5mby0+aW5wdXRfY29tcG9uZW50cyAqCi0gICAgICAoKG1heHZhbDw9MjU1KSA/IFNJWkVPRihVX0NIQVIpIDogKDIqU0laRU9GKFVfQ0hBUikpKTsKLSAgICBzb3VyY2UtPmlvYnVmZmVyID0gKFVfQ0hBUiAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIHNvdXJjZS0+YnVmZmVyX3dpZHRoKTsKLSAgfQotCi0gIC8qIENyZWF0ZSBjb21wcmVzc29yIGlucHV0IGJ1ZmZlci4gKi8KLSAgaWYgKHVzZV9yYXdfYnVmZmVyKSB7Ci0gICAgLyogRm9yIHVuc2NhbGVkIHJhdy1pbnB1dCBjYXNlLCB3ZSBjYW4ganVzdCBtYXAgaXQgb250byB0aGUgSS9PIGJ1ZmZlci4gKi8KLSAgICAvKiBTeW50aGVzaXplIGEgSlNBTVBBUlJBWSBwb2ludGVyIHN0cnVjdHVyZSAqLwotICAgIC8qIENhc3QgaGVyZSBpbXBsaWVzIG5lYXItPmZhciBwb2ludGVyIGNvbnZlcnNpb24gb24gUENzICovCi0gICAgc291cmNlLT5waXhyb3cgPSAoSlNBTVBST1cpIHNvdXJjZS0+aW9idWZmZXI7Ci0gICAgc291cmNlLT5wdWIuYnVmZmVyID0gJiBzb3VyY2UtPnBpeHJvdzsKLSAgICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKLSAgfSBlbHNlIHsKLSAgICAvKiBOZWVkIHRvIHRyYW5zbGF0ZSBhbnl3YXksIHNvIG1ha2UgYSBzZXBhcmF0ZSBzYW1wbGUgYnVmZmVyLiAqLwotICAgIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgICAoSkRJTUVOU0lPTikgdyAqIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzLCAoSkRJTUVOU0lPTikgMSk7Ci0gICAgc291cmNlLT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci0gIH0KLQotICAvKiBDb21wdXRlIHRoZSByZXNjYWxpbmcgYXJyYXkgaWYgcmVxdWlyZWQuICovCi0gIGlmIChuZWVkX3Jlc2NhbGUpIHsKLSAgICBJTlQzMiB2YWwsIGhhbGZfbWF4dmFsOwotCi0gICAgLyogT24gMTYtYml0LWludCBtYWNoaW5lcyB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgb2YgbWF4dmFsID0gNjU1MzUgKi8KLSAgICBzb3VyY2UtPnJlc2NhbGUgPSAoSlNBTVBMRSAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIChzaXplX3QpICgoKGxvbmcpIG1heHZhbCArIDFMKSAqIFNJWkVPRihKU0FNUExFKSkpOwotICAgIGhhbGZfbWF4dmFsID0gbWF4dmFsIC8gMjsKLSAgICBmb3IgKHZhbCA9IDA7IHZhbCA8PSAoSU5UMzIpIG1heHZhbDsgdmFsKyspIHsKLSAgICAgIC8qIFRoZSBtdWx0aXBsaWNhdGlvbiBoZXJlIG11c3QgYmUgZG9uZSBpbiAzMiBiaXRzIHRvIGF2b2lkIG92ZXJmbG93ICovCi0gICAgICBzb3VyY2UtPnJlc2NhbGVbdmFsXSA9IChKU0FNUExFKSAoKHZhbCpNQVhKU0FNUExFICsgaGFsZl9tYXh2YWwpL21heHZhbCk7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX2lucHV0X3BwbSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgUFBNIGZvcm1hdCBpbnB1dC4KLSAqLwotCi1HTE9CQUwoY2pwZWdfc291cmNlX3B0cikKLWppbml0X3JlYWRfcHBtIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcHBtX3NvdXJjZV9wdHIgc291cmNlOwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCAqLwotICBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKHBwbV9zb3VyY2Vfc3RydWN0KSk7Ci0gIC8qIEZpbGwgaW4gbWV0aG9kIHB0cnMsIGV4Y2VwdCBnZXRfcGl4ZWxfcm93cyB3aGljaCBzdGFydF9pbnB1dCBzZXRzICovCi0gIHNvdXJjZS0+cHViLnN0YXJ0X2lucHV0ID0gc3RhcnRfaW5wdXRfcHBtOwotICBzb3VyY2UtPnB1Yi5maW5pc2hfaW5wdXQgPSBmaW5pc2hfaW5wdXRfcHBtOwotCi0gIHJldHVybiAoY2pwZWdfc291cmNlX3B0cikgc291cmNlOwotfQotCi0jZW5kaWYgLyogUFBNX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvcmRybGUuYyBiL2xpYmpwZWd0d3JwL3JkcmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmJjMzcuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvcmRybGUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKgotICogcmRybGUuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIFV0YWggUkxFIGZvcm1hdC4KLSAqIFRoZSBVdGFoIFJhc3RlciBUb29sa2l0IGxpYnJhcnkgaXMgcmVxdWlyZWQgKHZlcnNpb24gMy4xIG9yIGxhdGVyKS4KLSAqCi0gKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgotICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgaW5wdXQgZnJvbQotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLiAgVGhleSBmdXJ0aGVyIGFzc3VtZSB0aGF0IHJlYWRpbmcgYmVnaW5zCi0gKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGU7IHN0YXJ0X2lucHV0IG1heSBuZWVkIHdvcmsgaWYgdGhlCi0gKiB1c2VyIGludGVyZmFjZSBoYXMgYWxyZWFkeSByZWFkIHNvbWUgZGF0YSAoZS5nLiwgdG8gZGV0ZXJtaW5lIHRoYXQKLSAqIHRoZSBmaWxlIGlzIGluZGVlZCBSTEUgZm9ybWF0KS4KLSAqCi0gKiBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IE1pa2UgTGlqZXdza2ksCi0gKiB3aXRoIHVwZGF0ZXMgZnJvbSBSb2JlcnQgSHV0Y2hpbnNvbi4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotCi0jaWZkZWYgUkxFX1NVUFBPUlRFRAotCi0vKiBybGUuaCBpcyBwcm92aWRlZCBieSB0aGUgVXRhaCBSYXN0ZXIgVG9vbGtpdC4gKi8KLQotI2luY2x1ZGUgPHJsZS5oPgotCi0vKgotICogV2UgYXNzdW1lIHRoYXQgSlNBTVBMRSBoYXMgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYXMgcmxlX3BpeGVsLAotICogdG8gd2l0LCAidW5zaWduZWQgY2hhciIuICBIZW5jZSB3ZSBjYW4ndCBjb3BlIHdpdGggMTItIG9yIDE2LWJpdCBzYW1wbGVzLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4LWJpdCBKU0FNUExFcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotLyoKLSAqIFdlIHN1cHBvcnQgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBSTEUgZmlsZXM6Ci0gKiAgIAotICogICBHUkFZU0NBTEUgICAtIDggYml0cywgbm8gY29sb3JtYXAKLSAqICAgTUFQUEVER1JBWSAgLSA4IGJpdHMsIDEgY2hhbm5lbCBjb2xvbWFwCi0gKiAgIFBTRVVET0NPTE9SIC0gOCBiaXRzLCAzIGNoYW5uZWwgY29sb3JtYXAKLSAqICAgVFJVRUNPTE9SICAgLSAyNCBiaXRzLCAzIGNoYW5uZWwgY29sb3JtYXAKLSAqICAgRElSRUNUQ09MT1IgLSAyNCBiaXRzLCBubyBjb2xvcm1hcAotICoKLSAqIEZvciBub3csIHdlIGlnbm9yZSBhbnkgYWxwaGEgY2hhbm5lbCBpbiB0aGUgaW1hZ2UuCi0gKi8KLQotdHlwZWRlZiBlbnVtCi0gIHsgR1JBWVNDQUxFLCBNQVBQRURHUkFZLCBQU0VVRE9DT0xPUiwgVFJVRUNPTE9SLCBESVJFQ1RDT0xPUiB9IHJsZV9raW5kOwotCi0KLS8qCi0gKiBTaW5jZSBSTEUgc3RvcmVzIHNjYW5saW5lcyBib3R0b20tdG8tdG9wLCB3ZSBoYXZlIHRvIGludmVydCB0aGUgaW1hZ2UKLSAqIHRvIGNvbmZvcm0gdG8gSlBFRydzIHRvcC10by1ib3R0b20gb3JkZXIuICBUbyBkbyB0aGlzLCB3ZSByZWFkIHRoZQotICogaW5jb21pbmcgaW1hZ2UgaW50byBhIHZpcnR1YWwgYXJyYXkgb24gdGhlIGZpcnN0IGdldF9waXhlbF9yb3dzIGNhbGwsCi0gKiB0aGVuIGZldGNoIHRoZSByZXF1aXJlZCByb3cgZnJvbSB0aGUgdmlydHVhbCBhcnJheSBvbiBzdWJzZXF1ZW50IGNhbGxzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IF9ybGVfc291cmNlX3N0cnVjdCAqIHJsZV9zb3VyY2VfcHRyOwotCi10eXBlZGVmIHN0cnVjdCBfcmxlX3NvdXJjZV9zdHJ1Y3QgewotICBzdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBybGVfa2luZCB2aXN1YWw7ICAgICAgICAgICAgICAvKiBhY3R1YWwgdHlwZSBvZiBpbnB1dCBmaWxlICovCi0gIGp2aXJ0X3NhcnJheV9wdHIgaW1hZ2U7ICAgICAgIC8qIHZpcnR1YWwgYXJyYXkgdG8gaG9sZCB0aGUgaW1hZ2UgKi8KLSAgSkRJTUVOU0lPTiByb3c7CQkvKiBjdXJyZW50IHJvdyAjIGluIHRoZSB2aXJ0dWFsIGFycmF5ICovCi0gIHJsZV9oZHIgaGVhZGVyOyAgICAgICAgICAgICAgIC8qIElucHV0IGZpbGUgaW5mb3JtYXRpb24gKi8KLSAgcmxlX3BpeGVsKiogcmxlX3JvdzsgICAgICAgICAgLyogaG9sZHMgYSByb3cgcmV0dXJuZWQgYnkgcmxlX2dldHJvdygpICovCi0KLX0gcmxlX3NvdXJjZV9zdHJ1Y3Q7Ci0KLQotLyoKLSAqIFJlYWQgdGhlIGZpbGUgaGVhZGVyOyByZXR1cm4gaW1hZ2Ugc2l6ZSBhbmQgY29tcG9uZW50IGNvdW50LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfaW5wdXRfcmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgcmxlX3NvdXJjZV9wdHIgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgSkRJTUVOU0lPTiB3aWR0aCwgaGVpZ2h0OwotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7Ci0jZW5kaWYKLQotICAvKiBVc2UgUkxFIGxpYnJhcnkgcm91dGluZSB0byBnZXQgdGhlIGhlYWRlciBpbmZvICovCi0gIHNvdXJjZS0+aGVhZGVyID0gKnJsZV9oZHJfaW5pdChOVUxMKTsKLSAgc291cmNlLT5oZWFkZXIucmxlX2ZpbGUgPSBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlOwotICBzd2l0Y2ggKHJsZV9nZXRfc2V0dXAoJihzb3VyY2UtPmhlYWRlcikpKSB7Ci0gIGNhc2UgUkxFX1NVQ0NFU1M6Ci0gICAgLyogQS1PSyAqLwotICAgIGJyZWFrOwotICBjYXNlIFJMRV9OT1RfUkxFOgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX05PVCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgUkxFX05PX1NQQUNFOgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX01FTSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgUkxFX0VNUFRZOgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX0VNUFRZKTsKLSAgICBicmVhazsKLSAgY2FzZSBSTEVfRU9GOgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX0VPRik7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9STEVfQkFERVJST1IpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogRmlndXJlIG91dCB3aGF0IHdlIGhhdmUsIHNldCBwcml2YXRlIHZhcnMgYW5kIHJldHVybiB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KLSAgCi0gIHdpZHRoICA9IHNvdXJjZS0+aGVhZGVyLnhtYXggLSBzb3VyY2UtPmhlYWRlci54bWluICsgMTsKLSAgaGVpZ2h0ID0gc291cmNlLT5oZWFkZXIueW1heCAtIHNvdXJjZS0+aGVhZGVyLnltaW4gKyAxOwotICBzb3VyY2UtPmhlYWRlci54bWluID0gMDsJCS8qIHJlYWxpZ24gaG9yaXpvbnRhbGx5ICovCi0gIHNvdXJjZS0+aGVhZGVyLnhtYXggPSB3aWR0aC0xOwotCi0gIGNpbmZvLT5pbWFnZV93aWR0aCAgICAgID0gd2lkdGg7Ci0gIGNpbmZvLT5pbWFnZV9oZWlnaHQgICAgID0gaGVpZ2h0OwotICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gICA9IDg7ICAvKiB3ZSBjYW4gb25seSBoYW5kbGUgOCBiaXQgZGF0YSAqLwotCi0gIGlmIChzb3VyY2UtPmhlYWRlci5uY29sb3JzID09IDEgJiYgc291cmNlLT5oZWFkZXIubmNtYXAgPT0gMCkgewotICAgIHNvdXJjZS0+dmlzdWFsICAgICA9IEdSQVlTQ0FMRTsKLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19STEVfR1JBWSwgd2lkdGgsIGhlaWdodCk7Ci0gIH0gZWxzZSBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAxICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDEpIHsKLSAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBNQVBQRURHUkFZOwotICAgIFRSQUNFTVMzKGNpbmZvLCAxLCBKVFJDX1JMRV9NQVBHUkFZLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgIDEgPDwgc291cmNlLT5oZWFkZXIuY21hcGxlbik7Ci0gIH0gZWxzZSBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAxICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDMpIHsKLSAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBQU0VVRE9DT0xPUjsKLSAgICBUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19STEVfTUFQUEVELCB3aWR0aCwgaGVpZ2h0LAotCSAgICAgMSA8PCBzb3VyY2UtPmhlYWRlci5jbWFwbGVuKTsKLSAgfSBlbHNlIGlmIChzb3VyY2UtPmhlYWRlci5uY29sb3JzID09IDMgJiYgc291cmNlLT5oZWFkZXIubmNtYXAgPT0gMykgewotICAgIHNvdXJjZS0+dmlzdWFsICAgICA9IFRSVUVDT0xPUjsKLSAgICBUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19STEVfRlVMTE1BUCwgd2lkdGgsIGhlaWdodCwKLQkgICAgIDEgPDwgc291cmNlLT5oZWFkZXIuY21hcGxlbik7Ci0gIH0gZWxzZSBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAzICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDApIHsKLSAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBESVJFQ1RDT0xPUjsKLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19STEUsIHdpZHRoLCBoZWlnaHQpOwotICB9IGVsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9VTlNVUFBPUlRFRCk7Ci0gIAotICBpZiAoc291cmNlLT52aXN1YWwgPT0gR1JBWVNDQUxFIHx8IHNvdXJjZS0+dmlzdWFsID09IE1BUFBFREdSQVkpIHsKLSAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgICA9IEpDU19HUkFZU0NBTEU7Ci0gICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOwotICB9IGVsc2UgewotICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSAgID0gSkNTX1JHQjsKLSAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDM7Ci0gIH0KLQotICAvKgotICAgKiBBIHBsYWNlIHRvIGhvbGQgZWFjaCBzY2FubGluZSB3aGlsZSBpdCdzIGNvbnZlcnRlZC4KLSAgICogKEdSQVlTQ0FMRSBzY2FubGluZXMgZG9uJ3QgbmVlZCBjb252ZXJ0aW5nKQotICAgKi8KLSAgaWYgKHNvdXJjZS0+dmlzdWFsICE9IEdSQVlTQ0FMRSkgewotICAgIHNvdXJjZS0+cmxlX3JvdyA9IChybGVfcGl4ZWwqKikgKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgIChKRElNRU5TSU9OKSB3aWR0aCwgKEpESU1FTlNJT04pIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzKTsKLSAgfQotCi0gIC8qIHJlcXVlc3QgYSB2aXJ0dWFsIGFycmF5IHRvIGhvbGQgdGhlIGltYWdlICovCi0gIHNvdXJjZS0+aW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0gICAgIChKRElNRU5TSU9OKSAod2lkdGggKiBzb3VyY2UtPmhlYWRlci5uY29sb3JzKSwKLSAgICAgKEpESU1FTlNJT04pIGhlaWdodCwgKEpESU1FTlNJT04pIDEpOwotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCi0gICAgcHJvZ3Jlc3MtPnRvdGFsX2V4dHJhX3Bhc3NlcysrOwotICB9Ci0jZW5kaWYKLQotICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKLX0KLQotCi0vKgotICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KLSAqIENhbGxlZCBvbmx5IGFmdGVyIGxvYWRfaW1hZ2UgaGFzIHJlYWQgdGhlIGltYWdlIGludG8gdGhlIHZpcnR1YWwgYXJyYXkuCi0gKiBVc2VkIGZvciBHUkFZU0NBTEUsIE1BUFBFREdSQVksIFRSVUVDT0xPUiwgYW5kIERJUkVDVENPTE9SIGltYWdlcy4KLSAqLwotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF9ybGVfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgcmxlX3NvdXJjZV9wdHIgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKSBzaW5mbzsKLQotICBzb3VyY2UtPnJvdy0tOwotICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHNvdXJjZS0+cm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOwotCi0gIHJldHVybiAxOwotfQotCi0vKgotICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KLSAqIENhbGxlZCBvbmx5IGFmdGVyIGxvYWRfaW1hZ2UgaGFzIHJlYWQgdGhlIGltYWdlIGludG8gdGhlIHZpcnR1YWwgYXJyYXkuCi0gKiBVc2VkIGZvciBQU0VVRE9DT0xPUiBpbWFnZXMuCi0gKi8KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfcHNldWRvY29sb3Jfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgcmxlX3NvdXJjZV9wdHIgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgSlNBTVBST1cgc3JjX3JvdywgZGVzdF9yb3c7Ci0gIEpESU1FTlNJT04gY29sOwotICBybGVfbWFwICpjb2xvcm1hcDsKLSAgaW50IHZhbDsKLQotICBjb2xvcm1hcCA9IHNvdXJjZS0+aGVhZGVyLmNtYXA7Ci0gIGRlc3Rfcm93ID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBzb3VyY2UtPnJvdy0tOwotICBzcmNfcm93ID0gKiAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHNvdXJjZS0+cm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOwotCi0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIHZhbCA9IEdFVEpTQU1QTEUoKnNyY19yb3crKyk7Ci0gICAgKmRlc3Rfcm93KysgPSAoSlNBTVBMRSkgKGNvbG9ybWFwW3ZhbCAgICAgIF0gPj4gOCk7Ci0gICAgKmRlc3Rfcm93KysgPSAoSlNBTVBMRSkgKGNvbG9ybWFwW3ZhbCArIDI1Nl0gPj4gOCk7Ci0gICAgKmRlc3Rfcm93KysgPSAoSlNBTVBMRSkgKGNvbG9ybWFwW3ZhbCArIDUxMl0gPj4gOCk7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogTG9hZCB0aGUgaW1hZ2UgaW50byBhIHZpcnR1YWwgYXJyYXkuICBXZSBoYXZlIHRvIGRvIHRoaXMgYmVjYXVzZSBSTEUKLSAqIGZpbGVzIHN0YXJ0IGF0IHRoZSBsb3dlciBsZWZ0IHdoaWxlIHRoZSBKUEVHIHN0YW5kYXJkIGhhcyB0aGVtIHN0YXJ0aW5nCi0gKiBpbiB0aGUgdXBwZXIgbGVmdC4gIFRoaXMgaXMgY2FsbGVkIHRoZSBmaXJzdCB0aW1lIHdlIHdhbnQgdG8gZ2V0IGEgcm93Ci0gKiBvZiBpbnB1dC4gIFdoYXQgd2UgZG8gaXMgbG9hZCB0aGUgUkxFIGRhdGEgaW50byB0aGUgYXJyYXkgYW5kIHRoZW4gY2FsbAotICogdGhlIGFwcHJvcHJpYXRlIHJvdXRpbmUgdG8gcmVhZCBvbmUgcm93IGZyb20gdGhlIGFycmF5LiAgQmVmb3JlIHJldHVybmluZywKLSAqIHdlIHNldCBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyBzbyB0aGF0IHN1YnNlcXVlbnQgY2FsbHMgZ28gc3RyYWlnaHQgdG8KLSAqIHRoZSBhcHByb3ByaWF0ZSByb3ctcmVhZGluZyByb3V0aW5lLgotICovCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotbG9hZF9pbWFnZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIHJsZV9zb3VyY2VfcHRyIHNvdXJjZSA9IChybGVfc291cmNlX3B0cikgc2luZm87Ci0gIEpESU1FTlNJT04gcm93LCBjb2w7Ci0gIEpTQU1QUk9XICBzY2FubGluZSwgcmVkX3B0ciwgZ3JlZW5fcHRyLCBibHVlX3B0cjsKLSAgcmxlX3BpeGVsICoqcmxlX3JvdzsKLSAgcmxlX21hcCAqY29sb3JtYXA7Ci0gIGNoYXIgY2hhbm5lbDsKLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotI2VuZGlmCi0KLSAgY29sb3JtYXAgPSBzb3VyY2UtPmhlYWRlci5jbWFwOwotICBybGVfcm93ID0gc291cmNlLT5ybGVfcm93OwotCi0gIC8qIFJlYWQgdGhlIFJMRSBkYXRhIGludG8gb3VyIHZpcnR1YWwgYXJyYXkuCi0gICAqIFdlIGFzc3VtZSBoZXJlIHRoYXQgKGEpIHJsZV9waXhlbCBpcyByZXByZXNlbnRlZCB0aGUgc2FtZSBhcyBKU0FNUExFLAotICAgKiBhbmQgKGIpIHdlIGFyZSBub3Qgb24gYSBtYWNoaW5lIHdoZXJlIEZBUiBwb2ludGVycyBkaWZmZXIgZnJvbSByZWd1bGFyLgotICAgKi8KLSAgUkxFX0NMUl9CSVQoc291cmNlLT5oZWFkZXIsIFJMRV9BTFBIQSk7IC8qIGRvbid0IHJlYWQgdGhlIGFscGhhIGNoYW5uZWwgKi8KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIgPSAwOwotICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICB9Ci0jZW5kaWYKLQotICBzd2l0Y2ggKHNvdXJjZS0+dmlzdWFsKSB7Ci0KLSAgY2FzZSBHUkFZU0NBTEU6Ci0gIGNhc2UgUFNFVURPQ09MT1I6Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgewotICAgICAgcmxlX3JvdyA9IChybGVfcGl4ZWwgKiopICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmltYWdlLCByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgICAgIHJsZV9nZXRyb3coJnNvdXJjZS0+aGVhZGVyLCBybGVfcm93KTsKLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyKys7Ci0gICAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgfQotI2VuZGlmCi0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgTUFQUEVER1JBWToKLSAgY2FzZSBUUlVFQ09MT1I6Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgewotICAgICAgc2NhbmxpbmUgPSAqICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOwotICAgICAgcmxlX3JvdyA9IHNvdXJjZS0+cmxlX3JvdzsKLSAgICAgIHJsZV9nZXRyb3coJnNvdXJjZS0+aGVhZGVyLCBybGVfcm93KTsKLQotICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBzb3VyY2UtPmhlYWRlci5uY29sb3JzOyBjaGFubmVsKyspIHsKLSAgICAgICAgICAqc2NhbmxpbmUrKyA9IChKU0FNUExFKQotICAgICAgICAgICAgKGNvbG9ybWFwW0dFVEpTQU1QTEUocmxlX3Jvd1tjaGFubmVsXVtjb2xdKSArIDI1NiAqIGNoYW5uZWxdID4+IDgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyKys7Ci0gICAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgfQotI2VuZGlmCi0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgRElSRUNUQ09MT1I6Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgewotICAgICAgc2NhbmxpbmUgPSAqICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOwotICAgICAgcmxlX2dldHJvdygmc291cmNlLT5oZWFkZXIsIHJsZV9yb3cpOwotCi0gICAgICByZWRfcHRyICAgPSBybGVfcm93WzBdOwotICAgICAgZ3JlZW5fcHRyID0gcmxlX3Jvd1sxXTsKLSAgICAgIGJsdWVfcHRyICA9IHJsZV9yb3dbMl07Ci0KLSAgICAgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICAgICAqc2NhbmxpbmUrKyA9ICpyZWRfcHRyKys7Ci0gICAgICAgICpzY2FubGluZSsrID0gKmdyZWVuX3B0cisrOwotICAgICAgICAqc2NhbmxpbmUrKyA9ICpibHVlX3B0cisrOwotICAgICAgfQotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOwotICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgfQotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGlmIChwcm9ncmVzcyAhPSBOVUxMKQotICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7Ci0jZW5kaWYKLQotICAvKiBTZXQgdXAgdG8gY2FsbCBwcm9wZXIgcm93LWV4dHJhY3Rpb24gcm91dGluZSBpbiBmdXR1cmUgKi8KLSAgaWYgKHNvdXJjZS0+dmlzdWFsID09IFBTRVVET0NPTE9SKSB7Ci0gICAgc291cmNlLT5wdWIuYnVmZmVyID0gc291cmNlLT5ybGVfcm93OwotICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3BzZXVkb2NvbG9yX3JvdzsKLSAgfSBlbHNlIHsKLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9ybGVfcm93OwotICB9Ci0gIHNvdXJjZS0+cm93ID0gY2luZm8tPmltYWdlX2hlaWdodDsKLQotICAvKiBBbmQgZmV0Y2ggdGhlIHRvcG1vc3QgKGJvdHRvbW1vc3QpIHJvdyAqLwotICByZXR1cm4gKCpzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cykgKGNpbmZvLCBzaW5mbyk7ICAgCi19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX2lucHV0X3JsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgUkxFIGZvcm1hdCBpbnB1dC4KLSAqLwotCi1HTE9CQUwoY2pwZWdfc291cmNlX3B0cikKLWppbml0X3JlYWRfcmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcmxlX3NvdXJjZV9wdHIgc291cmNlOwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCAqLwotICBzb3VyY2UgPSAocmxlX3NvdXJjZV9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVPRihybGVfc291cmNlX3N0cnVjdCkpOwotICAvKiBGaWxsIGluIG1ldGhvZCBwdHJzICovCi0gIHNvdXJjZS0+cHViLnN0YXJ0X2lucHV0ID0gc3RhcnRfaW5wdXRfcmxlOwotICBzb3VyY2UtPnB1Yi5maW5pc2hfaW5wdXQgPSBmaW5pc2hfaW5wdXRfcmxlOwotICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGxvYWRfaW1hZ2U7Ci0KLSAgcmV0dXJuIChjanBlZ19zb3VyY2VfcHRyKSBzb3VyY2U7Ci19Ci0KLSNlbmRpZiAvKiBSTEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9yZHN3aXRjaC5jIGIvbGlianBlZ3R3cnAvcmRzd2l0Y2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0YmI0Zi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9yZHN3aXRjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qCi0gKiByZHN3aXRjaC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcHJvY2VzcyBzb21lIG9mIGNqcGVnJ3MgbW9yZSBjb21wbGljYXRlZAotICogY29tbWFuZC1saW5lIHN3aXRjaGVzLiAgU3dpdGNoZXMgcHJvY2Vzc2VkIGhlcmUgYXJlOgotICoJLXF0YWJsZXMgZmlsZQkJUmVhZCBxdWFudGl6YXRpb24gdGFibGVzIGZyb20gdGV4dCBmaWxlCi0gKgktc2NhbnMgZmlsZQkJUmVhZCBzY2FuIHNjcmlwdCBmcm9tIHRleHQgZmlsZQotICoJLXFzbG90cyBOWyxOLC4uLl0JU2V0IGNvbXBvbmVudCBxdWFudGl6YXRpb24gdGFibGUgc2VsZWN0b3JzCi0gKgktc2FtcGxlIEh4VlssSHhWLC4uLl0JU2V0IGNvbXBvbmVudCBzYW1wbGluZyBmYWN0b3JzCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLSNpbmNsdWRlIDxjdHlwZS5oPgkJLyogdG8gZGVjbGFyZSBpc2RpZ2l0KCksIGlzc3BhY2UoKSAqLwotCi0KLUxPQ0FMKGludCkKLXRleHRfZ2V0YyAoRklMRSAqIGZpbGUpCi0vKiBSZWFkIG5leHQgY2hhciwgc2tpcHBpbmcgb3ZlciBhbnkgY29tbWVudHMgKCMgdG8gZW5kIG9mIGxpbmUpICovCi0vKiBBIGNvbW1lbnQvbmV3bGluZSBzZXF1ZW5jZSBpcyByZXR1cm5lZCBhcyBhIG5ld2xpbmUgKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGNoOwotICAKLSAgY2ggPSBnZXRjKGZpbGUpOwotICBpZiAoY2ggPT0gJyMnKSB7Ci0gICAgZG8gewotICAgICAgY2ggPSBnZXRjKGZpbGUpOwotICAgIH0gd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKLSAgfQotICByZXR1cm4gY2g7Ci19Ci0KLQotTE9DQUwoYm9vbGVhbikKLXJlYWRfdGV4dF9pbnRlZ2VyIChGSUxFICogZmlsZSwgbG9uZyAqIHJlc3VsdCwgaW50ICogdGVybWNoYXIpCi0vKiBSZWFkIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlciBmcm9tIGEgZmlsZSwgc3RvcmUgaXQgaW4gcmVzdWx0ICovCi0vKiBSZWFkcyBvbmUgdHJhaWxpbmcgY2hhcmFjdGVyIGFmdGVyIHRoZSBpbnRlZ2VyOyByZXR1cm5zIGl0IGluIHRlcm1jaGFyICovCi17Ci0gIHJlZ2lzdGVyIGludCBjaDsKLSAgcmVnaXN0ZXIgbG9uZyB2YWw7Ci0gIAotICAvKiBTa2lwIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UsIGRldGVjdCBFT0YgKi8KLSAgZG8gewotICAgIGNoID0gdGV4dF9nZXRjKGZpbGUpOwotICAgIGlmIChjaCA9PSBFT0YpIHsKLSAgICAgICp0ZXJtY2hhciA9IGNoOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgfSB3aGlsZSAoaXNzcGFjZShjaCkpOwotICAKLSAgaWYgKCEgaXNkaWdpdChjaCkpIHsKLSAgICAqdGVybWNoYXIgPSBjaDsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICB2YWwgPSBjaCAtICcwJzsKLSAgd2hpbGUgKChjaCA9IHRleHRfZ2V0YyhmaWxlKSkgIT0gRU9GKSB7Ci0gICAgaWYgKCEgaXNkaWdpdChjaCkpCi0gICAgICBicmVhazsKLSAgICB2YWwgKj0gMTA7Ci0gICAgdmFsICs9IGNoIC0gJzAnOwotICB9Ci0gICpyZXN1bHQgPSB2YWw7Ci0gICp0ZXJtY2hhciA9IGNoOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi1HTE9CQUwoYm9vbGVhbikKLXJlYWRfcXVhbnRfdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lLAotCQkgICBpbnQgc2NhbGVfZmFjdG9yLCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotLyogUmVhZCBhIHNldCBvZiBxdWFudGl6YXRpb24gdGFibGVzIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLgotICogVGhlIGZpbGUgaXMgcGxhaW4gQVNDSUkgdGV4dDogZGVjaW1hbCBudW1iZXJzIHdpdGggd2hpdGVzcGFjZSBiZXR3ZWVuLgotICogQ29tbWVudHMgcHJlY2VkZWQgYnkgJyMnIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgZmlsZS4KLSAqIFRoZXJlIG1heSBiZSBvbmUgdG8gTlVNX1FVQU5UX1RCTFMgdGFibGVzIGluIHRoZSBmaWxlLCBlYWNoIG9mIDY0IHZhbHVlcy4KLSAqIFRoZSB0YWJsZXMgYXJlIGltcGxpY2l0bHkgbnVtYmVyZWQgMCwxLGV0Yy4KLSAqIE5PVEU6IGRvZXMgbm90IGFmZmVjdCB0aGUgcXNsb3RzIG1hcHBpbmcsIHdoaWNoIHdpbGwgZGVmYXVsdCB0byBzZWxlY3RpbmcKLSAqIHRhYmxlIDAgZm9yIGx1bWluYW5jZSAob3IgcHJpbWFyeSkgY29tcG9uZW50cywgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4KLSAqIFlvdSBtdXN0IHVzZSAtcXNsb3RzIGlmIHlvdSB3YW50IGEgZGlmZmVyZW50IGNvbXBvbmVudC0+dGFibGUgbWFwcGluZy4KLSAqLwotewotICBGSUxFICogZnA7Ci0gIGludCB0YmxubywgaSwgdGVybWNoYXI7Ci0gIGxvbmcgdmFsOwotICB1bnNpZ25lZCBpbnQgdGFibGVbRENUU0laRTJdOwotCi0gIGlmICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiB0YWJsZSBmaWxlICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0gIHRibG5vID0gMDsKLQotICB3aGlsZSAocmVhZF90ZXh0X2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikpIHsgLyogcmVhZCAxc3QgZWxlbWVudCBvZiB0YWJsZSAqLwotICAgIGlmICh0YmxubyA+PSBOVU1fUVVBTlRfVEJMUykgewotICAgICAgZnByaW50ZihzdGRlcnIsICJUb28gbWFueSB0YWJsZXMgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotICAgICAgZmNsb3NlKGZwKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdGFibGVbMF0gPSAodW5zaWduZWQgaW50KSB2YWw7Ci0gICAgZm9yIChpID0gMTsgaSA8IERDVFNJWkUyOyBpKyspIHsKLSAgICAgIGlmICghIHJlYWRfdGV4dF9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpKSB7Ci0JZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHRhYmxlIGRhdGEgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotCWZjbG9zZShmcCk7Ci0JcmV0dXJuIEZBTFNFOwotICAgICAgfQotICAgICAgdGFibGVbaV0gPSAodW5zaWduZWQgaW50KSB2YWw7Ci0gICAgfQotICAgIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCB0YmxubywgdGFibGUsIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOwotICAgIHRibG5vKys7Ci0gIH0KLQotICBpZiAodGVybWNoYXIgIT0gRU9GKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJOb24tbnVtZXJpYyBkYXRhIGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLSAgICBmY2xvc2UoZnApOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIGZjbG9zZShmcCk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLQotTE9DQUwoYm9vbGVhbikKLXJlYWRfc2Nhbl9pbnRlZ2VyIChGSUxFICogZmlsZSwgbG9uZyAqIHJlc3VsdCwgaW50ICogdGVybWNoYXIpCi0vKiBWYXJpYW50IG9mIHJlYWRfdGV4dF9pbnRlZ2VyIHRoYXQgYWx3YXlzIGxvb2tzIGZvciBhIG5vbi1zcGFjZSB0ZXJtY2hhcjsKLSAqIHRoaXMgc2ltcGxpZmllcyBwYXJzaW5nIG9mIHB1bmN0dWF0aW9uIGluIHNjYW4gc2NyaXB0cy4KLSAqLwotewotICByZWdpc3RlciBpbnQgY2g7Ci0KLSAgaWYgKCEgcmVhZF90ZXh0X2ludGVnZXIoZmlsZSwgcmVzdWx0LCB0ZXJtY2hhcikpCi0gICAgcmV0dXJuIEZBTFNFOwotICBjaCA9ICp0ZXJtY2hhcjsKLSAgd2hpbGUgKGNoICE9IEVPRiAmJiBpc3NwYWNlKGNoKSkKLSAgICBjaCA9IHRleHRfZ2V0YyhmaWxlKTsKLSAgaWYgKGlzZGlnaXQoY2gpKSB7CQkvKiBvb3BzLCBwdXQgaXQgYmFjayAqLwotICAgIGlmICh1bmdldGMoY2gsIGZpbGUpID09IEVPRikKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICBjaCA9ICcgJzsKLSAgfSBlbHNlIHsKLSAgICAvKiBBbnkgc2VwYXJhdG9ycyBvdGhlciB0aGFuICc7JyBhbmQgJzonIGFyZSBpZ25vcmVkOwotICAgICAqIHRoaXMgYWxsb3dzIHVzZXIgdG8gaW5zZXJ0IGNvbW1hcywgZXRjLCBpZiBkZXNpcmVkLgotICAgICAqLwotICAgIGlmIChjaCAhPSBFT0YgJiYgY2ggIT0gJzsnICYmIGNoICE9ICc6JykKLSAgICAgIGNoID0gJyAnOwotICB9Ci0gICp0ZXJtY2hhciA9IGNoOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi1HTE9CQUwoYm9vbGVhbikKLXJlYWRfc2Nhbl9zY3JpcHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICogZmlsZW5hbWUpCi0vKiBSZWFkIGEgc2NhbiBzY3JpcHQgZnJvbSB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KLSAqIEVhY2ggZW50cnkgaW4gdGhlIGZpbGUgZGVmaW5lcyBvbmUgc2NhbiB0byBiZSBlbWl0dGVkLgotICogRW50cmllcyBhcmUgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgJzsnLgotICogQW4gZW50cnkgY29udGFpbnMgb25lIHRvIGZvdXIgY29tcG9uZW50IGluZGV4ZXMsCi0gKiBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgY29sb24gJzonIGFuZCBmb3VyIHByb2dyZXNzaXZlLUpQRUcgcGFyYW1ldGVycy4KLSAqIFRoZSBjb21wb25lbnQgaW5kZXhlcyBkZW5vdGUgd2hpY2ggY29tcG9uZW50KHMpIGFyZSB0byBiZSB0cmFuc21pdHRlZAotICogaW4gdGhlIGN1cnJlbnQgc2Nhbi4gIFRoZSBmaXJzdCBjb21wb25lbnQgaGFzIGluZGV4IDAuCi0gKiBTZXF1ZW50aWFsIEpQRUcgaXMgdXNlZCBpZiB0aGUgcHJvZ3Jlc3NpdmUtSlBFRyBwYXJhbWV0ZXJzIGFyZSBvbWl0dGVkLgotICogVGhlIGZpbGUgaXMgZnJlZSBmb3JtYXQgdGV4dDogYW55IHdoaXRlc3BhY2UgbWF5IGFwcGVhciBiZXR3ZWVuIG51bWJlcnMKLSAqIGFuZCB0aGUgJzonIGFuZCAnOycgcHVuY3R1YXRpb24gbWFya3MuICBBbHNvLCBvdGhlciBwdW5jdHVhdGlvbiAoc3VjaAotICogYXMgY29tbWFzIG9yIGRhc2hlcykgY2FuIGJlIHBsYWNlZCBiZXR3ZWVuIG51bWJlcnMgaWYgZGVzaXJlZC4KLSAqIENvbW1lbnRzIHByZWNlZGVkIGJ5ICcjJyBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbGUuCi0gKiBOb3RlOiB3ZSBkbyB2ZXJ5IGxpdHRsZSB2YWxpZGl0eSBjaGVja2luZyBoZXJlOwotICogamNtYXN0ZXIuYyB3aWxsIHZhbGlkYXRlIHRoZSBzY3JpcHQgcGFyYW1ldGVycy4KLSAqLwotewotICBGSUxFICogZnA7Ci0gIGludCBzY2Fubm8sIG5jb21wcywgdGVybWNoYXI7Ci0gIGxvbmcgdmFsOwotICBqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHI7Ci0jZGVmaW5lIE1BWF9TQ0FOUyAgMTAwCQkvKiBxdWl0ZSBhcmJpdHJhcnkgbGltaXQgKi8KLSAganBlZ19zY2FuX2luZm8gc2NhbnNbTUFYX1NDQU5TXTsKLQotICBpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gc2NhbiBkZWZpbml0aW9uIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLSAgc2NhbnB0ciA9IHNjYW5zOwotICBzY2Fubm8gPSAwOwotCi0gIHdoaWxlIChyZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkgewotICAgIGlmIChzY2Fubm8gPj0gTUFYX1NDQU5TKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IHNjYW5zIGRlZmluZWQgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotICAgICAgZmNsb3NlKGZwKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4WzBdID0gKGludCkgdmFsOwotICAgIG5jb21wcyA9IDE7Ci0gICAgd2hpbGUgKHRlcm1jaGFyID09ICcgJykgewotICAgICAgaWYgKG5jb21wcyA+PSBNQVhfQ09NUFNfSU5fU0NBTikgewotCWZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgY29tcG9uZW50cyBpbiBvbmUgc2NhbiBpbiBmaWxlICVzXG4iLAotCQlmaWxlbmFtZSk7Ci0JZmNsb3NlKGZwKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICB9Ci0gICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkKLQlnb3RvIGJvZ3VzOwotICAgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W25jb21wc10gPSAoaW50KSB2YWw7Ci0gICAgICBuY29tcHMrKzsKLSAgICB9Ci0gICAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IG5jb21wczsKLSAgICBpZiAodGVybWNoYXIgPT0gJzonKSB7Ci0gICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSB8fCB0ZXJtY2hhciAhPSAnICcpCi0JZ290byBib2d1czsKLSAgICAgIHNjYW5wdHItPlNzID0gKGludCkgdmFsOwotICAgICAgaWYgKCEgcmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikgfHwgdGVybWNoYXIgIT0gJyAnKQotCWdvdG8gYm9ndXM7Ci0gICAgICBzY2FucHRyLT5TZSA9IChpbnQpIHZhbDsKLSAgICAgIGlmICghIHJlYWRfc2Nhbl9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpIHx8IHRlcm1jaGFyICE9ICcgJykKLQlnb3RvIGJvZ3VzOwotICAgICAgc2NhbnB0ci0+QWggPSAoaW50KSB2YWw7Ci0gICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkKLQlnb3RvIGJvZ3VzOwotICAgICAgc2NhbnB0ci0+QWwgPSAoaW50KSB2YWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHNldCBub24tcHJvZ3Jlc3NpdmUgcGFyYW1ldGVycyAqLwotICAgICAgc2NhbnB0ci0+U3MgPSAwOwotICAgICAgc2NhbnB0ci0+U2UgPSBEQ1RTSVpFMi0xOwotICAgICAgc2NhbnB0ci0+QWggPSAwOwotICAgICAgc2NhbnB0ci0+QWwgPSAwOwotICAgIH0KLSAgICBpZiAodGVybWNoYXIgIT0gJzsnICYmIHRlcm1jaGFyICE9IEVPRikgewotYm9ndXM6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgc2NhbiBlbnRyeSBmb3JtYXQgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotICAgICAgZmNsb3NlKGZwKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc2NhbnB0cisrLCBzY2Fubm8rKzsKLSAgfQotCi0gIGlmICh0ZXJtY2hhciAhPSBFT0YpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk5vbi1udW1lcmljIGRhdGEgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotICAgIGZjbG9zZShmcCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgaWYgKHNjYW5ubyA+IDApIHsKLSAgICAvKiBTdGFzaCBjb21wbGV0ZWQgc2NhbiBsaXN0IGluIGNpbmZvIHN0cnVjdHVyZS4KLSAgICAgKiBOT1RFOiBmb3IgY2pwZWcncyB1c2UsIEpQT09MX0lNQUdFIGlzIHRoZSByaWdodCBsaWZldGltZSBmb3IgdGhpcyBkYXRhLAotICAgICAqIGJ1dCBpZiB5b3Ugd2FudCB0byBjb21wcmVzcyBtdWx0aXBsZSBpbWFnZXMgeW91J2Qgd2FudCBKUE9PTF9QRVJNQU5FTlQuCi0gICAgICovCi0gICAgc2NhbnB0ciA9IChqcGVnX3NjYW5faW5mbyAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIHNjYW5ubyAqIFNJWkVPRihqcGVnX3NjYW5faW5mbykpOwotICAgIE1FTUNPUFkoc2NhbnB0ciwgc2NhbnMsIHNjYW5ubyAqIFNJWkVPRihqcGVnX3NjYW5faW5mbykpOwotICAgIGNpbmZvLT5zY2FuX2luZm8gPSBzY2FucHRyOwotICAgIGNpbmZvLT5udW1fc2NhbnMgPSBzY2Fubm87Ci0gIH0KLQotICBmY2xvc2UoZnApOwotICByZXR1cm4gVFJVRTsKLX0KLQotI2VuZGlmIC8qIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwotCi0KLUdMT0JBTChib29sZWFuKQotc2V0X3F1YW50X3Nsb3RzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqYXJnKQotLyogUHJvY2VzcyBhIHF1YW50aXphdGlvbi10YWJsZS1zZWxlY3RvcnMgcGFyYW1ldGVyIHN0cmluZywgb2YgdGhlIGZvcm0KLSAqICAgICBOWyxOLC4uLl0KLSAqIElmIHRoZXJlIGFyZSBtb3JlIGNvbXBvbmVudHMgdGhhbiBwYXJhbWV0ZXJzLCB0aGUgbGFzdCB2YWx1ZSBpcyByZXBsaWNhdGVkLgotICovCi17Ci0gIGludCB2YWwgPSAwOwkJCS8qIGRlZmF1bHQgdGFibGUgIyAqLwotICBpbnQgY2k7Ci0gIGNoYXIgY2g7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgTUFYX0NPTVBPTkVOVFM7IGNpKyspIHsKLSAgICBpZiAoKmFyZykgewotICAgICAgY2ggPSAnLCc7CQkJLyogaWYgbm90IHNldCBieSBzc2NhbmYsIHdpbGwgYmUgJywnICovCi0gICAgICBpZiAoc3NjYW5mKGFyZywgIiVkJWMiLCAmdmFsLCAmY2gpIDwgMSkKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICBpZiAoY2ggIT0gJywnKQkJLyogc3ludGF4IGNoZWNrICovCi0JcmV0dXJuIEZBTFNFOwotICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID49IE5VTV9RVUFOVF9UQkxTKSB7Ci0JZnByaW50ZihzdGRlcnIsICJKUEVHIHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLiVkXG4iLAotCQlOVU1fUVVBTlRfVEJMUy0xKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICB9Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS5xdWFudF90Ymxfbm8gPSB2YWw7Ci0gICAgICB3aGlsZSAoKmFyZyAmJiAqYXJnKysgIT0gJywnKSAvKiBhZHZhbmNlIHRvIG5leHQgc2VnbWVudCBvZiBhcmcgc3RyaW5nICovCi0JOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiByZWFjaGVkIGVuZCBvZiBwYXJhbWV0ZXIsIHNldCByZW1haW5pbmcgY29tcG9uZW50cyB0byBsYXN0IHRhYmxlICovCi0gICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS5xdWFudF90Ymxfbm8gPSB2YWw7Ci0gICAgfQotICB9Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLUdMT0JBTChib29sZWFuKQotc2V0X3NhbXBsZV9mYWN0b3JzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqYXJnKQotLyogUHJvY2VzcyBhIHNhbXBsZS1mYWN0b3JzIHBhcmFtZXRlciBzdHJpbmcsIG9mIHRoZSBmb3JtCi0gKiAgICAgSHhWWyxIeFYsLi4uXQotICogSWYgdGhlcmUgYXJlIG1vcmUgY29tcG9uZW50cyB0aGFuIHBhcmFtZXRlcnMsICIxeDEiIGlzIGFzc3VtZWQgZm9yIHRoZSByZXN0LgotICovCi17Ci0gIGludCBjaSwgdmFsMSwgdmFsMjsKLSAgY2hhciBjaDEsIGNoMjsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBNQVhfQ09NUE9ORU5UUzsgY2krKykgewotICAgIGlmICgqYXJnKSB7Ci0gICAgICBjaDIgPSAnLCc7CQkvKiBpZiBub3Qgc2V0IGJ5IHNzY2FuZiwgd2lsbCBiZSAnLCcgKi8KLSAgICAgIGlmIChzc2NhbmYoYXJnLCAiJWQlYyVkJWMiLCAmdmFsMSwgJmNoMSwgJnZhbDIsICZjaDIpIDwgMykKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICBpZiAoKGNoMSAhPSAneCcgJiYgY2gxICE9ICdYJykgfHwgY2gyICE9ICcsJykgLyogc3ludGF4IGNoZWNrICovCi0JcmV0dXJuIEZBTFNFOwotICAgICAgaWYgKHZhbDEgPD0gMCB8fCB2YWwxID4gNCB8fCB2YWwyIDw9IDAgfHwgdmFsMiA+IDQpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkpQRUcgc2FtcGxpbmcgZmFjdG9ycyBtdXN0IGJlIDEuLjRcbiIpOwotCXJldHVybiBGQUxTRTsKLSAgICAgIH0KLSAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLmhfc2FtcF9mYWN0b3IgPSB2YWwxOwotICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0udl9zYW1wX2ZhY3RvciA9IHZhbDI7Ci0gICAgICB3aGlsZSAoKmFyZyAmJiAqYXJnKysgIT0gJywnKSAvKiBhZHZhbmNlIHRvIG5leHQgc2VnbWVudCBvZiBhcmcgc3RyaW5nICovCi0JOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiByZWFjaGVkIGVuZCBvZiBwYXJhbWV0ZXIsIHNldCByZW1haW5pbmcgY29tcG9uZW50cyB0byAxeDEgc2FtcGxpbmcgKi8KLSAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLmhfc2FtcF9mYWN0b3IgPSAxOwotICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0udl9zYW1wX2ZhY3RvciA9IDE7Ci0gICAgfQotICB9Ci0gIHJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvcmR0YXJnYS5jIGIvbGlianBlZ3R3cnAvcmR0YXJnYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzJjZDI2Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3JkdGFyZ2EuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKgotICogcmR0YXJnYS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcmVhZCBpbnB1dCBpbWFnZXMgaW4gVGFyZ2EgZm9ybWF0LgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBpbnB1dCBmcm9tCi0gKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uICBUaGV5IGZ1cnRoZXIgYXNzdW1lIHRoYXQgcmVhZGluZyBiZWdpbnMKLSAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZTsgc3RhcnRfaW5wdXQgbWF5IG5lZWQgd29yayBpZiB0aGUKLSAqIHVzZXIgaW50ZXJmYWNlIGhhcyBhbHJlYWR5IHJlYWQgc29tZSBkYXRhIChlLmcuLCB0byBkZXRlcm1pbmUgdGhhdAotICogdGhlIGZpbGUgaXMgaW5kZWVkIFRhcmdhIGZvcm1hdCkuCi0gKgotICogQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBMZWUgRGFuaWVsIENyb2NrZXIuCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLQotI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAotCi0KLS8qIE1hY3JvcyB0byBkZWFsIHdpdGggdW5zaWduZWQgY2hhcnMgYXMgZWZmaWNpZW50bHkgYXMgY29tcGlsZXIgYWxsb3dzICovCi0KLSNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQotI2Vsc2UgLyogIUhBVkVfVU5TSUdORURfQ0hBUiAqLwotI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKLXR5cGVkZWYgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQotI2Vsc2UKLXR5cGVkZWYgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpICYgMHhGRikKLSNlbmRpZgotI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLwotCi0KLSNkZWZpbmUJUmVhZE9LKGZpbGUsYnVmZmVyLGxlbikJKEpGUkVBRChmaWxlLGJ1ZmZlcixsZW4pID09ICgoc2l6ZV90KSAobGVuKSkpCi0KLQotLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgc291cmNlIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCBfdGdhX3NvdXJjZV9zdHJ1Y3QgKiB0Z2Ffc291cmNlX3B0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgX3RnYV9zb3VyY2Vfc3RydWN0IHsKLSAgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgal9jb21wcmVzc19wdHIgY2luZm87CQkvKiBiYWNrIGxpbmsgc2F2ZXMgcGFzc2luZyBzZXBhcmF0ZSBwYXJtICovCi0KLSAgSlNBTVBBUlJBWSBjb2xvcm1hcDsJCS8qIFRhcmdhIGNvbG9ybWFwIChjb252ZXJ0ZWQgdG8gbXkgZm9ybWF0KSAqLwotCi0gIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2U7CS8qIE5lZWRlZCBpZiBmdW5ueSBpbnB1dCByb3cgb3JkZXIgKi8KLSAgSkRJTUVOU0lPTiBjdXJyZW50X3JvdzsJLyogQ3VycmVudCBsb2dpY2FsIHJvdyBudW1iZXIgdG8gcmVhZCAqLwotCi0gIC8qIFBvaW50ZXIgdG8gcm91dGluZSB0byBleHRyYWN0IG5leHQgVGFyZ2EgcGl4ZWwgZnJvbSBpbnB1dCBmaWxlICovCi0gIEpNRVRIT0Qodm9pZCwgcmVhZF9waXhlbCwgKHRnYV9zb3VyY2VfcHRyIHNpbmZvKSk7Ci0KLSAgLyogUmVzdWx0IG9mIHJlYWRfcGl4ZWwgaXMgZGVsaXZlcmVkIGhlcmU6ICovCi0gIFVfQ0hBUiB0Z2FfcGl4ZWxbNF07Ci0KLSAgaW50IHBpeGVsX3NpemU7CQkvKiBCeXRlcyBwZXIgVGFyZ2EgcGl4ZWwgKDEgdG8gNCkgKi8KLQotICAvKiBTdGF0ZSBpbmZvIGZvciByZWFkaW5nIFJMRS1jb2RlZCBwaXhlbHM7IGJvdGggY291bnRzIG11c3QgYmUgaW5pdCB0byAwICovCi0gIGludCBibG9ja19jb3VudDsJCS8qICMgb2YgcGl4ZWxzIHJlbWFpbmluZyBpbiBSTEUgYmxvY2sgKi8KLSAgaW50IGR1cF9waXhlbF9jb3VudDsJCS8qICMgb2YgdGltZXMgdG8gZHVwbGljYXRlIHByZXZpb3VzIHBpeGVsICovCi0KLSAgLyogVGhpcyBzYXZlcyB0aGUgY29ycmVjdCBwaXhlbC1yb3ctZXhwYW5zaW9uIG1ldGhvZCBmb3IgcHJlbG9hZF9pbWFnZSAqLwotICBKTUVUSE9EKEpESU1FTlNJT04sIGdldF9waXhlbF9yb3dzLCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgICAgIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pKTsKLX0gdGdhX3NvdXJjZV9zdHJ1Y3Q7Ci0KLQotLyogRm9yIGV4cGFuZGluZyA1LWJpdCBwaXhlbCB2YWx1ZXMgdG8gOC1iaXQgd2l0aCBiZXN0IHJvdW5kaW5nICovCi0KLXN0YXRpYyBjb25zdCBVSU5UOCBjNXRvOGJpdHNbMzJdID0gewotICAgIDAsICAgOCwgIDE2LCAgMjUsICAzMywgIDQxLCAgNDksICA1OCwKLSAgIDY2LCAgNzQsICA4MiwgIDkwLCAgOTksIDEwNywgMTE1LCAxMjMsCi0gIDEzMiwgMTQwLCAxNDgsIDE1NiwgMTY1LCAxNzMsIDE4MSwgMTg5LAotICAxOTcsIDIwNiwgMjE0LCAyMjIsIDIzMCwgMjM5LCAyNDcsIDI1NQotfTsKLQotCi0KLUxPQ0FMKGludCkKLXJlYWRfYnl0ZSAodGdhX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBSZWFkIG5leHQgYnl0ZSBmcm9tIFRhcmdhIGZpbGUgKi8KLXsKLSAgcmVnaXN0ZXIgRklMRSAqaW5maWxlID0gc2luZm8tPnB1Yi5pbnB1dF9maWxlOwotICByZWdpc3RlciBpbnQgYzsKLQotICBpZiAoKGMgPSBnZXRjKGluZmlsZSkpID09IEVPRikKLSAgICBFUlJFWElUKHNpbmZvLT5jaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICByZXR1cm4gYzsKLX0KLQotCi1MT0NBTCh2b2lkKQotcmVhZF9jb2xvcm1hcCAodGdhX3NvdXJjZV9wdHIgc2luZm8sIGludCBjbWFwbGVuLCBpbnQgbWFwZW50cnlzaXplKQotLyogUmVhZCB0aGUgY29sb3JtYXAgZnJvbSBhIFRhcmdhIGZpbGUgKi8KLXsKLSAgaW50IGk7Ci0KLSAgLyogUHJlc2VudGx5IG9ubHkgaGFuZGxlcyAyNC1iaXQgQkdSIGZvcm1hdCAqLwotICBpZiAobWFwZW50cnlzaXplICE9IDI0KQotICAgIEVSUkVYSVQoc2luZm8tPmNpbmZvLCBKRVJSX1RHQV9CQURDTUFQKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY21hcGxlbjsgaSsrKSB7Ci0gICAgc2luZm8tPmNvbG9ybWFwWzJdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgc2luZm8tPmNvbG9ybWFwWzFdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgc2luZm8tPmNvbG9ybWFwWzBdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gIH0KLX0KLQotCi0vKgotICogcmVhZF9waXhlbCBtZXRob2RzOiBnZXQgYSBzaW5nbGUgcGl4ZWwgZnJvbSBUYXJnYSBmaWxlIGludG8gdGdhX3BpeGVsW10KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJlYWRfbm9uX3JsZV9waXhlbCAodGdhX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBSZWFkIG9uZSBUYXJnYSBwaXhlbCBmcm9tIHRoZSBpbnB1dCBmaWxlOyBubyBSTEUgZXhwYW5zaW9uICovCi17Ci0gIHJlZ2lzdGVyIEZJTEUgKmluZmlsZSA9IHNpbmZvLT5wdWIuaW5wdXRfZmlsZTsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpbmZvLT5waXhlbF9zaXplOyBpKyspIHsKLSAgICBzaW5mby0+dGdhX3BpeGVsW2ldID0gKFVfQ0hBUikgZ2V0YyhpbmZpbGUpOwotICB9Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1yZWFkX3JsZV9waXhlbCAodGdhX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBSZWFkIG9uZSBUYXJnYSBwaXhlbCBmcm9tIHRoZSBpbnB1dCBmaWxlLCBleHBhbmRpbmcgUkxFIGRhdGEgYXMgbmVlZGVkICovCi17Ci0gIHJlZ2lzdGVyIEZJTEUgKmluZmlsZSA9IHNpbmZvLT5wdWIuaW5wdXRfZmlsZTsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgLyogRHVwbGljYXRlIHByZXZpb3VzbHkgcmVhZCBwaXhlbD8gKi8KLSAgaWYgKHNpbmZvLT5kdXBfcGl4ZWxfY291bnQgPiAwKSB7Ci0gICAgc2luZm8tPmR1cF9waXhlbF9jb3VudC0tOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFRpbWUgdG8gcmVhZCBSTEUgYmxvY2sgaGVhZGVyPyAqLwotICBpZiAoLS1zaW5mby0+YmxvY2tfY291bnQgPCAwKSB7IC8qIGRlY3JlbWVudCBwaXhlbHMgcmVtYWluaW5nIGluIGJsb2NrICovCi0gICAgaSA9IHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgaWYgKGkgJiAweDgwKSB7CQkvKiBTdGFydCBvZiBkdXBsaWNhdGUtcGl4ZWwgYmxvY2s/ICovCi0gICAgICBzaW5mby0+ZHVwX3BpeGVsX2NvdW50ID0gaSAmIDB4N0Y7IC8qIG51bWJlciBvZiBkdXBzIGFmdGVyIHRoaXMgb25lICovCi0gICAgICBzaW5mby0+YmxvY2tfY291bnQgPSAwOwkvKiB0aGVuIHJlYWQgbmV3IGJsb2NrIGhlYWRlciAqLwotICAgIH0gZWxzZSB7Ci0gICAgICBzaW5mby0+YmxvY2tfY291bnQgPSBpICYgMHg3RjsgLyogbnVtYmVyIG9mIHBpeGVscyBhZnRlciB0aGlzIG9uZSAqLwotICAgIH0KLSAgfQotCi0gIC8qIFJlYWQgbmV4dCBwaXhlbCAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2luZm8tPnBpeGVsX3NpemU7IGkrKykgewotICAgIHNpbmZvLT50Z2FfcGl4ZWxbaV0gPSAoVV9DSEFSKSBnZXRjKGluZmlsZSk7Ci0gIH0KLX0KLQotCi0vKgotICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KLSAqCi0gKiBXZSBwcm92aWRlIHNldmVyYWwgZGlmZmVyZW50IHZlcnNpb25zIGRlcGVuZGluZyBvbiBpbnB1dCBmaWxlIGZvcm1hdC4KLSAqLwotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0XzhiaXRfZ3JheV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDgtYml0IGdyYXlzY2FsZSBwaXhlbHMgKi8KLXsKLSAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgCi0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgKCpzb3VyY2UtPnJlYWRfcGl4ZWwpIChzb3VyY2UpOyAvKiBMb2FkIG5leHQgcGl4ZWwgaW50byB0Z2FfcGl4ZWwgKi8KLSAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzBdKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfOGJpdF9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDgtYml0IGNvbG9ybWFwIGluZGV4ZXMgKi8KLXsKLSAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgaW50IHQ7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIHJlZ2lzdGVyIEpTQU1QQVJSQVkgY29sb3JtYXAgPSBzb3VyY2UtPmNvbG9ybWFwOwotCi0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgKCpzb3VyY2UtPnJlYWRfcGl4ZWwpIChzb3VyY2UpOyAvKiBMb2FkIG5leHQgcGl4ZWwgaW50byB0Z2FfcGl4ZWwgKi8KLSAgICB0ID0gVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzBdKTsKLSAgICAqcHRyKysgPSBjb2xvcm1hcFswXVt0XTsKLSAgICAqcHRyKysgPSBjb2xvcm1hcFsxXVt0XTsKLSAgICAqcHRyKysgPSBjb2xvcm1hcFsyXVt0XTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfMTZiaXRfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyAxNi1iaXQgcGl4ZWxzICovCi17Ci0gIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87Ci0gIHJlZ2lzdGVyIGludCB0OwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICAKLSAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAoKnNvdXJjZS0+cmVhZF9waXhlbCkgKHNvdXJjZSk7IC8qIExvYWQgbmV4dCBwaXhlbCBpbnRvIHRnYV9waXhlbCAqLwotICAgIHQgPSBVQ0goc291cmNlLT50Z2FfcGl4ZWxbMF0pOwotICAgIHQgKz0gVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzFdKSA8PCA4OwotICAgIC8qIFdlIGV4cGFuZCA1IGJpdCBkYXRhIHRvIDggYml0IHNhbXBsZSB3aWR0aC4KLSAgICAgKiBUaGUgZm9ybWF0IG9mIHRoZSAxNi1iaXQgKExTQiBmaXJzdCkgaW5wdXQgd29yZCBpcwotICAgICAqICAgICB4UlJSUlJHR0dHR0JCQkJCCi0gICAgICovCi0gICAgcHRyWzJdID0gKEpTQU1QTEUpIGM1dG84Yml0c1t0ICYgMHgxRl07Ci0gICAgdCA+Pj0gNTsKLSAgICBwdHJbMV0gPSAoSlNBTVBMRSkgYzV0bzhiaXRzW3QgJiAweDFGXTsKLSAgICB0ID4+PSA1OwotICAgIHB0clswXSA9IChKU0FNUExFKSBjNXRvOGJpdHNbdCAmIDB4MUZdOwotICAgIHB0ciArPSAzOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF8yNGJpdF9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDI0LWJpdCBwaXhlbHMgKi8KLXsKLSAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgCi0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgKCpzb3VyY2UtPnJlYWRfcGl4ZWwpIChzb3VyY2UpOyAvKiBMb2FkIG5leHQgcGl4ZWwgaW50byB0Z2FfcGl4ZWwgKi8KLSAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzJdKTsgLyogY2hhbmdlIEJHUiB0byBSR0Igb3JkZXIgKi8KLSAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzFdKTsKLSAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzBdKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIFRhcmdhIGFsc28gZGVmaW5lcyBhIDMyLWJpdCBwaXhlbCBmb3JtYXQgd2l0aCBvcmRlciBCLEcsUixBLgotICogV2UgcHJlc2VudGx5IGlnbm9yZSB0aGUgYXR0cmlidXRlIGJ5dGUsIHNvIHRoZSBjb2RlIGZvciByZWFkaW5nCi0gKiB0aGVzZSBwaXhlbHMgaXMgaWRlbnRpY2FsIHRvIHRoZSAyNC1iaXQgcm91dGluZSBhYm92ZS4KLSAqIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYWN0dWFsIHBpeGVsIGxlbmd0aCBpcyBvbmx5IGtub3duIHRvIHJlYWRfcGl4ZWwuCi0gKi8KLQotI2RlZmluZSBnZXRfMzJiaXRfcm93ICBnZXRfMjRiaXRfcm93Ci0KLQotLyoKLSAqIFRoaXMgbWV0aG9kIGlzIGZvciByZS1yZWFkaW5nIHRoZSBpbnB1dCBkYXRhIGluIHN0YW5kYXJkIHRvcC1kb3duCi0gKiByb3cgb3JkZXIuICBUaGUgZW50aXJlIGltYWdlIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBpbnRvIHdob2xlX2ltYWdlCi0gKiB3aXRoIHByb3BlciBjb252ZXJzaW9uIG9mIHBpeGVsIGZvcm1hdCwgYnV0IGl0J3MgaW4gYSBmdW5ueSByb3cgb3JkZXIuCi0gKi8KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfbWVtb3J5X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87Ci0gIEpESU1FTlNJT04gc291cmNlX3JvdzsKLQotICAvKiBDb21wdXRlIHJvdyBvZiBzb3VyY2UgdGhhdCBtYXBzIHRvIGN1cnJlbnRfcm93IG9mIG5vcm1hbCBvcmRlciAqLwotICAvKiBGb3Igbm93LCBhc3N1bWUgaW1hZ2UgaXMgYm90dG9tLXVwIGFuZCBub3QgaW50ZXJsYWNlZC4gKi8KLSAgLyogTkVFRFMgV09SSyB0byBzdXBwb3J0IGludGVybGFjZWQgaW1hZ2VzISAqLwotICBzb3VyY2Vfcm93ID0gY2luZm8tPmltYWdlX2hlaWdodCAtIHNvdXJjZS0+Y3VycmVudF9yb3cgLSAxOwotCi0gIC8qIEZldGNoIHRoYXQgcm93IGZyb20gdmlydHVhbCBhcnJheSAqLwotICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+d2hvbGVfaW1hZ2UsCi0gICAgIHNvdXJjZV9yb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7Ci0KLSAgc291cmNlLT5jdXJyZW50X3JvdysrOwotICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogVGhpcyBtZXRob2QgbG9hZHMgdGhlIGltYWdlIGludG8gd2hvbGVfaW1hZ2UgZHVyaW5nIHRoZSBmaXJzdCBjYWxsIG9uCi0gKiBnZXRfcGl4ZWxfcm93cy4gIFRoZSBnZXRfcGl4ZWxfcm93cyBwb2ludGVyIGlzIHRoZW4gYWRqdXN0ZWQgdG8gY2FsbAotICogZ2V0X21lbW9yeV9yb3cgb24gc3Vic2VxdWVudCBjYWxscy4KLSAqLwotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLXByZWxvYWRfaW1hZ2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOwotICBKRElNRU5TSU9OIHJvdzsKLSAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotCi0gIC8qIFJlYWQgdGhlIGRhdGEgaW50byBhIHZpcnR1YWwgYXJyYXkgaW4gaW5wdXQtZmlsZSByb3cgb3JkZXIuICovCi0gIGZvciAocm93ID0gMDsgcm93IDwgY2luZm8tPmltYWdlX2hlaWdodDsgcm93KyspIHsKLSAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIgPSAobG9uZykgcm93OwotICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICB9Ci0gICAgc291cmNlLT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+d2hvbGVfaW1hZ2UsIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOwotICAgICgqc291cmNlLT5nZXRfcGl4ZWxfcm93cykgKGNpbmZvLCBzaW5mbyk7Ci0gIH0KLSAgaWYgKHByb2dyZXNzICE9IE5VTEwpCi0gICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMrKzsKLQotICAvKiBTZXQgdXAgdG8gcmVhZCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5IGluIHVuc2NyYW1ibGVkIG9yZGVyICovCi0gIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X21lbW9yeV9yb3c7Ci0gIHNvdXJjZS0+Y3VycmVudF9yb3cgPSAwOwotICAvKiBBbmQgcmVhZCB0aGUgZmlyc3Qgcm93ICovCi0gIHJldHVybiBnZXRfbWVtb3J5X3JvdyhjaW5mbywgc2luZm8pOwotfQotCi0KLS8qCi0gKiBSZWFkIHRoZSBmaWxlIGhlYWRlcjsgcmV0dXJuIGltYWdlIHNpemUgYW5kIGNvbXBvbmVudCBjb3VudC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X2lucHV0X3RnYSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87Ci0gIFVfQ0hBUiB0YXJnYWhlYWRlclsxOF07Ci0gIGludCBpZGxlbiwgY21hcHR5cGUsIHN1YnR5cGUsIGZsYWdzLCBpbnRlcmxhY2VfdHlwZSwgY29tcG9uZW50czsKLSAgdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQsIG1hcGxlbjsKLSAgYm9vbGVhbiBpc19ib3R0b21fdXA7Ci0KLSNkZWZpbmUgR0VUXzJCKG9mZnNldCkJKCh1bnNpZ25lZCBpbnQpIFVDSCh0YXJnYWhlYWRlcltvZmZzZXRdKSArIFwKLQkJCSAoKCh1bnNpZ25lZCBpbnQpIFVDSCh0YXJnYWhlYWRlcltvZmZzZXQrMV0pKSA8PCA4KSkKLQotICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgdGFyZ2FoZWFkZXIsIDE4KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0KLSAgLyogUHJldGVuZCAiMTUtYml0IiBwaXhlbHMgYXJlIDE2LWJpdCAtLS0gd2UgaWdub3JlIGF0dHJpYnV0ZSBiaXQgYW55d2F5ICovCi0gIGlmICh0YXJnYWhlYWRlclsxNl0gPT0gMTUpCi0gICAgdGFyZ2FoZWFkZXJbMTZdID0gMTY7Ci0KLSAgaWRsZW4gPSBVQ0godGFyZ2FoZWFkZXJbMF0pOwotICBjbWFwdHlwZSA9IFVDSCh0YXJnYWhlYWRlclsxXSk7Ci0gIHN1YnR5cGUgPSBVQ0godGFyZ2FoZWFkZXJbMl0pOwotICBtYXBsZW4gPSBHRVRfMkIoNSk7Ci0gIHdpZHRoID0gR0VUXzJCKDEyKTsKLSAgaGVpZ2h0ID0gR0VUXzJCKDE0KTsKLSAgc291cmNlLT5waXhlbF9zaXplID0gVUNIKHRhcmdhaGVhZGVyWzE2XSkgPj4gMzsKLSAgZmxhZ3MgPSBVQ0godGFyZ2FoZWFkZXJbMTddKTsJLyogSW1hZ2UgRGVzY3JpcHRvciBieXRlICovCi0KLSAgaXNfYm90dG9tX3VwID0gKChmbGFncyAmIDB4MjApID09IDApOwkvKiBiaXQgNSBzZXQgPT4gdG9wLWRvd24gKi8KLSAgaW50ZXJsYWNlX3R5cGUgPSBmbGFncyA+PiA2OwkvKiBiaXRzIDYvNyBhcmUgaW50ZXJsYWNlIGNvZGUgKi8KLQotICBpZiAoY21hcHR5cGUgPiAxIHx8CQkvKiBjbWFwdHlwZSBtdXN0IGJlIDAgb3IgMSAqLwotICAgICAgc291cmNlLT5waXhlbF9zaXplIDwgMSB8fCBzb3VyY2UtPnBpeGVsX3NpemUgPiA0IHx8Ci0gICAgICAoVUNIKHRhcmdhaGVhZGVyWzE2XSkgJiA3KSAhPSAwIHx8IC8qIGJpdHMvcGl4ZWwgbXVzdCBiZSBtdWx0aXBsZSBvZiA4ICovCi0gICAgICBpbnRlcmxhY2VfdHlwZSAhPSAwKQkvKiBjdXJyZW50bHkgZG9uJ3QgYWxsb3cgaW50ZXJsYWNlZCBpbWFnZSAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKLSAgCi0gIGlmIChzdWJ0eXBlID4gOCkgewotICAgIC8qIEl0J3MgYW4gUkxFLWNvZGVkIGZpbGUgKi8KLSAgICBzb3VyY2UtPnJlYWRfcGl4ZWwgPSByZWFkX3JsZV9waXhlbDsKLSAgICBzb3VyY2UtPmJsb2NrX2NvdW50ID0gc291cmNlLT5kdXBfcGl4ZWxfY291bnQgPSAwOwotICAgIHN1YnR5cGUgLT0gODsKLSAgfSBlbHNlIHsKLSAgICAvKiBOb24tUkxFIGZpbGUgKi8KLSAgICBzb3VyY2UtPnJlYWRfcGl4ZWwgPSByZWFkX25vbl9ybGVfcGl4ZWw7Ci0gIH0KLQotICAvKiBOb3cgc2hvdWxkIGhhdmUgc3VidHlwZSAxLCAyLCBvciAzICovCi0gIGNvbXBvbmVudHMgPSAzOwkJLyogdW50aWwgcHJvdmVuIGRpZmZlcmVudCAqLwotICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOwotCi0gIHN3aXRjaCAoc3VidHlwZSkgewotICBjYXNlIDE6CQkJLyogQ29sb3JtYXBwZWQgaW1hZ2UgKi8KLSAgICBpZiAoc291cmNlLT5waXhlbF9zaXplID09IDEgJiYgY21hcHR5cGUgPT0gMSkKLSAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfOGJpdF9yb3c7Ci0gICAgZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOwotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1RHQV9NQVBQRUQsIHdpZHRoLCBoZWlnaHQpOwotICAgIGJyZWFrOwotICBjYXNlIDI6CQkJLyogUkdCIGltYWdlICovCi0gICAgc3dpdGNoIChzb3VyY2UtPnBpeGVsX3NpemUpIHsKLSAgICBjYXNlIDI6Ci0gICAgICBzb3VyY2UtPmdldF9waXhlbF9yb3dzID0gZ2V0XzE2Yml0X3JvdzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfMjRiaXRfcm93OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgc291cmNlLT5nZXRfcGl4ZWxfcm93cyA9IGdldF8zMmJpdF9yb3c7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1RHQSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgMzoJCQkvKiBHcmF5c2NhbGUgaW1hZ2UgKi8KLSAgICBjb21wb25lbnRzID0gMTsKLSAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOwotICAgIGlmIChzb3VyY2UtPnBpeGVsX3NpemUgPT0gMSkKLSAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfOGJpdF9ncmF5X3JvdzsKLSAgICBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7Ci0gICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfVEdBX0dSQVksIHdpZHRoLCBoZWlnaHQpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGlmIChpc19ib3R0b21fdXApIHsKLSAgICAvKiBDcmVhdGUgYSB2aXJ0dWFsIGFycmF5IHRvIGJ1ZmZlciB0aGUgdXBzaWRlLWRvd24gaW1hZ2UuICovCi0gICAgc291cmNlLT53aG9sZV9pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAotICAgICAgIChKRElNRU5TSU9OKSB3aWR0aCAqIGNvbXBvbmVudHMsIChKRElNRU5TSU9OKSBoZWlnaHQsIChKRElNRU5TSU9OKSAxKTsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLSAgICAgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKLSAgICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCi0gICAgfQotICAgIC8qIHNvdXJjZS0+cHViLmJ1ZmZlciB3aWxsIHBvaW50IHRvIHRoZSB2aXJ0dWFsIGFycmF5LiAqLwotICAgIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOyAvKiBpbiBjYXNlIGFueW9uZSBsb29rcyBhdCBpdCAqLwotICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gcHJlbG9hZF9pbWFnZTsKLSAgfSBlbHNlIHsKLSAgICAvKiBEb24ndCBuZWVkIGEgdmlydHVhbCBhcnJheSwgYnV0IGRvIG5lZWQgYSBvbmUtcm93IGlucHV0IGJ1ZmZlci4gKi8KLSAgICBzb3VyY2UtPndob2xlX2ltYWdlID0gTlVMTDsKLSAgICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgKEpESU1FTlNJT04pIHdpZHRoICogY29tcG9uZW50cywgKEpESU1FTlNJT04pIDEpOwotICAgIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gc291cmNlLT5nZXRfcGl4ZWxfcm93czsKLSAgfQotICAKLSAgd2hpbGUgKGlkbGVuLS0pCQkvKiBUaHJvdyBhd2F5IElEIGZpZWxkICovCi0gICAgKHZvaWQpIHJlYWRfYnl0ZShzb3VyY2UpOwotCi0gIGlmIChtYXBsZW4gPiAwKSB7Ci0gICAgaWYgKG1hcGxlbiA+IDI1NiB8fCBHRVRfMkIoMykgIT0gMCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRENNQVApOwotICAgIC8qIEFsbG9jYXRlIHNwYWNlIHRvIHN0b3JlIHRoZSBjb2xvcm1hcCAqLwotICAgIHNvdXJjZS0+Y29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIChKRElNRU5TSU9OKSBtYXBsZW4sIChKRElNRU5TSU9OKSAzKTsKLSAgICAvKiBhbmQgcmVhZCBpdCBmcm9tIHRoZSBmaWxlICovCi0gICAgcmVhZF9jb2xvcm1hcChzb3VyY2UsIChpbnQpIG1hcGxlbiwgVUNIKHRhcmdhaGVhZGVyWzddKSk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNtYXB0eXBlKQkJLyogYnV0IHlvdSBwcm9taXNlZCBhIGNtYXAhICovCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7Ci0gICAgc291cmNlLT5jb2xvcm1hcCA9IE5VTEw7Ci0gIH0KLQotICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IGNvbXBvbmVudHM7Ci0gIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IDg7Ci0gIGNpbmZvLT5pbWFnZV93aWR0aCA9IHdpZHRoOwotICBjaW5mby0+aW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9pbnB1dF90Z2EgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFRhcmdhIGZvcm1hdCBpbnB1dC4KLSAqLwotCi1HTE9CQUwoY2pwZWdfc291cmNlX3B0cikKLWppbml0X3JlYWRfdGFyZ2EgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICB0Z2Ffc291cmNlX3B0ciBzb3VyY2U7Ci0KLSAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0ICovCi0gIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YodGdhX3NvdXJjZV9zdHJ1Y3QpKTsKLSAgc291cmNlLT5jaW5mbyA9IGNpbmZvOwkvKiBtYWtlIGJhY2sgbGluayBmb3Igc3Vicm91dGluZXMgKi8KLSAgLyogRmlsbCBpbiBtZXRob2QgcHRycywgZXhjZXB0IGdldF9waXhlbF9yb3dzIHdoaWNoIHN0YXJ0X2lucHV0IHNldHMgKi8KLSAgc291cmNlLT5wdWIuc3RhcnRfaW5wdXQgPSBzdGFydF9pbnB1dF90Z2E7Ci0gIHNvdXJjZS0+cHViLmZpbmlzaF9pbnB1dCA9IGZpbmlzaF9pbnB1dF90Z2E7Ci0KLSAgcmV0dXJuIChjanBlZ19zb3VyY2VfcHRyKSBzb3VyY2U7Ci19Ci0KLSNlbmRpZiAvKiBUQVJHQV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3N0cnVjdHVyZS5kb2MgYi9saWJqcGVndHdycC9zdHJ1Y3R1cmUuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM5ZGVmLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3N0cnVjdHVyZS5kb2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NDggKzAsMCBAQAotSUpHIEpQRUcgTElCUkFSWTogIFNZU1RFTSBBUkNISVRFQ1RVUkUKLQotQ29weXJpZ2h0IChDKSAxOTkxLTE5OTUsIFRob21hcyBHLiBMYW5lLgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLUZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLQotCi1UaGlzIGZpbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgSUpHIEpQRUcgc29mdHdhcmU7Ci10aGF0IGlzLCB0aGUgZnVuY3Rpb25zIG9mIHRoZSB2YXJpb3VzIG1vZHVsZXMgaW4gdGhlIHN5c3RlbSBhbmQgdGhlIGludGVyZmFjZXMKLWJldHdlZW4gbW9kdWxlcy4gIEZvciBtb3JlIHByZWNpc2UgZGV0YWlscyBhYm91dCBhbnkgZGF0YSBzdHJ1Y3R1cmUgb3IgY2FsbGluZwotY29udmVudGlvbiwgc2VlIHRoZSBpbmNsdWRlIGZpbGVzIGFuZCBjb21tZW50cyBpbiB0aGUgc291cmNlIGNvZGUuCi0KLVdlIGFzc3VtZSB0aGF0IHRoZSByZWFkZXIgaXMgYWxyZWFkeSBzb21ld2hhdCBmYW1pbGlhciB3aXRoIHRoZSBKUEVHIHN0YW5kYXJkLgotVGhlIFJFQURNRSBmaWxlIGluY2x1ZGVzIHJlZmVyZW5jZXMgZm9yIGxlYXJuaW5nIGFib3V0IEpQRUcuICBUaGUgZmlsZQotbGlianBlZy5kb2MgZGVzY3JpYmVzIHRoZSBsaWJyYXJ5IGZyb20gdGhlIHZpZXdwb2ludCBvZiBhbiBhcHBsaWNhdGlvbgotcHJvZ3JhbW1lciB1c2luZyB0aGUgbGlicmFyeTsgaXQncyBiZXN0IHRvIHJlYWQgdGhhdCBmaWxlIGJlZm9yZSB0aGlzIG9uZS4KLUFsc28sIHRoZSBmaWxlIGNvZGVydWxlcy5kb2MgZGVzY3JpYmVzIHRoZSBjb2Rpbmcgc3R5bGUgY29udmVudGlvbnMgd2UgdXNlLgotCi1JbiB0aGlzIGRvY3VtZW50LCBKUEVHLXNwZWNpZmljIHRlcm1pbm9sb2d5IGZvbGxvd3MgdGhlIEpQRUcgc3RhbmRhcmQ6Ci0gIEEgImNvbXBvbmVudCIgbWVhbnMgYSBjb2xvciBjaGFubmVsLCBlLmcuLCBSZWQgb3IgTHVtaW5hbmNlLgotICBBICJzYW1wbGUiIGlzIGEgc2luZ2xlIGNvbXBvbmVudCB2YWx1ZSAoaS5lLiwgb25lIG51bWJlciBpbiB0aGUgaW1hZ2UgZGF0YSkuCi0gIEEgImNvZWZmaWNpZW50IiBpcyBhIGZyZXF1ZW5jeSBjb2VmZmljaWVudCAoYSBEQ1QgdHJhbnNmb3JtIG91dHB1dCBudW1iZXIpLgotICBBICJibG9jayIgaXMgYW4gOHg4IGdyb3VwIG9mIHNhbXBsZXMgb3IgY29lZmZpY2llbnRzLgotICBBbiAiTUNVIiAobWluaW11bSBjb2RlZCB1bml0KSBpcyBhbiBpbnRlcmxlYXZlZCBzZXQgb2YgYmxvY2tzIG9mIHNpemUKLQlkZXRlcm1pbmVkIGJ5IHRoZSBzYW1wbGluZyBmYWN0b3JzLCBvciBhIHNpbmdsZSBibG9jayBpbiBhCi0Jbm9uaW50ZXJsZWF2ZWQgc2Nhbi4KLVdlIGRvIG5vdCB1c2UgdGhlIHRlcm1zICJwaXhlbCIgYW5kICJzYW1wbGUiIGludGVyY2hhbmdlYWJseS4gIFdoZW4gd2Ugc2F5Ci1waXhlbCwgd2UgbWVhbiBhbiBlbGVtZW50IG9mIHRoZSBmdWxsLXNpemUgaW1hZ2UsIHdoaWxlIGEgc2FtcGxlIGlzIGFuIGVsZW1lbnQKLW9mIHRoZSBkb3duc2FtcGxlZCBpbWFnZS4gIFRodXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIG1heSB2YXJ5IGFjcm9zcwotY29tcG9uZW50cyB3aGlsZSB0aGUgbnVtYmVyIG9mIHBpeGVscyBkb2VzIG5vdC4gIChUaGlzIHRlcm1pbm9sb2d5IGlzIG5vdCB1c2VkCi1yaWdvcm91c2x5IHRocm91Z2hvdXQgdGhlIGNvZGUsIGJ1dCBpdCBpcyB1c2VkIGluIHBsYWNlcyB3aGVyZSBjb25mdXNpb24gd291bGQKLW90aGVyd2lzZSByZXN1bHQuKQotCi0KLSoqKiBTeXN0ZW0gZmVhdHVyZXMgKioqCi0KLVRoZSBJSkcgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIHR3byBwYXJ0czoKLSAgKiBBIHN1YnJvdXRpbmUgbGlicmFyeSBmb3IgSlBFRyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KLSAgKiBjanBlZy9kanBlZywgdHdvIHNhbXBsZSBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlIGxpYnJhcnkgdG8gdHJhbnNmb3JtCi0gICAgSkZJRiBKUEVHIGZpbGVzIHRvIGFuZCBmcm9tIHNldmVyYWwgb3RoZXIgaW1hZ2UgZm9ybWF0cy4KLWNqcGVnL2RqcGVnIGFyZSBvZiBubyBncmVhdCBpbnRlbGxlY3R1YWwgY29tcGxleGl0eTogdGhleSBtZXJlbHkgYWRkIGEgc2ltcGxlCi1jb21tYW5kLWxpbmUgdXNlciBpbnRlcmZhY2UgYW5kIEkvTyByb3V0aW5lcyBmb3Igc2V2ZXJhbCB1bmNvbXByZXNzZWQgaW1hZ2UKLWZvcm1hdHMuICBUaGlzIGRvY3VtZW50IGNvbmNlbnRyYXRlcyBvbiB0aGUgbGlicmFyeSBpdHNlbGYuCi0KLVdlIGRlc2lyZSB0aGUgbGlicmFyeSB0byBiZSBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgYWxsIEpQRUcgYmFzZWxpbmUsIGV4dGVuZGVkCi1zZXF1ZW50aWFsLCBhbmQgcHJvZ3Jlc3NpdmUgRENUIHByb2Nlc3Nlcy4gIEhpZXJhcmNoaWNhbCBwcm9jZXNzZXMgYXJlIG5vdAotc3VwcG9ydGVkLgotCi1UaGUgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBsb3NzbGVzcyAoc3BhdGlhbCkgSlBFRyBwcm9jZXNzLiAgTG9zc2xlc3MKLUpQRUcgc2hhcmVzIGxpdHRsZSBvciBubyBjb2RlIHdpdGggbG9zc3kgSlBFRywgYW5kIHdvdWxkIG5vcm1hbGx5IGJlIHVzZWQKLXdpdGhvdXQgdGhlIGV4dGVuc2l2ZSBwcmUtIGFuZCBwb3N0LXByb2Nlc3NpbmcgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5LgotV2UgZmVlbCB0aGF0IGxvc3NsZXNzIEpQRUcgaXMgYmV0dGVyIGhhbmRsZWQgYnkgYSBzZXBhcmF0ZSBsaWJyYXJ5LgotCi1XaXRoaW4gdGhlc2UgbGltaXRzLCBhbnkgc2V0IG9mIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYWxsb3dlZCBieSB0aGUgSlBFRwotc3BlYyBzaG91bGQgYmUgcmVhZGFibGUgZm9yIGRlY29tcHJlc3Npb24uICAoV2UgY2FuIGJlIG1vcmUgcmVzdHJpY3RpdmUgYWJvdXQKLXdoYXQgZm9ybWF0cyB3ZSBjYW4gZ2VuZXJhdGUuKSAgQWx0aG91Z2ggdGhlIHN5c3RlbSBkZXNpZ24gYWxsb3dzIGZvciBhbGwKLXBhcmFtZXRlciB2YWx1ZXMsIHNvbWUgdW5jb21tb24gc2V0dGluZ3MgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgYW5kIG1heQotbmV2ZXIgYmU7IG5vbmludGVncmFsIHNhbXBsaW5nIHJhdGlvcyBhcmUgdGhlIHByaW1lIGV4YW1wbGUuICBGdXJ0aGVybW9yZSwKLXdlIHRyZWF0IDgtYml0IHZzLiAxMi1iaXQgZGF0YSBwcmVjaXNpb24gYXMgYSBjb21waWxlLXRpbWUgc3dpdGNoLCBub3QgYQotcnVuLXRpbWUgb3B0aW9uLCBiZWNhdXNlIG1vc3QgbWFjaGluZXMgY2FuIHN0b3JlIDgtYml0IHBpeGVscyBtdWNoIG1vcmUKLWNvbXBhY3RseSB0aGFuIDEyLWJpdC4KLQotRm9yIGxlZ2FsIHJlYXNvbnMsIEpQRUcgYXJpdGhtZXRpYyBjb2RpbmcgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQsIGJ1dAotZXh0ZW5kaW5nIHRoZSBsaWJyYXJ5IHRvIGluY2x1ZGUgaXQgd291bGQgYmUgc3RyYWlnaHRmb3J3YXJkLgotCi1CeSBpdHNlbGYsIHRoZSBsaWJyYXJ5IGhhbmRsZXMgb25seSBpbnRlcmNoYW5nZSBKUEVHIGRhdGFzdHJlYW1zIC0tLSBpbgotcGFydGljdWxhciB0aGUgd2lkZWx5IHVzZWQgSkZJRiBmaWxlIGZvcm1hdC4gIFRoZSBsaWJyYXJ5IGNhbiBiZSB1c2VkIGJ5Ci1zdXJyb3VuZGluZyBjb2RlIHRvIHByb2Nlc3MgaW50ZXJjaGFuZ2Ugb3IgYWJicmV2aWF0ZWQgSlBFRyBkYXRhc3RyZWFtcyB0aGF0Ci1hcmUgZW1iZWRkZWQgaW4gbW9yZSBjb21wbGV4IGZpbGUgZm9ybWF0cy4gIChGb3IgZXhhbXBsZSwgbGlidGlmZiB1c2VzIHRoaXMKLWxpYnJhcnkgdG8gaW1wbGVtZW50IEpQRUcgY29tcHJlc3Npb24gd2l0aGluIHRoZSBUSUZGIGZpbGUgZm9ybWF0LikKLQotVGhlIGxpYnJhcnkgaW5jbHVkZXMgYSBzdWJzdGFudGlhbCBhbW91bnQgb2YgY29kZSB0aGF0IGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZQotSlBFRyBzdGFuZGFyZCBidXQgaXMgbmVjZXNzYXJ5IGZvciB0eXBpY2FsIGFwcGxpY2F0aW9ucyBvZiBKUEVHLiAgVGhlc2UKLWZ1bmN0aW9ucyBwcmVwcm9jZXNzIHRoZSBpbWFnZSBiZWZvcmUgSlBFRyBjb21wcmVzc2lvbiBvciBwb3N0cHJvY2VzcyBpdCBhZnRlcgotZGVjb21wcmVzc2lvbi4gIFRoZXkgaW5jbHVkZSBjb2xvcnNwYWNlIGNvbnZlcnNpb24sIGRvd25zYW1wbGluZy91cHNhbXBsaW5nLAotYW5kIGNvbG9yIHF1YW50aXphdGlvbi4gIFRoaXMgY29kZSBjYW4gYmUgb21pdHRlZCBpZiBub3QgbmVlZGVkLgotCi1BIHdpZGUgcmFuZ2Ugb2YgcXVhbGl0eSB2cy4gc3BlZWQgdHJhZGVvZmZzIGFyZSBwb3NzaWJsZSBpbiBKUEVHIHByb2Nlc3NpbmcsCi1hbmQgZXZlbiBtb3JlIHNvIGluIGRlY29tcHJlc3Npb24gcG9zdHByb2Nlc3NpbmcuICBUaGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5Ci1wcm92aWRlcyBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjb3ZlciBtb3N0IG9mIHRoZSB1c2VmdWwgdHJhZGVvZmZzLAotcmFuZ2luZyBmcm9tIHZlcnktaGlnaC1xdWFsaXR5IGRvd24gdG8gZmFzdC1wcmV2aWV3IG9wZXJhdGlvbi4gIE9uIHRoZQotY29tcHJlc3Npb24gc2lkZSB3ZSBoYXZlIGdlbmVyYWxseSBub3QgcHJvdmlkZWQgbG93LXF1YWxpdHkgY2hvaWNlcywgc2luY2UKLWNvbXByZXNzaW9uIGlzIG5vcm1hbGx5IGxlc3MgdGltZS1jcml0aWNhbC4gIEl0IHNob3VsZCBiZSB1bmRlcnN0b29kIHRoYXQgdGhlCi1sb3ctcXVhbGl0eSBtb2RlcyBtYXkgbm90IG1lZXQgdGhlIEpQRUcgc3RhbmRhcmQncyBhY2N1cmFjeSByZXF1aXJlbWVudHM7Ci1ub25ldGhlbGVzcywgdGhleSBhcmUgdXNlZnVsIGZvciB2aWV3ZXJzLgotCi0KLSoqKiBQb3J0YWJpbGl0eSBpc3N1ZXMgKioqCi0KLVBvcnRhYmlsaXR5IGlzIGFuIGVzc2VudGlhbCByZXF1aXJlbWVudCBmb3IgdGhlIGxpYnJhcnkuICBUaGUga2V5IHBvcnRhYmlsaXR5Ci1pc3N1ZXMgdGhhdCBzaG93IHVwIGF0IHRoZSBsZXZlbCBvZiBzeXN0ZW0gYXJjaGl0ZWN0dXJlIGFyZToKLQotMS4gIE1lbW9yeSB1c2FnZS4gIFdlIHdhbnQgdGhlIGNvZGUgdG8gYmUgYWJsZSB0byBydW4gb24gUEMtY2xhc3MgbWFjaGluZXMKLXdpdGggbGltaXRlZCBtZW1vcnkuICBJbWFnZXMgc2hvdWxkIHRoZXJlZm9yZSBiZSBwcm9jZXNzZWQgc2VxdWVudGlhbGx5IChpbgotc3RyaXBzKSwgdG8gYXZvaWQgaG9sZGluZyB0aGUgd2hvbGUgaW1hZ2UgaW4gbWVtb3J5IGF0IG9uY2UuICBXaGVyZSBhCi1mdWxsLWltYWdlIGJ1ZmZlciBpcyBuZWNlc3NhcnksIHdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBlaXRoZXIgdmlydHVhbCBtZW1vcnkKLW9yIHRlbXBvcmFyeSBmaWxlcy4KLQotMi4gIE5lYXIvZmFyIHBvaW50ZXIgZGlzdGluY3Rpb24uICBUbyBydW4gZWZmaWNpZW50bHkgb24gODB4ODYgbWFjaGluZXMsIHRoZQotY29kZSBzaG91bGQgZGlzdGluZ3Vpc2ggInNtYWxsIiBvYmplY3RzIChrZXB0IGluIG5lYXIgZGF0YSBzcGFjZSkgZnJvbQotImxhcmdlIiBvbmVzIChrZXB0IGluIGZhciBkYXRhIHNwYWNlKS4gIFRoaXMgaXMgYW4gYW5ub3lpbmcgcmVzdHJpY3Rpb24sIGJ1dAotZm9ydHVuYXRlbHkgaXQgZG9lcyBub3QgaW1wYWN0IGNvZGUgcXVhbGl0eSBmb3IgbGVzcyBicmFpbi1kYW1hZ2VkIG1hY2hpbmVzLAotYW5kIHRoZSBzb3VyY2UgY29kZSBjbHV0dGVyIHR1cm5zIG91dCB0byBiZSBtaW5pbWFsIHdpdGggc3VmZmljaWVudCB1c2Ugb2YKLXBvaW50ZXIgdHlwZWRlZnMuCi0KLTMuIERhdGEgcHJlY2lzaW9uLiAgV2UgYXNzdW1lIHRoYXQgImNoYXIiIGlzIGF0IGxlYXN0IDggYml0cywgInNob3J0IiBhbmQKLSJpbnQiIGF0IGxlYXN0IDE2LCAibG9uZyIgYXQgbGVhc3QgMzIuICBUaGUgY29kZSB3aWxsIHdvcmsgZmluZSB3aXRoIGxhcmdlcgotZGF0YSBzaXplcywgYWx0aG91Z2ggbWVtb3J5IG1heSBiZSB1c2VkIGluZWZmaWNpZW50bHkgaW4gc29tZSBjYXNlcy4gIEhvd2V2ZXIsCi10aGUgSlBFRyBjb21wcmVzc2VkIGRhdGFzdHJlYW0gbXVzdCB1bHRpbWF0ZWx5IGFwcGVhciBvbiBleHRlcm5hbCBzdG9yYWdlIGFzIGEKLXNlcXVlbmNlIG9mIDgtYml0IGJ5dGVzIGlmIGl0IGlzIHRvIGNvbmZvcm0gdG8gdGhlIHN0YW5kYXJkLiAgVGhpcyBtYXkgcG9zZSBhCi1wcm9ibGVtIG9uIG1hY2hpbmVzIHdoZXJlIGNoYXIgaXMgd2lkZXIgdGhhbiA4IGJpdHMuICBUaGUgbGlicmFyeSByZXByZXNlbnRzCi1jb21wcmVzc2VkIGRhdGEgYXMgYW4gYXJyYXkgb2YgdmFsdWVzIG9mIHR5cGVkZWYgSk9DVEVULiAgSWYgbm8gZGF0YSB0eXBlCi1leGFjdGx5IDggYml0cyB3aWRlIGlzIGF2YWlsYWJsZSwgY3VzdG9tIGRhdGEgc291cmNlIGFuZCBkYXRhIGRlc3RpbmF0aW9uCi1tb2R1bGVzIG11c3QgYmUgd3JpdHRlbiB0byB1bnBhY2sgYW5kIHBhY2sgdGhlIGNob3NlbiBKT0NURVQgZGF0YXR5cGUgaW50bwotOC1iaXQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24uCi0KLQotKioqIFN5c3RlbSBvdmVydmlldyAqKioKLQotVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBhcmUgZWFjaCBkaXZpZGVkIGludG8gdHdvIG1haW4gc2VjdGlvbnM6Ci10aGUgSlBFRyBjb21wcmVzc29yIG9yIGRlY29tcHJlc3NvciBwcm9wZXIsIGFuZCB0aGUgcHJlcHJvY2Vzc2luZyBvcgotcG9zdHByb2Nlc3NpbmcgZnVuY3Rpb25zLiAgVGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZXNlIHR3byBzZWN0aW9ucyBpcyB0aGUKLWltYWdlIGRhdGEgdGhhdCB0aGUgb2ZmaWNpYWwgSlBFRyBzcGVjIHJlZ2FyZHMgYXMgaXRzIGlucHV0IG9yIG91dHB1dDogdGhpcwotZGF0YSBpcyBpbiB0aGUgY29sb3JzcGFjZSB0byBiZSB1c2VkIGZvciBjb21wcmVzc2lvbiwgYW5kIGl0IGlzIGRvd25zYW1wbGVkCi10byB0aGUgc2FtcGxpbmcgZmFjdG9ycyB0byBiZSB1c2VkLiAgVGhlIHByZXByb2Nlc3NpbmcgYW5kIHBvc3Rwcm9jZXNzaW5nCi1zdGVwcyBhcmUgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgYSBub3JtYWwgaW1hZ2UgcmVwcmVzZW50YXRpb24gdG8gb3IgZnJvbQotdGhpcyBmb3JtLiAgKFRob3NlIGZldyBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIGRlYWwgd2l0aCBZQ2JDciBkb3duc2FtcGxlZAotZGF0YSBjYW4gc2tpcCB0aGUgcHJlcHJvY2Vzc2luZyBvciBwb3N0cHJvY2Vzc2luZyBzdGVwLikKLQotTG9va2luZyBtb3JlIGNsb3NlbHksIHRoZSBjb21wcmVzc29yIGxpYnJhcnkgY29udGFpbnMgdGhlIGZvbGxvd2luZyBtYWluCi1lbGVtZW50czoKLQotICBQcmVwcm9jZXNzaW5nOgotICAgICogQ29sb3Igc3BhY2UgY29udmVyc2lvbiAoZS5nLiwgUkdCIHRvIFlDYkNyKS4KLSAgICAqIEVkZ2UgZXhwYW5zaW9uIGFuZCBkb3duc2FtcGxpbmcuICBPcHRpb25hbGx5LCB0aGlzIHN0ZXAgY2FuIGRvIHNpbXBsZQotICAgICAgc21vb3RoaW5nIC0tLSB0aGlzIGlzIG9mdGVuIGhlbHBmdWwgZm9yIGxvdy1xdWFsaXR5IHNvdXJjZSBkYXRhLgotICBKUEVHIHByb3BlcjoKLSAgICAqIE1DVSBhc3NlbWJseSwgRENULCBxdWFudGl6YXRpb24uCi0gICAgKiBFbnRyb3B5IGNvZGluZyAoc2VxdWVudGlhbCBvciBwcm9ncmVzc2l2ZSwgSHVmZm1hbiBvciBhcml0aG1ldGljKS4KLQotSW4gYWRkaXRpb24gdG8gdGhlc2UgbW9kdWxlcyB3ZSBuZWVkIG92ZXJhbGwgY29udHJvbCwgbWFya2VyIGdlbmVyYXRpb24sCi1hbmQgc3VwcG9ydCBjb2RlIChtZW1vcnkgbWFuYWdlbWVudCAmIGVycm9yIGhhbmRsaW5nKS4gIFRoZXJlIGlzIGFsc28gYQotbW9kdWxlIHJlc3BvbnNpYmxlIGZvciBwaHlzaWNhbGx5IHdyaXRpbmcgdGhlIG91dHB1dCBkYXRhIC0tLSB0eXBpY2FsbHkKLXRoaXMgaXMganVzdCBhbiBpbnRlcmZhY2UgdG8gZndyaXRlKCksIGJ1dCBzb21lIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0bwotZG8gc29tZXRoaW5nIGVsc2Ugd2l0aCB0aGUgZGF0YS4KLQotVGhlIGRlY29tcHJlc3NvciBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbWFpbiBlbGVtZW50czoKLQotICBKUEVHIHByb3BlcjoKLSAgICAqIEVudHJvcHkgZGVjb2RpbmcgKHNlcXVlbnRpYWwgb3IgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYykuCi0gICAgKiBEZXF1YW50aXphdGlvbiwgaW52ZXJzZSBEQ1QsIE1DVSBkaXNhc3NlbWJseS4KLSAgUG9zdHByb2Nlc3Npbmc6Ci0gICAgKiBVcHNhbXBsaW5nLiAgT3B0aW9uYWxseSwgdGhpcyBzdGVwIG1heSBiZSBhYmxlIHRvIGRvIG1vcmUgZ2VuZXJhbAotICAgICAgcmVzY2FsaW5nIG9mIHRoZSBpbWFnZS4KLSAgICAqIENvbG9yIHNwYWNlIGNvbnZlcnNpb24gKGUuZy4sIFlDYkNyIHRvIFJHQikuICBUaGlzIHN0ZXAgbWF5IGFsc28KLSAgICAgIHByb3ZpZGUgZ2FtbWEgYWRqdXN0bWVudCBbIGN1cnJlbnRseSBpdCBkb2VzIG5vdCBdLgotICAgICogT3B0aW9uYWwgY29sb3IgcXVhbnRpemF0aW9uIChlLmcuLCByZWR1Y3Rpb24gdG8gMjU2IGNvbG9ycykuCi0gICAgKiBPcHRpb25hbCBjb2xvciBwcmVjaXNpb24gcmVkdWN0aW9uIChlLmcuLCAyNC1iaXQgdG8gMTUtYml0IGNvbG9yKS4KLSAgICAgIFtUaGlzIGZlYXR1cmUgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC5dCi0KLVdlIGFsc28gbmVlZCBvdmVyYWxsIGNvbnRyb2wsIG1hcmtlciBwYXJzaW5nLCBhbmQgYSBkYXRhIHNvdXJjZSBtb2R1bGUuCi1UaGUgc3VwcG9ydCBjb2RlIChtZW1vcnkgbWFuYWdlbWVudCAmIGVycm9yIGhhbmRsaW5nKSBjYW4gYmUgc2hhcmVkIHdpdGgKLXRoZSBjb21wcmVzc2lvbiBoYWxmIG9mIHRoZSBsaWJyYXJ5LgotCi1UaGVyZSBtYXkgYmUgc2V2ZXJhbCBpbXBsZW1lbnRhdGlvbnMgb2YgZWFjaCBvZiB0aGVzZSBlbGVtZW50cywgcGFydGljdWxhcmx5Ci1pbiB0aGUgZGVjb21wcmVzc29yLCB3aGVyZSBhIHdpZGUgcmFuZ2Ugb2Ygc3BlZWQvcXVhbGl0eSB0cmFkZW9mZnMgaXMgdmVyeQotdXNlZnVsLiAgSXQgbXVzdCBiZSB1bmRlcnN0b29kIHRoYXQgc29tZSBvZiB0aGUgYmVzdCBzcGVlZHVwcyBpbnZvbHZlCi1tZXJnaW5nIGFkamFjZW50IHN0ZXBzIGluIHRoZSBwaXBlbGluZS4gIEZvciBleGFtcGxlLCB1cHNhbXBsaW5nLCBjb2xvciBzcGFjZQotY29udmVyc2lvbiwgYW5kIGNvbG9yIHF1YW50aXphdGlvbiBtaWdodCBhbGwgYmUgZG9uZSBhdCBvbmNlIHdoZW4gdXNpbmcgYQotbG93LXF1YWxpdHkgb3JkZXJlZC1kaXRoZXIgdGVjaG5pcXVlLiAgVGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgaXMgZGVzaWduZWQgdG8KLWFsbG93IHN1Y2ggbWVyZ2luZyB3aGVyZSBhcHByb3ByaWF0ZS4KLQotCi1Ob3RlOiBpdCBpcyBjb252ZW5pZW50IHRvIHJlZ2FyZCBlZGdlIGV4cGFuc2lvbiAocGFkZGluZyB0byBibG9jayBib3VuZGFyaWVzKQotYXMgYSBwcmVwcm9jZXNzaW5nL3Bvc3Rwcm9jZXNzaW5nIGZ1bmN0aW9uLCBldmVuIHRob3VnaCB0aGUgSlBFRyBzcGVjIGluY2x1ZGVzCi1pdCBpbiBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLiAgV2UgZG8gdGhpcyBiZWNhdXNlIGRvd25zYW1wbGluZy91cHNhbXBsaW5nCi1jYW4gYmUgc2ltcGxpZmllZCBhIGxpdHRsZSBpZiB0aGV5IHdvcmsgb24gcGFkZGVkIGRhdGE6IGl0J3Mgbm90IG5lY2Vzc2FyeSB0bwotaGF2ZSBzcGVjaWFsIGNhc2VzIGF0IHRoZSByaWdodCBhbmQgYm90dG9tIGVkZ2VzLiAgVGhlcmVmb3JlIHRoZSBpbnRlcmZhY2UKLWJ1ZmZlciBpcyBhbHdheXMgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIGJsb2NrcyB3aWRlIGFuZCBoaWdoLCBhbmQgd2UgZXhwZWN0Ci1jb21wcmVzc2lvbiBwcmVwcm9jZXNzaW5nIHRvIHBhZCB0aGUgc291cmNlIGRhdGEgcHJvcGVybHkuICBQYWRkaW5nIHdpbGwgb2NjdXIKLW9ubHkgdG8gdGhlIG5leHQgYmxvY2sgKDgtc2FtcGxlKSBib3VuZGFyeS4gIEluIGFuIGludGVybGVhdmVkLXNjYW4gc2l0dWF0aW9uLAotYWRkaXRpb25hbCBkdW1teSBibG9ja3MgbWF5IGJlIHVzZWQgdG8gZmlsbCBvdXQgTUNVcywgYnV0IHRoZSBNQ1UgYXNzZW1ibHkgYW5kCi1kaXNhc3NlbWJseSBsb2dpYyB3aWxsIGNyZWF0ZSBvciBkaXNjYXJkIHRoZXNlIGJsb2NrcyBpbnRlcm5hbGx5LiAgKFRoaXMgaXMKLWFkdmFudGFnZW91cyBmb3Igc3BlZWQgcmVhc29ucywgc2luY2Ugd2UgYXZvaWQgRENUaW5nIHRoZSBkdW1teSBibG9ja3MuCi1JdCBhbHNvIHBlcm1pdHMgYSBzbWFsbCByZWR1Y3Rpb24gaW4gZmlsZSBzaXplLCBiZWNhdXNlIHRoZSBjb21wcmVzc29yIGNhbgotY2hvb3NlIGR1bW15IGJsb2NrIGNvbnRlbnRzIHNvIGFzIHRvIG1pbmltaXplIHRoZWlyIHNpemUgaW4gY29tcHJlc3NlZCBmb3JtLgotRmluYWxseSwgaXQgbWFrZXMgdGhlIGludGVyZmFjZSBidWZmZXIgc3BlY2lmaWNhdGlvbiBpbmRlcGVuZGVudCBvZiB3aGV0aGVyCi10aGUgZmlsZSBpcyBhY3R1YWxseSBpbnRlcmxlYXZlZCBvciBub3QuKSAgQXBwbGljYXRpb25zIHRoYXQgd2lzaCB0byBkZWFsCi1kaXJlY3RseSB3aXRoIHRoZSBkb3duc2FtcGxlZCBkYXRhIG11c3QgcHJvdmlkZSBzaW1pbGFyIGJ1ZmZlcmluZyBhbmQgcGFkZGluZwotZm9yIG9kZC1zaXplZCBpbWFnZXMuCi0KLQotKioqIFBvb3IgbWFuJ3Mgb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nICoqKgotCi1JdCBzaG91bGQgYmUgY2xlYXIgYnkgbm93IHRoYXQgd2UgaGF2ZSBhIGxvdCBvZiBxdWFzaS1pbmRlcGVuZGVudCBwcm9jZXNzaW5nCi1zdGVwcywgbWFueSBvZiB3aGljaCBoYXZlIHNldmVyYWwgcG9zc2libGUgYmVoYXZpb3JzLiAgVG8gYXZvaWQgY2x1dHRlcmluZyB0aGUKLWNvZGUgd2l0aCBsb3RzIG9mIHN3aXRjaCBzdGF0ZW1lbnRzLCB3ZSB1c2UgYSBzaW1wbGUgZm9ybSBvZiBvYmplY3Qtc3R5bGUKLXByb2dyYW1taW5nIHRvIHNlcGFyYXRlIG91dCB0aGUgZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMuCi0KLUZvciBleGFtcGxlLCB0d28gZGlmZmVyZW50IGNvbG9yIHF1YW50aXphdGlvbiBhbGdvcml0aG1zIGNvdWxkIGJlIGltcGxlbWVudGVkCi1hcyB0d28gc2VwYXJhdGUgbW9kdWxlcyB0aGF0IHByZXNlbnQgdGhlIHNhbWUgZXh0ZXJuYWwgaW50ZXJmYWNlOyBhdCBydW50aW1lLAotdGhlIGNhbGxpbmcgY29kZSB3aWxsIGFjY2VzcyB0aGUgcHJvcGVyIG1vZHVsZSBpbmRpcmVjdGx5IHRocm91Z2ggYW4gIm9iamVjdCIuCi0KLVdlIGNhbiBnZXQgdGhlIGxpbWl0ZWQgZmVhdHVyZXMgd2UgbmVlZCB3aGlsZSBzdGF5aW5nIHdpdGhpbiBwb3J0YWJsZSBDLgotVGhlIGJhc2ljIHRvb2wgaXMgYSBmdW5jdGlvbiBwb2ludGVyLiAgQW4gIm9iamVjdCIgaXMganVzdCBhIHN0cnVjdAotY29udGFpbmluZyBvbmUgb3IgbW9yZSBmdW5jdGlvbiBwb2ludGVyIGZpZWxkcywgZWFjaCBvZiB3aGljaCBjb3JyZXNwb25kcyB0bwotYSBtZXRob2QgbmFtZSBpbiByZWFsIG9iamVjdC1vcmllbnRlZCBsYW5ndWFnZXMuICBEdXJpbmcgaW5pdGlhbGl6YXRpb24gd2UKLWZpbGwgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHdpdGggcmVmZXJlbmNlcyB0byB3aGljaGV2ZXIgbW9kdWxlIHdlIGhhdmUKLWRldGVybWluZWQgd2UgbmVlZCB0byB1c2UgaW4gdGhpcyBydW4uICBUaGVuIGludm9jYXRpb24gb2YgdGhlIG1vZHVsZSBpcyBkb25lCi1ieSBpbmRpcmVjdGluZyB0aHJvdWdoIGEgZnVuY3Rpb24gcG9pbnRlcjsgb24gbW9zdCBtYWNoaW5lcyB0aGlzIGlzIG5vIG1vcmUKLWV4cGVuc2l2ZSB0aGFuIGEgc3dpdGNoIHN0YXRlbWVudCwgd2hpY2ggd291bGQgYmUgdGhlIG9ubHkgb3RoZXIgd2F5IG9mCi1tYWtpbmcgdGhlIHJlcXVpcmVkIHJ1bi10aW1lIGNob2ljZS4gIFRoZSByZWFsbHkgc2lnbmlmaWNhbnQgYmVuZWZpdCwgb2YKLWNvdXJzZSwgaXMga2VlcGluZyB0aGUgc291cmNlIGNvZGUgY2xlYW4gYW5kIHdlbGwgc3RydWN0dXJlZC4KLQotV2UgY2FuIGFsc28gYXJyYW5nZSB0byBoYXZlIHByaXZhdGUgc3RvcmFnZSB0aGF0IHZhcmllcyBiZXR3ZWVuIGRpZmZlcmVudAotaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzYW1lIGtpbmQgb2Ygb2JqZWN0LiAgV2UgZG8gdGhpcyBieSBtYWtpbmcgYWxsIHRoZQotbW9kdWxlLXNwZWNpZmljIG9iamVjdCBzdHJ1Y3RzIGJlIHNlcGFyYXRlbHkgYWxsb2NhdGVkIGVudGl0aWVzLCB3aGljaCB3aWxsCi1iZSBhY2Nlc3NlZCB2aWEgcG9pbnRlcnMgaW4gdGhlIG1hc3RlciBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIHN0cnVjdC4KLVRoZSAicHVibGljIiBmaWVsZHMgb3IgbWV0aG9kcyBmb3IgYSBnaXZlbiBraW5kIG9mIG9iamVjdCBhcmUgc3BlY2lmaWVkIGJ5Ci1hIGNvbW1vbmx5IGtub3duIHN0cnVjdC4gIEJ1dCBhIG1vZHVsZSdzIGluaXRpYWxpemF0aW9uIGNvZGUgY2FuIGFsbG9jYXRlCi1hIGxhcmdlciBzdHJ1Y3QgdGhhdCBjb250YWlucyB0aGUgY29tbW9uIHN0cnVjdCBhcyBpdHMgZmlyc3QgbWVtYmVyLCBwbHVzCi1hZGRpdGlvbmFsIHByaXZhdGUgZmllbGRzLiAgV2l0aCBhcHByb3ByaWF0ZSBwb2ludGVyIGNhc3RpbmcsIHRoZSBtb2R1bGUncwotaW50ZXJuYWwgZnVuY3Rpb25zIGNhbiBhY2Nlc3MgdGhlc2UgcHJpdmF0ZSBmaWVsZHMuICAoRm9yIGEgc2ltcGxlIGV4YW1wbGUsCi1zZWUgamRhdGFkc3QuYywgd2hpY2ggaW1wbGVtZW50cyB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlIHNwZWNpZmllZCBieSBzdHJ1Y3QKLWpwZWdfZGVzdGluYXRpb25fbWdyLCBidXQgYWRkcyBleHRyYSBmaWVsZHMuKQotCi0oT2YgY291cnNlIHRoaXMgd291bGQgYWxsIGJlIGEgbG90IGVhc2llciBpZiB3ZSB3ZXJlIHVzaW5nIEMrKywgYnV0IHdlIGFyZQotbm90IHlldCBwcmVwYXJlZCB0byBhc3N1bWUgdGhhdCBldmVyeW9uZSBoYXMgYSBDKysgY29tcGlsZXIuKQotCi1BbiBpbXBvcnRhbnQgYmVuZWZpdCBvZiB0aGlzIHNjaGVtZSBpcyB0aGF0IGl0IGlzIGVhc3kgdG8gcHJvdmlkZSBtdWx0aXBsZQotdmVyc2lvbnMgb2YgYW55IG1ldGhvZCwgZWFjaCB0dW5lZCB0byBhIHBhcnRpY3VsYXIgY2FzZS4gIFdoaWxlIGEgbG90IG9mCi1wcmVjYWxjdWxhdGlvbiBtaWdodCBiZSBkb25lIHRvIHNlbGVjdCBhbiBvcHRpbWFsIGltcGxlbWVudGF0aW9uIG9mIGEgbWV0aG9kLAotdGhlIGNvc3QgcGVyIGludm9jYXRpb24gaXMgY29uc3RhbnQuICBGb3IgZXhhbXBsZSwgdGhlIHVwc2FtcGxpbmcgc3RlcCBtaWdodAotaGF2ZSBhICJnZW5lcmljIiBtZXRob2QsIHBsdXMgb25lIG9yIG1vcmUgImhhcmR3aXJlZCIgbWV0aG9kcyBmb3IgdGhlIG1vc3QKLXBvcHVsYXIgc2FtcGxpbmcgZmFjdG9yczsgdGhlIGhhcmR3aXJlZCBtZXRob2RzIHdvdWxkIGJlIGZhc3RlciBiZWNhdXNlIHRoZXknZAotdXNlIHN0cmFpZ2h0LWxpbmUgY29kZSBpbnN0ZWFkIG9mIGZvci1sb29wcy4gIFRoZSBjb3N0IHRvIGRldGVybWluZSB3aGljaAotbWV0aG9kIHRvIHVzZSBpcyBwYWlkIG9ubHkgb25jZSwgYXQgc3RhcnR1cCwgYW5kIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgYXJlCi1oaWRkZW4gZnJvbSB0aGUgY2FsbGVycyBvZiB0aGUgbWV0aG9kLgotCi1UaGlzIHBsYW4gZGlmZmVycyBhIGxpdHRsZSBiaXQgZnJvbSB1c3VhbCBvYmplY3Qtb3JpZW50ZWQgc3RydWN0dXJlcywgaW4gdGhhdAotb25seSBvbmUgaW5zdGFuY2Ugb2YgZWFjaCBvYmplY3QgY2xhc3Mgd2lsbCBleGlzdCBkdXJpbmcgZXhlY3V0aW9uLiAgVGhlCi1yZWFzb24gZm9yIGhhdmluZyB0aGUgY2xhc3Mgc3RydWN0dXJlIGlzIHRoYXQgb24gZGlmZmVyZW50IHJ1bnMgd2UgbWF5IGNyZWF0ZQotZGlmZmVyZW50IGluc3RhbmNlcyAoY2hvb3NlIHRvIGV4ZWN1dGUgZGlmZmVyZW50IG1vZHVsZXMpLiAgWW91IGNhbiB0aGluayBvZgotdGhlIHRlcm0gIm1ldGhvZCIgYXMgZGVub3RpbmcgdGhlIGNvbW1vbiBpbnRlcmZhY2UgcHJlc2VudGVkIGJ5IGEgcGFydGljdWxhcgotc2V0IG9mIGludGVyY2hhbmdlYWJsZSBmdW5jdGlvbnMsIGFuZCAib2JqZWN0IiBhcyBkZW5vdGluZyBhIGdyb3VwIG9mIHJlbGF0ZWQKLW1ldGhvZHMsIG9yIHRoZSB0b3RhbCBzaGFyZWQgaW50ZXJmYWNlIGJlaGF2aW9yIG9mIGEgZ3JvdXAgb2YgbW9kdWxlcy4KLQotCi0qKiogT3ZlcmFsbCBjb250cm9sIHN0cnVjdHVyZSAqKioKLQotV2UgcHJldmlvdXNseSBtZW50aW9uZWQgdGhlIG5lZWQgZm9yIG92ZXJhbGwgY29udHJvbCBsb2dpYyBpbiB0aGUgY29tcHJlc3Npb24KLWFuZCBkZWNvbXByZXNzaW9uIGxpYnJhcmllcy4gIEluIElKRyBpbXBsZW1lbnRhdGlvbnMgcHJpb3IgdG8gdjUsIG92ZXJhbGwKLWNvbnRyb2wgd2FzIG1vc3RseSBwcm92aWRlZCBieSAicGlwZWxpbmUgY29udHJvbCIgbW9kdWxlcywgd2hpY2ggcHJvdmVkIHRvIGJlCi1sYXJnZSwgdW53aWVsZHksIGFuZCBoYXJkIHRvIHVuZGVyc3RhbmQuICBUbyBpbXByb3ZlIHRoZSBzaXR1YXRpb24sIHRoZQotY29udHJvbCBsb2dpYyBoYXMgYmVlbiBzdWJkaXZpZGVkIGludG8gbXVsdGlwbGUgbW9kdWxlcy4gIFRoZSBjb250cm9sIG1vZHVsZXMKLWNvbnNpc3Qgb2Y6Ci0KLTEuIE1hc3RlciBjb250cm9sIGZvciBtb2R1bGUgc2VsZWN0aW9uIGFuZCBpbml0aWFsaXphdGlvbi4gIFRoaXMgaGFzIHR3bwotcmVzcG9uc2liaWxpdGllczoKLQotICAgMUEuICBTdGFydHVwIGluaXRpYWxpemF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgaW1hZ2UgcHJvY2Vzc2luZy4KLSAgICAgICAgVGhlIGluZGl2aWR1YWwgcHJvY2Vzc2luZyBtb2R1bGVzIHRvIGJlIHVzZWQgaW4gdGhpcyBydW4gYXJlIHNlbGVjdGVkCi0gICAgICAgIGFuZCBnaXZlbiBpbml0aWFsaXphdGlvbiBjYWxscy4KLQotICAgMUIuICBQZXItcGFzcyBjb250cm9sLiAgVGhpcyBkZXRlcm1pbmVzIGhvdyBtYW55IHBhc3NlcyB3aWxsIGJlIHBlcmZvcm1lZAotICAgICAgICBhbmQgY2FsbHMgZWFjaCBhY3RpdmUgcHJvY2Vzc2luZyBtb2R1bGUgdG8gY29uZmlndXJlIGl0c2VsZgotICAgICAgICBhcHByb3ByaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwYXNzLiAgRW5kLW9mLXBhc3MgcHJvY2Vzc2luZywKLQl3aGVyZSBuZWNlc3NhcnksIGlzIGFsc28gaW52b2tlZCBmcm9tIHRoZSBtYXN0ZXIgY29udHJvbCBtb2R1bGUuCi0KLSAgIE1ldGhvZCBzZWxlY3Rpb24gaXMgcGFydGlhbGx5IGRpc3RyaWJ1dGVkLCBpbiB0aGF0IGEgcGFydGljdWxhciBwcm9jZXNzaW5nCi0gICBtb2R1bGUgbWF5IGNvbnRhaW4gc2V2ZXJhbCBwb3NzaWJsZSBpbXBsZW1lbnRhdGlvbnMgb2YgYSBwYXJ0aWN1bGFyIG1ldGhvZCwKLSAgIHdoaWNoIGl0IHdpbGwgc2VsZWN0IGFtb25nIHdoZW4gZ2l2ZW4gaXRzIGluaXRpYWxpemF0aW9uIGNhbGwuICBUaGUgbWFzdGVyCi0gICBjb250cm9sIGNvZGUgbmVlZCBvbmx5IGJlIGNvbmNlcm5lZCB3aXRoIGRlY2lzaW9ucyB0aGF0IGFmZmVjdCBtb3JlIHRoYW4KLSAgIG9uZSBtb2R1bGUuCi0gCi0yLiBEYXRhIGJ1ZmZlcmluZyBjb250cm9sLiAgQSBzZXBhcmF0ZSBjb250cm9sIG1vZHVsZSBleGlzdHMgZm9yIGVhY2gKLSAgIGludGVyLXByb2Nlc3Npbmctc3RlcCBkYXRhIGJ1ZmZlci4gIFRoaXMgbW9kdWxlIGlzIHJlc3BvbnNpYmxlIGZvcgotICAgaW52b2tpbmcgdGhlIHByb2Nlc3Npbmcgc3RlcHMgdGhhdCB3cml0ZSBvciByZWFkIHRoYXQgZGF0YSBidWZmZXIuCi0KLUVhY2ggYnVmZmVyIGNvbnRyb2xsZXIgc2VlcyB0aGUgd29ybGQgYXMgZm9sbG93czoKLQotaW5wdXQgZGF0YSA9PiBwcm9jZXNzaW5nIHN0ZXAgQSA9PiBidWZmZXIgPT4gcHJvY2Vzc2luZyBzdGVwIEIgPT4gb3V0cHV0IGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gY29udHJvbGxlciAtLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGNvbnRyb2xsZXIga25vd3MgdGhlIGRhdGFmbG93IHJlcXVpcmVtZW50cyBvZiBzdGVwcyBBIGFuZCBCOiBob3cgbXVjaCBkYXRhCi10aGV5IHdhbnQgdG8gYWNjZXB0IGluIG9uZSBjaHVuayBhbmQgaG93IG11Y2ggdGhleSBvdXRwdXQgaW4gb25lIGNodW5rLiAgSXRzCi1mdW5jdGlvbiBpcyB0byBtYW5hZ2UgaXRzIGJ1ZmZlciBhbmQgY2FsbCBBIGFuZCBCIGF0IHRoZSBwcm9wZXIgdGltZXMuCi0KLUEgZGF0YSBidWZmZXIgY29udHJvbCBtb2R1bGUgbWF5IGl0c2VsZiBiZSB2aWV3ZWQgYXMgYSBwcm9jZXNzaW5nIHN0ZXAgYnkgYQotaGlnaGVyLWxldmVsIGNvbnRyb2wgbW9kdWxlOyB0aHVzIHRoZSBjb250cm9sIG1vZHVsZXMgZm9ybSBhIGJpbmFyeSB0cmVlIHdpdGgKLWVsZW1lbnRhcnkgcHJvY2Vzc2luZyBzdGVwcyBhdCB0aGUgbGVhdmVzIG9mIHRoZSB0cmVlLgotCi1UaGUgY29udHJvbCBtb2R1bGVzIGFyZSBvYmplY3RzLiAgQSBjb25zaWRlcmFibGUgYW1vdW50IG9mIGZsZXhpYmlsaXR5IGNhbgotYmUgaGFkIGJ5IHJlcGxhY2luZyBpbXBsZW1lbnRhdGlvbnMgb2YgYSBjb250cm9sIG1vZHVsZS4gIEZvciBleGFtcGxlOgotKiBNZXJnaW5nIG9mIGFkamFjZW50IHN0ZXBzIGluIHRoZSBwaXBlbGluZSBpcyBkb25lIGJ5IHJlcGxhY2luZyBhIGNvbnRyb2wKLSAgbW9kdWxlIGFuZCBpdHMgcGFpciBvZiBwcm9jZXNzaW5nLXN0ZXAgbW9kdWxlcyB3aXRoIGEgc2luZ2xlIHByb2Nlc3NpbmctCi0gIHN0ZXAgbW9kdWxlLiAgKEhlbmNlIHRoZSBwb3NzaWJsZSBtZXJnZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIHRyZWUgb2YKLSAgY29udHJvbCBtb2R1bGVzLikKLSogSW4gc29tZSBwcm9jZXNzaW5nIG1vZGVzLCBhIGdpdmVuIGludGVyc3RlcCBidWZmZXIgbmVlZCBvbmx5IGJlIGEgInN0cmlwIgotICBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGFjY29tbW9kYXRlIHRoZSBkZXNpcmVkIGRhdGEgY2h1bmsgc2l6ZXMuICBJbiBvdGhlcgotICBtb2RlcywgYSBmdWxsLWltYWdlIGJ1ZmZlciBpcyBuZWVkZWQgYW5kIHNldmVyYWwgcGFzc2VzIGFyZSByZXF1aXJlZC4KLSAgVGhlIGNvbnRyb2wgbW9kdWxlIGRldGVybWluZXMgd2hpY2gga2luZCBvZiBidWZmZXIgaXMgdXNlZCBhbmQgbWFuaXB1bGF0ZXMKLSAgdmlydHVhbCBhcnJheSBidWZmZXJzIGFzIG5lZWRlZC4gIE9uZSBvciBib3RoIHByb2Nlc3Npbmcgc3RlcHMgbWF5IGJlCi0gIHVuYXdhcmUgb2YgdGhlIG11bHRpLXBhc3MgYmVoYXZpb3IuCi0KLUluIHRoZW9yeSwgd2UgbWlnaHQgYmUgYWJsZSB0byBtYWtlIGFsbCBvZiB0aGUgZGF0YSBidWZmZXIgY29udHJvbGxlcnMKLWludGVyY2hhbmdlYWJsZSBhbmQgcHJvdmlkZSBqdXN0IG9uZSBzZXQgb2YgaW1wbGVtZW50YXRpb25zIGZvciBhbGwuICBJbgotcHJhY3RpY2UsIGVhY2ggb25lIGNvbnRhaW5zIGNvbnNpZGVyYWJsZSBzcGVjaWFsLWNhc2UgcHJvY2Vzc2luZyBmb3IgaXRzCi1wYXJ0aWN1bGFyIGpvYi4gIFRoZSBidWZmZXIgY29udHJvbGxlciBjb25jZXB0IHNob3VsZCBiZSByZWdhcmRlZCBhcyBhbgotb3ZlcmFsbCBzeXN0ZW0gc3RydWN0dXJpbmcgcHJpbmNpcGxlLCBub3QgYXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUKLXRhc2sgcGVyZm9ybWVkIGJ5IGFueSBvbmUgY29udHJvbGxlci4KLQotCi0qKiogQ29tcHJlc3Npb24gb2JqZWN0IHN0cnVjdHVyZSAqKioKLQotSGVyZSBpcyBhIHNrZXRjaCBvZiB0aGUgbG9naWNhbCBzdHJ1Y3R1cmUgb2YgdGhlIEpQRUcgY29tcHJlc3Npb24gbGlicmFyeToKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBDb2xvcnNwYWNlIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgIHwtLSBQcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIgLS18Ci0gICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIERvd25zYW1wbGluZwotTWFpbiBjb250cm9sbGVyIC0tfAotICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gRm9yd2FyZCBEQ1QsIHF1YW50aXplCi0gICAgICAgICAgICAgICAgICB8LS0gQ29lZmZpY2llbnQgY29udHJvbGxlciAtLXwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIEVudHJvcHkgZW5jb2RpbmcKLQotVGhpcyBza2V0Y2ggYWxzbyBkZXNjcmliZXMgdGhlIGZsb3cgb2YgY29udHJvbCAoc3Vicm91dGluZSBjYWxscykgZHVyaW5nCi10eXBpY2FsIGltYWdlIGRhdGEgcHJvY2Vzc2luZy4gIEVhY2ggb2YgdGhlIGNvbXBvbmVudHMgc2hvd24gaW4gdGhlIGRpYWdyYW0gaXMKLWFuICJvYmplY3QiIHdoaWNoIG1heSBoYXZlIHNldmVyYWwgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBhdmFpbGFibGUuICBPbmUKLW9yIG1vcmUgc291cmNlIGNvZGUgZmlsZXMgY29udGFpbiB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uKHMpIG9mIGVhY2ggb2JqZWN0LgotCi1UaGUgb2JqZWN0cyBzaG93biBhYm92ZSBhcmU6Ci0KLSogTWFpbiBjb250cm9sbGVyOiBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIHN1YnNhbXBsZWQtZGF0YSBidWZmZXIsIHdoaWNoCi0gIGhvbGRzIHRoZSBwcmVwcm9jZXNzZWQgaW5wdXQgZGF0YS4gIFRoaXMgY29udHJvbGxlciBpbnZva2VzIHByZXByb2Nlc3NpbmcgdG8KLSAgZmlsbCB0aGUgc3Vic2FtcGxlZC1kYXRhIGJ1ZmZlciwgYW5kIEpQRUcgY29tcHJlc3Npb24gdG8gZW1wdHkgaXQuICBUaGVyZSBpcwotICB1c3VhbGx5IG5vIG5lZWQgZm9yIGEgZnVsbC1pbWFnZSBidWZmZXIgaGVyZTsgYSBzdHJpcCBidWZmZXIgaXMgYWRlcXVhdGUuCi0KLSogUHJlcHJvY2Vzc2luZyBjb250cm9sbGVyOiBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIGRvd25zYW1wbGluZyBpbnB1dCBkYXRhCi0gIGJ1ZmZlciwgd2hpY2ggbGllcyBiZXR3ZWVuIGNvbG9yc3BhY2UgY29udmVyc2lvbiBhbmQgZG93bnNhbXBsaW5nLiAgTm90ZQotICB0aGF0IGEgdW5pZmllZCBjb252ZXJzaW9uL2Rvd25zYW1wbGluZyBtb2R1bGUgd291bGQgcHJvYmFibHkgcmVwbGFjZSB0aGlzCi0gIGNvbnRyb2xsZXIgZW50aXJlbHkuCi0KLSogQ29sb3JzcGFjZSBjb252ZXJzaW9uOiBjb252ZXJ0cyBhcHBsaWNhdGlvbiBpbWFnZSBkYXRhIGludG8gdGhlIGRlc2lyZWQKLSAgSlBFRyBjb2xvciBzcGFjZTsgYWxzbyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gcGl4ZWwtaW50ZXJsZWF2ZWQgbGF5b3V0IHRvCi0gIHNlcGFyYXRlIGNvbXBvbmVudCBwbGFuZXMuICBQcm9jZXNzZXMgb25lIHBpeGVsIHJvdyBhdCBhIHRpbWUuCi0KLSogRG93bnNhbXBsaW5nOiBwZXJmb3JtcyByZWR1Y3Rpb24gb2YgY2hyb21hIGNvbXBvbmVudHMgYXMgcmVxdWlyZWQuCi0gIE9wdGlvbmFsbHkgbWF5IHBlcmZvcm0gcGl4ZWwtbGV2ZWwgc21vb3RoaW5nIGFzIHdlbGwuICBQcm9jZXNzZXMgYSAicm93Ci0gIGdyb3VwIiBhdCBhIHRpbWUsIHdoZXJlIGEgcm93IGdyb3VwIGlzIGRlZmluZWQgYXMgVm1heCBwaXhlbCByb3dzIG9mIGVhY2gKLSAgY29tcG9uZW50IGJlZm9yZSBkb3duc2FtcGxpbmcsIGFuZCBWayBzYW1wbGUgcm93cyBhZnRlcndhcmRzIChyZW1lbWJlciBWawotICBkaWZmZXJzIGFjcm9zcyBjb21wb25lbnRzKS4gIFNvbWUgZG93bnNhbXBsaW5nIG9yIHNtb290aGluZyBhbGdvcml0aG1zIG1heQotICByZXF1aXJlIGNvbnRleHQgcm93cyBhYm92ZSBhbmQgYmVsb3cgdGhlIGN1cnJlbnQgcm93IGdyb3VwOyB0aGUKLSAgcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzdXBwbHlpbmcgdGhlc2Ugcm93cyB2aWEgcHJvcGVyCi0gIGJ1ZmZlcmluZy4gIFRoZSBkb3duc2FtcGxlciBpcyByZXNwb25zaWJsZSBmb3IgZWRnZSBleHBhbnNpb24gYXQgdGhlIHJpZ2h0Ci0gIGVkZ2UgKGkuZS4sIGV4dGVuZGluZyBlYWNoIHNhbXBsZSByb3cgdG8gYSBtdWx0aXBsZSBvZiA4IHNhbXBsZXMpOyBidXQgdGhlCi0gIHByZXByb2Nlc3NpbmcgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3IgdmVydGljYWwgZWRnZSBleHBhbnNpb24gKGkuZS4sCi0gIGR1cGxpY2F0aW5nIHRoZSBib3R0b20gc2FtcGxlIHJvdyBhcyBuZWVkZWQgdG8gbWFrZSBhIG11bHRpcGxlIG9mIDggcm93cykuCi0KLSogQ29lZmZpY2llbnQgY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBEQ1QtY29lZmZpY2llbnQgZGF0YS4KLSAgVGhpcyBjb250cm9sbGVyIGhhbmRsZXMgTUNVIGFzc2VtYmx5LCBpbmNsdWRpbmcgaW5zZXJ0aW9uIG9mIGR1bW15IERDVAotICBibG9ja3Mgd2hlbiBuZWVkZWQgYXQgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlLiAgV2hlbiBwZXJmb3JtaW5nCi0gIEh1ZmZtYW4tY29kZSBvcHRpbWl6YXRpb24gb3IgZW1pdHRpbmcgYSBtdWx0aXNjYW4gSlBFRyBmaWxlLCB0aGlzCi0gIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIGJ1ZmZlcmluZyB0aGUgZnVsbCBpbWFnZS4gIFRoZSBlcXVpdmFsZW50IG9mCi0gIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93IG9mIHN1YnNhbXBsZWQgZGF0YSBpcyBwcm9jZXNzZWQgcGVyIGNhbGwsCi0gIGV2ZW4gd2hlbiB0aGUgSlBFRyBmaWxlIGlzIG5vbmludGVybGVhdmVkLgotCi0qIEZvcndhcmQgRENUIGFuZCBxdWFudGl6YXRpb246IFBlcmZvcm0gRENULCBxdWFudGl6ZSwgYW5kIGVtaXQgY29lZmZpY2llbnRzLgotICBXb3JrcyBvbiBvbmUgb3IgbW9yZSBEQ1QgYmxvY2tzIGF0IGEgdGltZS4gIChOb3RlOiB0aGUgY29lZmZpY2llbnRzIGFyZSBub3cKLSAgZW1pdHRlZCBpbiBub3JtYWwgYXJyYXkgb3JkZXIsIHdoaWNoIHRoZSBlbnRyb3B5IGVuY29kZXIgaXMgZXhwZWN0ZWQgdG8KLSAgY29udmVydCB0byB6aWd6YWcgb3JkZXIgYXMgbmVjZXNzYXJ5LiAgUHJpb3IgdmVyc2lvbnMgb2YgdGhlIElKRyBjb2RlIGRpZAotICB0aGUgY29udmVyc2lvbiB0byB6aWd6YWcgb3JkZXIgd2l0aGluIHRoZSBxdWFudGl6YXRpb24gc3RlcC4pCi0KLSogRW50cm9weSBlbmNvZGluZzogUGVyZm9ybSBIdWZmbWFuIG9yIGFyaXRobWV0aWMgZW50cm9weSBjb2RpbmcgYW5kIGVtaXQgdGhlCi0gIGNvZGVkIGRhdGEgdG8gdGhlIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlLiAgV29ya3Mgb24gb25lIE1DVSBwZXIgY2FsbC4KLSAgRm9yIHByb2dyZXNzaXZlIEpQRUcsIHRoZSBzYW1lIERDVCBibG9ja3MgYXJlIGZlZCB0byB0aGUgZW50cm9weSBjb2RlcgotICBkdXJpbmcgZWFjaCBwYXNzLCBhbmQgdGhlIGNvZGVyIG11c3QgZW1pdCB0aGUgYXBwcm9wcmlhdGUgc3Vic2V0IG9mCi0gIGNvZWZmaWNpZW50cy4KLQotSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIG9iamVjdHMsIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGluY2x1ZGVzIHRoZXNlCi1vYmplY3RzOgotCi0qIE1hc3RlciBjb250cm9sOiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcGFzc2VzIHJlcXVpcmVkLCBjb250cm9scyBvdmVyYWxsCi0gIGFuZCBwZXItcGFzcyBpbml0aWFsaXphdGlvbiBvZiB0aGUgb3RoZXIgbW9kdWxlcy4KLQotKiBNYXJrZXIgd3JpdGluZzogZ2VuZXJhdGVzIEpQRUcgbWFya2VycyAoZXhjZXB0IGZvciBSU1RuLCB3aGljaCBpcyBlbWl0dGVkCi0gIGJ5IHRoZSBlbnRyb3B5IGVuY29kZXIgd2hlbiBuZWVkZWQpLgotCi0qIERhdGEgZGVzdGluYXRpb24gbWFuYWdlcjogd3JpdGVzIHRoZSBvdXRwdXQgSlBFRyBkYXRhc3RyZWFtIHRvIGl0cyBmaW5hbAotICBkZXN0aW5hdGlvbiAoZS5nLiwgYSBmaWxlKS4gIFRoZSBkZXN0aW5hdGlvbiBtYW5hZ2VyIHN1cHBsaWVkIHdpdGggdGhlCi0gIGxpYnJhcnkga25vd3MgaG93IHRvIHdyaXRlIHRvIGEgc3RkaW8gc3RyZWFtOyBmb3Igb3RoZXIgYmVoYXZpb3JzLCB0aGUKLSAgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IHByb3ZpZGUgaXRzIG93biBkZXN0aW5hdGlvbiBtYW5hZ2VyLgotCi0qIE1lbW9yeSBtYW5hZ2VyOiBhbGxvY2F0ZXMgYW5kIHJlbGVhc2VzIG1lbW9yeSwgY29udHJvbHMgdmlydHVhbCBhcnJheXMKLSAgKHdpdGggYmFja2luZyBzdG9yZSBtYW5hZ2VtZW50LCB3aGVyZSByZXF1aXJlZCkuCi0KLSogRXJyb3IgaGFuZGxlcjogcGVyZm9ybXMgZm9ybWF0dGluZyBhbmQgb3V0cHV0IG9mIGVycm9yIGFuZCB0cmFjZSBtZXNzYWdlczsKLSAgZGV0ZXJtaW5lcyBoYW5kbGluZyBvZiBub25mYXRhbCBlcnJvcnMuICBUaGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5Ci0gIG92ZXJyaWRlIHNvbWUgb3IgYWxsIG9mIHRoaXMgb2JqZWN0J3MgbWV0aG9kcyB0byBjaGFuZ2UgZXJyb3IgaGFuZGxpbmcuCi0KLSogUHJvZ3Jlc3MgbW9uaXRvcjogc3VwcG9ydHMgb3V0cHV0IG9mICJwZXJjZW50LWRvbmUiIHByb2dyZXNzIHJlcG9ydHMuCi0gIFRoaXMgb2JqZWN0IHJlcHJlc2VudHMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uOgotICBpZiB3YW50ZWQsIGl0IG11c3QgYmUgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotCi1UaGUgZXJyb3IgaGFuZGxlciwgZGVzdGluYXRpb24gbWFuYWdlciwgYW5kIHByb2dyZXNzIG1vbml0b3Igb2JqZWN0cyBhcmUKLWRlZmluZWQgYXMgc2VwYXJhdGUgb2JqZWN0cyBpbiBvcmRlciB0byBzaW1wbGlmeSBhcHBsaWNhdGlvbi1zcGVjaWZpYwotY3VzdG9taXphdGlvbiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgQSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBtYXkgb3ZlcnJpZGUKLWluZGl2aWR1YWwgbWV0aG9kcyBvciBzdXBwbHkgaXRzIG93biBhbGwtbmV3IGltcGxlbWVudGF0aW9uIG9mIG9uZSBvZiB0aGVzZQotb2JqZWN0cy4gIFRoZSBvYmplY3QgaW50ZXJmYWNlcyBmb3IgdGhlc2Ugb2JqZWN0cyBhcmUgdGhlcmVmb3JlIHRyZWF0ZWQgYXMKLXBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIGludGVyZmFjZSBvZiB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgb3RoZXIgb2JqZWN0cwotYXJlIGludGVybmFsIHRvIHRoZSBsaWJyYXJ5LgotCi1UaGUgZXJyb3IgaGFuZGxlciBhbmQgbWVtb3J5IG1hbmFnZXIgYXJlIHNoYXJlZCBieSBKUEVHIGNvbXByZXNzaW9uIGFuZAotZGVjb21wcmVzc2lvbjsgdGhlIHByb2dyZXNzIG1vbml0b3IsIGlmIHVzZWQsIG1heSBiZSBzaGFyZWQgYXMgd2VsbC4KLQotCi0qKiogRGVjb21wcmVzc2lvbiBvYmplY3Qgc3RydWN0dXJlICoqKgotCi1IZXJlIGlzIGEgc2tldGNoIG9mIHRoZSBsb2dpY2FsIHN0cnVjdHVyZSBvZiB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIGxpYnJhcnk6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIEVudHJvcHkgZGVjb2RpbmcKLSAgICAgICAgICAgICAgICAgIHwtLSBDb2VmZmljaWVudCBjb250cm9sbGVyIC0tfAotICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gRGVxdWFudGl6ZSwgSW52ZXJzZSBEQ1QKLU1haW4gY29udHJvbGxlciAtLXwKLSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIFVwc2FtcGxpbmcKLSAgICAgICAgICAgICAgICAgIHwtLSBQb3N0cHJvY2Vzc2luZyBjb250cm9sbGVyIC0tfCAgIHwtLSBDb2xvcnNwYWNlIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIENvbG9yIHF1YW50aXphdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gQ29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbgotCi1BcyBiZWZvcmUsIHRoaXMgZGlhZ3JhbSBhbHNvIHJlcHJlc2VudHMgdHlwaWNhbCBjb250cm9sIGZsb3cuICBUaGUgb2JqZWN0cwotc2hvd24gYXJlOgotCi0qIE1haW4gY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBzdWJzYW1wbGVkLWRhdGEgYnVmZmVyLCB3aGljaAotICBob2xkcyB0aGUgb3V0cHV0IG9mIEpQRUcgZGVjb21wcmVzc2lvbiBwcm9wZXIuICBUaGlzIGNvbnRyb2xsZXIncyBwcmltYXJ5Ci0gIHRhc2sgaXMgdG8gZmVlZCB0aGUgcG9zdHByb2Nlc3NpbmcgcHJvY2VkdXJlLiAgU29tZSB1cHNhbXBsaW5nIGFsZ29yaXRobXMKLSAgbWF5IHJlcXVpcmUgY29udGV4dCByb3dzIGFib3ZlIGFuZCBiZWxvdyB0aGUgY3VycmVudCByb3cgZ3JvdXA7IHdoZW4gdGhpcwotICBpcyB0cnVlLCB0aGUgbWFpbiBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBpdHMgYnVmZmVyIHNvIGFzCi0gIHRvIG1ha2UgY29udGV4dCByb3dzIGF2YWlsYWJsZS4gIEluIHRoZSBjdXJyZW50IGRlc2lnbiwgdGhlIG1haW4gYnVmZmVyIGlzCi0gIGFsd2F5cyBhIHN0cmlwIGJ1ZmZlcjsgYSBmdWxsLWltYWdlIGJ1ZmZlciBpcyBuZXZlciByZXF1aXJlZC4KLQotKiBDb2VmZmljaWVudCBjb250cm9sbGVyOiBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIERDVC1jb2VmZmljaWVudCBkYXRhLgotICBUaGlzIGNvbnRyb2xsZXIgaGFuZGxlcyBNQ1UgZGlzYXNzZW1ibHksIGluY2x1ZGluZyBkZWxldGlvbiBvZiBhbnkgZHVtbXkKLSAgRENUIGJsb2NrcyBhdCB0aGUgcmlnaHQgb3IgYm90dG9tIGVkZ2UuICBXaGVuIHJlYWRpbmcgYSBtdWx0aXNjYW4gSlBFRwotICBmaWxlLCB0aGlzIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIGJ1ZmZlcmluZyB0aGUgZnVsbCBpbWFnZS4KLSAgKEJ1ZmZlcmluZyBEQ1QgY29lZmZpY2llbnRzLCByYXRoZXIgdGhhbiBzYW1wbGVzLCBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydAotICBwcm9ncmVzc2l2ZSBKUEVHLikgIFRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93IG9mCi0gIHN1YnNhbXBsZWQgZGF0YSBpcyBwcm9jZXNzZWQgcGVyIGNhbGwsIGV2ZW4gd2hlbiB0aGUgc291cmNlIEpQRUcgZmlsZSBpcwotICBub25pbnRlcmxlYXZlZC4KLQotKiBFbnRyb3B5IGRlY29kaW5nOiBSZWFkIGNvZGVkIGRhdGEgZnJvbSB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlIGFuZCBwZXJmb3JtCi0gIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBlbnRyb3B5IGRlY29kaW5nLiAgV29ya3Mgb24gb25lIE1DVSBwZXIgY2FsbC4KLSAgRm9yIHByb2dyZXNzaXZlIEpQRUcgZGVjb2RpbmcsIHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIHN1cHBsaWVzIHRoZSBwcmlvcgotICBjb2VmZmljaWVudHMgb2YgZWFjaCBNQ1UgKGluaXRpYWxseSBhbGwgemVyb2VzKSwgd2hpY2ggdGhlIGVudHJvcHkgZGVjb2RlcgotICBtb2RpZmllcyBpbiBlYWNoIHNjYW4uCi0KLSogRGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUOiBsaWtlIGl0IHNheXMuICBOb3RlIHRoYXQgdGhlIGNvZWZmaWNpZW50cwotICBidWZmZXJlZCBieSB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBoYXZlIE5PVCBiZWVuIGRlcXVhbnRpemVkOyB3ZQotICBtZXJnZSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1QgaW50byBhIHNpbmdsZSBzdGVwIGZvciBzcGVlZCByZWFzb25zLgotICBXaGVuIHNjYWxlZC1kb3duIG91dHB1dCBpcyBhc2tlZCBmb3IsIHNpbXBsaWZpZWQgRENUIGFsZ29yaXRobXMgbWF5IGJlIHVzZWQKLSAgdGhhdCBlbWl0IG9ubHkgMXgxLCAyeDIsIG9yIDR4NCBzYW1wbGVzIHBlciBEQ1QgYmxvY2ssIG5vdCB0aGUgZnVsbCA4eDguCi0gIFdvcmtzIG9uIG9uZSBEQ1QgYmxvY2sgYXQgYSB0aW1lLgotCi0qIFBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgY29sb3IgcXVhbnRpemF0aW9uCi0gIGlucHV0IGJ1ZmZlciwgd2hlbiBxdWFudGl6YXRpb24gaXMgaW4gdXNlLiAgKFdpdGhvdXQgcXVhbnRpemF0aW9uLCB0aGlzCi0gIGNvbnRyb2xsZXIganVzdCBjYWxscyB0aGUgdXBzYW1wbGVyLikgIEZvciB0d28tcGFzcyBxdWFudGl6YXRpb24sIHRoaXMKLSAgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYnVmZmVyaW5nIHRoZSBmdWxsLWltYWdlIGRhdGEuCi0KLSogVXBzYW1wbGluZzogcmVzdG9yZXMgY2hyb21hIGNvbXBvbmVudHMgdG8gZnVsbCBzaXplLiAgKE1heSBzdXBwb3J0IG1vcmUKLSAgZ2VuZXJhbCBvdXRwdXQgcmVzY2FsaW5nLCB0b28uICBOb3RlIHRoYXQgaWYgdW5kZXJzaXplZCBEQ1Qgb3V0cHV0cyBoYXZlCi0gIGJlZW4gZW1pdHRlZCBieSB0aGUgRENUIG1vZHVsZSwgdGhpcyBtb2R1bGUgbXVzdCBhZGp1c3Qgc28gdGhhdCBwcm9wZXJseQotICBzaXplZCBvdXRwdXRzIGFyZSBjcmVhdGVkLikgIFdvcmtzIG9uIG9uZSByb3cgZ3JvdXAgYXQgYSB0aW1lLiAgVGhpcyBtb2R1bGUKLSAgYWxzbyBjYWxscyB0aGUgY29sb3IgY29udmVyc2lvbiBtb2R1bGUsIHNvIGl0cyB0b3AgbGV2ZWwgaXMgZWZmZWN0aXZlbHkgYQotICBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIHVwc2FtcGxpbmctPmNvbG9yIGNvbnZlcnNpb24gYnVmZmVyLiAgSG93ZXZlciwgaW4KLSAgYWxsIGJ1dCB0aGUgaGlnaGVzdC1xdWFsaXR5IG9wZXJhdGluZyBtb2RlcywgdXBzYW1wbGluZyBhbmQgY29sb3IKLSAgY29udmVyc2lvbiBhcmUgbGlrZWx5IHRvIGJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHN0ZXAuCi0KLSogQ29sb3JzcGFjZSBjb252ZXJzaW9uOiBjb252ZXJ0IGZyb20gSlBFRyBjb2xvciBzcGFjZSB0byBvdXRwdXQgY29sb3Igc3BhY2UsCi0gIGFuZCBjaGFuZ2UgZGF0YSBsYXlvdXQgZnJvbSBzZXBhcmF0ZSBjb21wb25lbnQgcGxhbmVzIHRvIHBpeGVsLWludGVybGVhdmVkLgotICBXb3JrcyBvbiBvbmUgcGl4ZWwgcm93IGF0IGEgdGltZS4KLQotKiBDb2xvciBxdWFudGl6YXRpb246IHJlZHVjZSB0aGUgZGF0YSB0byBjb2xvcm1hcHBlZCBmb3JtLCB1c2luZyBlaXRoZXIgYW4KLSAgZXh0ZXJuYWxseSBzcGVjaWZpZWQgY29sb3JtYXAgb3IgYW4gaW50ZXJuYWxseSBnZW5lcmF0ZWQgb25lLiAgVGhpcyBtb2R1bGUKLSAgaXMgbm90IHVzZWQgZm9yIGZ1bGwtY29sb3Igb3V0cHV0LiAgV29ya3Mgb24gb25lIHBpeGVsIHJvdyBhdCBhIHRpbWU7IG1heQotICByZXF1aXJlIHR3byBwYXNzZXMgdG8gZ2VuZXJhdGUgYSBjb2xvciBtYXAuICBOb3RlIHRoYXQgdGhlIG91dHB1dCB3aWxsCi0gIGFsd2F5cyBiZSBhIHNpbmdsZSBjb21wb25lbnQgcmVwcmVzZW50aW5nIGNvbG9ybWFwIGluZGV4ZXMuICBJbiB0aGUgY3VycmVudAotICBkZXNpZ24sIHRoZSBvdXRwdXQgdmFsdWVzIGFyZSBKU0FNUExFcywgc28gYW4gOC1iaXQgY29tcGlsYXRpb24gY2Fubm90Ci0gIHF1YW50aXplIHRvIG1vcmUgdGhhbiAyNTYgY29sb3JzLiAgVGhpcyBpcyB1bmxpa2VseSB0byBiZSBhIHByb2JsZW0gaW4KLSAgcHJhY3RpY2UuCi0KLSogQ29sb3IgcmVkdWN0aW9uOiB0aGlzIG1vZHVsZSBoYW5kbGVzIGNvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24sIGUuZy4sCi0gIGdlbmVyYXRpbmcgMTUtYml0IGNvbG9yICg1IGJpdHMvcHJpbWFyeSkgZnJvbSBKUEVHJ3MgMjQtYml0IG91dHB1dC4KLSAgTm90IHF1aXRlIGNsZWFyIHlldCBob3cgdGhpcyBzaG91bGQgYmUgaGFuZGxlZC4uLiBzaG91bGQgd2UgbWVyZ2UgaXQgd2l0aAotICBjb2xvcnNwYWNlIGNvbnZlcnNpb24/Pz8KLQotTm90ZSB0aGF0IHNvbWUgaGlnaC1zcGVlZCBvcGVyYXRpbmcgbW9kZXMgbWlnaHQgY29uZGVuc2UgdGhlIGVudGlyZQotcG9zdHByb2Nlc3Npbmcgc2VxdWVuY2UgdG8gYSBzaW5nbGUgbW9kdWxlICh1cHNhbXBsZSwgY29sb3IgY29udmVydCwgYW5kCi1xdWFudGl6ZSBpbiBvbmUgc3RlcCkuCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBvYmplY3RzLCB0aGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IGluY2x1ZGVzIHRoZXNlCi1vYmplY3RzOgotCi0qIE1hc3RlciBjb250cm9sOiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcGFzc2VzIHJlcXVpcmVkLCBjb250cm9scyBvdmVyYWxsCi0gIGFuZCBwZXItcGFzcyBpbml0aWFsaXphdGlvbiBvZiB0aGUgb3RoZXIgbW9kdWxlcy4gIFRoaXMgaXMgc3ViZGl2aWRlZCBpbnRvCi0gIGlucHV0IGFuZCBvdXRwdXQgY29udHJvbDogamRpbnB1dC5jIGNvbnRyb2xzIG9ubHkgaW5wdXQtc2lkZSBwcm9jZXNzaW5nLAotICB3aGlsZSBqZG1hc3Rlci5jIGhhbmRsZXMgb3ZlcmFsbCBpbml0aWFsaXphdGlvbiBhbmQgb3V0cHV0LXNpZGUgY29udHJvbC4KLQotKiBNYXJrZXIgcmVhZGluZzogZGVjb2RlcyBKUEVHIG1hcmtlcnMgKGV4Y2VwdCBmb3IgUlNUbikuCi0KLSogRGF0YSBzb3VyY2UgbWFuYWdlcjogc3VwcGxpZXMgdGhlIGlucHV0IEpQRUcgZGF0YXN0cmVhbS4gIFRoZSBzb3VyY2UKLSAgbWFuYWdlciBzdXBwbGllZCB3aXRoIHRoZSBsaWJyYXJ5IGtub3dzIGhvdyB0byByZWFkIGZyb20gYSBzdGRpbyBzdHJlYW07Ci0gIGZvciBvdGhlciBiZWhhdmlvcnMsIHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBtYXkgcHJvdmlkZSBpdHMgb3duIHNvdXJjZQotICBtYW5hZ2VyLgotCi0qIE1lbW9yeSBtYW5hZ2VyOiBzYW1lIGFzIGZvciBjb21wcmVzc2lvbiBsaWJyYXJ5LgotCi0qIEVycm9yIGhhbmRsZXI6IHNhbWUgYXMgZm9yIGNvbXByZXNzaW9uIGxpYnJhcnkuCi0KLSogUHJvZ3Jlc3MgbW9uaXRvcjogc2FtZSBhcyBmb3IgY29tcHJlc3Npb24gbGlicmFyeS4KLQotQXMgd2l0aCBjb21wcmVzc2lvbiwgdGhlIGRhdGEgc291cmNlIG1hbmFnZXIsIGVycm9yIGhhbmRsZXIsIGFuZCBwcm9ncmVzcwotbW9uaXRvciBhcmUgY2FuZGlkYXRlcyBmb3IgcmVwbGFjZW1lbnQgYnkgYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KLQotCi0qKiogRGVjb21wcmVzc2lvbiBpbnB1dCBhbmQgb3V0cHV0IHNlcGFyYXRpb24gKioqCi0KLVRvIHN1cHBvcnQgZWZmaWNpZW50IGluY3JlbWVudGFsIGRpc3BsYXkgb2YgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcywgdGhlCi1kZWNvbXByZXNzb3IgaXMgZGl2aWRlZCBpbnRvIHR3byBzZWN0aW9ucyB0aGF0IGNhbiBydW4gaW5kZXBlbmRlbnRseToKLQotMS4gRGF0YSBpbnB1dCBpbmNsdWRlcyBtYXJrZXIgcGFyc2luZywgZW50cm9weSBkZWNvZGluZywgYW5kIGlucHV0IGludG8gdGhlCi0gICBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgRENUIGNvZWZmaWNpZW50IGJ1ZmZlci4gIE5vdGUgdGhhdCB0aGlzCi0gICBwcm9jZXNzaW5nIGlzIHJlbGF0aXZlbHkgY2hlYXAgYW5kIGZhc3QuCi0KLTIuIERhdGEgb3V0cHV0IHJlYWRzIGZyb20gdGhlIERDVCBjb2VmZmljaWVudCBidWZmZXIgYW5kIHBlcmZvcm1zIHRoZSBJRENUCi0gICBhbmQgYWxsIHBvc3Rwcm9jZXNzaW5nIHN0ZXBzLgotCi1Gb3IgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUsIHRoZSBkYXRhIGlucHV0IHByb2Nlc3NpbmcgaXMgYWxsb3dlZCB0byBnZXQKLWFyYml0cmFyaWx5IGZhciBhaGVhZCBvZiB0aGUgZGF0YSBvdXRwdXQgcHJvY2Vzc2luZy4gIChUaGlzIG9jY3VycyBvbmx5Ci1pZiB0aGUgYXBwbGljYXRpb24gY2FsbHMganBlZ19jb25zdW1lX2lucHV0KCk7IG90aGVyd2lzZSBpbnB1dCBhbmQgb3V0cHV0Ci1ydW4gaW4gbG9ja3N0ZXAsIHNpbmNlIHRoZSBpbnB1dCBzZWN0aW9uIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIG91dHB1dAotc2VjdGlvbiBuZWVkcyBtb3JlIGRhdGEuKSAgSW4gdGhpcyB3YXkgdGhlIGFwcGxpY2F0aW9uIGNhbiBhdm9pZCBtYWtpbmcKLWV4dHJhIGRpc3BsYXkgcGFzc2VzIHdoZW4gZGF0YSBpcyBhcnJpdmluZyBmYXN0ZXIgdGhhbiB0aGUgZGlzcGxheSBwYXNzCi1jYW4gcnVuLiAgRnVydGhlcm1vcmUsIGl0IGlzIHBvc3NpYmxlIHRvIGFib3J0IGFuIG91dHB1dCBwYXNzIHdpdGhvdXQKLWxvc2luZyBhbnl0aGluZywgc2luY2UgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBpcyByZWFkLW9ubHkgYXMgZmFyIGFzIHRoZQotb3V0cHV0IHNlY3Rpb24gaXMgY29uY2VybmVkLiAgU2VlIGxpYmpwZWcuZG9jIGZvciBtb3JlIGRldGFpbC4KLQotQSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGFycmF5IGlzIG9ubHkgY3JlYXRlZCBpZiB0aGUgSlBFRyBmaWxlIGhhcyBtdWx0aXBsZQotc2NhbnMgKG9yIGlmIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpZXMgYnVmZmVyZWQtaW1hZ2UgbW9kZSBhbnl3YXkpLiAgV2hlbgotcmVhZGluZyBhIHNpbmdsZS1zY2FuIGZpbGUsIHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIG5vcm1hbGx5IGNyZWF0ZXMgb25seQotYSBvbmUtTUNVIGJ1ZmZlciwgc28gaW5wdXQgYW5kIG91dHB1dCBwcm9jZXNzaW5nIG11c3QgcnVuIGluIGxvY2tzdGVwIGluIHRoaXMKLWNhc2UuICBqcGVnX2NvbnN1bWVfaW5wdXQoKSBpcyBlZmZlY3RpdmVseSBhIG5vLW9wIGluIHRoaXMgc2l0dWF0aW9uLgotCi1UaGUgbWFpbiBpbXBhY3Qgb2YgZGl2aWRpbmcgdGhlIGRlY29tcHJlc3NvciBpbiB0aGlzIGZhc2hpb24gaXMgdGhhdCB3ZSBtdXN0Ci1iZSB2ZXJ5IGNhcmVmdWwgd2l0aCBzaGFyZWQgdmFyaWFibGVzIGluIHRoZSBjaW5mbyBkYXRhIHN0cnVjdHVyZS4gIEVhY2gKLXZhcmlhYmxlIHRoYXQgY2FuIGNoYW5nZSBkdXJpbmcgdGhlIGNvdXJzZSBvZiBkZWNvbXByZXNzaW9uIG11c3QgYmUKLWNsYXNzaWZpZWQgYXMgYmVsb25naW5nIHRvIGRhdGEgaW5wdXQgb3IgZGF0YSBvdXRwdXQsIGFuZCBlYWNoIHNlY3Rpb24gbXVzdAotbG9vayBvbmx5IGF0IGl0cyBvd24gdmFyaWFibGVzLiAgRm9yIGV4YW1wbGUsIHRoZSBkYXRhIG91dHB1dCBzZWN0aW9uIG1heSBub3QKLWRlcGVuZCBvbiBhbnkgb2YgdGhlIHZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBjdXJyZW50IHNjYW4gaW4gdGhlIEpQRUcKLWZpbGUsIGJlY2F1c2UgdGhlc2UgbWF5IGNoYW5nZSBhcyB0aGUgZGF0YSBpbnB1dCBzZWN0aW9uIGFkdmFuY2VzIGludG8gYSBuZXcKLXNjYW4uCi0KLVRoZSBwcm9ncmVzcyBtb25pdG9yIGlzIChzb21ld2hhdCBhcmJpdHJhcmlseSkgZGVmaW5lZCB0byB0cmVhdCBpbnB1dCBvZiB0aGUKLWZpbGUgYXMgb25lIHBhc3Mgd2hlbiBidWZmZXJlZC1pbWFnZSBtb2RlIGlzIG5vdCB1c2VkLCBhbmQgdG8gaWdub3JlIGRhdGEKLWlucHV0IHdvcmsgY29tcGxldGVseSB3aGVuIGJ1ZmZlcmVkLWltYWdlIG1vZGUgaXMgdXNlZC4gIE5vdGUgdGhhdCB0aGUKLWxpYnJhcnkgaGFzIG5vIHJlbGlhYmxlIHdheSB0byBwcmVkaWN0IHRoZSBudW1iZXIgb2YgcGFzc2VzIHdoZW4gZGVhbGluZwotd2l0aCBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZSwgbm9yIGNhbiBpdCBwcmVkaWN0IHRoZSBudW1iZXIgb2Ygb3V0cHV0IHBhc3NlcwotaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4gIFNvIHRoZSB3b3JrIGVzdGltYXRlIGlzIGluaGVyZW50bHkgYm9ndXMgYW55d2F5LgotCi1ObyBjb21wYXJhYmxlIGRpdmlzaW9uIGlzIGN1cnJlbnRseSBtYWRlIGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LCBiZWNhdXNlCi10aGVyZSBpc24ndCBhbnkgcmVhbCBuZWVkIGZvciBpdC4KLQotCi0qKiogRGF0YSBmb3JtYXRzICoqKgotCi1BcnJheXMgb2YgcGl4ZWwgc2FtcGxlIHZhbHVlcyB1c2UgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZToKLQotICAgIHR5cGVkZWYgc29tZXRoaW5nIEpTQU1QTEU7CQlhIHBpeGVsIGNvbXBvbmVudCB2YWx1ZSwgMC4uTUFYSlNBTVBMRQotICAgIHR5cGVkZWYgSlNBTVBMRSAqSlNBTVBST1c7CQlwdHIgdG8gYSByb3cgb2Ygc2FtcGxlcwotICAgIHR5cGVkZWYgSlNBTVBST1cgKkpTQU1QQVJSQVk7CXB0ciB0byBhIGxpc3Qgb2Ygcm93cwotICAgIHR5cGVkZWYgSlNBTVBBUlJBWSAqSlNBTVBJTUFHRTsJcHRyIHRvIGEgbGlzdCBvZiBjb2xvci1jb21wb25lbnQgYXJyYXlzCi0KLVRoZSBiYXNpYyBlbGVtZW50IHR5cGUgSlNBTVBMRSB3aWxsIHR5cGljYWxseSBiZSBvbmUgb2YgdW5zaWduZWQgY2hhciwKLShzaWduZWQpIGNoYXIsIG9yIHNob3J0LiAgU2hvcnQgd2lsbCBiZSB1c2VkIGlmIHNhbXBsZXMgd2lkZXIgdGhhbiA4IGJpdHMgYXJlCi10byBiZSBzdXBwb3J0ZWQgKHRoaXMgaXMgYSBjb21waWxlLXRpbWUgb3B0aW9uKS4gIE90aGVyd2lzZSwgdW5zaWduZWQgY2hhciBpcwotdXNlZCBpZiBwb3NzaWJsZS4gIElmIHRoZSBjb21waWxlciBvbmx5IHN1cHBvcnRzIHNpZ25lZCBjaGFycywgdGhlbiBpdCBpcwotbmVjZXNzYXJ5IHRvIG1hc2sgb2ZmIHRoZSB2YWx1ZSB3aGVuIHJlYWRpbmcuICBUaHVzLCBhbGwgcmVhZHMgb2YgSlNBTVBMRQotdmFsdWVzIG11c3QgYmUgY29kZWQgYXMgIkdFVEpTQU1QTEUodmFsdWUpIiwgd2hlcmUgdGhlIG1hY3JvIHdpbGwgYmUgZGVmaW5lZAotYXMgIigodmFsdWUpICYgMHhGRikiIG9uIHNpZ25lZC1jaGFyIG1hY2hpbmVzIGFuZCAiKChpbnQpICh2YWx1ZSkpIiBlbHNld2hlcmUuCi0KLVdpdGggdGhlc2UgY29udmVudGlvbnMsIEpTQU1QTEUgdmFsdWVzIGNhbiBiZSBhc3N1bWVkIHRvIGJlID49IDAuICBUaGlzIGhlbHBzCi1zaW1wbGlmeSBjb3JyZWN0IHJvdW5kaW5nIGR1cmluZyBkb3duc2FtcGxpbmcsIGV0Yy4gIFRoZSBKUEVHIHN0YW5kYXJkJ3MKLXNwZWNpZmljYXRpb24gdGhhdCBzYW1wbGUgdmFsdWVzIHJ1biBmcm9tIC0xMjguLjEyNyBpcyBhY2NvbW1vZGF0ZWQgYnkKLXN1YnRyYWN0aW5nIDEyOCBqdXN0IGFzIHRoZSBzYW1wbGUgdmFsdWUgaXMgY29waWVkIGludG8gdGhlIHNvdXJjZSBhcnJheSBmb3IKLXRoZSBEQ1Qgc3RlcCAodGhpcyB3aWxsIGJlIGFuIGFycmF5IG9mIHNpZ25lZCBpbnRzKS4gIFNpbWlsYXJseSwgZHVyaW5nCi1kZWNvbXByZXNzaW9uIHRoZSBvdXRwdXQgb2YgdGhlIElEQ1Qgc3RlcCB3aWxsIGJlIGltbWVkaWF0ZWx5IHNoaWZ0ZWQgYmFjayB0bwotMC4uMjU1LiAgKE5COiBkaWZmZXJlbnQgdmFsdWVzIGFyZSByZXF1aXJlZCB3aGVuIDEyLWJpdCBzYW1wbGVzIGFyZSBpbiB1c2UuCi1UaGUgY29kZSBpcyB3cml0dGVuIGluIHRlcm1zIG9mIE1BWEpTQU1QTEUgYW5kIENFTlRFUkpTQU1QTEUsIHdoaWNoIHdpbGwgYmUKLWRlZmluZWQgYXMgMjU1IGFuZCAxMjggcmVzcGVjdGl2ZWx5IGluIGFuIDgtYml0IGltcGxlbWVudGF0aW9uLCBhbmQgYXMgNDA5NQotYW5kIDIwNDggaW4gYSAxMi1iaXQgaW1wbGVtZW50YXRpb24uKQotCi1XZSB1c2UgYSBwb2ludGVyIHBlciByb3csIHJhdGhlciB0aGFuIGEgdHdvLWRpbWVuc2lvbmFsIEpTQU1QTEUgYXJyYXkuICBUaGlzCi1jaG9pY2UgY29zdHMgb25seSBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkgYW5kIGhhcyBzZXZlcmFsIGJlbmVmaXRzOgotKiBDb2RlIHVzaW5nIHRoZSBkYXRhIHN0cnVjdHVyZSBkb2Vzbid0IG5lZWQgdG8ga25vdyB0aGUgYWxsb2NhdGVkIHdpZHRoIG9mCi0gIHRoZSByb3dzLiAgVGhpcyBzaW1wbGlmaWVzIGVkZ2UgZXhwYW5zaW9uL2NvbXByZXNzaW9uLCBzaW5jZSB3ZSBjYW4gd29yawotICBpbiBhbiBhcnJheSB0aGF0J3Mgd2lkZXIgdGhhbiB0aGUgbG9naWNhbCBwaWN0dXJlIHdpZHRoLgotKiBJbmRleGluZyBkb2Vzbid0IHJlcXVpcmUgbXVsdGlwbGljYXRpb247IHRoaXMgaXMgYSBwZXJmb3JtYW5jZSB3aW4gb24gbWFueQotICBtYWNoaW5lcy4KLSogQXJyYXlzIHdpdGggbW9yZSB0aGFuIDY0SyB0b3RhbCBlbGVtZW50cyBjYW4gYmUgc3VwcG9ydGVkIGV2ZW4gb24gbWFjaGluZXMKLSAgd2hlcmUgbWFsbG9jKCkgY2Fubm90IGFsbG9jYXRlIGNodW5rcyBsYXJnZXIgdGhhbiA2NEsuCi0qIFRoZSByb3dzIGZvcm1pbmcgYSBjb21wb25lbnQgYXJyYXkgbWF5IGJlIGFsbG9jYXRlZCBhdCBkaWZmZXJlbnQgdGltZXMKLSAgd2l0aG91dCBleHRyYSBjb3B5aW5nLiAgVGhpcyB0cmljayBhbGxvd3Mgc29tZSBzcGVlZHVwcyBpbiBzbW9vdGhpbmcgc3RlcHMKLSAgdGhhdCBuZWVkIGFjY2VzcyB0byB0aGUgcHJldmlvdXMgYW5kIG5leHQgcm93cy4KLQotTm90ZSB0aGF0IGVhY2ggY29sb3IgY29tcG9uZW50IGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIGFycmF5OyB3ZSBkb24ndCB1c2UgdGhlCi10cmFkaXRpb25hbCBsYXlvdXQgaW4gd2hpY2ggdGhlIGNvbXBvbmVudHMgb2YgYSBwaXhlbCBhcmUgc3RvcmVkIHRvZ2V0aGVyLgotVGhpcyBzaW1wbGlmaWVzIGNvZGluZyBvZiBtb2R1bGVzIHRoYXQgd29yayBvbiBlYWNoIGNvbXBvbmVudCBpbmRlcGVuZGVudGx5LAotYmVjYXVzZSB0aGV5IGRvbid0IG5lZWQgdG8ga25vdyBob3cgbWFueSBjb21wb25lbnRzIHRoZXJlIGFyZS4gIEZ1cnRoZXJtb3JlLAotd2UgY2FuIHJlYWQgb3Igd3JpdGUgZWFjaCBjb21wb25lbnQgdG8gYSB0ZW1wb3JhcnkgZmlsZSBpbmRlcGVuZGVudGx5LCB3aGljaAotaXMgaGVscGZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBub25pbnRlcmxlYXZlZCBKUEVHIGZpbGVzLgotCi1JbiBnZW5lcmFsLCBhIHNwZWNpZmljIHNhbXBsZSB2YWx1ZSBpcyBhY2Nlc3NlZCBieSBjb2RlIHN1Y2ggYXMKLQlHRVRKU0FNUExFKGltYWdlW2NvbG9yY29tcG9uZW50XVtyb3ddW2NvbF0pCi13aGVyZSBjb2wgaXMgbWVhc3VyZWQgZnJvbSB0aGUgaW1hZ2UgbGVmdCBlZGdlLCBidXQgcm93IGlzIG1lYXN1cmVkIGZyb20gdGhlCi1maXJzdCBzYW1wbGUgcm93IGN1cnJlbnRseSBpbiBtZW1vcnkuICBFaXRoZXIgb2YgdGhlIGZpcnN0IHR3byBpbmRleGluZ3MgY2FuCi1iZSBwcmVjb21wdXRlZCBieSBjb3B5aW5nIHRoZSByZWxldmFudCBwb2ludGVyLgotCi0KLVNpbmNlIG1vc3QgaW1hZ2UtcHJvY2Vzc2luZyBhcHBsaWNhdGlvbnMgcHJlZmVyIHRvIHdvcmsgb24gaW1hZ2VzIGluIHdoaWNoCi10aGUgY29tcG9uZW50cyBvZiBhIHBpeGVsIGFyZSBzdG9yZWQgdG9nZXRoZXIsIHRoZSBkYXRhIHBhc3NlZCB0byBvciBmcm9tIHRoZQotc3Vycm91bmRpbmcgYXBwbGljYXRpb24gdXNlcyB0aGUgdHJhZGl0aW9uYWwgY29udmVudGlvbjogYSBzaW5nbGUgcGl4ZWwgaXMKLXJlcHJlc2VudGVkIGJ5IE4gY29uc2VjdXRpdmUgSlNBTVBMRSB2YWx1ZXMsIGFuZCBhbiBpbWFnZSByb3cgaXMgYW4gYXJyYXkgb2YKLSgjIG9mIGNvbG9yIGNvbXBvbmVudHMpKihpbWFnZSB3aWR0aCkgSlNBTVBMRXMuICBPbmUgb3IgbW9yZSByb3dzIG9mIGRhdGEgY2FuCi1iZSByZXByZXNlbnRlZCBieSBhIHBvaW50ZXIgb2YgdHlwZSBKU0FNUEFSUkFZIGluIHRoaXMgc2NoZW1lLiAgVGhpcyBzY2hlbWUgaXMKLWNvbnZlcnRlZCB0byBjb21wb25lbnQtd2lzZSBzdG9yYWdlIGluc2lkZSB0aGUgSlBFRyBsaWJyYXJ5LiAgKEFwcGxpY2F0aW9ucwotdGhhdCB3YW50IHRvIHNraXAgSlBFRyBwcmVwcm9jZXNzaW5nIG9yIHBvc3Rwcm9jZXNzaW5nIHdpbGwgaGF2ZSB0byBjb250ZW5kCi13aXRoIGNvbXBvbmVudC13aXNlIHN0b3JhZ2UuKQotCi0KLUFycmF5cyBvZiBEQ1QtY29lZmZpY2llbnQgdmFsdWVzIHVzZSB0aGUgZm9sbG93aW5nIGRhdGEgc3RydWN0dXJlOgotCi0gICAgdHlwZWRlZiBzaG9ydCBKQ09FRjsJCWEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyCi0gICAgdHlwZWRlZiBKQ09FRiBKQkxPQ0tbRENUU0laRTJdOwlhbiA4eDggYmxvY2sgb2YgY29lZmZpY2llbnRzCi0gICAgdHlwZWRlZiBKQkxPQ0sgKkpCTE9DS1JPVzsJCXB0ciB0byBvbmUgaG9yaXpvbnRhbCByb3cgb2YgOHg4IGJsb2NrcwotICAgIHR5cGVkZWYgSkJMT0NLUk9XICpKQkxPQ0tBUlJBWTsJcHRyIHRvIGEgbGlzdCBvZiBzdWNoIHJvd3MKLSAgICB0eXBlZGVmIEpCTE9DS0FSUkFZICpKQkxPQ0tJTUFHRTsJcHRyIHRvIGEgbGlzdCBvZiBjb2xvciBjb21wb25lbnQgYXJyYXlzCi0KLVRoZSB1bmRlcmx5aW5nIHR5cGUgaXMgYXQgbGVhc3QgYSAxNi1iaXQgc2lnbmVkIGludGVnZXI7IHdoaWxlICJzaG9ydCIgaXMgYmlnCi1lbm91Z2ggb24gYWxsIG1hY2hpbmVzIG9mIGludGVyZXN0LCBvbiBzb21lIG1hY2hpbmVzIGl0IGlzIHByZWZlcmFibGUgdG8gdXNlCi0iaW50IiBmb3Igc3BlZWQgcmVhc29ucywgZGVzcGl0ZSB0aGUgc3RvcmFnZSBjb3N0LiAgQ29lZmZpY2llbnRzIGFyZSBncm91cGVkCi1pbnRvIDh4OCBibG9ja3MgKGJ1dCB3ZSBhbHdheXMgdXNlICNkZWZpbmVzIERDVFNJWkUgYW5kIERDVFNJWkUyIHJhdGhlciB0aGFuCi0iOCIgYW5kICI2NCIpLgotCi1UaGUgY29udGVudHMgb2YgYSBjb2VmZmljaWVudCBibG9jayBtYXkgYmUgaW4gZWl0aGVyICJuYXR1cmFsIiBvciB6aWd6YWdnZWQKLW9yZGVyLCBhbmQgbWF5IGJlIHRydWUgdmFsdWVzIG9yIGRpdmlkZWQgYnkgdGhlIHF1YW50aXphdGlvbiBjb2VmZmljaWVudHMsCi1kZXBlbmRpbmcgb24gd2hlcmUgdGhlIGJsb2NrIGlzIGluIHRoZSBwcm9jZXNzaW5nIHBpcGVsaW5lLiAgSW4gdGhlIGN1cnJlbnQKLWxpYnJhcnksIGNvZWZmaWNpZW50IGJsb2NrcyBhcmUga2VwdCBpbiBuYXR1cmFsIG9yZGVyIGV2ZXJ5d2hlcmU7IHRoZSBlbnRyb3B5Ci1jb2RlY3MgemlnemFnIG9yIGRlemlnemFnIHRoZSBkYXRhIGFzIGl0IGlzIHdyaXR0ZW4gb3IgcmVhZC4gIFRoZSBibG9ja3MKLWNvbnRhaW4gcXVhbnRpemVkIGNvZWZmaWNpZW50cyBldmVyeXdoZXJlIG91dHNpZGUgdGhlIERDVC9JRENUIHN1YnN5c3RlbXMuCi0oVGhpcyBsYXR0ZXIgZGVjaXNpb24gbWF5IG5lZWQgdG8gYmUgcmV2aXNpdGVkIHRvIHN1cHBvcnQgdmFyaWFibGUKLXF1YW50aXphdGlvbiBhIGxhIEpQRUcgUGFydCAzLikKLQotTm90aWNlIHRoYXQgdGhlIGFsbG9jYXRpb24gdW5pdCBpcyBub3cgYSByb3cgb2YgOHg4IGJsb2NrcywgY29ycmVzcG9uZGluZyB0bwotZWlnaHQgcm93cyBvZiBzYW1wbGVzLiAgT3RoZXJ3aXNlIHRoZSBzdHJ1Y3R1cmUgaXMgbXVjaCB0aGUgc2FtZSBhcyBmb3IKLXNhbXBsZXMsIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29ucy4KLQotT24gbWFjaGluZXMgd2hlcmUgbWFsbG9jKCkgY2FuJ3QgaGFuZGxlIGEgcmVxdWVzdCBiaWdnZXIgdGhhbiA2NEtiLCB0aGlzIGRhdGEKLXN0cnVjdHVyZSBsaW1pdHMgdXMgdG8gcm93cyBvZiBsZXNzIHRoYW4gNTEyIEpCTE9DS3MsIG9yIGEgcGljdHVyZSB3aWR0aCBvZgotNDAwMCsgcGl4ZWxzLiAgVGhpcyBzZWVtcyBhbiBhY2NlcHRhYmxlIHJlc3RyaWN0aW9uLgotCi0KLU9uIDgweDg2IG1hY2hpbmVzLCB0aGUgYm90dG9tLWxldmVsIHBvaW50ZXIgdHlwZXMgKEpTQU1QUk9XIGFuZCBKQkxPQ0tST1cpCi1tdXN0IGJlIGRlY2xhcmVkIGFzICJmYXIiIHBvaW50ZXJzLCBidXQgdGhlIHVwcGVyIGxldmVscyBjYW4gYmUgIm5lYXIiCi0oaW1wbHlpbmcgdGhhdCB0aGUgcG9pbnRlciBsaXN0cyBhcmUgYWxsb2NhdGVkIGluIHRoZSBEUyBzZWdtZW50KS4KLVdlIHVzZSBhICNkZWZpbmUgc3ltYm9sIEZBUiwgd2hpY2ggZXhwYW5kcyB0byB0aGUgImZhciIga2V5d29yZCB3aGVuCi1jb21waWxpbmcgb24gODB4ODYgbWFjaGluZXMgYW5kIHRvIG5vdGhpbmcgZWxzZXdoZXJlLgotCi0KLSoqKiBTdXNwZW5kYWJsZSBwcm9jZXNzaW5nICoqKgotCi1JbiBzb21lIGFwcGxpY2F0aW9ucyBpdCBpcyBkZXNpcmFibGUgdG8gdXNlIHRoZSBKUEVHIGxpYnJhcnkgYXMgYW4KLWluY3JlbWVudGFsLCBtZW1vcnktdG8tbWVtb3J5IGZpbHRlci4gIEluIHRoaXMgc2l0dWF0aW9uIHRoZSBkYXRhIHNvdXJjZSBvcgotZGVzdGluYXRpb24gbWF5IGJlIGEgbGltaXRlZC1zaXplIGJ1ZmZlciwgYW5kIHdlIGNhbid0IHJlbHkgb24gYmVpbmcgYWJsZSB0bwotZW1wdHkgb3IgcmVmaWxsIHRoZSBidWZmZXIgYXQgYXJiaXRyYXJ5IHRpbWVzLiAgSW5zdGVhZCB0aGUgYXBwbGljYXRpb24gd291bGQKLWxpa2UgdG8gaGF2ZSBjb250cm9sIHJldHVybiBmcm9tIHRoZSBsaWJyYXJ5IGF0IGJ1ZmZlciBvdmVyZmxvdy91bmRlcnJ1biwgYW5kCi10aGVuIHJlc3VtZSBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGF0IGEgbGF0ZXIgdGltZS4KLQotVGhpcyBzY2VuYXJpbyBpcyBzdXBwb3J0ZWQgZm9yIHNpbXBsZSBjYXNlcy4gIChGb3IgYW55dGhpbmcgbW9yZSBjb21wbGV4LCB3ZQotcmVjb21tZW5kIHRoYXQgdGhlIGFwcGxpY2F0aW9uICJiaXRlIHRoZSBidWxsZXQiIGFuZCBkZXZlbG9wIHJlYWwgbXVsdGl0YXNraW5nCi1jYXBhYmlsaXR5LikgIFRoZSBsaWJqcGVnLmRvYyBmaWxlIGdvZXMgaW50byBtb3JlIGRldGFpbCBhYm91dCB0aGUgdXNhZ2UgYW5kCi1saW1pdGF0aW9ucyBvZiB0aGlzIGNhcGFiaWxpdHk7IGhlcmUgd2UgYWRkcmVzcyB0aGUgaW1wbGljYXRpb25zIGZvciBsaWJyYXJ5Ci1zdHJ1Y3R1cmUuCi0KLVRoZSBlc3NlbmNlIG9mIHRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIGVudHJvcHkgY29kZWMgKGNvZGVyIG9yIGRlY29kZXIpIG11c3QKLWJlIHByZXBhcmVkIHRvIHN0b3AgYXQgYXJiaXRyYXJ5IHRpbWVzLiAgSW4gdHVybiwgdGhlIGNvbnRyb2xsZXJzIHRoYXQgY2FsbAotdGhlIGVudHJvcHkgY29kZWMgbXVzdCBiZSBhYmxlIHRvIHN0b3AgYmVmb3JlIGhhdmluZyBwcm9kdWNlZCBvciBjb25zdW1lZCBhbGwKLXRoZSBkYXRhIHRoYXQgdGhleSBub3JtYWxseSB3b3VsZCBoYW5kbGUgaW4gb25lIGNhbGwuICBUaGF0IHBhcnQgaXMgcmVhc29uYWJseQotc3RyYWlnaHRmb3J3YXJkOiB3ZSBtYWtlIHRoZSBjb250cm9sbGVyIGNhbGwgaW50ZXJmYWNlcyBpbmNsdWRlICJwcm9ncmVzcwotY291bnRlcnMiIHdoaWNoIGluZGljYXRlIHRoZSBudW1iZXIgb2YgZGF0YSBjaHVua3Mgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgYW5kCi13ZSByZXF1aXJlIGNhbGxlcnMgdG8gdGVzdCB0aGUgY291bnRlciByYXRoZXIgdGhhbiBqdXN0IGFzc3VtZSBhbGwgb2YgdGhlIGRhdGEKLXdhcyBwcm9jZXNzZWQuCi0KLVJhdGhlciB0aGFuIHRyeWluZyB0byByZXN0YXJ0IGF0IGFuIGFyYml0cmFyeSBwb2ludCwgdGhlIGN1cnJlbnQgSHVmZm1hbgotY29kZWNzIGFyZSBkZXNpZ25lZCB0byByZXN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgTUNVIGFmdGVyIGEKLXN1c3BlbnNpb24gZHVlIHRvIGJ1ZmZlciBvdmVyZmxvdy91bmRlcnJ1bi4gIEF0IHRoZSBzdGFydCBvZiBlYWNoIGNhbGwsIHRoZQotY29kZWMncyBpbnRlcm5hbCBzdGF0ZSBpcyBsb2FkZWQgZnJvbSBwZXJtYW5lbnQgc3RvcmFnZSAoaW4gdGhlIEpQRUcgb2JqZWN0Ci1zdHJ1Y3R1cmVzKSBpbnRvIGxvY2FsIHZhcmlhYmxlcy4gIE9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgTUNVLCB0aGUKLXBlcm1hbmVudCBzdGF0ZSBpcyB1cGRhdGVkLiAgKFRoaXMgY29weWluZyBpcyBub3QgdmVyeSBleHBlbnNpdmUsIGFuZCBtYXkgZXZlbgotbGVhZCB0byAqaW1wcm92ZWQqIHBlcmZvcm1hbmNlIGlmIHRoZSBsb2NhbCB2YXJpYWJsZXMgY2FuIGJlIHJlZ2lzdGVyaXplZC4pCi1JZiBhIHN1c3BlbnNpb24gb2NjdXJzLCB0aGUgY29kZWMgc2ltcGx5IHJldHVybnMgd2l0aG91dCB1cGRhdGluZyB0aGUgc3RhdGUsCi10aHVzIGVmZmVjdGl2ZWx5IHJldmVydGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIE1DVS4gIE5vdGUgdGhhdCB0aGlzIGltcGxpZXMKLWxlYXZpbmcgc29tZSBkYXRhIHVucHJvY2Vzc2VkIGluIHRoZSBzb3VyY2UvZGVzdGluYXRpb24gYnVmZmVyIChpZSwgdGhlCi1jb21wcmVzc2VkIHBhcnRpYWwgTUNVKS4gIFRoZSBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbiBtb2R1bGUgaW50ZXJmYWNlcyBhcmUKLXNwZWNpZmllZCBzbyBhcyB0byBtYWtlIHRoaXMgcG9zc2libGUuICBUaGlzIGFsc28gaW1wbGllcyB0aGF0IHRoZSBkYXRhIGJ1ZmZlcgotbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIHdvcnN0LWNhc2UgY29tcHJlc3NlZCBNQ1U7IGEgY291cGxlIHRob3VzYW5kCi1ieXRlcyBzaG91bGQgYmUgZW5vdWdoLgotCi1JbiBhIHN1Y2Nlc3NpdmUtYXBwcm94aW1hdGlvbiBBQyByZWZpbmVtZW50IHNjYW4sIHRoZSBwcm9ncmVzc2l2ZSBIdWZmbWFuCi1kZWNvZGVyIGhhcyB0byBiZSBhYmxlIHRvIHVuZG8gYXNzaWdubWVudHMgb2YgbmV3bHkgbm9uemVybyBjb2VmZmljaWVudHMgaWYgaXQKLXN1c3BlbmRzIGJlZm9yZSB0aGUgTUNVIGlzIGNvbXBsZXRlLCBzaW5jZSBkZWNvZGluZyByZXF1aXJlcyBkaXN0aW5ndWlzaGluZwotcHJldmlvdXNseS16ZXJvIGFuZCBwcmV2aW91c2x5LW5vbnplcm8gY29lZmZpY2llbnRzLiAgVGhpcyBpcyBhIGJpdCB0ZWRpb3VzCi1idXQgcHJvYmFibHkgd29uJ3QgaGF2ZSBtdWNoIGVmZmVjdCBvbiBwZXJmb3JtYW5jZS4gIE90aGVyIHZhcmlhbnRzIG9mIEh1ZmZtYW4KLWRlY29kaW5nIG5lZWQgbm90IHdvcnJ5IGFib3V0IHRoaXMsIHNpbmNlIHRoZXkgd2lsbCBqdXN0IHN0b3JlIHRoZSBzYW1lIHZhbHVlcwotYWdhaW4gaWYgZm9yY2VkIHRvIHJlcGVhdCB0aGUgTUNVLgotCi1UaGlzIGFwcHJvYWNoIHdvdWxkIHByb2JhYmx5IG5vdCB3b3JrIGZvciBhbiBhcml0aG1ldGljIGNvZGVjLCBzaW5jZSBpdHMKLW1vZGlmaWFibGUgc3RhdGUgaXMgcXVpdGUgbGFyZ2UgYW5kIGNvdWxkbid0IGJlIGNvcGllZCBjaGVhcGx5LiAgSW5zdGVhZCBpdAotd291bGQgaGF2ZSB0byBzdXNwZW5kIGFuZCByZXN1bWUgZXhhY3RseSBhdCB0aGUgcG9pbnQgb2YgdGhlIGJ1ZmZlciBlbmQuCi0KLVRoZSBKUEVHIG1hcmtlciByZWFkZXIgaXMgZGVzaWduZWQgdG8gY29wZSB3aXRoIHN1c3BlbnNpb24gYXQgYW4gYXJiaXRyYXJ5Ci1wb2ludC4gIEl0IGRvZXMgc28gYnkgYmFja2luZyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hcmtlciBwYXJhbWV0ZXIgc2VnbWVudCwKLXNvIHRoZSBkYXRhIGJ1ZmZlciBtdXN0IGJlIGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgbGFyZ2VzdCBtYXJrZXIgb2YgaW50ZXJlc3QuCi1BZ2FpbiwgYSBjb3VwbGUgS0Igc2hvdWxkIGJlIGFkZXF1YXRlLiAgKEEgc3BlY2lhbCAic2tpcCIgY29udmVudGlvbiBpcyB1c2VkCi10byBieXBhc3MgQ09NIGFuZCBBUFBuIG1hcmtlcnMsIHNvIHRoZXNlIGNhbiBiZSBsYXJnZXIgdGhhbiB0aGUgYnVmZmVyIHNpemUKLXdpdGhvdXQgY2F1c2luZyBwcm9ibGVtczsgb3RoZXJ3aXNlIGEgNjRLIGJ1ZmZlciB3b3VsZCBiZSBuZWVkZWQgaW4gdGhlIHdvcnN0Ci1jYXNlLikKLQotVGhlIEpQRUcgbWFya2VyIHdyaXRlciBjdXJyZW50bHkgZG9lcyAqbm90KiBjb3BlIHdpdGggc3VzcGVuc2lvbi4gIEkgZmVlbCB0aGF0Ci10aGlzIGlzIG5vdCBuZWNlc3Nhcnk7IGl0IGlzIG11Y2ggZWFzaWVyIHNpbXBseSB0byByZXF1aXJlIHRoZSBhcHBsaWNhdGlvbiB0bwotZW5zdXJlIHRoZXJlIGlzIGVub3VnaCBidWZmZXIgc3BhY2UgYmVmb3JlIHN0YXJ0aW5nLiAgKEFuIGVtcHR5IDJLIGJ1ZmZlciBpcwotbW9yZSB0aGFuIHN1ZmZpY2llbnQgZm9yIHRoZSBoZWFkZXIgbWFya2VyczsgYW5kIGVuc3VyaW5nIHRoZXJlIGFyZSBhIGRvemVuIG9yCi10d28gYnl0ZXMgYXZhaWxhYmxlIGJlZm9yZSBjYWxsaW5nIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgd2lsbCBzdWZmaWNlIGZvciB0aGUKLXRyYWlsZXIuKSAgVGhpcyB3b3VsZCBub3Qgd29yayBmb3Igd3JpdGluZyBtdWx0aS1zY2FuIEpQRUcgZmlsZXMsIGJ1dAotd2Ugc2ltcGx5IGRvIG5vdCBpbnRlbmQgdG8gc3VwcG9ydCB0aGF0IGNhcGFiaWxpdHkgd2l0aCBzdXNwZW5zaW9uLgotCi0KLSoqKiBNZW1vcnkgbWFuYWdlciBzZXJ2aWNlcyAqKioKLQotVGhlIEpQRUcgbGlicmFyeSdzIG1lbW9yeSBtYW5hZ2VyIGNvbnRyb2xzIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBvZgotbWVtb3J5LCBhbmQgaXQgbWFuYWdlcyBsYXJnZSAidmlydHVhbCIgZGF0YSBhcnJheXMgb24gbWFjaGluZXMgd2hlcmUgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdmlydHVhbCBtZW1vcnkuICBOb3RlIHRoYXQgdGhlIHNhbWUKLW1lbW9yeSBtYW5hZ2VyIHNlcnZlcyBib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbnMuCi0KLUluIGFsbCBjYXNlcywgYWxsb2NhdGVkIG9iamVjdHMgYXJlIHRpZWQgdG8gYSBwYXJ0aWN1bGFyIGNvbXByZXNzaW9uIG9yCi1kZWNvbXByZXNzaW9uIG1hc3RlciByZWNvcmQsIGFuZCB0aGV5IHdpbGwgYmUgcmVsZWFzZWQgd2hlbiB0aGF0IG1hc3RlcgotcmVjb3JkIGlzIGRlc3Ryb3llZC4KLQotVGhlIG1lbW9yeSBtYW5hZ2VyIGRvZXMgbm90IHByb3ZpZGUgZXhwbGljaXQgZGVhbGxvY2F0aW9uIG9mIG9iamVjdHMuCi1JbnN0ZWFkLCBvYmplY3RzIGFyZSBjcmVhdGVkIGluICJwb29scyIgb2YgZnJlZSBzdG9yYWdlLCBhbmQgYSB3aG9sZSBwb29sCi1jYW4gYmUgZnJlZWQgYXQgb25jZS4gIFRoaXMgYXBwcm9hY2ggaGVscHMgcHJldmVudCBzdG9yYWdlLWxlYWsgYnVncywgYW5kCi1pdCBzcGVlZHMgdXAgb3BlcmF0aW9ucyB3aGVuZXZlciBtYWxsb2MvZnJlZSBhcmUgc2xvdyAoYXMgdGhleSBvZnRlbiBhcmUpLgotVGhlIHBvb2xzIGNhbiBiZSByZWdhcmRlZCBhcyBsaWZldGltZSBpZGVudGlmaWVycyBmb3Igb2JqZWN0cy4gIFR3bwotcG9vbHMvbGlmZXRpbWVzIGFyZSBkZWZpbmVkOgotICAqIEpQT09MX1BFUk1BTkVOVAlsYXN0cyB1bnRpbCBtYXN0ZXIgcmVjb3JkIGlzIGRlc3Ryb3llZAotICAqIEpQT09MX0lNQUdFCQlsYXN0cyB1bnRpbCBkb25lIHdpdGggaW1hZ2UgKEpQRUcgZGF0YXN0cmVhbSkKLVBlcm1hbmVudCBsaWZldGltZSBpcyB1c2VkIGZvciBwYXJhbWV0ZXJzIGFuZCB0YWJsZXMgdGhhdCBzaG91bGQgYmUgY2FycmllZAotYWNyb3NzIGZyb20gb25lIGRhdGFzdHJlYW0gdG8gYW5vdGhlcjsgdGhpcyBpbmNsdWRlcyBhbGwgYXBwbGljYXRpb24tdmlzaWJsZQotcGFyYW1ldGVycy4gIEltYWdlIGxpZmV0aW1lIGlzIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gIChBIHRoaXJkIGxpZmV0aW1lLAotSlBPT0xfUEFTUyA9IG9uZSBwcm9jZXNzaW5nIHBhc3MsIHdhcyBvcmlnaW5hbGx5IHBsYW5uZWQuICBIb3dldmVyIGl0IHdhcwotZHJvcHBlZCBhcyBub3QgYmVpbmcgd29ydGh3aGlsZS4gIFRoZSBhY3R1YWwgdXNhZ2UgcGF0dGVybnMgYXJlIHN1Y2ggdGhhdCB0aGUKLXBlYWsgbWVtb3J5IHVzYWdlIHdvdWxkIGJlIGFib3V0IHRoZSBzYW1lIGFueXdheTsgYW5kIGhhdmluZyBwZXItcGFzcyBzdG9yYWdlCi1zdWJzdGFudGlhbGx5IGNvbXBsaWNhdGVzIHRoZSB2aXJ0dWFsIG1lbW9yeSBhbGxvY2F0aW9uIHJ1bGVzIC0tLSBzZWUgYmVsb3cuKQotCi1UaGUgbWVtb3J5IG1hbmFnZXIgZGVhbHMgd2l0aCB0aHJlZSBraW5kcyBvZiBvYmplY3Q6Ci0xLiAiU21hbGwiIG9iamVjdHMuICBUeXBpY2FsbHkgdGhlc2UgcmVxdWlyZSBubyBtb3JlIHRoYW4gMTBLLTIwSyB0b3RhbC4KLTIuICJMYXJnZSIgb2JqZWN0cy4gIFRoZXNlIG1heSByZXF1aXJlIHRlbnMgdG8gaHVuZHJlZHMgb2YgSyBkZXBlbmRpbmcgb24KLSAgIGltYWdlIHNpemUuICBTZW1hbnRpY2FsbHkgdGhleSBiZWhhdmUgdGhlIHNhbWUgYXMgc21hbGwgb2JqZWN0cywgYnV0IHdlCi0gICBkaXN0aW5ndWlzaCB0aGVtIGZvciB0d28gcmVhc29uczoKLSAgICAgKiBPbiBNUy1ET1MgbWFjaGluZXMsIGxhcmdlIG9iamVjdHMgYXJlIHJlZmVyZW5jZWQgYnkgRkFSIHBvaW50ZXJzLAotICAgICAgIHNtYWxsIG9iamVjdHMgYnkgTkVBUiBwb2ludGVycy4KLSAgICAgKiBQb29sIGFsbG9jYXRpb24gaGV1cmlzdGljcyBtYXkgZGlmZmVyIGZvciBsYXJnZSBhbmQgc21hbGwgb2JqZWN0cy4KLSAgIE5vdGUgdGhhdCBpbmRpdmlkdWFsICJsYXJnZSIgb2JqZWN0cyBjYW5ub3QgZXhjZWVkIHRoZSBzaXplIGFsbG93ZWQgYnkKLSAgIHR5cGUgc2l6ZV90LCB3aGljaCBtYXkgYmUgNjRLIG9yIGxlc3Mgb24gc29tZSBtYWNoaW5lcy4KLTMuICJWaXJ0dWFsIiBvYmplY3RzLiAgVGhlc2UgYXJlIGxhcmdlIDItRCBhcnJheXMgb2YgSlNBTVBMRXMgb3IgSkJMT0NLcwotICAgKHR5cGljYWxseSBsYXJnZSBlbm91Z2ggZm9yIHRoZSBlbnRpcmUgaW1hZ2UgYmVpbmcgcHJvY2Vzc2VkKS4gIFRoZQotICAgbWVtb3J5IG1hbmFnZXIgcHJvdmlkZXMgc3RyaXB3aXNlIGFjY2VzcyB0byB0aGVzZSBhcnJheXMuICBPbiBtYWNoaW5lcwotICAgd2l0aG91dCB2aXJ0dWFsIG1lbW9yeSwgdGhlIHJlc3Qgb2YgdGhlIGFycmF5IG1heSBiZSBzd2FwcGVkIG91dCB0byBhCi0gICB0ZW1wb3JhcnkgZmlsZS4KLQotKE5vdGU6IEpTQU1QQVJSQVkgYW5kIEpCTE9DS0FSUkFZIGRhdGEgc3RydWN0dXJlcyBhcmUgYSBjb21iaW5hdGlvbiBvZiBsYXJnZQotb2JqZWN0cyBmb3IgdGhlIGRhdGEgcHJvcGVyIGFuZCBzbWFsbCBvYmplY3RzIGZvciB0aGUgcm93IHBvaW50ZXJzLiAgRm9yCi1jb252ZW5pZW5jZSBhbmQgc3BlZWQsIHRoZSBtZW1vcnkgbWFuYWdlciBwcm92aWRlcyBzaW5nbGUgcm91dGluZXMgdG8gY3JlYXRlCi10aGVzZSBzdHJ1Y3R1cmVzLiAgU2ltaWxhcmx5LCB2aXJ0dWFsIGFycmF5cyBpbmNsdWRlIGEgc21hbGwgY29udHJvbCBibG9jawotYW5kIGEgSlNBTVBBUlJBWSBvciBKQkxPQ0tBUlJBWSB3b3JraW5nIGJ1ZmZlciwgYWxsIGNyZWF0ZWQgd2l0aCBvbmUgY2FsbC4pCi0KLUluIHRoZSBwcmVzZW50IGltcGxlbWVudGF0aW9uLCB2aXJ0dWFsIGFycmF5cyBhcmUgb25seSBwZXJtaXR0ZWQgdG8gaGF2ZSBpbWFnZQotbGlmZXNwYW4uICAoUGVybWFuZW50IGxpZmVzcGFuIHdvdWxkIG5vdCBiZSByZWFzb25hYmxlLCBhbmQgcGFzcyBsaWZlc3BhbiBpcwotbm90IHZlcnkgdXNlZnVsIHNpbmNlIGEgdmlydHVhbCBhcnJheSdzIHJhaXNvbiBkJ2V0cmUgaXMgdG8gc3RvcmUgZGF0YSBmb3IKLW11bHRpcGxlIHBhc3NlcyB0aHJvdWdoIHRoZSBpbWFnZS4pICBXZSBhbHNvIGV4cGVjdCB0aGF0IG9ubHkgInNtYWxsIiBvYmplY3RzCi13aWxsIGJlIGdpdmVuIHBlcm1hbmVudCBsaWZlc3BhbiwgdGhvdWdoIHRoaXMgcmVzdHJpY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5Ci10aGUgbWVtb3J5IG1hbmFnZXIuCi0KLUluIGEgbm9uLXZpcnR1YWwtbWVtb3J5IG1hY2hpbmUsIHNvbWUgcGVyZm9ybWFuY2UgYmVuZWZpdCBjYW4gYmUgZ2FpbmVkIGJ5Ci1tYWtpbmcgdGhlIGluLW1lbW9yeSBidWZmZXJzIGZvciB2aXJ0dWFsIGFycmF5cyBiZSBhcyBsYXJnZSBhcyBwb3NzaWJsZS4KLShGb3Igc21hbGwgaW1hZ2VzLCB0aGUgYnVmZmVycyBtaWdodCBmaXQgZW50aXJlbHkgaW4gbWVtb3J5LCBzbyBibGluZAotc3dhcHBpbmcgd291bGQgYmUgdmVyeSB3YXN0ZWZ1bC4pICBUaGUgbWVtb3J5IG1hbmFnZXIgd2lsbCBhZGp1c3QgdGhlIGhlaWdodAotb2YgdGhlIGJ1ZmZlcnMgdG8gZml0IHdpdGhpbiBhIHByZXNwZWNpZmllZCBtYXhpbXVtIG1lbW9yeSB1c2FnZS4gIEluIG9yZGVyCi10byBkbyB0aGlzIGluIGEgcmVhc29uYWJseSBvcHRpbWFsIGZhc2hpb24sIHRoZSBtYW5hZ2VyIG5lZWRzIHRvIGFsbG9jYXRlIGFsbAotb2YgdGhlIHZpcnR1YWwgYXJyYXlzIGF0IG9uY2UuICBUaGVyZWZvcmUsIHRoZXJlIGlzbid0IGEgb25lLXN0ZXAgYWxsb2NhdGlvbgotcm91dGluZSBmb3IgdmlydHVhbCBhcnJheXM7IGluc3RlYWQsIHRoZXJlIGlzIGEgInJlcXVlc3QiIHJvdXRpbmUgdGhhdCBzaW1wbHkKLWFsbG9jYXRlcyB0aGUgY29udHJvbCBibG9jaywgYW5kIGEgInJlYWxpemUiIHJvdXRpbmUgKGNhbGxlZCBqdXN0IG9uY2UpIHRoYXQKLWRldGVybWluZXMgc3BhY2UgYWxsb2NhdGlvbiBhbmQgY3JlYXRlcyBhbGwgb2YgdGhlIGFjdHVhbCBidWZmZXJzLiAgVGhlCi1yZWFsaXplIHJvdXRpbmUgbXVzdCBhbGxvdyBmb3Igc3BhY2Ugb2NjdXBpZWQgYnkgbm9uLXZpcnR1YWwgbGFyZ2Ugb2JqZWN0cy4KLShXZSBkb24ndCBib3RoZXIgdG8gZmFjdG9yIGluIHRoZSBzcGFjZSBuZWVkZWQgZm9yIHNtYWxsIG9iamVjdHMsIG9uIHRoZQotZ3JvdW5kcyB0aGF0IGl0IGlzbid0IHdvcnRoIHRoZSB0cm91YmxlLikKLQotVG8gc3VwcG9ydCBhbGwgdGhpcywgd2UgZXN0YWJsaXNoIHRoZSBmb2xsb3dpbmcgcHJvdG9jb2wgZm9yIGRvaW5nIGJ1c2luZXNzCi13aXRoIHRoZSBtZW1vcnkgbWFuYWdlcjoKLSAgMS4gTW9kdWxlcyBtdXN0IHJlcXVlc3QgdmlydHVhbCBhcnJheXMgKHdoaWNoIG1heSBoYXZlIG9ubHkgaW1hZ2UgbGlmZXNwYW4pCi0gICAgIGR1cmluZyB0aGUgaW5pdGlhbCBzZXR1cCBwaGFzZSwgaS5lLiwgaW4gdGhlaXIgamluaXRfeHh4IHJvdXRpbmVzLgotICAyLiBBbGwgImxhcmdlIiBvYmplY3RzIChpbmNsdWRpbmcgSlNBTVBBUlJBWXMgYW5kIEpCTE9DS0FSUkFZcykgbXVzdCBhbHNvIGJlCi0gICAgIGFsbG9jYXRlZCBkdXJpbmcgaW5pdGlhbCBzZXR1cC4KLSAgMy4gcmVhbGl6ZV92aXJ0X2FycmF5cyB3aWxsIGJlIGNhbGxlZCBhdCB0aGUgY29tcGxldGlvbiBvZiBpbml0aWFsIHNldHVwLgotICAgICBUaGUgYWJvdmUgY29udmVudGlvbnMgZW5zdXJlIHRoYXQgc3VmZmljaWVudCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKLSAgICAgZm9yIGl0IHRvIGNob29zZSBhIGdvb2Qgc2l6ZSBmb3IgdmlydHVhbCBhcnJheSBidWZmZXJzLgotU21hbGwgb2JqZWN0cyBvZiBhbnkgbGlmZXNwYW4gbWF5IGJlIGFsbG9jYXRlZCBhdCBhbnkgdGltZS4gIFdlIGV4cGVjdCB0aGF0Ci10aGUgdG90YWwgc3BhY2UgdXNlZCBmb3Igc21hbGwgb2JqZWN0cyB3aWxsIGJlIHNtYWxsIGVub3VnaCB0byBiZSBuZWdsaWdpYmxlCi1pbiB0aGUgcmVhbGl6ZV92aXJ0X2FycmF5cyBjb21wdXRhdGlvbi4KLQotSW4gYSB2aXJ0dWFsLW1lbW9yeSBtYWNoaW5lLCB3ZSBzaW1wbHkgcHJldGVuZCB0aGF0IHRoZSBhdmFpbGFibGUgc3BhY2UgaXMKLWluZmluaXRlLCB0aHVzIGNhdXNpbmcgcmVhbGl6ZV92aXJ0X2FycmF5cyB0byBkZWNpZGUgdGhhdCBpdCBjYW4gYWxsb2NhdGUgYWxsCi10aGUgdmlydHVhbCBhcnJheXMgYXMgZnVsbC1zaXplIGluLW1lbW9yeSBidWZmZXJzLiAgVGhlIG92ZXJoZWFkIG9mIHRoZQotdmlydHVhbC1hcnJheSBhY2Nlc3MgcHJvdG9jb2wgaXMgdmVyeSBzbWFsbCB3aGVuIG5vIHN3YXBwaW5nIG9jY3Vycy4KLQotQSB2aXJ0dWFsIGFycmF5IGNhbiBiZSBzcGVjaWZpZWQgdG8gYmUgInByZS16ZXJvZWQiOyB3aGVuIHRoaXMgZmxhZyBpcyBzZXQsCi1uZXZlci15ZXQtd3JpdHRlbiBzZWN0aW9ucyBvZiB0aGUgYXJyYXkgYXJlIHNldCB0byB6ZXJvIGJlZm9yZSBiZWluZyBtYWRlCi1hdmFpbGFibGUgdG8gdGhlIGNhbGxlci4gIElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCBuZXZlci13cml0dGVuIHNlY3Rpb25zCi1vZiB0aGUgYXJyYXkgY29udGFpbiBnYXJiYWdlLiAgKFRoaXMgZmVhdHVyZSBleGlzdHMgcHJpbWFyaWx5IGJlY2F1c2UgdGhlCi1lcXVpdmFsZW50IGxvZ2ljIHdvdWxkIG90aGVyd2lzZSBiZSBuZWVkZWQgaW4gamRjb2VmY3QuYyBmb3IgcHJvZ3Jlc3NpdmUKLUpQRUcgbW9kZTsgd2UgbWF5IGFzIHdlbGwgbWFrZSBpdCBhdmFpbGFibGUgZm9yIHBvc3NpYmxlIG90aGVyIHVzZXMuKQotCi1UaGUgZmlyc3Qgd3JpdGUgcGFzcyBvbiBhIHZpcnR1YWwgYXJyYXkgaXMgcmVxdWlyZWQgdG8gb2NjdXIgaW4gdG9wLXRvLWJvdHRvbQotb3JkZXI7IHJlYWQgcGFzc2VzLCBhcyB3ZWxsIGFzIGFueSB3cml0ZSBwYXNzZXMgYWZ0ZXIgdGhlIGZpcnN0IG9uZSwgbWF5Ci1hY2Nlc3MgdGhlIGFycmF5IGluIGFueSBvcmRlci4gIFRoaXMgcmVzdHJpY3Rpb24gZXhpc3RzIHBhcnRseSB0byBzaW1wbGlmeQotdGhlIHZpcnR1YWwgYXJyYXkgY29udHJvbCBsb2dpYywgYW5kIHBhcnRseSBiZWNhdXNlIHNvbWUgZmlsZSBzeXN0ZW1zIG1heSBub3QKLXN1cHBvcnQgc2Vla2luZyBiZXlvbmQgdGhlIGN1cnJlbnQgZW5kLW9mLWZpbGUgaW4gYSB0ZW1wb3JhcnkgZmlsZS4gIFRoZSBtYWluCi1pbXBsaWNhdGlvbiBvZiB0aGlzIHJlc3RyaWN0aW9uIGlzIHRoYXQgcmVhcnJhbmdlbWVudCBvZiByb3dzIChzdWNoIGFzCi1jb252ZXJ0aW5nIHRvcC10by1ib3R0b20gZGF0YSBvcmRlciB0byBib3R0b20tdG8tdG9wKSBtdXN0IGJlIGhhbmRsZWQgd2hpbGUKLXJlYWRpbmcgZGF0YSBvdXQgb2YgdGhlIHZpcnR1YWwgYXJyYXksIG5vdCB3aGlsZSBwdXR0aW5nIGl0IGluLgotCi0KLSoqKiBNZW1vcnkgbWFuYWdlciBpbnRlcm5hbCBzdHJ1Y3R1cmUgKioqCi0KLVRvIGlzb2xhdGUgc3lzdGVtIGRlcGVuZGVuY2llcyBhcyBtdWNoIGFzIHBvc3NpYmxlLCB3ZSBoYXZlIGJyb2tlbiB0aGUKLW1lbW9yeSBtYW5hZ2VyIGludG8gdHdvIHBhcnRzLiAgVGhlcmUgaXMgYSByZWFzb25hYmx5IHN5c3RlbS1pbmRlcGVuZGVudAotImZyb250IGVuZCIgKGptZW1tZ3IuYykgYW5kIGEgImJhY2sgZW5kIiB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGNvZGUKLWxpa2VseSB0byBjaGFuZ2UgYWNyb3NzIHN5c3RlbXMuICBBbGwgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IG1ldGhvZHMKLW91dGxpbmVkIGFib3ZlIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgZnJvbnQgZW5kLiAgVGhlIGJhY2sgZW5kIHByb3ZpZGVzCi10aGUgZm9sbG93aW5nIHJvdXRpbmVzIGZvciB1c2UgYnkgdGhlIGZyb250IGVuZCAobm9uZSBvZiB0aGVzZSByb3V0aW5lcwotYXJlIGtub3duIHRvIHRoZSByZXN0IG9mIHRoZSBKUEVHIGNvZGUpOgotCi1qcGVnX21lbV9pbml0LCBqcGVnX21lbV90ZXJtCXN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24vc2h1dGRvd24KLQotanBlZ19nZXRfc21hbGwsIGpwZWdfZnJlZV9zbWFsbAlpbnRlcmZhY2UgdG8gbWFsbG9jIGFuZCBmcmVlIGxpYnJhcnkgcm91dGluZXMKLQkJCQkob3IgdGhlaXIgZXF1aXZhbGVudHMpCi0KLWpwZWdfZ2V0X2xhcmdlLCBqcGVnX2ZyZWVfbGFyZ2UJaW50ZXJmYWNlIHRvIEZBUiBtYWxsb2MvZnJlZSBpbiBNU0RPUyBtYWNoaW5lczsKLQkJCQllbHNlIHVzdWFsbHkgdGhlIHNhbWUgYXMKLQkJCQlqcGVnX2dldF9zbWFsbC9qcGVnX2ZyZWVfc21hbGwKLQotanBlZ19tZW1fYXZhaWxhYmxlCQllc3RpbWF0ZSBhdmFpbGFibGUgbWVtb3J5Ci0KLWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlCQljcmVhdGUgYSBiYWNraW5nLXN0b3JlIG9iamVjdAotCi1yZWFkX2JhY2tpbmdfc3RvcmUsCQltYW5pcHVsYXRlIGEgYmFja2luZy1zdG9yZSBvYmplY3QKLXdyaXRlX2JhY2tpbmdfc3RvcmUsCi1jbG9zZV9iYWNraW5nX3N0b3JlCi0KLU9uIHNvbWUgc3lzdGVtcyB0aGVyZSB3aWxsIGJlIG1vcmUgdGhhbiBvbmUgdHlwZSBvZiBiYWNraW5nLXN0b3JlIG9iamVjdAotKHNwZWNpZmljYWxseSwgaW4gTVMtRE9TIGEgYmFja2luZyBzdG9yZSBmaWxlIG1pZ2h0IGJlIGFuIGFyZWEgb2YgZXh0ZW5kZWQKLW1lbW9yeSBhcyB3ZWxsIGFzIGEgZGlzayBmaWxlKS4gIGpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIGlzIHJlc3BvbnNpYmxlIGZvcgotY2hvb3NpbmcgaG93IHRvIGltcGxlbWVudCBhIGdpdmVuIG9iamVjdC4gIFRoZSByZWFkL3dyaXRlL2Nsb3NlIHJvdXRpbmVzCi1hcmUgbWV0aG9kIHBvaW50ZXJzIGluIHRoZSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgYSBnaXZlbiBvYmplY3Q7IHRoaXMKLWxldHMgdGhlbSBiZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBvYmplY3QgdHlwZXMuCi0KLUl0IG1heSBiZSBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgYmFja2luZyBzdG9yZSBvYmplY3RzIGFyZSBleHBsaWNpdGx5Ci1yZWxlYXNlZCB1cG9uIGFibm9ybWFsIHByb2dyYW0gdGVybWluYXRpb24uICBGb3IgZXhhbXBsZSwgTVMtRE9TIHdvbid0IGZyZWUKLWV4dGVuZGVkIG1lbW9yeSBieSBpdHNlbGYuICBUbyBzdXBwb3J0IHRoaXMsIHdlIHdpbGwgZXhwZWN0IHRoZSBtYWluIHByb2dyYW0KLW9yIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIHRvIGFycmFuZ2UgdG8gY2FsbCBzZWxmX2Rlc3RydWN0ICh0eXBpY2FsbHkgdmlhCi1qcGVnX2Rlc3Ryb3kpIHVwb24gYWJub3JtYWwgdGVybWluYXRpb24uICBUaGlzIG1heSByZXF1aXJlIGEgU0lHSU5UIHNpZ25hbAotaGFuZGxlciBvciBlcXVpdmFsZW50LiAgV2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRoZSBiYWNrIGVuZCBtb2R1bGUgaW5zdGFsbCBpdHMKLW93biBzaWduYWwgaGFuZGxlciwgYmVjYXVzZSB0aGF0IHdvdWxkIHByZS1lbXB0IHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbidzCi1hYmlsaXR5IHRvIGNvbnRyb2wgc2lnbmFsIGhhbmRsaW5nLgotCi1UaGUgSUpHIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBzZXZlcmFsIG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kIGltcGxlbWVudGF0aW9ucy4KLVVzdWFsbHkgdGhlIHNhbWUgYmFjayBlbmQgc2hvdWxkIGJlIHN1aXRhYmxlIGZvciBhbGwgYXBwbGljYXRpb25zIG9uIGEgZ2l2ZW4KLXN5c3RlbSwgYnV0IGl0IGlzIHBvc3NpYmxlIGZvciBhbiBhcHBsaWNhdGlvbiB0byBzdXBwbHkgaXRzIG93biBiYWNrIGVuZCBhdAotbmVlZC4KLQotCi0qKiogSW1wbGljYXRpb25zIG9mIEROTCBtYXJrZXIgKioqCi0KLVNvbWUgSlBFRyBmaWxlcyBtYXkgdXNlIGEgRE5MIG1hcmtlciB0byBwb3N0cG9uZSBkZWZpbml0aW9uIG9mIHRoZSBpbWFnZQotaGVpZ2h0ICh0aGlzIHdvdWxkIGJlIHVzZWZ1bCBmb3IgYSBmYXgtbGlrZSBzY2FubmVyJ3Mgb3V0cHV0LCBmb3IgaW5zdGFuY2UpLgotSW4gdGhlc2UgZmlsZXMgdGhlIFNPRiBtYXJrZXIgY2xhaW1zIHRoZSBpbWFnZSBoZWlnaHQgaXMgMCwgYW5kIHlvdSBvbmx5Ci1maW5kIG91dCB0aGUgdHJ1ZSBpbWFnZSBoZWlnaHQgYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3Qgc2Nhbi4KLQotV2UgY291bGQgcmVhZCB0aGVzZSBmaWxlcyBhcyBmb2xsb3dzOgotMS4gVXBvbiBzZWVpbmcgemVybyBpbWFnZSBoZWlnaHQsIHJlcGxhY2UgaXQgYnkgNjU1MzUgKHRoZSBtYXhpbXVtIGFsbG93ZWQpLgotMi4gV2hlbiB0aGUgRE5MIGlzIGZvdW5kLCB1cGRhdGUgdGhlIGltYWdlIGhlaWdodCBpbiB0aGUgZ2xvYmFsIGltYWdlCi0gICBkZXNjcmlwdG9yLgotVGhpcyBpbXBsaWVzIHRoYXQgY29udHJvbCBtb2R1bGVzIG11c3QgYXZvaWQgbWFraW5nIGNvcGllcyBvZiB0aGUgaW1hZ2UKLWhlaWdodCwgYW5kIG11c3QgcmUtdGVzdCBmb3IgdGVybWluYXRpb24gYWZ0ZXIgZWFjaCBNQ1Ugcm93LiAgVGhpcyB3b3VsZAotYmUgZWFzeSBlbm91Z2ggdG8gZG8uCi0KLUluIGNhc2VzIHdoZXJlIGltYWdlLXNpemUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIHRoaXMgYXBwcm9hY2ggd2lsbAotcmVzdWx0IGluIHZlcnkgaW5lZmZpY2llbnQgdXNlIG9mIHZpcnR1YWwgbWVtb3J5IG9yIG11Y2gtbGFyZ2VyLXRoYW4tbmVjZXNzYXJ5Ci10ZW1wb3JhcnkgZmlsZXMuICBUaGlzIHNlZW1zIGFjY2VwdGFibGUgZm9yIHNvbWV0aGluZyB0aGF0IHByb2JhYmx5IHdvbid0IGJlIGEKLW1haW5zdHJlYW0gdXNhZ2UuICBQZW9wbGUgbWlnaHQgaGF2ZSB0byBmb3JnbyB1c2Ugb2YgbWVtb3J5LWhvZ2dpbmcgb3B0aW9ucwotKHN1Y2ggYXMgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIG9yIG5vbmludGVybGVhdmVkIEpQRUcgZmlsZXMpIGlmIHRoZXkKLXdhbnQgZWZmaWNpZW50IGNvbnZlcnNpb24gb2Ygc3VjaCBmaWxlcy4gIChPbmUgY291bGQgaW1wcm92ZSBlZmZpY2llbmN5IGJ5Ci1kZW1hbmRpbmcgYSB1c2VyLXN1cHBsaWVkIHVwcGVyIGJvdW5kIGZvciB0aGUgaGVpZ2h0LCBsZXNzIHRoYW4gNjU1MzY7IGluIG1vc3QKLWNhc2VzIGl0IGNvdWxkIGJlIG11Y2ggbGVzcy4pCi0KLVRoZSBzdGFuZGFyZCBhbHNvIHBlcm1pdHMgdGhlIFNPRiBtYXJrZXIgdG8gb3ZlcmVzdGltYXRlIHRoZSBpbWFnZSBoZWlnaHQsCi13aXRoIGEgRE5MIHRvIGdpdmUgdGhlIHRydWUsIHNtYWxsZXIgaGVpZ2h0IGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IHNjYW4uCi1UaGlzIHdvdWxkIHNvbHZlIHRoZSBzcGFjZSBwcm9ibGVtcyBpZiB0aGUgb3ZlcmVzdGltYXRlIHdhc24ndCB0b28gZ3JlYXQuCi1Ib3dldmVyLCBpdCBpbXBsaWVzIHRoYXQgeW91IGRvbid0IGV2ZW4ga25vdyB3aGV0aGVyIEROTCB3aWxsIGJlIHVzZWQuCi0KLVRoaXMgbGVhZHMgdG8gYSBjb3VwbGUgb2YgdmVyeSBzZXJpb3VzIG9iamVjdGlvbnM6Ci0xLiBUZXN0aW5nIGZvciBhIEROTCBtYXJrZXIgbXVzdCBvY2N1ciBpbiB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZGVjb21wcmVzc29yJ3MKLSAgIEh1ZmZtYW4gZGVjb2RlcjsgdGhpcyBpbXBsaWVzIGEgc3BlZWQgcGVuYWx0eSB3aGV0aGVyIHRoZSBmZWF0dXJlIGlzIHVzZWQKLSAgIG9yIG5vdC4KLTIuIFRoZXJlIGlzIG5vIHdheSB0byBoaWRlIHRoZSBsYXN0LW1pbnV0ZSBjaGFuZ2UgaW4gaW1hZ2UgaGVpZ2h0IGZyb20gYW4KLSAgIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBkZWNvZGVyLiAgVGh1cyAqZXZlcnkqIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBJSkcKLSAgIGxpYnJhcnkgd291bGQgc3VmZmVyIGEgY29tcGxleGl0eSBwZW5hbHR5IHdoZXRoZXIgaXQgY2FyZWQgYWJvdXQgRE5MIG9yCi0gICBub3QuCi1XZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgRE5MIGJlY2F1c2Ugb2YgdGhlc2UgcHJvYmxlbXMuCi0KLUEgZGlmZmVyZW50IGFwcHJvYWNoIGlzIHRvIGluc2lzdCB0aGF0IEROTC11c2luZyBmaWxlcyBiZSBwcmVwcm9jZXNzZWQgYnkgYQotc2VwYXJhdGUgcHJvZ3JhbSB0aGF0IHJlYWRzIGFoZWFkIHRvIHRoZSBETkwsIHRoZW4gZ29lcyBiYWNrIGFuZCBmaXhlcyB0aGUgU09GCi1tYXJrZXIuICBUaGlzIGlzIGEgbXVjaCBzaW1wbGVyIHNvbHV0aW9uIGFuZCBpcyBwcm9iYWJseSBmYXIgbW9yZSBlZmZpY2llbnQuCi1FdmVuIGlmIG9uZSB3YW50cyBwaXBlZCBpbnB1dCwgYnVmZmVyaW5nIHRoZSBmaXJzdCBzY2FuIG9mIHRoZSBKUEVHIGZpbGUgbmVlZHMKLWEgbG90IHNtYWxsZXIgdGVtcCBmaWxlIHRoYW4gaXMgaW1wbGllZCBieSB0aGUgbWF4aW11bS1oZWlnaHQgbWV0aG9kLiAgRm9yCi10aGlzIGFwcHJvYWNoIHdlJ2Qgc2ltcGx5IHRyZWF0IEROTCBhcyBhIG5vLW9wIGluIHRoZSBkZWNvbXByZXNzb3IgKGF0IG1vc3QsCi1jaGVjayB0aGF0IGl0IG1hdGNoZXMgdGhlIFNPRiBpbWFnZSBoZWlnaHQpLgotCi1XZSB3aWxsIG5vdCB3b3JyeSBhYm91dCBtYWtpbmcgdGhlIGNvbXByZXNzb3IgY2FwYWJsZSBvZiBvdXRwdXR0aW5nIEROTC4KLVNvbWV0aGluZyBzaW1pbGFyIHRvIHRoZSBmaXJzdCBzY2hlbWUgYWJvdmUgY291bGQgYmUgYXBwbGllZCBpZiBhbnlvbmUgZXZlcgotd2FudHMgdG8gbWFrZSB0aGF0IHdvcmsuCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC90ZXN0aW1nLmJtcCBiL2xpYmpwZWd0d3JwL3Rlc3RpbWcuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjAzZDE1Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3Rlc3RpbWcuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvdGVzdGltZy5qcGcgYi9saWJqcGVndHdycC90ZXN0aW1nLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0Y2E1ZC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC90ZXN0aW1nLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3Rlc3RpbWcucHBtIGIvbGlianBlZ3R3cnAvdGVzdGltZy5wcG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODFjZTIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvdGVzdGltZy5wcG0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVA2Ci0yMjcgMTQ5Ci0yNTUKLTAvLTAvLTEwLjIxLzUxLjUxLjYyLzYyLzgzLzgzLzozLTozLTozLTozLTozLTozLToyLzkxLjkxLjgwLTgwLTkxLjkxLjoyLzgwLTgwLTgwLTgwLTgwLTgwLTgwLTgwLTYuKzYuKzYuKzUtKjUtKjQsKTQsKTQsKTQsKTQsKTQsKTQsKTQsKTQsKTQsKTItKS8qJC8sJS8sJTAtJjEuJzIvKDMwKTMwKTYzLDYzLDc0LTg1Ljg1Ljk2Lzo3MDo3LkE6MEI8MEQ+MkZANElBNEpCNUtDNktDNk1ENU1ENU9DM05CMk9DM09DM1BENFJFNVI/MVk/MmJANG5CNX1FNotIOJlHOaNGN69HOrhHOb5FOsVHO8dHPspHP8tIQNBFQOdGTO1DTOtES+tFSe5DSe9CRPE+QvQ9Qfg7Qfc6QPQ6P/A8P+k/QOJAPtc/PMtBN7s9L7VALrVALrQ/LbQ/LbNALbI/La9ALa1ALKpBLKZBLaJCLJ9AKptBKZhAKpZBLJQ+LZI/L5I/L5E+LpE+LJA9K5I8K5I8K5Q/K5Q/K5Q9KpQ9KpQ9KpU+K5Y/LJZAL5Y/NpU+NZc9Mp8/MalCM7NEM7xENL9ENLk/MLVBMqxGOJ5IO4dIOW9BMlQ4KkMzJj01Mjk1NDk1NDczMjcxMTYwMDUwLTUwLTcyLzcyLzcyLzYxLjYxLTUwLDUwLDQxLC8vLS4wLS8vLS8vLTAvLTAvLTIuLTIuLTUsLTQrLDQqKzMpKjcoKz0uMUU2OVA6PGpCQ3xJSI1NTZVPT59XW6pkbqpvg590kJR7o4d/roCGun6IvXN5rWBhkVRLdlBEaFNKZ09HXk1IXlRRYmZkb3x9go2RkJmemKOpn6Komp6gk4+SgXt8bGZnVVhXRVFORVVSW1VRYlVRYjAvLTAvLTEwLjEwLjQwLTUxLjYyLzYyLzgzLzgzLzozLTozLTozLTozLTozLTozLTkxLjkxLjgwLTgwLTgwLTgwLTkxLjkxLjgwLTgwLTgwLTgwLTgwLTgwLTgwLTgwLTYuKzYuKzUtKjUtKjUtKjQsKTQsKTQsKTUtKjUtKjUtKjUtKjUtKjUtKjUtKjMuKjArJTAtJjAtJjEuJzIvKDMwKTQxKjQxKjYzLDYzLDc0LTc0LTg1Ljk2Lzo3MDo3LkA5L0E7L0M9MUU/M0hAM0lBNEpCNUpCNUxDNExDNE1BMU1BMU1BMU5CMk9DM1FENFA+MFU/MV5BM2pDNHhENoRFNJJFNZxDM6dDNK9BNLVBNLxCN8BEOsRFPMVGPc1DQOFFSedCSehDSepESO1ER+9CRPNAQ/Y/Q/g7Qfc6QPQ6P/A8P+k/QOBBPtVAPMpANrk+L7VALrQ/LbQ/LbQ/LbI/LLA/La9ALa1ALKlAK6ZBLaFBK59AKptBKZhAKpZBLJQ+LZI/L5E+LpE+LpE+LJA9K5I8K5I8K5Q/K5M+KpQ9KpQ9KpQ9KpU+K5Y/LJZAL5RANZU+NZg+M6A+MatBM7VENL1DNL9ENbtBMrdDNqxGOJxJO4VHOmxAM1M5KkI0KT42Mzo2NTk1NDg0MzgyMjcxMTYxLjYxLjcyLzcyLzcyLzYxLjYxLTUwLDUwLDQxLC8vLS4wLS8vLS8vLTAvLTAvLTIuLTIuLTMtLTUsLTQqKzMpKjUpKzwtMEM0N044OmQ+PXZFQYZKSY9OTJpUVqRhaqVsfZ1yjpF7ooaArn+FuXuEu291qVtbjVFIdU9DaU9GZU9HX1BIX1JOX1tZZm5vdIOHiJSZlZmel5qglJmdj4+Rg35/b2prWV1bTFZTSlhTWlZSYVhRYS8uLC8uLDAvLTEwLjQwLTQwLTUxLjUxLjcyLjcyLjcyLjcyLjkyLDkyLDkyLDkyLDkxLjgwLjcvLTcvLTcvLTcvLTgwLjkxLzgwLjgwLjgwLjgwLjgwLjgwLjgwLjgwLjYuLDUtKzUtKzUtKzQsKjQsKjQsKjQsKjUtKzUtKzUtKzUtKzUtKzUtKzUtKzMuKjItJzEuJzIvKDMwKTMwKTQxKjQxKjUyKzYzLDYzLDYzLDc0LTg1Ljk2Lzk2Lzo3Lj84LkA6LkI8MEQ+Mkc/NEhANUhAM0hAM0lAMUlAMUs/MUs/MUs/L0xAME1BMU5CMk1BMVFBMVlCMmRDMnFDM3xDModCMpJBMJg8LaA6K6c7Lq89MrVANrpEOr9GPcVEPtlDReFARuNCR+dCRupERvBDRfRBRPg/RPo7QPk6P/U7QPA9QOhAQNxBPdFAO8ZANbc9LrNALbNALbI/LLI/LbA/La8+LK1ALKo/LadALaVALKFBK51BLJo/KphAKpVAK5Q+LZE+LpE+LpE+LpA9K5A9K5A9K5A9K5E+LJE+LJI8K5I8K5M9LJM9LJQ/K5U/LpVBNpY/NZo+M6M+Mq9BNLlDNb9ENcFDNcBEOLhGO65JPZlKPYFHO2hANFE6LEI1LD83ND03Nzw2Njo0NDk0MTgzMDcyLzcyLzYyLzYyLzYyLzUxLjUyLTQxLDQxLDIxLC4wLSwxLS4wLS4wLS8vLS8vLTAvLTIuLTUvLzQuLjUsLTQqKzQqKzktLz4yNEk1Nls5N2w/OXxFQIZJRJBPTZhbYJtmdpRtiIx3noN9rX2CuXV+t2ZtpFRWiU1FdkxBa01BZU9GY1FIY01IXk5LXFtbZXF0eYWJiIeMhoqPiI2QhYaKfHh6bGZpWFpbTVZTTFpVW1pUYFtTYC4tKy8uLC8uLDAvLTMvLDQwLTQwLTQwLTYxLTYxLTYxLTYxLTgxKzgxKzgxKzgxKzcvLTcvLTYuLDYuLDYuLDYuLDcvLTcvLTgwLjgwLjgwLjgwLjgwLjgwLjgwLjgwLjUtKzUtKzUtKzQsKjQsKjQsKjMrKTMrKTYuLDYuLDYuLDYuLDYuLDYuLDYuLDQvLDMwKzMwKTMwKTQxKjQxKjUyKzUyKzUyKzUyKzUyKzYzLDc0LTg1Ljg1Ljk2Lzk2LT43LT85LUA6LkI8MEU9MkU9MkY+MUY+MUc9MUc+L0g8Lkk9L0k9L0o+LkxAMEpBMEtEMk5FNFVENF5EM2lEMnNCMX5BL4Y/LYw5KZQ5J505KqM8LaxAM7NFOLhIPMFGPtJEQ9pBQ95CQ+JEQ+dDROxCQ/NAQ/c/Qfo7QPk6P/U7QO4+QOVBQNpCPc1AOcJAM7U9LbBALLBALLBALK8+LK4/LK4/LKw/K6lALaY/LKNAK6BAKpxAK5hAKpZAKZQ/KpE+LJE+LpE+LpA9LZA9K5A9K488Ko88KpA9K5A9K488Ko88KpI8K5E+LJQ+LZI/LZVBNpY/NZw+MqZANLJCNrxDOMFDN8JCN8JGPLpKP6xMQJdLPnxGOmJANEw6LkE3LUA4NT45Nj03Nzw3NDo1Mjk0MTgzMDgzMDYyLzYyLzYyLzMyLjUyLTIxLDIxLDEyLS0yLi0yLi8xLi8xLjAwLjAwLjEwLjEwLjUxMDYwMDUvLzUsLTQrLDYsLTowMUQyMlQ3MWM7M3FBN3tFO4JIRIlSVY1fbItpgoNzmH15q3h9tW93tWBmolFSi0xFeUxAcExAaFBFZ1FGZkxDXkdCVk1MWl5eZmpucXV5eHh9d3qAdnd6b2tvYWBiVFdZTFRUTF1XWV1WXV1WXi0tLS0tLS4tKy8uLDAvLTEwLjMvLDQwLTMvLDMvLDQvKzQvKzQvKzQvKzYvKTYvKTQvLDQvLDMuKzMuKzMuKzMuKzQvLDQvLDUwLTUwLTUwLTUwLTUwLTUwLTUwLTUwLTMuKzMuKzItKjItKjItKjEsKTEsKTEsKTQvLDQvLDQvLDQvLDQvLDQvLDQvLDQvLDQxLDQxLDQxLDQxLDQxLDUyLTUyLTUyLTUyLTUyLTYzLjYzLjc0Lzg1MDk2MTk2Lzw1LT02LD84LkA5L0I6L0M7MEM7MEM7LkQ6LkQ6LkY6Lkc7LUg8Lkk9L0o+MElAMUpHNk1INVJHNVlGNWJFM2pEMXVCL30+LII7KYs6KZM6Kpo9LKNCMqxGOLJKPbtJP8xHQtREQ9hEQt1FQuJCQulBQfA9QPQ8Pvk6P/g6PPQ8Pu0/PuFCPtNDOsVBNbk/MLI/La4/LK4/LK4/LK0+Law+Law+Lao/Lag+LqQ/LaA/LJ4/K5o/LJc/K5U+KpM+KpE+LJA/Lo8+LY8+LY8+LY49LI49LI49LI49LI49LI49LI49LI88LI8+LZE+LpA/LpRCNJdBNJ1AMahAM7ZBN79DOcVCOMRBN75DO7dIP6ZMQ5BKQHRFO1o+MkU5LTw1K0A5M0A4NT83NT42Mz01Mjw0MTk0MDgzLzYyLzQzLzQzLzIzLjMyLjEyLTEyLTAyLS0yLiwyLi0yLi0yLi8xLi8xLjAwLjEwLjMyMDUxMDUxMDQuLjIsLDQrLDcuLz0vLk41Llk5LmU9MW5AM3NCO3lLS4BaZYNngH9wl3p4qnV7t2tztF9kplRUlE9Hg0xCd05BbU5CaE1BZUpBYEdCWUdGWEtLV01QVV1jY2BmYmJpYWBmXFpgVFdbTVVYTVhYUF5ZVmBXWGBXWiwsLCwsLC4tKy4tKy8uLDAvLTMvLDMvLDIuKzIuKzMuKjMuKjMuKjMuKjUuKDUtKjMuKzMuKzItKjEsKTEsKTItKjMuKzMuKzMuKzMuKzMuKzMuKzMuKzMuKzMuKzMuKzItKjItKjItKjItKjEsKTEsKTEsKTArKDMuKzMuKzMuKzMuKzMuKzMuKzMuKzMuKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDUyLTUyLTYzLjc0Lzg1MDg1MDg1Ljs0LDw1Kz02LD43LUA3LkE5LkE5LkE5LkM5L0M5LUU5LUY6Lkc7L0g8Lko+MEhBMUpHNklINk5HNVZGNlxFM2RDMm5AMHY+LXs8K4I7KYw7KpQ9LJxAMaNGNapKOrRKPcRIQMxFQdFGQdZFQN5DQeRAPuw+P/E6PPc7PPQ6O/A8PelAPdxDPc1DOL5AMrE+LK4/LKtALKo/K6o/K6o/Lak+LKk+LKg/LKU+LaI/LKA/LJs+LJc/K5U+KpM+KZE/Ko8+K48+LY8+LY8+LY49LI49LI49LI08K449LIs8K408K4s8K4s8LYw9LI0+L44/LpRCNJdBMqBAMqxCNblDOcJDOsVCOsJBO7pBObFJQKNOR41ORW9HPVM/NEE7Lzk2LUA5M0E3NT83ND42Mzw0MTk0MDgzLzc0LzQzLzQzLzM0LzIzLjIzLjAyLTAyLS4zLS0zLy0zLy4zLy4zLzAyLzAyLzExLzExLzIxLzMyMDMyMDQwLzIuLTEtLDQuLjguLEc0LU80KVg4K2A8MGU/Nm1HRnlZZIJrhYB1n3x8snd8vG51u2Ror1tboVJNj0xCfk9BckxAaEk9Y0g+YEhCXkVDWEBCTztARkJHSkRNSkpRSkpRSUlRRktRRU9VSVZXT15ZU2BZU2BYVSsrKysrKywsLC0tLS8uLC8uLDAvLTAvLTEtKjEtKjEtKjEtKjItKTItKTItKTItKTItKjIsLDErKzErKzErKzErKzIsLDIsLDErKzErKzErKzErKzErKzErKzErKzErKzIsLDIsLDIsLDErKzErKzErKzAqKjAqKjMtLTMtLTMtLTMtLTMtLTMtLTMtLTMuKzQxLDQxLDQxLDMwKzMwKzMwKzMwKzMwKzQxLDQxLDUyLTYzLjc0Lzc0Lzg1MDg1LjozKzs0LDw1LT02Lj82Lz82LT82LT83LEI4LkI4LkU4L0U5LUc7L0g8MEo+MkhAM0hFNkdGNEtFNVFENFhDMl9CMmY/Lm49LHY9LHw6KoU5KYw7KpM9LptCMqJGN6xGOLtGPMJGPslGPtBFPtlEQOJDP+pAQPA+PvI6OvE7Ouw8PORBPNZDO8ZENrVAL6o9Kao/LalALalALag/LKg+Lqg+Lqc9LaU+LaM9LqA/Lp4/LZo/LZY/LJM+KpE/Ko8+KY8+K40+LY0+LYw9LIw9Low9Los8LYs8LYs8LYo9LYo7LIk8LIo8L4s+Los9MIw/L5JDMphCMaFBMa5CNrxDOsJDPMRDPcBDPblGQbJRSqVYUo9YUXNSSVdJPkNDNzw/Nj45M0A3Mj43MT02MDo1Lzk0LjgzLzYzLjQzLjQzLjM0LzEzLjEzLi4zLS4zLS4zLS0zLy0zLy0zLy0zLy4zLy4zLzAyLzAyLzAwLjExLzIyMDIxLzAvLS8uLDIuLTQvLD8wK0QwKUszKVQ4LVo8NGRGRnVdaoNzjYmAq4WEvn6Dx3R6xm1wvWNlr1ZTmkxDgks/cUk8Z0c7Y0U+X0ZCXURCVz9BTjs/SDpCRT5IR0RNSEdRSUdRSEpSR05WS1VYTV5aT2FZTmFYTysrKysrKywsLCwsLC4sLS8uLDAvLTAvLTEtKjEtKjEtKjEtKjItKTItKTItKTItKjIsLDErKzErKzAqKjAqKjErKzErKzIsLDAqKjAqKjAqKjAqKjAqKjAqKjAqKjAqKjIsLDIsLDIsLDErKzErKzAqKjAqKjAqKjIsLDIsLDIsLDIsLDIsLDIsLDIsLDIsLDMvLDMwKzMwKzMwKzMwKzMwKzMwKzMwKzQxLDQxLDUyLTYzLjYzLjc0Lzg1MDg1MDkyLDozKzs0LDw1LT41Lj41Lj41Lj41LEI4L0I4LkU4L0U4L0c6MUk9MUo+Mkk/M0ZDNEZDNEpCNU9BNFRBMlxAMmI+MGo8LXE8Lnc5Kn04KYU4KIw6LJU9L5tCNKRCNbJGOrpFO8FGPspHP9RHQN5GQedDQe5CQO07O+s7O+c+O99CO9FEOr9ENK9ALaQ+KKZBLaZBLaVALKVALqVALqQ/LaQ/LaQ+L6I+Lp9ALpw/Lpg/LZU+K5E/Ko8+KY8+K40+LY0+LY0+LYw9LIw9Los8LYs8LYo9LYo9LYg8Log8Log8Log8L4c+L4g+MYs/MZFEMpZDMaJCNK1DNrpDO8FEPsFEPrtFQblQTLJbVKVlXJFmXXVfVFtVSUdNQUNJPzw5Mj84Mj43MTs2MDk0Ljc0LTYzLjQzLjQzLjM0LjI0LzEzLi80Li4zLS4zLS4zLS0zLy0zLy0zLy0zLy4zLy4zLzAyLzAyLy8vLTAwLjIyMDIyMDEwLjAvLTAvLTMvLDgsLDssKUMwKks3MFM8Nl5JSHRibod6lJCKtoyNxoSIz3qAzHJ4xmlrtldXn0lEhEU9bkc8ZEQ8YUM+XkNBWUBDVkBEUD5FS0dRUktXVVFeV1VgWFNfVVJeVFReU1lfU15bTGFaSmFaSiwtLywtLywtLywuLS0tLS0tLS4tKy4tKy8uLC8uLDEtKjAsKTAsKTAsKS8rKC8rKC8rKi8rKi8rKi8rKi8rKi8rKi8rKjAsKy8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKjAsKzAsKzEtLDEtLDIuLTEtLDEtLDEtLDEtLDEtLDEtLDEtLDEtLDAsKTEtKjIuKzMvLDMvLDMvLDMvLDMvLDMvLDMvLDMvLDMvLDQwLTUxLjYyLzc0LzgwLTkyLDozLTs0Lj00Lz41Lj41Lj41Lj80Lj81LEI1LUM2LkQ3L0Y5MEc6MUY8Mkc/NEhANUpANlA/NVQ+M1g8MV45MGI2K205LnQ4LXw4K4M5LI07L5M9MJg/MZ4+MKdBM61BNLVDOL5FOspHPdRHPt5FP+VDQOhAP+pCQeZEQdpFPshEOLdCMapBLqJCLKJBLqFALaI/LKI+LqE9LaE9LaI+LqA/L5w8LJo9LJg8LZU+LZM9LJA9K449Kow+Kos8K4s8K4o9LYk8LIk8LIk8LIg6LYc7LYk9L4Y8L4Y8L4c9MIg+M4hAMolBNYtBNJFFNZdENKNFObFJPrpHQLtEPrtFQbhNR7RaUq9mX6NxZpFzaH5yZGpqXlZeU0lRRkxMQkpGPUI+NTw4Lzk1LDc0KzYzLDMzKzQzLjM0LjE0LTE0LTAyLS8xLCwxKywxKy0yLi0yLi0yLi0yLi8xLi8xLi8xLi8xLjAyLzAyLzExLzExLzExLzExLzExLzQwLzQrMDsvM0EzMkM0L0o7Nl1PT3lteYuFn5OQu5SWz5CV2YOJ03R6xmput19ip1pblExJdEhCZEE+XT4+WD9CVUFJVkxVXFVgYmJxbm59eHaGfHJ/dWx5b2d1aF9rX1dfUF1cSGJcRmNdRywtLywtLywtLywtLy0tLS0tLS4sLS4tKy8uLC4tKzAsKTAsKS8rKC8rKC8rKC8rKC4qKS4qKS4qKS4qKS8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKjAsKzAsKzAsKzEtLDEtLDEtLDEtLDEtLDEtLDEtLDEtLDEtLDEtLDAsKzAsKTEtKjIuKzMvLDMvLDIuKzIuKzIuKzIuKzIuKzIuKzMvLDQwLTUxLjYyLzgwLjkxLjoyLzs0Lj00Lz41MD41MD00LT80Lj80LkE0LkI1LUM2LkU4MEc6Mkg7M0g+NUg+NUw9Nk8+NlE9NFY7Mlo5MF83L2g3MHA3Lnc3LYE5LYk5LpA8MZY8MZs9MaJAM6dBM6xCNbREOL5FOslGPNRFPdtEPd9EQOBFQN5GQdRHPsRGOLJDMqVCLZ5CLZ9DLp5CLZ9ALp4/LZ4/LZ4/LZ4+Lp4+Lpo9LJk+LJY9LZQ9LJA9K48+K4w+Kow9LIs8K4o9K4k8LIk8LIk8LIc7K4c7LYU8LYY8L4U9L4U9MYM9MYQ+MoZANodBN4hCNpNHOZdFN6NHPK9KQLhJQrhHQbdMRrNUTrFkXKpxZp9+b5B/b398bW1zZVpmWk5YTUxOQUtJPUVDN0A9ND06MTg4LjQ0LDExKTIzLTIzLTAzLC8yKy8xLC4wKy4wKy4wKy8xLi0yLi8xLi8xLi8xLi8xLi8xLi8xLjAyLzAyLzExLzExLzExLzExLzExLzIwMTUrNDktNzwyMz81M0g/Ol5WVHhyfIqInpOTuZSXypCW1ISLz3mBwnF5uGt0rWhunlxfgFhacVNValJXalReaFpnbWZ2dnKCf3SIf36Sh4OViX6OgXaGeXKAcWZ0ZVplVFtaRWBaQGJcRCwtLywtLywtLywtLywtLywuLS0tLS0tLS4tKy4tKy4tKy0sKi8rKC4qJy4qJy4qJywrKSwqKywqKywqKyspKispKispKispKi0rLC0rLC0rLC0rLC0rLC0rLC0rLC0rLCwqKywqKy0rLC0rLC0rLC4sLS4sLS4sLS4sLS4sLS4sLS8tLi8tLi8tLi8tLi8uLDAsKzAsKzEtLDIuLTIuLTIuLTIuLTEtLDEtLDEtLDEtLDEtLDIuLTMvLjQwLzUxLjgwLjkxLjoyLzszMD0zMT00Lz00Lz00Lz80MD80LkE0LkE0LkM2MEQ3MUY5M0c6NEg7NUo7Nks8N049NlA7NlM6NVY3Mls2LmM2MGs2LnQ1LH03L4c5L407MJQ8MJY8MZ0/M6BANKJAM6hAM7FDNrpEOMVFOs1EOtVGQNdIQNRJQsxJP75FOq5DM6FCLpxBLp1CL5xBLpw/Lps+LZs+LZs+LZs+L5s/MJg8LZY9LZQ8LpM9Lo8+LYw9LIs8K4o9K4k8Kok8Kok8LIc7K4c7LYU8LYQ6LYM7LYQ8MII8MII8MoI+M4M/NIVBOIdDOohEOZRKPZdIO6BIPqxLRLJLRrNMR7JTTa5gVq1zZ6aBcZ2MepGOe4KJd3OAb2NxYlhjVU5SRE1OQEhJO0REOEBANDk7LjQ2Ky8xJjAxKTAxKS8wKi8wKi4vKi4vKi8vLS8vLS8vLS4wLS8vLS8vLS8vLS8vLS8vLS8vLTAwLjAwLjAwLjAwLjAwLjAwLjAwLjEvMjYrOTcrOTgvNDs2M0hFPl9eWXp6fIuNmpCUsZKXv4+Vx4SOw32Ju3uJtnyLsn2Mq32ImneDj3F+h259gm5+fm+CfnmOhYOZjYuhlJGomJCllIidioOWg3yNe2p7aVxoVFhYQF1ZPF9bQC0uMC0uMC0uMC0uMC0uMC0uMC4uLi4uLi4tKy4tKy0sKi0sKi4qJy4qJy4qJy4qKSwqKyspKispKispKispKiooKSooKSooKSwqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKy0rLC0rLC0rLC0rLC4sLS4sLS4sLS4sLS8tLi8tLi8tLi8rKjAsKzEtLDEtLDEtLDEtLDAsKzAsKzAsKzAsKzAsKzAsKzEtLDIuLTMvLjQwLzkxLzoyMDszMTw0MT0zMT0zMT0zMT00Lz4zLz4zL0AyL0AzLUE0LkM2MEQ3MUU4MkY5M0g5NEk6NUo7Nkw6Nk45NFE4M1Q1MF43MmU2MG82L3g4L4I5MIo6L5A8MZQ+MZk/NJs/NJs/Mp8/MaVBMq5CNbhEN79FOsdHPstIQMpKQcNJPrZGOqpCNZ5BMJlALplBLZlBLZg/LZc+LJc+LJk+LJk9Lpc+LpU8LJQ9LJM9LpA9LY49LIo9K4o9LYk8LIg7KYg7KYc7K4c7K4Q7LIQ7LIM7LYA7LIE7L4A8MYA8MYE+NYNAN4NDOodEPIhFPJRMQJZIPJ5HPqdKQ65MSa5RTK1dVqpqXqeAb6GPeZqago+bg4aVgHqLeG17amJtXVNaSlFVRktPQEVJOkBENjs9MDU3LDEzKDAxKS8wKC4vKS4tKC4tKS4tKS8uLDAvLS8uLC8uLC8uLC8uLC8uLC4uLC8uLC4uLDAvLS8vLTAvLS8vLS8vLS8vLS8vLTItMTcsOjYqODMtMTk2MUhKP2JmWHuAeouQk42To4+WsIyVtoOQsoGQr4WZso2ktpKos5Ooq5Cko4ygnoeemIKZj32YiYGci4ijkJSwmpixm5Stl4ujjYWbhH+SfGt8aVhmT1NWO1pWOV5aPSsvMisvMisvMisvMi0uMC0uMC4uLi4uLi0tLS0tLS4tKy0sKi0sKiwrKSwrKSwrKSwqKywqKywqKyspKispKiooKSooKSooKSwqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKyspKispKispKiwqKy0rLC0rLC4sLS4sLS8tLi8tLi8tLi8rKjAsKzAsKzAsKzAsKzAsKy8rKi4qKS8rKi8rKi8rKi8rKjAsKzEtLDMvLjQwLzkwMToyMDszMTw0Mj0zMj0zMTwyMDwyMD0yMD0yLj8xLj8xLkAyL0EzMEI1L0M2MEQ2M0M4NEQ5NUU6Nkc5Nkg5NEs4NE41MFg3Ml82MGk3MHI3L306MYY8MYw+MpA+MpdANpc/NZc/NZc/M5xAM6NDNatDNrNFOLpFO71HPb5IPrlHPbBEOKZBNZs/MJdAL5dALZdALZY/LpU+LZQ9LJU8LJY9L5Y9L5U8LpM7LZI8L448Los8LYk8LIk8LIg8LIc7K4Y6KoY6KoY6KoM6K4M6K4I6LIA6LoA6MIA8MYA9NH8/NoJCOYNEPYdGQIhIP5FLQZJIPZpHP6NMRahQTKhYUalmXaZ2aKKMd5uZgJWkh4yjh4adg36RfXSCcWp1ZVxlUlZfTE5VQ0VMOj9GNjxAMjc6LzY4LTAxKTAwKC4tKC8sJy8rKC8rKjEtLDIuLTEtLDEtLDEtLDEtLDEtLC8uLDEtLC8uLDIuLTAvLTIuLTAvLTAvLTAvLTAvLTItMTgsOjUpNTErKzY2LEdMOGBoUXqDcIiSh42Xlo+aoI2ZpYaWo4ebopCqqZu5saDAs5i3qJq2p5u3qJi3pZGxnImrkomrkJCxlJKzlpW0lZCtj4iihYSbgXuSeGd6ZFRiSVFUOVZVOVhXOywwMywwMywwMywwMy4vMS4vMS8vLy8vLy4uLi4uLi8uLC4tKy4tKy4tKy0sKi0sKi0rLC0rLC0rLCwqKyspKiooKSooKSooKSspKispKispKispKispKispKispKispKiwqKywqKyspKispKispKiooKSooKSooKSwqKywqKywqKy0rLC4sLS4sLS8tLi8tLi8rKi8rKjAsKzAsKy8rKi8rKi4qKS0pKDAsKzAsKy8rKjAsKzEtLDIuLTMvLjQwLzoxMjoxMjszMTw0Mj0zMjwyMTwyMDsxLz0yMDwxLz4wLT4wLT8xLkAyL0E0Lj80LkA1MUA3MkA5M0E6NEI5NEM4NEY3NEg1L1E1MVg1L2E2L2w4LXU5LoA8L4Y+MIs9MZM/NZU+NZM/NZM/NJVCNJpCNKBDNKVENKxCNbBEOLRFOrFFO6pCN6E/NJo+MZY+MJU/LpQ/K5M9LJM9LJM8K5M8K5Q8LpQ8LpM7LZI8LY88Lo07LYo7LIk8LIc7K4c7K4Y6KoY6KoU5KYM6KYM6K4E5Kn85LX85LYA8MX88M38/NoBBOIJDPIVGP4hJQopJQ45KQZBHPpdIQ59OSqdWUqdgWqlwZaSDcpyUfZahg4+oioiniIOghH6WfnmIdXB7amRwXF1pU1JeSkpTQEJLOj5FNTpAMjk8MTM0LDIyKjEuKS8sJy8pKTAqKjErKzIsLDErKzErKzErKzErKzErKzAsKzAsKzAsKzEtLDEtLDEtLDEtLC8uLC8uLC8uLDIsLjgqNzUoMTMrKDU2JkVLMVxnR3WCZIaTeY6bipGelJCfmouemI2ll5e0nqLFpanOraXJrabKsKfLsaTIrJe+n4uzkYiwjY2ykI6yjpCyj42sioShgoCZe3eOcmR4XVFfRU5SN1FRNVNSNiwwMywwMywwMywwMy4vMS4vMS4vMS4vMS8vLy8vLy8vLy8vLy8uLC8uLC4tKy4tKy8tLi4sLS4sLS0rLCwqKyspKispKiooKSspKispKispKispKispKispKispKispKispKispKispKiooKSooKSooKSknKCknKCspKispKiwqKy0rLC4sLS4sLS8tLi8tLi8rKi8rKi8rKi8rKi8rKi4qKS0pKCwoJzAsKzAsKzAsKzAsKzEtLDIuLTQwLzQwLzoxMjsyMzsyMzwzND0zMjwyMTwyMTsxMDwxLzwxLz4wLz0vLj4wLT4wLT8xLj4zLz02MDs2MDs4Mzw5ND06NT45M0A3MkM2MEc0Lk80K1k0K2Q1K244LHg6LX87LoU7Lo88NJE8NZA+M49AM5BBMpNCMZdBMplAMKA+MaZANKpCN6pCOaVANp8+NZc9MpU/MpI/LZI/LZE+LJA9K5E7KpE7KpI8LZI8LZE7LpE7Lo47LY07LYo7Log6LYY6LIQ7LIU5KYU5KYM6KYI5KII5KoE5Kn44LH44LIA8MYA9NIBAN4FCOYRFPoVJQYhLRoxNRoxJQY5IQJhKRqFTT6hdWKloYql7bqSOeZmcgZKnhomsi4KqiIChhH+ZgH6Ld3iBbmp4YWRyW1poUVFdSUlUQ0NMOz5ENjw/NDY3LzQ0LDMwKzArJzEoKTEoKTIpKjQrLDIpKjIpKjIpKjIpKjIpKjAqKjAqKjAqKjErKzErKzAsKzAsKzAsKzAsKzAsKzErLTYpMjUpLTQtJTQ2IUFIJldjO3GAV4KSbY2cfZCghpCijIuhio2oiZW4jqDIlKTQnanTq6jSrqfRraHLpZO9l4Wvh4KshIewhoiuhYyxiIurhoGfe3uUdHGIa19zV01dQklPM0pNMEtLLy4vMSwwMS4vMS4vMS4wLy4wLy4wLy8vLzAwLjAwLjAwLjAvLTAvLTAvKy8uLDEtLDIuLTEtLDEtLDAsKy8rLCwqKyspKispKispKispKispKispKispKispKispLCspKispLCspKi0oLCooKSwoKSknKCknKCgmJyooKSspKiwqKywrKS0rLC4tKy8uLC8uLC0sKi0sKi8rKi8rKi4qKS0pKCwoJywoJzEtLDItKjItKjItKjMuKzQvLDUwLTYxLjszMTszMTw0Mjw0Mj0zMTwyMDsxLzsxLzwxLzwxLz0vLj0vLj0vLD4wLT8xLj0yLj00LT02Ljs4MTk5MTk6Mjk6Mjs4MT82L0MyK0oxLFQyKV4zKmc3K285LXU9Lno8L4c9Mos9M4s/MoxAMo5AM49AMZI/MZU9L5g8L5w+MqJCNqFDN55CN5k/NJY+MpQ+MZQ+L5M9LpA9LY88LI49LIw9LIw9Lo0+L448Lo48Los8L4o7Log6LYg6LYY6LIQ7LII6K4I6K386Kn47Kn47K3w6Kn05LHw6LoA+MoE+NYBANoJDOoNHPYVKQodORYtPR4xJQ45JRJNQSphcVJ5nYJ11aZ6HdZ6YgJShhY+qiYmsi4Ooh4ChhH6bf3qQeXSIb2l9YmJ5XVxwVVVnT09cSEdSQUFIOD1BMzg4Ljg1LjcvLDMrKTIoKTIoKTMpKjQqKzAqLC8rKjAqLDAqKjAqLDAqLDIpLDIpLDMqLTErLTErLTErLTAsLTAsLTAsLTErLzQpLzQqKzQtJTQ2IT9GJVRgOG18UYGQZ4mZdI2eeo2hfoiheoqne5G2gpvEiJ/LkJ/JmZ7HnZ3GmpjBlYy3ioKtgIWugoy1iYSrf4muhYmpgn6ceHaPb2yDZlpuU0paP0dNM0ZKMURGLi8wKy4wKy8wKzAxLDAxLDAxLDEyLTIxLTMyLjQzLzQzLzYyLzUxLjQxLDMvLDQvLDUwLTUwLTQvLDMuKzIsLDEtLDAsKzAsKy4sLS4sLS0tLy0tLywsLisrLSopLikpKy4pLy4pLS8oLy4pLS8pLS4pLS4qKy4qKy8rKi8rKi0sKi4tKS0tKy0uKS4vKi4vKi0tLS0tLS4sLS8tLi8uLDAvLTIuKzIuKzItKjQsKTUtKjYuKzgvKjoxLDoxKjsyKz00LT00LT41MD41MD41MD00LzwzLjsyLT0yLjwxLTwxLzswLj0vLj4wLz4wL0AxLkEwKUAyKTs0Kjc3LTM5LTI4LjU2LjozLT8tKUYqJ0wpJ1MqJlovKGA1LGQ8MGtAMHlBMH9AL4ZBMYtCM49AM5M9MJM7L5I4LZM7L5M9LpRBMZVCMpRDMpJBMJE+LpE7LJc7MJc6MpI7MYw9MIg/MIQ/L4I/LoM+LohAMYg/MIo+MYo8MIk7L4g6LoY6LYM7LXs5K35AM3c8LnE3KXc+LXc+LXY7LX0/Mns7L4JANIdFOYlJP4hMQYZNQoRQQ4dORZFLSZdTUJRiWZFwYYx9aomJcYmWfIqego2kh42miY6nio2njIekiH6fgnWae2+XdWmNaWKEX1t6WFpzVVpuU1dlTlBXRUpLPUM/NkA5MzswLjYqKjMnKTMnKzMnKzEmKiwqLSkrKioqLCooKSwnKy4oLDEoLTInLTMoLjMoLjMoMDIoMDApMTApMS8qMS8qMC8pLTErKzAtKC8vIzw/KlZcQHB6WH+LZ42cdYudc4yhdoymd4qodomqdY60e5m/hp/Bj52+j5a6io+zg4iufYWrfIOqe4WqfoOofYOmfoCefHmUdXKJbWh8Y1lrVU1aRklRPENIND9CLy8wKjAxKzAxKzAxKzEyLDEyLDIxLDMyLTQzLjQzLjc0Lzc0LzYzLjUyLTUwLDUwLDcvLDcvLDYuLDYuLDMuKzItKjAsKzAsKzAsLS8tLi8tMC0tLy0sMSsqLykqLikoLS4pLy8oLy8oLy8oLy8pLS8pLS4qKy4qKy8rKi8rKi4tKS4tKS4vKi4vKi4vKS4vKi4uLi4uMC4uLi4uLi8uLC8uLDEtKjMuKzUtKjUuKDcuKTgvKDovKTswKjwyKT0zKj41LD41LD41Lj41Lj41Lj00LTwzLjwzLj0yLjwxLTswLjswLj0vLj0vLj4wL0AxLkMwKkMwKUEyKz40Kzo2LTk1LDozLTwxLT8tK0QqKUkqKE4rJ1QvKVo1LV86MWU+L3BBL3hBLYBBMIhAMo8/NJE9M5M6MpM7MY05Los8L4s+LoxAMI1BMY1BMY5BL5E/MZU7MpU7MpA8Mos9MIY+MINAL4E/L4I/LoVAMYY+L4k9MIg8Loc7LoQ7LII6LIA7LHg4LHg8MXM5LW45K3M+LnM+LnI4KnU6LH09MYNBNYlFOotJPYlLQIZOQYRQQ4dORZFKSJdTUpJmXYx3ZoSGcICTd4Gef4SlhoiniI2nipCnjZCnjYqkiYGfg3ecfW+YdmWSaWCLYFmCWll7WFx3WFpuU1NhSk5VQ0ZIO0NANzw3MzcvLTMqKzIpKjEoKy4oKiwqKyoqLCspLCspLC0oLC8pLTIoMDIoMDIoMDIoMDIoMTApMS8qMS0qMy0qMy0qMTItMTIuLTAsKS0tJTg6LFNYQm94XYCLaYeWb4aZbIaeboijcIakcISlcIqtd5O2gJm5h5a2hJOzgYyue4areIKod4KoeYOofIOmfIKkf3+de3iSdXGIbmh7ZVlqV01aSEVMPEBENTs9LzEyLDEyLDEyLDEyLDIzLTIzLTQzLjQzLjU0LzU0Lzg1MDg1MDg1MDc0LzcyLjYxLTgwLTgwLTcvLDYuKzQvLDMuKzIsLDEtLDEtLi8tLjAuMS8tMC0tLywsLisqLyspLi8oLzEnLy8pLS8pLS8pLS8pLS4qKy4qKzAsKzAsKy8uKi8uKi8uKTAvKjAvKjAvKy8vLS8vLzAuLzAuLzAvLS8uLDEtKjItKjYuKzcwKjkwKzoxKjwxKz0zKj40Kz81LD82LT82LUA3LkA3Lj82Lz41Lj00LT00LT0yLjwxLTswLjswLjswLjswLjwxLz8xLkMyK0UwK0gvK0stLUwsL0srLkkqL0UrLkEtLEAuKkEuKEUuKE0uKVgxKmIzLWc1LGo6LG87LXc7MIE9NIc8Now8NY06NI06NIo8Moc9MoY+MoU/M4ZBMolBM4xCNY9DNY4/Mo89L4w+MYo+Loc+L4U+LIY9Log8LIk7Lok8LIg6LYY6KoM7LH88KX49K3s8K309MXo8MXY6L3U7L3hAMXhAMXY8LnY7LX8/NYJCOIlGPYtIP4lKQYdLQYdOQ4pORpFKSJhUUZZmXJB2ZYeFboKRdH+de4Gkg4Woh4iqiY2qjJCpjI6liYifg4GafXmYeGmWbWGSZVyLYVyGYF2CYFt8XVVyVlBoUEZZRUJQPzpEOTM6Mi4zLCovKSosKSoqKDAnKDEmKjEmKjEmKjAnKjEoKzAqLjArLy8qLi0rLiwrMCssMCktMCgtMSgtMSktMDEvMjMvLi4qJyoqIjU3KlBVQW12W3yKaYCQa36Tan+ZaoOfboCgbn6gbYClcYeseI2vfIuteoiqeISpdoGndn+ndX+md3+meX+keYCifX2beXeRdHCHbWh8Y1lrVU1aSERIOT0/Mjk5LTIzLTIzLTM0LjM0LjM0LjQ1LzU0LzU0LzY1MDc2MTk2MTo3Mjo3Mjk2MTk0MDk0MDoyLzkxLjkxLjgwLTUwLTQvLDQuLjQuLjMvMDMvMDEvMDEvMjAuMS4uMC0tLy0rLjApMDIpLjAqLjAqLjAqLjAqLC8rLC8rKjEtLDEtLDAvKzAvKzEwKzEwKzEwKzEwLDExLzExMTEvMDEwLjEwLjIuKzMuKzMuKjkyLDkyLDsyKzwzLD40K0A2LUA2LUE3LkI4L0E4L0I5MEE4L0E4MUA3MD41Lj41Lj0yLj0yLjwxLzswLjswLjwxLz0yMD0yLkIzLkUyLkwuLlIrMFYnL1UmLlAnL0kpLkMvLjwxKzsyKT8yKUcwKFIvKV8uKmQvKWk5L2s7L3U8M308NoU7OIk7OYo7N4g6Nok+OIZAOIZCOYVCOYVDN4ZCN4dBN4lBNYhAMYhBL4dALodALoc+LYg8LIg7K4k6K4o4Kog5Koc6KoM6KX88KXs9KHg+KHg+KoI+MXs3Lno3Lno8MXY7LXc9L3xBM3tAMoBCN4NFOoZIPYhKP4ZKQIdNQohPRIpRSIxTSo5cUY5oW4t0YoV/Z4CLbX6Wdn+efIOng4Sph4eqiYuqioumh4eggoOafn2YeXGVb2mUaWaPZ2aMZWeLZ2SGZV9+X1p3W1BoUEteSkJQPzhENjI6Ly40KiwvKCsqJTImJjUlKDQlKDImKDEnKC8pKy8rLC4sLSsrKyorLSorLSgsLSgsLycsLycsLyorLS4qKzErKzArJy4rIjg4LFBVQWlxWXaEY3uMaHmPaHyWaX+cbH2fbXmea3qgbX+lcoKndIClcX2jcH2jcH2lc36ldn6leH2keHyheH2fenqZd3WQcW6HamV8YldrUk5bR0RGOT89MTo4LDQ1LzQ1LzQ1LzU2MDU2MDU2MDc2MTc2MTg3Mjg3Mjs4Mzw5NDw5NDw5NDw3Mzw3Mzw0MTw0MTszMDszMDgzMDcyLzYxLjYxLjUxMDYyMTYyMTMxMjIwMTEvMDAuLzEtLjIsMDQrLjQrLjQrLjIsLjIsLDIsLDIsLDMvLjMvLDMvLDMvLDIxLDIxLDMyLTMyLjMyMDMyMDMyMDMyMDUxMDUxLjYxLjYxLTs0Ljw1Lz00LT82LUE3LkI4L0U4L0M5L0Q6MUQ6MUU7MkQ6MUM5MEI4L0A1L0A1Lz4zLz4zLz0yLj0yLj0yMD0yMD4zMT4zMUA1MUUzMU0wMlQsNFgpM1coMlIpMUssMUIzMDo2LTc3Kzo2KkI0KU0yKVgvKV4vKWY6MWo7M3M8N3o9OoI8OoY8O4c7O4Y6OoI7N4E+OIFBOIFCOYNDOoNDOoVAOYRAN4JDMoJDMYNCMIQ/L4Y9Log8Lok6LYs5LYk3K4c4K4U5K4I6K349K3g+KnY/Kng+KoE5LXwvJ4I4L4Q+NHc0K3M1Kn1BNn1DN39FOoBHPIJJPoNKP4RLQoZNRIdRR4VXSnxhTnpqUYBwWYF1XYJ8YoOGaYaTdYidfIOjfoGngoKqhYKshoGphH+lgHuefXqZd3qScHqQbHiNbHeMa3WNbXKJbG2EZ2t/ZGByWFtpUlJbSEhMPUBANDs3LDcwJjUqJDYoJzUnJzMnJzEnJi4pJisqKCsrKSstKicsKCcrKikrKikrKioqLCspLCspLC0pKiwjJDIqJzUwKjg2KkJDNVVaRmZwV259XnSIZXGKYnWQZXiYaXeba3OZaHSaaXefa3qibnigbHefbXigbnmjc3uldXuld3yjd3medXqcd3eWdHOOb22GaGR7X1drUE5bR0NDNz46MTk1LDU2MDU2MDY3MTY3MTc4Mjc4Mjg3Mjg3Mjk4Mzo5ND06NT47Nj47Nj47Nj45NT45NT83ND83ND42Mz01Mjs2Mzo1Mjk0MTk0MTg0MTg0Mzk1NDg0MzczMjQzMTUxMjQwLzYtMDYtLjYtMDYtLjQuLjQuLjQuLjQvLDQwLTQwLTQwLTUxLjMyLTMyLTQzLjQzLjQzLzQzMTU0MjU0MDg0MTg1MDk0MDo1Lz02MD43L0A3LkE4L0M5MEQ6MEc6MUg7MkY8M0Y8M0Y8M0Y8M0U7MkM5MEI3MUE2MEA1MUA1MT80MD4zLz4zMT80MkA1Mz81M0A3MkM1MkkzNVAxNlQvNlMuNVAwNUoyMkM1Mj05MDw6LT06K0M3KUk2KFEzKVcyKV0yK2QzLGw1MHY2NH03N4I4N4M3N4I2Nn43NX06NH08Nn0+NYA/OYNAOIY/OYVBOIBCM4BDMYFCMYNAMIU9L4c7Log6Loc5LYU5LIM5LII6LH88LHw9LHk+LHg/LHw9LIc1KosyLKFMRadYUYtBOHw5MIJGO4BLPXlIOnpKPHtNPnxOP31PQoFRRYdVSoJfTHJrT29zUnx1WId3XY95Yph/aZ+Lc6CUepaWeo+dfIujf4iogYWngoCkfnufeX6ZdoORcIWOb4OOcICPcH+QcHuOcHeMbXOHa2p+YmZ2XF9oU1ZbR09NPkdBM0A2Kj0wJzssJzkrKDYrJzMrKC8sJywtJysuJykuKCkuKCstKC0sKi8rKjMpKjQoKjcnKjcnKDMoJDwzLEU+NElHOFFSQF1iS2dxVmp5Wm6CXWuEXGyJXXCRYnGVZW+VZG+XZXKaZnWfbXKcanGbaXSebniicnqkdnmidnmfdnaadHeZdnWUcm+Na2qFZmN8XlVsT05cRUNDN0A5MTs0LDY3MTc4Mjc4Mjc4Mjg5Mzg5Mzk4Mzo5NDo5NDs6NT47Nj88Nz88Nz88N0A7N0A7N0I6N0I6N0E5NkA4NT04ND04NDw3Mzw3Mzw3Mzw3NDw3NDw3NDs2Mzk1MjkzMzgzMDgvMDkvLjgvMDgwLjgwLjgwLjYxLjYxLTYxLTYxLTUyLTUyLTYzLjYzLjc0Lzc0LzU0MDU0MDg0MTk1Mjo2Mzw5ND04NEA5M0A3MEE4L0M5MEQ6MEc6MUg8MEk9MUk9MUo9NEo9NEo9NEk8M0Y8M0Q6MUI4L0E3LkE4MUA3MEA3Mj82MT82MUA3MkA3MkE4Mz83NEA4NUI4NkQ5N0c5Nkg5Nkg5Nkg5NEU4MEU4L0U5LUU5K0c5LEk5Kks5K1E3KlovJmQvJ24zLXo2M4M5OIk7OYs7Oos9O4tBPodAOoI9Nn88M386M4I8NIg9N4lAN4NBNYFCM4JAMoM/MoM9MYQ8MIE7L4A8L348Lnw9Lns9Lnw+L3w+L30+L389L4Y5L5AxK6I8OM1sZtl+ea1aVIxDPIhMQX9OQHRKPHFNPXBRP3FSQHRTQHpXRIJbSn5lT21zT297VYR5W5h1X6lvY7ZtZr5xa713b7uCd7GMeqeXfp6fgJahgY2hfoWdeYWZdoiRcouQcoiRcoSTcoCWcnyWc3iTcHSScG2LaWmEZWR4XF1rUVZeR01QO0VEMEI7K0AzKz8yLDswKjcwKjMwKTAwKC4vJy4vKS8wKjIvKjYsKzoqKz4oK0MmK0UkK0MmKEY1LUxDNFZRPltZRGBiSmdtUWl3Vmp7V2yCW2eCV2aGV2yOXG+UYW6UYW6WYnKaZnOda2+bam+ZaXKcbnegdHmieHied3WbdnOXc3WXdnOScm6LbGmEY2J7W1RtTU1dQ0dIOkU8NUA3MDc4Mjc4Mjg5Mzg5Mzg5Mzk6NDo5NDo5NDs6NTw7Nj88N0A9OEA9OEA9OEE8OEE8OEM7OEM7OEM7OEI6Nz86Nj45NT45NT04ND45NT45NT45NT45NT04NTw3Mzo1MTszMDowLjowLjkxLjkxLjkxLzkxLjkxLjcyLjYxLTYxLTYzLjYzLjYzLjc0Lzc0Lzc0LzU0MDY1MTk1Mjs4Mzw5ND86NEI7NUI7M0E4L0I6L0M5L0U7L0g8MEk9MUo+Mko+Mks+NUs+NUo9NEo9NEY8M0U7MkM5MEI4L0I5MkI5MkE4M0A3MkA3MkE4M0I5NEE6ND84MkA5M0I7NUQ9N0Y9Nkc8Nks8NU47NE02Lk42LFE2K1E2K1E3KlA5K1A5KVY2J2Y2KnI2LH47M4lAOZVEQJtIRJ9KR59MRqBRSplMRI5EO4U7MIQ3LYU3LYw5MY09NIg+NYc+N4Y9NoU8NYU8NYE9NH09M3o+M3hAM3ZBM3hAM3o+M388M4M6M4g3M5EzMZgoJrM9O+x8ev2VksVoY5ZHQIlLQHhIOm5NPGpRPWZUPmhWPmxYQHRbRX9gTIBoUHlzUYR3VZ50XLRsXslfX9NWXNlRW9dUXORvddl6eMyGfMCPfrWVgKuVfaOSeJ+PdpyKcpyKdJmNdZWPdZGRdYuSc4aRc4KRcnyLbnmGanV7YW1vV2diTl9UQlVFNVI8L080LU0xLUkwLEQvKj4vKDkvJjcuJzYvJzgxKTovKT0uK0EsK0YpK0goK0snK0gpJ1RCNFlRPGReRmdlTGlsT251Vm17WGx+WGuEWmeEVmeHVm2PXXCVYnGWYnKZZHWdaXSbbG+Za2+WanKZbXeddnmfeHeaeXSWdXOUdXWUdXOQcW+Ka2mEZWF8W1RtTU1dQk1OQEtCOUY9Njk6NDk6NDk6NDk6NDk6NDo7NT08Nz08Nz08Nz08N0A9OEA9OEE+OUI/OkQ/O0Q/O0VAPEVAPEVAOkQ/OUQ/OUM+OEU+OEQ9N0I7NUI7NUI7NUI7NUI6N0I7NUE6NEE6NEE4M0E4M0E4M0A3MkA2ND43MT43MT43MTw3MTw3MTs2MDo1Lzg1Ljg1Ljc0Lzc0Lzk2MTk2MTk2MTo3MDw3MT04MkE6MkI7MUM6MUQ8MUY8Mko+Mks/M0xAMk5AM05ANU5AN05AN0w/Nks+NUk8M0g7MkU7MkU7MkI5MEE4L0A5MT84MD84MD84MEA5M0A5Mzw1L01EPU1AOks6M1RAOVI2Mk8wK2E8NlwzLWA1LmA0K14vJ14vJWY2LG09MXE9MIlJPY9HO5dJP59LQZ9GPps+N5o9Np5EO6ZORKRQRahWSqtZS6VPQplBNZc7MJs+NpM5OJE5OIw2NYY1MoY4NIQ/OHxANnI+MXJCNG9BMnE9MHY6MII3Mow0M5ItMZonLMhISehiYcVFRM1XVeF5dqtWT4ZGPIRWRm1SPWlbQWliRmplSGpgRW5eRHxkTI1qVJJiTLJtXdFuaNtYXeA7TOctRfIrSPUwTPZAWexJXORbZeVucuJ7fNuAfduDf9iJgsN/dr2Bd7qEeLaGeLKIeK2Kd6iLeaWMeJqAb5l+bZh4aZNvYY1iWYRVTXtJQnhBPnU6PGkuMmQwMmExMVAmJ0clI0wwLU01MUc0LkUyLEQxLUYxLkYuLEcrKkstLVE2L1lINGBXOmZfQmdkRWtvTnV8WnWEXW+BWWyDV2yHWnCNXXKSYXOVYnWXZHeZZnabaHKWanOYb3OXcXGVb3OVdHeZeHqYfHmWeniVeXONcm2HamuEZmmCZGF6WlRtTU9fRE5PP1NLQFBHPjk6NDk6NDk6NDk6NDo7NTs8Nj49OD8+OT49OD49OEE+OUE+OUI/OkNAO0Q/O0Q/O0ZBPUVAPEVAOkVAOkQ/OUQ/OUU+OEU+OEU+OEU+OEU+OEQ9NUM8NkM8NEQ7NEM6MUI5MkI5MkI5MkI5MkE4M0E4M0A5M0A5Mz43MTw3MTs2MDs2MDk2Lzg1Ljc0Lzc0Lzk2MTk2Lzk2Lzo3MDw3MT46MUE6MEI8MEM7MEU7L0k9MUo+MExAMkxAMk5AM05AM05ANU5AN00/Nko9NEk8M0g7MkU7MkU7MkM6MUI5MEA5MUA5MUA5MUA5MUE6NEI5MkQ5M0k4MUwvK1YuLGo3NnU5OXs7O4VFQ4NEP4RIQIVJQYZHPo5JQplOSKFQTKJPR5NEN5RCNJpCNp9DOKA+M5w3LZw3LZ89MKNDNZs/MJlAMKBFM6RHNqdGNq5IOrZORbRMTa9ITKVARJk5O5E5OI0+OoNAOHg+M28+MHpJO4VMQYQ/OIQsK5IpLrM5RNJMV9xLTt9NTco+PcBAP9BgXLNZUYRANYJURHlhSWVbQF5dP2loSXNsT3ZnSn5kS5ZjTrxkWNZfW+ZVWutBTvIsRf4lRP8mSP8nSf8uTvkzTvI8UvBJWutQXuVRXeNTXeBYYttiadVmbNRqbtJtcc9xcs11dMl4d8d5d8p8fMl5esh2eMdxdMZrcsVmbsVha8Nfa8VgbrNTX6VLVZpHUY1ES4ZFSW02OUgcG1QxLU0wKkgxK0o2L0s4MUs6Mk8+NlVFOFtPNWNaOWdhQWlmRW5yT3qCXXqJYnSGXnKJX3CJX3CLYHGOYHWSZHeUZHeUZHeUZnOSaXiWcnqXeHmWeH6YfYOdhIWdh4ObhYGZg3qSenKJb22EaGiBZGB5W1RtTU5hRVJTQVZQQlVPQzg5Mzg5Mzg5Mzk6NDs8Njw9Nz8+OUA/OkA/OkA/OkNAO0NAO0NAO0NAO0Q/O0Q/O0ZBO0ZBO0ZBO0VAOkVAOkVAOkdAOEY/N0pBOklAOUg/OEc+NUY9NkU8M0Y8M0U7MUQ6MUQ6MUQ6MUQ6MUQ7NEQ7NEQ7NEM8ND84MD84MDw3MTs2MDo1Lzo1Lzk0Ljk0Ljk2Lzk2Lzo1Lzs3Lj43L0A5L0I5MEM7MEU7MUY8MEk9MUs/MU0/Mk1AME5BMU1AMFA/NU0/NEw+M0s9Mkk8M0g7MkU7MUQ6MEM6MUM6MUE6MEE6MD87MkA8M0A8M0Q7NFVEPFIzLmoyM45BR61MV8NVYMtdZsZfYptCPpdJP5ZMQZxOQqxSSr5VUsxPU8RMS6VANJ1CMKBAMKU/MaU7LqM3K6Q4K6c9L6tFNqE+K5g3JJ06J6U+LaxBL7JDMrZEOqcwMq86QrlETL1MUrpNUq1LTJZBPoI3MXs4L3Y2LHgyKoQxLZwzN7k9R9VHV+hNW+JGSc81M9A6Ob0zMchOS8ZjXZRKP4xbSn1jTGpfQ2dkRXRvT39wUYFoSo1oTrBoWeRiYvVRWvREUfY3Sf0xSv8yTv8vTf8qSP8yT/wwS/cxSvU1TPI0TfAyS/MzTPM3UPJAWO9DW+5GXe1JYetOY+pRZehVaOhWa+VTauRSaeNPaeROaedObOtQb/JTc/NWdf5ohfFhfOVbdNVVbM1ZbMlkcqhSXXItMl4mJ1kwLFc6NFE/NUI6LTo4KT5CMUxOOVZPM2FWNmVfP2hlRHF1VH+GZX6MaXeIZHiMaXWLZXKLZHKLY3aMZXmPaHqQaXqQaoCVdoSbfoqehY2gipKjkJeolpipmZammZGikoeYhnqNeXCDbWd+Yl53WVRtTVBjR1NYRFhVRFlWRzc4Mjc4Mjg5Mzk6NDs8Nj0+OEA/OkFAO0JBPEJBPERBPERBPERBPERBPEVAPEVAPEdCPEdCPEdCPEZBO0ZBO0ZCOUhBOUhBOUxDPEtCOUpBOElAN0g+NUc9M0Y8MkU7MUQ6MEQ6MEU7MUU7MkQ7MkU8M0U8NUU8NUA5MT84MD04Mjw3MTs2MDo1Lzo1Lzo1Lzk2Lzk2LTs3Ljs3LD84LkA6LkM7MEQ8L0Y8MEY9Lko+MEs/L01AME1AME1AL01AME8/Mk8+NEw+M0s9Mko8M0c6MUU7MUQ6MEQ7MkQ7MkI7MUA8MUA8M0E9NEI+NUY8M1M4MVsqJok6P75UYNlUZeZVZuNVY8tKT58zMJY6L5E+MJlBM65GPcVJR9VCSM0+QLFCN6dGNalCM6xAM68/M7A+M7NCNLRENrJHNalCL6M8KaQ7KKk8KKs6KK42Jq0zKLY5N7o5Pb03Prw3PL88QsZKTMRUU75YU5k/N4w0KoksJZ02McNIS9xPV+JBUdszQN46Oc0uKtM4NMg3NMZFQMhdValXS5BXRndXQHZlSX5wU39wUYRmSpBkS6lvW9V1ae5TV/xEUPc7Svg5Sf49Tv9AUf86TPk0SP8/U/45Tfo0S/0zS/0xSv8vSf8wTv82U/8zVP00Vv02V/o3V/g5Wvg9XPc+XvVAYfhDZvZAZvU/ZfU/Z/g/aPxDbf9Fcv9Jc/9Pdf9Rdf5VdvJTcedUbuVheNZmdrdXYn0xNWowL1gxKlA4LEc+Lz5BLjtELz9HL1BLLl9UOGdgQ29rTnx8YIiOcoeRdn2LcXqNcXyPc3yPc3qNb3qKbX2Mb4OSdYiXepWjipyplaOunaaxoay0p7G5rrC3sKu1raGropSglIORgnOEcWh8Y110WFNsTlBkSFJaQ1dZRFlaSDY3MTY3MTc4Mjg5Mzo7NTw9Nz8+OUA/OkJBPEJBPERBPERBPERBPEVCPUZBPUZBPUZDPEZDPEdCPEhDPUhEO0hEO0pDO0pDOUxDOktCOUtBOEpANko9NEk9MUg8MEc7L0U7L0U7L0U7L0U7MUU7MUU7MUQ7MkQ7MkA5L0A5L0A5MT84MDw3MTs2MDs2MDo1Lzs3Ljs3Ljs3Ljw4LT84LkE7L0M7MEQ8L0c9MUc+L0s/MU1AME1AME5BME8/L08/ME8/Mk49M049M0o8MUk7MEc7L0Q6MEQ6MEQ8MUQ8MUI7MUA8MUE9MkE/M0I/Nks9NFw1LnczMq1MU9tdaeZNX+VAUdc2RbcmK6gxKZ03KJI6Jpc8KaxAM8NEPdQ+P807O7E/NahCNKpAMq0/MrJANbhDObxIO7tKPKw+L6o/L6g9K6Y7Kao5KbA6LLc7L7w8McpGQc5EQdA+P9A3OdY3PN5CReJMTt1ST8RDPsZLQ81UTNRTTdlLSts/QuA1PuEyN9s0Lto3LtAxK886NL84NLNAObVbUJZVQ3tOOYJiSYZrUIRgRpJbRq1mVMtyZOdtaOpFS/I6ROo5Q+c8ROdCSOdGS+hHTOpGTfRKU/JCTfI5SfY1SPkyR/0vRv8yTP84Uv85Vv85WP86WP06Wv47Xf89X/9AYv9BZf9Daf5Ea/5Ebf1CbfxDb/xDb/xCcf1Cb/9HcP9AaP9Hbf9NcPJJaOlPa+Vbctljc71ZY44/RGAmJFErIlZAM1ZPPUlMN0BELVJKM2VZQ3VqVoB7Z46NeZmci5WcjIiTg4KOgImXiI+bjYyZiIeSgoqTgpeejqSombK2p7i8rr/BtsDBucLDvcXGwcPDw76+vrC1saKpoo2XjHmHdml7ZVxzWVRtT1JmSlFbQlVaQ1dcRjU2MDU2MDY3MTc4Mjg5Mzo7NT08Nz49OEA/OkA/OkNAO0RBPEVCPUVCPUdCPkdCPkdEPUdEPUhDPUlEPklFPElFPEtEOkxFO0xDOktDOExCOEtBNUxANEs/M0o+Mkk9MUc9MUc9MUY8MEY8MEU7MUU7MUQ7MkM6MUE6MEE6MEA5MUA5MT04Mjw3MTs2MDs2MDs3Ljs3Ljs3LDw4LT85LUE7L0Q8L0U9MEg/MEo+MEw/L01AME5BME5BME8/L08/L08/Mk49M008Mkw7MUk7MEc7L0Y5MEM5L0M7MEI8MEI7MUA8MUA+MkE/M0I/Nk47NG04NJdGRcRZX9tXYt9DUd44RtQzO70rK60xJ6E4JZg6IZc5IKQ7JrY+LsM6Mr43Mac3LKI6LaU5Lac3LK86MbhCOLpFO7dFOq4+Mq0/MKc8LKQ2J6o2KbY+MMNEO8pHPb44Lc5ANuFEP+xCQvQ9QfM5PusyN94uMNs3NeJHQuhTTOVOR9w9OdkxMOMvMuo2N9kxKN48L80sItA3Mb4zLLA3L8lnXLhsXI5XQ4daQ4NWP4lSPalcTM5sYeFnYuRUVPBFS/E9RuQ7QNk9PtJBPtJHQt1PTetXV+1OUu9ETfA6R/Y1RvcyRvguRPsxR/43Tv44U/04VP04Vv45V/87XP8+Yf9BZf9Da/47Zf08aP0+av0/bfo+bvg+b/Q9bfY6av9Icv87Yf8/ZP9Lbv9LbvdObe9Vb+NabuhygsJhaphJTHQ6OFw2LVA5K1BDMlVNOl5RQXJlVYh8bpWNgp+dkaann6Gmn5acmJWem56npKavrKasqKKno6aoo7W0sMLBvMzJwNHOxdXQzNXQzdTOztXP0dHLz8vGyr+9wLCyr5ifmICMfm1+a2B0W1duUlZqTlNgRlZgRVhgSDU2MDU2MDU2MDU2MDY3MTg5Mzo5NDs6NT08Nz49OEE+OUNAO0RBPEZDPkhDP0hDP0dEPUhFPklEPklEPkpGPUpGPU1GPE1GPE1FOkxEOU1DOU1DN05CNk1BM05AM01BM0pBMkpBMklAMUg/MEc9MUY8MEQ8MUQ8MUM6MUM6MUE6MkA5MT84Mj84Mjw3MTw3MTw4Lzw4LTw4LTw4LUA6LkE7L0Q8L0U9MEg/MEs/MU1AME5BMFBAMFBAME9ALU8/L089MU89MU09MEw8L0k7MEY6LkU4L0M5L0I6L0E7L0E6MD87MD89MUA+MkBANFA5MXIxL6hKS8FTVrs+RL0wNsIwM8EvL7oxKakxIaM5I5w9IZk7H5s8IKE9I6U7JaQ2JZ42KaA4LaI2LKU0LK04MbdAOrhDPLJANrFCN61BNKg8L6Y4K686MLxDOMNEPcVAN8M+Lc8+Ldk1K+EqJu0iJfolK/8qMf8uNO0pKucuK+EzLN80LOAzLOMyLOkwLecyK9oyJdY2JtAyJs83LMU2Lr0+N8hgVdJ/caZlU49WQopNOqNXSchmW99kX+dSVOhDSfVGTe1ARN8/P9RAPMlAOMZAN9FGQeNNTO9KTvRAS/k5SP03SPw1SPgzRfc2R/o7Tfo4UPw3Uvs2Uv02Vf82WP85Xf87Yf88Z/8+a/8/bf9Acf9CdP9Cdf5CdfxCdPlCcP9GbfpBYf5FZf9Lav5La/9WdP9fevVddPJqfuZwftNvd65eYYNDQWc2L2hCN3NVSnllXIx9dqOWkK2jobKuq7a2trK2uaqvs7C3vba9xb3BysDDysPCysnGzdXO1t3X2+La2Ofd2+nd3eba3OXY3+TX4ODU3tnP2MrFy7q6uqKno4iSh3SCcWV4YlxzV1tvU1tqTVxpS11nTDU2MTU2MTU2MTU2MDU2MTY3MTg3Mjk4Mzw7Nj08N0A9OEI/OkRBPEZDPEdEPUhFPkhFPkhFPkhFPEpGPUpGO0tHO0tHO05IOk1HO01HO01FOk1EO01EO01EPU5DP05DPU1DN01ENUtCM0pBMkg+Mkc9MUU9MkQ7MkM6MUM6M0E6MkE6NEA5Mz83NDw3Mzw3MT43Lz43Lzw4Lz05MD46MUE6MkM8MkQ9M0hANUk/M0xAMk1BMU5BMFBAME9ALU9ALUw/L0w+MU09MEw7MUo5MUk4MUU4MEM5MEA5Lz46Lzs7Lzw8MD0+MD4/MUE/MFM4LYc8N8RcW8paWa44NqsuKrIxK64uJa0yI6w5JqxCKqpGLKZEJ6NBJqNBJqI8I585I6A5KqM7MKY6MKY3Lq08NLZDPLdFO7BANas9MKg8L6k7Lqw8MLtFOcZMQcVFPLw4LL82JM06KN07LuYzLPErKvkoK/0mK/slJ/gqKvUuK+8yLOs0LOgzKuUzKeQyKOAzJeA6KtEyH9w/MM42Kcg4LcI/NbNBNtFsYL9nWaVSQqhPQctjWudoYuZSUupBRvNCSus+ROE7PdY8PM1AOcE+NLY4LLk2LsQ5NOJISOlARfA7RPY6SPo6Sfg4R/c7Sfs/Tv5BVf8/Vv48VP45VP84Vf85Wv86Xv87Y/8+af8+bP8+b/8+cP0+cfpAcvhAdPdBcfdDav9Nbf9Tc/dKaOtAYP1Uc/9nhf9lgvddd+9feOdoe9xwfcZxeKdnZ41eWHtaUZd+d6qZkr6wrcS8usbCw8jHzMfHz8PDz8vK2MzK2NHK2tfO39/U5Obb6erg6+3j6+/l5vLo5vTo6PDk5u7h6O3g6erd5+TY4tHK0cG/wqurqZGWj3qGeGx7aGJ1X2ByWGJwVmJvU2NtVDIxLzMyMDQzMTY1MTg3NTk4NDk4NDk4NDs6NTw7Nj09NT8/N0FBOUNDOUVFO0VFO0hIQEhIPkhIPEpIO0tKOExLN01MOE5LOE1KOUpGOkdEO0pGQ05JTU5JUEdET0Q/RU5FPkxDNEpANEtBNU1DOUxCOEY9NEI5MEU8NUM6NUA5Mz83NEA4NT83NTw3NDw0MkM6NUI5NEE5Nj45NT86Nz46Nz87OEA8OUI/OkRAN0dANkpANExAME9ALU9AK0w/LEdALkY/L0k7MEs4MU01M0s2NUo4OEY7OUI/OjY5MDQ8LzlENDpBLzY5JD89KGJDMbxqXrlKQaY3LKU1Kac3K6U1J6U3Jqg9K6M4JKU8JqpAKq1AKaw9Kaw5Jq42Jas2JaQ2J6E3KaI4KqY8LqpAMqxCNKxCMqxBMak+LKs9LK08LLM9L71DNMRGOMA+MboyJsc5K8w4KtA4K9Y4Lds3LeI1LukzL+4xLfEuLPQuLfMwLPExLOo1KuM3Kd06Kds6KNw5JtQzH9AzIM84J8Y3J742KMJCNc9TSchOQ89TS+FcV+5dWvBQUu0+Q/I5P/c/R+pBRt9DRNVBQcg/Obs8M7E7L7A8L7I8MMpMQNRLQ9xHQ+E+P+s8Qfc/R/0/Sfk7R/5EUfxDUf5EUv9EVf1AVvw8Vf88Wv9CZP9Ga/9Bavo7Z/U6Z/Y8bflDc/1Jef9Lev9Nef9NdPhQc/BPcOdNaepNavxZeP9niP9fg/VHbPZXd+hfecNebr17f4dhXo94cKeRhLunnNHEu93W0N3c2tzb4N7c5+Lb6+bX7OvY7vHZ8fbd8/fi8/fn9PXr9PTu8vn08fn08Pnx7/bt7vPo7O7j6ene5Obd4tbQ1M3Jyru6uKOloIuQiXmDeHJ9b3B7a32Gc3iBbHZ9azAuLzEvMDMyMDU0MjY1Mzc2Mjg3Mzg3Mjo5NDs6NT09NT8/N0FBN0NDOUREOEVFO0hIPkhIPkhIPEpIOUtKNkxLNk1NNU5NOEtKOEtJPUtKRVBQUldVYFlYalZUalJPYE9JS01EP0g/OkY9OEc+OUg/OkY9OEI7NUQ6OEE5Nj83ND83NEA4NUA4NT04NTs2Mj00Lz00Lz01Mjw3ND05Nj46OT08Oj49OUI/OkQ/OUdANkpANE1AME9ALVA/K0xAKkI/LEI/LkY8MEg6MUo2NUk1NkYzNUA2NUA8OTo9Njs+NUBANEU8LUo5KV5CNIBMPq5RQqs7LaAyI6E2JqM6J543JJ45JaM+KqE7Jac8KK4/K7NALbY9LLc5Krg2KLU3Kao5KaU6KqQ5KaU7K6g+LqtBMatCL6tALq4/LKs6KLE8K79FNsZIOcE/Mbw4K8A2Kcs3K883LNA5LtE7LdQ8L9g6LuA4L+c0Le4xLfQuK/QuK/EwK+o0KeE3KNc6J9U6JN48J9k2I9U4JdQ9Ksw7KsE1JsQ6L89GPNFGP9pJROlPTfNQUfRHSfA7QPU6QfhDSOVCRdpEQ9JCQcU+OLc7Ma46Lao8Las9LrZFNcZMP9RORdxHQ+M/Pu8/Qvo/Rv5ASvhDSvdDTPpEUP9GVP1CU/k+U/w+WP9CYf9GaP9Dafw/aflAavlCcPxGdv5Kev9Le/9Kev9IdPVLcPFRc/Vcevlfe/tYd/xOcf1Fa/pEbO9FadpLZ8hfcLFudWtMSZB+dLCWicyypeTTyezj3Ovn5urp7urn8u3i8/bj+fvh+v/i/f/n///s///y/v/2/v/5+/769/369fz39Pr18vjv8PTr7vHo7e/m6+bd4NzW2MrGxbOyrp6hmo6TjImPhYiQg4+Vh4mQgIaMfi8uLDAvLTEwLjIxLzQzLzU0MDc2Mjc2MTo5NDo6Mjw8ND4+NkBANkJCOENDOUREOklGPUlHO0pIO0xJOE1KN05MN05MN09MOUtJOk5LQlRSU19eZmloeG1thWxrimtog2BZaVlRXE9HUkhAS0g+R0c9RUU8QUA6PEM6Oz86Nzw3NDw3Mz04Mj45Mz46MT05MDgzLTk0Ljs2MDw5Mj06Mz47ND88NUA8M0U+NEc/NEk/M0xAME8/MFA/L1A/LUw/LDw7Jjo9KD88K0E7LUI3MUE2Mj40MjszMD04NEI7NUg5NE4yLlksKWwvLoc7PaBGRaM7MKIyJJ8xIKQ5J6U8KZ43JJ44IqI8JqQ7Jqo9KbFBLbZBL7k+Lrs8Lb46Lb48L7I8Lqw8Lqk5K6k5K6s8K60+La0+La08LLI/LbA4KLk+LstMPctHOrw2KroyJsk5LtA2LNQ2K9Q4LNY6Ltg6L9w4LuM2L+gzLPAwLfQuK/QuK/AxKecyJ902JtQ4ItI3Id04JNw1I9o5J9o+L9M9Lsg2KcU5LMtBN8k8Nc0+ONlFQeVLSepKSulDQ+w/QetDQ95DQdVEP81CPcI9NLY6Lq44Kqs6Kqw7K6w4KcBEONRORd1JReBAQOg+QfdCSf9IUPRBR/RASflDT/1HVP5FVfpAVfs/WP5BX/9EZv9Daf9Da/9GcP9Jd/9Le/9MfP9Kev9GeP9Id/9LdPpOdP9afP9hgP1VdvFDZPtJa/9Udtw/XM1JYNh7hbh8fGFDO498bq6OgdWzp/Pb0fvs5fry8Pn3+vf0/fTs+/rr///q///s///u///z///3///7///9/P/++//9+f/6+P/49v/19v3z9Pvw9Pnw8/Dn6uXf4dPPzr69ua2uqKKlnp2jmZ2jl6Ornp6ml5ujli8uLC8uLDAvLTEwLDIxLTMyLjU0LzY1MDg4MDk5MTs7Mz09NT8/NUFBN0JCOENDOUhFPEpGO0tIOU1KOVBLOE9NOFFMOE9MO0xKPlFQTF5dYm1senp6koGCoYCCqICApnt1l3JrimVfe1lTbVRMZE1FWkdAUEI8SEQ/RkA7Pzw4Nzs2Mzs2MDw4Lz05Ljs4Lzo3MDk5MTs7Mz47Mj89MUA8MT87L0E7LUY/L0g/Lks/L01AL08/ME8/L1A+MEw/L0A9Kj8+LEA9Lj87Lz87Mj45Mz06NTo5NDw5NEQ5NU01MVYtK2opLYQyOJ44Q6s+Q6Y3LqU3KKU6KKo/Lag/LKA5JqE4I6Q7JqU6Jqs8KbM+LLlAL70+L8E9MMU9McQ+Mr0/M7Y9MrI5Lq44Kq85K7A6LLI6LLM5KrY7LLk7LcRCNMtFOcg+M74xJ8AyKM05L9Y1K9g0Kto2Lds3Ld43LuE2LOYzLOwxKvMwLPQuK/QvKe8wKOQyJts0JNI2INA1H9cyHtowH9o0JNw8LtY9L9A5Ls09MtJEOsQ1LcU2MMo7NdhEQOJNSeVLSd5DP9Y9ONNAOc5BOMc+NL48L7U6K7A4Kq85K7E7Law0Jr0/M9FIQNlIQ91CQOVARPNGTP1OVfA/RfA/RfZCTf5IVf5IV/xCV/pAWPxBXv9BY/9DZv9Gbf9Jcv9Nef9PfP9Me/9Jef9Edv9Ofv9Sff5LcvhNb/9Wdf9VdfdNavBGY+9LZtI+VuFkdP6fp9OPjmQ5MmxKPqV5btClnPXUy//p4//08v/9///8//nz//zv///v///w///y///0///3///7/f/8+//9+v/8+P/6+P/59//29//19v/0+P7z9/br7+zj5NrV0snGwbq5tLO0rLG0qbC2qra+s7C4ray0qTEwLDEwLDAvKzAvKzEwLDIxLDQzLjU0Lzc3Lzg4MDk5MTs7Mz09Mz8/NUFBN0RBOElFOkxGOk5IOlBKOlJLOVJNOlNMOlFLPU9KRFZUVWZkcXd4jYaGqI2QuY+Tw4+Qxo6LwIeDtnt3qXBtmmlkjV9bflVQbk5KYUtHWEVCTT89Qjs3ODk1Mjk2Lzg1LDg1LDY3MTc4Mzg5MTs7MT48Lz88K0I9KkM8KUc/LEo/K0tALExBL01AME0/MkxANEs+NUw/Nks+NUY8M0I5Mj04Mjo5NDY7NDc8NTk8NT46MUg0LVkyLXc3OJQ/RKY+Rac5PKo7MKo8K6tALqxBL6lALaU8KaY7J6s+Kqc4JK06J7U8K7w9LsE8LcU7Lso8MMo9M8U/Nr4+M7o6L7c3LLc3LLg4K7o4K7o4K7s3K8dBNc1DOMU4LsExJsYzKcs3Lc81K9s0K98zKeE0LeI2LOM1LOc1K+wxKvAvKvUvLPYvKvIvKewwJ+IyI9k0IdA1H880HtYxHtkvHtgyItg2Kdc5LdQ6MNY/NthFPdZGPs1AN8k8NctAOdZLRNlOR9JFPsU7McU9McI8MMA8L7o7LLc5KrQ6K7Y8Lbk/MLU5Lb88MslAOtJDP9tDQuNESO1KT/ZPVuw/Re0+Q/JCTPtJVf9KWf1GWPpDWftDXftAX/tCZP9FbP9Kc/9Oev9PfP9Mef5Jdv9Kd/9Ugf9Uff1KcflJbf9TdP9WdPhOaetEXuRGXepYa/+Wov+1vPOdno5IRmsuKaZrY82Wj/PIwf/j3v/x8P/8/f/9//z3/v72///2///3///4///6///8///9/f/9+v/8+P/7+P/5+P/49//2+P/19//0+P/0+P3x8/Pp6uTc2tbRzc3Kw8nJv8rKwMrNwsnQyL7Iv7fBuDY1MTQzLjMyLjEwKzEwKzIxLDMyLTQzLjY2Ljc3Lzg4MDo6Mjw8Mj4+NEBANkJANEpEOE1FOE9IOFJLO1RLOlRNO1NMPFJLQVFMSVpXXmxpfH9+nYyPuJaZzJme2Jqe3pmY2pSR1IyKyYaFv4F+tXh2p25rlmZlh11ad1ZUaU1LWURBSj48Pzs6ODs3NDc2MjU1NTQ1NzY2NDg3Mjw6Lj88K0M+KkZAKkc/KkhAK0lBLElCMElBNEhCNkhBOUdAOks9PEk7O0M5Oj03Nzg3NTM4NC84My85MTc8NTc0K0MxJ104MH5DPZZHQ54+P541Mac7L6o8K6o/Lao/Lak+LKk+Kqw/K7A/Las4JbI5KLk6K785LcM5LMg6Ls06MM88NMs+NcY7NMI5McE4LsE4LsI5L8I4LsM2LMU3LdFDOdBAN8MwJsMsI9A3L9Y8NNMyKuAzLOQyKOcyK+gzKuozK+0yK/AvKvMtKvYvKvUuKfEwKewxKOE0JNo1ItE2INA1H9g3I9kzI9YzJNUzJtU1KdQ4LNQ8MdY/NuxZUeFSStNIQcxDO8pFPMxJP8hFO8A+Mbw6Krw7KLw6Krk6Kbc6KLg6K7w+ML9BM8FBNsE8M8U8Ns9BPddFRd1HSORJTetMUOhCRupAQ/BDSflLVP5OWfxKWvxGXPxGX/hBX/lCYf1Faf9KcP9Od/9Pev9OeP9Mdv9Re/9Sef5Pdv1PdP9Wef9de/9Tb+5EXvpUbO5RZPdkdP+Snv+LlfSDicdgZKdNTbVqZ86Piu+8uP/e2f/v7v/6+f/8/v37//36//77///7///7///8///7/f/7+//7+P/7+P/8+f/7+v/7+v/4+v/2+P/z9/3x8/nt7/Lm5ufd29/Y0tvXzt3bz+De0t/h1tzj28/Y08XOyTw5NDs4MTg1MDUyKzQxKjQxKjUyKzYzLDc0LTg1Ljk2Lzs4MT06MT88M0E+NUM/NEpCN01DN1BHOFNKO1dLO1VMPVVLP1NKQ1NKS11XY25sgoKCppGVxZqg2p+m6qKp8aGl756g65mb5ZWY3ZSV1pCRyomJvYKDsXp5oXJxkWZjflhWa1BOXElHUkZDTENCSj8/Sz09Rzs6QDs5Ojw5ND87L0M9LUVALEZAKkZBK0VCL0VDNENDN0JDO0FDPkBBQ0I8RkQ+TENBTkVFT0NITkFJTD5IST5HRENIQUE9Mkw6LmdGN4NPQY1JPI4/MpQ4KaU+L6k+LKs+Kqw/K61ALK9ALbA/LbE8KrE4J7Y4Kb05KsM5LMg4Lcw4LtI5MdQ7Nc86NM06M8s4Mcs4Mcw5Ms06Msw3MMs2L9M8NdU+NdI5McwyKM40Ktg7Mto8M9czKuQxKukxJ+wxKu4yKfAxKfIvKfQtKPYsKPctKfQvKfAxKekzKOI1J9k2JdI3Ic83INQ5JdU4JdM2JdE0JdI0KNM3K9I4LtA3L+NOR+hYUOdaU9pRScxHPsREOb9AN7k+L7k8Krk8Jrk8KLk6J7g5KLo7KsA+MMNBNMlEO8ZAN8lAOtFGQ9VJSNZIR9hHSt9JS+ZGSOhCRO1ESfVMU/xRWvtPXftMXftLYPZEXvdEYflGZv1JbP9Odf9PeP9PeP9Qd/dWePNVdvRUdvxZeP9de/9ad/tRa/JJYP1Xa/ZVZ+pNXvZebeJLWuZUYeVUYddYYcFlZsiDfuWrp//U0f/r6P/z8v/4+f/+//v8//v8//v8//z8/vz6/f35+v339/z39P/69//7+P/8+//7+v/4+P/z8/3u8frr7vDh5Ond3eTZ1eLZ0ubf1evn2/Ht4fHx5ezz7Nvm4s7Z1UA9Nj06Mzo3MDc0LTUyKzUyKzUyKzYzLDc0LTc0LTk2Lzs4MT06MT88M0A9NEI+M0pCN01DN1JGOFZKOldLO1hMPFdLP1RJQ1NKTV5YZnBtiIKEq5GXy5yk46Ot9aew/aqx/6as+qGn86Ck7p+j6p2h4Zmb1pWWzJKSxImItHl5n2ppi2BdfFhVcFJQaE9NZU5KY0tHXkZCU0A9SD86Pj86NkA8MUE+L0NAL0NCMEJDM0JENz9EPT5EQDxFRDtCSj5DVkNJYUxSaFVcb1xicmBkb2JiamRgYWZYV2FKRGxHPoNTRZVYRpNKN5FAK5k+K6hBLq5AL65BLa9ALbBBLrRBL7I9K7A3JrU3KLw4K8I4K8g4Lc02LdE3L9U4Mdg7NNI3MtA3MtA3MtE4MtQ5NNQ5NNM4M9M2L95BOtU4L9EzKtY4L949Nd49Ndo5Mdw1LOcyKeswJ+8wKPEwKfQvKfctKfcsKPcsKPctKfQvKe4yKek0KeE1J9o3JtQ3JM84I843Is84Jc43JM82JtA3KdI5K9E3K840Kss0K+NOR/NkXOtgWdVPRsRBN7o7MrU5Lbg+Kbg+J7k8Jrk7Jbo5Jr05KsA8L8Q+MspEOcpBOc5FP9VLSNNMSc5HRM1FRdZIR+NJSeZDROhFSPJNU/hTWvlSXPdPXvpPYfRIXvVHYPhHZPtJaf9Ocv9ReP9Sef9UevBVde9ad/leff1efPlVcPVNZ/lPaf9Zbv9bbf9jdPBNXvdUZfRPYPxVZ/VMX+RSX8BeX7t2cdecmPrJxf/l4//t6//09P///fz///v///v///v//v39/f38+v759v349f/49f/59v/6+f/6+f/29vzw8Pjp7PTm5uvd3eja2eTZ0+je1fDo3fnz5f/67P7+8vT69uHr6tPd3EI+NUE9NEA8Mz46MTw4Lzo2LTg0KzczKjYyKTYyKTczKjg0Kzs2MD45M0E8NkU+NklAN01DN1JGOFVJOVdKOlhLO1pMQVtOSFRJTVhSYGdkgXx+p42Sypeg456q9qWw/6qz/6uy/6y0/6yy/Kqx+aqv86is7Kmr6J+h2pma0o2NwYF/sXRyoWhlkl1ah1hSflhRellRdlZPbk1IX0M/TT86QD87OkI/OD4+NEBCNUJFOj9EPTxCPjpDQj5GSD9MVURWblFmg2FyjmlzjnR2j4F4jYRvgIBebIpbY5JXWZ5XVaZWTaZNP59ALpw5JKA6JKc8KKw9Kq4/LLFALrNALbQ/LbY9LLk7LLo2J742KMQ2Kss3LdE3LdY4L9o5Mdo4M9c4NNg5Ndk6Ntg5M9g2Mdg2Mdo4M906M+ZDPOA9Nto3MONAN/5bUv9sY/9dVOc/NuUzKe0yKfEyKvQvKfQqJvUoJfgoJvgrKPctK/MwLO0yK+MxJ9owI9QxItQ0JNM6KMw7Jso8KM08Kc88KtI6LNI5K9I4LNE3LdpAOM84MdxHQfRjXuVYUctCPMVAO7c0Krc6JrY8JLk8Jro8Jr06KL86K8Q8MMY+Msc+NMxDO9lQSt9YUtRPSsM/OsA/Os9IRN5IR+JHReZKS+9QVPFSV+9OVu1LWPFMXPlSZvhPZvdLZfdKZvxNbP9Rc/9Sdv1SdvRXdu5YdfVYdftbd/9ceP9ac/9Xbv9Wa/9idf1WZ/9cbf9bbPFGWPREWP9RZe5WZcZmZ6ppZcqPi+e2svjSz//r5/3v7vz49/n9/Pn///n///r//vz+/f/+/P/7+P729P759f/79//59v/29P/29v/19fbo6ObY2OPV1N7QzeHW0PHn3vz05/746P/86f//8/r/+ejx8Njh4EM/NkI+M0E9ND87Mj05MDs3Ljo2LTk1LDczKjczKjczKjg0Kzo1Lz04MkA7NUQ9NUg/NkxCNlFFN1RIOFZJOFdKOVlLPlpNRVVKTldRX2Vif3l7pIqPyZSd4pum9aOu/qu0/6y1/662/6+3/7C3/6+2/K+0+K+y9amq66Kj45iY2IyKyYB/u3VxrmlloGNemGBXjmBWiF1Uf1ZQdE1JYkZDVEJBSUFBQzw8OkFCPUZFQUNEP0E/QERCRU9NUldWZGNohnF1mn99ood9n5J9nKB7mqVwiqRgdaxZabZWYbpRVbhIRrBANKw7Kaw8Jq09J6g4JKg3Jas4Jq45KLA4J7I5KLU3KLg2KLszJcI0KMo3LdM6Mtk8M949Nd88Nd88NeE+Od88N988N+E+OeVCPehDPedCPOZBO+VAOuZCOeRAN9w4L9UxKNg2K+tJPv9bT/FANu42LOorI+4pI/gtKf8vLf4sK/YoKPowLvU0L+82Mec2Lt4zKdYyJtQyJc82Jss6J8g7J8o8KM06KM85KtA3KdE1KdA0KNM5L881LdQ9NuVQSuVUUdtMSM1CP7cxKLw7KLs9Jr08J747J745KMA4KMI6LMQ6L8g+NMtCONVPRtxXUNJSScNEPb9DO8xIQ9tMSN9KRuVNTOtTUu1UV+tQVulOVuxPWvdWZvhVaPlTafpSa/xSbf9Tcf9TdP9SdfJNbfhVdP9cev9fe/9cdv9Vb/tSaftSZfxVZvdSYv9aaP9aaPNOXvhTY/5Zad9TXrZgX5deV7aBfdmppe7Ixf3h3vnp6f349fr8+fn///j///f//fr+/f///f/7+//39f349P759f759f728//39v/19fbq6urc2+TW093Qyt/VzO/l2/z15f/55//96f//7/r/+Ojx7tvh30VBNkVBNUM/NEE9Mj87MD05Ljw4LTs3LDg0Kzg0KzczKjg0Kzo1Lz04Mj86NEM8NEc+NUpCN05EOFJGNlRHNldHN1lJPFlKQ1dLS1hQXWJeeXN1nIWKwpCZ3Jik8KCr+qqz/q21/q+3/7G5/7O6/7S7/7W5/7W5/6+y+ays9KOj65mX4I6N04OAx3h1vHNts2tgomldm2NakV1XhVZSd05LaEVEVkBATDg1PEE8QEtBQkxAQlE+QlpFSnBXXYJjc5hyl6V6p65/q7J7o7h2nMBwk8Jjg8BUbsJHXNBLXNFIUMQ8PLo1Lrg5KrU8J7A8JbA7J7A7KbI6KbQ7Krc8LLs8LcA8LcQ8LsQ2Kss4LtM8Mdk/Nd9BOOE+N+A8M986NNw3Mdk0LtgzLd45M+ZBO+xFP+lCPOQ9NeM8NNs0LNg0K9s3LdQyJ8wsINY2KulHOvVLPvJANu80LfAtKfYsKvosLPwsLPgqLPAqKewvK+gyLuM1Ltw0K9gxKNUxJ9EzJ803KMs6Kc06KNA6KdI7KtM6KtQ4K9Q4LNE0K9Y8NNU6NdU8N+VPTu1ZV9lFRcIzL8A7LL88KMA7Kr86KcE5KcA4KMA4KsA4LMY9M8dBNs9KQdhVS9JSR8ZHPsBEOsdHPtZLRNhJQ91MSeRTUOVTVOJQU+JNU+VOV/JYZPZaaP1bcP5acvxWbvpSbPtRbP9RcP1Hbf9Qdv9aff9be/9Wcv1Ua/5Xa/9cbftZaPhaaPthbfZga+1dZ+9mbuxmbclcX6BdV3tPRphtZsGYlN26tvDU0fTg3//19Pn59/n//fn///f//fr+/f/////9///4+fz59Pz58vz59P349P/59v/49vnu7O/k4uXa1tvQytzSyO7k2P325P/76P/95///7fr99Orw7N7j30lFOUhEOEZCNkRANEI+M0A8MT87MD46Lzo2LTk1LDk1LDk1LDo1Lzw3MT45M0A7NUU+NklAN0xEN09GNVJFNFVFNVdHOFdJPlhNS1hOV15acXBwloCGuoyW1JWh6Z2p9aiw+amx+a2z/bC3/7G3/7K5/7S4/7S4/6+x/Kut+KWn8p+e6peW4oyL14KBzX15xXVttnBnqmZgnl9akFlYhFFRdUdHY0E+UT01REg4QlQ9Q2BARW5DSoBPVZZdZKtmeL9rj8lumstvmMlpj8hgg8lXeMZJZ8Q7VcYySNlBUOBFTdE7PMY3McQ/ML1ALLE6JK02Iq01JK41JLM1JrY3KLw4K8M7Lcg8L9NANtdAN9pANtw/Nt49Nd45M902Lts0LNMuKNItJ9MuKNgzLeE6NOM8NOE4Mdw1Ldw1LdAsIs0pH9k3LOJCNtw/MNA0JcsuH+lGN/NJPP1IP/w8N/QtKvEjJfUnKfsvMvEtLusvLuQyLt4zLNoxKtcwKtYvKdMwJ9M3KtI5K9Y6K9g8Ldo+L9s/MNxAM9xAM9I2KuZMQuVKRc41MN9HRvNaXN9JS9VBP8g8L8Q7K8M6KsM6KsI6KsI6KsE5K745KsI8MMI+MshGOc9PQs5QRMZIPL9DN8FDN85IP9FGP9VKRdtQS91ST9lNTNpLTdxLUOtYYPNbZ/xhcf9hdfpYbfVPZ/VNZ/9Oa/9Pdf9Sef9Vd/9UcfxUbf1bcP9jdf9qeP9ndfpib/Vhbe1kbONmbNloas5naLVmYY1eVGVHPH9eVamIgc2rqeXHxe/a2f/z8/n49vn9/Pj///f///v////+///8///5+v779vv78/v69f779v/9+f/7+P708vjt6erf2d7Uy93Tye3m1v/45f/+6P//5v//6/j67+rv6OPm305IOk1HOUxGOEpENkhCNkZANEQ9M0M8Mj84MD43Lz02Lj02Lj02MD43MUA5Mz86NEM+OEVBOEtDOE5FNlFEM1JFMlZGNlZIO1pNR1ZNUltXaGxri36CsYqTzpKf45qm7qau96mv+a2w/a+z/bCz/7C0/rCz/6+z/auu+6ir+KSn9KCi75qc6ZOV4oqM2YaF0YN/yXt1u21rrGRlnl9hkllbhFJRc05IYldGWV9DUW1CTIFFTZhNVKxVXbxbYspaaNlScOJSdd9UddlQbNJKYs1CV8c4SsUuP9Q4ReNDS+ZHS9g+Ps0+NsxGOsNINrY/K7c+Lbg9Lbo8Lb0+L8M/MMpCNNBEN9VFOtlFOdpCN9s+Ndk7Mtk2Ldk1LNozK9czKtQxKtc0Ldo3Lt05MN84MN43L902Ltw1LNYvJtk1K9c3K88yI80xItI5KdU+LdQ7Kdg8LeZEN/hKQf1EP/k2NPUqLfYqLfcvMvc2N+01NeIzMNoxLNcwKtcvLNkwLdkwK+M4MeQ5MeI6MeI7MuA8MN89MNw/MNo+MdE3K+9XTPhhWtM7NtE7OuZQUdxGSOZQUc88NMo6L8Y4LMU5LMQ6LcQ8LsM7LcA7LL46Lb48LsNBM8dIOcdJO8JENr5AMrw+MMlGPMpFPM5JQtVQSddSTdVOS9NLS9dMT+laYPBeaPxmcv9oePxdcfJQZfNNZf1Oa/9Wev9UeP9ScvhUbfZdcftoePtqd/dlcvxldPNfbexga+prct9ydcNqZqpkXJ5sYX1mVlhIOWtYSpR8cr2gnN7Cwe7W1v7u7/v19fv7+/v///n///3+///+///7///6/f/++fv+9fv89v/++f//+v/++v/79f/38vHo4eTc0eHZzPDp1//65P//5v/+5f//6vf56+3w5+jp4VFLPVBKPE9JO01HOUtFOUlDN0dANkdANkI7M0E6MkA5MT84MD84Mj84MkE6NEA7NUI/OEVCOUtFOU1GNlBFM1JFMlVGM1VIN1lMQ1VLTFpTY2lphXyBq4mTyJOe3pqk66as+Kms+6yt/a2w/66x/66x/q2w/a2w/ams+aeq96So8qKm8J+j7Zqe6JWZ45KU3pKS2omKzXyAwHN4sm91qW1wnWlnjmpffXlfeIJXao5QX6NPXLtTXM1UXdZQV9tIUuVAUeg/UuRDUtxEUNZDS89ARMo5PMk0NuRKTOdJSuFBQdU3NM45Nc5BOMhEOL4+McNFNsNFNsVGN8lFOM5GONFHOtdHPNpHPdY+M9U7MdY4L9U0LNYzKtg0K9s0LNo2Lds4Md08NOA9NN88M905MNw1Ldw1LNs3LdIuJN07MNo9Ls0xIsYtHc43JtI9Kc06Jsw5J9Q4KeI6L/M9Of9AQP88Pv4zN/MsL+osLuErKtgqKdQrKNcvLN40NOQ4OOk5Oe83NfA3NO43M+g3MeM3Ldw2Ktc1KNE1Js01KOdQRf9tY9tIQcg0MtdDQ9M+QupWVtlBPNI+NMs4LsY2K8Y6LcY8L8M+L8E9Lrs5K7s8Lb4/MMBBMr9BMr1ALrw9Lrs8LcNDNsREOchIP9BQR9NSTNBPSdJOTNVPTuleY+5hZ/tpdP9uev9kdfVWavVRaf9Vb/9Xdv9WdPpYcPFecPRuefZ3gO1rc95YYfFgbfFgbexib+9zfeyIisyBfKp0aJl5anNrWE9OOl9WR4NxZ6+WktzAv+/V2Pzp6/709f37/P3+//r+//79///9///7///5/v//+/n/9fr99v//+v//+v//+P/99//+9vnw5+3l2unh1PTv3P/75f/+5f//4///6Pn66vL05+7w5VNNPVJMPFFLPU9JO01HOUtFN0pEOElDN0U+NEQ9M0I7M0E6MkA5M0E6NEE5NkA7N0FAO0NDO0lFOU1HN09HMlJGMFVGMVVINVdLP1JIRlhSXmpngn2Bp4mTxJKe2pii56Sn9qan+qup/Kus/qyt/62u/qyu+6yu+6is9qaq9KSo8aOn8KGo7qCn7Z2k6Jui5pme4pKa24uT0oaPyoONwoSIt4OBqIh5mo9tiJpjeqlYabtRX89NWeBJUuhBSeo9Qek9O+M+ON1DOdZIOs5JOMVGM8JDMMVAMeRUSeBHP9o7N9g2NNg4ONg6O9E5OMg3NMA6L748Lr87LsA6LsI4K8M3KsY0J8YyJs40KtAzKtEzKNQzKdYzKtk1LN02Ltw4L949M9s9Mtw7Mds4L9s3Ldo2LNg0KtczKdUzJtMzJdA0Jc82JtI9KdE+Kso5JMAyHMg6Jso0JdUxJ+c1Mfo8PP89QP83PfczN+otMeEtLtktLdcvLtw0M+M5Ouk7PfA5PfYyNvgwM/QwMe0xL+QxKt4yKNUxJc8zJMkxJNE9MfpqX+RUTMg5NdBAP8s6PeRSU+RKSNxDPdE6M8k2LsY4LsU7MMI8ML89L7o7Krw/Lb1ALrw/Lbo7Kro7KL07K748LLw+MLw+MsBEOMhMQsxQSMpORsxMSdBOTOhhZexhZvhocv9ve/9oePdaa/dVav5acv9Zc/tddO5hcuZqdOt9gPGHieh3edpfZPFndP5tfPNldetsd/aRleyin8SUiqKNfGhqVUhRPFdVRnRoXKSMiNu/vvLV2fnj5v/z9v/6/P7+//z9//77///8///6///4/f//+/n/9ff98/3/9///+P/99v/99///9v/57/Xv4fLs3Pr14f/95//95P/+4v//5/3+7Pn67Pf361ZPP1ROPlNLPlBKPE9HOkxGOExEN0pEOEhANUZANEU8M0I7MUI5MkE6MkM6M0E8NkNAOUREOkpGOk1HN09HMlFGMFRIMlVINVVJPVFHRVdRXWpogH6CqIyUxZOd2Jmi55+g8qOg96aj+qen/aiq/6mr/qms/aet+6Wr9aOq8qOn7qKn66Sp7aap7qWo7aOn7pig6JSh5ZSf35Sf15WbzZqVvqCMr6qDoKVlf7RdcMJRY9BJV9xCTuU+Rus8Qew8POo/OONBNNxFNNRJNMpJM8JGLr9CLMI/LeJTRd5EPN05N+Y+PupERuVARNk4Pc42Nc1CO8hEOMlDOMdBNcY+MsM5LMI2KcIyJ8YyKMszKM40KtM1LNg1Ltk0Lts0Lts0LORCN909Mdk3LNo2LN85Ld85Lds1KdUxJdg4KM0yIMoxIc85KM44J8c0Iso3JdRDMMg3Js44Ktc2LN41LuYzL+41M/Y6Ofs/Pv9MS/pIRvJCQuw+Peo8Pec3OuUyNuYsMfQrMfgpL/QsLu8vLugxK+A0Ktk1KdM3KMYwIcAuH/RkWetdU89AOtREQ8s7O99NTepSUeBIRdM7Nsk2L8Y4LsY5L8M7Lb46K748LMFALcBBLrs8Kbc4Jbg5Jr08Kb4/LrU3KbM3K7g+McFHOsVLQMVJQchJQstKReVhX+ZeYPFkav5ud/5rdfNdafBYZfhdbfpec/VidOhkb+Nscux+f/mNi/aGhelxc/hyef95hvVhceBYZvaIkf+0tNCuoqCbh11qUERSOVFUP2piVZuIgdrAv/LY2fbg4//09//6/f/+//38//78///9///7//75/fv/+vT/8vL+8vn/9Pz/9vv98v/99P//9P//8/v15/fx4f755f/95/784/794f//6v//8f398/z88lhPQFdQQFdOP1VOPlRLPFJLO1JJOlBIO01DN0tDNktBNUhAM0g+Mkc/Mkg+MkZANEdDOkdFOUpHOE5JNlJKNVVKNFVKNFZLOVhORFVMTVpUYmtog3t+p4mPw5GZ15if56Ok9qWi+aKi/KGi/KCk/6Ko/6Or/6St/KGq9aGp8aGo7KWo7aqp762p87Gp9qyp+KCp+Jen8pKh4paf1qajzraevrmFnLhner9MXdFFUt8+Tec7R+c8ROY9QuBAQOBAQOI+P988Pd1FQsk6NMpEOcpGOroxKdtKRehKSelDRes+Qug7P+Y8P+E9Pto8PdQ8O89CO8g/N8pEO9FNQc1LPr89MLg2Kb05LL83K8M2LMg1LcsyKtEvKtQvK9syL941LudBNd85K9kxJN0zJuU5K+c7Ld84JtUyH88yH8w0H8o1Icc0Isc0Iso0Jc01J881KcowJs8yKdE1KdI2KtI0KNUzJtczJ9w0KeAyKeYzLus1MuszM+kvMuctMugtNO0uNfYtM/YrL+8rLOwvLeo1LuM5LNk3KNA0JcMtHMQzIudYSOlZTss7M99OScU0MdpISOFPUNxKStRDQMw7Nsg4MMY4LMc5K8g8K8U8KsI7KL45Jrw7KLs8Kbo9Kbo9K7c8LLQ4LLU7MLk9Mbs/M7s/M75ANMBANcRBN+9qYfVwaepjX/RtavtxcexhZPRnbf9wef9sevtoePBkb+liaetkau5sbu5xb+5xb/t5e/99hflabPxjd99icPusr7aqmn2RdV1yUUpZOkxSOHNuWqWViMu3sO3V0//u8P/29//3+/34/Pz8/v7///7////+//v//vD/9OX+6eb76u//7vj/9vz/9P7/8//+8f/98f/77v/66v/55v/54//54f/54fz65f//9f//+///+1lQQVhPQFhPQFZNPlVMPVRLPFNKO1JJOk5FNk1ENUxDNEtCM0pBMkpBMkpBMklBNEdDOEhEOUxGOE9INlJKNVNLNFZLN1RLOlhORVVMTVlVY2tog3t9poaMwI2V05aa4Z+e7J+d8Z6e9J6f+Z2i/Z+m/6Cq/6Gs+6Cs9KCr7Z+n6KKl6KWk6qmj7aug7qSf76Cn95qm8Jyh4aOc0LGYwL+NqsJxhMRUYtFDT+I8Ruw4Qe83P+o6PeU8P9xAQdtBQ+A8Q9o5P9pBRMs7O8xCP8pAPcEzMeVPUOZDRug/ROo7Quc4P+I4O9s4OdU6OM87N9RFP8Y9NcU8NMxHPsxMQcFDNbg6LLc5K7k3Kr83K8Y2Lcs0LdEyLtgzL+E1M+Q4NOQ+MuE7Ld42Kd81JuE1J+E1J9o1ItM0H9E5JMs5Isc5Jcc6Jsk8K8s8LMw4LM40KtUzLtY1LdM3K883Kck2Jsc0Iss0Ic80ItgyJN4yJuMwK+YuLOYsLeYsL+YtMuguM+wrLu0sLewwLugyLuA0Kts1J9U4J9I5J9U/LrsqGdZENdA+MdlGPutWUNpCP9hCQedVVuJSUtxLSNRDPs09Nck5Lsg5K8c4KMg7KsQ7KL86J708Kb0+K7o/LblAL7Y+LrI6LLQ7MLc9MLg+Mbo/ML0/McFCM8VDNetpXPJtZOdiW/BrZvVvbOhiYfFrbPx0eP9xfv9vfPZpcu1dZupZYPFiZvdxcP56ePt2d/94fvlSZP5bcORdbvamqammk2qMa1p0T05fO1NaO3VzXKmdjdbEuPbh3P/18f/6+v/6+//7/Pz8/Pr+/fv//vr+//X/+u3/8+H/6eH95un/6/P/8fj/8v3/8v//8f/97//97f/66f/25fvz4Pry3fz03/z35P368/z8+v///VxQQltPQVtPQVlNP1hMPldLPVZKPFZKPFNHOVJGOFFFN09DNU9DNU9DNU9DNU1DN0pDOUpGO01HOVBJN1NLNlZLNVZLN1RLOldNQ1ZNTlpXYmtpgXl7oYWJuYuRy5GW1piY3pmZ45iZ6Zqd7pug9J2j95+n+KCp9KCq752o6Jyk45yi4J6f4J6d4Z2Z45uZ4pab35qa2qSV0LGMwL+CrMdyk8lZccdCU9dBTN8+ROM9P+U9PeU8P+M9P+E+QeE+Q+A8Q9c4PdU/Qc9BQMpDP8M8OMQ5NulXV+BCQ+Q+Qug7P+M5PNw2ONY2NtE5Nsw7NtVIQcQ7Mb41K8VBNc1LPsZIOrs9L7c4Kbo2Kb83Kcc3LM82Ltc1MN43MeY5Nek9OdczKtc1Kto2Ktw2Kt01Kt03Kdo6Ktc+LMU0Ib80H7k0Ibk2Irw4Kb04Kb0zKMAtJeNAO+U+ON49M9U8Lsw5Kcg3JMg3Isw3I9I3JdUzJNcvJtkuJ9suKtwuLdsvL9wuL9ssKd8wK+A1Ldw1LNUzJtA0JdA5JtE+KtRBL8IxIOdTRdI7MNpBO95DP+hKSfBUVe1VVOdTUeNPTd1KQ9ZDO888Mso4K8U2JsQ3JsA3Jbw3Jrk6J7k8Krc+LbU9LLI9LLA6LLE7L7Q8LrU9L7c9Lrk/ML5DNMNFN9xcUepnXeRhWfBsZ/ZwbedhYOxmZ/NqceBSXu9ea/VocfJlbfFgZ/Rlaflxcf54d/p0df9udfNKXfhSaORbbfGcoaOcimGAYFVvSE9kPVdgQXd3Xa2lkuHRwv/u5v/48f/8+P/++v7/+vv//Pv//fv//fn/+/P/9uj/7tz+49r43uH54ej75e/86Pb96/3+7P366f/66v/35vrx4PTo2PLn1fbr2fjx4f768f38+P/++1xQQlxQQltPQVpOQFlNP1lNP1hMPlhMPlVJO1RIOlNHOVJGOFJGOFJGOFJGOFBGOkxFO0tHPE9JO1JLOVRMN1dMNldMOFdLO1ZMQlVNS1xWYGpofnl5m4KFsoqNwo+UzpOV0pWU1pWV25aY45ib6Jie7Jqi7Zuj65yl6Jii35af2pWb1ZSY1ZOX1pKT1pGQ0oWEvZGDtqV9sbdzoshmj9JWetVHYdQ8S95BSuBCQ95DQeBCP+FBQeQ/Q+c+Rec9RuM/RtY6PtE/QNFFRMZBPLo2McU+OupaWd1BQuNAQ+Y9QOM6Pds4OdM5N9A8OM5BOM9FO8I6LrsyKMA8L8dFN8RFNr0+L7g5KL04KcI5Kcs4LtI6L9k4MOA5Meg7N+s+ONgxK9kyKtwzLN01LOA1Ld83Lts5LtY9L8k3KMY6KcE8K748LL87LsE7MMU8Ns45NetDQO1APORAN9k9Mc85Ksc5Jcg6Jsk7Jc88KNA3J88xJdExJdQxKNYzLNQxLNEvKtMyKtM1LNM3K9A3Kc01J8o3Jcw7KMw+Ksw7KM88LPReUOBGPNIzL9IuLOZAQPtXWP91c/9yb/9qZ/ZeWedQR9VBN8c1KL0uIMQ4J8A4KLs4Jrg7Kbc8LLU9LbI9LLA8La87Lq08LrA8L7A8LbE7LbY+LrxCM8BGN8tNQd9gV+JhW/RwbPh0cuZgYeRdYeZdZNZIVOdZZfNncvRnb/ZlbPxrcP5zdv52dvtwc/tlbvFEWPRLYuVYa+uSlqCVg196WVFsQ1NoP1xnRXl8X7CqlOfcyv/16P/58P/78f7+9P3/9/v/+vn/+vb/+PL88+r769r43s7z0srrzM/sztfu0uDw1unz2/L34fb14fv24/z14/Xs2+3h0endze3h0fHo2fz17fz38f7581xQQlxQQltPQVtPQVpOQFlNP1lNP1lNP1dLPVZKPFVJO1VJO1RIOlVJO1VJO1NJPU9HPE9JPVFJPFNMOlVNOFhNN1lMOVhMPFVLQVVLSVxVXWhleHV0k3x+pYWHt4yPwo6Qw4+QyJCSz5CU1JKV3JOX4JSY35Wa3pWd3JKb1o6UzomQx4WLxYGHw32DwX5/uH10n45wlKhnj8FchNZOduJBY+g6Veo5S+ZBR+BFQ9xHQdtHQ99FReZBR+48Su09SuZCSdc+QNBAP9BJRb8+OLMyLMhDPOBVUNxEQ+FBQ+M/QOE+P9o/PdRAPNFEO89GPMc9MsA4Kr01Kb05Kr89Lb89Lb07K708KcI6Ksc7Ks87L9U7L9s4L+A4L+c4M+k6NeY5NeQ1MuQyMOYyMeczMuY0MN0yK9QwJ8sxJ8s3Lcg6MMQ3LsE0LcM0MMw6O90/QOs4O+03NuQ3Mdg1LMw0JsY1IsQ3I8U6Jcs9Kcs4Jsw0Js41J9Q4LNQ6MNM5L9A4LdA+Mco7LcU4J8Q3JcY5J8c8Kcc8Kcc6KM0+Lc06Ktg+MuFDOtQvLeQ6OuAyNN81Ntc1M9Y7Nt5DPuVLQ+pRSepTSOhUSORVR8s/MMQ/Lr48LLg9Lbc+LbQ/LrA/L64+MKw8Lqw8Lqw8Lqw9LK08LLE9LrdBM7pENsZMQd5iWOJjXfBubPRycuVgY+VgZedgZ/drdvtvevdrdu1gaPBfZv1scf94e/95fPptc/heavNBV/RDXehVaOaHjaOTg2d/XVl0SV51SWh3UIGIZrOylujizP/66f/97f/+7/3/8vv/9Pj/9PT/8e376uTy4dju18Xox7vkvLreur/evMfgwM3iw9jmzOPr0+zu2PTx3vfy3/Pq2ezg0ujazercz+/h1vLo3/Ho4fLp4ltPQVtPQVtPQVpOQFpOQFlNP1lNP1lNP1hMPlhMPldLPVZKPFZKPFdLPVdLPVhMPlFJPlFJPlNLPlVMO1hNOVhNN1lMOVhNO1dLP1VMR1lTV2Vebm5qg3V0ln59pYSFsYaJtIeJuYqLwYuNyI2Oz46O1I+P1Y+Q05CU04uQyoOIwHyBuHV8sm92rWlvq2xqnIBsiJNjea5ZdstQb+NCZPA3VvY0TPc4SO9AReVGQt1KQ9tKReFHR+hDSvI9TvA+TORDSddDQ8xBPs5JRLo7NLA0LMlJQNVMRthCQdo/Pds7O9o8O9hAPdRFP81HPMtHOsA4KsE4KMA4Kr45KLw5J7s4Jr06KMA7KMQ7Kco9LNI8Ltc7Ltw4LuE2LuQ2L+g1MOkzMuguL+ksMO4wMvU0N/U3N+40NeYyMdouKtc0L9U2MtEzMs8vMdIvNNs2Peo6RO0wNu4wMuYzL9wzLNE1Kco3J8g5KMk8KMY4JMk2JM42KNM6LNo+Mt1BNd1BNdhBNtNHOMlBMcI7KMA5JsM8KcY9KsU8KsU4Jsw6K803Kc0wJ+ZDPNsyL+8/QeMvMtoqLNUxL9I1LtU4MdY5MNI4Lsw1KsYyJsAxI85FNcZBMrw9LrU6KrE5Ka85K6s6LKo6LKs7L6s9MKw+L6w8Lqs8K608LLI+L7VBMslTR+BnXuBjX+pqae5ub+ZjaPBqcfVvePpxe/10fvZtde5ia/Zkbv9yev94fv9xdfppcPhXZvlBWfRAW+pRZuF+g6yXhnmPa22IXW+JWnmKYI2Xcra3mN/ewvn03vz65f//7/v/7/X/7+//6+f65Nzv2dDjzcXewbDWrajTpqrQp7DTq7bUrrzWscfautLfweDmzOjq1PLt2vLp2O7i1Ozb0erZz+zb0+na0+bZ0eXY0FtOPltOPltOPltOPlpNPVpNPVpNPVpNPVlMPFlMPFhLO1hLO1hLO1lMPFlMPFlNP1NJP1RKPlVMPVhMPFlOOlpNOlpNOllOPFlNP1VMRVhPUl9XYmRfc2pmgXNvkHl5nXx+pH6AqYGCsoOEvIaGxoiHy4mIzImIyoiIyIODv3x9tXZ3rXBxp2tspGZnoGxgjoJgcZVWXrNOXtJKXuxAWPc2S/4zRv45Q/M/QulEQOFIQt5JQ+JGSelCSvI9Tu8+Tt1BRdRGRMhBPclIQrQ6L7E3LM5PRslCPM49ONA2NM8xMNA1MdM+OM9FO8hGOcNENb45KMM6KMI6Kr86J704Jb45Jr86J8E6JsQ5Jss6KdM6LNk5K903K+E1K+QzK+ozLesqK/EqLfgtM/wvNP8xN/8zN/8zOP01OPk4O/U4PPI5PvI5QfQ5RPc3Rvs2SP41RfQrNfQtMu0xMuM0L9k2LdA4Ks47K849LMs1JtE4Ktk7L989MuI+NOQ9NOU+Nd9BNtlKPM9HN8lBMcQ8LMI5KcI5J8Y4Ksg5KckyJ9M5L+FAOOtEPt4wL+AuLus0Nug2NtgzLdU3Ltc5MNc6MdU7MdI7MM06MMk7L9ZMP8xGOr9AMbQ5KrA2Kaw2KKs3Kqk4Kqw7La09L64+MK09L6s8K6s8K608LrE9MMBLQdpkWt5jXuhrafBvc+ppbvVyevx2f+5mcPdveflyefZqc/5sdv93f/92fflob/ljbvdSYv5CW/c8WepLYd10e7WaiY2een2Ya3uXZoKVaJGddayyjsvMreDgxOns0e723uXz2dnt0c/mycXewLzVt7TLrqrIpJrBlJbCj5nDk6HImafLnazLobXOp8HSsM7Zu9ndxOXjzuzl1e/h1uva0ufSzePQyuDPyNrMw9XHvltOPlpNPVpNPVpNPVpNPVpNPVlMPFlMPFpNPVlMPFlMPFhLO1hLO1lMPFpNPVpMP1ZKPlZKPlhMPllOPFpNPFpNOlpNOlpNPFtPQVdNRFdNTFxSWl5YZmJdcWpmf3NwjXd2lnh4nHx7p4F+tYR/v4WCxYiCyImEx4J9v395t3p1rXhxp3ZvpXRronBnoHphi4RRWplIRbNFSNNIT+5CTvg6Rv42Qf45QPU9Pe5BPeZEP+NFQuRDSOhBS+49Tes/Tdg/QtFHRMVBPMNHP7I5LrM6L9FVS8M+Nck4M8cvLMUqJsgvKs06M8xDOcNDNrw+L8A7KsQ7KcM8KcE6J8I7KMM8KcI7J8M4JcQ1JMo3JdQ4Kdk3Kt01KuEzKuUzKeoyKvUzM/81OP84PP80Ov8tMv8oLf8oLf4rMfwtM/YpMPImMfcpNv8sP/8qQfwgOfMaL/YiMPMoLu0sMeYwL9oxLNQzK9E1KdA2KtQ2K905MOY9Nus+N+s6NOg3Meg1MOI5Mt9IPddLPNNFN8s9L8Q2KMIzJcg2Kc84Lc40KtQ2LeZDPN84MuAyMdIgIOw4OeU2M9UxKNI0KdI0Kc81Kc42K8o2Ksg1K8U3K+NZTthSRspIO75AMrc7L7U7LrU8MbU8Ma85LbE7L7E9MLE9Lq87LK05Kq05LK46LbE8MtBZUdxiXexwcPR2ee5tcvVxfPZyff96g/9/if95gPRocfdlcP9xfP91f/9rdPheavZPYf9BXvc4V+lHXttudLqdi5mphIKebn6aZ4GXaI2ccaGpgrS6lsjNrdXcvczZu8HUtLLMqafCn568mJq2kJayjJCxhomzgYa1fo25hJXAi5zCj5/EkajFmbLIob7OqsnStdrZxObfzere0unWz+HMydvGw9TBu869tci3sFpNPVpNPVpNPVpNPVpNPVpNPVpNPVpNPVhLO1hLO1hLO1lMPFlMPFpNPVpNPVpNPVpMP1pMP1pNPVtOPV1NPV5PPFxPPFxPPllNPVdNQ1dMSFhOT1pQWF1VYmBZaWFccmpmgW9rjnNwm3Zxp3t1s4N+wYqDyYqDx4h/wIp+vIh5soNyqIZyp410q4dso4ZchJBITKRCObZBOs1DQN5AP+g6O/Q8Pv9ERfc+PPM9POw+PepAQetCSepDTetBTuNBTNA+PsVAOb4/Nrc+M7A8L7I8MMBEONJNRMc2MdQ7Ns0yLswzLtZDO8c/M7U2J7s+LLo3JcE6J8M8KcI7KMA5JcI5JsU6J8c6KMs6J9A5KNY2KNgyJNouIuAvJew3LvU9NfU4Mvc0MPcwLfgqKvsmKPslJ/slJ/slJ/smKvchKfgiLv8nN/8oPv8hO/8YNv0XMf8nOO8jLOYjK+MrLd0tLdQrKNItKdw0MeI2Mug2NO42NvI2NfIxMu8uL+4sLOUvLNw5MtE6MdI5MexTS7siGsQrI99GPsguJs0uKN48N+hFQOI6N9gvKtouKuI1MeU8N98+NNU8Ls81KcszJsw1Ks07Lss7MMU4LuxiWOBaT8hDOrk2LLo6L7g4LbEzJ7Q2KrAwJbAyJq4yJq80JbA2J7I6KrQ8LrM9MbA6MLpDO9ZcV+xwcPFzdvZ4fPt5g/VxfP98hP13gPp0ffxze/9yfv9yff9teP9nc/xgbvRJXP8+XP8+W+RBVtRla7SVgJKheoOdbX2ZZn6UY4eXapSfd56mgaCog5yohJKjf4qjfICfdnqacXmab3ydcoGgdoOkdYKtd4OzeYu4f5G8hJO+hpe+h5y+jKK9kKe8k6+9mr7Cp8/Mud/Tx+PSytzHxNS/vMy6tsGyq7mqpVpNPVpNPVpNPVpNPVpNPVpNPVpNPVpNPVhLO1hLO1hLO1lMPFlMPFpNPVpNPVpNPVpMP1pNPVxMPV1NPV1OO15PPFxPPFxPPl1QQFtPQ1tORllOSlpQUVxTWF9VXl9XZmRcdGlig25nkXFqnXhwrIB5vIeAxIqBxI+AwZB+uo10q4xuopdxpKF1qJpqnplXe509Qao1K7E1K8I8M9NAON0+OOg/OvNBPfU9O/U7PPQ7QPE+Qu5ASehBSeJAS9pBRsc8Ob09NLY8MbE7L6s6LK46K71BNdBKQdpHQNxBPdQ2M9A1MdVAOc1DOLs5K7I1I704J8I7KMQ9KsQ9KsQ7KMY7KMc6KMo5KM85KM82JtQyJdoyJeM1Kuo4Lu84MPA5MecxJucvJeouJe8sJvYrJ/srKf4sK/8tLvwqLfolK/okLv8nN/8kO/8cN/8UM/wTMPUeMPYuOfUzPOUqMdsoLNwuMN4wMtsrLvE6PvQ3Pfc0OvYyNvYvNPgwM/kyNfQ4N9syLdo7Ndc4MuRFP+RFP84vK9EyLsEiHtQ1MeE/OuhFQOA9ONgzLdkyLN02MN06MdQ6Ls85Ksk1J8c1KMg5K8o8MMo8MsY5L+1jWeFYTslAOLo0K8I5McM6ML82LMI5L781K740Kr00Krs1Kbg2KbU1KLQ2KLA2KbQ7MLtCOdNZVOhsau9xdPZ4fP58hPh2gP58hPx5gfl2fv51f/9zf/9wff9rd/xkcf1fbvZJXf8+XP8+XOlDWdNlaK6Od4mYb3qVYnWSXHiOXX+QY4qVa42YcIuVcIWUbXCHXWyJXWiJXGeNXmuPX3GVZXmbaXqfa4GsdISxdoq3fI27fZC8f5O8gpa9hpu7iZu1hqGzi622l769qM/Gt9jHv9bBvM+8uMa3tLqsqbKko1xMPFxMPFxMPFxMPFxMPFxMPFxMPFxMPFpKOlpKOlpKOltLO1tLO1xMPFxMPFxMPFxMPVxMPV1LPV1NPV1OO15PPF5PPFxPPF9SQV1RQVxQRFtORlpPS1tQTl1RU11SWl9TZ2NYdmhdhWtikXNrpH92tYZ9vol9vZeFwZmAt5t2qZ5wnq51orp2pbVpmLFSdLg8RL41Lbo0K8A8MMtDN9NFOdtDOOQ/OfE9PPc6Pvk6QfY9Re9AR+ZBSNlARc9AQsA7Nrg5MLE5K605Kqk4KK05Krs/M89GPNlEPtc5Ntk3NNo7N9xDPd1PRc5IPLUzI745KME6J8Q7KcY9K8k9LMg8K8k6Kcw5Kc83Kc8yI9MvI980Ku49M/Q/NvE5Mek0K+A0Jt81JuIyJeUvJOssJO4rJfErKPIrKPMrLfAoK/ImL/goNv4lOv0dN/wWM/gYM/QlN/IwO/M1QfI4Q/A7RPA8Rek1PuQsNvAyPPMvO/YuOfYtN/UuM/UuMfMvMe00MtwwLOI9Odo2NN87Of9tauVDQdEvLc4vLNk6N99APOBBO9s8NtU3LtY1LdY1K9I2Ksg2J8M2JcI2J8Q4KcU7LsY8McY8McU7MetgWeFUTck8M78wKMs7M9E+Ns47M9I9Ntg9ONc8N9Q9Ns88Msk7McM5Lrw2KrY2Kbk7L7xANs9UTeNnZe1vcvh6fv+BiPt8g/t8g/t5gft4gP93gf9zgf9uff9ndvtgcPxbbfVHXv88Wv8+XOxGWs5gYZ5+ZXaFWmmEUWiFT22DUnSFWHuIXX2IXniEXHGCWGB6TV9/UGGFVWWNWW6VYHWcZ32gan6jbYOscoSydIi2eIu5eYu5eY25epG6fpS6gZOxf5WsgJuphqmtkrq1ose5rsu4ssi2tLisrKqhoqCXmltLO1tLO1tLO1tLO1tLO1tLO1tLO1tLO1pKOlpKOlpKOltLO1tLO1xMPFxMPFxMPF1LPV1LPV1MPF5NPV5NO15PPF5PPF5PPF5RQF5RQF1PQltPQ1xORVtORlxPSV1PT15QX2JUbWRZe2leiXBnnHx0rYV7t4h7s5mFuqWFtK+Aqrh6ocZ4n9F1nMxjjMhNbNxGUt9BQNVBPc9FO8xIO81HO9NFOd5BOu5AQfU8Qfo9RPg/R/BBSOJBRtJAQcY/PL8/NrY8Ma85K6s6Kqo5Ka44Krw+MM5EOtU8N9UzMeA7OeVBP+FEP+hTTN9VSr86K8E5Kb43JMA3JcQ7Kck9LMo9LMs5Ks44Kc00JtIyJtkyKeU5L/E+N/U+NvA1LuQvJuA2Kd42KeA0KuMxJ+cuKeotKewqKOwqKuopLOgnLOsnMfIpOfYmPPchO/sePfslQfs2SOQoNucuPP9QXP9gbP9QXPI8SfM5R+gpOO0qOPEtOfQwOvEyN+owMeErKtcoJdgwLdo3MtQyL+VDQP9zcPVWU90+O+VHRNs9Oto8OdU6NdI4MNE3LdA2Ks00JsYzI741I7k2JLs4Jr87LMA8L785LcA6L8U8MuVYUdxNR8o3MMcwKdc8N95BOto7Nd88Nec+Oek9OeY/OeFAONk/NdA8Msg6LsE5Lbs5LLs9MctOSOBjX+xub/p8f/+EiP1+hfh5gPh5gPx5gf94gv90gv9uff1ldPlebvdWaPNFXP04Vv88Wu5IXMdZWopsUmNyR1x0Qlx5Q2R6SWx9UHSBVnaDWHKBWG+BV22HWmyOXG+VYnWdaHukbIGob4SqcYWrcIWtcYWxdIi0dYm3dom3dom3dou4d4+5epG0fI+re5KkfJukha2rlr6ypMi3r8e4tbSrrqGepZeSmVtLO1tLO1tLO1tLO1tLO1tLO1tLO1tLO1pKOlpKOlpKOltLO1tLO1xMPFxMPFxMPF1MPF5LPF5LPF5NPV5NO19OPF5PPF5PPF5PPF5OPl5OPlxPP15OQV1PQl5QRV5PSmJOWWJRZGNUcWRafWxlkXhyon93qIN2pJR9p6yGq8KJqc6Cntp3lOFsidtYd9pEX/NCVPpEUO9KUOFJSNBFPstFPNBGPNlEPuhCQvBAQ/VAR/VCSO1ER99DRM9BPcI/N79AN7U9L646K6s6Kqo5Ka44Krs7Lsw/NuFGQeI9O+5CQutBQd47NuNKQuZYTNVLPshAMsA4KLwzI8E4KMg8Lck6Kss3KdA4K84wJdczKeA4L+k7NO06Ne02MOswK+UsJ+MwLOMxLecxMOwzMfMyNfYzN/c0OPc2O+wtNeosNu0uPfEwQ/MtRvYpR/0rTv8zUvQ5TOUzP/BATf9fbP9sev9XZvVDU/U+UO4zRO0zQe0zPuk2POM5Ods4M840KscvJMsyKscuKNA3MvJZVPZcWvJYVttBP+JIRtxCQNQ8N843MM02Lc84Lc85K8o3J8I1I7k4I7M5JLU6KLg9Lbk7LLY2Kbw3LsY9NdtOR9lFQc41MNAxLeE+OedAOuM4Mec1MesyMO4yMes1Muc4M+E6Mtg6L9A5Lsg6Lr42Kro4K8hJQtxfWetubPt9gP+Fif1/g/V2ffZ3fvx5gf94gv9zg/9rff1kdvlecPRTZfRGXf04Vv49Wu9MXcBUUnpfQldoPFlxP1t2Q2Z5S25+UXSBVniFWnmIX3eMYXmVZXiaaHqgbXyncYGqcoSrcoWrcIapb4etcoiwdImzdIi1dIe1dIW3com4dIu4d5C2e46seI6jeJmkgq2tlcC5p87AtdLEwby5wKiqtpycqFpKOlpKOlpKOlpKOlpKOlpKOlpKOlpKOlpKOlpKOlpKOltLO1tLO1xMPFxMPF1MPF5LPF5LPF5LPF9MPV5NO19OPF5PPF5PPF1OO11OO15PPF9PP19PP2BQQGFRQWJQRmJOUGNOXV9QZWBVc2dhhXRvl3t0nX1xl492lq6Dn8yLoduCluZyhetkdelQZOk7UvkzTP88UftFUulES9U/QM5APtFDP9ZFQuNFRuhCRO5BRe1DRudERdpFQctCOr8/NLs/M7E7Lak4KKg5KKo5KbA4Krw6Lco7M+hJRek/P+s9PuU3ONoyL95BOu5aUPRoW9pQQ8lBM741JcI2J8c5K8g5K8s3K9I4LNEwJto2LeY7NOk7NOo0MOgvLOotK+stLfM0OfUzO/gzPfwzPf8xPv4wPf0xPfkxPvUwQfIxQvQ0S/U1TvUwTvYtT/8xWP8+X+YzSPlPXP9hbv9fbv9XZvtQYPREWOk4SvNBUeo6R90yOtIvMsoyLcI4Lb07K7w6KsQ6L8AyKNlKQvprY91MR+FQS887Oc87OeBMStRAPMo3MMo3Lc48L808K8s6KcQ7KLQ7Jq06Ja88KbM+LbE5Ka8zJ7o6L8pEO9ZHQdhDPdQ3MtcyLuc7N+w6NugyLu0yLfIsLfQsLPIuL+8zMeg3MeI6Mdo8MdI+MsI2Kbo0KcVCOtdYUudqaPp8ff+Gif6AhPV2ffd4f/16gv94gv9xgf9pe/tidPhdb/JRY/dJYP86WP0/W/BPX7pRTnFYOlNmOF11RWF8SW6BU3aGWXuIXX6LYIGQZ4KXbICcbH2fbXykb32ocICpb4KqboOpbIWpbIircYiucYiwcoazcoSzb4O1cIW3com4dIu1domsdI6ld5qohLC0mcjDr9jMvtrRzMLCzKuxwZuhsVpLOFpLOFpLOFpLOFpLOFpLOFpLOFpLOFpLOFpLOFpLOFtMOVtMOVxNOlxNOl1MOl5LPGBKPF5LPF9MPV5NO19OPF5PPF5PPF5POl9QO2BPO2FQPmFQPmFQPmFQPGJPQWVNTWRNV2BPX2FVbWdigHVxknx2mIBzkY91jq2AlM2GlN9+h+5xefljbPpQW/o7Tf8qRv8yUf88U/E8TeA8RddARdVDRNRCQ9xDReBCQ+RBROJCRN5EQtRDPslAOL4+M7g+Ma85K6g3J6k6Ka08KrQ8LME9Mc8/N989OuU5OeMwM+IvMuA0Mts5NOZNRfxsYfJoW9lRQ8Y8L8Y6Lcg6Lsk3Ks02K9U4L9U0LN43L+Y5M+g2MukxL+gvLO4xL/UxNf8yQ/8wRf8tRv8qQv8lQP8jPfwgOfYgOPcnQfUrRfUuTfUvUPMrUPQpVP8yYP9BaPNDWP9gbf9odfhWZe1LWvFMXOtCVdoyQ+tAUt03Q8ktMbooKLEuJKs4JqU/JqhAJ7g/Lrw6LN1ZTeFdUc1HPs1EPsE2M8k7N+RVUdVGQMk5Mcg4Lck6LMg5KMg5KMQ9KbE/J6Y8Jqg7Jqw9Kqs3KKwzKLw9NNNMRtZHQd1FQNs5NtwzMOk3M+w1MeswK/QxLf0sL/8rLfouL/QxL+00L+Y4Md87Mdg+Msk5Lr0zKMA7Ms9OSOFhXvd5ev+Iiv+Dh/l6gft8g/97hv94hP9ufv5ld/decPVabOtMYPVJYfw5V/s9We5NXbJKR2hRMVFkNlx0RGZ+TnWIW3+OY4SQaIaSaoiXbomec4ikdISmdH+ncn2ocH+oboGpbYOpbIWpbIWoboerboWtb4Wvb4GwbICya4K2boW3coezdIetdI2nd5yshbK5msjGr9fOvdnSzLu/yqSsv5KarVtKOFpLOFtKOFpLOFtKOFpLOFtKOFpLOFtKOFpLOFtKOFtMOVxLOVxNOl1MOl1MOl5LPF5LPF5LPF5NPV5NPV5PPF5PPFxPPGBRPmFSPWFSP2JRP2JRP2FQPmFPO2JMPmhPS2dOUmJQXGNXa2pmf3V2lH18nH94l5F6lquBlcaEktp9hfB1ev5sbf9ZW/1ETP4vSf81Uv88VfM8Tuk/TONDS91CSNY9QNtBQ9xAQd5AQdtBP9hDP9BBOcc+NL09MLU/Maw7K6k4KK08LLQ/LrtAMcpBN9hDPdk3NOE4Nd4uLuIzMOY6NtMwJ881KetVR/93autbUNFDN8o8MMs7MMk3Ks02K9Q6MNo3MN84MuU2M+czMuowMe0xMvQzNv00PP4lNv8jOf8iOf8iOf8hOP8fNv0dNfgeNu8bMu4fOfAlQu8oR+4mSvEnTf8zXP9FaP9idf9gbPdXY/FRXfJQXe9NWuJATdQyPdo9Rsw3O7svLq4vKKY1J6I7KJs/Jpw+Jao5J7I4K9JWSrs7MsQ/OL40Mb0yL85DQOVXU9VIQcg5McQ2KsU2KMQ1JcY1JMM6KLE8KKc6Jqg3Ja05Kqw0Jq8xJcI/NdtSStlJQeFIQt47Nt4yLuo0Me0xL+8tK/wyMv4sL/0rLvkrLfMrK+0tKuYxKt80LNY4LNE9Mb8yKLw3LshJQtlcWPN3d/+Ji/+HivuAhf5/hv99iP92hP9qfP5fc/dYbPZUaepEXPVEXvU2VfE6VuBMWqVIQ15LLU1jNVVvP2J9SnSMXICWZ4eYbIibboqgcouldoyseoard4Gqcn6nbXylaX2lZ4GlZ4KmaYKla4KobYOrbYKsbH+uaH6waYGzaoS2b4m2c4mvco6seJmwhK27mL/FqcvKtcvNwra9xZ6quouXp11LN1xLN11LN1xLN11LN1xLN11LN1xLN15MOF1MOF5MOF1MOF5MOF1MOF5MOF1MOl1KPF1LPV5MPlxMPFxMPFtOPV1QP15TQWBTQl9SP2BQQGJRQWNSQmRRQmROQWRMQmpNSWhLTWRQWWZbbG5rhnd7noCFrYmIso+DqaWHqb6IoNCCkuJ5fvBzcfpqYv9hXvlKV/E+Ues6TO4/Tu9DUepAS+Y8R+U+RuE8Qt88P9o8PdY8Os8+Oco9NME7MLg6LKc2Jq9BMK08LKw2KL9BNcxGPcw9NdA3Mto4Ndw3Md41Lt42Ld44Kt08Ktc6J9M2Jdk7MPBTTPJaT9lFOcc4Ks0+LtRCM9I6LdQzK/BHQuEvL+41OvM2Pe4sN/9CTfEnM/omMv8pMv8oMvkdJ/0iKv8nL/4nL/AdJvAeKfkrN+ogLuwmN/EtQecjO/9YcuctRP9dbP9faf5aY/lVXPVQV+tITd0/QM04NMs+N8RBN7c/MaY3JpkyIZk2I5o7J588Kac4La43L8JFP787N70zMcQ2NMU1NNREQ9tMSNpLRdFEO8g6MMQ0Kcc1KMs0KcU1Krw8L7M5LK0vI6soHrMtJMM5L9JDO9hIP+RQRt9FPdo3MN0wKucwLPIyMfkxM/0xNPcvMfYwMfYwMfMwLvIwLu0yLeY1Ld05L9U9ML4yJcA+Mbk9M9ZfWelzcf+Pj/uEhvuHiv+EjP94iP9off9fd/9bdf9Vb/hMZvhFY/E6WfQ7W+Y/WdtdaYtAO1ZGLUxeNll1QmeGTXeWXX2cY3+dZ4ChaoOmboKob4Cnbn+mbX6lbH2laXykaH2jZn+jZX+jZn+lbH+mbYGrbH+sa36tZ3+uZoGxZ4OzaYe1bYu0co2wdo6ufJm0iae9mbHBpLLBrqaysI2YnnqFi11LN11LN11LN11LN11LN11LN11LN11LN15MOF5MOF5MOF5MOF5MOF5MOF5MOF5LOlxLO15MPl9NP15OPltOPVtOPVxRP15SQl9TQ11RQV1PQl9PQmBORGJQRmNPSGVOSGlNSmdOUWVTX2dfdG5ukHl+qICHu4eKwZ6VyqOLu6t/o7l4kNN5g+p8e/R2avZpYPhdYfNPWuxGUvJIU/hJVvVFUO8/Sus7ReQ5P+A6PNo6OtU9OM4/N8c+NMA8L7c8LKs8K6o/Lak4KLI6LMFBNsU8NMc2MdQ8N9I1MNY1Ldc1Ktg0KNk4Jts6Jts7Jdo5J902LuZBO+tNROFJPNA+L8c4KMo4KdM7Lt47NPZKRuQwMfA2O/Y2QfEuPP9ATu8nNPMkLPclKPspLP0rLPwqK/goKPYoKPcrLO8kJ+0lKOolLP07RNkbJ/A0Q/xBUtgmNv9qdf9iav5aYfxXXfRPU+VCQ9c8ONE+Nr44LL9ENblINqk+LJkvH5ApGo8oGZIoG54tJbA6NtFUUM5IR8M1NMY0NdE9PetXVdhHQtZHP9BBOcc5L8YzKco2LNA3L843MMc9M8I5McI1LsMyLck0LtE4M9g/Od5FPeRKQN5BONo2Ld0wKucwLPIyMfswM/swM/QwMvMxMvQwMfMvMPMwLu4xLec0Ld85Ldc9Mb8zJL48L7c9MtNeV+l2c/+QkPmFiPiFiv+Civ90hf9mfP9cdv9YdP9Rb/5JaPxAYfM6WvE/X+FJYMFTXHs/N1JGLk1fOVp2Q2WHS3OVWXicX3edYnuhZn2laX2manylaXylaXykaHujZXuhZHuhZH2hY36iZXyjan2mbH2pbH2qaXyrZX2tY3+vY4KxY4WwaIeya4ivcIirc4urfJCshJCqh4yii3iHgGRwcFJeXl1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF5LOl9OPmFQQGBQQF1QP1xPPltPP1tSQ1tRRVtRR1xPR1xPSV9QTWNRT2ZUVGdVVWdVVWdWXGhdbmxphnN2o3yDuoKKy4qN1JiR16CKyqqCtLl9n8+Ak+SEhu5/dvNzavtlZ/dTXO1HUfBGT/ZIUvdFUfJBS+49ReQ3PeA3Otk5OdQ8N81AN8VBNL4/MLY+La0+Lao8K6s6LLhCNsdIP8A7MrswKco6Ms02L9A2LtU3LNg4LNk3KNk4Jtw5JuA6Kt00Lds0LuJBOelPQ95IOsg1JcgyI9lAMuI+NfVIROgxM/I1O/k3QPg0QP9FU/gyP/ApMOsjJuwkJ/kxM/UtL+8nJ+wmJfUxMuspKvY4OugrMeIpMeszPf9SXu89S/9bZ/5eZvFWXO5PVPBNUupFSd06O9U3NNQ/OcA2LME/MrxCNbM9Maw3LaUzKaEsI5wnIJolHqkvKsdFQ8I6OrwsLMgzNddBQvReXdA/OtJDO9BBOcs9M8w5L9Q9NNpAONtAO9tAPNg9O90+O+NBP+Q+PuA6OuM/PetJROBCOd08NNk1LN0yK+cxLfAzMfUxMvgwMvQwMvQwMvQwMfMvMPMwLu4xLec0Ld85Ldg+MsA0Jbo4K7U7MNBbVO16d/+TkvuHivqDif1+if9ygv9kef9bdP9Ucf9Obf9GZ/s9X/Q9XO5FYt9UZ6JBSHA7M1NIMlFhPF14RWaHTnKTWnWYXnSaX3ieY3ujZ3ujZ3miZnmiZnmhY3igYnmfYnmgYXygYnqgY3qiZnukaHunaHuoZXupYXupYH2rYH+uYIeyaoq1bouyc4msdIamd4KedXmTbm+GbFNlWUFQTTJBPl5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5MOGBOOmFQPGBRPl1QP1pOPllPQ1hQRVhPSFtRT19VVGJYWWVYX2lZY2xcZmteZ2xhaWxkcW9rgnJ0mnl+tX+GyoWM2oyO4Y6H15+L062KxLOAqb15jsx7gd6BevKCd/9zcv9jZ/lVXPRNVPVHUPRDTfI+R+88QuU2O+A4ONs5N9Q8N81ANsVBNLxBMbc/Lqs6Kq0+LbE9MLxGOsxSR8dIP7o1LroxKcg5Mc04MdM7MNk9Mds7Ldk2J9w2JuA4K+A1LdsyK+A9NOxOQuNLPdI6LNE4KuBCNt83LvA+OukvMPAxNvc0PPw4Qv9OWv9MVf0+RfIzOOIkJu0vMeosLPAyMugqKusvLvI6OtEaHOYzN90sMug5QPBFTf9YY/NNV9g9Q9pBROFCRuE+Qd45Pdw4Odg4ONM5N8k4M8I5Mb06MsBBOs1OSNZWU9BOTsNDQLI3MrY5Nc9LSdlNTONRUu9ZWupSUfFZVsk1Mc4+NtJCOdBAN9M/NdlCOeBDPOJAO+k/QOc4Pew5PfI/Q+86P+g1OOw+PfZNSt45M9s2MNozK94zLOU0LuwzMPIyMfQwMfQwMvYvMvYwMfUvMPUvLvAwLek0LeA4Ldk/M8I2J7c1KLM5LstWT+98ef+TkvyIi/2Bif56h/1vf/xjd/9Ycf9PbP9GaP9AY/s5XPQ/XulLZNhaaIUzNWc7MFdPOFdnQ2F7S2qJUHOSWXSVXHWYXnedYnmhZXqiZnegZHagYXefYXaeYHifYHifYHufYXqgY3qiZnqjZ3qnZnqnYnqoYHqoXXyrXX6tX4ayZ4u0boyzdIqtc4amdYCdcXSOaWmAZFFjVURTTDhHQF5NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NOV1LNV9NNWBQOV9QO1xPPlpOQFhPRlhRS1lQUWBXXGdgaG5mc3NoeXNne3NnfXFofW9sfXBxhnJ3l3Z9q3qCwX+H0oSK4IqL5ZON452M2qCEv551n6Bsgqxucbx2bNJ2afJzbf9sbP9naf5eYPtSV/VGTe88Quo3PeY1O+E3ON05ONY9N85BN8ZCNb1CMLhAL603KbRAM686MLA7MchSSNVcUclNQ7s7ML45MME3Lcw5L9Y+M9s9Mdo2Ktw0J+I2KuAzLOI3MOQ9NeVFOeJGOd5CM95BMuI+MtswJuo3MuwwL+8uMfEuNPo3P/9QWP9dZP9aX/9PU+EuMeMwM+AsLfdFReg2NtwsLNstLus+QNwyNdkzN/9iaOA9QssqMsotNMEmKtU7PeFARds2OtkzN985Pdw3O80vMMw0M807O9VHRt5SU+xgY/VpbPRla+peYcRAPsZFQOVeW/hoZ/9vcP9qauVLS9c9O8k0MNE+N9dEPNZDO9U+NdU8NNg6Mdw0Me41O/EtN/AsNvIuOO8sNOssM/M5PP5KS98zL9wzLtozK9wzLOM1Luo0MO80L/IyMfQwMvYvMvcvMfYuMPUvLvAwLeozLeI3Ldk/M8Y4KrQyJbI4LcNOR+98ef+Skf+IjP9/if93hfpsfPhhdPtUbv1IZ/8+Yv86X/o2XPNBYeBOZcJXYXAvK18/MFtXPl5sSWV9TWuJU3SSXHWWX3aZX3ieY3mhY3igYnWfYHWfYHWdX3aeX3eeX3ifYHufYXqhYnqiZHulZXymZHynYHmnXnmoWnuqXH2sXoCsYYWvZ4eubYeqcIWlc4OgcnuVbnKKamV4ZVtrXlJiVV9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OOl5MNF9ONGBOOF5POltOPllPRVpTTVpUVF9aYWhicHJtgXp1jHt1kXtxk3pwk3ZwknF0k3J4mnR9qHeBtnqDxH6Gz4SJ2ouM3paP3JmKzZuFtqKDo6qEkat+eZ9sW5pRPrxNQtRRSeJXUutXVfFTUvFLTe0+Q+U0Ouk5POY5O+A7Odg9ONNAOMpCNsBBMLo/L7M5LLpBNqs1K6MuJL5JP9lnXNlkWstVSbg8Mrg2KcAzKc46MNk7MNo2LN4zKeQ2Ld8xKuQ3MeM7Mt05L94+MONGNeRCM985K98xKOk0LfAzMe8tLu0qLvQxN/9FSv9WW/9dYv9cYeI5POM5PNUrLPRKS+I4OdcvL9s1N8woKcwnK/hYWt0+QtU5PdE2OrofI8QoK9w8PuZBRd00OdksMt4xN9kwNc0oLtIzN+RLTvZhZftobvljbPdgafpgbPhia9ZMTNVOSupcWupWVOdNTeNIRs80Ms4zL9lBPOBLRORPSN9KQ9lAONc6M9c2LtwuLfUyOvstOvgqN/UnNPUpNPgwOv8+Q/9KSuAxLt4zLNwzLN01LOE0Lec0L+00L/AzL/QwMvcvMvkuMfgtMPYuLvEvLesyLeI3Ldk9Mck7LbMxJLE3LLpDPex5dv+Njf+Ijf98iP9xgfZoePZfcvlSbPtEY/85Xv82Xfo2XPBGY9FOYKJJTWU1K1ZEMFtZQF5sSWV8TmuIUnSRW3eVX3iZYHueZHqgY3aeYHObXXKcXHObXHScXXadXneeX3ufYXqhYnmhYnqkYnynYnumX3imW3inWXqpWXuqWn6qX4OtZYWsa4epbYmnc4mldYSdc3yUcnWJcG5/bGZ3ZV9QPV9QPV9QPV9QPV9QPV9QPV9QPV9QPV5PPF5PPF5PPF5PPF5PPF5PPF5PPF9OOmFQNmFQNmFPOV5PPFtPQVtSS1xWVl9aYWtndnNvhn16l4J+oYF8pX13o3t1pXh2p3N5qXN9sHiBuHuEv36GxISJyY2OzpSTzZqTx6CVvaubtbymssmtqcWmlKqIbZxmSpxFMq9BNLZANMJCOdZIROhOTu5KS+w/Q+s9P+k7PeQ8O989OtlAONBANcg+McE9ML06ML4/Nq80LKcxJ7tJP9FjVtZoW9VlV8NPQro+Mro0Kcc3LNY5MNk1LN8yK+c2MOIwLOM0L+I3L943LuA+MeVDNOQ+MN40JeY0KukwK/AzL/AuLu8tLvIxNPM3OPZCRfZNUvxZXulGS/ZRV9gzN+tGSt04POZBRdo3Os4uMNEwNeRIS9I3O9A3OrkjJdU7Pds4O+U7Pus8Qec2POItNt0pMuExO+c8RPBMU/1dZf9rc/9qc/pgavZaZ/lYaPdbZvRkZOhaVuhXVNhAPc8xMNQ0NNMzM+FDQONKRelSS+pTTOFKQdk/N9g5M9s4MeMzM/MuN/8wPv8wPfoqN/wuOv87Rf9DSPtBQuMxL980Ld00Ld01LOI0LeYzLO00L/E0MPQwMvcvMvkuMfgtMPYuLvEvLesyLeM3Ldg6L80+MLUxJbE3LLI7Nelzcf+Kiv+Hjf92hv5pffNhdPNbcPdQavpDYv83YP83Yfk7X+xMZr9PW344Nl09ME5GMVZYQFplRWN4TWqFUnKOW3aUXnmaYXueZHieYXObXXCYWXCZV3GaWHGaWHSbXHWcXXmdX3ifYHihX3miXnqlXnmkXHikWXikV3mlVnunWH+pX4KsZISraIaobIelb4aicYCabXiRanGFaWp+Y2J2XV9QPV9QPV9QPV9QPV9QPV9QPV9QPV9QPV5PPF5PPF5PPF5PPF5PPF5PPF5PPF9OOmNROWNROWFQPF1QQFpQR1xUUl9aYWFfbXRyinl4mIGAqIOBsH5+sHl5r3l1sHd3tXd8vniAwX2FxIKIxIWKwY2Pv5eWvqCdvKynu7astb6zsci4q9C+ptbBotG7ltCsiK9vVK5cR6RHNag+MMJHP+BXUe9XVvFOT+lAQ+o9P+Y8PeI9O989Otc9NdE6Mck5MME4MME8Nbk6M7g9NcFPRcdYTcddT9FlWNNjVcJMPrw6LcU4LtI5Mdc0Ld8yLOc2MOY0MOEyLeA1LuM8M+dDN+ZDNOI6Ld8zJeo1LOYuJvAwLe8vLPAzMfE1NOctLuIyNOdCRvdYXfZXXP9vdeVESutITeA8Q/5bYP9vdd49Qv99gv9tcepRVNQ+QMYwMtY6PfJIS+45PvA3P/g9RvI3QugtOPQ+Sv9dZ/9td/9qcv9jbvddZ/pea/9hb/9dbvlZZfJcXeNQSeJKR9U3NNIvMNk1NNIwLtg5Nd9EP+NKROJJQdlAONM2L9Y0L9w3Meg2NuonL/wwPP4yPfcrNvkwOv8+Rf0/Qew0NOIzLuA1Lt42Ld80LOEzKugzLO80L/Q0MfYwMfcvMvkuMfgtMPguLvIvLesyLeM3Ldc5LtE/MrYwJbI2LLA2Mehwb/+HiP+Gjv9wgvxjePFccPRYbvdPaftCYv85Yf88ZPZBYuRSZ7BRV2QvJ1dEM0dHL1JUPFVeP2J0TGmBUXGLW3aSX3qYYnydZHicX3KZWm6XVW6XVW6XVW+YVnKZWnSbXHebXXeeXXeeW3ihW3mjW3ejWHaiV3aiVXejVHmlWHqkWn6mX4GmY3+hZH6cZnuXZnKMXWmCWGB2UlpvUFJnSFxMPF5OPmBQQGBQQF9PP19PP19PP2FRQWJSQl9PP11NPV1NPWFRQWNTQ2JSQmBRPmRTP2FQPl1QQF5RSVtRUFpTWmVhcHNxiXl4mnp8pX6AsYCBuX1/unh6t3JztGxvtnR3yHZ7zICDyouNxpaXw6SkvrKwu7y5tMvGs9PMsNnPrNvPp9zPo93Qo9nLnNnCmNGoiLiAZ6BeRst6Z9Z1Zb1IP9dRTvdjY+lLTOU/QeI4OeQ6OuI6Odw3Ndk2MdY7Nss4McA1LsdCO7s8M79JP8ZYS7lPQc5kVtFjVMxYScVHOcQ6L802Ldg3L+E2L+M0L98wLd8yLOA3MOQ9NOA8MN03Kd81KOU3LOQvJOovJuwvKe4xLe4yMOs0MOg1MeI2NNc3OeZKTvVZXe1OU9c4Pdc2PPlYYP9+hP9+hv9vdf9nb/9pcP9mbPVcYfFYW/taX/9VWv9ES/w4Qvs3QfYyPu4rOewwPvE9SP9TX/9gaf9ncv9lcP5ibf9jbv9gb/1dZ+1TU99GQNY4NdY0MdcxMdcvLtgzMds5NOFEPdxCOtk/N9Y8NNc5MNs4MeA5M+Y2NvA3PPM0O/M0O/Y0PPU2O/I1OeszM+MxL94zLN41Lt83LuA1K+QzK+kyLO8yLPUyMPcxMvgwM/ovMvkuMfkvL/MwLuwzLuU3LuA/Ncw4LL82LK8vJrg7N9JYV/+Ymv57g/9tgP9lfPhccvBQaPRHZfxDZf87ZPk5YPVObNNSZIk9P1AsIEM7JkNHLktNNVlfQ1pqRWN4TXGIWniSYniWYHSVXHKWWXGYWWyVU22WUm6XU2+YVHKZWHSbWnWcXXWcW3SbWHSdV3agWHehV3aiV3aiVXWhVHSgU3ulW3ujXXqeXnWXW22LVWJ+TVhyQ1NqPkFXMD9VLzxSLFtLO15OPmBQQGBQQGBQQF9PP2BQQGFRQWJSQmBQQF9PP2BQQGJSQmNTQ2JSQmBQQGZWR19RRlxPR15UU2FaYWRgb21rg3Z3lnd5ont9rn1/uHh8uXF1tWtwtGxvtm5xvnV20Hx+1YmJ05iYzqinx7i2wcnFutPOsdvXquLbpefepebdouTbpOLYo9vRoNTHm9O8mrucgKl9ZMWLd8p9bbRWStJhW/ZycOxaW+dLTOM/QOc9Pus+QOc7O+I2Nts2NNY9OMk4M8o/OLk2Lrg+M71LQLZIO8hdTd1vYNRgUcZIOr01KcQwJtQ2Ldw1LdswKeI1MeU5NeQ9N+A8M9w4Lts1Kd80KuM1Kuw3Lu01K+0yK+swK+cwLOMyLOE0Lt01MtY4N9g+QORKTPNXW/peYvxcZP5dZf9hafRTW+9OVvFRWf9fZ/9qcf9mbPVaYPNOVO00OvEsNfQqNvctOfEnNeUhLeYnNu03Q/5QWv9aZP9ibP9kbf9lbv9jbf1baPVRWuVFRd48N9s2NN42M981NdwzMNoyL9s2MuA+Ods+N9g7NNc6M9s4Md84MuU5Nec6Nuk5O+o3Ous3Ou43Oe43Oew2NeUzMd8yLNwzLN02Ld83LOI2LOUyK+oxLPIxLPUyMPcxMvcwM/ovMvkuMfcvL/MwLuwzLuU3Lt88M9Q9MsI4LrYxKrc3NNhaW/+Qk/tzff9mev9edvlXb/dPaflGZvs/Yvw8Y/RAY+VPaLlLVng7OEwyIzw6IzxCKEVHL09TOFZkQWBySm6DWHWPX3aTXXSTWHGTVnCUVGuST2uUUGyVUW2WUnCXVnKZWHOaW3OaWXSbWHWdV3WfV3WfV3SeVHKeUXGdUnCcUW6YUGyUTmiMTGKBRlh1P05pNkZdL0BXK0BXLUBXLUFYLllMPFtOPl5RQV5RQV5RQV5RQV9SQmBTQ2FURGBTQ19SQmBTQ2FURGFURGBTQ15QQ2JVTVxRTVtRUmNZYmtkdHFthHZ1lXl7pHl7rHl+tnh8u25ztWVpsGBnr2puuHJ1xn1914eE3ZeU26mn2Lu5z8vKyNzYv+XhtOnkqu3opvDppe3lpOfhp+Lbp9fPocvDnLivkKmbgZuDa6iDcKdvYJxSR7pdVd1tafd1de9fX+RKTOVAROtBROw+QOg4OuI2Nt89OtQ7NtRBOsI3MLc3LLc+M649L7ZGONtqXN9pW9lbTcpCNsUyKNE0K9k2LdkyLN41MulBPuxHQ+A9NtUyKdUxJ9oyJ94wJeY0KugxKecuKeYvKeMyLOI3L+E9NOBCOcYtKMo0M9xEQ/BWWPpeYvdaYfNTW/FRW+hGUepIU+9PWfxcZv9tdv9udPRZX+M+ROkuNfQtNPsyPPwyPvUrOe0nNPY2Rf9LV/dJU/VQV/hXX/5eZv9ja/9gafdSWelCSd45N943MeM3Nek8OOs7O+Y5NeE1Md02MN06M9k7Mtc5MNc5MNw3MeE4M+c6Nuk8OOM5OeM5OeU5N+c5OOg4OOY3NOE0MNsyK9o2Lds3Ld44LOI2LOcyKeswKfMwLPcxMPUxMvUxM/gwMvcvMfcvL/IwLu4zLuc2Lt05MNxEOcc4MLs0LrUvLuRfYv+DiPhsd/5ieP5Xc/pQbf5MbP9DZvY6XfM7X+xJZtRTZ51ESmw7NE8+LD08Jzo/KEVEL0ZIMFFcPFlrRWd8UXKJW3SPWnGQVW2PUmuPT2mQTWmRS2mSTGuUUG2WVG6XVXCXWHGYV3WcWXWdV3ScVXKcVHCaUm2XTWuVTWqUTGWNR2GIRVt/QVV0O0xpM0VgLUFYKj5VJ0JcL0VfMkljNldKOlpNPVxPP15RQV1QQF5RQV9SQmFURGBTQ2BTQ2BTQ2FURGFURGBTQ19SQlxQRFpPTVpRVmJYY2pjc3FthnZ1lXh6o3p8rXd8tHN5t21ytGJpr11krGFnsWxyvnh7yomJ35WR5aSh5La14cfE2dXRzuHdxOfkuevmr+7qre7orOniq+PbqtrTqcvCobu2maWljZuZhJOIdpiBcZlyY5tiV7NpYM9ybfuLifV1dOpbXeZMTuhDR+1AROw8P+k7PN86ONs8ON5FP9NDO8M6MLo6L7A2KacxI79JO9thUuprXNtTRck6LMw0J9Q2K9c0Ldk0MvFNS/5aWO1LRtk4MNYzKts0K94yKN8uJuEsJeEsJd4tJdwxKdo2LNk7MNc/NMIvJ8Q0LM46NtlDQt9GSOBFSeRHTupNVvFRXfZWYvhYYvlcZf9ncP9tdfRZYd47QOoxN/EuNPItNvArNOslMuwoNPs9Sf9TX+0/SehBSepHTPRRVv9ZYP9YXfRHTeQ2OOE1M+Q3M+o7OPJAPvRAP+89O+Y5NeA3Mt04Mto5Mdk4MNk4MNw3MeM3M+g5Nuk6N+I6N+A7OeM6N+Y6OOc6NuU4NOA1LtozK9o2LNs3Ld44LOI2LOcyKeswKfIvK/YwL/QyMvQyM/cxMvYwMfYwL/IwLu4zLuc2Ltw4L+BGPMk5Mb4zLrYsLO5mav95gPhndP9ief1Ucf5La/9Hav8+Y/I2Wes9XuNRaMRYZYhCQmdDN1tOO0dGMUFDLUpIM0VFLUxVNlNjPmJ0TGyDVXCLWG6NUmuNUGmOS2ePSWiQSmiRS2qTTWuUUG2WVG+WV3CXVnSbWHObVXGZU2+XUGqTTWeQSmWOSGSNR2CHRF2BQVd5PVJxOE1pNkxmNk5lN09mOExmN09pOVNtPlVIOFdKOltOPlxPP11QQF1QQF9SQmFURF9SQmBTQ2FURGFURGBTQ19SQl9SQl5RSVZNUl9YaG5me3RwiXh0l3h3oXh6q3l7tHN5t2pys2BnrVtjq19nsGpyu3Z8xoCEzpOV4J6e5K2u57u95svJ39TT2N3bzuHfxuXhvubivOTfueDXttrQtc7Gsb61pq2nm5iajIyOgImFeYp8cZF2a5tzaahtZbpvaeaJhO6BfvNzcvFlZPFXWfBNTu5ERexAQOM6N+A7N+RCPd5FP8w8M8Y9M8RCNa8xI64wIsdJO9xYS9ZOQMw9L844KtA2KtEzKtY0MvVVVf9raPpdWONEPtw7M987MuM4MOI0LeMyLOIxK90wKdQwJ80vJMYvJMIwI8U5LMA0J8EzKcs6NddDQdtFR9tCR9pASOBET+tPWvJWYfJWYfpeaf9nb/NZYeFCR+o6PO01N+0zOO8yOPEzPfc5Q/9IU/9WX+Q2P900O982O+tBRPlKT/xJTfQ7QekxM+g1Mes5Ne88OPI8OfM7OfA6N+k3M+I3MN87Mtw7Mds6MNw5MN84MuQ3M+g2NOk3NeY6OOQ7OOY6OOg6Oeg7N+Y5NeE2L9wzLNs3Ldw4Lt85LeE3KuUzKekxKfEwKfQxLfMzMvEzM/QyMvQwMfQxL/IwLu4zLuc2Lt43L+BDOso3MMAxLcAxM/dqcP9xevpmdPtddPpQbf9DZv89ZP85Y/U4XuZFZNlabatWW3dFPmRKPWFZRlRPO0tJNFBJNkdFLkdQM0xcOFpsRmZ8Tm2FU22KUmyMTWiNSmaOSGePSGeRSWmSTGqTT2yVU26VVm+WVXSZVnOYVW6VUmqSTGaPS2OMSGGKRl+IRlqBQlh8P1N0O1BuOE9rOlJsPVduQFpxQ1VvP1ZxPldxQVJFNVVIOFhLO1pNPVtOPlxPP15RQWBTQ2BTQ2FURGFURGFURGBTQ2BTQ2JVRWFWUF5WY2plfHl1kH15mnp5oXh5qXZ5sHN3tGpys2NqsFtjq11lrmhwuXZ+x4GH0YiM05md3aOl4K+z47u/5cbH48/O3tTT2NfW0dnXy9nWx9fRxdLJwMzDvsW5ubSorKOanYqLhnh7dHl2cXVsZX9sZY1vZ45hW51gW8Bzbdh5dfB/e/x8ef9ycP1jY/ZTVPBIR+9DP+o+OuE8NuBBO9E6MdNDOt1USsI+Mrg2Kb05LMI9Lsg/L89CMddDNdZAMdE3LdAyL+pMTfpfXfJXU99EP9k6NNs4MeA3MOY5M+c5Muc5MuI6Mdo5L9E5LMo4K8Q4KbAoGLgzIshAMtNJPtJEQMs7Osw3O886QNE3QeJIUu1WX/BZYvVeZ/dgaepVW9xBReVAPuw/O/FBQ/pHSv9MVP9RWf9UXf9WXuE0OtovNdwvM+c3OvQ9Qfg7P/c0OPMxMu00Mu85NfA4Nu00MusyMOoyMOc0MOE0LuM8NOA9NN88M947MuE4M+Q3M+g0M+g0M+g4OOc5OOg4OOs5Oes5N+k3NeI1L94zLNs3Ldw4LN06K983KuMyKOcwKO8wKPIxLPE0MvA0M/MzMvMxMfMxL/ExLuwzLuc2LuA5Mdk8M8w3McEwLdFAQ/9udf1rdflicfBSafVIZv87Yf80Xv82Yvs+ZOROacpcaYtHRmpGOl1MPF1WQ1hRPlJKN09HNElELkRKLkdVMlNjPl5zSGd/TWqHT2qKS2eMR2eMRmaOR2aQSGeQSmmSTmuUUm2UVW2UVXGVVW+UUWqRTmeOS2OMSGCJRV+IRl6GR1yCRVt+RFd4QVZyP1VvQFlwQl1yR151R1tzQ1l0QVhzQE5CMlFFNVVJOVdLO1hMPFpOPlxQQF5SQmFVRWJWRmJWRmFVRV9TQ2FVRWZaSmhdWW5nd3Vwjnx4mXt5oHd4pnZ3rXB1r2pvr2ForF5mrl9nsGVttnB4wH2FzYmQ2I+X2Jmg1qGo1qqx27S537q/38DB3cPD28fG2MbD1MXB0MG7ybyzxLuwwbWovKaYr5aLnIiFjHFxcXRwb3BmZXdoZYZuaoRfWZVkX5taVLlmYNlzbvB6dv97d/93c/9oZvxaV/5STvVIQuY9NudEPdg7NNtHPepcUsU7MMQ8ML03K742KMc+LtFEM9RCM9RBMddBM9I4Ntg+Pt1DQ9xCQNY9N9U4Mdg3L943L+U6M+Y5M+U6M+I7M9s+NdVBNdFFOMxHNq4tGLw7Jc1KONFMPcY9NbswK8AwMMo5PtdBSuFLVOtVYPBaZfBdZexZYd9MUtQ+QM80L9g3L+A7OepAQPJDSPVESvFCSe4/RuI1O98yNuMzNu84PPU3OfgxNPsvMvwxNO8yMPA5NfA3NOwwLugsKucwLOYzLuAzLOQ9NeA9NOA9NOA8M+M6NeY5Neo2New2New1N+w1N+01N+42OO42Nus1NOQyLt4xK943Lt05Ld06K983KuE0JuYxJu0xKPExLPA0Mu41M/E0MvIyMfMxL/ExLuwzLuc2LuI7M9I0K9I6NcYyMOdVWP9wePljbvJaaedJYPNFZv84Yv8vXf81Yv9CaNxMZbFQWWo1L15HN1hLOlVOO1tQPlZJOE1AMEpDMEBGLEFPLktbNlhqQGJ4R2aBSmiISWaLRmWKRGOLQmONRWWOSGeQTGiRT2mRUmuSU26SUmyQUGiPTmSLSmGKSF+IRl+HSF+HSF+FSF+CSF1+R115Rl13SGB3S2N4T2N6Tl11Q1t2QVp1QEpDM01GNlFIOVRLPFdLPVlNP1xPP15RQWRXRmVYR2RYSGJWRl9VSWFXTWdeVWxjZndyiXl1mnh2nnRzn3JypHR1rWxwr2JnqVphqV9lr2ZsuG1zv3Z8yIGH04+T3Zec3puh1aCn06mt2q6z3bG03bK027S02ra027Wx1rOt0a6nyauhxKqewqSYvJmLr4h+mXx4hmRiZ2llZmNZWmpbWHtjX3lWUJJjXYpORqJVTb1gWNZrY/F3cv9/ev96d/9uav5hXPdUT+lHQu5PSd1CPd5HQOpXT7osIr4xJ740J8c+LtFFNss+LcEyIso3J9tFN95FP9M5N8wzLs01MNQ7Ndc9Nd08NOE9NOQ7NOQ5Mt41Ltc0K881Kco4K8U8LMI/LdRTPshHMr08Kb46LcM9MsQ7NcI3NMI0M9xLTt5NUuFQVeVUWehZXeVWWNxNT9NEQMk1K9E3K9g3L901MuIyNOUyNuYxOOYuNuw0PuwzO/M1P/s5Qv00PvorNf8oM/8vOfgtM/k1N/k1OfAuL+sqK+kwLug1MeI1L+M8NOA9NOA9NOE9NOQ7Nuc6Nus3Nu42Nuw0NuszNewyNe0zNO01Neo0MeMxLdswKN44LN06K906K944KOA0JuMzJOkzJuw0Ku41MO41MvA0MvAzL/IyL+8yLOw0LOc2LuQ9NM0vJtc+OcwzNfliZ/9vefdbafBOY+pDXflFaP86Zf8wXf82YfZHaMlKXZNDRlIsI1ZJOFNMOk9INltPP1VJOUY/LUhGMT5CJ0BKKElVMVNkOl9yRWV9SWeESmWISGOIQ2GJQmKKQ2ONRWWOSGaPTWiPUGmQUWyQUGuQTWaNSmOKSWGIR2CHRmCHSGCGSV6BR15/Rl99R2B8SWF7S2R7TWZ8TmZ+Tl14Q116QF57Q0RCNkZEOEpGO1BHPlJIPldJPl1NPl9PP2BRPmFSP2BTQl9WR2JZUmdiX29qbnNvfndxk3p0oHx5qHl3qXBwpmdno2BholxfpGBirWZotW9wwHl6zISC1o2L35aS55yZ5qCe3aGh16Oj2aSk2qaj2KWi16Wh1KSg06We0aOdzaKayaKZyJ+Ww5mNu46CsIN8nnJufWlnbGReYGZaWmtZVXJXUH1XToxXT5VSSahaULVYUMFaU9hrZOx5cvmCfP+Lhvl1cf91c+1fXd9QTNlFQe9aVMw3McUyKsQ2KsM3KMA3J8M3JsY5KMo7K9A8LtU/MdI4LtY8Mtc/NNM7MM01KM0zJ9g6L+JANeA5MOE5MN43Ltc3K883Kck6KsY/LMRBL8I9LsZANMtFOs1HPMxDO8U8NLsyLLYrJsc8N9BFQtlPTOBWU+NZVuFYUthPSdBDOsw7KtM6KNw4LOI1LuguL+wqMvAoM/QnNvotPvorP/sqP/0pP/8oP/8mP/8kPP8kPP8kOP8nOf8rPP4sOfMrNe0uNeg0Nec7Od04NN06M947NOA7NeM6NeY5Nek3M+s1NOszNew0Nus1NOk1NOc1M+I1L901LNs1Kdw4LNs5Ktw5KN45Jt84JuI3JeM2JeY0Juw1Le00L/A1MPE0LvE1LO01K+o1KuU3LOA5MNg3L9U6Nts/Qv9td/9ic/tTavVJY/9LavY2W/82X/88Z/g+Y+dOaq9JVl4kIkQsID86J0hFNFBNPFBJOUVCMT5DLz9HL0JIJkVLJUtTLlNdOFtrRGF2S2R+TmSDSmKGRmCIQmGJQGOLQmWNRmiQSmyQUG2RUWyRTGmOSGeMR2aLSGaKSmWJSWOFSGGDR2SDSmSBSWJ/R2N+R2R/SmR/SGV+R2F9Q1t7PFx/PV+CQj0/ND9BNkZDPEpFP1BFP1RHPltLPl1NPWBPO2BRPF5TQV5WSWNbWGhjaW5seXNvhnRwlXZwnnRwonBtomdmn2Fhn11eoVxcpGVksGtqunRyxX17z4aC2Y2J4JSO5piT5ZuW2ZyY1Z2Z1p6a156Y1p2X1ZyW1JuV0Z6W0ZyUzZyTypuSx5qQxJOJu4h/roJ4nXRrfG1kaWZdXmZbWWlaU29XTXtVSopWS5pWS7BcUrpZUsFYUtNmYeBxauN2b+1+d/2Hhf+Hhfd1c+5nZONVU+taVccyLMIvJcU3KcM3JsA3JcE4JsQ4J8g7Ks87LdM9L9U5LNU5LNM6LNI6LNE5K9E5K9Q4K9g4LN87MeA5MNw4LtY4LM85Ksg5KME6Jr45Jr42KsE4MMY9NclAOMpBOcg/N8U8NMI5Mb80Lcc+NtFIQNhPR9pRSddORsxDO8M3Kso3JdM4JN03KeU0LO0vL/QrM/kpN/0oOv8rQP8qQf8pQf8mQf8jQP8hPP8ePf8dOv8fOv8gOf8lO/8pO/ctOfAxOeo3OuU7O9w5NNw6Nd47NOA7NeM6NeY5Nek3M+s1MuszNew0Nus1NOg2NOQ3Md82L9w1LNk1Kds5Kts5Ktw5KNw5Jt45Jt84JeE4JeM2Jec1K+ozK+s0LOs1Kus1Kuo2KOQ3KeE3Kt87MdU0LNM1NPNUWf9lc/9bcPVHYv9JaP9BZP87YP0zW/k7YfJNbc1MYok4P1MqJEE1JzY5KDs8LEJAMURBMEA/LT1CLj5HLD1DHUtQJ1xiPGVvSmh2UmV6UWR+T2SCTGGDRmGGQWGJQGOMQGeNRGmOSGuQTWyRTmyRS2qQR2iNSGaLRmeKSmaJSWaFSmSDSGaDS2SBSWR/SGSARmWBR2WBR2Z/RWJ+QV2APl+EP2KHQjY5Ljo8MT8/N0RBOktCO09FPFZIPVlMPF5PPFxPPFxTQl5XTWNdXWhlbG9te3NxiXNvlHFrmWpmmGNglVxblFpamFxdoFxfpmhqtW5vv3d4yn+A0oaE2IqI3I+L4JGO3ZOQ05OR0JOR0JOR0pSP0ZOO0ZOM0JKLzpWMzZOLx5SLxJSLwJOLvoyEs4N6pYBylXxld3VeZmlbW2RbVmRbUmZYS3JWSIRUSKNaUb1gWclcWc9ZV9tjYuFrad9va+N2cfuKhP+Khv+Fgf99efduaO5hWMQ0K8AyJsQ4KcE6J8A5JsA5JcI5JsY7KMw6K9A6LNY6LdM1Kc41J9A4KtQ+L9Q+L842KMsvIto6Lto4Ldk3LNY4LNA6K8k6KcI5Jr43JL01KcA2LMI4LsQ6MMc9M8pANstBN8xCOMc6McpANs9FO9BGPNJIPtFHPcpANsU3K8w2JdY2Jt83LOc0L/EwM/YtNfsrOf8qPPwnO/wnPfslPfkjO/shOvoeN/wcN/4bNv8eOP8fNv8kOP0qO/cyPPE2Pes4O+Q6Otw5NNw6Nd47NOA7NeU5Nec4Nek3M+s1Mu0zNu40N+01Neo2NeU2MeE2L9w1LNg0KNo4Kdk5Kdo5J9s4Jd04Jd43JOA3JOE2JeE1J+I0KeM1KuM2KOM2KOE3KN42Kds3K908MtAxK9g4OP9rcv9dbv5QafE8W/9IbP83Xf8+Zfk1W+4+YuZWcao/UWEjKEwvKTs3KzA3JzM3Jjk8KUA9KkE8KEA+KUJCJj9GHVhhNHN+VICMZHeHYGh/U2F9TGGAR2CDQ2CFP2GJQGOMQGiORWqPSmuQTWyRTm6TTWuRSGiNSGeMR2iLS2iLS2aITGSGSmWES2SDSmOARmSBR2aCSGaCR2WBRmKAQmOGRGWKRWiNSDI1KjU4LTs8NEE+N0dAOktCO1JFPFZKPFhMPFlNPVlRRF5XT2NeYmlncm9ugHJvjHJtlWpnlGBej1dXi1RVjldYmFxfomFjrWxuu3Jzw3t8zoKD1YiG2YqI24yI3I2K14+O0o+Nzo+Mz46L0I+J0Y6I0I6Gz42Fzo+Fyo6Fxo+FwZCHvI+HtomCrIB4nX9vjIBfcHxZYGxYWWRbVF5fUV9cSWpXRn1TRZ5VTL5cWdBZW9lYXORjZ+dra+FwbOV4c+x9du16c/6Dfv+Ggf+Be/VrYck8MsQ4KcI7KL86J787Jr46JcE6JsU6J8g5Kc44Ktg6LtQ2Ks41J844KdE+LtE+Lss4KMcvIdI2KdM1KdI0KNI2KdE5K808K8g9KsQ7KcQ6LcQ6L8Y5MMY5L8c6Mcg7Mck8M8s9M9NEPNNFO9BBOcs9M8s8NM9BN89AOM47Mc41J9k1KeI1LuszMfIvNfcrNvkpN/wpOvkmOfcmO/cmO/gnPPsmPP0lOv8kOv8jOv8iN/4jN/olN/ksO/c1PvI5P+g4OuA4N9w5NNw6Nd47NOA7NeU5Nec4Nek3M+s1NO40N+40N+42Nuo2NeY3MuE2L9w1LNc1Ktg4Ktg4KNg4KNk4Jto3Jtw3JN02JN02JNs1Jdw2KN03J9w5KNw5KNs6KNk5Kdc6K9c6MdAzLutIS/9vef9WavhEX/g8X/9BZ/8zXP84Yvg+Y+hNbMVPZYAwPUodIEMxLTExJy42JzQ9LD1CLkJAK0I8JEU+JEhFJFVcMHB+TY+fcpeofIOYbWqEV197Sl1+RV+DQ2GGQGKKQWaPQ2uQSmyRTG2ST22ST2+UTmySSWmOSWiNSGmMTGmMTGiKTmeJTWaFTGSDSmSBR2WCSGeDSGiESWaCR2SCRGeKSGmOSWyRTC0zJzM2Kzg5MTw7NkI9OUdAOk1EPVFHPVNJPVNLPlVORFpVUWFeZWlndW1rgWxrimpokGJgj1hWiFBQhlFRjVhZmmBjqmZqtG9ywXV4yXx/0IKF1oaH2YeI2IqJ2YuK1ouMz4uKzIqJzYmH0ImF0YiE0YqD0YmC0IyEz4uEyI2FwY2Guo2GsIeBpX53ln9thYRZaoBTWm5WVGNcUlphT1pfSGVaRHhVQpJMRLhUUtBTV9tSWeVeZOhlauNrbOZ1ceR1buJvaPd+dv+Ce/+HfvRsYMk/MsE4KMA7KL89J789J8A8J8I7J8U6J8c4KM03Kdg6L9k4LtI4LM85K8w6K8k6Ksg5Kck3KM85K9E3K9I4LNE3K883Ksw4Kss8LMs+Lco8MMk9MMo8Msk7L8g6MMY4LMU3LcU1KtBAN9BANc09NMk5Lss4MM47Mc06Msw1LNAvJdkwKeQyMOwyNfQvOPktOfsrO/wsPPwtP/suP/wvQPwvQP4vQf8vP/8tP/8uQP8pOfwpOPcrN/UwOvE2Pe04PeM3N9w0M9w5NNw6Nd47NuI6N+U5Nec4Neo2New0NPE0OPE0OO81Nu03NuY3MuE2L9o2LNc1Ktg4KtY5KNY5KNg5Jtg5Jtk4Jto3Jtk4JtU4JdU6JtY7J9U9KNQ9KNQ9KtQ9LNQ8LtE3L9o7OP9eZf9hcf9Qafc8W/9Baf80X/80YPsxWfRLbNtZcZU+TlolLUMpLDoyLy0wKTA4KzdALzpCKzw8IkE8HlVIKGBbNXuFU5CjbKq+i6i+jY6ld2+LW2F/S15/RmCERGOIQmWNRGqTR2+UTnCVUG+TU2+TU2+UTmySSWmOSWeMR2mMTGmMTGmLT2iKTmaFSmWESWSDSGWESWeFSWiGSGeFR2WFRGmOSWmRS2yUTisxJS40KjQ3MDg5Mz46N0I9OkhBO0tEPE5IPE5HPU9KRFdTUl9eZmZldWdnf2dmhmJhiVtZilFRhU5Ph1JTk1teo2Vps2xvvnV3ynp80X+B1oOF2IaH2YaH14iH1YmJ04eIy4aHyIaFy4WDzoWA0IWA0od/0oeA0I2F0oyFy42FwYyFuIuFq4R/nXt2jXxqeoRWY4FQVm5VUWReUFtlTVhiSWJeRXNYQ49PRbRXUtBVWtpTWudcY+hhZ+Vnauhwb+x5cuZxaPd8dPNzav54beZcUcQ7K741I8I7J8E9KME9KMM8KMQ7KMg7Kcs5Ks83KtY1K9g3LdQ6Ls46LMc6KcQ4J8Y6Kco9LM89LtZAMtlBNNY+Mc44Ksg0Jso4Kcs8LMk6LMg6LMk7L8k7Lco6L8g5K8g1K8c1KMo2LM87L9I+NNM/M9Y/NtU+M843LsksI9IrJdwtKucwMvAzOfYxO/owPP0wP/0wP/kwQPcxQPcxQPYwPfcvPPctOfosOfoqN/0vPPkvO/UwOvAzOu02O+Y2Od81Ndk0Mtw5NN06Nd86NuI6N+U5Nec4Neo2New0NPI1OfI1OfA2N+03NuY3NN82L9o2LdY2KtU3K9Q4KdQ4KdQ5J9U4J9U4Jdc3J9Q5JdA5JM48Jc89Js8/J85AKM5AKtA/LtI7MNE2MetISf9mcv9PZP9IZvs3W/9Bbf0vXf83YfI0WONQarxVZm0xOUUoKkU2OTczMjU0MDY5MDY9LTM7IzM4GENDHWphOoWBVJ+ud6nBh7XOl6/Hk5KufXaUYmWGUWCCRmCFQmOIQmePRm2WSnKYT3KXUnGVVXCUVG+UTmyRS2iNSGaLRmiLS2mMTGmLTmmLT2eGS2aFSmWESWaFSWiISWmJSGmHR2aGQ2qPSmuTTW6WUCgwIysxJy80LTM1MDc2NDw4NUA9OEM+OElFPEhFPEtIQ1JQUVtbZWFidGJifGBggl9eiFpYilRUilRUkFxdoGdps3BzxHZ4zXt/2H6C24OE3oSG3YSF2IOE1oWE1IaF0YOGy4KFyIODy4KBzYOA0YWA1IiA1YiA042F0ouEyIuDvouDsomCpIF8k3dwgHZlb35VW3xQUW5VTmZfT11lTVpkSWFhR3FdRYlURq1dVMhaW9RWWuJbYeZdZOlhZe5sbPV6c+1yavd4b95ZUOVbUNJEOMM1J8c6KcU6J8Q8JsU9J8g9KMo7Ks06KtA4KtQ2KtMwJ9QzKdI4LM07LMc7KsI7KMA7KMM8Kcg7KtVDNOFLPd5IOtM9L8o0Jsk1J807LMg5Kcg5Kcg5K8g5Kco4K8o4Kcs3K8s3Kc02K9I8Ltc/NNhAM9pANttBNdc6MdIxKdwwLuUxNO40OfU2Pvk0PvkxPvowQPgvP/IuPO8vPO0vOe0wN+8tNe8sMvIrMvEqMfUyOvUzO/I1O+w1OeU1N+E1Nd42Ndw3Ndw4Nt05N986NuM6N+Y4N+k3N+o2N+w0NvQ1OvQ1OvE3Ou44N+Y3NOA3MNo2LdQ2KtM3KtE4KtA4KtA5KNA5KNA5JtE4KNA5Jss5Isg6Isg+JMc/JchAKMhAKsw9Lc87Mdc5NvxVXP9ecf9HY/8/Yf86Yf83Z/4zYvs4YO1GZMVOYYlASVMxMkE2NEA6PDo0Nj81Njw3MTc5KzQ9IjlDHlNaLoKCUKKncbHFiq/LjrDMkqbDjZKufXuZZWeIUV+BRV6DQGOJQGmPRG+VSnOZUHOYU3GVVW+TU26TTmuQSmeMR2WKRWeKSmiLS2mLTmmLTmaIS2SGSWSGSWWISGeKSmiLSWmJSGaJRWqSTGyWTm+ZUSYuISgwJS0yKzEzLjMzMTc2NDo5NTw7NkdEPUREPEdGQk9PUVpaZF9hcF5geVxcfmBfiVxajFlYkVxcmmdnrXFzwHp80X+A3IGE4YKF5IWG44SF4YOD24GC1YOC0oOCzoSHzIOGyYSEzIOCzoWC04eC1oqC14yD1I2F0IyDxIuCt4qCq4V/m394iHNudXFiZXZXVXRTTGpWS2ZfTWJmTV9lSWNiRnBeRnpRP51bTbdaU8VTUtdWWuJXXOpZYPJjZfdybfFuZvdxaNFEO9RBN8UxJcg0JtRDMsc5Jcc6Jsk7J808KdA6K9M6LNg4LNk3LM8sI84wJc42Kcs8LMdALcE+Kr47J7w3JMA0I9FCMuNPQeROQNhCNMs3Kcs3KdA+L8o7K8k6Ksc4KMY3J8g2J8o2KM44KtA4K9M7LtU7L9U5LdI2KtU3LNo8Md08Mtw3Meg4OPE4Pfc6Qfs5Qvo0QfUvPPIsO+8sOu0vO+oxOeozOOs0OO01N/E1NvQzNvM1N/AzN+82O+05POk2OeI0Nd0zM983NuA7Od04Nt45N+E5NuM6N+Y4N+k3N+o2N+w0NvQ1OvQ1OvE3Ouw4OeY5Nd84Mtg3L9M3K9A4K806Ks05K8w7Ks06Ks06KM06Ksw7KMU5IsI6IsM9JMI+JcM/KMY/K8o8Ls84Md88P/9cZv9RaP9JZv85Xf89aPkuXf08aOk7XOVccKZMVl4uLkc4M0JDPjw4OT80OEUyNkM0MT06KT5FJkZVKmJzP5CbYa29f7HLjKvJi6bDi526hI6senuZZWaHUFp8QF6BP2GHPmiOQ2+VSnKYT3KXUnCUVG6SUm6TTmqPSWaLRmSJRGaJSWiLS2mLTmmLTmaIS2WHSmSHR2WIRmeKSGiLR2iLR2WKRGuTTG2XT3CaUigwIScvIigtJikuKC4wLTMzMTc4Mzk6ND09NT9AOERFQEpMS09SWVZYZVpcc11efVlYgltZi15dlmVlo25utnd4yH+B2ISF4oyM7oyM8IqK7IaH5IKC3ICA1oKA04OCzoCDyIGEx4ODy4SEzoaD0IiD04uE0oyEz4qAxYqAvImAr4d9n4B4jXdvemtlZ2ZdWG1bUW1bTWlcTGZeS2RfSWVhSGhhR29fRm9QO4VVQaVdT79hWdFZWN1RVO5TW/hcYPloZeZZUNREPM43MNE3L9c6MdY9L9Q7K885KM06Js85KNE6KdQ4Kdg4Ktw1LNw1LNAvJc0zKcw4LMo+L8VAL8FALb49Krw5J8I5Kb4wIulXSt9LP8MvI9E9Mc48L8c4KMo7K8k6Kcg5KMc4J8g3Jsk2Jss1Jsw0JtA3Kdc7Ltw+Mtw8MNk3LNo4LeI+NOxDPPVCRfI5P/AyPPY0P/YyQPEtO+0tOu0yPew3PuY1O+Q2OOU3OOs5OfA6OfE3OO83N/I7Pe48POo6OuY4N+E4Nd83NNw3Ndw3Nd45N+E5OOM5OeY6Ouk5O+w5PO05PO84PPQ3O/M2OvA4Ou05Ouc7OeA7Ndc5MM83LMo4K8g5Kcc5K8Y6Kcc6Kcc6KMg7Ksc8KcE5I8Q9J746I7Y0Hrw5JclEM88/NsoxLP9eZf9WZ/9JYv88XPgxWPcwWfs2Y/VCaedZb6xGUW8zM04zLEI/Nj5DPEA3OEAtMUwvM0syLkE5JkRKKFpuPX6aX564d6jFgqzKjJ++gpi2gJSyfoKgbmaEUlh2Qll7P12APmOHQWmPRG6USW2VTGyUTmuST2yRTmmOSWaKRGOGQmOGQmaJSWiLS2aKTGSISmeLTWiMTmeLS2aLSGWKRWaLRWqPSWuTSnGbUXKeU3SgVSowIikvIykuJykuKC0vLDEzMDU2MTc4Mjs8ND4/N0FEPUhKR09QVFNVYVhZa1pcdVxaf15diWRilGtqpHV0un9+zoeH34uM6Y2N74yM8ImJ64WE4oCA2IB+0oB/z4KCzIWGyYaHyIeIy4mIzouIz4yGzo2GzI6FyIqAvIl/sYZ8oYJ4kXtzgHRrbmxiYGVdUmVgTWVeS2ZeS2hdS2lcSWpeSGtfR25eRXdfR39bQ5JZRq1aTMdWUN5SU/VRWP9YX/BVU+NMRdk+OdU2MNk2L9w5MNs5LNY5KNM4JtE4JtE4KNQ4Kdc3Kdw2Kt80LN01LM4wJ8k1Kcg5K8Y9LcRBL8FALb88Kr45KMQ4Kcs8LuRSRdxIPMg0KMw6Lcg6LMI0Jso9LMs8K8o7Kso7Kss6Kcw5Kc44Kc82KNM3KtY4LNk3LNczKdUxJ9gxKN43Luc8NfhER/E4Pu0vOe8vOvAwPe4uO+sxPOs2P+Q1OtwzNtgyMt86OO5FQvhJRvhEQ/M/Puk6N+c5OOU5N+I5NuE4NeA4NeE5OOE5OOA4N+I4OOU5Oec5Ouk5O+w5PO05PO43O/M2OvI1Oe42OOo4OOQ7ONw6NdM5L8s3K8Y4KsM6KsI6KsA7KsA7KsE8KcE8K8E8Kb05JME/Kbs6JbM1H7k6J8E7L8o6Mtg8Pf9eZ/9QZP9BW/k4V/Y2W/U7YPQ+ZONJZas/TIM/Pl86Mkc7Lzo+MDg+MkY8OlI+PU4wLlM4L1ZLNWNpRXiPW42wcJ3CfaHGgZq5fZq5gJq2g42peHKOXll1RVRwPVx7Ql9/QGKGQGmNQ22TSGyUS2uTTGmQTWmQTWeMR2WJQ2OGQmOGRGeKSmmMTGiMTmeLTWmNT2mNTWmOS2eMR2eMRmaORWySSW2VTHCcUW+dUnSgVS0xIi0xIywvJiwuKS8vLTExLzM0LzQ1LTk7MDw+MUBCN0VIQUtNTFFSV1VVYVZXaVxZdF5df2ZkjHBuoHp4t4WDzo2L35CQ6pCO746M7YqJ54eE34F/0398y399yIB/w4aFx4iIxoqKyoyKyYyKyYyIxYyEv4uCt4mArYZ8oYB2j3twgHVqcG5kYmlfVmNdTV9hTF9hS2NeSmdcSmxbSW5cSG9dR3FdRXdhSXhYP4dTPaNWRMdYT+NVU/hPVP5NU+I+PN48N904NN43MeE2L+E2Lt03K9o3KNQ3JtM4JNM4JtU4J9g2Kd01KuAzLN01LMszKMQ2KMI5KcE8K8I/LcI/LcE8K8A4KMM1J9xKPdpGOtVBNc48L8Q2KMQ7K742JsY6Kcc6Kcc6Kck6Kso4Kcs3Kcw2KM0zJ9U5LdU3LNYzKtczKtozK982L+U6M+k8OPA8Pe00OeswN+wxOO4zPO00POs3QOo9Q903O+FBQexOS/hZVf1aVfpRTO9CPuU4NOI2MuA3MuA3MuA3MuE4NeI5NuQ7OOQ7OOE3N+Q4OOY4Oug4O+s4POs4POs4POw4O+81OO40N+w1N+c3N+I6N9k6NM84L8c3LMI4K786K707K7s8K7s8K7s8Kbs8K7s8Kbg5Jr1AKrM5JLE2JLY7K7UwJ8M0MOxQVP9baf9KYPU6VfA3VvFAXe9IZudIZM1OYYI4OWU/NlJAMkRBMDk9LDU3KT42K0s5L0UtI1I9LGddQoGIX5KrdJe7e5bBepa/e5SzeJy4hZq0hYCabVx1S0hiNU5oOFt4Ql99P2ODQGiMRGySR2qSSWiSSmeQTGaPS2SJRGSHQ2OGRGWIRmiLS2uOTmuPT2qOTmmQT2mQT2mQTWiQSmePSGiSSGyUS2+ZTXOhVnOjV3akWTI0JjA0JjAxKTAxKzEyLTIzLjM0LjQ2Kzk7LTs+LT9BM0RGOUlKRE1PTlJRV1NTXVhWZFxab2Rhfm5slHp3rISCw4yJ1pGP45SR6pOQ646L4omF2YJ/zH98w398v4B+vYSCwYaFwYmIwo2Kw4uIv4mFuId/roV9pIV7nYB2jnlufnJnbW1hYWteVmlbUGNcSl1gS11hSmNeSmhbSm1aS3FaSnRaSXZbRnNXQXhSO4pRPapZRs1bUONUUPBGSfE+QdsyL9w1L+E1MeM2MOM1LuE1K+A2Kds4KdY3JNM4JNE4JtQ5J9g2Kdw2KuAzLNo2Lcg2Kb04J7w3Jr06KL8+K8I/LcM7K8Q4KcY0J+lVSdM8Mcw4LNFCNL41JcA9K8A9K8A4KMQ4J8U5KMc6Kcg5Kcs3Kcw2KM0zJ9I2KtQzKdUyKds0LOM6M+k+N+w/Oew9Oug0New1Oe82O+41O+oyOuYzOeQ3PeI8QPNVVvxiYv9tav9pZPNWUeRBPN82M900L982Md43Md43Md84MuE4NeI5NuU5N+Y6OOU3OOY4Oeg4O+k5POs4POs4POs4POw3PO41Ou42OOo2N+U5N988N9Y8NMw5L8U5LL45Kro7KrY7KbU8KbU8K7Q9KbM7KrM8KLM6J7dALK04Jq04J7M7LasrIsM1NP1gZ/9UZPpHXPA8Ves9WOdHX+FPZNJPX7RTWnZHQVhIOUtEMkZFMUJFMD0/Kjo4IzszHj8zHVBHKm5rSIqTZpWsdJG0dI63c5G6eJ67haG4ipCnfWyCW0tfOkFXMExjN1dyP197QGSDQGmKQ2uRRmmRSGeRR2SPSGWOSmKHQmOGQmSHRWeKSGqNTWyPT22RUW6SUmqRUGqRTmqSTGiSSmeRR2mTR22XS3CcT3alV3amWnioXDc4KDY4KjY2LDU2LjU2MDU2MDY3LzY4Kzs+LT1ALUBDLkRHNElLPk1ORlFQTlJSUlZVU1lYXWFfbGtpgXVzm4B9soiGx4yK05WS4ZSR4pCN3IuH04SBxIF9un98tX98s4F+t4SBuoeEuYmFt4qEsoZ/qIF6m4B4kH9zh3puenJmam1fXmpbVGlbUGpaS2ZaSmJfTGJfTGVeTGlcS25bTHJbS3dcS3taR35VQYZSPZtSQbZWRs5SSNpHQOI4OOUzM90xLd8zL+I1L+M1LuEzLN8zKd01KNw5KNM4JNA5JM86JtE6J9Q4Kdk3Kt01LNg3LcQ7K7k6KbU2Jbc4J707K8I9Lsc7Lsc3LNA5MPVcVNY9Nck1K89BNbgzJLc6KLw/K786KcM6KsY6K8g6LMo7Lcw6Lc84LdE3LdAzKtIxKdYxK943MeU8N+o+Oug7N+Y3NOk3Ne87PPA8P+o2OeQxNeQ1OuhCRu1NT/94d/9xbvFgW91KQ9E4M9EyLtw3M+dAOuA5M+A5MeA3MuA3MuI2MuM3M+U3NuU3NuY2OOc3Oeo3O+s4POs4Pus4Pug3Peo3O+43O+43Oeo3OuQ6Ot89OtY9N8s7MsM7L7o4KrU6KrM7Kq88Ka88Kqw8KKw7Kaw7Kao7KKw9KqY4J6c5Kqo4LawvKctAQ/9ocvRNXvNIW+1EWeVIW9lPXslUXbdUV5xYVWRNP09MOUxHNEpFMUZELT9CJz1EIz5II0tWLlxnPHiBVIuZZpGkbY2pbo+ycpe5fZ+2iJKngHWGZFJjQz9QMEJTMU9hOVZsPWJ7QmWCQmmKQ2qQRWmSRmWRRmKQSGOOR2KHQmaGQ2eKSGmMSmuOTm2QUG6SUm+TU2qRTmuST2qTTWmTS2mTSWqWSW6aS3KeT3alV3anWHeoWT89Lj0+Lj09MT09Mz09NTs8NDs9Mjs9Lz9CL0BELUNHLkZKM0tMOk5PQVFRSVJSSFlXSlpaTl9eXGdlcnFuiXt5oYOAt4eFxI+M0Y+M042Kz4qFx4N/un55r3p3pnl2pXt2rHx5roB8roN9qYN9o394l3x0i3pygXZrc3JmZm1fXGpcU2tbTmxaTGxbS2tbS2ldTWdeTWldTWpdTW5dTXNeTXpdTYFaSZNgT5tWR6dOQLhKPcVAN882LtgxK94xK+E1MeE2L+I1LuI0LeAyKd40J9w2Jto7KNE5JM07JMw7Js47J9E6KdU5Ktk3LNM5LcE+LLQ7KLA1I7I1I7s5KcQ8Lsk7L8s3Ldk/N/hbVONJQc46MMxAM7g2JqwzILU8Kbw5J783J8A3J8M3KMU3Kck3Ks43LNE3Ldk8M9s6Mt45M+U8N+o+Ouo9Oec4NeM0Meg5Nus8Oew6Oug4Ouw+QPhQUP9iY/9wcPloZeJUUMo9NsAxK8k0MNY7N989OuA7N+I7NeE6MuI5NOE4M+M3M+Q3M+U1NeY2Nuk2Oek2Oeo3O+s4POs4Puo3Peg3Pek2Ou84POw4Oeg4OuM7Ot0+OtM+N8k8MsA8L7Y4KbI6Ka47Kao7KKk8KKg7J6U6JqU6KKU8KaA5KKA7KaA5KqI2KrU+ONtUWPtlcO5LXO9JXelKXNtNW8lRWrRWVqBaUopgUlBJN0hNOU5JNUhAKzs1GzY3Fz5PJUxmNmyKVHeUXISbZYmaZI2bZpCja5StdJiwfIOVbW59XFFgQzxKMDlGLEFQMU9fO1dqPWN6RGWCQmqLRGuRRmmSRmWRRmGPRmOOR2OIQ2mJRmqNS2yPTWyPT2yPT22RUW6SUm2UUW2VT22WUGyWTGuXSm2ZSnKfTnOiUXusXXusXXqrXERBMERCM0RCNkNDOUNDO0NDO0JCNkJDM0RGMEVILUdKLUpNMk9OOVJRP1RSRVVTRFxaQ1xcRFxdT2FhYWloeHJxkHt6poF+tYaCv4iDw4iEwYSBun97rnlzoXRvl29tlXBsnnJuoXZwnndymndyknRvhXNrenJpbm1iYGxfV2pcUWtbTG1cTG9cTW9cS3FbTXFbTm9cTm1dTmxfT21gT3NgT3pfToZaTZ9fU6RQRa5COLo7MsY2Lc4xKNYyKd01LOI3MOE2L+E0LeAzLOA0Kt01KNg3JdQ5Jc86Iso9Isk9JMo+J808KdI7KtU5LM87Lb9ALbE8KKw1Ia4zIbo4KMQ8Lso6L841Ldg5M/BOSfFUTdlCOcxCNb4/LqYxHbM8KL48LME5K8E3KsI2KcU3K8k5Ls87MdQ7M+FEPeNBPOQ/O+c+O+k9O+k7Oug4OOc4Nec4NeY5NeY3NOk7OvRKSv9cW/9kY/hjX8w9OcE4Mr00LsM4MdVBPd5FQN89O9k0MuI7NeI7M+I5NOI5NOQ4NOU4NOc3N+k3N+o2Oes3Ous2O+s4POs4Pug3Peg3Pek2Ous3Ouk2OeY4OeA7Ods+OdE+NsY8Mb48LrM4Ka47Kao7KKY7J6Q7KKM6J6M6J6A5JqE+K5Y3JZw9K5o5KZoyJ8NQS+1rbe5cZuxQXulKXN9IV81LU7lSU6RbUpJjUYBqVUpNOERMN0pCL0g5JEI3G0ZII1VwPWeTVn6zb4KzcYOlaH2SWYONWY6WY4mXZHyMX1hmQ0dUODlFLTZCKjpELD1KMEpYN1doPmV8RmiCQ2yLRWyQRmmTR2ORRmGRR2GPR2aLRmyMSW2QTm6RT2yPT2uOTmuPT22RUXCXVHGZU3CZU3CaUG+bTnGdTnSjUnemVXytXnqtXnmsXUlDM0pENklFOUlFOklHO0lHO0hGOUhHNUlIM0pKMkxMMk5ONFJQO1RRPlhSRFlUQV1ZPltaPlxZSF5bVGRhaG5rfnhzk314oIF7p4N9q4V/rYN8pn13nXVuj29phWtngmlliGpmi21oiG1pgm1ofGxmcmtiZ2pgXmddVGhcTmhbS2tcSW5dS3FfS3FfS3BdTHBdTnBdT3BdTnNdT3ddTn5dTodcTJJYTKFVSKRGPKs5L7o3Lco3L9M2Ldo2Ld42Ld82L980Ld80LN80LN83LN03Kdg2J9E2JM86JMw8JMo8Jss9J847KdE7KtM6LM48Lb5BL688J6gzIawzILY5J8E9Lsk7L8w4LswyKuBBO/hbVOBJQNBEN8pGN6syH7k+LMpGN8xCNcpAM8s/Ms0/M9RBN9xFPONGP+JAO+I9OeM6N+I2NOM1NOQ2NeU5N+U8OeQ/OeA9Ntw6Nd9AOupNSOpRTNNAObgpI7gtJr41Lck+N9FAO9Y+Odo7OOM7O+c9PeI5NuI5NuI5NuQ4NuU5Nec6Nuk5Oeo6Ouo4OOo4OOs4O+s4O+k5POg4O+c3Ouc3Ouk2OuY2OOI4ON46ONY9OMw9NcI8Mbk7La45KKo7KqY7KaI7KKA7J547Jp86KJs6J5g/LYw1Ipk9Lpg4KpcvJs1cWPd5fN9YX+ZYZNpRW8pLUrlMT6lWUJ5gVZBnVYBuVlBXOD9KKjw7HEM9G1VRK2x2RIOiZpTBfoe8doa4c3yeYW6CTXV+UYKHXnV9VltiQDtEKTQ8JTU9KD1EMjxFMjlDK0NQMlVlPmd7SGmDRmyLR22RR2qTR2aSR2KQR2OOR2iNSmyPTW+SUG6TUGyPTWmOS2qPSmqSTHObVHOdVXOdU3KeUXKeT3OiUnemVXqrWnamWnWlW3OjWVJLO1JLO1JKPVJKPVJKPVJKPVJKPVJLO1VOPFZPPVdQPlhRP1lSQFtURFxVRVxVRWJbSGFaSGFZTGJZUmVdW2thaXFmdHVqe3puhHxwiH9zi39ziXxwhHVqe21icmVdamNga2BfZ19cY19aXl5aWV5ZVWFaUmJaT2VbT2dbS2lcS2tcSWtcR21dRm1dRmpeSGljTXFmVHFaSnVPQotXSpxcUKNZTKxaTKVOPaZFNKc8LLE3KMI4LdE4MNw0Md0xLd82L943Lt43Lt43Lt43Lts3K9g2Kdc3KdU4KdQ4KdI5KdI5KdI5K9I5K9Q4K807LL07K7Y+La45KKkxIKsyIbc5KsA8L8M5Lsg1K841LdQ6MNtDON1LPtRIOcI9LLcyI91QRthKQNRGPNREO9pHP95HQOBDPuA8OuA3NOY4N+w6Ouw6Ouc3N+I2NOA5M9w9N9lGPs9COcQ6L7w0KLcxJrk1Kb87L8M/M8M6MMk8M9I/N9o/OuI9O+c7Oew4Oe05Ouc3OuU4OuU4OuU5OeU5N+U5N+U5NeU5NeA0MOE1MeQ2NeU3NuY4Oec5Ouc5Ouc5O+s7PuY5O985Odw9OtZBPc1CO8FBNrc/Mak6KaM8K6A9Kps8KJk6JpY6JZc4JpE4JpBBMIs8LYcvI5EvJrxMSuRtb+dsb81WWr1MTrVOT6pRTaJVT5tYT5ddUpVhVIpqU1daLzpNFjdGD1RhKX6OUJuwb5+8eZy9eJK1c36dYWiATFxtQ1lkQlRdQkhQOT9EMDo9LEBDMjxAMTo+MDxDMzpDMEFOMlJkPl1zQmeDSHCPS2+TS2ySR2qSSWmTS2eQSmyQUG2RU2+TU2yTUG2STWuTSm2WSm2YSXGcTHGeTXKfTnKhUHSjUnanVXmqWXqqXnmmY22ZWmKOT1dOP1dOP1dOP1dOP1dOP1dOP1dOP1dOP1hPQFlQQVlQQVtSQ1xTRF1URV5VRl9WR2RbSmNaSWNZTWNZT2ZbVWpfXW5iZHBkaHJlbHRncHZpcnZpcnNmbW1gZ2dbX2JYWV5bVlpaUllWT1dUS1hUSVhUSFxWSF5XR2NaS2NaSWZbSWdcSGldR2peRmtfR2hgSWNiTW5nVHZcTYFTRppWTatWT7BSSrdRRa9IOaxDMKw9LLE5Kb44LMs4MNU2Mtk0MN02Ltw4Ltw4Ltw4Lts3Ldo4Ldk3LNc3K9c3K9U3K9U3K9U3K9Q4K9Q4K9Q4K846LL48LrY+Lq45KKYxIKcyILI6Kbk+Lr48LsY6Lcc0Kss0KdI7MNxFOuFPQt9RQ91PQ9tGP9hAO9M8NdI7NNY9N9o9ONw4Nt0zM+c3N+s3OO43Oes3OOc3N+U5N+I9OdtCOspBN78/NLg6LLE2J681JrI4Kbg9Lb9AMcVBNM1ANtdAN989OOM6N+k3N+81NvE3Ouk2Ouc2POc3OuY4OeY4N+U5NeU5NeM6NeI5MuM6M+M6NeQ7NuQ7OOQ7OOU5OeU5OeQ6O+M7O988Pdk/PdBBO8Q/Nrc9Mqw7LaU7K6A9Kpw9K5c8KZY7KJI6JpM4JYw6JYA5J4A4KYk1Kp08Nb9RUNdlZdFeYbdNTaxOTKRUTZ1ZUJhcUZdeU5deU5hfVoxmUWBfL1NnKl5yM3qQT5mvbqW+fJmycIigYmqCSGF1QlRlO0pYN0ZQNz9INTk/MTU4LTo8L0FCND0/NDo9Mj1BMzpDMEBNM1JkPl50RWeDSHGQTXCUTG6SSGuUSGuTTGiRS22RUW6SVG2UU22UUWuTTGuUSGyXSG2YSHCdSnCdSnCgTHOiUXWmVHipWHipWHioXm2XWGKLUVmCSF1URV1URV1URV1URV1URV1URV1URV1URVtSQ1xTRF1URV5VRl9WR2BXSGFYSWFYR2VdSmVdSGRbSmRbTGVbUWZbVWhdWWhdW2ldXWpeXmtfX2tfX2leXGZbWWJXU19WUVpWTVdUS1VRSFJOQ1FNQlNPQ1dRQ1hSQl5XR15XRWFZRmNbRmdcSGleSGtgSmhiTGJhTW5nVXlfUIhYTqJbVbFWUbJJRbhFQLlAN7g+Mbc7L7g4K7w4K8M5LMk7L9E6L9k4Lts3Lds3Lds5Lto4Ldk3LNk3LNc3K9c3K9U3K9U3K9Q4K9Q4K9Q4K9I5K807LMA+MLY+Lq06KKMyIKMzH6o6JrM+LLk+LsQ/MMQ4K8UyKMg0KtA8MNhGOdxNP+JORNk6Ntg0M9QyMNY0Mts5N+E9POY8POk7PO05PO41OusyN+kyNug1OOU5OeE8OtlAOr44LbU6K7E2J640Ja01JbA4KLU8K7s9LshENc9DNtZCONw9N+I5NOg2NO01Ne83Oeo2Oek2Oek2Oec3N+c3N+Y5NeU5NeU6M+M6M+Q7NOQ7NuM8NuM7OOI6OeE5Od44ON05Otw8PNpAPtNCPcg/Obk6Ma03K6U3KKE7LJ08K5k8K5Q7KZM6KJA5JpA3JYo5Jno2I3k2JYg5LKBGPblTT8BXVLhQT6tJRqJNSJxTTJlZUJdeU5dhV5dhV5hfVotlUHNyRnqNVpOmbqS5gKvAh56ze3yQW1tvPD9SJEFTK0FQLz9MMjpDMDY8LjY5MDU4Lzk7LkBBMz0/NDk8MT1BMzlCL0BNM1FjPWB2R2mFSnOST3KWTnCUSm2WSm2VTmuUTnCUVHGVVW+WU26WUGyUS2yVSWyXSG6ZSXCdTHCdTHCfTnWkU3ipWHmqW3WmV3GgWF+JSlZ/RU94PmFYSWFYSWFYSWFYSWFYSWFYSWFYSWFYSV9WR2BXSGBXSGFYSWJZSmNaS2RbTGRbSmVdSGZeR2ZeSWdfTGdeT2ZcUGZcUmZcU2hdV2hdV2hdV2heVWddVGVbUWRaUGNbTl1ZTVpWSlZSRlJOQlBMQFBNPlROQFVPP1dRQVlUQVtWQ11YRGFaR2RdSmZfTGZhTWRjUWxlVXZcT4pbUaliXLhaWLZGRLk8OsM8OMY7NsQ6MMI4Lb04Kbw6Kr4/Lsc/L9M5Ldk3LNo4Ldk5Ldo4Ldg4LNg4LNU3K9U3K9Q4K9Q4K9Q4K9Q4K9Q4K9I5K807LME/MbY+Lqw5J6IzIJ0zHaI4Iqw9KbVALrw/Lb86K8M3KsU1Kss3K846Ls48L9M6Mt42NeAyNNsxMt0zNOA4OOU7POo9P+w8Pu43POwzOOkwNuYyNeU1OOE3N9o2Nc42Mbc1KK83J642Jqw3Jqw3Jq45KLI6KbU6KsNBMcpCNNRBN9w/OOI7NeY5Nes3Nu44N+02OOs3OOs3OOo4Nuo4Nug5NOc6NOY7NOI5MuE6Mt86NOA7N946ONw6ONs5N9k5OdY8OtVAPNJDPcpBO7s7Mq82K6Q2J543KJw7Kpg7KZQ7KZI7KI86Jo04JIw3I4c5JYA9KnY1I4E1J5lFOqpQSKxNR6lMR6ZRTJ1QSphVTJRaT5ReUpVhVpVhVpdhV41nVImFX5mpeK29jqa4iJChdHOGWU5gOC9BGy0+HDNCJTpGLj1GMztBMzo9Mjo9NDw9NTk5LT9AMjw+Mzk8MTxAMjlCLz9MMlBiPGF3SGqGS3STUHOXT3KWTG+YTG+XUG2XT3CXVHOYVXCYUm+XUG2WSm2WSG6ZSnCbS3GeTXKfTnSjU3moWHusXXenW22dU2WSTVuFRlN8Qk53PWNaS2NaS2NaS2NaS2NaS2NaS2NaS2NaS2NaS2NaS2RbTGRbTGVcTWZdTmZdTmZdTGZeR2dfSGhgSWlhTGlhTmlgT2hfUGdeT2pgVGlgUWlgUWhfTmhfTmhgTWhgTWhhTmReTmBaTFtVR1ZQQlBNPk5LOk5LOk5LOlBNPFJPPlRRQFZTQFhXQ1taRl1cSF5dS2JgUWZeUW1XSoZbUqxpY75jYMFNTchCQ9A7PdQ4OdM4NMw3MME5K7o9KbVDK7xCK847K9c3Kdg4Ktc6K9k5K9Y5KtY5KtQ4KdQ4KdQ4KdQ4KdI5KdI5KdI5KdI5Kc07LME/MbY+MKs6KKE2Ipo0Hps3IKM9Jq9CLbM7Kro7LMI6LMc5Lcs4Ls46MNA8MNk6NOk5POw0POYzOeMyOOIzOOE0OOIzOOIyNek2POk0Oec0Ouc3OuM5PNs3NtAyMcAwKLQ2KK06KK06KKs6KKs6KKs6KKw5Jq83Jrg6K8E7L84+M9g/N+A9OOQ7OOg5Nuw4N+42Nu42Nu42Nu03NOo4NOg6M+c6M+Q8M+E6Mt87Mt88Ndw9N9s9Otk+PNc9O9Q+Pc9APMtCPMVCOrk9Na03LaM1KJ43KJo6KpY7KZM8KZE7Ko06KIo5Jok4JYg3JIM4JYNALXU0InszJZNHOqRRSaFORp5OR6FXTphVTJJYTJBaTo1cTo9dUpRgVZdhV49oV42JZpilep2pgYCOal1rSERTNDJAJiQyGS06JjA7KjU9Ljk/Mzw/ND0/NDo7Mzo6MDk5LT4/MTs9Mjg7MDs/MThBLj5LMVBiPGJ4SWuHTHWUUXSYUHOXTXGaTnGZUm+ZUXKaU3KaU3KaUXCZTW2XS22YSXCbTHOeT3SgUXaiU3inWXupXnqoX3GfVmSSSlmGQ12GSld+R1J5QmVcTWVcTWVcTWVcTWVcTWVcTWVcTWVcTWVcTWZdTmZdTmZdTmdeT2deT2hfUGhfTmdfSmhgSWlhTGpiTWpiT2piT2phUGphUGphUGlhTmhgTWhgS2hgS2hgSWlhSmpiS2ZfTWJdSl5YSFhSQlNNPU1KOUtIN0lINktKOExLOUxNO05PPVBRP1FUQVNWRVNWRVtZTF5WSWNRRXpYTqFoYbZlYcRWVdZRUtlAQ986Ptw4N9Q3MMc7Lrw/K7FDKrVBKMo7KtQ3KNU4KdU5KtY5KtU5KtU5KtQ4KdQ4KdI5KdI5KdI5KdI5KdI5KdI5Kc07LME/MbU9L6s8KaI5JJk2H5U1HZs7IqdBKrJCLrlAL787LMM3KsUyKMs0K9I7MN89OOo1Ou4zPOs2Pek4Puc6PuQ7PuM6PeI5PN81OOE3OuI5PuE9Pts9PtE5NsMyL7YwJ685K6s+Kqs+Kqk+Kqo9Kak8KKk6J6s4Ja82Jbk3KcU7MNA9M9k8Nd88N+Q7OOg7N+44N+83Ne83Ne44Nes6NOk7NOc8NOQ9NOI+NeA/N95BOtpBO9lBPtVBP9FAPc1CP8M/OrtAOLM9M6o4LaE1KJs1J5g4KJU8KpE8KI08KYo8KIg6JoY5J4Q3JYM2JH82JX06KXQzIX45KpdPQaNZTpxSR5VPRZhWSpVZTpBbTY5aTYxbTY5cUZNfVJlgV5FnV354WHmDXnJ8WlVgQjtFLC87JTA7KjA8LjM9MjQ8MTY8Mjw/NkBBOT9BNjw8MDc3Kzg5Kz4/MTo8MTc6Lzo+MDdALT1KME9hO2J4SWuHTHWUUXWZUXSYTnGaTnKaU3CaUnKaUXOcUHKbT3CZS26ZSnCbTHOeT3ahUnmlWHunWnqoXXimXXGfV2eUT12KRViCQmCHTlmASVN6Q2deT2deT2deT2deT2deT2deT2deT2deT2deT2deT2deT2hfUGhfUGhfUGhfUGlgT2phUGpiT2piT2piT2lgT2lgT2lhTmlhTmlhTmhgS2hgS2hgSWhgSWhhR2hhR2hhR2ZfTGVeS2JbSVxXRFdSP1BNOkxJOElINklINkdINkdKOUdLOkhMO0lNPEhPP0pOP1BRQ1hSRltPQ2lSRINZTZZWTLBTTNRaWdtJSuI/QuE5Odo3Ms87McI/LbRCKrM8JMk6KdM3KNQ4KdM6KtU5KtM6KtM6KtM6KtI5KdE6KdE6KdE6KdE6KdE6KdE6Kc07LME9MLU9L6w9LKM8KZg4IJA0G5U5IKFBKa1DLbZBL789L8A2K8IvJccwJ9A2Lt46OOg1Oe42Puw7QepAQ+ZBReBCQ9xAQdk/P80xMtA2NtM6PNE9O8k7Ob43MbU0Lq00Kao8LaU+K6U+K6VALKU+K6Q+KKY7J6k6J6o3JbI3J7w4K8U4Lsw3MNQ5NNw9OeY+O+k6N+w5New5Nes6NOk7NOg7NOU9NOI+NOBCN91DOdpDPNVCO89BPco/PMc9O78+ObE8M6k6L6I4K5w2KJg3J5Q4KZE6KY06KIs9KYk8Koc8KYM6J4I5KIA3Jn82JX02JHgzI3g1JYVCMphVRZ1XS5RQQ5BQRJVaTJNZTZBaTpBcUZBcUZJbVJVcVZhbVo5iVWtiRVZgPUpTND1HLDY/KjI9LDQ+MzU/NjY9Njg/OD1CO0NGPUVHPENENkA+Lzs5Kjc4Kj0+MDo8MTc6Lzo+MDY/LD1KME5gOmF3SGuHTHWUUXWZUXSYTnKbT3KaU3CaUHGbT3KdTnGcTXCbTG+aS3KdTnWhVHmlWH+rYH6pYXqlXXGcVWaRTF+JR12HRV6ISWKJUFmASVN6Q2hfUGhfUGhfUGhfUGhfUGhfUGhfUGhfUGdeT2hfUGhfUGhfUGhfUGhfUGlgUWlgUW1kVWxjVGphUmlgUWhfUGdeT2deTWhgTWlhTmlhTGlhTGlhTGhgSWhgSWhhR2hgSWdhS2ZfTGVeS2JbSFxXRFVSP1BNPE1MOkVGNERHNERIN0RIN0JJOUJLOkJLOkNKOklLPlNRRFNQQVhMPGVLOnRFNZVIPsJZU9lST+BEReA6Otw3NdU7M8o+L7o9KbU4Isk6Kc84J9A5KNI7KtI7KtI7KtI7KtI7KtE6KdE6KdE6KdE6KdE6KdE6KdE6Kc07LME7MLY6Lq08LKc+K5k5I48zGpM3Hp8/J6M5I7A7KcA+MMY8Mcw4LtA3L9k8NeM/Pew9Qu4/ROlDReJEQ9hAP8o7N8A1MLsxLrkvLLw1Mb46Nrs8NrM6Mqo4LqQ4LKE6K6E9LZ8+K6A/LKFALaFALaFBK6M+KqY9Kqk7Kq06KLI3KLk1Kb81K8k5MNQ/OeBDPuQ9N+g7Neg7Nec8NOU8NeQ9NOE+Nd5ANdxEOdhEOtJDO8pBOcQ/Orw7Nrg4NbA5M6I3LZk4KJU1J5M2J5E6KY88Kos6KYU4Jog9KoU8K4M8KoA8KX46J3w4JXs2Jns2JnkxI4A4KoxHOJZTQ5JQQotMPZBSRZlfU5FXTJJZTpRbUpZdVJZdVpdcVpZZVIxeUWFYO0VNKDZAHjhBJj5HMjxFNDM9Mi03LjE4MTc+NkJFPEdKP0hJO0JDMT8+Kjs6Jjc4KD0+MDk7MDY5Ljo+MDY/LDxJL05gOmF3SGqGS3WUUXSYUHSYTnKbT3KaU3CaUHGcTXGcTHGcTHCbS3CbTHOeT3ejVnunXIKtZYCrZHijXGqVUF2HRVmDQV6ISGWPUGOKUVqBSlN6Q2lgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlfU2pgV2pgV2pgV2pgV2pgVmpgVmpgVGphUmphUmphUGphUGpiT2piT2piT2piTWpiTWdfSmdfSmZeSWVfSWJdSVpYQ1NQPU1MOkhJN0VIN0FFNkBENT9FNz9HOD9HOD5GN0dLPUlLPUFFNEtKNlxRO2FFL4NKOcBqXdxnYONVU+RGReVBQOBBPdU+Nck9MMY9LcY0Jcs1Jsw2J803KM03KM44KdE7LNM9LtI8LdI8LdI8LdI8LdE7LNE7LNE7LM48LbsyKLY3LrE7L6g6KZo3IpQ1H5U3Hpw5Iq5BLbM7K7o2KcE0Ks02L9c8N+JDP+pIRehERehFSN1DQ8k6Nrs2MbQ4MK44Lqk0K6s5L6k5LqQ4LqA4LZs5LJY6K5M8K5I8K5Y9K5g9Kpk+K5o/LJtALZ1BLKBBLaNALaI7KqU6KKs3KLA2KbY2K744LcQ7M8w8NNo9NuA9NuI/OOJBN+JBOd5CNtpANtdANdhIPdJFO8dBOLs7MrI1L6ozLaYxKp8yK5k5LZI7KpE5K406Kos6KYg7KYc7K4U8K4A5J304KHw5KHw5KHw5KHs4J3k2JngzJHctIItBNJdPQ5NNQY5MQJFRRZNVSo5SR5hcUphcUpFVTZBUTJdaVZVYU5RXVJNnWl1UNUlRKkFLKEJLLD5ILzdAKzI9LTQ/MTQ8MUhQQ1peUFdbSk1POkRGLkFBJz09JTo7KT4/MTs9Mjo9Mjs/MTQ9KjtILlBiPGN5SmyITXWUUXOXT3KWTHCZTXKaU3GbUXCdTHGeS3KfTnKfTnOfUHaiVXunXH+qYoKtZnijXmqTT2CJR16HRWGJSmaOUGiQVGSJU1uATFR5RWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlfU2pfWWpfW2pfW2pfWWpfWWpgV2pgVmpgVGpgVGphUmphUmphUmphUmphUmphUGphUGhgTWhgS2dfSmdfSmRdSl5ZRVVSP09OOklKOkVIN0JENkBENT9FNz5GNz5GNz1FNkBGOD5FNT5GMUhMNU1JMFU/J39ROrxzYstjWOBfWutVVOdHR+JAPuBBPdg/Oc46MM05K849LM89Ls8+Lc87Lc47K805K806Ks46LNA6K9A6LNA6K9A6LNA6K9A6LM07Lsk/NcVCOrxCN649L582I5YxHZYxHZsyHag1I7Q2KMM7L9FBON5FP+ZJROlKRupLSN5DQdtFRNBCPrw8M685L6k9MKU/MZ89MJ8/MZw+Mpc+MJQ+L489L4o+LodALog/LI49KpE7KpI8K5M9LJQ/K5U+K5c+LJk+LJ9ALqE9LaQ6LKg4LKw4K7E4LbY6MLw5L8o8MtA8MtM/NdVBN9dDOdZDOdREOdFFOMpCNsNBNLk9M7A6MKk2L6Q1Lp80LJk3LJI6Low9LIo7LIg7K4Y6KoQ7KoM8KoE8LH47Knw7KXs5KXk6KXg5KHc4J3U2J3c0JIA0J5BEN5hOQ5FLP4xKPo9RRJJUSZBSR5NTSphYT5hVT5dWUJxdWJRXUo5TT4pjVF1XNVhjOV9qQlpmQklUNjZDKTRAKjxINE9YR1liUV9mVFdcRkpON0JFKj8/Izw8Ijk6KD0+MDo8MTk8MTxAMjU+KztILlBiPGR6S2yITXWUUXSYUHKWTHGaTnKaU3GbUXOgT3KfTHCdTHGeTXSgUXikV3ynX3+qY3umYW+aVWOMSl2GRGGJSmWNTmWNTmOLT2SJU1uATFR5RWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlfVWpfW2peXmpeXmpfXWpfWWpgV2pgVmpgVGpgVGpgVGpgVGpgVGpgVGpgVGpgVmpgVGxhT2tgTGlhTmlhTmZfTGFcSFlWQ1NSPk1LPEhJOURGOEFFNkFFNj9GNj5ENjxENT1GNTdALUBIMUlLM0Y/JVc/J4daQ7dzYLZWStliWvBlYuxUU+ZGSOtHSOZDRNg7Nss3K8k6Ksk6LMk6Kss5LMo4Kcg2Kcg2J8o4K8s3Kcs3K8s3Kcs3K8w4Ksw4LMs4LsIzLb41L7Y2La0zKKEwIp4vHqAxIKczJLxBMsdDN9ZHP+FMRudMR+lKRuVGQt9EQNdDQc9EQcFAOrE7MaQ8L6FBMZxFNJhFM5NEM5FENI9CMopBMIVAMIJBL35BLn9ALoY6Kos5K4s6KYo7Kos8K408K449Ko88KpY/LpY9LZs7K505KqA4K6U5Lak7Lq45L7g6Lr45MME7MMQ+M8U/M8VBNMNBM8FBNLY7LLI6LKo4LaM3K542K5s2LJg3LpQ6L407L4g8LIc7LYQ7LII6K4A7K4A7K388LH07K3o7Kno7LHc5KnY4KXU3KHQ2KXY0Jog7MZRGPJZOQo5KPYhIPI1PQpFTSJJSSZJPSZlUT5lTUZpWU5pdWpNZVY1bVI1sW4F9WH6JXoCLYWx4UkxYNDZEIz1KLkxaQGVxWWVvV11lTVBVPkVJMD9DKD1AIzo8JDg5Jzs8Ljg6Lzk8MT1BMzY/LDxJL1BiPGR6S22JTnaVUnSYUHOXTXGaTnKaU3CaUHWiUXCgTG6dTHCfT3WkVnmnXH2oYHynYHCZVWaPTVyERVyERWWMTWmQUWaNTl+FSGOIUlp/TFN4RWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWphUmphUmphUmphUmphUmphUmphUmpgVmtgXGtfX2tgXmtgXGtgWmthWGthV2thVWthVWthVWthVWthVWthV2thV2thWGthV25iUm1iUGpiT2piT2hhTmVeS19aR1lWRVJPPk1LPEdIOkRGOENFN0JENkBENTxDMzxINDlCLUZKM0xGME86JXFMOZpjT6peTqFBNcZTTOdjX/BeXu1TVetKT+lESOFBQcw5Mcc5LcU3K8U3K8g4Lco6L8s7MM06MNE+NNE+NNI+NNI+NNM/NdM/NdM/NdM+N9M/O9FCPstEPsZGPcJGPMNJPsdNQM5QRNlTSN1QR+JNR+RJReRHQuJDP+BBPdtCPdVGQslEP7o/N6s9MJ8+LppDMJVHM5RJNo1GNIxFM4hDM4VCMYBBMH1ALnpBLnw/LYI6LIY4LIU5K4Y6LIY6LIc7LYc7K4g7K4k6K4s6KY44KZA4KpU5LJk7L509L6I8MKo6L604Lq85L7A6LrA6LrA6LK85K644Kqg3KaU3KJ42KZs2KpU3K5I4LZE5L448MIg8LoU8LYM7LIE5Kn86Kn45Kn06Kn07K3w6LHo7LHk7LHc5KnM4KnE2KHI3KXU1KYxEOJJIPZFLP4pIOodJPItPRJNUS5dUTJZRTJtUUJhRT5RTT5ZcWJBfWJBoXpd+apSUcIWSZnWCV1loP0NSKz9PKlBgPGNyUWV0VVxpS05YPUNMMT9FKz5CKT1BKDs9Jzc4KDo7LTc5Ljk8MT1BMzdALTxJL09hO2J4SWyITXaVUnWZUXSYTnKbT3KaU2+bUHGgT2+eTW+eTXOiUnqoXXyqYXqlXnWgW2OMSl6HRVuDRF+HSGeOT2qRUGaNTGCHSGKHUVl+S1J3RGlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWphUmphUmphUmphUmphUmphUmphUmpgVGtgWmtgXGtgWmthWGthV2thVWtiU2tiU2tiU2tiU2tiU2thVWthV2thV2thWGthV29jVW5iUmtiUWtiUWtiUWhhT2RdTWBaSlhSQlJPPk5LPElHOEdFNkRFNUJDMz5CMT1JMT9HL0xHMVM+K2c9LZVaTK1fU5w+NJ4zK7Y/OdhYVfNpZ/ZkZetSVeZKTuhOUNlJQdNGPM1ANss+NM5ANtJEOtVHPddHPtpKQdpKQd1KQt1KQt5LQ95LQ+BLROBLRetTUuhUVONTUtxST9hTTNhTTNtVTOBVTuBMSOFJRuNFQuJDQORCQOJDQORFQuBGRNlKRspFQLk+N6w9MqE/MphCMZJFM5BHNIxFM4hDM4dCM4NAMIE/MX4/MHo/L3w+L4A6LoM5LoM5LoM5LoM7LYM7LYM7LYM7LYE5KoI5KoU5K4c6Kok6K407LY88LpM7L5s7L545LZ85LaA6LKE5LKI4K6I4KqI4Kp84KZw4KZg4KJQ4KY85Kow6LIk6LYc7LYQ6LYI6LIE5K4A4Kn04KX03K3w4K3s5K3o4LHk5LXg6LXY4K3E1Km81KXE3K3Q5K4xIO41JPIlJPYRJO4VLP4xSRpNXTZhYT5hRTZxVUZhSUJNWUZJgWYhiV4NnW4Z6ZG5yUVppQEpZMEFSKElaMFdpP2R2Tmp8VlhpRUxbOj9MLjpEKTxELD5DLTxBLTo9LDg5Kzo7LTY4LTg7MD5CNDdALTtILkxeOF91RmmFSnSTUHSYUHSYTnKbT3ObVHCcUW6dTW2eTHChUHeoWXyqYXqoYHKdWGmTUVqDQVyERWGISWWMTWeOTWeOS2iNSmaKTGOGUFl7SVJ0QmlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWtiU2tiU2tiU2tiU2tiU2tiU2tiU2thVWxiWWxiWWxiWWxiVmxiVmxjUmxjUmxkUWxkUWxkUWxjUmxjVGxiVmxiWGxiWGxiWG9jVW5iUmtiUWxjUmxjUmtiUWdgUGRdTV5XR1lTQ1NNP01KO0tIOUdFNkVCMz9CLztILj9ILU9DLWE9LYNFOqtYUrROSp4sK7I6Obk9O9NTUvJwbv52dvFlaOtYXvBeX+NVUdpQRtRHQNBDOtFEPdRHPtZHQdZHP9lIQ9pKQtxIRN1KQ95KRt5LROBLR+BLR+JISOFHSdxISNlHR9ZIRNdIRNhHQttGQuBCQeRBQuZCQehCQudDQuRCQN9BPttBP9tKR8pDP7k8Nq4+M6JAM5hBMJBBMI9DM4pBMohAMYc/MYU9MYI8MIA8MX89MX89MYE7MYE7MYM6M4E7MYE7MYA8L4A8MX89L4A8L4A9LYE8LYA7LII6LIE5KoI4K4M3KYw6Lo84LpE5LZQ6L5c7Lpo9Lp48L58+Lpk5KZY5KJM6KpA6K4o7LIc7K4Q7LII6K4I6LIE5K383KX42KHs1KXs1KXs1KXo2KXg2Kng4LHc5LHM4KnA0KW81KXI6LXY8MItNQIlLPIRKPIJNPYVRQ4tWSJJYTZdXTpNOSZlUT5dWUpVcVZBlXHteUGZWRmBeR0VPLT5OKT9PKEpcMl9yRWt+UWV4S1hqQE1fN0BRLTZFJjdEKj1GMT1ENDo+MDc7LTg6LDo7LTY4LTg7MD5CNDdALTlGLElbNVtxQmWBRnKRTnOXT3OXTXKbT3ObVHCcUW2cTG+gT3OkVXioXHqoYHOgW2mTUWCKSFmBQl6GR2WMTWeOTWaNSmWNR2eMR2iMTGGETlh6SFFzQWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xiWGxiVmxiVmxjUmxjUmxkT2xkT2xkTWxkTWxkTWxkT2xkUWxjUmxjVGxiVmxiVm9jVW1hU2tiU2xjVG1kVWxjVGlgUWZfT2JbS15XR1hRQVJMPE9JOUpHNklDM0FDLjpHK0BGKlVAK3hHOaNQTLRISLY4PLozOchBRcQ/QMpKSd9iYPFxcPBucOdiZeJaXNtRTtVMRM9EP81CO89EP9BFPtBCPs1AOdJDP9JDPdRDQNVEP9dDQdhEQNlFQ9pEQ91BRN1BRN5ERt1HSN9JSOBKSeNJSeVHSOdBQ+pBROxCRexCRedBQeJAPts9OtU9OtpGRsk9PLk4M7A7MqZANJg/MZE+MI9AMYo8L4o8MIk7MYg6MIc4MYY5M4U6NIQ7NIE7M4A8M4E6NIA8M388M309MX09M3w8MHw8MHw9Lnw9Lns8LXw6LHs5KXo4Kns3KoI6LoM5Loc5LYk5Lo05LpE7LpU8LpY9LZI5KZE6KY06Koo7Koc7K4M8KoA7K347KoA4KoA4LH42Kn01KXw0KHo0KHo0Knk1KnUyKXY2LHY4LXI2K28zKW81KnM6L3hAM4pQQoZOP4FOPYJRQIVWRolYSY5VSpFSSZJPSZdUTpNUT5FcVopmWm5bSlBLN0VLMUFOMEtaOVdnQ2BySmd5T2R6TFZsPkddL0FWLTdIJDFAITZCKj1GNTxEOTg9Njc6Mzk7Ljs8LjY4LTk8MT9DNTdALTdEKkZYMlZsPWF9Qm+OS3GVTXOXTXKbT3ScVXGdUm+eUHGiUXWmV3amWnOhWWqXUmKMSluFRV6GSGCISWOKS2WMS2aNSmaOSGaLRmWJSWCDTVd5R1ByQGlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xiVmxjVGxjVGxjUmxkUWxkT2xkT2xkTWxkTWxkT2xkT2xkUWxjUmxjVGxjVGxjVG5iVG1hU21hU21hU21kVWxjVGphUmdgUGRdTWBZSVpTQ1VOPlBLOE1INUlEMURDLkBGKkREKFtCLIhUR69cWKs+QawvM85JTsY/RcA7Prs7PMRGR9haW+NlZttZW8xHSNFKR9BFQs1CP9BCPtRGQtRGQtBCPsk+N89EPc9EPdJEQNRFQdZFQtlFQ9pERd1ERt4/Q99ARN5CRd9FReFHR+BGRuBCQ+E+P+hCROlAQ+g+Qec9PuQ+PuNBP+FDQN9FQ9ZCQsU5OLY1MLA7NKY/Npo+M5A9L40/Mog8L4c6MIc6MIc4MYc4M4c4M4g5NIg7NYI5MoA6MoA6Mn87Mn48MH48MHw8MHw8MHg4LHk5LXo6Lno6Lns8LXs8LXo7LHo7LH07L385L4A3LoE3LIQ2KoU1KoY3KoY3KIo4Kog5Kog7K4U8LYQ8LYA9LH48LH07K305LH03LXw2LHk1Kno0Kng0KXg0KXg1LHIyKHU1K3Y4LXI2K240KW41KnQ7MHhCNopVR4RQQoBPQIRTRIhXSYxWSoxSR41OR5VUTpRVTotSS4RYTX9kU2VaREdLMj1KLElYOVprSWd4VGN4UVluRVNoPU5jOEpfNDpMJjA/Hiw5HTU+KT1DNTxCODo8Nzk8NTs9Mjs9MDc5Ljk8MT9DNTg/LThCKUVVMVVoO2F6Q26KTXKTTnKWTnKaUXOdU3GdUnKgVXWjWHakW3SiWm+aVWaQTl6ISFuDRGSMTmGJS2CHSGOKSWaNSmeOS2WKRWGFRWCDTVd5R1ByQGlgUWlgUWlgUWphUmphUmtiU2tiU2tiU2phUmphUmphUmphUmphUmphUmphUmphUmtiU2tiU2tiU2tiU2tiUWtiUWtiUWtiUWxjUmxjUmxjUmxjUmxjVGxjVGxjVG5iVGtdUHBgUXRkV3JkV25iVmpgVGhgU2hiVGdhU2dhUWNdTVtWQ1ZRPVNOOE5IMkdBKUtHLEk/JGJJM5FnV7Z4bbtsZbhZV7lPT7ZCRb1CRcJER8hGSM1IS9BKS9JMTdNLTc9FRdBERdNFRNZGRdVGQtJDPc5DPM9GPMhEOMlFOcpFPMxFP9JEQNdDQ9pBRNs/Q+FCRuJCROFDROBEReBEReFGRONFRORERONDQ+RCQORAP+M/PuM/PuJAPeJAPd5DP9NCP8U+OrY5M6o3MJ86MJc9Mo4+M4Y+MoM/MoE/M4E9MoE7M4Q5M4Y5M4g4MYg5MoU7MIQ8LoQ8LoM7LYE7L4A6LoA6LoA6Ln46LX46LX46LX46LX07L307L307L307L305MH05MH44MH44LoA3LoA3LoA3Ln44LIA4LH44LH05LHw4LXs5LXo4LHg4LHg4LHg4Lng4Lnc3LXY4LXY2LHQ2K3M1KnE1K20xJ3I2LG40KW0zKG82K200KXE4LX9JPYVTSIVTSoZSR4hSSItQSJBRSpRRS5VSTJNUTY1US4lbToJjUW9fSFlVOk1WN09fO2p+WWJ4UVlvSFVqQ1JnQE1iO0lZNUNSMTdEJjQ+IzI6IzY7Jzw+MEBCNUBANjw+MzU4LTM5LTQ6Ljc6Lzk9Lzs/Lj1CLDxFKFNfO2FyRm6GUnORVXKVUXKaU3OdU3KdVXWeWn6nZX6nZXCYWWKKS16GR16GSF6ER2CGSWKIS2SKTWaNTmWMTWOKS2CHSF6ER1+CTFR2REttO2lgUWlgUWlgUWphUmphUmtiU2tiU2tiU2phUmphUmphUmphUmphUmphUmphUmphUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVG5iVHJiU3FhUnJiVXFjVnJmWm9nWm1lWGpkVmdjV2toWW9pWWxnVGhjT2NeSFtVPVJMNFBKMEg+JVE/KWtQPX9YR4ROQohFPZNEP7FXVrhUVLtRUcBQT8BOTcFNTcJMSsNLStBUVMhIR8I9PsQ9OtBCQNNFQc9CO8c+NMpEOclFOctGPc1HPtRGQthERNxBRd1BReFCRuFDROFDROJEReJEQ+FGROFGROFGROBFQd9EQOBCP99BPuBBPeBBPeBBPd5DP9RFP8hDPLo+Nqw6MKA5MJQ6L4o8MII8MIBBMn5AM34+NH88M4M6M4Y5MYg4MYk5MIc7LoU8LYQ7LIQ7LIM7LYI6LII6LII6LH85LX85LX85LX85LX46L346L346L346L305MH05MH05MH05MH05MH05MHw5MHw5MHw5MHo6MHo6MHk5L3k5L3k5L3c5Lnc5Lnc4L3c4L3Q4LnM3LXI2LHI2LHA2K3A2K2sxJnE3LG00KWwzKG82K2wzKHA3LH5IPoRSSYVTTIhRSotQSpBRTJRQTZVRTpRTT4pPR4VTSIBbS3tlUHNpUGhrTGZxUWd4VF50TVhuR1BmP0xhOktfOktcOkdWN0NQNDxGLThAKTY7Jzc6KTw9Lz9AMj4+Mjs9MDQ6MDM7MDU7MTY8MDo8Lzw/Lj5BLD5EKlFbOV5tRGuBUnCMUnCTU3GZUnOdU3OeVnifXnyiZXieYWuRVGCGSV2DRl2DRlyCRWCGSWGHSmOJTGWLTmSKTWKIS2CGSV6ESV1/TFJ0QklrOWlgUWlgUWlgUWphUmphUmtiU2tiU2tiU2phUmphUmphUmphUmphUmphUmphUmphUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVG5iVHFkVG9fUG1dUG1fUnFlWW9nXGxkWWhiVmZiV3BsYHt4aX57an95aXp1YnBpVmVgSlRUPEZGLkM+KE1CLlNAL1U4KF03Kmw9M243MHU5MX47NYdAOpJJQptQSqVYUK1aUrteWbpTTrdHRbxCP8hEQtFGQ9NEQM9AOtBBO9BDPNJFPtRHQNZHQ9pGRttFRt5ERt9DRN9DRN9DRN9DROBERd9FRd9FQ99FQ95EQt5EQtxEP9tDPtxDPdxDPdxDPdtDPtZFQM5FP8NCPLM+NaI6MZQ4LYg5LIM7LYJAMn9AMX4+Mn89MYM6MYY5MYc4MYg6MIc7LoQ7LIQ7LIQ7LII6LII6LIA6LoA6Ln85LX85LX46L346L346L346L346L346L305MH05MH05MH05MHw5MHs4L3s4L3s4L3s7MXs7MXo6MHk7MHg6L3g6L3g6L3g6L3Q4LnQ4LnM3LXM3LXI2LHE1K281Km81KmoxJm82K200KWsyJ2w2KmkzJ203K31HPYdQSYdQSYtQSo5RTJFSTZJTTpRVUJFWUIxXT4dbUH5eT3RiTm9pUW9yVWx3WWZ3VVFlQktfOkVZNkRVM0VWNkdWOUdUOEVSOD9JMDxELTk+Kjc7Kjo8Ljw+MDs9Lzk7LjY8MjU9MjY8MjY8MDo8Lzw+MD1ALT1DKU1XNVppQGZ8TWyITm6RUXGZUnWfVXSfV3qhYHedYG6UV2OJTFyCRVyCRVyCRVqAQ1+FSGGHSmKIS2SKTWOJTGGHSl+FSF2DSFt9SlByQEdpN2lgUWlgUWlgUWphUmphUmtiU2tiU2tiU2phUmphUmphUmphUmphUmphUmphUmphUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVG5iVHJkV29hVG1fUmtfU2thV2xjWmxlW2pmXWpmXXh0aYiEeJGNgZWPgZKMfomCcn16Z2BjTk9UPkRHMkZFMUhDMEY9LEw8LFZDNFA5K1I2KlY0Klk1KVw2K2E5L2U9MW09MYpLQp1TSq5VT7ZOS7xGRMZBQtJEQ9hGRtRAPtVBP9ZCPtZFQNlFQ9pGRNtFRN1FRN5ERN9DRN9DRN5ERN5ERN1FRN1FQt5GQ9tGQtpFQdlEPthFPtdEPNdEPNlEPdhFPtREPNNGP8lGPrpBOKc7MZg4LIw5K4U8LYNAMH9AMX4/MH89L4M6MYQ6L4c5L4g6LoQ6LYQ7LIQ7LIM6K4I6LII6LH85LX85LX85LX85LX46L346L346L346L346L346L305MHw5MH05MHs4L3s4L3s4L3s4L3g4Lns7MXk7MHk7MHk7MHg6L3g6L3g6L3Y6L3M3LXM3LXM3LXI2LHE1K281Km81Km00KWoxJm82K2wzKGgyJms1KWgyJmw2KnxGPIpPR4xPSo1QS49STZBTTpFWUJBXUIxaUYldUoVhVXlfUGlaR2RfSWRoT1xmS05dQEVVOEFRND1NMDxLLj9NM0NRN0ZSOkdTO0JMND5HMjpBLzk9LDk9Ljk9Ljg8LTc7LTc9MzY9NTY7NDY8Mjo8MTs9Lzw/LDxBKkpTNFZlPmJ4SWqGTG6RUXObVHehV3iiWnuiYXKYW2WLTlyCRVqAQ1yCRVyCRVqAQ1+FSGCGSWGHSmKIS2GHSmCGSV6ER12DSFl7SE5wPkVnNWhhUWhhUWhhUWliUmliUmpjU2pjU2pjU2liUmliUmliUmliUmliUmliUmliUmliUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVGxjVHJmWHRoXHNnW21jWWphWGxlXXNuaHp3cIF+d5CNhqCdlKilnKunnKikmaOdkZmWh3p7a2NmU09SP0dKN0VINUJFMkJFMkVINUtMPEpIOUdENUQ+MEE5LEE3K0A2KkY0KFM1KnFCOIxQSJ9QS69JR79HScxFSdNCRdZAQtlAQtpCQdtDQtpFQdpFQdxEQdxEQd5ERN5ERt5ERt5ERt5ERN1FRN1FRNpEQ9pGQtdGQdZGPtRFPdRFPdNGPdRFPdVGPtRBOtNDO85FPcFCOa4+M545LZE7Loo8L4Q/MIE/L4A+LoA9LYE7L4Q6LYY6LYc7LoQ6LYM7LYI6LII6LII6LIE5K385LX85LX46L346L346L346L306MX06MX06MX06MXw5MXo6MXw5MXk5MHk5MHg4L3g4L3Y3Lnk6MXk6MXg5MHY6MHY6MHU5L3U5L3Q6L3I3L3E2LnE2LnA1LW80LG4zK24zK200K2oxKG03LWo0KmgyKGo0KmYyJ2o2K31EO41OR49OSJBRSpBUTJBVT45XUIpZUoNbUXtZTXZcT2taSl1VQllYRFleSE9ZQT9LMzpILzdFLjRCKzVBKzhELj1JM0NMN0VOOUJLNj9INTxFMjpBLzg/Lzc+LjU8LDQ6LDU8NDU8NTY7NTY7NDk7MDo8Lzs+LTtAKUdQMVJhOmB2R2mFS2+SUnWdVnmjWXmjW3ifYG6RV2CDSVp9Q1t+RF6BR16BR12ARmCDSWGESmKFS2KFS2GESmCDSV+CSF6BSVd8SUxwQEJmNmhhUWhhUWhhUWliUmliUmpjU2pjU2pjU2liUmliUmliUmliUmliUmliUmliUmliUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVGxjVGthVW5kWnBmXGxjWmtkXHJtZ4SBfJGQjKejoLWxrsTBvMnGwcnEvsXAusC5sbmyqKScj4iCcmZjVFBRP0ZJOD5FMztEMTpGMjhFMzhFMzhDMjpCMzxCNEBDOENFOkdFOT40KFA6L2U/NoBFQaFQT79YW8pRVspDSdVGStdFRtpGRttFRN1FQt5EQt1EP95DQd5ERN5ERt5ERt5ERtxEQ9xEQ9xEQ9pEQ9lFQddGQdVGQNNGPdJFPNBGPNFHPdRFPdQ/ONVAOdBDOsZDObZBN6U9MJY9L4w9LoY+L4I/L4E+LoA9LYE8LYM7LYQ6LYU7LoI6LII6LII6LII6LIE5K386K385LX44LH46L346L346L346L306MX06MX06MX06MXo6MXo6MXk5MHk5MHg4L3Y3LnY3LnQ4Lnc4L3U5L3U5L3M5LnQ4LnM5LnI4LXI4LXE2LnE2LnA1LW80LG4zK200K2wzKmo0KmgyKGw2LGkzKWYyJ2g0KWUxJmk1KntCOY5NR5JNSJFQSo9UTI1WT4dYToFZT3xcUXNcTmtbTGBXRlZTQlBTQkpRP0BJNjRALDM8KzI7KjA5KDA5KDI7KjU+LTlCMTxFND9INz9INT5HNDpGMjpDMjVALzM+LTE8LDM6MzM5NTQ5NTQ5Mjg5MTk7Ljs+LTtAKkNML09eN11zRGmETXCTU3efWXmjWXehWXGYWWaJT1p9Q1h7QVx/RV2ARl2ARl6BR2CDSWCDSWCDSWCDSWCDSV+CSF6BR12ASlZ7SEpuQEFlN2hhUWhhUWhhUWliUmliUmpjU2pjU2pjU2liUmliUmliUmliUmliUmliUmliUmliUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVGxiVmpgVmphWGtkWmtnXnVwaoiFgJ+emrCwrsPCwNPS0OLh3+fm5Ofj4OPe2t7W09nOyM68srill5eHenltXV9ZSUtMOkBFMTtELz5KNj1INz1GNTtDNDs+NTo7Mzk4Mzg4MD09M0M8Mk43MWE4NIhISK9dX8VgZMpXWs1RU9NOT9dNS9tLSt5IR+FGRONEQeJCQt9DRN5ERt5ERt1DRd1DRdxCRNxCQttDQtpEQ9hEQNVEP9NGP9JFPNBGPNBHPdRFPdlAOtlAOtFCOshDOrxDOqxANJk7L4w5K4k9L4M+LoE+LYA9LIE8LIM7LIM7LIQ8LYI6LII6LII6LIE5K385LX85LX44Ln05Ln46L346L306MX06MX06MX06MX06MX06MXo6MXk6MXg5MHg5MHc4L3Q4LnM3LXI4LXQ4LnM5LnI4LXE4LXI4LXA3LHA3LHA3LG82LW82LW41LG41LG00K2wzKmsyKWkzKWcxJ2s3LGg0KWUxJmg0KWIwJWY0KXpBOJBNR5JNSJFQSo5VTIhYToFZT3haT3JcTmteTl5XR1JQQUtOPUNKOjlCMTI6KzA4KTE3KzE3LTA2LC81Ky81KTA4KzI6KzQ8LTlENDtGNT1INzxJNztGNTZDMTNALDE+LS44MDA2MjE2MjI3MTc4Mjk7MDo8Ljo/KT9IK0tZNVtxQ2iDTHGTVneeW3ehWXOcVmeNUF6BSVV4QFd6Qlt+Rlt+Rlt+Rl2ASF+CSl+CSl+CSl+CSl6BSV6BSV2ASF2ASlV2SUprQEBhNmhhUWhhUWhhUWliUmliUmpjU2pjU2pjU2liUmliUmliUmliUmliUmliUmliUmliUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVGxiVnBnXm5nX2xnYXRxaoeEf6GgnLy8us7Qz8/Pz+Dg4PLy8vr4+fv39vfz8PHs6fDi3+jQxt3BtcGrnaKRgX11Yl5cR0tNN0NIMkFJMkFJNEBHNUJEN0FBN0I9OUM5Nz86Njk8NT4/N0I3MUouK2Q2No9RUrNnacZubcBcXMdaV9BWU9dRTtxMS+JISOZDROVCQ99DRt1ERt1ERt1DRd1DRdxCRNxCQtxCQtxEQ9lDQtdDP9NEPtJFPtBGPNBGPNRFPdxDPdtBOdJCOspEO79FOrBBNpw6LYs1Joo8L4U9LoI9LYA9LIE8LIE8LIM8KoQ8LYI6LII6LII6LH86K385LX44LH05Ln05Ln46L346L306MX06MX06MX06MX06MXs7MXk6MXc7MXg5MHU5L3Q4LnM5LnI4LXE3LHI4LXE4LXA3LG44LHA3LG03K282K282K282LW82LW41LG00K2wzKmo0KmkzKWg0KWYyJ2s3LGg0KWMxJmUzKGIwJWUzKHhCOI5NR5JPSY5SSopVTYNYT3paT3FbTWhcTFpURElKOj9DND5ENjlBMjA4Ky83KjY8MjQ3MDU4MTU3MjQ3MDI1LjA2LDA4LTE5LDZBMzpFNT1KOT5LOTxJNzdGMzJBLDE+LSw2Li40MDA1MTE2MDY3MTg6Lzo8Ljo/KzxFKklXNFlvQWeCTXCSVnadXHWeWHCZVWCGSVh7Q1N2Pld6Qlt+Rll8RFl8RFx/R1+CSl+CSl6BSV6BSV6BSV2ASF2ASF1/TFN0SUhoQT9dN2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2pjU2tiU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVWxkV2liWmdkXXZzbpOSjq+vrcTGxdrc2+ru7/P09vb3+fz8/v///////f/7+vz39P3y7Pfh1PLYx+DKtca2n6qgh4iEaWJiRkVILURIL0NHMEZFMUdENUY8M0M2MEY0Mkg6OT49OT4/OkI6N0k3NWNHRpJqasWTkuitqdKLh8d0bsBdWMZTUNVPTt9KTOdGS+lGS99FR99JS9pERtQ7Ptg+QOFHSeBER9Y6PdpAQNpAQNlBQNZCPtRDPtFCPNBBO9FBOd5DPttBOdNAOcpBOb5COLBANZ86LpA4Kow9MIc+L4M+LoE+LYA9LH88K4E9KoE8LH86K385LX85LX44LH44Lnw4LXw4LXw4LXw5MHw5MHw5MHw5MHo6MXo6MXo6MXo6MXk9NXc8NHc7M3U6MnQ5MXE4L3A3LnA3Lm82LW03LW03LWw4LW03LWw4LW03LW03LWkyK202L3A5Mm84MWs0LWcyKmcyKmgzK2UwKGk3LmQyKV0tI2AwJl8vJWIyKHM+NoxPSo9QS4hRSoFSSn1ZTXZfUWZZSVROPkRFNT5FNTpDMjVAMDQ8LzM7MDQ6MDQ6MDY4Mzc4MzY2NDQ2MTM1MDE2Ly82Li42Ky45KzI9LTZDMjpHNjpJNjhHNDRDLjE/Lio0KywyLi0yLi4zLTQ1Lzc5Ljo8Lzo/KzY+JkRSMVdsQ2iCUnOUXXeeX3KbV2uUUlt+RFh5RFR1QFR1QFd4Q1p7Rlt8R1p7Rl5/SmKDTmKDTl5/Slx9SF+AS2CBTF5+TVRzSkZkQDxXNGljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2tiU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVWxkWWdkXW9uaoaFg6SkosHDwtba2+ru7/f7/Pf7/vj8//z9//7+/v///f/++v/8+f/68//w4Pvr1O3fxdfNssC7naSjhIKDY2dqS0xRM0dKL0VDLkdCL0g+Mkk6M0w5NUs8OT86N0JBP01IRV1SUHlqZ6OOi86yrujFv//X0eyzqs2CfMBjXspWVthSU99ITdpBRNZERdVFRdhISNxKS9tFRtU8PtY8PttBQ9k/P9k/P9lBQNdBQNZCPtNCPdJBPNNAOdxBPNtAO9NAOctCOr9DO7FBNqA7MZI4LYw9MIc+L4M+LoE+LYA9LH88K4E8LIE8LH86K385LX85LX44LH05Lnw4LXw4LXw4LXw5MHw5MHw5MHw5MHo6MXs7Mns7Mno7Mnc8NHU8M3U6MnM6MXI5MG44Lm82LW03LW03LWw4LWw4LWw4LWw4LWo4LWw4LWw4LWs2Lm43MG84MW45MWw3L2k0LGcyKmUzKmMxKGQ0Kl8vJV4uJGIyKF4uJGAwJnA+NYFKRYdSTIdYUn5YT3JWS2RSRFFKOj4/LzpBMTZBMDVAMDM+MDQ8MTQ8MTU7MTc6Mzc5NDc3NTc3NTU3MjQ2MTE2Ly82Li83LC45KzE8LjRBMDhFNDlINThHNDRFMjRCMS44Ly41Li4zLS0yKzIzKzQ2Kzg6LTk9LDc/KERRM1dsRWiCVXSVYHedYnCYWWePUFl8RFd4Q1R1QFR1QFZ3Qll6RVl6RVl6RVt8R1+AS1+AS1x9SFt8R15/Sl5/Sl57TVNuS0ZfQTlSNGljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2tiU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVW5lVm5lVmxmWmVkX3l7eJeZmLK2t83R0uTp7PT5/Pr///v///z///3+//7+/v/+/P//+///+v//9P785/r53e/w0eHlxNLYtLzEn6Cog4eRbGBnRVFYN0RHLERDLkpENExEN0tBOEk+OkM7OVNKS2lhX4F3dpySkL6zr9nOyOrc0/7o3f/z6f/k2/Cpo8NlY7VCRcdESdpSVttVVNFNS8pEQc1DQdRGRddFRthERNlDRNY9P9c+QNhAP9ZAP9ZCQNNCP9NCPdRBOtlAOtlAOtJCOstFPMBEPLJCN6E8MpM5Lo48MIk9MIM+L4E+Ln89LX48LIA9LYA9LX85LX85LX46L305Ln05Lnw4LXs4L3s4L306MX06MXs7Mns7Mns7Mns7Mno7NHg8NHQ7MnE7MXI5MG85L244Lmw4LWw2LGs3LGw4LWo4LWo4LWo4LWo4LWk5LWo4LWo4LW45MW04MG04MG04MG04MGk3LmY0K2MxKGQyKWExJ10tI18wJmM0KlwtI18wJnNEPH1QSoFWUH5ZUXBUSV5KP09DNz88LTQ2KDI7KjA7KzE8LjI9LzQ8MTQ8MTU7MTc6Mzc5NDc5NjY4MzU3MjU3MjI3MDA3LzA4LS45KzA7LTI/LjZDMjdFNDhHNDhHNDlGNTQ+MzM6Mi80LSwyKC8wKDEzKDU3KjY6KTY+J0RRNVltSmuEWneXZnecZmyTWl+HS1d4Q1d1Q1RyQFRyQFZ0Qlh2RFl3RVl3RVp4Rl17SV99S117SV17SV99S158Slp3S1BnSkFXQDNJMmljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2pjU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW1kVW5lVm5lVm5lVm5lVm1nW2prZoOHiKOnqLm+wdDV2OXt7/P7/fX9//v///v///z///z++/3++f79+P/+9///8/j95vT93u732Obyzt3pw87atLbBmaGrhoCHZWZtTE1RNkZIMEhKNUtJOkhEOURAN09HRGpgX4uBgKSambevrMvGwt7b1Orm3frx6P/78f/37f/d1fu2seWPjspjZLBAP8NQS8lUTclQSMNGQMhHQtRNStZLSNBAP9I+PtM/P9U/PtVBP9VBP9NCP9NCPdNCPdY+OdVAOtJDPcxFP8BFPrJBOaI9NZU7Mo48MYk9MIM+L4E+Ln89L348LIA9LYA9LX85LX85LX46L305Ln05Lnw4LXs4L3s4L347Mn47Mnw8M3s7Mns7Mns7Mno7NHg8NHI5MG85L285L205Lmw4LWs3LGo2K2g2K2k3LGk3LGk3LGg4LGg4LGg4LGg4LGg4LG07Mmw3L2o1LWk3Lmo4L2o4L2Y0K2ExJ2U1K2EyKF0uJGEyKGIzKVkqIGEyKHlORYFcVnZXUmlOR1dDOkk8M0A6Ljo7LTg8LjA4KS86KjM7LjQ8LzU9MjU7MTY5MDY5MDc5NDY4MzY4MzQ5MjM4MTM5LzE5LjE5Li45Ky86LDA9LDI/LjVCMTdFNDtINjxJODlDODc/NDI4Li0zJy4wJS8xJDI0JjQ4JzQ8J0VSOF1wUHKLZHuabnecaWaNWFV8RVNzQVRyQFNxP1NxP1RyQFVzQVZ0QlZ0Qld1Q1t5R117SVx6SF58Sl99S1x6SFdySUpeRTxNOy4/LWdkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2ljU2pjU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW1kVW5lVm5lVm9mV29mV25nXXFxb4eMj6SprLe/ws3V2OPt7/L8/vT+//j///r///v//P3/+vz99fr88fn57fb46vb/6PP/5PD94e752en00t7oxcrSrba+mZ2jgX2CYlldQkdMNUZLN0ZKOUNHOUFDOGNeWIV9equhn8G3tczCwdfPzebh3fHu6fr38Pz16//x5v/y6f/07P/l3+mopLdoY6ZMQbVQRMFZTsdbUcZRSL9EPcJBPMtEQctAPc5APtBAP9FBQNJDP9FDP9FDP9JDPdM/O9JBPNBFQMlFQL1DPq9AOaA+NZU9M448MYk8MoM9MYE9MH89MX48Ln89L389L346L346L346L305Lnw5MHs4L3s4L3s4L3w8M3w8M3w8M3s7Mno7NHk6M3k6M3c7M243MG04MGw3L2w3L2s2Lmg2LWg2LWg2LWk3Lmg4Lmg4Lmc4Lmc4Lmc4Lmc4Lmg4Lms5Mmg2L2Y0LWc1Lmk3MGg3MGU0LWIxKmMyK2IzK18wKF0xKF0xKFYqIWI2LXtVTHRZUmFOSE4/OEE3Lj02LDs5LTk7Ljk8MTM5LTM7LjU7LzY8MDY8MDc6LzU4LTQ3LjY5MDQ5MjM4MTM5LzM5LzI6LzE5LjE5LC45Ky45Ky86LDA7LTM+LjZDMjpFNTxHNz1FODpCNTU7LzA2KDAyJS8xJDEzJTE1JDI6JUdTO2J1V3ePa3ybcnGVZ1yCUUpwPU9vPlFuPlFuPlFuPlFuPlFuPlNwQFNwQFd0RFt4SF16Sl16Sl98TF98TFp3R1JsRUNVPzZENyg2KWdkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2ljU2pjU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW5lVm5lVm9mV3BnWHBnWG5nXWxubXqChZOaoKu1t8TO0Nzm6O33+fT+//X+/fb//Pr/+vv/+fv+8/j67fX26PH04/T96vT96PT85fP53/L22+nszdjXucXEpbGwko+OcmVnT01QO0dLOkZNPUdPQktRR3t7c5+alMW+uNjOzN/T0+fb2/Pr6fz39PDv6vz89P//9v/98//57//z6v/n3v/Xy9iTg7hlU6NKOrRURr1XSbVGO7dAOMhLRcdDPspDP8xCP85DQM5DPs5DPs1EPs1CPdFCPNJDP85EQcVEP7hBPao9OJ47NZU8NI47M4k8MoM9M4E9Mn89MX48MH89MX89L346L346L346L305Lnw5MHs4L3s4L3s4L3w8M3s7Mns7Mno6MXk6M3g5Mnc4MXU5MW43MGw3L2w3L2o4L2k3Lmk3Lmg2LWc3LWc3LWc3LWY3LWY3LWY3LWY3LWY3LWY3LWg3MGg2L2c1Lmc1Lmc2L2g3MGc2L2Y1LmEyKmU2Ll4yKVwwJ2A0K2E1LGk9NHVTSlhHQEU+Njw1Lzk1LDs4Lzg6LzU3LDM2KzY5LjU7Lzc6LzY5LjY5LjU4LTU3LDM2KzI4LDE5LDI4LjE5LDE5LjE5LDE5LDE5LC45Ky45Ky45Ky86LDA7KzM+LjZBMTdCMjxENTpDMjg/LzU7LTQ2KTI0JzEzJTA0JTA3JUhUPmV4XHWNbXSSbGaJX1J3S0JoOUtrPE5rO1BtPVBtPU5rO05rO09sPFFuPlZzQ1p3R116Sl57S198TF98TFZzQ05nQDxKOS86MiQuJmdkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2ljU2pjU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW5lVm5lVm9mV3BnWHFoWW9oXmhpa210eoWMlKOssb/IzdPe4uXw8vD8/PL8+/X++fj/9/r/9vz/8vr97Pj55/b35/b26vf36/r36Pz25v314vfs1ufYw9XGr8Cxmp6TfXVuW1pXRlBRQ1NWS1tiWmVsZJWYjbKyqNXOxujd2fPj4/rq6//x9P/3+f/++/79+fn69Pj67/z88P//8///8f/76v/m0fGqlLxvW6lWRK5SQ7VQRLtMQb9KQcJHP8ZFP8lFQMpFQMpFPslEPchDPMlCPNFDP9BFQMxFQcJDPbM9OaY7NZw7NZU8Now8M4c9NIU8NYE9NH88M348MH89MX89MX46L346L346L305Lnw5MHs4L3s4L3s4L3s7Mns7Mnk6M3g5Mnc4MXY3MHY3MHM3L243MGo4L2o4L2o4L2o4L2g4Lmg4Lmg4Lmc3LWY3LWY3LWY3LWQ4LWQ4LWQ4LWY3LWc2L2g3MGk4MWk4MWg3MGk4MWo7M2w9NWc4MGs8NGI2LWE1LG9DOnhMQ3RJQG5NREM5MDU2LjQ1Lzg5MTg7MjQ3LjE0KzI1LDU4LTU4LTU3LDQ2KzQ2KzQ2KzQ2KTM3KS83KC45KTA4Ky45KS45Ky45KTA4KTA4KTE5KjA4KTA4Ky83KjA4KzE5LDM7LjQ8LTlCMTpDMDtCMDpBMTo8LjY4KjI0Ji8zJDI5J0lVP2N1W22EZ2aEYld5VEluRT9kOEhnO0xpO05rPU5rPUxpO0xpO01qPE9sPlVyRFl2SFt4Sl16TF57TVx5S1FuQEdfOzZCNCs0LyMpJWdkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2ljU2pjU2pjU2piVWxiVmxiVm1jV21kVW1kVW1kVWxlVW1mVm5nV29nWm5oXG9oXm1qZWtvcm10eoOKkKWus8PM0dXf4ebu8fT8/vT9+vf9+fn+9/r/9Pz/8vz/8fz/7v3+8Pv47/768f/57//67f/56f/y3+/gy93Ot8Gym6KXgXx1YmJfTlhaTF1jV213bnyGfaasor7AtdrVz+7k4vzu7v/09P/09/709f/5+fv6+Pv9+Pz/+vj/9fT88ff98f//8f/56P/04//Mu71/cJtRRKlTRrVTSLJDOsBKQMRIQMdHPslGPshFPcdEPMZDO8ZDO81HPsxHPsdHPrxDO60+NZ86Mpc6M5E+Noo9NYY9NIM9NYE9NIA8M387MIE7MYE7MX46L346L346MX05MHw5MHs4L3s4L3s4L3o6MXo6MXg5Mnc4MXY3MHU2L3U2L3E2Lm04MGs5MGo4L2o4L2k5L2k5L2k5L2g4Lmc3LWY3LWc3LWY3LWY3LWY3LWY3LWY3LWY1Lmo4MW07NGs6M2o5Mmo6MG0+NG9DOGxANW9EO2Q8MmM9MnpWSoZkWnlXTWJMQT46MTM4MTQ5Mjc8NTQ6MC81KzI1LDk8MzM2KzI1KjI0KTAzKDEzKDI1KjQ2KzQ3LC42KSw3KS83Ki04Ki83Ki83Ki83Ki83KjE5LDA4KzA4LS83LC83LC83LDA4LTA4Kzc/MDlCMTxFND1ENDtBMzg8LjI2Jy00JDI7KkpWQmNyW2h8YV12WE9tS0ZmQUFhOkhkO0toPE5rP05rP0toPEpnOUxpPU5rPVRxRVd0SFp3S1t4TF16Tlp2TU5qQUNbOzI+NCowMCEnJ2hlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpkVmpkVmpkWGxkWWxjWm1lWm1lWG1mVmdgTmplUm5rWG9sXWhlXGZlYXNxcoGChoqPk5aeoauztsPIy9jd4Oru7/b3+fn7+vz+/f7+/P//+v3+9vr98vn88fr98vv+8/n68vr68vn57fz66/785/n33unlytXUtrq5m5iYfHF0WV9kTWJrWHJ9bISQgpGbkLS5ssvMx+Pi3vLu6/fz8vv39v35+Pz49//+/P7+/P7+/P3/+v3/+v3/+v3/+v3/+vr89///+v/79v/q5dinoKNgWJtEPbVORb9NQ8JGPMREOcpFPM5JQM5LQctIQMdHPMZHOMNIOL1KOLNIOKZFNZpCNJFCNYtDNYZCNYRCNoJANII+M4I8MoQ6MYY5MYY5MX85MX46MXw5MXs4MHo3L3o3L3c3LnY2LXc3Lnc3Lnc4L3c4L3Y3LnU2LXE1K24zK2w3L2k4MWk4MWg3MGg3MGc2L2c2L2c2L2Y1Lmc2L2k3MGk4MWg3MGc2L2U0LWUzLGgzLWo1L204MGs5MGo6MGk7Lmk9MGtBM2dCMmpJOmRIOnZfT35rXIp4aox/b1JKPTc5LjQ6MDQ6MDM5LzM5LzM5LzI4LjI4LjE3LTE3LTM2LTA2LDI1LC81KzE0Ky81Ky80LS41LS80LS41LS80LS80LS80LS80LTA1Li80LS80LS4zLC4zLC80LS80LS82LjE7MjM9MjZANThCNzlENjdCNDVAMDM+LTQ/LkRRPVdlTltrUVBiSEVYPEBUOEJXNkljPktlPktmPUtmPUplPEplOkxnPk9qP1VwR1l0S1x2T113UF13UldxTkhiPztPNiYxKyYrLiQpLGhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpjWWtkWmxjXG1kW21lWm1mVmlkUWpoU21qV2prW2dnX2xsbH5/hJCTmqivtbjCxNHW2eLn6vLz9fv8/v/+///+//79+//++v//+v7/+fv89Pj78vb88vf98/f68fj67/j67ff66fn75fL12t/iw8zQr7S4l5GWdmtxVVlhSV9rVXSBb4yYip2nnL/BvNPT0efn5fPz8ff39fv7+fz8+vv7+f7+/P7+/P7+/P7+/P7+/P7+/P7+/Pv//vX///X///7////7+v/t6vC/usJ+dZ9LQa9NQLlLPsJMQMVLPsNFObw9NL4/NsNFOcRGN8NKN71MOrNKN6ZGNplDMpFDNo1FN4VDN4JCOIFBN4E+NYI8NIM6M4Y5MYQ5M345Mn06Mno6MXo6MXk5MHg4L3Y3LnY3LnU2LXY3LnQ4LnQ4LnQ4LnI2LG81Km00K2w3L2k4MWo4MWg3MGk3MGg3MGc2L2c2L2UzLGUzLGc1Lmg2L2o4MWo4MWo4MWs5Mms2MGw3MWs5MGs7MWs7L2o+MWpAMGlEMmdINmtQPWdSQXVmU4F1ZYyFc4aDcktMPDY5LjM5LzM5LzM5LzI4LjI4LjI4LjE3LTE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky80Li80Li80Li80Li80Li80Li80Li80LjA1Ly80Li4zLS4zLS4zLS4zLS80Li82Ly44MC86MjE9MzRANjZCNjZCNjZCNDVCMTZDMUNQPlBdSVJgSUlXQEFPNkJQN0VVOkpiQEpkP0tlQEtlPkljPEhjOklkO0plPFNuRVhyS1x2UV13VFt0VFRtT0NcPjZJNSYxLScsMCQpLWhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpjWWtkWmxjXG1kW21lWm1mVm1oVWtpVG1qV2prW2trY3d3d5GSl6essr/GzNLc3uzx9Pf8//7///7////+///+//79+//++v//+v3++Pr78/X47/H36/H36/T37PX56/b46vX45fX34e7u1Nvbv8nKq7CxkpOWeXV5YGtwWnR7aYiQgZ+nnK61rc3Pyt7e3O/v7fj49vv7+f7+/P7+/P39+/7+/P7+/P7+/P7+/P7+/P7+/P7+/P3//vv///v////////7+f/69P/37f3RxtiekJRMPaVSQqlMO6dAMbdHO89ZTc9VSrxANMREN8ZIOsNLPblJO6pCN50/M5dAN5NFO4lAOYRBOYFBOH8/Nn4+NX09NH88NH09NHo7NHg8NHc7M3c7M3U6MnQ5MXQ5MXQ5MXI5MHI5MHI5MHI5MG85L244Lmw2LGs1K2w3L2o4MWw3MWo4MWs2MGk3MGk3MGg2L2c1Lmc1LmY1Lmc2L2g3MGk4MWs6M2s6M2w7NGo7M2k6MGg8MWs/MmpDNGlEMmZFMmZJN2xWQWpZR3VqVoZ/bZGOe4B/bUVGNjU4LTI4LjI4LjI4LjE3LTE3LTE3LTA2LDE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky80Li80Li80Li80Li80Li80Li80Li80Li80Li80Li4zLS0yLC0yLC4zLS80Li41Lis1LSs2Li05Ly87MTI+MjRANDZCNDdEMzhFMz9MOkVSPkNROjtJMjhGLT5MM0RUOUpfQEpiQExkQktjP0lhPUdgOUZfOEdgOVJrRFhwTF11U152VlpxVFBnSz1UOC5BLiYxLScsMCUqLmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpjWWtkWmxjXG1kW21lWm1mVm5pVmxqVWxrV2xtXXBxaYCCgZ6hprm+xMTL0dvl5/X6/fv///z9//z9//78/fz7+f/+/P//+//++fv89PX27u7x5unv4+ft3+3x4vD05fH04/H03/Lx3Orq0NjYvMfHq7KxlaGhiZGTfZCTgJyekaqtora7tMDFv9zc2unp5/b29Pv7+f39+////f///f39+/7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/vv7/f/+///+//fy7/zz7P/88//77f/05OzDsbmBcJVQQKJPP7hYSrdNP7VFOcBHPMFBNshFO8VJP71HPa9AOaE8NJo9NpZBPI0/O4dAPIFAOn1AO3o/OXlAOXg/OHg/OHY9NHY9NHY9NHU8M3M9M3I8MnI8MnE7MW87MG87MG87MG46L2s5Lmo4LWo4LWk3Lm04Mm43Mm02MWw3MWw3MWs2MGk3MGk3MGw6M2o5Mmg3MGY3L2Y3L2Y3L2g5MWY6MWo/NmY+NGU9MWY+MmhDM2lFNWZHM2NHMmNKNmhWQGlcSXNrVoWCb4+OenBxXzk9LDQ3LDI4LjE3LTE3LTE3LTA2LDA2LDA2LDE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky4zLS4zLS4zLS4zLS4zLS4zLS4zLS4zLS4zLS4zLS0yLC0yLC0yLC0yLC4zLS00LSo0LCk0LCo2LCs3LS46LjE9MTRAMjVBMzZDMjpHNTxJNzhFMTI/KzJAKThGLz5ONERYPEVdPUtgQUpiQEtgP0dfO0heOkZeOlNpRVhwTmB1Vl51WFpuU0xjSTlNNCk6KCUuKyUqLiQpLWhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpjWWtkWmxjXG1kW21lWm1mVmxnVGtpVG5tWW9wYHR1bYWHhqSnrL/Eys7V2+bw8vv///v///v8/v3+///+//79+////f//+/79+Pf48O/w6Ofq3+Dm2t7l1efr2urv2+3w2+zw2e7u1ujo0NrYv8zKscK9p7e1oLGunba0p8G+tcnIw9LTztnZ1+jo5vLy8Pr6+Pz8+v39+////f///fz8+v7+/P7+/P7+/P7+/P7+/P7+/P7+/P/+/P/8///8///7+vz79/3/+f7/+P7/9P//7f/+7Pjfy8Wcip1iUJZKOqVMPLRQQLxMPr9AN8ZDO8VGP79EPbE+O6Y6N546OJk+O5E9O4o/PIRAPX1APXhBPHRCO3JDO3JDO3E/NnM+NnM+NnI9NXI9NXI9NXA+NW89NG4+NG09M2w8Mms7MWo7MWk6MGk6MGo6MG43MnA2MnA2Mm02MW02MWw3MWk3MGk3MGw7NGs6M2g5MWU5MGU5MGU5MGU6MWQ8MmZCNmNBNWNDNGRENWRHNWRJNmJJM19JMl5MNmVWP2piTXJtV4SDb4SHcltgTDM6KDI4LDI4LjE3LTE3LTE3LTA2LDA2LDA2LDE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky4zLS4zLS4zLS4zLS4zLS4zLS4zLS4zLS0yLC0yLCwxKywxKywxKywxKy0yLCwzLCw2Lis1LSo0Kyo0Kys1LC44LTA7LTI9LzI9LTVALzZBMDVBLTE9KTE9KTVBLThGLz1PNUBUOEZZPUhcQEpdP0lePUtePktgP1RnR1twUWN2WmF1WllrU0pdRzZHNCY0JSQtKiQpLCInKmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpjWWtkWmxjXG1kW21lWmxmVmpnVGtqVWxuWW9yYXN2bYGFhJ+kqLi/x9bf5O33+fv///v///v8//7////+//79+///+///+vz89PP16uvt4uPn2d3j1dzj0eTp0+fs1ent1urs1Ovr0+jmz9/axNPOuNPOuszGtsvDuNDJwdfSzuDb2Orm5fDv7fPy8Pn59/39+/39+/39+////f7+/Pz8+v7+/P7+/P7+/P7+/P7+/P7+/P7+/P/9/P/7/P/4+f/+/f7//fn//fT/+O//9ff/9vD35///7f/u282nlKRrWKJbR6pXRa1MO7lEOsBEPMBFPrxFP7RBPqo9OqI6OZo7OZU9PI0/PYU/PX1AO3dCPHJDO29EO29EO3A/OHE/NnE/NnE/NnE/NnA+NW8/NW8/NW9ANm4/NW0+NGs8Mmg8MWg8MWg8MWw8Mm84M3E2MnA2MnA2Mm02MWw3MWo4MWk4MWg3MGc4MGU5MGU6MWQ8MmU/NGZANWRCNl5CNGFHOGNMOmRNO2NNOGBLNl1LM11NNF1ROWJYP21oUnNzW4CDbnZ7ZUZPOjQ9KjM5LTI4LjI4LjI4LjE3LTE3LTE3LTA2LDE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLCwxKyswKiswKiswKiswKiwxKywzLC41Liw2Lio0Kyo0Kyo0Kys1LC03LC45Ky04KjA7KzQ/LzVALzQ/LjM/KzM+LTNALDdGLzlLM0BPOEJUOkdXPEhbP01dQk1gRFVlSlxvU2R0WmByWlhnUkdYRTRCMSQyJSQtKiQpLCInKmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpkVmpkVmpjWWtkWmxjXG1kW2xmWmxmVmxpVmxrVmttWGtuXWxyaHl/fZWdoK63vtLb4Orz+Pv///n+//n6/v7////+//r59///+/79+Pn58fHz6Onr3uPn2N/m1uDo0+Tp0uft0+js0+fp0ejo0OflzuDbx9fQvtrTw9nRxt7Uy+bd2O7k4/Pp6vrx9P/5+/r59/7+/P///f39+/39+////f///fz8+v7+/P7+/P7+/P7+/P7+/P7+/P7+/P/9/P/5+P/6+f/+/fz//ff//u7/+fH///L//fX/+vP56//97f/66PTOu6t3Yo9ROqpcSLJOPrhKPblJPrhJQLRHQK9EPqU9Opw6N5Y9OY8+Oog/OYBBOnhBOnREOnBGOnBFPHA/OHE/OHE/OHE/OHE/OHE/OHA/OHA/OHFCOnBBOW4/N2w9NWk9NGo+NWo+NW49Nm84M3I3M3A2MnA2Mm43Mmw3MWo4MWk4MWQ4L2Q5MGM7MWQ+M2RANGNBNWNBNV9DNVpFNF9OPGdWQmhXQ2NTPF5POFtPNVxSN11WPF1ZPm5sVXR2XnyBa2NtVTI+KDZCLjM7LjM5LzM5LzM5LzI4LjI4LjI4LjE3LTE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLCwxKywxKyswKiovKSovKSswKiwxKysyKy00LSs1LSo0LCo0LCs1LCs1LCw2Ky03LCw2Ky86LDI9LzZBMTdCMjdCMTVAMDQ/LjI/LTRDLjpHMz1MNUFPOERUOkpYP0xcQlRiSVxrVGNxWl5tWFViUERSQTI+MCMvJSYvLCYsLCQqKmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpkVmpkVmpjWWtkWmxjXG1kW2xmWmxmVm9sWW1sV2psV2drWmZsYnJ7eI6YmqixuMrT2OPs8fj9//f8//r7//7////+//r59f//+v399fj47vDy5enr3eXp2OPq2OXt1ubs0unt0urt0ujozujmz+jjz+HayNjQw9jOxN3SzOrf2/jt6//09v/1+f/1+//5/P78/f///f///f7+/P7+/P///f///f39+/7+/P7+/P7+/P7+/P7+/P7+/P7+/P/++v/9+//9+/38+vn9/Pj///X///P//+39+vP/+/v/+v//9P/25v/z3//jzdetlalvWahXRK5RQKxPPq9PQbFPQq1LQKRDPJk8NZU+N48/Nog/OIFBN3tCN3VENnFFOHFFOHA/OHE/OHM+OHE/OHE/OHE/OHE/OHA/OHNCO3FCOm9AOG0+Nmw9NWo+NW0+Nm8+N284M3E3M284M204Mm04Mmk4MWg5MWY6MWY7MmQ+M2RANGJCNWBDNV1BM1xAMldCMVRHNFtTPmZeR2leSGJYP1pTOVpTN1xXOlpWO1hXO2ttVXN3XnV9ZlVhSSYyHDhEMDM7LjQ6MDQ6MDM5LzM5LzM5LzI4LjI4LjE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLCwxKyswKiswKiovKSovKSswKiswKiwxKysyKykzKyo0LCs1LSs1LCw2LS03Li03LCw2Ky44LTI8MTZBMzlENjlENDdCNDZBMTA7KzI/LTVCMDlGMjxJNUBON0ZUPUpYP1JgSVtoVGFuWlxpV1FeTUJOQC87LyIsIysxLSguLCYsLGhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2tlV2tkWmxlW21kXW5lXG1nW21nV3FuW2ttV2tuWWtyYGpyZ3B5doeRk5+qsLvEydDZ3urv8/b7/vz9//7////+//79+f//+v7+9vr68Pb46/T26PD04+rx3+fv2PD22u3y1Ovu0ezs0ujm0eHcyd3VyN7UyuHUzuja2fLk5Prr7v7y9P/3+//5///8///9/v7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7/+v/++v/++v7+/P3//vv///r///r///v///7//////f/79f/78f/87P/75f/z2//q0bqCaaZiS5dPOZ9UP6haRqNSQZ1KOqBNP448MIs9MIY+Mn89L3g9L3Q/L3NCM3RENnI9NXI9N3Q9OHM+OHVAOnVAOnQ/OXE/OHNBOnFAOXFAOXFAOXA/OG4/N28+N28+N2s5Mm04Mmw6M2w7NGw7NGg8M2c8M2M9MmM/M14+MWRHOWNHOVQ9LU45KE04J0AxHldRO1BON0tJME9LMl1ZPmllSmVhRFZVN1hYPF1gQ29zWnqAZmRsVT1JMS05IzI+KjQ8LzU7MTQ6MDQ6MDQ6MDM5LzM5LzM5LzM5LzM5LzM5LzI4LjE3LTE3LTE3LTA2LDE2MDE2MDA1LzA1Ly80Li80Li80Li80LiwxKywxKywxKywxKywxKywxKyswKiswKi41Li00LS00LSwzLC00LS00LC41LS41LSsyKi00LDA3LzU9MjlBNj1FOD9HPD9KPDdCMjVALzM+LTE9KTI+KjlFL0JOOElVP09bR1ZiTl1oV1lkVExXSTxGOy85LikzKikvKyguKictK2hlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2tlV2tkWmxlW21kXW5lXG1nW2toV29uWmpsVmtuWWtyYGp0aXF8eImUlqOutL7HzNLb4Ovw9Pf8//3+//7////+/P79+f//+v7+9Pv77/f56/T35vD14ery3ejt1urv0ebry+TnyubmzOPhzN/Zyd7Uyt/UzufZ2O3f3/bn6vvv8//0+P/3+//6/v/8///+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P3//Pv/+vv/+v3//P3+//79///8///8///7///8///8///7+f/89f/+8f//7f/75f/y2f/r0eCxl6d1XJFbQ5ZaQppZQ5pWQ5lSQI5HNYtGNohFNINEM3xDMndCMHNAL28+L3VAOHM+OHU+OXVAOnQ/OW89NnA+N3NBOnE/OHA/OHA/OG4/N28+N20+Nm49Nm0+Nms8NGw9NW0+Nms/Nmo/NmdBNmVBNWJCNWRHOVtBMl5HN15JOE49K0Y3JEc4JT42IUxMNEdLMkRHLEREKk1NMVxbP2JhQ2BhQllZPWRnSnN3XnN5X1hgSTpELC87JTdDLzY+MTY8MjY8MjY8MjU7MTU7MTU7MTU7MTU7MTU7MTU7MTQ6MDQ6MDM5LzM5LzM5LzI3MTI3MTI3MTE2MDE2MDE2MDA1LzA1Ly4zLS4zLS0yLC0yLCwxKywxKyswKiswKioxKioxKikwKSkwKSkwKSoxKisyKiwzKy41LS00LC41LTA3LzQ7MzlBNj9GPkJKPztGODpFNTdCMTQ/LjM/KzZCLjxIMkBMNkxYRFNfS1lkVFdiUkxWSz1HPDE7Mis1LCsyKyowLCkvK2hlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2tlV2xjWm1kW21kXW5lXG1nW2toV21sWGltVmpvWWt0YWl1aXF9eYqYmaWyuL/K0NTd4u3y9vf8//z9//3//v/+/P79+P//9/398/r77ff66fT35O/03ufv2OXr0eLnyd7hwt3dwd7ext7byN3Xy+DVz+TZ1+7i4vPn6/ru8v/0+P/3+//5/P/6/f/9/f/+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P3//Pj//Pj//Pv//v7+/v/8///6///5///4///5///6///6+v/9+P//9v//8/3/7//65v/03P/44P/s0+O/p6yCaodZQoVRO5JbRpddSY1TP39GMnU+KXI+KXNAK3REMHZFNHE/NG48M3E8NHRCOXNBOG8/NXFBN3hIPm4+NG0+NG0+NGs/NGw9M2o+M2w9M2o+M2c/NWdBNmdBNmdDN2VDN2NDNmBDNV5ENWJLO1VCMVpJN2BTQFJHM0M7JkU9KEZBK0FFLEJILkFFKjxAJT9CJU5OMl9gQWlqS2FhRW5xVHZ6YWdtU0pPOTQ8JTQ9KD1GMzg+Mjg+NDg+NDg+NDc9Mzc9Mzc9MzY8Mjg+NDg+NDc9Mzc9Mzc9MzY8MjY8MjY8MjU6NDQ5MzQ5MzQ5MzM4MjM4MjM4MjI3MTA1LzA1Ly80Li4zLS0yLCwxKyswKiswKikuKCkuKCkuKCkuKCkuKCovKSswKiwxKzE2MC80LiwxKywxKy80LjY7ND1CPEFIQEBLPT5LOjxJNzhFMzRBLTI/KzNBKjVDLERRPUtYRFFeTVFeTUhUSDxIPDI+NC44Ly00LS00LSwzLGdkVWdkVWhlVmhlVmhlVmhlVmlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2tlV2xjWm1kW21kXW1mXG1nW2ppV2ttWGltVmpvWWpzYGh0aG18d4iYmKazub/K0NPc4+vw9vb7//z9//3//v///f/++f7+9v398fr77ff65/T34u7z3OXt1eLoztvgwNfau9bWvNnXwt3Xx97XzeXb2ezg4Pjs8Pvw9v/1+//5/v/6/f/7+//7+//9/P/+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P3//Pj//vj//vv//v7+/v/8/v/6///5///4/v/6/f/5/P/5+f/9+v//+P//+Pv/9fz+8P//7f/86f/x3//w3f/v2vHSvbSQentSPnRKNHVIM3ZJNHpNOH1QO3lMN25BLmU3J3tNQHNEOnFCOHNEOm9DOGc7MGQ4LWc9MWk/M2k/M2k/M2c/M2Y+MmY+MmY+MmU/MmJANGJCNWBDNV9DNV9DNVtENFpFNFdEM1hJNk9CL1xUP29pU2NeSE1LNElHMElLMz5EKj9ILUBGKjxCJjxBI0ZJLFhZOmRlRm1tUXh4XHR2XltfRkBDLjY7JThAKzxDMTk/Mzk/NTk/NTg+NDg+NDc9Mzc9Mzc9Mzk/NTg+NDg+NDg+NDg+NDg+NDg+NDg+NDc8Njc8Njc8NjY7NTY7NTY7NTU6NDU6NDM4MjM4MjE2MDA1Ly80Li0yLCwxKywxKyswKiswKiovKSovKSswKiwxKy0yLC0yLDA1Ly4zLSswKiswKi0yLjI3MTg9OTtCOkBLPUBNO0BNOz1KNjhFMTNALDE/KDA+JzxJNUJPO0hVQ0lWRURQQjtHOzI+NC46MCw2Li41Li00LWdkVWdkVWdkVWhlVmhlVmlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2xkV2xjWm1kW21kXW1mXG1nW2ppV2ttWGluV2lxWmdzX2RyZWp5dIWVlaOyt73IztLb4urv9fT5/fv8//3//v///f//+v//+P//8/7/8fv+6/f65fD13ubu1uLozNncv9XVudLQudTRvtrUyODZ0erg3/Tp7f7z+f/3/P/7///9///+///+/P/++v/++v7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P3//vr///r///v///7+/v/9/v/8/P/7/P/7+v/6+P/59//69//9+P//+///+/3/+v3++fn07v/+9v/99P/88//77v/35/vm1enSwM+0obaahZR1YXdWQ2pJNmxJNnJNO3VQPm1GN2lCM2dCMmpFNW5JOW5KOm9LO29LO2VBMWNCMWNCMWNCMWNCMWNCMWJDMWBDM11GNlxHNlxHNlpHNlpHNldINVRHNFJHM1BIM05IMmZkTX5+ZnJyWlZYQEpMNEdNMzxFKjxGKz9IK0FHK0FGKERHKk1OL1RVNnh3W3t6Xm5uVlVVPUNCLj9BLD5BLjo+LTs+Mzk/NTk/NTg+NDg+NDc9Mzc9Mzc9Mzg+NDg+NDg+NDg+NDg+NDg+NDg+NDg+NDk+ODk+ODk+ODg9Nzg9Nzg9Nzc8Njc8NjY7NTU6NDQ5MzM4MjI3MTA1Ly80Li80Li0yLi0yLiwxLSswLCswLCwxLS0yLi0yLiwxLSwxLSwxLSwxLS4yMTA1MTM3NjQ7NDtHOT1MOUBPPEBPOjxLNjdGLzRDLDJBKjZFLjpJNEBPPEJQPz9NPjhGNzE/Mi05LSw2LS00LCwzK2ZjVGZjVGdkVWhlVmhlVmlmV2pnWGpnWGlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2xkV2xkV2xjWm1kW21kXW1mXG1nW2ppV2ttWGluV2lxWmdzX2JwY2d4coKUlKOyt8DL0dTd5Ovw9vX6/vv8//3//v///f//+v//+P//9P//8///7/r96PL34Ofw1eLozNfavdHRtc3LtM7LutbPxd7X0ezi4/fu8//2/v/6///9///+/////f7/+v7/+f7/+v7/+v7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/v3+//3+//3+//3//v3//P7/+v7/+f//9/398/399f79+P79+f/+/P7+/v/9///+//75///8///7/Pv28//48v/99P/+8f/97f/66f/y4Pfk0+fSv9K7qbmfjp+Ec49yYnxdS31eTHRVQ2FEMlc6KFk8Kls+LFg9KmBFMmBFMmBFMl9GMmBHM2BHM2BHM11IM1xLN1xNOlxNOllMOVhNOVVNOFJMNlFMNk5MNVFROWlrU3yAZ21xWFNZP0ZMMj5HLDxGKzxGKz9IK0RKLkVKLERHKkhJKkxNLnl4XHRzV2ZkTVRSO0xJNktKNkZFMzw9LTw/NDk/NTk/NTk/NTg+NDg+NDg+NDg+NDc9Mzc9Mzg+NDg+NDg+NDg+NDk/NTk/NTo/OTo/OTo/OTo/OTk+ODk+ODk+ODg9Nzg9Nzg9Nzc8NjY7NTU6NDQ5MzM4MjM4Mi80MC4zLy0yLiwxLSswLCswLCswLCswLCswLCwxLS0xMC4yMS8zMi8zMi8zMi00LTM/MTdGMz1MN0BPOj9ONzxLNDlIMThHMDVELThHMDxLNj5NOjxKOTdFNjE/Mi05LSs1LC00LCwzK2ZjVGZjVGdkVWhlVmhlVmlmV2pnWGpnWGlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2xkV2xkV2xjWm1kW21kXW1mXG1nW2ppV2psV2htVmhyWmZzX2NxZGh5c4WXl6W3u8fS2Nrj6vD1+/j9//z9//3//v///f/++f//9f//8v//8Pz/7Pj75u/03eLr0N3jx9XVuc7Ms8nEsMrEtNDJv9rSz+ng4/bt8v/3///6///9///+/////f3/+vz/+Pz/+P3/+v7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/v/8///8//79//3//vr/+vj/+fj/9fj/8/j/8/j/9fz/+P3/+v/9/v/8///8///7//33///6///8///9///+//79+/v78/r47P//8f//7///7f/+7f/97f/25//u4P3q2/rj0f/m0OPKtKWPeHReR2VPOGJMNVxIMF5KMlxKMlxKMl1LM11LM15MNF5MNFxNNllOOFdPOldPOlZQOlVPOVNOOFBON05ONk1PN1BUO2BmTGZvVFVeQ0VPNEFLMDxGKz9JLj9JLkNML0hOMkhNL0ZJLE9QMVlYOnFtUmpmS2FcRltWQFlUQVRRPk1KOUJDMz1ANTtBNztBNztBNzpANjpANjpANjk/NTg+NDg+NDg+NDk/NTk/NTpANjpANjpANjtAOjtAOjtAOjo/OTo/OTk+ODk+ODk+ODo/OTo/OTk+ODk+ODg9Nzg9Nzc8Njc8NjQ5NTI3MzE2Mi80MC0yLiwxLSsvLisvLiwwLywwLy0xMC4yMS4yMy4yMy0xMisxLSs5Ki9ALTZIMjtNNz1PNzxONDpMMjpMMjVHLzdJMTpMNjxNOjpLOTZHNzBAMy07Liw2LS00LCwzK2NkUmNkUmRlU2VmVGdlVmhmV2lnWGlnWGhmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2tlV2tlV2xkWWxlW21kXW1mXGtnW2ppV2lrVmhtV2hyWmd0YGRxZ2p7dYmbnaq8wM3Y3uDn7fT5//r///v///3//P7/+v7+9vr67vr77fr76fj65fP24eru19/jytncwdPRuMzHscW+rMa+sczDvNbOy+bd4PTq8v73///6///+//////7+/v3/+vz/+vz/+v3//P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P/+/P/+/P/+/P/9/v/8///8///9//3//vv//Pj/+ff/9/f/9fj/9vn/9vz/+P//+//+/f/8///7///6///6///7///8///+//79//v9/Pz++/7/+vn68vr88f377/767v/57P/77P/97//97P/w2//74uzcw56OdWBQN1JCKVhIL1hILltNM1tNM1pONFpONFtPNVtPNVxQNltROFVPN1RPOVRPOVFPOFBON05ONktNNUlNNEpONUxSOFNcQVBZPEBJLDtGKEFMLj9KLERNMEVOMUpRMk1SNEpNMExMMFlZPWtqTmhkSWJeRV5aQV9aRGBbR1pVQVFPOktKOEFCNEBCNUBCNT5BNj5BNj5BNj1ANz1ANzk/NTk/NTk/NTpANjpANjpCNzpCNzpCNztAOTtAOTtAOjo/ODo/OTk+Nzk+ODk+NztAOjtAOTtAOjtAOTo/OTo/ODo/OTo/OTg/ODc9OTQ7NDM4MjE2MC80Li4zLy4zLy4yMS4yMSwyLiwyLisyKysyKiw0KSk2JSQ2Hik9ITJGKzhMMTtPNjtNNTtNNTtNNThKMjlLMztNNTxONjxOODdINTFCMC48LS03LC41LS00LF1lTl5mT19nUGBoUWRpVWZpVmdqV2lqWGZnVWhnVWhlVmhlVmpkVmtlV2tlWWxmWGxmWGtoWW1nW2tnXG1mXmpmW2llWWdlVmdoVmZrVWVuWWJvXWRxaHODgJaorLnIz9Lb4uLp7/L3+/f8//n9/Pz++fz/9vz+8ff46vn66vj35fLx3e7t2evq1uDfytfSvtfPvMvArr20pb2zqcK3sczCwdvS1+rg6Prz+/z2//77///+//79//z9//z+/fz+/f7+/v7+/v7+/v7+/v7+/v7+/v/+/P/+/P/+/P/+/P79+f79+f/8+f/9+v/++//++//+///9/v/8/f/9/v////7//f3//Pv9+P//+/z99//9+P/++v/9+P/69v/39P/5+f/6///8///9//////////3//P3//vz+/f7////////+/P/++f/+8//+7v/96v/95vr03P/64Ofgxo+IbFVOMldOMVRLLlNKK1dOMVdOMVVOMVVOMVRPMlRPMlRONFNPNFFNMlJONVFPNlBQNk1PN0tPNkhNNkdMNUpQNkZPNEFKLT1GJz5IJkRLKkZNK0VMKlBWNFBUM0tOL0hLLFRUOGJiRmNjSVpaQFtZQFxaQV1bQl1bQltZQFhWPVVTOlNROEhGMUdEMURBMEE/MEA+MT4+Mj8/NT5ANTs+NTk/NTk/NTlBNjlBNDhDNThDNThDNTpCNzlBNjlAODhANTg/NzlBNjlAODpCNzpBOTpCNzlAODpCNztCOjxEOT1EPD5FPThCOjhCOjdBODhANTY+MTQ8LzM5LzI3MS40MC81MS03Ly05LS47KTBAJjZHJzdNJztWKzpXKztVMDtUNDtSOD1QOj5PPD5QOjpMNkBSOEVXPUZZPURYPUBUOzVIMis8KSw2KywzKysyKlpnTVtoTlxoUF1pUWJqU2NrVGdsWGhrWGdoVmdoVmlmV2lmV2tlV2xmWG1lWm1nWW1nWWtoWWtnW2tnXGpmXWpmW2hmWmVmVmhpV2dsVmZvXGVyYWp3bnqKiZyrsrrI0dDZ4OHp7PL3+/j+/vn++vr/+Pv+8/n97/j56/f45vX04u3s2Onm0+Xiz9zXxNLLucq/rcG0pLmtobyvpsG2ssvBwNvQ1ubf5vvz/v33//77///+//79//z9//z9//z9//7+/v7+/v7+/v7+/v7+/v7+/v/+/P/+/P/+/P/+/P/9+v/8+f/8+f/9+v/9+f/++v/+/f/9/P/8/f/9/v/+///+///9/v37/P/+/f/++//8+v/48/jt5/Ll3fbo3/vw6v/6/f/8///9/v///f//+/3//P3//vz9//3+//3+///9///+/P/+9f//7v/+6P//5Pr23f374uTgx4uHbFJNMFNOMFFLK1FLK1VPL1VPL1RPMVRPMVNPMlNPMlFQNFFQNFFNMlBPM1BONU5RNk1PN0pQNkhNNkVNNUhRNkVOMUJLLj9JJ0JJKEZNK0pQLEtRLU5SL1BUMVZaN15iQV9iQ1lcP1RXPFVVPVZWPldVPlhWPVlXPlhWPVhXO1dWOlhUOVFLM09JM0xHNElEMURBMkJAM0E/Mz5ANTw9NTk/NTk/NTlBNjdCNDhDNTdEMzdEMzpCNzlBNjlBNjhANThANTlBNjlBNjpCNzpCNzpCNzpCNzpCNztDODxEOT1FOjxGOz1HPzxIPjxGOztGNjxENTpCMzk/Mzg9Njc+NzQ+NjM9NDA+LTNDKTlNKkJZL0dhMU9wO0xuO0xpPUZhPkJZPzxSPTtMOjpLOD1POURWPEteQk1gQkxgREhcQDpRNzFELis1KisyKikwKFpnTVtoTlxoUF5qUmJqU2RsVWdsWGlsWWlqWGlqWGtoWWtoWWxmWG1nWW5mW25oWm1nWWtoWWtnW2pmW2pmXWllWmhmWmZnV2hpV2VqVGRtWmd0Y298c3+Pjp2ss7bEzc3W3d7m6fH2+vj+/vr+/fn++Pj78vT46vP05vDx3+rp1+HgzNzZxtfUwdDLuMfArr+zo72woLywpMO2rsvAvNXLyuPY3uvk6/z0//33//77///+//79//z9//z9//3//v7+/v7+/v7+/v7+/v7+/v7+/v/+/P/+/P/+/P/+/P/9+v/9+v/8+f/8+f/8+P/8+P/9/P/8+//7/P/8/f/+///+///9/v78/f/+/f/++//9+/zz7urf2eLVzevd1Pfs5v/6/f/8///9/v///f//+/3//P3//vz9//3+//3+///+/////f/+9f/+7f/95//+4/v33v784+PfxomFalBLLlFMLlFLK1FLK1ROLlVPL1RPMVVQMlRQM1NPMlFQNFBPM1FNMk9OMlBONU1QNU1PN0pQNklON0ZONkhRNkZPMkNML0NNK0ZNLEpRL09VMVNZNVFZMldfOGpwSnl/W3F2VlleQEtPNE1QNVFROVFROVJQOVNROFRSOVVUOFlVOlpWO1hSOlZQOlJNOk5JNkhFNkRCNUNBNT9BNjw9NTk/NTpANjlBNjdCNDdCNDdEMzdEMzpCNzpCNzlBNjlBNjlBNjlBNjpCNzpCNzpCNzpCNzpCNzpCNztDODxEOT5GOzxGOz9JQT5KQD9JPj5JOT9HOD5GNz5EOD1COz5FPjlDOzZANzRCMTlJL0JWM1BnPVhyQl5/Slt9Slh1SU1oRUNaQDlPOjZHNTRFMjxOOEVXPU5hRVNmSFNnS05iRkBXPTZJMy85Li82Li00LFpnTVtoTlxoUF5qUmJsVGVtVmhtWWluWmtsWmtsWmxqW2xpWm5oWm5oWm9nXG9pW2xpWmtoWWpmWmpmW2llXGllWmhmWmZnV2ZnVWJnUWFqV2VyYW98c36OjZalrKu5wsfQ19rh5+7z9/b8/Pj8+/X69PP27e7y5Onq3OPk0tzbydPSvs7LuMnGs8O+q722pMO3p8e5rM3BtdbJwd/U0Onf3vPo7vjx+P31//74///8//79//38//z9//z+/f3//v7+/v7+/v7+/v7+/v7+/v7+/v/+/P/+/P79+//+/P/9+v/9+v/9+v/8+f/79//79//9/P/8+/76+//7/P/9/v/+///9/v78/f/8+//++//9+/307+3i3ObZ0fDi2fzx6//6/f/8///9/v///f//+/3/+v3//vz9//3+//3+///+/////f/+9f/+7f/85v/84f754//+5+TfyYqGbVBKMFJNMFNML1NNLVROLlVPL1VQMlVQMlRQM1NPMlBPM09OMlBMMU5NMU9NNExPNExONkpQNkpPOEhQOEpTOEdQM0dQM0lTMU1UM09WNFZcOFxkPWdySHSBVYiTaZCbc4WPbG51VFphQlJWO0xONk5ONk1NNU5MNU9NNlJQN1dTOllVPFpUPlhSPFRPPFFMOUtIOUdFOEVDN0BCNz0+NjpANjpANjlBNjdCNDdCNDZDMjZDMjtDODpCNzlBNjlBNjlBNjlBNjpCNztDODtDODpCNzpCNztDODtDOD1FOj5GOz1HPD1HPzxIPj5IPT5JOT9HOD5GNz5EOD1COz1EPTlDOzZANzRCMTlJL0RYNVJpP1t1RVp7Rld5RlRxRUlkQT1UOjJIMy9ALi0+KzZIMkBSOExfQ1JlR1NnS09jR0BXPTZJMzA6LzA3Ly00LFlnTVpoTlxoUF5qUmJsVGVtVmluWmpvW21uXGxtW21rXG1qW25oWm5oWm9pXW9pW2xpWmtoWWpmWmllWmllXGllWmlnW2doWGdoVmNoUmFqV2VyYW98c3uLipCfpqKwucHL1NTd5Onx9PL6/PT6+PH28O3w5+js3uLj1drbydLRv8zJtsnEscO+q7+4pryzosq+rtPFuNzQxObZ0e3i4Pbs7f/0+v/5///3///6///8//79//38//v8/vz+/f7///7+/v7+/v7+/v7+/v7+/v7+/v/+/P/+/P79+/79+//9+v/9+v/9+v/7+P/69v759f/9/P/7+v35+v76+/78/f/9/v/+///9/v/8+//9+v/8+v/48/fs5vLl3fjq4f/07v/6/f/8///9/v///f//+/3/+v3//vz9//z9//3+///+/////f/+9f/97P/74/763//85v//6efizIyIb1JMMlRPMlRNMFVOMVROLlVPL1ZRM1ZRM1VRNFNPMk9OMk5NMVBMMU5NMU5MM0tOM0xONktRN0tQOUpSOkxVOklSNUpTNk9ZN1NaOVRbOV1jP2ZuR4KSY5Kmc5+xgZuqf5KheoiUcHJ7XFxiRkxQN0tNNUxLNktJNExKNVBLNVROOFZQOldRO1ZQOlNOO1FMOUxJOklHOkdFOUNFOj0+NjpANjpANjlBNjdCNDdCNDZDMjZDMjtDODtDODpCNzlBNjlBNjpCNztDODtDODtDODtDODtDODtDODxEOT1FOj5GOz1HPD1HPzxIPj1HPD1IOD5GNz1FNj1DNz1COzpBOjdBOTU/NjRCMTlJL0JWM05lO1VvP1R1QFJ0QVBtQUVgPTlQNi1DLis8Kis8KTFDLTxONEhbP1BjRVJmSk5iRkBXPTVIMiw2KysyKicuJgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3Rlc3RpbWdwLmpwZyBiL2xpYmpwZWd0d3JwL3Rlc3RpbWdwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiYjY1OC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC90ZXN0aW1ncC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC90ZXN0b3JpZy5qcGcgYi9saWJqcGVndHdycC90ZXN0b3JpZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTZhMGMuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvdGVzdG9yaWcuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvdGVzdHByb2cuanBnIGIvbGlianBlZ3R3cnAvdGVzdHByb2cuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjBmZWUyLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3Rlc3Rwcm9nLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3RyYW5zdXBwLmMgYi9saWJqcGVndHdycC90cmFuc3VwcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWVjNTY0Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3RyYW5zdXBwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MjggKzAsMCBAQAotLyoKLSAqIHRyYW5zdXBwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgaW1hZ2UgdHJhbnNmb3JtYXRpb24gcm91dGluZXMgYW5kIG90aGVyIHV0aWxpdHkgY29kZQotICogdXNlZCBieSB0aGUganBlZ3RyYW4gc2FtcGxlIGFwcGxpY2F0aW9uLiAgVGhlc2UgYXJlIE5PVCBwYXJ0IG9mIHRoZSBjb3JlCi0gKiBKUEVHIGxpYnJhcnkuICBCdXQgd2Uga2VlcCB0aGVzZSByb3V0aW5lcyBzZXBhcmF0ZSBmcm9tIGpwZWd0cmFuLmMgdG8KLSAqIGVhc2UgdGhlIHRhc2sgb2YgbWFpbnRhaW5pbmcganBlZ3RyYW4tbGlrZSBwcm9ncmFtcyB0aGF0IGhhdmUgb3RoZXIgdXNlcgotICogaW50ZXJmYWNlcy4KLSAqLwotCi0vKiBBbHRob3VnaCB0aGlzIGZpbGUgcmVhbGx5IHNob3VsZG4ndCBoYXZlIGFjY2VzcyB0byB0aGUgbGlicmFyeSBpbnRlcm5hbHMsCi0gKiBpdCdzIGhlbHBmdWwgdG8gbGV0IGl0IGNhbGwganJvdW5kX3VwKCkgYW5kIGpjb3B5X2Jsb2NrX3JvdygpLgotICovCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0KLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJ0cmFuc3VwcC5oIgkJLyogTXkgb3duIGV4dGVybmFsIGludGVyZmFjZSAqLwotCi0KLSNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAotCi0vKgotICogTG9zc2xlc3MgaW1hZ2UgdHJhbnNmb3JtYXRpb24gcm91dGluZXMuICBUaGVzZSByb3V0aW5lcyB3b3JrIG9uIERDVAotICogY29lZmZpY2llbnQgYXJyYXlzIGFuZCB0aHVzIGRvIG5vdCByZXF1aXJlIGFueSBsb3NzeSBkZWNvbXByZXNzaW9uCi0gKiBvciByZWNvbXByZXNzaW9uIG9mIHRoZSBpbWFnZS4KLSAqIFRoYW5rcyB0byBHdWlkbyBWb2xsYmVkaW5nIGZvciB0aGUgaW5pdGlhbCBkZXNpZ24gYW5kIGNvZGUgb2YgdGhpcyBmZWF0dXJlLgotICoKLSAqIEhvcml6b250YWwgZmxpcHBpbmcgaXMgZG9uZSBpbi1wbGFjZSwgdXNpbmcgYSBzaW5nbGUgdG9wLXRvLWJvdHRvbQotICogcGFzcyB0aHJvdWdoIHRoZSB2aXJ0dWFsIHNvdXJjZSBhcnJheS4gIEl0IHdpbGwgdGh1cyBiZSBtdWNoIHRoZQotICogZmFzdGVzdCBvcHRpb24gZm9yIGltYWdlcyBsYXJnZXIgdGhhbiBtYWluIG1lbW9yeS4KLSAqCi0gKiBUaGUgb3RoZXIgcm91dGluZXMgcmVxdWlyZSBhIHNldCBvZiBkZXN0aW5hdGlvbiB2aXJ0dWFsIGFycmF5cywgc28gdGhleQotICogbmVlZCB0d2ljZSBhcyBtdWNoIG1lbW9yeSBhcyBqcGVndHJhbiBub3JtYWxseSBkb2VzLiAgVGhlIGRlc3RpbmF0aW9uCi0gKiBhcnJheXMgYXJlIGFsd2F5cyB3cml0dGVuIGluIG5vcm1hbCBzY2FuIG9yZGVyICh0b3AgdG8gYm90dG9tKSBiZWNhdXNlCi0gKiB0aGUgdmlydHVhbCBhcnJheSBtYW5hZ2VyIGV4cGVjdHMgdGhpcy4gIFRoZSBzb3VyY2UgYXJyYXlzIHdpbGwgYmUgc2Nhbm5lZAotICogaW4gdGhlIGNvcnJlc3BvbmRpbmcgb3JkZXIsIHdoaWNoIG1lYW5zIG11bHRpcGxlIHBhc3NlcyB0aHJvdWdoIHRoZSBzb3VyY2UKLSAqIGFycmF5cyBmb3IgbW9zdCBvZiB0aGUgdHJhbnNmb3Jtcy4gIFRoYXQgY291bGQgcmVzdWx0IGluIG11Y2ggdGhyYXNoaW5nCi0gKiBpZiB0aGUgaW1hZ2UgaXMgbGFyZ2VyIHRoYW4gbWFpbiBtZW1vcnkuCi0gKgotICogU29tZSBub3RlcyBhYm91dCB0aGUgb3BlcmF0aW5nIGVudmlyb25tZW50IG9mIHRoZSBpbmRpdmlkdWFsIHRyYW5zZm9ybQotICogcm91dGluZXM6Ci0gKiAxLiBCb3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHZpcnR1YWwgYXJyYXlzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0aGUKLSAqICAgIHNvdXJjZSBKUEVHIG9iamVjdCwgYW5kIHRoZXJlZm9yZSBzaG91bGQgYmUgbWFuaXB1bGF0ZWQgYnkgY2FsbGluZyB0aGUKLSAqICAgIHNvdXJjZSdzIG1lbW9yeSBtYW5hZ2VyLgotICogMi4gVGhlIGRlc3RpbmF0aW9uJ3MgY29tcG9uZW50IGNvdW50IHNob3VsZCBiZSB1c2VkLiAgSXQgbWF5IGJlIHNtYWxsZXIKLSAqICAgIHRoYW4gdGhlIHNvdXJjZSdzIHdoZW4gZm9yY2luZyB0byBncmF5c2NhbGUuCi0gKiAzLiBMaWtld2lzZSB0aGUgZGVzdGluYXRpb24ncyBzYW1wbGluZyBmYWN0b3JzIHNob3VsZCBiZSB1c2VkLiAgV2hlbgotICogICAgZm9yY2luZyB0byBncmF5c2NhbGUgdGhlIGRlc3RpbmF0aW9uJ3Mgc2FtcGxpbmcgZmFjdG9ycyB3aWxsIGJlIGFsbCAxLAotICogICAgYW5kIHdlIG1heSBhcyB3ZWxsIHRha2UgdGhhdCBhcyB0aGUgZWZmZWN0aXZlIGlNQ1Ugc2l6ZS4KLSAqIDQuIFdoZW4gInRyaW0iIGlzIGluIGVmZmVjdCwgdGhlIGRlc3RpbmF0aW9uJ3MgZGltZW5zaW9ucyB3aWxsIGJlIHRoZQotICogICAgdHJpbW1lZCB2YWx1ZXMgYnV0IHRoZSBzb3VyY2UncyB3aWxsIGJlIHVudHJpbW1lZC4KLSAqIDUuIEFsbCB0aGUgcm91dGluZXMgYXNzdW1lIHRoYXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVycyBhcmUKLSAqICAgIHBhZGRlZCBvdXQgdG8gYSBmdWxsIGlNQ1UgYm91bmRhcnkuICBUaGlzIGlzIHRydWUsIGFsdGhvdWdoIGZvciB0aGUKLSAqICAgIHNvdXJjZSBidWZmZXIgaXQgaXMgYW4gdW5kb2N1bWVudGVkIHByb3BlcnR5IG9mIGpkY29lZmN0LmMuCi0gKiBOb3RlcyAyLDMsNCBib2lsIGRvd24gdG8gdGhpczogZ2VuZXJhbGx5IHdlIHNob3VsZCB1c2UgdGhlIGRlc3RpbmF0aW9uJ3MKLSAqIGRpbWVuc2lvbnMgYW5kIGlnbm9yZSB0aGUgc291cmNlJ3MuCi0gKi8KLQotCi1MT0NBTCh2b2lkKQotZG9fZmxpcF9oIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzKQotLyogSG9yaXpvbnRhbCBmbGlwOyBkb25lIGluLXBsYWNlLCBzbyBubyBzZXBhcmF0ZSBkZXN0IGFycmF5IGlzIHJlcXVpcmVkICovCi17Ci0gIEpESU1FTlNJT04gTUNVX2NvbHMsIGNvbXBfd2lkdGgsIGJsa194LCBibGtfeTsKLSAgaW50IGNpLCBrLCBvZmZzZXRfeTsKLSAgSkJMT0NLQVJSQVkgYnVmZmVyOwotICBKQ09FRlBUUiBwdHIxLCBwdHIyOwotICBKQ09FRiB0ZW1wMSwgdGVtcDI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgLyogSG9yaXpvbnRhbCBtaXJyb3Jpbmcgb2YgRENUIGJsb2NrcyBpcyBhY2NvbXBsaXNoZWQgYnkgc3dhcHBpbmcKLSAgICogcGFpcnMgb2YgYmxvY2tzIGluLXBsYWNlLiAgV2l0aGluIGEgRENUIGJsb2NrLCB3ZSBwZXJmb3JtIGhvcml6b250YWwKLSAgICogbWlycm9yaW5nIGJ5IGNoYW5naW5nIHRoZSBzaWducyBvZiBvZGQtbnVtYmVyZWQgY29sdW1ucy4KLSAgICogUGFydGlhbCBpTUNVcyBhdCB0aGUgcmlnaHQgZWRnZSBhcmUgbGVmdCB1bnRvdWNoZWQuCi0gICAqLwotICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgICBmb3IgKGJsa195ID0gMDsgYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwotCSBibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7Ci0gICAgICBidWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBibGtfeSwKLQkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOwotICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgewotCWZvciAoYmxrX3ggPSAwOyBibGtfeCAqIDIgPCBjb21wX3dpZHRoOyBibGtfeCsrKSB7Ci0JICBwdHIxID0gYnVmZmVyW29mZnNldF95XVtibGtfeF07Ci0JICBwdHIyID0gYnVmZmVyW29mZnNldF95XVtjb21wX3dpZHRoIC0gYmxrX3ggLSAxXTsKLQkgIC8qIHRoaXMgdW5yb2xsZWQgbG9vcCBkb2Vzbid0IG5lZWQgdG8ga25vdyB3aGljaCByb3cgaXQncyBvbi4uLiAqLwotCSAgZm9yIChrID0gMDsgayA8IERDVFNJWkUyOyBrICs9IDIpIHsKLQkgICAgdGVtcDEgPSAqcHRyMTsJLyogc3dhcCBldmVuIGNvbHVtbiAqLwotCSAgICB0ZW1wMiA9ICpwdHIyOwotCSAgICAqcHRyMSsrID0gdGVtcDI7Ci0JICAgICpwdHIyKysgPSB0ZW1wMTsKLQkgICAgdGVtcDEgPSAqcHRyMTsJLyogc3dhcCBvZGQgY29sdW1uIHdpdGggc2lnbiBjaGFuZ2UgKi8KLQkgICAgdGVtcDIgPSAqcHRyMjsKLQkgICAgKnB0cjErKyA9IC10ZW1wMjsKLQkgICAgKnB0cjIrKyA9IC10ZW1wMTsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWRvX2ZsaXBfdiAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKLQkgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCi0vKiBWZXJ0aWNhbCBmbGlwICovCi17Ci0gIEpESU1FTlNJT04gTUNVX3Jvd3MsIGNvbXBfaGVpZ2h0LCBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKLSAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeTsKLSAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKLSAgSkJMT0NLUk9XIHNyY19yb3dfcHRyLCBkc3Rfcm93X3B0cjsKLSAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBXZSBvdXRwdXQgaW50byBhIHNlcGFyYXRlIGFycmF5IGJlY2F1c2Ugd2UgY2FuJ3QgdG91Y2ggZGlmZmVyZW50Ci0gICAqIHJvd3Mgb2YgdGhlIHNvdXJjZSB2aXJ0dWFsIGFycmF5IHNpbXVsdGFuZW91c2x5LiAgT3RoZXJ3aXNlLCB0aGlzCi0gICAqIGlzIGEgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCBhbmFsb2cgb2YgaG9yaXpvbnRhbCBmbGlwLgotICAgKiBXaXRoaW4gYSBEQ1QgYmxvY2ssIHZlcnRpY2FsIG1pcnJvcmluZyBpcyBkb25lIGJ5IGNoYW5naW5nIHRoZSBzaWducwotICAgKiBvZiBvZGQtbnVtYmVyZWQgcm93cy4KLSAgICogUGFydGlhbCBpTUNVcyBhdCB0aGUgYm90dG9tIGVkZ2UgYXJlIGNvcGllZCB2ZXJiYXRpbS4KLSAgICovCi0gIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKGRzdGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgY29tcF9oZWlnaHQgPSBNQ1Vfcm93cyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwotCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgewotICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKLQkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOwotICAgICAgaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7Ci0JLyogUm93IGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLwotCXNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sCi0JICAgY29tcF9oZWlnaHQgLSBkc3RfYmxrX3kgLSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLQkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOwotICAgICAgfSBlbHNlIHsKLQkvKiBCb3R0b20tZWRnZSBibG9ja3Mgd2lsbCBiZSBjb3BpZWQgdmVyYmF0aW0uICovCi0Jc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAotCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7Ci0JaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7Ci0JICAvKiBSb3cgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCi0JICBkc3Rfcm93X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldOwotCSAgc3JjX3Jvd19wdHIgPSBzcmNfYnVmZmVyW2NvbXBwdHItPnZfc2FtcF9mYWN0b3IgLSBvZmZzZXRfeSAtIDFdOwotCSAgZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0JICAgICAgIGRzdF9ibGtfeCsrKSB7Ci0JICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOwotCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkgKz0gMikgewotCSAgICAgIC8qIGNvcHkgZXZlbiByb3cgKi8KLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKLQkgICAgICAvKiBjb3B5IG9kZCByb3cgd2l0aCBzaWduIGNoYW5nZSAqLwotCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCi0JCSpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7Ci0JICAgIH0KLQkgIH0KLQl9IGVsc2UgewotCSAgLyogSnVzdCBjb3B5IHJvdyB2ZXJiYXRpbS4gKi8KLQkgIGpjb3B5X2Jsb2NrX3JvdyhzcmNfYnVmZmVyW29mZnNldF95XSwgZHN0X2J1ZmZlcltvZmZzZXRfeV0sCi0JCQkgIGNvbXBwdHItPndpZHRoX2luX2Jsb2Nrcyk7Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1kb190cmFuc3Bvc2UgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JICAgICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQotLyogVHJhbnNwb3NlIHNvdXJjZSBpbnRvIGRlc3RpbmF0aW9uICovCi17Ci0gIEpESU1FTlNJT04gZHN0X2Jsa194LCBkc3RfYmxrX3k7Ci0gIGludCBjaSwgaSwgaiwgb2Zmc2V0X3gsIG9mZnNldF95OwotICBKQkxPQ0tBUlJBWSBzcmNfYnVmZmVyLCBkc3RfYnVmZmVyOwotICBKQ09FRlBUUiBzcmNfcHRyLCBkc3RfcHRyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIC8qIFRyYW5zcG9zaW5nIHBpeGVscyB3aXRoaW4gYSBibG9jayBqdXN0IHJlcXVpcmVzIHRyYW5zcG9zaW5nIHRoZQotICAgKiBEQ1QgY29lZmZpY2llbnRzLgotICAgKiBQYXJ0aWFsIGlNQ1VzIGF0IHRoZSBlZGdlcyByZXF1aXJlIG5vIHNwZWNpYWwgdHJlYXRtZW50OyB3ZSBzaW1wbHkKLSAgICogcHJvY2VzcyBhbGwgdGhlIGF2YWlsYWJsZSBEQ1QgYmxvY2tzIGZvciBldmVyeSBjb21wb25lbnQuCi0gICAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKLSAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7Ci0JIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7Ci0gICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAotCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7Ci0gICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7Ci0JZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0JICAgICBkc3RfYmxrX3ggKz0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgewotCSAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JICAgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3gsCi0JICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOwotCSAgZm9yIChvZmZzZXRfeCA9IDA7IG9mZnNldF94IDwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3grKykgewotCSAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3ldOwotCSAgICBkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV1bZHN0X2Jsa194ICsgb2Zmc2V0X3hdOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKQotCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCi0JCWRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JICB9Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1kb19yb3RfOTAgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQotLyogOTAgZGVncmVlIHJvdGF0aW9uIGlzIGVxdWl2YWxlbnQgdG8KLSAqICAgMS4gVHJhbnNwb3NpbmcgdGhlIGltYWdlOwotICogICAyLiBIb3Jpem9udGFsIG1pcnJvcmluZy4KLSAqIFRoZXNlIHR3byBzdGVwcyBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgcHJvY2Vzc2luZyByb3V0aW5lLgotICovCi17Ci0gIEpESU1FTlNJT04gTUNVX2NvbHMsIGNvbXBfd2lkdGgsIGRzdF9ibGtfeCwgZHN0X2Jsa195OwotICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKLSAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKLSAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBCZWNhdXNlIG9mIHRoZSBob3Jpem9udGFsIG1pcnJvciBzdGVwLCB3ZSBjYW4ndCBwcm9jZXNzIHBhcnRpYWwgaU1DVXMKLSAgICogYXQgdGhlIChvdXRwdXQpIHJpZ2h0IGVkZ2UgcHJvcGVybHkuICBUaGV5IGp1c3QgZ2V0IHRyYW5zcG9zZWQgYW5kCi0gICAqIG5vdCBtaXJyb3JlZC4KLSAgICovCi0gIE1DVV9jb2xzID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGggLyAoZHN0aW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKLSAgICBjb21wX3dpZHRoID0gTUNVX2NvbHMgKiBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwotICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKLQkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKLSAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKLQlmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKLQkgICAgIGRzdF9ibGtfeCArPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSB7Ci0JICBzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkgICAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeCwKLQkgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0JICBmb3IgKG9mZnNldF94ID0gMDsgb2Zmc2V0X3ggPCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOyBvZmZzZXRfeCsrKSB7Ci0JICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XVtkc3RfYmxrX3kgKyBvZmZzZXRfeV07Ci0JICAgIGlmIChkc3RfYmxrX3ggPCBjb21wX3dpZHRoKSB7Ci0JICAgICAgLyogQmxvY2sgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCi0JICAgICAgZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldCi0JCVtjb21wX3dpZHRoIC0gZHN0X2Jsa194IC0gb2Zmc2V0X3ggLSAxXTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCi0JCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKLQkJaSsrOwotCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCSAgICAgIH0KLQkgICAgfSBlbHNlIHsKLQkgICAgICAvKiBFZGdlIGJsb2NrcyBhcmUgdHJhbnNwb3NlZCBidXQgbm90IG1pcnJvcmVkLiAqLwotCSAgICAgIGRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykKLQkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKLQkJICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCSAgICB9Ci0JICB9Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1kb19yb3RfMjcwIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKLQkgICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQotLyogMjcwIGRlZ3JlZSByb3RhdGlvbiBpcyBlcXVpdmFsZW50IHRvCi0gKiAgIDEuIEhvcml6b250YWwgbWlycm9yaW5nOwotICogICAyLiBUcmFuc3Bvc2luZyB0aGUgaW1hZ2UuCi0gKiBUaGVzZSB0d28gc3RlcHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHByb2Nlc3Npbmcgcm91dGluZS4KLSAqLwotewotICBKRElNRU5TSU9OIE1DVV9yb3dzLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7Ci0gIGludCBjaSwgaSwgaiwgb2Zmc2V0X3gsIG9mZnNldF95OwotICBKQkxPQ0tBUlJBWSBzcmNfYnVmZmVyLCBkc3RfYnVmZmVyOwotICBKQ09FRlBUUiBzcmNfcHRyLCBkc3RfcHRyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIC8qIEJlY2F1c2Ugb2YgdGhlIGhvcml6b250YWwgbWlycm9yIHN0ZXAsIHdlIGNhbid0IHByb2Nlc3MgcGFydGlhbCBpTUNVcwotICAgKiBhdCB0aGUgKG91dHB1dCkgYm90dG9tIGVkZ2UgcHJvcGVybHkuICBUaGV5IGp1c3QgZ2V0IHRyYW5zcG9zZWQgYW5kCi0gICAqIG5vdCBtaXJyb3JlZC4KLSAgICovCi0gIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKGRzdGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgY29tcF9oZWlnaHQgPSBNQ1Vfcm93cyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwotCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgewotICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKLQkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOwotICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgewotCWZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwotCSAgICAgZHN0X2Jsa194ICs9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpIHsKLQkgIHNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa194LAotCSAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsIEZBTFNFKTsKLQkgIGZvciAob2Zmc2V0X3ggPSAwOyBvZmZzZXRfeCA8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7IG9mZnNldF94KyspIHsKLQkgICAgZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKLQkgICAgaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7Ci0JICAgICAgLyogQmxvY2sgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCi0JICAgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdCi0JCVtjb21wX2hlaWdodCAtIGRzdF9ibGtfeSAtIG9mZnNldF95IC0gMV07Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKSB7Ci0JCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKLQkJICBqKys7Ci0JCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSAtc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCX0KLQkgICAgICB9Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgLyogRWRnZSBibG9ja3MgYXJlIHRyYW5zcG9zZWQgYnV0IG5vdCBtaXJyb3JlZC4gKi8KLQkgICAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3ldOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCi0JCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKLQkgICAgfQotCSAgfQotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZG9fcm90XzE4MCAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JICAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKLS8qIDE4MCBkZWdyZWUgcm90YXRpb24gaXMgZXF1aXZhbGVudCB0bwotICogICAxLiBWZXJ0aWNhbCBtaXJyb3Jpbmc7Ci0gKiAgIDIuIEhvcml6b250YWwgbWlycm9yaW5nLgotICogVGhlc2UgdHdvIHN0ZXBzIGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBwcm9jZXNzaW5nIHJvdXRpbmUuCi0gKi8KLXsKLSAgSkRJTUVOU0lPTiBNQ1VfY29scywgTUNVX3Jvd3MsIGNvbXBfd2lkdGgsIGNvbXBfaGVpZ2h0LCBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKLSAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeTsKLSAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKLSAgSkJMT0NLUk9XIHNyY19yb3dfcHRyLCBkc3Rfcm93X3B0cjsKLSAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0gIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKGRzdGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgICBjb21wX2hlaWdodCA9IE1DVV9yb3dzICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7Ci0JIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7Ci0gICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAotCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7Ci0gICAgICBpZiAoZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKLQkvKiBSb3cgaXMgd2l0aGluIHRoZSB2ZXJ0aWNhbGx5IG1pcnJvcmFibGUgYXJlYS4gKi8KLQlzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLAotCSAgIGNvbXBfaGVpZ2h0IC0gZHN0X2Jsa195IC0gKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0JICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKLSAgICAgIH0gZWxzZSB7Ci0JLyogQm90dG9tLWVkZ2Ugcm93cyBhcmUgb25seSBtaXJyb3JlZCBob3Jpem9udGFsbHkuICovCi0Jc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAotCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7Ci0JaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7Ci0JICAvKiBSb3cgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCi0JICBkc3Rfcm93X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldOwotCSAgc3JjX3Jvd19wdHIgPSBzcmNfYnVmZmVyW2NvbXBwdHItPnZfc2FtcF9mYWN0b3IgLSBvZmZzZXRfeSAtIDFdOwotCSAgLyogUHJvY2VzcyB0aGUgYmxvY2tzIHRoYXQgY2FuIGJlIG1pcnJvcmVkIGJvdGggd2F5cy4gKi8KLQkgIGZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcF93aWR0aDsgZHN0X2Jsa194KyspIHsKLQkgICAgZHN0X3B0ciA9IGRzdF9yb3dfcHRyW2RzdF9ibGtfeF07Ci0JICAgIHNyY19wdHIgPSBzcmNfcm93X3B0cltjb21wX3dpZHRoIC0gZHN0X2Jsa194IC0gMV07Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpICs9IDIpIHsKLQkgICAgICAvKiBGb3IgZXZlbiByb3csIG5lZ2F0ZSBldmVyeSBvZGQgY29sdW1uLiAqLwotCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqICs9IDIpIHsKLQkJKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7Ci0JCSpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7Ci0JICAgICAgfQotCSAgICAgIC8qIEZvciBvZGQgcm93LCBuZWdhdGUgZXZlcnkgZXZlbiBjb2x1bW4uICovCi0JICAgICAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGogKz0gMikgewotCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOwotCQkqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQkgIC8qIEFueSByZW1haW5pbmcgcmlnaHQtZWRnZSBibG9ja3MgYXJlIG9ubHkgbWlycm9yZWQgdmVydGljYWxseS4gKi8KLQkgIGZvciAoOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7IGRzdF9ibGtfeCsrKSB7Ci0JICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOwotCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkgKz0gMikgewotCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCi0JCSpkc3RfcHRyKysgPSAqc3JjX3B0cisrOwotCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCi0JCSpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7Ci0JICAgIH0KLQkgIH0KLQl9IGVsc2UgewotCSAgLyogUmVtYWluaW5nIHJvd3MgYXJlIGp1c3QgbWlycm9yZWQgaG9yaXpvbnRhbGx5LiAqLwotCSAgZHN0X3Jvd19wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XTsKLQkgIHNyY19yb3dfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeV07Ci0JICAvKiBQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBjYW4gYmUgbWlycm9yZWQuICovCi0JICBmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBfd2lkdGg7IGRzdF9ibGtfeCsrKSB7Ci0JICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOwotCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIDFdOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkgKz0gMikgewotCSAgICAgICpkc3RfcHRyKysgPSAqc3JjX3B0cisrOwotCSAgICAgICpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7Ci0JICAgIH0KLQkgIH0KLQkgIC8qIEFueSByZW1haW5pbmcgcmlnaHQtZWRnZSBibG9ja3MgYXJlIG9ubHkgY29waWVkLiAqLwotCSAgZm9yICg7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsgZHN0X2Jsa194KyspIHsKLQkgICAgZHN0X3B0ciA9IGRzdF9yb3dfcHRyW2RzdF9ibGtfeF07Ci0JICAgIHNyY19wdHIgPSBzcmNfcm93X3B0cltkc3RfYmxrX3hdOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykKLQkgICAgICAqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWRvX3RyYW5zdmVyc2UgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAotCSAgICAgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCi0vKiBUcmFuc3ZlcnNlIHRyYW5zcG9zZSBpcyBlcXVpdmFsZW50IHRvCi0gKiAgIDEuIDE4MCBkZWdyZWUgcm90YXRpb247Ci0gKiAgIDIuIFRyYW5zcG9zaXRpb247Ci0gKiBvcgotICogICAxLiBIb3Jpem9udGFsIG1pcnJvcmluZzsKLSAqICAgMi4gVHJhbnNwb3NpdGlvbjsKLSAqICAgMy4gSG9yaXpvbnRhbCBtaXJyb3JpbmcuCi0gKiBUaGVzZSBzdGVwcyBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgcHJvY2Vzc2luZyByb3V0aW5lLgotICovCi17Ci0gIEpESU1FTlNJT04gTUNVX2NvbHMsIE1DVV9yb3dzLCBjb21wX3dpZHRoLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7Ci0gIGludCBjaSwgaSwgaiwgb2Zmc2V0X3gsIG9mZnNldF95OwotICBKQkxPQ0tBUlJBWSBzcmNfYnVmZmVyLCBkc3RfYnVmZmVyOwotICBKQ09FRlBUUiBzcmNfcHRyLCBkc3RfcHRyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIE1DVV9jb2xzID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGggLyAoZHN0aW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKLSAgTUNVX3Jvd3MgPSBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgLyAoZHN0aW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKLSAgICBjb21wX3dpZHRoID0gTUNVX2NvbHMgKiBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwotICAgIGNvbXBfaGVpZ2h0ID0gTUNVX3Jvd3MgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKLQkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKLSAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKLQlmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKLQkgICAgIGRzdF9ibGtfeCArPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSB7Ci0JICBzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkgICAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeCwKLQkgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0JICBmb3IgKG9mZnNldF94ID0gMDsgb2Zmc2V0X3ggPCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOyBvZmZzZXRfeCsrKSB7Ci0JICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewotCSAgICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XQotCQlbY29tcF9oZWlnaHQgLSBkc3RfYmxrX3kgLSBvZmZzZXRfeSAtIDFdOwotCSAgICAgIGlmIChkc3RfYmxrX3ggPCBjb21wX3dpZHRoKSB7Ci0JCS8qIEJsb2NrIGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLwotCQlkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV0KLQkJICBbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIG9mZnNldF94IC0gMV07Ci0JCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKLQkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKSB7Ci0JCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCQkgICAgaisrOwotCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSAtc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCSAgfQotCQkgIGkrKzsKLQkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKSB7Ci0JCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IC1zcmNfcHRyW2kqRENUU0laRStqXTsKLQkJICAgIGorKzsKLQkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCSAgfQotCQl9Ci0JICAgICAgfSBlbHNlIHsKLQkJLyogUmlnaHQtZWRnZSBibG9ja3MgYXJlIG1pcnJvcmVkIGluIHkgb25seSAqLwotCQlkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV1bZHN0X2Jsa194ICsgb2Zmc2V0X3hdOwotCQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7Ci0JCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykgewotCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKLQkJICAgIGorKzsKLQkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCQkgIH0KLQkJfQotCSAgICAgIH0KLQkgICAgfSBlbHNlIHsKLQkgICAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3ldOwotCSAgICAgIGlmIChkc3RfYmxrX3ggPCBjb21wX3dpZHRoKSB7Ci0JCS8qIEJvdHRvbS1lZGdlIGJsb2NrcyBhcmUgbWlycm9yZWQgaW4geCBvbmx5ICovCi0JCWRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XQotCQkgIFtjb21wX3dpZHRoIC0gZHN0X2Jsa194IC0gb2Zmc2V0X3ggLSAxXTsKLQkJZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgewotCQkgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCi0JCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCQkgIGkrKzsKLQkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSAtc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCX0KLQkgICAgICB9IGVsc2UgewotCQkvKiBBdCBsb3dlciByaWdodCBjb3JuZXIsIGp1c3QgdHJhbnNwb3NlLCBubyBtaXJyb3JpbmcgKi8KLQkJZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKLQkJZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykKLQkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotLyogUmVxdWVzdCBhbnkgcmVxdWlyZWQgd29ya3NwYWNlLgotICoKLSAqIFdlIGFsbG9jYXRlIHRoZSB3b3Jrc3BhY2UgdmlydHVhbCBhcnJheXMgZnJvbSB0aGUgc291cmNlIGRlY29tcHJlc3Npb24KLSAqIG9iamVjdCwgc28gdGhhdCBhbGwgdGhlIGFycmF5cyAoYm90aCB0aGUgb3JpZ2luYWwgZGF0YSBhbmQgdGhlIHdvcmtzcGFjZSkKLSAqIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IHdoaWxlIG1ha2luZyBtZW1vcnkgbWFuYWdlbWVudCBkZWNpc2lvbnMuCi0gKiBIZW5jZSwgdGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGpwZWdfcmVhZF9oZWFkZXIgKHdoaWNoIHJlYWRzCi0gKiB0aGUgaW1hZ2UgZGltZW5zaW9ucykgYW5kIGJlZm9yZSBqcGVnX3JlYWRfY29lZmZpY2llbnRzICh3aGljaCByZWFsaXplcwotICogdGhlIHNvdXJjZSdzIHZpcnR1YWwgYXJyYXlzKS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKLQkJCSAgICAgIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pCi17Ci0gIGp2aXJ0X2JhcnJheV9wdHIgKmNvZWZfYXJyYXlzID0gTlVMTDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgaW50IGNpOwotCi0gIGlmIChpbmZvLT5mb3JjZV9ncmF5c2NhbGUgJiYKLSAgICAgIHNyY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyICYmCi0gICAgICBzcmNpbmZvLT5udW1fY29tcG9uZW50cyA9PSAzKSB7Ci0gICAgLyogV2UnbGwgb25seSBwcm9jZXNzIHRoZSBmaXJzdCBjb21wb25lbnQgKi8KLSAgICBpbmZvLT5udW1fY29tcG9uZW50cyA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgLyogUHJvY2VzcyBhbGwgdGhlIGNvbXBvbmVudHMgKi8KLSAgICBpbmZvLT5udW1fY29tcG9uZW50cyA9IHNyY2luZm8tPm51bV9jb21wb25lbnRzOwotICB9Ci0KLSAgc3dpdGNoIChpbmZvLT50cmFuc2Zvcm0pIHsKLSAgY2FzZSBKWEZPUk1fTk9ORToKLSAgY2FzZSBKWEZPUk1fRkxJUF9IOgotICAgIC8qIERvbid0IG5lZWQgYSB3b3Jrc3BhY2UgYXJyYXkgKi8KLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fRkxJUF9WOgotICBjYXNlIEpYRk9STV9ST1RfMTgwOgotICAgIC8qIE5lZWQgd29ya3NwYWNlIGFycmF5cyBoYXZpbmcgc2FtZSBkaW1lbnNpb25zIGFzIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgYXJyYXlzIHBhZGRlZCBvdXQgdG8gdGhlIG5leHQgaU1DVSBib3VuZGFyeSwKLSAgICAgKiBzbyB0aGF0IHRyYW5zZm9ybSByb3V0aW5lcyBuZWVkIG5vdCB3b3JyeSBhYm91dCBtaXNzaW5nIGVkZ2UgYmxvY2tzLgotICAgICAqLwotICAgIGNvZWZfYXJyYXlzID0gKGp2aXJ0X2JhcnJheV9wdHIgKikKLSAgICAgICgqc3JjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLAotCVNJWkVPRihqdmlydF9iYXJyYXlfcHRyKSAqIGluZm8tPm51bV9jb21wb25lbnRzKTsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgICAgY29tcHB0ciA9IHNyY2luZm8tPmNvbXBfaW5mbyArIGNpOwotICAgICAgY29lZl9hcnJheXNbY2ldID0gKCpzcmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX1RSQU5TUE9TRToKLSAgY2FzZSBKWEZPUk1fVFJBTlNWRVJTRToKLSAgY2FzZSBKWEZPUk1fUk9UXzkwOgotICBjYXNlIEpYRk9STV9ST1RfMjcwOgotICAgIC8qIE5lZWQgd29ya3NwYWNlIGFycmF5cyBoYXZpbmcgdHJhbnNwb3NlZCBkaW1lbnNpb25zLgotICAgICAqIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSBhcnJheXMgcGFkZGVkIG91dCB0byB0aGUgbmV4dCBpTUNVIGJvdW5kYXJ5LAotICAgICAqIHNvIHRoYXQgdHJhbnNmb3JtIHJvdXRpbmVzIG5lZWQgbm90IHdvcnJ5IGFib3V0IG1pc3NpbmcgZWRnZSBibG9ja3MuCi0gICAgICovCi0gICAgY29lZl9hcnJheXMgPSAoanZpcnRfYmFycmF5X3B0ciAqKQotICAgICAgKCpzcmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgSlBPT0xfSU1BR0UsCi0JU0laRU9GKGp2aXJ0X2JhcnJheV9wdHIpICogaW5mby0+bnVtX2NvbXBvbmVudHMpOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgICBjb21wcHRyID0gc3JjaW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgICBjb2VmX2FycmF5c1tjaV0gPSAoKnNyY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAotCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICBpbmZvLT53b3Jrc3BhY2VfY29lZl9hcnJheXMgPSBjb2VmX2FycmF5czsKLX0KLQotCi0vKiBUcmFuc3Bvc2UgZGVzdGluYXRpb24gaW1hZ2UgcGFyYW1ldGVycyAqLwotCi1MT0NBTCh2b2lkKQotdHJhbnNwb3NlX2NyaXRpY2FsX3BhcmFtZXRlcnMgKGpfY29tcHJlc3NfcHRyIGRzdGluZm8pCi17Ci0gIGludCB0YmxubywgaSwgaiwgY2ksIGl0ZW1wOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBKUVVBTlRfVEJMICpxdGJscHRyOwotICBKRElNRU5TSU9OIGR0ZW1wOwotICBVSU5UMTYgcXRlbXA7Ci0KLSAgLyogVHJhbnNwb3NlIGJhc2ljIGltYWdlIGRpbWVuc2lvbnMgKi8KLSAgZHRlbXAgPSBkc3RpbmZvLT5pbWFnZV93aWR0aDsKLSAgZHN0aW5mby0+aW1hZ2Vfd2lkdGggPSBkc3RpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gIGRzdGluZm8tPmltYWdlX2hlaWdodCA9IGR0ZW1wOwotCi0gIC8qIFRyYW5zcG9zZSBzYW1wbGluZyBmYWN0b3JzICovCi0gIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOwotICAgIGl0ZW1wID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yID0gaXRlbXA7Ci0gIH0KLQotICAvKiBUcmFuc3Bvc2UgcXVhbnRpemF0aW9uIHRhYmxlcyAqLwotICBmb3IgKHRibG5vID0gMDsgdGJsbm8gPCBOVU1fUVVBTlRfVEJMUzsgdGJsbm8rKykgewotICAgIHF0YmxwdHIgPSBkc3RpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub107Ci0gICAgaWYgKHF0YmxwdHIgIT0gTlVMTCkgewotICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgewotCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKLQkgIHF0ZW1wID0gcXRibHB0ci0+cXVhbnR2YWxbaSpEQ1RTSVpFK2pdOwotCSAgcXRibHB0ci0+cXVhbnR2YWxbaSpEQ1RTSVpFK2pdID0gcXRibHB0ci0+cXVhbnR2YWxbaipEQ1RTSVpFK2ldOwotCSAgcXRibHB0ci0+cXVhbnR2YWxbaipEQ1RTSVpFK2ldID0gcXRlbXA7Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLS8qIFRyaW0gb2ZmIGFueSBwYXJ0aWFsIGlNQ1VzIG9uIHRoZSBpbmRpY2F0ZWQgZGVzdGluYXRpb24gZWRnZSAqLwotCi1MT0NBTCh2b2lkKQotdHJpbV9yaWdodF9lZGdlIChqX2NvbXByZXNzX3B0ciBkc3RpbmZvKQotewotICBpbnQgY2ksIG1heF9oX3NhbXBfZmFjdG9yOwotICBKRElNRU5TSU9OIE1DVV9jb2xzOwotCi0gIC8qIFdlIGhhdmUgdG8gY29tcHV0ZSBtYXhfaF9zYW1wX2ZhY3RvciBvdXJzZWx2ZXMsCi0gICAqIGJlY2F1c2UgaXQgaGFzbid0IGJlZW4gc2V0IHlldCBpbiB0aGUgZGVzdGluYXRpb24KLSAgICogKGFuZCB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgc291cmNlJ3MgdmFsdWUpLgotICAgKi8KLSAgbWF4X2hfc2FtcF9mYWN0b3IgPSAxOwotICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgIGludCBoX3NhbXBfZmFjdG9yID0gZHN0aW5mby0+Y29tcF9pbmZvW2NpXS5oX3NhbXBfZmFjdG9yOwotICAgIG1heF9oX3NhbXBfZmFjdG9yID0gTUFYKG1heF9oX3NhbXBfZmFjdG9yLCBoX3NhbXBfZmFjdG9yKTsKLSAgfQotICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKG1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0gIGlmIChNQ1VfY29scyA+IDApCQkvKiBjYW4ndCB0cmltIHRvIDAgcGl4ZWxzICovCi0gICAgZHN0aW5mby0+aW1hZ2Vfd2lkdGggPSBNQ1VfY29scyAqIChtYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotfQotCi1MT0NBTCh2b2lkKQotdHJpbV9ib3R0b21fZWRnZSAoal9jb21wcmVzc19wdHIgZHN0aW5mbykKLXsKLSAgaW50IGNpLCBtYXhfdl9zYW1wX2ZhY3RvcjsKLSAgSkRJTUVOU0lPTiBNQ1Vfcm93czsKLQotICAvKiBXZSBoYXZlIHRvIGNvbXB1dGUgbWF4X3Zfc2FtcF9mYWN0b3Igb3Vyc2VsdmVzLAotICAgKiBiZWNhdXNlIGl0IGhhc24ndCBiZWVuIHNldCB5ZXQgaW4gdGhlIGRlc3RpbmF0aW9uCi0gICAqIChhbmQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIHNvdXJjZSdzIHZhbHVlKS4KLSAgICovCi0gIG1heF92X3NhbXBfZmFjdG9yID0gMTsKLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBpbnQgdl9zYW1wX2ZhY3RvciA9IGRzdGluZm8tPmNvbXBfaW5mb1tjaV0udl9zYW1wX2ZhY3RvcjsKLSAgICBtYXhfdl9zYW1wX2ZhY3RvciA9IE1BWChtYXhfdl9zYW1wX2ZhY3Rvciwgdl9zYW1wX2ZhY3Rvcik7Ci0gIH0KLSAgTUNVX3Jvd3MgPSBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgLyAobWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKLSAgaWYgKE1DVV9yb3dzID4gMCkJCS8qIGNhbid0IHRyaW0gdG8gMCBwaXhlbHMgKi8KLSAgICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBNQ1Vfcm93cyAqIChtYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotfQotCi0KLS8qIEFkanVzdCBvdXRwdXQgaW1hZ2UgcGFyYW1ldGVycyBhcyBuZWVkZWQuCi0gKgotICogVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycygpCi0gKiBhbmQgYmVmb3JlIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc2V0IG9mIHZpcnR1YWwgY29lZmZpY2llbnQgYXJyYXlzIHRvIGJlIHdyaXR0ZW4KLSAqIChlaXRoZXIgdGhlIG9uZXMgYWxsb2NhdGVkIGJ5IGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UsIG9yIHRoZQotICogb3JpZ2luYWwgc291cmNlIGRhdGEgYXJyYXlzKS4gIFRoZSBjYWxsZXIgd2lsbCBuZWVkIHRvIHBhc3MgdGhpcyB2YWx1ZQotICogdG8ganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KLSAqLwotCi1HTE9CQUwoanZpcnRfYmFycmF5X3B0ciAqKQotanRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycyAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLAotCQkJICAgICAgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkJCSAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKLQkJCSAgICAgIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pCi17Ci0gIC8qIElmIGZvcmNlLXRvLWdyYXlzY2FsZSBpcyByZXF1ZXN0ZWQsIGFkanVzdCBkZXN0aW5hdGlvbiBwYXJhbWV0ZXJzICovCi0gIGlmIChpbmZvLT5mb3JjZV9ncmF5c2NhbGUpIHsKLSAgICAvKiBXZSB1c2UganBlZ19zZXRfY29sb3JzcGFjZSB0byBtYWtlIHN1cmUgc3Vic2lkaWFyeSBzZXR0aW5ncyBnZXQgZml4ZWQKLSAgICAgKiBwcm9wZXJseS4gIEFtb25nIG90aGVyIHRoaW5ncywgdGhlIHRhcmdldCBoX3NhbXBfZmFjdG9yICYgdl9zYW1wX2ZhY3RvcgotICAgICAqIHdpbGwgZ2V0IHNldCB0byAxLCB3aGljaCB0eXBpY2FsbHkgd29uJ3QgbWF0Y2ggdGhlIHNvdXJjZS4KLSAgICAgKiBJbiBmYWN0IHdlIGRvIHRoaXMgZXZlbiBpZiB0aGUgc291cmNlIGlzIGFscmVhZHkgZ3JheXNjYWxlOyB0aGF0Ci0gICAgICogcHJvdmlkZXMgYW4gZWFzeSB3YXkgb2YgY29lcmNpbmcgYSBncmF5c2NhbGUgSlBFRyB3aXRoIGZ1bm55IHNhbXBsaW5nCi0gICAgICogZmFjdG9ycyB0byB0aGUgY3VzdG9tYXJ5IDEsMS4gIChTb21lIGRlY29kZXJzIGZhaWwgb24gb3RoZXIgZmFjdG9ycy4pCi0gICAgICovCi0gICAgaWYgKChkc3RpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDciAmJgotCSBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA9PSAzKSB8fAotCShkc3RpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUgJiYKLQkgZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPT0gMSkpIHsKLSAgICAgIC8qIFdlIGhhdmUgdG8gcHJlc2VydmUgdGhlIHNvdXJjZSdzIHF1YW50aXphdGlvbiB0YWJsZSBudW1iZXIuICovCi0gICAgICBpbnQgc3ZfcXVhbnRfdGJsX25vID0gZHN0aW5mby0+Y29tcF9pbmZvWzBdLnF1YW50X3RibF9ubzsKLSAgICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoZHN0aW5mbywgSkNTX0dSQVlTQ0FMRSk7Ci0gICAgICBkc3RpbmZvLT5jb21wX2luZm9bMF0ucXVhbnRfdGJsX25vID0gc3ZfcXVhbnRfdGJsX25vOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBTb3JyeSwgY2FuJ3QgZG8gaXQgKi8KLSAgICAgIEVSUkVYSVQoZHN0aW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIH0KLSAgfQotCi0gIC8qIENvcnJlY3QgdGhlIGRlc3RpbmF0aW9uJ3MgaW1hZ2UgZGltZW5zaW9ucyBldGMgaWYgbmVjZXNzYXJ5ICovCi0gIHN3aXRjaCAoaW5mby0+dHJhbnNmb3JtKSB7Ci0gIGNhc2UgSlhGT1JNX05PTkU6Ci0gICAgLyogTm90aGluZyB0byBkbyAqLwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9GTElQX0g6Ci0gICAgaWYgKGluZm8tPnRyaW0pCi0gICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX0ZMSVBfVjoKLSAgICBpZiAoaW5mby0+dHJpbSkKLSAgICAgIHRyaW1fYm90dG9tX2VkZ2UoZHN0aW5mbyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX1RSQU5TUE9TRToKLSAgICB0cmFuc3Bvc2VfY3JpdGljYWxfcGFyYW1ldGVycyhkc3RpbmZvKTsKLSAgICAvKiB0cmFuc3Bvc2UgZG9lcyBOT1QgaGF2ZSB0byB0cmltIGFueXRoaW5nICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX1RSQU5TVkVSU0U6Ci0gICAgdHJhbnNwb3NlX2NyaXRpY2FsX3BhcmFtZXRlcnMoZHN0aW5mbyk7Ci0gICAgaWYgKGluZm8tPnRyaW0pIHsKLSAgICAgIHRyaW1fcmlnaHRfZWRnZShkc3RpbmZvKTsKLSAgICAgIHRyaW1fYm90dG9tX2VkZ2UoZHN0aW5mbyk7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9ST1RfOTA6Ci0gICAgdHJhbnNwb3NlX2NyaXRpY2FsX3BhcmFtZXRlcnMoZHN0aW5mbyk7Ci0gICAgaWYgKGluZm8tPnRyaW0pCi0gICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX1JPVF8xODA6Ci0gICAgaWYgKGluZm8tPnRyaW0pIHsKLSAgICAgIHRyaW1fcmlnaHRfZWRnZShkc3RpbmZvKTsKLSAgICAgIHRyaW1fYm90dG9tX2VkZ2UoZHN0aW5mbyk7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9ST1RfMjcwOgotICAgIHRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzKGRzdGluZm8pOwotICAgIGlmIChpbmZvLT50cmltKQotICAgICAgdHJpbV9ib3R0b21fZWRnZShkc3RpbmZvKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IGRhdGEgc2V0ICovCi0gIGlmIChpbmZvLT53b3Jrc3BhY2VfY29lZl9hcnJheXMgIT0gTlVMTCkKLSAgICByZXR1cm4gaW5mby0+d29ya3NwYWNlX2NvZWZfYXJyYXlzOwotICByZXR1cm4gc3JjX2NvZWZfYXJyYXlzOwotfQotCi0KLS8qIEV4ZWN1dGUgdGhlIGFjdHVhbCB0cmFuc2Zvcm1hdGlvbiwgaWYgYW55LgotICoKLSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmFmdGVyKiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cywgYmVjYXVzZSBpdCBkZXBlbmRzCi0gKiBvbiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyB0byBoYXZlIGNvbXB1dGVkIHN1YnNpZGlhcnkgdmFsdWVzIHN1Y2ggYXMKLSAqIHRoZSBwZXItY29tcG9uZW50IHdpZHRoIGFuZCBoZWlnaHQgZmllbGRzIGluIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCi0gKgotICogTm90ZSB0aGF0IHNvbWUgdHJhbnNmb3JtYXRpb25zIHdpbGwgbW9kaWZ5IHRoZSBzb3VyY2UgZGF0YSBhcnJheXMhCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtYXRpb24gKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKLQkJCQkgICBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCQkJCSAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKLQkJCQkgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKQotewotICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMgPSBpbmZvLT53b3Jrc3BhY2VfY29lZl9hcnJheXM7Ci0KLSAgc3dpdGNoIChpbmZvLT50cmFuc2Zvcm0pIHsKLSAgY2FzZSBKWEZPUk1fTk9ORToKLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fRkxJUF9IOgotICAgIGRvX2ZsaXBfaChzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMpOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9GTElQX1Y6Ci0gICAgZG9fZmxpcF92KHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fVFJBTlNQT1NFOgotICAgIGRvX3RyYW5zcG9zZShzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX1RSQU5TVkVSU0U6Ci0gICAgZG9fdHJhbnN2ZXJzZShzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX1JPVF85MDoKLSAgICBkb19yb3RfOTAoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9ST1RfMTgwOgotICAgIGRvX3JvdF8xODAoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9ST1RfMjcwOgotICAgIGRvX3JvdF8yNzAoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLSNlbmRpZiAvKiBUUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLwotCi0KLS8qIFNldHVwIGRlY29tcHJlc3Npb24gb2JqZWN0IHRvIHNhdmUgZGVzaXJlZCBtYXJrZXJzIGluIG1lbW9yeS4KLSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGpwZWdfcmVhZF9oZWFkZXIoKSB0byBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpjb3B5X21hcmtlcnNfc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgSkNPUFlfT1BUSU9OIG9wdGlvbikKLXsKLSNpZmRlZiBTQVZFX01BUktFUlNfU1VQUE9SVEVECi0gIGludCBtOwotCi0gIC8qIFNhdmUgY29tbWVudHMgZXhjZXB0IHVuZGVyIE5PTkUgb3B0aW9uICovCi0gIGlmIChvcHRpb24gIT0gSkNPUFlPUFRfTk9ORSkgewotICAgIGpwZWdfc2F2ZV9tYXJrZXJzKHNyY2luZm8sIEpQRUdfQ09NLCAweEZGRkYpOwotICB9Ci0gIC8qIFNhdmUgYWxsIHR5cGVzIG9mIEFQUG4gbWFya2VycyBpZmYgQUxMIG9wdGlvbiAqLwotICBpZiAob3B0aW9uID09IEpDT1BZT1BUX0FMTCkgewotICAgIGZvciAobSA9IDA7IG0gPCAxNjsgbSsrKQotICAgICAganBlZ19zYXZlX21hcmtlcnMoc3JjaW5mbywgSlBFR19BUFAwICsgbSwgMHhGRkZGKTsKLSAgfQotI2VuZGlmIC8qIFNBVkVfTUFSS0VSU19TVVBQT1JURUQgKi8KLX0KLQotLyogQ29weSBtYXJrZXJzIHNhdmVkIGluIHRoZSBnaXZlbiBzb3VyY2Ugb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCi0gKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQganVzdCBhZnRlciBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgb3IKLSAqIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuCi0gKiBOb3RlIHRoYXQgdGhvc2Ugcm91dGluZXMgd2lsbCBoYXZlIHdyaXR0ZW4gdGhlIFNPSSwgYW5kIGFsc28gdGhlCi0gKiBKRklGIEFQUDAgb3IgQWRvYmUgQVBQMTQgbWFya2VycyBpZiBzZWxlY3RlZC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpjb3B5X21hcmtlcnNfZXhlY3V0ZSAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCQkgICAgICAgSkNPUFlfT1BUSU9OIG9wdGlvbikKLXsKLSAganBlZ19zYXZlZF9tYXJrZXJfcHRyIG1hcmtlcjsKLQotICAvKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBleGFtaW5lIHRoZQotICAgKiBvcHRpb24gZmxhZyBoZXJlOyB3ZSBqdXN0IGNvcHkgZXZlcnl0aGluZyB0aGF0IGdvdCBzYXZlZC4KLSAgICogQnV0IHRvIGF2b2lkIGNvbmZ1c2lvbiwgd2UgZG8gbm90IG91dHB1dCBKRklGIGFuZCBBZG9iZSBBUFAxNCBtYXJrZXJzCi0gICAqIGlmIHRoZSBlbmNvZGVyIGxpYnJhcnkgYWxyZWFkeSB3cm90ZSBvbmUuCi0gICAqLwotICBmb3IgKG1hcmtlciA9IHNyY2luZm8tPm1hcmtlcl9saXN0OyBtYXJrZXIgIT0gTlVMTDsgbWFya2VyID0gbWFya2VyLT5uZXh0KSB7Ci0gICAgaWYgKGRzdGluZm8tPndyaXRlX0pGSUZfaGVhZGVyICYmCi0JbWFya2VyLT5tYXJrZXIgPT0gSlBFR19BUFAwICYmCi0JbWFya2VyLT5kYXRhX2xlbmd0aCA+PSA1ICYmCi0JR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVswXSkgPT0gMHg0QSAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMV0pID09IDB4NDYgJiYKLQlHRVRKT0NURVQobWFya2VyLT5kYXRhWzJdKSA9PSAweDQ5ICYmCi0JR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVszXSkgPT0gMHg0NiAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbNF0pID09IDApCi0gICAgICBjb250aW51ZTsJCQkvKiByZWplY3QgZHVwbGljYXRlIEpGSUYgKi8KLSAgICBpZiAoZHN0aW5mby0+d3JpdGVfQWRvYmVfbWFya2VyICYmCi0JbWFya2VyLT5tYXJrZXIgPT0gSlBFR19BUFAwKzE0ICYmCi0JbWFya2VyLT5kYXRhX2xlbmd0aCA+PSA1ICYmCi0JR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVswXSkgPT0gMHg0MSAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMV0pID09IDB4NjQgJiYKLQlHRVRKT0NURVQobWFya2VyLT5kYXRhWzJdKSA9PSAweDZGICYmCi0JR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVszXSkgPT0gMHg2MiAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbNF0pID09IDB4NjUpCi0gICAgICBjb250aW51ZTsJCQkvKiByZWplY3QgZHVwbGljYXRlIEFkb2JlICovCi0jaWZkZWYgTkVFRF9GQVJfUE9JTlRFUlMKLSAgICAvKiBXZSBjb3VsZCB1c2UganBlZ193cml0ZV9tYXJrZXIgaWYgdGhlIGRhdGEgd2VyZW4ndCBGQVIuLi4gKi8KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGpwZWdfd3JpdGVfbV9oZWFkZXIoZHN0aW5mbywgbWFya2VyLT5tYXJrZXIsIG1hcmtlci0+ZGF0YV9sZW5ndGgpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG1hcmtlci0+ZGF0YV9sZW5ndGg7IGkrKykKLQlqcGVnX3dyaXRlX21fYnl0ZShkc3RpbmZvLCBtYXJrZXItPmRhdGFbaV0pOwotICAgIH0KLSNlbHNlCi0gICAganBlZ193cml0ZV9tYXJrZXIoZHN0aW5mbywgbWFya2VyLT5tYXJrZXIsCi0JCSAgICAgIG1hcmtlci0+ZGF0YSwgbWFya2VyLT5kYXRhX2xlbmd0aCk7Ci0jZW5kaWYKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvdHJhbnN1cHAuaCBiL2xpYmpwZWd0d3JwL3RyYW5zdXBwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMmQzMmEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvdHJhbnN1cHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogdHJhbnN1cHAuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbnMgZm9yIGltYWdlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzIGFuZAotICogb3RoZXIgdXRpbGl0eSBjb2RlIHVzZWQgYnkgdGhlIGpwZWd0cmFuIHNhbXBsZSBhcHBsaWNhdGlvbi4gIFRoZXNlIGFyZQotICogTk9UIHBhcnQgb2YgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5LiAgQnV0IHdlIGtlZXAgdGhlc2Ugcm91dGluZXMgc2VwYXJhdGUKLSAqIGZyb20ganBlZ3RyYW4uYyB0byBlYXNlIHRoZSB0YXNrIG9mIG1haW50YWluaW5nIGpwZWd0cmFuLWxpa2UgcHJvZ3JhbXMKLSAqIHRoYXQgaGF2ZSBvdGhlciB1c2VyIGludGVyZmFjZXMuCi0gKgotICogTk9URTogYWxsIHRoZSByb3V0aW5lcyBkZWNsYXJlZCBoZXJlIGhhdmUgdmVyeSBzcGVjaWZpYyByZXF1aXJlbWVudHMKLSAqIGFib3V0IHdoZW4gdGhleSBhcmUgdG8gYmUgZXhlY3V0ZWQgZHVyaW5nIHRoZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mIHRoZQotICogc291cmNlIGFuZCBkZXN0aW5hdGlvbiBmaWxlcy4gIFNlZSB0aGUgY29tbWVudHMgaW4gdHJhbnN1cHAuYywgb3Igc2VlCi0gKiBqcGVndHJhbi5jIGZvciBhbiBleGFtcGxlIG9mIGNvcnJlY3QgdXNhZ2UuCi0gKi8KLQotLyogSWYgeW91IGhhcHBlbiBub3QgdG8gd2FudCB0aGUgaW1hZ2UgdHJhbnNmb3JtIHN1cHBvcnQsIGRpc2FibGUgaXQgaGVyZSAqLwotI2lmbmRlZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAotI2RlZmluZSBUUkFOU0ZPUk1TX1NVUFBPUlRFRCAxCQkvKiAwIGRpc2FibGVzIHRyYW5zZm9ybSBjb2RlICovCi0jZW5kaWYKLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UJCWpUclJlcXVlc3QKLSNkZWZpbmUganRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycwkJalRyQWRqdXN0Ci0jZGVmaW5lIGp0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm1hdGlvbglqVHJFeGVjCi0jZGVmaW5lIGpjb3B5X21hcmtlcnNfc2V0dXAJCQlqQ01ya1NldHVwCi0jZGVmaW5lIGpjb3B5X21hcmtlcnNfZXhlY3V0ZQkJCWpDTXJrRXhlYwotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotCi0vKgotICogQ29kZXMgZm9yIHN1cHBvcnRlZCB0eXBlcyBvZiBpbWFnZSB0cmFuc2Zvcm1hdGlvbnMuCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlKWEZPUk1fTk9ORSwJCS8qIG5vIHRyYW5zZm9ybWF0aW9uICovCi0JSlhGT1JNX0ZMSVBfSCwJCS8qIGhvcml6b250YWwgZmxpcCAqLwotCUpYRk9STV9GTElQX1YsCQkvKiB2ZXJ0aWNhbCBmbGlwICovCi0JSlhGT1JNX1RSQU5TUE9TRSwJLyogdHJhbnNwb3NlIGFjcm9zcyBVTC10by1MUiBheGlzICovCi0JSlhGT1JNX1RSQU5TVkVSU0UsCS8qIHRyYW5zcG9zZSBhY3Jvc3MgVVItdG8tTEwgYXhpcyAqLwotCUpYRk9STV9ST1RfOTAsCQkvKiA5MC1kZWdyZWUgY2xvY2t3aXNlIHJvdGF0aW9uICovCi0JSlhGT1JNX1JPVF8xODAsCQkvKiAxODAtZGVncmVlIHJvdGF0aW9uICovCi0JSlhGT1JNX1JPVF8yNzAJCS8qIDI3MC1kZWdyZWUgY2xvY2t3aXNlIChvciA5MCBjY3cpICovCi19IEpYRk9STV9DT0RFOwotCi0vKgotICogQWx0aG91Z2ggcm90YXRpbmcgYW5kIGZsaXBwaW5nIGRhdGEgZXhwcmVzc2VkIGFzIERDVCBjb2VmZmljaWVudHMgaXMgbm90Ci0gKiBoYXJkLCB0aGVyZSBpcyBhbiBhc3ltbWV0cnkgaW4gdGhlIEpQRUcgZm9ybWF0IHNwZWNpZmljYXRpb24gZm9yIGltYWdlcwotICogd2hvc2UgZGltZW5zaW9ucyBhcmVuJ3QgbXVsdGlwbGVzIG9mIHRoZSBpTUNVIHNpemUuICBUaGUgcmlnaHQgYW5kIGJvdHRvbQotICogaW1hZ2UgZWRnZXMgYXJlIHBhZGRlZCBvdXQgdG8gdGhlIG5leHQgaU1DVSBib3VuZGFyeSB3aXRoIGp1bmsgZGF0YTsgYnV0Ci0gKiBubyBwYWRkaW5nIGlzIHBvc3NpYmxlIGF0IHRoZSB0b3AgYW5kIGxlZnQgZWRnZXMuICBJZiB3ZSB3ZXJlIHRvIGZsaXAKLSAqIHRoZSB3aG9sZSBpbWFnZSBpbmNsdWRpbmcgdGhlIHBhZCBkYXRhLCB0aGVuIHBhZCBnYXJiYWdlIHdvdWxkIGJlY29tZQotICogdmlzaWJsZSBhdCB0aGUgdG9wIGFuZC9vciBsZWZ0LCBhbmQgcmVhbCBwaXhlbHMgd291bGQgZGlzYXBwZWFyIGludG8gdGhlCi0gKiBwYWQgbWFyZ2lucyAtLS0gcGVyaGFwcyBwZXJtYW5lbnRseSwgc2luY2UgZW5jb2RlcnMgJiBkZWNvZGVycyBtYXkgbm90Ci0gKiBib3RoZXIgdG8gcHJlc2VydmUgRENUIGJsb2NrcyB0aGF0IGFwcGVhciB0byBiZSBjb21wbGV0ZWx5IG91dHNpZGUgdGhlCi0gKiBub21pbmFsIGltYWdlIGFyZWEuICBTbywgd2UgaGF2ZSB0byBleGNsdWRlIGFueSBwYXJ0aWFsIGlNQ1VzIGZyb20gdGhlCi0gKiBiYXNpYyB0cmFuc2Zvcm1hdGlvbi4KLSAqCi0gKiBUcmFuc3Bvc2UgaXMgdGhlIG9ubHkgdHJhbnNmb3JtYXRpb24gdGhhdCBjYW4gaGFuZGxlIHBhcnRpYWwgaU1DVXMgYXQgdGhlCi0gKiByaWdodCBhbmQgYm90dG9tIGVkZ2VzIGNvbXBsZXRlbHkgY2xlYW5seS4gIGZsaXBfaCBjYW4gZmxpcCBwYXJ0aWFsIGlNQ1VzCi0gKiBhdCB0aGUgYm90dG9tLCBidXQgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1VzIGF0IHRoZSByaWdodCBlZGdlIHVudG91Y2hlZC4KLSAqIFNpbWlsYXJseSBmbGlwX3YgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1VzIGF0IHRoZSBib3R0b20gZWRnZSB1bnRvdWNoZWQuCi0gKiBUaGUgb3RoZXIgdHJhbnNmb3JtcyBhcmUgZGVmaW5lZCBhcyBjb21iaW5hdGlvbnMgb2YgdGhlc2UgYmFzaWMgdHJhbnNmb3JtcwotICogYW5kIHByb2Nlc3MgZWRnZSBibG9ja3MgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgdGhlIGVxdWl2YWxlbmNlLgotICoKLSAqIFRoZSAidHJpbSIgb3B0aW9uIGNhdXNlcyB1bnRyYW5zZm9ybWFibGUgcGFydGlhbCBpTUNVcyB0byBiZSBkcm9wcGVkOwotICogdGhpcyBpcyBub3Qgc3RyaWN0bHkgbG9zc2xlc3MsIGJ1dCBpdCB1c3VhbGx5IGdpdmVzIHRoZSBiZXN0LWxvb2tpbmcKLSAqIHJlc3VsdCBmb3Igb2RkLXNpemUgaW1hZ2VzLiAgTm90ZSB0aGF0IHdoZW4gdGhpcyBvcHRpb24gaXMgYWN0aXZlLAotICogdGhlIGV4cGVjdGVkIG1hdGhlbWF0aWNhbCBlcXVpdmFsZW5jZXMgYmV0d2VlbiB0aGUgdHJhbnNmb3JtcyBtYXkgbm90IGhvbGQuCi0gKiAoRm9yIGV4YW1wbGUsIC1yb3QgMjcwIC10cmltIHRyaW1zIG9ubHkgdGhlIGJvdHRvbSBlZGdlLCBidXQgLXJvdCA5MCAtdHJpbQotICogZm9sbG93ZWQgYnkgLXJvdCAxODAgLXRyaW0gdHJpbXMgYm90aCBlZGdlcy4pCi0gKgotICogV2UgYWxzbyBvZmZlciBhICJmb3JjZSB0byBncmF5c2NhbGUiIG9wdGlvbiwgd2hpY2ggc2ltcGx5IGRpc2NhcmRzIHRoZQotICogY2hyb21pbmFuY2UgY2hhbm5lbHMgb2YgYSBZQ2JDciBpbWFnZS4gIFRoaXMgaXMgbG9zc2xlc3MgaW4gdGhlIHNlbnNlIHRoYXQKLSAqIHRoZSBsdW1pbmFuY2UgY2hhbm5lbCBpcyBwcmVzZXJ2ZWQgZXhhY3RseS4gIEl0J3Mgbm90IHRoZSBzYW1lIGtpbmQgb2YKLSAqIHRoaW5nIGFzIHRoZSByb3RhdGUvZmxpcCB0cmFuc2Zvcm1hdGlvbnMsIGJ1dCBpdCdzIGNvbnZlbmllbnQgdG8gaGFuZGxlIGl0Ci0gKiBhcyBwYXJ0IG9mIHRoaXMgcGFja2FnZSwgbWFpbmx5IGJlY2F1c2UgdGhlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzIGhhdmUgdG8KLSAqIGJlIGF3YXJlIG9mIHRoZSBvcHRpb24gdG8ga25vdyBob3cgbWFueSBjb21wb25lbnRzIHRvIHdvcmsgb24uCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBPcHRpb25zOiBzZXQgYnkgY2FsbGVyICovCi0gIEpYRk9STV9DT0RFIHRyYW5zZm9ybTsJLyogaW1hZ2UgdHJhbnNmb3JtIG9wZXJhdG9yICovCi0gIGJvb2xlYW4gdHJpbTsJCQkvKiBpZiBUUlVFLCB0cmltIHBhcnRpYWwgTUNVcyBhcyBuZWVkZWQgKi8KLSAgYm9vbGVhbiBmb3JjZV9ncmF5c2NhbGU7CS8qIGlmIFRSVUUsIGNvbnZlcnQgY29sb3IgaW1hZ2UgdG8gZ3JheXNjYWxlICovCi0KLSAgLyogSW50ZXJuYWwgd29ya3NwYWNlOiBjYWxsZXIgc2hvdWxkIG5vdCB0b3VjaCB0aGVzZSAqLwotICBpbnQgbnVtX2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbXBvbmVudHMgaW4gd29ya3NwYWNlICovCi0gIGp2aXJ0X2JhcnJheV9wdHIgKiB3b3Jrc3BhY2VfY29lZl9hcnJheXM7IC8qIHdvcmtzcGFjZSBmb3IgdHJhbnNmb3JtYXRpb25zICovCi19IGpwZWdfdHJhbnNmb3JtX2luZm87Ci0KLQotI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECi0KLS8qIFJlcXVlc3QgYW55IHJlcXVpcmVkIHdvcmtzcGFjZSAqLwotRVhURVJOKHZvaWQpIGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykpOwotLyogQWRqdXN0IG91dHB1dCBpbWFnZSBwYXJhbWV0ZXJzICovCi1FWFRFUk4oanZpcnRfYmFycmF5X3B0ciAqKSBqdHJhbnNmb3JtX2FkanVzdF9wYXJhbWV0ZXJzCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JICAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JICAgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKSk7Ci0vKiBFeGVjdXRlIHRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb24sIGlmIGFueSAqLwotRVhURVJOKHZvaWQpIGp0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm1hdGlvbgotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAotCSAgICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykpOwotCi0jZW5kaWYgLyogVFJBTlNGT1JNU19TVVBQT1JURUQgKi8KLQotCi0vKgotICogU3VwcG9ydCBmb3IgY29weWluZyBvcHRpb25hbCBtYXJrZXJzIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIGZpbGUuCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlKQ09QWU9QVF9OT05FLAkJLyogY29weSBubyBvcHRpb25hbCBtYXJrZXJzICovCi0JSkNPUFlPUFRfQ09NTUVOVFMsCS8qIGNvcHkgb25seSBjb21tZW50IChDT00pIG1hcmtlcnMgKi8KLQlKQ09QWU9QVF9BTEwJCS8qIGNvcHkgYWxsIG9wdGlvbmFsIG1hcmtlcnMgKi8KLX0gSkNPUFlfT1BUSU9OOwotCi0jZGVmaW5lIEpDT1BZT1BUX0RFRkFVTFQgIEpDT1BZT1BUX0NPTU1FTlRTCS8qIHJlY29tbWVuZGVkIGRlZmF1bHQgKi8KLQotLyogU2V0dXAgZGVjb21wcmVzc2lvbiBvYmplY3QgdG8gc2F2ZSBkZXNpcmVkIG1hcmtlcnMgaW4gbWVtb3J5ICovCi1FWFRFUk4odm9pZCkgamNvcHlfbWFya2Vyc19zZXR1cAotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBKQ09QWV9PUFRJT04gb3B0aW9uKSk7Ci0vKiBDb3B5IG1hcmtlcnMgc2F2ZWQgaW4gdGhlIGdpdmVuIHNvdXJjZSBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCAqLwotRVhURVJOKHZvaWQpIGpjb3B5X21hcmtlcnNfZXhlY3V0ZQotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgICAgSkNPUFlfT1BUSU9OIG9wdGlvbikpOwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvdXNhZ2UuZG9jIGIvbGlianBlZ3R3cnAvdXNhZ2UuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzQ5NzBhLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3VzYWdlLmRvYworKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi1VU0FHRSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBmaWxlIGRlc2NyaWJlcyB1c2FnZSBvZiB0aGUgSlBFRyBjb252ZXJzaW9uIHByb2dyYW1zIGNqcGVnIGFuZCBkanBlZywKLWFzIHdlbGwgYXMgdGhlIHV0aWxpdHkgcHJvZ3JhbXMganBlZ3RyYW4sIHJkanBnY29tIGFuZCB3cmpwZ2NvbS4gIChTZWUKLXRoZSBvdGhlciBkb2N1bWVudGF0aW9uIGZpbGVzIGlmIHlvdSB3aXNoIHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IHdpdGhpbgoteW91ciBvd24gcHJvZ3JhbXMuKQotCi1JZiB5b3UgYXJlIG9uIGEgVW5peCBtYWNoaW5lIHlvdSBtYXkgcHJlZmVyIHRvIHJlYWQgdGhlIFVuaXgtc3R5bGUgbWFudWFsCi1wYWdlcyBpbiBmaWxlcyBjanBlZy4xLCBkanBlZy4xLCBqcGVndHJhbi4xLCByZGpwZ2NvbS4xLCB3cmpwZ2NvbS4xLgotCi0KLUlOVFJPRFVDVElPTgotCi1UaGVzZSBwcm9ncmFtcyBpbXBsZW1lbnQgSlBFRyBpbWFnZSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4gIEpQRUcKLShwcm9ub3VuY2VkICJqYXktcGVnIikgaXMgYSBzdGFuZGFyZGl6ZWQgY29tcHJlc3Npb24gbWV0aG9kIGZvciBmdWxsLWNvbG9yCi1hbmQgZ3JheS1zY2FsZSBpbWFnZXMuICBKUEVHIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSAicmVhbC13b3JsZCIgc2NlbmVzLAotZm9yIGV4YW1wbGUgc2Nhbm5lZCBwaG90b2dyYXBocy4gIENhcnRvb25zLCBsaW5lIGRyYXdpbmdzLCBhbmQgb3RoZXIKLW5vbi1yZWFsaXN0aWMgaW1hZ2VzIGFyZSBub3QgSlBFRydzIHN0cm9uZyBzdWl0OyBvbiB0aGF0IHNvcnQgb2YgbWF0ZXJpYWwKLXlvdSBtYXkgZ2V0IHBvb3IgaW1hZ2UgcXVhbGl0eSBhbmQvb3IgbGl0dGxlIGNvbXByZXNzaW9uLgotCi1KUEVHIGlzIGxvc3N5LCBtZWFuaW5nIHRoYXQgdGhlIG91dHB1dCBpbWFnZSBpcyBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsIHRvCi10aGUgaW5wdXQgaW1hZ2UuICBIZW5jZSB5b3Ugc2hvdWxkIG5vdCB1c2UgSlBFRyBpZiB5b3UgaGF2ZSB0byBoYXZlIGlkZW50aWNhbAotb3V0cHV0IGJpdHMuICBIb3dldmVyLCBvbiB0eXBpY2FsIHJlYWwtd29ybGQgaW1hZ2VzLCB2ZXJ5IGdvb2QgY29tcHJlc3Npb24KLWxldmVscyBjYW4gYmUgb2J0YWluZWQgd2l0aCBubyB2aXNpYmxlIGNoYW5nZSwgYW5kIGFtYXppbmdseSBoaWdoIGNvbXByZXNzaW9uCi1pcyBwb3NzaWJsZSBpZiB5b3UgY2FuIHRvbGVyYXRlIGEgbG93LXF1YWxpdHkgaW1hZ2UuICBZb3UgY2FuIHRyYWRlIG9mZiBpbWFnZQotcXVhbGl0eSBhZ2FpbnN0IGZpbGUgc2l6ZSBieSBhZGp1c3RpbmcgdGhlIGNvbXByZXNzb3IncyAicXVhbGl0eSIgc2V0dGluZy4KLQotCi1HRU5FUkFMIFVTQUdFCi0KLVdlIHByb3ZpZGUgdHdvIHByb2dyYW1zLCBjanBlZyB0byBjb21wcmVzcyBhbiBpbWFnZSBmaWxlIGludG8gSlBFRyBmb3JtYXQsCi1hbmQgZGpwZWcgdG8gZGVjb21wcmVzcyBhIEpQRUcgZmlsZSBiYWNrIGludG8gYSBjb252ZW50aW9uYWwgaW1hZ2UgZm9ybWF0LgotCi1PbiBVbml4LWxpa2Ugc3lzdGVtcywgeW91IHNheToKLQljanBlZyBbc3dpdGNoZXNdIFtpbWFnZWZpbGVdID5qcGVnZmlsZQotb3IKLQlkanBlZyBbc3dpdGNoZXNdIFtqcGVnZmlsZV0gID5pbWFnZWZpbGUKLVRoZSBwcm9ncmFtcyByZWFkIHRoZSBzcGVjaWZpZWQgaW5wdXQgZmlsZSwgb3Igc3RhbmRhcmQgaW5wdXQgaWYgbm9uZSBpcwotbmFtZWQuICBUaGV5IGFsd2F5cyB3cml0ZSB0byBzdGFuZGFyZCBvdXRwdXQgKHdpdGggdHJhY2UvZXJyb3IgbWVzc2FnZXMgdG8KLXN0YW5kYXJkIGVycm9yKS4gIFRoZXNlIGNvbnZlbnRpb25zIGFyZSBoYW5keSBmb3IgcGlwaW5nIGltYWdlcyBiZXR3ZWVuCi1wcm9ncmFtcy4KLQotT24gbW9zdCBub24tVW5peCBzeXN0ZW1zLCB5b3Ugc2F5OgotCWNqcGVnIFtzd2l0Y2hlc10gaW1hZ2VmaWxlIGpwZWdmaWxlCi1vcgotCWRqcGVnIFtzd2l0Y2hlc10ganBlZ2ZpbGUgIGltYWdlZmlsZQotaS5lLiwgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBhcmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIFRoaXMKLXN0eWxlIGlzIGEgbGl0dGxlIG1vcmUgZm9vbHByb29mLCBhbmQgaXQgbG9zZXMgbm8gZnVuY3Rpb25hbGl0eSBpZiB5b3UgZG9uJ3QKLWhhdmUgcGlwZXMuICAoWW91IGNhbiBnZXQgdGhpcyBzdHlsZSBvbiBVbml4IHRvbywgaWYgeW91IHByZWZlciwgYnkgZGVmaW5pbmcKLVRXT19GSUxFX0NPTU1BTkRMSU5FIHdoZW4geW91IGNvbXBpbGUgdGhlIHByb2dyYW1zOyBzZWUgaW5zdGFsbC5kb2MuKQotCi1Zb3UgY2FuIGFsc28gc2F5OgotCWNqcGVnIFtzd2l0Y2hlc10gLW91dGZpbGUganBlZ2ZpbGUgIGltYWdlZmlsZQotb3IKLQlkanBlZyBbc3dpdGNoZXNdIC1vdXRmaWxlIGltYWdlZmlsZSAganBlZ2ZpbGUKLVRoaXMgc3ludGF4IHdvcmtzIG9uIGFsbCBzeXN0ZW1zLCBzbyBpdCBpcyB1c2VmdWwgZm9yIHNjcmlwdHMuCi0KLVRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGltYWdlIGZpbGUgZm9ybWF0cyBhcmU6IFBQTSAoUEJNUExVUyBjb2xvciBmb3JtYXQpLAotUEdNIChQQk1QTFVTIGdyYXktc2NhbGUgZm9ybWF0KSwgQk1QLCBUYXJnYSwgYW5kIFJMRSAoVXRhaCBSYXN0ZXIgVG9vbGtpdAotZm9ybWF0KS4gIChSTEUgaXMgc3VwcG9ydGVkIG9ubHkgaWYgdGhlIFVSVCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4pCi1janBlZyByZWNvZ25pemVzIHRoZSBpbnB1dCBpbWFnZSBmb3JtYXQgYXV0b21hdGljYWxseSwgd2l0aCB0aGUgZXhjZXB0aW9uCi1vZiBzb21lIFRhcmdhLWZvcm1hdCBmaWxlcy4gIFlvdSBoYXZlIHRvIHRlbGwgZGpwZWcgd2hpY2ggZm9ybWF0IHRvIGdlbmVyYXRlLgotCi1KUEVHIGZpbGVzIGFyZSBpbiB0aGUgZGVmYWN0byBzdGFuZGFyZCBKRklGIGZpbGUgZm9ybWF0LiAgVGhlcmUgYXJlIG90aGVyLAotbGVzcyB3aWRlbHkgdXNlZCBKUEVHLWJhc2VkIGZpbGUgZm9ybWF0cywgYnV0IHdlIGRvbid0IHN1cHBvcnQgdGhlbS4KLQotQWxsIHN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQ7IGZvciBleGFtcGxlLCAtZ3JheXNjYWxlIG1heSBiZSB3cml0dGVuCi0tZ3JheSBvciAtZ3IuICBNb3N0IG9mIHRoZSAiYmFzaWMiIHN3aXRjaGVzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBhcyBsaXR0bGUgYXMKLW9uZSBsZXR0ZXIuICBVcHBlciBhbmQgbG93ZXIgY2FzZSBhcmUgZXF1aXZhbGVudCAoLUJNUCBpcyB0aGUgc2FtZSBhcyAtYm1wKS4KLUJyaXRpc2ggc3BlbGxpbmdzIGFyZSBhbHNvIGFjY2VwdGVkIChlLmcuLCAtZ3JleXNjYWxlKSwgdGhvdWdoIGZvciBicmV2aXR5Ci10aGVzZSBhcmUgbm90IG1lbnRpb25lZCBiZWxvdy4KLQotCi1DSlBFRyBERVRBSUxTCi0KLVRoZSBiYXNpYyBjb21tYW5kIGxpbmUgc3dpdGNoZXMgZm9yIGNqcGVnIGFyZToKLQotCS1xdWFsaXR5IE4JU2NhbGUgcXVhbnRpemF0aW9uIHRhYmxlcyB0byBhZGp1c3QgaW1hZ2UgcXVhbGl0eS4KLQkJCVF1YWxpdHkgaXMgMCAod29yc3QpIHRvIDEwMCAoYmVzdCk7IGRlZmF1bHQgaXMgNzUuCi0JCQkoU2VlIGJlbG93IGZvciBtb3JlIGluZm8uKQotCi0JLWdyYXlzY2FsZQlDcmVhdGUgbW9ub2Nocm9tZSBKUEVHIGZpbGUgZnJvbSBjb2xvciBpbnB1dC4KLQkJCUJlIHN1cmUgdG8gdXNlIHRoaXMgc3dpdGNoIHdoZW4gY29tcHJlc3NpbmcgYSBncmF5c2NhbGUKLQkJCUJNUCBmaWxlLCBiZWNhdXNlIGNqcGVnIGlzbid0IGJyaWdodCBlbm91Z2ggdG8gbm90aWNlCi0JCQl3aGV0aGVyIGEgQk1QIGZpbGUgdXNlcyBvbmx5IHNoYWRlcyBvZiBncmF5LiAgQnkKLQkJCXNheWluZyAtZ3JheXNjYWxlLCB5b3UnbGwgZ2V0IGEgc21hbGxlciBKUEVHIGZpbGUgdGhhdAotCQkJdGFrZXMgbGVzcyB0aW1lIHRvIHByb2Nlc3MuCi0KLQktb3B0aW1pemUJUGVyZm9ybSBvcHRpbWl6YXRpb24gb2YgZW50cm9weSBlbmNvZGluZyBwYXJhbWV0ZXJzLgotCQkJV2l0aG91dCB0aGlzLCBkZWZhdWx0IGVuY29kaW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQuCi0JCQktb3B0aW1pemUgdXN1YWxseSBtYWtlcyB0aGUgSlBFRyBmaWxlIGEgbGl0dGxlIHNtYWxsZXIsCi0JCQlidXQgY2pwZWcgcnVucyBzb21ld2hhdCBzbG93ZXIgYW5kIG5lZWRzIG11Y2ggbW9yZQotCQkJbWVtb3J5LiAgSW1hZ2UgcXVhbGl0eSBhbmQgc3BlZWQgb2YgZGVjb21wcmVzc2lvbiBhcmUKLQkJCXVuYWZmZWN0ZWQgYnkgLW9wdGltaXplLgotCi0JLXByb2dyZXNzaXZlCUNyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgKHNlZSBiZWxvdykuCi0KLQktdGFyZ2EJCUlucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0LiAgVGFyZ2EgZmlsZXMgdGhhdCBjb250YWluCi0JCQlhbiAiaWRlbnRpZmljYXRpb24iIGZpZWxkIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkKLQkJCXJlY29nbml6ZWQgYnkgY2pwZWc7IGZvciBzdWNoIGZpbGVzIHlvdSBtdXN0IHNwZWNpZnkKLQkJCS10YXJnYSB0byBtYWtlIGNqcGVnIHRyZWF0IHRoZSBpbnB1dCBhcyBUYXJnYSBmb3JtYXQuCi0JCQlGb3IgbW9zdCBUYXJnYSBmaWxlcywgeW91IHdvbid0IG5lZWQgdGhpcyBzd2l0Y2guCi0KLVRoZSAtcXVhbGl0eSBzd2l0Y2ggbGV0cyB5b3UgdHJhZGUgb2ZmIGNvbXByZXNzZWQgZmlsZSBzaXplIGFnYWluc3QgcXVhbGl0eSBvZgotdGhlIHJlY29uc3RydWN0ZWQgaW1hZ2U6IHRoZSBoaWdoZXIgdGhlIHF1YWxpdHkgc2V0dGluZywgdGhlIGxhcmdlciB0aGUgSlBFRwotZmlsZSwgYW5kIHRoZSBjbG9zZXIgdGhlIG91dHB1dCBpbWFnZSB3aWxsIGJlIHRvIHRoZSBvcmlnaW5hbCBpbnB1dC4gIE5vcm1hbGx5Ci15b3Ugd2FudCB0byB1c2UgdGhlIGxvd2VzdCBxdWFsaXR5IHNldHRpbmcgKHNtYWxsZXN0IGZpbGUpIHRoYXQgZGVjb21wcmVzc2VzCi1pbnRvIHNvbWV0aGluZyB2aXN1YWxseSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSBvcmlnaW5hbCBpbWFnZS4gIEZvciB0aGlzCi1wdXJwb3NlIHRoZSBxdWFsaXR5IHNldHRpbmcgc2hvdWxkIGJlIGJldHdlZW4gNTAgYW5kIDk1OyB0aGUgZGVmYXVsdCBvZiA3NSBpcwotb2Z0ZW4gYWJvdXQgcmlnaHQuICBJZiB5b3Ugc2VlIGRlZmVjdHMgYXQgLXF1YWxpdHkgNzUsIHRoZW4gZ28gdXAgNSBvciAxMAotY291bnRzIGF0IGEgdGltZSB1bnRpbCB5b3UgYXJlIGhhcHB5IHdpdGggdGhlIG91dHB1dCBpbWFnZS4gIChUaGUgb3B0aW1hbAotc2V0dGluZyB3aWxsIHZhcnkgZnJvbSBvbmUgaW1hZ2UgdG8gYW5vdGhlci4pCi0KLS1xdWFsaXR5IDEwMCB3aWxsIGdlbmVyYXRlIGEgcXVhbnRpemF0aW9uIHRhYmxlIG9mIGFsbCAxJ3MsIG1pbmltaXppbmcgbG9zcwotaW4gdGhlIHF1YW50aXphdGlvbiBzdGVwIChidXQgdGhlcmUgaXMgc3RpbGwgaW5mb3JtYXRpb24gbG9zcyBpbiBzdWJzYW1wbGluZywKLWFzIHdlbGwgYXMgcm91bmRvZmYgZXJyb3IpLiAgVGhpcyBzZXR0aW5nIGlzIG1haW5seSBvZiBpbnRlcmVzdCBmb3IKLWV4cGVyaW1lbnRhbCBwdXJwb3Nlcy4gIFF1YWxpdHkgdmFsdWVzIGFib3ZlIGFib3V0IDk1IGFyZSBOT1QgcmVjb21tZW5kZWQgZm9yCi1ub3JtYWwgdXNlOyB0aGUgY29tcHJlc3NlZCBmaWxlIHNpemUgZ29lcyB1cCBkcmFtYXRpY2FsbHkgZm9yIGhhcmRseSBhbnkgZ2FpbgotaW4gb3V0cHV0IGltYWdlIHF1YWxpdHkuCi0KLUluIHRoZSBvdGhlciBkaXJlY3Rpb24sIHF1YWxpdHkgdmFsdWVzIGJlbG93IDUwIHdpbGwgcHJvZHVjZSB2ZXJ5IHNtYWxsIGZpbGVzCi1vZiBsb3cgaW1hZ2UgcXVhbGl0eS4gIFNldHRpbmdzIGFyb3VuZCA1IHRvIDEwIG1pZ2h0IGJlIHVzZWZ1bCBpbiBwcmVwYXJpbmcgYW4KLWluZGV4IG9mIGEgbGFyZ2UgaW1hZ2UgbGlicmFyeSwgZm9yIGV4YW1wbGUuICBUcnkgLXF1YWxpdHkgMiAob3Igc28pIGZvciBzb21lCi1hbXVzaW5nIEN1YmlzdCBlZmZlY3RzLiAgKE5vdGU6IHF1YWxpdHkgdmFsdWVzIGJlbG93IGFib3V0IDI1IGdlbmVyYXRlIDItYnl0ZQotcXVhbnRpemF0aW9uIHRhYmxlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgb3B0aW9uYWwgaW4gdGhlIEpQRUcgc3RhbmRhcmQuCi1janBlZyBlbWl0cyBhIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHlvdSBnaXZlIHN1Y2ggYSBxdWFsaXR5IHZhbHVlLCBiZWNhdXNlIHNvbWUKLW90aGVyIEpQRUcgcHJvZ3JhbXMgbWF5IGJlIHVuYWJsZSB0byBkZWNvZGUgdGhlIHJlc3VsdGluZyBmaWxlLiAgVXNlIC1iYXNlbGluZQotaWYgeW91IG5lZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYXQgbG93IHF1YWxpdHkgdmFsdWVzLikKLQotVGhlIC1wcm9ncmVzc2l2ZSBzd2l0Y2ggY3JlYXRlcyBhICJwcm9ncmVzc2l2ZSBKUEVHIiBmaWxlLiAgSW4gdGhpcyB0eXBlIG9mCi1KUEVHIGZpbGUsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiBtdWx0aXBsZSBzY2FucyBvZiBpbmNyZWFzaW5nIHF1YWxpdHkuICBJZiB0aGUKLWZpbGUgaXMgYmVpbmcgdHJhbnNtaXR0ZWQgb3ZlciBhIHNsb3cgY29tbXVuaWNhdGlvbnMgbGluaywgdGhlIGRlY29kZXIgY2FuIHVzZQotdGhlIGZpcnN0IHNjYW4gdG8gZGlzcGxheSBhIGxvdy1xdWFsaXR5IGltYWdlIHZlcnkgcXVpY2tseSwgYW5kIGNhbiB0aGVuCi1pbXByb3ZlIHRoZSBkaXNwbGF5IHdpdGggZWFjaCBzdWJzZXF1ZW50IHNjYW4uICBUaGUgZmluYWwgaW1hZ2UgaXMgZXhhY3RseQotZXF1aXZhbGVudCB0byBhIHN0YW5kYXJkIEpQRUcgZmlsZSBvZiB0aGUgc2FtZSBxdWFsaXR5IHNldHRpbmcsIGFuZCB0aGUgdG90YWwKLWZpbGUgc2l6ZSBpcyBhYm91dCB0aGUgc2FtZSAtLS0gb2Z0ZW4gYSBsaXR0bGUgc21hbGxlci4gIENBVVRJT046IHByb2dyZXNzaXZlCi1KUEVHIGlzIG5vdCB5ZXQgd2lkZWx5IGltcGxlbWVudGVkLCBzbyBtYW55IGRlY29kZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHZpZXcgYQotcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIGF0IGFsbC4KLQotU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOgotCi0JLWRjdCBpbnQJVXNlIGludGVnZXIgRENUIG1ldGhvZCAoZGVmYXVsdCkuCi0JLWRjdCBmYXN0CVVzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKS4KLQktZGN0IGZsb2F0CVVzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kLgotCQkJVGhlIGZsb2F0IG1ldGhvZCBpcyB2ZXJ5IHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbgotCQkJdGhlIGludCBtZXRob2QsIGJ1dCBpcyBtdWNoIHNsb3dlciB1bmxlc3MgeW91ciBtYWNoaW5lCi0JCQloYXMgdmVyeSBmYXN0IGZsb2F0aW5nLXBvaW50IGhhcmR3YXJlLiAgQWxzbyBub3RlIHRoYXQKLQkJCXJlc3VsdHMgb2YgdGhlIGZsb2F0aW5nLXBvaW50IG1ldGhvZCBtYXkgdmFyeSBzbGlnaHRseQotCQkJYWNyb3NzIG1hY2hpbmVzLCB3aGlsZSB0aGUgaW50ZWdlciBtZXRob2RzIHNob3VsZCBnaXZlCi0JCQl0aGUgc2FtZSByZXN1bHRzIGV2ZXJ5d2hlcmUuICBUaGUgZmFzdCBpbnRlZ2VyIG1ldGhvZAotCQkJaXMgbXVjaCBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIG90aGVyIHR3by4KLQotCS1yZXN0YXJ0IE4JRW1pdCBhIEpQRUcgcmVzdGFydCBtYXJrZXIgZXZlcnkgTiBNQ1Ugcm93cywgb3IgZXZlcnkKLQkJCU4gTUNVIGJsb2NrcyBpZiAiQiIgaXMgYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KLQkJCS1yZXN0YXJ0IDAgKHRoZSBkZWZhdWx0KSBtZWFucyBubyByZXN0YXJ0IG1hcmtlcnMuCi0KLQktc21vb3RoIE4JU21vb3RoIHRoZSBpbnB1dCBpbWFnZSB0byBlbGltaW5hdGUgZGl0aGVyaW5nIG5vaXNlLgotCQkJTiwgcmFuZ2luZyBmcm9tIDEgdG8gMTAwLCBpbmRpY2F0ZXMgdGhlIHN0cmVuZ3RoIG9mCi0JCQlzbW9vdGhpbmcuICAwICh0aGUgZGVmYXVsdCkgbWVhbnMgbm8gc21vb3RoaW5nLgotCi0JLW1heG1lbW9yeSBOCVNldCBsaW1pdCBmb3IgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgaW4gcHJvY2Vzc2luZwotCQkJbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMgaW4gdGhvdXNhbmRzIG9mIGJ5dGVzLCBvcgotCQkJbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCi0JCQlGb3IgZXhhbXBsZSwgLW1heCA0bSBzZWxlY3RzIDQwMDAwMDAgYnl0ZXMuICBJZiBtb3JlCi0JCQlzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCi0KLQktdmVyYm9zZQlFbmFibGUgZGVidWcgcHJpbnRvdXQuICBNb3JlIC12J3MgZ2l2ZSBtb3JlIHByaW50b3V0LgotCW9yICAtZGVidWcJQWxzbywgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBwcmludGVkIGF0IHN0YXJ0dXAuCi0KLVRoZSAtcmVzdGFydCBvcHRpb24gaW5zZXJ0cyBleHRyYSBtYXJrZXJzIHRoYXQgYWxsb3cgYSBKUEVHIGRlY29kZXIgdG8KLXJlc3luY2hyb25pemUgYWZ0ZXIgYSB0cmFuc21pc3Npb24gZXJyb3IuICBXaXRob3V0IHJlc3RhcnQgbWFya2VycywgYW55IGRhbWFnZQotdG8gYSBjb21wcmVzc2VkIGZpbGUgd2lsbCB1c3VhbGx5IHJ1aW4gdGhlIGltYWdlIGZyb20gdGhlIHBvaW50IG9mIHRoZSBlcnJvcgotdG8gdGhlIGVuZCBvZiB0aGUgaW1hZ2U7IHdpdGggcmVzdGFydCBtYXJrZXJzLCB0aGUgZGFtYWdlIGlzIHVzdWFsbHkgY29uZmluZWQKLXRvIHRoZSBwb3J0aW9uIG9mIHRoZSBpbWFnZSB1cCB0byB0aGUgbmV4dCByZXN0YXJ0IG1hcmtlci4gIE9mIGNvdXJzZSwgdGhlCi1yZXN0YXJ0IG1hcmtlcnMgb2NjdXB5IGV4dHJhIHNwYWNlLiAgV2UgcmVjb21tZW5kIC1yZXN0YXJ0IDEgZm9yIGltYWdlcyB0aGF0Ci13aWxsIGJlIHRyYW5zbWl0dGVkIGFjcm9zcyB1bnJlbGlhYmxlIG5ldHdvcmtzIHN1Y2ggYXMgVXNlbmV0LgotCi1UaGUgLXNtb290aCBvcHRpb24gZmlsdGVycyB0aGUgaW5wdXQgdG8gZWxpbWluYXRlIGZpbmUtc2NhbGUgbm9pc2UuICBUaGlzIGlzCi1vZnRlbiB1c2VmdWwgd2hlbiBjb252ZXJ0aW5nIGRpdGhlcmVkIGltYWdlcyB0byBKUEVHOiBhIG1vZGVyYXRlIHNtb290aGluZwotZmFjdG9yIG9mIDEwIHRvIDUwIGdldHMgcmlkIG9mIGRpdGhlcmluZyBwYXR0ZXJucyBpbiB0aGUgaW5wdXQgZmlsZSwgcmVzdWx0aW5nCi1pbiBhIHNtYWxsZXIgSlBFRyBmaWxlIGFuZCBhIGJldHRlci1sb29raW5nIGltYWdlLiAgVG9vIGxhcmdlIGEgc21vb3RoaW5nCi1mYWN0b3Igd2lsbCB2aXNpYmx5IGJsdXIgdGhlIGltYWdlLCBob3dldmVyLgotCi1Td2l0Y2hlcyBmb3Igd2l6YXJkczoKLQotCS1iYXNlbGluZQlGb3JjZSBiYXNlbGluZS1jb21wYXRpYmxlIHF1YW50aXphdGlvbiB0YWJsZXMgdG8gYmUKLQkJCWdlbmVyYXRlZC4gIFRoaXMgY2xhbXBzIHF1YW50aXphdGlvbiB2YWx1ZXMgdG8gOCBiaXRzCi0JCQlldmVuIGF0IGxvdyBxdWFsaXR5IHNldHRpbmdzLiAgKFRoaXMgc3dpdGNoIGlzIHBvb3JseQotCQkJbmFtZWQsIHNpbmNlIGl0IGRvZXMgbm90IGVuc3VyZSB0aGF0IHRoZSBvdXRwdXQgaXMKLQkJCWFjdHVhbGx5IGJhc2VsaW5lIEpQRUcuICBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UKLQkJCS1iYXNlbGluZSBhbmQgLXByb2dyZXNzaXZlIHRvZ2V0aGVyLikKLQotCS1xdGFibGVzIGZpbGUJVXNlIHRoZSBxdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIHRoZSBzcGVjaWZpZWQKLQkJCXRleHQgZmlsZS4KLQotCS1xc2xvdHMgTlssLi4uXSBTZWxlY3Qgd2hpY2ggcXVhbnRpemF0aW9uIHRhYmxlIHRvIHVzZSBmb3IgZWFjaCBjb2xvcgotCQkJY29tcG9uZW50LgotCi0JLXNhbXBsZSBIeFZbLC4uLl0gIFNldCBKUEVHIHNhbXBsaW5nIGZhY3RvcnMgZm9yIGVhY2ggY29sb3IgY29tcG9uZW50LgotCi0JLXNjYW5zIGZpbGUJVXNlIHRoZSBzY2FuIHNjcmlwdCBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KLQotVGhlICJ3aXphcmQiIHN3aXRjaGVzIGFyZSBpbnRlbmRlZCBmb3IgZXhwZXJpbWVudGF0aW9uIHdpdGggSlBFRy4gIElmIHlvdQotZG9uJ3Qga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcsIERPTidUIFVTRSBUSEVNLiAgVGhlc2Ugc3dpdGNoZXMgYXJlIGRvY3VtZW50ZWQKLWZ1cnRoZXIgaW4gdGhlIGZpbGUgd2l6YXJkLmRvYy4KLQotCi1ESlBFRyBERVRBSUxTCi0KLVRoZSBiYXNpYyBjb21tYW5kIGxpbmUgc3dpdGNoZXMgZm9yIGRqcGVnIGFyZToKLQotCS1jb2xvcnMgTglSZWR1Y2UgaW1hZ2UgdG8gYXQgbW9zdCBOIGNvbG9ycy4gIFRoaXMgcmVkdWNlcyB0aGUKLQlvciAtcXVhbnRpemUgTgludW1iZXIgb2YgY29sb3JzIHVzZWQgaW4gdGhlIG91dHB1dCBpbWFnZSwgc28gdGhhdCBpdAotCQkJY2FuIGJlIGRpc3BsYXllZCBvbiBhIGNvbG9ybWFwcGVkIGRpc3BsYXkgb3Igc3RvcmVkIGluCi0JCQlhIGNvbG9ybWFwcGVkIGZpbGUgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCi0JCQlhbiA4LWJpdCBkaXNwbGF5LCB5b3UnZCBuZWVkIHRvIHJlZHVjZSB0byAyNTYgb3IgZmV3ZXIKLQkJCWNvbG9ycy4gICgtY29sb3JzIGlzIHRoZSByZWNvbW1lbmRlZCBuYW1lLCAtcXVhbnRpemUKLQkJCWlzIHByb3ZpZGVkIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LikKLQotCS1mYXN0CQlTZWxlY3QgcmVjb21tZW5kZWQgcHJvY2Vzc2luZyBvcHRpb25zIGZvciBmYXN0LCBsb3cKLQkJCXF1YWxpdHkgb3V0cHV0LiAgKFRoZSBkZWZhdWx0IG9wdGlvbnMgYXJlIGNob3NlbiBmb3IKLQkJCWhpZ2hlc3QgcXVhbGl0eSBvdXRwdXQuKSAgQ3VycmVudGx5LCB0aGlzIGlzIGVxdWl2YWxlbnQKLQkJCXRvICItZGN0IGZhc3QgLW5vc21vb3RoIC1vbmVwYXNzIC1kaXRoZXIgb3JkZXJlZCIuCi0KLQktZ3JheXNjYWxlCUZvcmNlIGdyYXktc2NhbGUgb3V0cHV0IGV2ZW4gaWYgSlBFRyBmaWxlIGlzIGNvbG9yLgotCQkJVXNlZnVsIGZvciB2aWV3aW5nIG9uIG1vbm9jaHJvbWUgZGlzcGxheXM7IGFsc28sCi0JCQlkanBlZyBydW5zIG5vdGljZWFibHkgZmFzdGVyIGluIHRoaXMgbW9kZS4KLQotCS1zY2FsZSBNL04JU2NhbGUgdGhlIG91dHB1dCBpbWFnZSBieSBhIGZhY3RvciBNL04uICBDdXJyZW50bHkKLQkJCXRoZSBzY2FsZSBmYWN0b3IgbXVzdCBiZSAxLzEsIDEvMiwgMS80LCBvciAxLzguCi0JCQlTY2FsaW5nIGlzIGhhbmR5IGlmIHRoZSBpbWFnZSBpcyBsYXJnZXIgdGhhbiB5b3VyCi0JCQlzY3JlZW47IGFsc28sIGRqcGVnIHJ1bnMgbXVjaCBmYXN0ZXIgd2hlbiBzY2FsaW5nCi0JCQlkb3duIHRoZSBvdXRwdXQuCi0KLQktYm1wCQlTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKFdpbmRvd3MgZmxhdm9yKS4gIDgtYml0Ci0JCQljb2xvcm1hcHBlZCBmb3JtYXQgaXMgZW1pdHRlZCBpZiAtY29sb3JzIG9yIC1ncmF5c2NhbGUKLQkJCWlzIHNwZWNpZmllZCwgb3IgaWYgdGhlIEpQRUcgZmlsZSBpcyBncmF5LXNjYWxlOwotCQkJb3RoZXJ3aXNlLCAyNC1iaXQgZnVsbC1jb2xvciBmb3JtYXQgaXMgZW1pdHRlZC4KLQotCS1naWYJCVNlbGVjdCBHSUYgb3V0cHV0IGZvcm1hdC4gIFNpbmNlIEdJRiBkb2VzIG5vdCBzdXBwb3J0Ci0JCQltb3JlIHRoYW4gMjU2IGNvbG9ycywgLWNvbG9ycyAyNTYgaXMgYXNzdW1lZCAodW5sZXNzCi0JCQl5b3Ugc3BlY2lmeSBhIHNtYWxsZXIgbnVtYmVyIG9mIGNvbG9ycykuICBJZiB5b3UKLQkJCXNwZWNpZnkgLWZhc3QsIHRoZSBkZWZhdWx0IG51bWJlciBvZiBjb2xvcnMgaXMgMjE2LgotCi0JLW9zMgkJU2VsZWN0IEJNUCBvdXRwdXQgZm9ybWF0IChPUy8yIDEueCBmbGF2b3IpLiAgOC1iaXQKLQkJCWNvbG9ybWFwcGVkIGZvcm1hdCBpcyBlbWl0dGVkIGlmIC1jb2xvcnMgb3IgLWdyYXlzY2FsZQotCQkJaXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGU7Ci0JCQlvdGhlcndpc2UsIDI0LWJpdCBmdWxsLWNvbG9yIGZvcm1hdCBpcyBlbWl0dGVkLgotCi0JLXBubQkJU2VsZWN0IFBCTVBMVVMgKFBQTS9QR00pIG91dHB1dCBmb3JtYXQgKHRoaXMgaXMgdGhlCi0JCQlkZWZhdWx0IGZvcm1hdCkuICBQR00gaXMgZW1pdHRlZCBpZiB0aGUgSlBFRyBmaWxlIGlzCi0JCQlncmF5LXNjYWxlIG9yIGlmIC1ncmF5c2NhbGUgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UKLQkJCVBQTSBpcyBlbWl0dGVkLgotCi0JLXJsZQkJU2VsZWN0IFJMRSBvdXRwdXQgZm9ybWF0LiAgKFJlcXVpcmVzIFVSVCBsaWJyYXJ5LikKLQotCS10YXJnYQkJU2VsZWN0IFRhcmdhIG91dHB1dCBmb3JtYXQuICBHcmF5LXNjYWxlIGZvcm1hdCBpcwotCQkJZW1pdHRlZCBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGUgb3IgaWYKLQkJCS1ncmF5c2NhbGUgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UsIGNvbG9ybWFwcGVkIGZvcm1hdAotCQkJaXMgZW1pdHRlZCBpZiAtY29sb3JzIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlLCAyNC1iaXQKLQkJCWZ1bGwtY29sb3IgZm9ybWF0IGlzIGVtaXR0ZWQuCi0KLVN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczoKLQotCS1kY3QgaW50CVVzZSBpbnRlZ2VyIERDVCBtZXRob2QgKGRlZmF1bHQpLgotCS1kY3QgZmFzdAlVc2UgZmFzdCBpbnRlZ2VyIERDVCAobGVzcyBhY2N1cmF0ZSkuCi0JLWRjdCBmbG9hdAlVc2UgZmxvYXRpbmctcG9pbnQgRENUIG1ldGhvZC4KLQkJCVRoZSBmbG9hdCBtZXRob2QgaXMgdmVyeSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4KLQkJCXRoZSBpbnQgbWV0aG9kLCBidXQgaXMgbXVjaCBzbG93ZXIgdW5sZXNzIHlvdXIgbWFjaGluZQotCQkJaGFzIHZlcnkgZmFzdCBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4gIEFsc28gbm90ZSB0aGF0Ci0JCQlyZXN1bHRzIG9mIHRoZSBmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IHZhcnkgc2xpZ2h0bHkKLQkJCWFjcm9zcyBtYWNoaW5lcywgd2hpbGUgdGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZQotCQkJdGhlIHNhbWUgcmVzdWx0cyBldmVyeXdoZXJlLiAgVGhlIGZhc3QgaW50ZWdlciBtZXRob2QKLQkJCWlzIG11Y2ggbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBvdGhlciB0d28uCi0KLQktZGl0aGVyIGZzCVVzZSBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nIGluIGNvbG9yIHF1YW50aXphdGlvbi4KLQktZGl0aGVyIG9yZGVyZWQJVXNlIG9yZGVyZWQgZGl0aGVyaW5nIGluIGNvbG9yIHF1YW50aXphdGlvbi4KLQktZGl0aGVyIG5vbmUJRG8gbm90IHVzZSBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgotCQkJQnkgZGVmYXVsdCwgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyBpcyBhcHBsaWVkIHdoZW4KLQkJCXF1YW50aXppbmcgY29sb3JzOyB0aGlzIGlzIHNsb3cgYnV0IHVzdWFsbHkgcHJvZHVjZXMKLQkJCXRoZSBiZXN0IHJlc3VsdHMuICBPcmRlcmVkIGRpdGhlciBpcyBhIGNvbXByb21pc2UKLQkJCWJldHdlZW4gc3BlZWQgYW5kIHF1YWxpdHk7IG5vIGRpdGhlcmluZyBpcyBmYXN0IGJ1dAotCQkJdXN1YWxseSBsb29rcyBhd2Z1bC4gIE5vdGUgdGhhdCB0aGVzZSBzd2l0Y2hlcyBoYXZlCi0JCQlubyBlZmZlY3QgdW5sZXNzIGNvbG9yIHF1YW50aXphdGlvbiBpcyBiZWluZyBkb25lLgotCQkJT3JkZXJlZCBkaXRoZXIgaXMgb25seSBhdmFpbGFibGUgaW4gLW9uZXBhc3MgbW9kZS4KLQotCS1tYXAgRklMRQlRdWFudGl6ZSB0byB0aGUgY29sb3JzIHVzZWQgaW4gdGhlIHNwZWNpZmllZCBpbWFnZQotCQkJZmlsZS4gIFRoaXMgaXMgdXNlZnVsIGZvciBwcm9kdWNpbmcgbXVsdGlwbGUgZmlsZXMKLQkJCXdpdGggaWRlbnRpY2FsIGNvbG9yIG1hcHMsIG9yIGZvciBmb3JjaW5nIGEgcHJlZGVmaW5lZAotCQkJc2V0IG9mIGNvbG9ycyB0byBiZSB1c2VkLiAgVGhlIEZJTEUgbXVzdCBiZSBhIEdJRgotCQkJb3IgUFBNIGZpbGUuICBUaGlzIG9wdGlvbiBvdmVycmlkZXMgLWNvbG9ycyBhbmQKLQkJCS1vbmVwYXNzLgotCi0JLW5vc21vb3RoCVVzZSBhIGZhc3RlciwgbG93ZXItcXVhbGl0eSB1cHNhbXBsaW5nIHJvdXRpbmUuCi0KLQktb25lcGFzcwlVc2Ugb25lLXBhc3MgaW5zdGVhZCBvZiB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCi0JCQlUaGUgb25lLXBhc3MgbWV0aG9kIGlzIGZhc3RlciBhbmQgbmVlZHMgbGVzcyBtZW1vcnksCi0JCQlidXQgaXQgcHJvZHVjZXMgYSBsb3dlci1xdWFsaXR5IGltYWdlLiAgLW9uZXBhc3MgaXMKLQkJCWlnbm9yZWQgdW5sZXNzIHlvdSBhbHNvIHNheSAtY29sb3JzIE4uICBBbHNvLAotCQkJdGhlIG9uZS1wYXNzIG1ldGhvZCBpcyBhbHdheXMgdXNlZCBmb3IgZ3JheS1zY2FsZQotCQkJb3V0cHV0ICh0aGUgdHdvLXBhc3MgbWV0aG9kIGlzIG5vIGltcHJvdmVtZW50IHRoZW4pLgotCi0JLW1heG1lbW9yeSBOCVNldCBsaW1pdCBmb3IgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgaW4gcHJvY2Vzc2luZwotCQkJbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMgaW4gdGhvdXNhbmRzIG9mIGJ5dGVzLCBvcgotCQkJbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCi0JCQlGb3IgZXhhbXBsZSwgLW1heCA0bSBzZWxlY3RzIDQwMDAwMDAgYnl0ZXMuICBJZiBtb3JlCi0JCQlzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCi0KLQktdmVyYm9zZQlFbmFibGUgZGVidWcgcHJpbnRvdXQuICBNb3JlIC12J3MgZ2l2ZSBtb3JlIHByaW50b3V0LgotCW9yICAtZGVidWcJQWxzbywgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBwcmludGVkIGF0IHN0YXJ0dXAuCi0KLQotSElOVFMgRk9SIENKUEVHCi0KLUNvbG9yIEdJRiBmaWxlcyBhcmUgbm90IHRoZSBpZGVhbCBpbnB1dCBmb3IgSlBFRzsgSlBFRyBpcyByZWFsbHkgaW50ZW5kZWQgZm9yCi1jb21wcmVzc2luZyBmdWxsLWNvbG9yICgyNC1iaXQpIGltYWdlcy4gIEluIHBhcnRpY3VsYXIsIGRvbid0IHRyeSB0byBjb252ZXJ0Ci1jYXJ0b29ucywgbGluZSBkcmF3aW5ncywgYW5kIG90aGVyIGltYWdlcyB0aGF0IGhhdmUgb25seSBhIGZldyBkaXN0aW5jdAotY29sb3JzLiAgR0lGIHdvcmtzIGdyZWF0IG9uIHRoZXNlLCBKUEVHIGRvZXMgbm90LiAgSWYgeW91IHdhbnQgdG8gY29udmVydCBhCi1HSUYgdG8gSlBFRywgeW91IHNob3VsZCBleHBlcmltZW50IHdpdGggY2pwZWcncyAtcXVhbGl0eSBhbmQgLXNtb290aCBvcHRpb25zCi10byBnZXQgYSBzYXRpc2ZhY3RvcnkgY29udmVyc2lvbi4gIC1zbW9vdGggMTAgb3Igc28gaXMgb2Z0ZW4gaGVscGZ1bC4KLQotQXZvaWQgcnVubmluZyBhbiBpbWFnZSB0aHJvdWdoIGEgc2VyaWVzIG9mIEpQRUcgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbgotY3ljbGVzLiAgSW1hZ2UgcXVhbGl0eSBsb3NzIHdpbGwgYWNjdW11bGF0ZTsgYWZ0ZXIgdGVuIG9yIHNvIGN5Y2xlcyB0aGUgaW1hZ2UKLW1heSBiZSBub3RpY2VhYmx5IHdvcnNlIHRoYW4gaXQgd2FzIGFmdGVyIG9uZSBjeWNsZS4gIEl0J3MgYmVzdCB0byB1c2UgYQotbG9zc2xlc3MgZm9ybWF0IHdoaWxlIG1hbmlwdWxhdGluZyBhbiBpbWFnZSwgdGhlbiBjb252ZXJ0IHRvIEpQRUcgZm9ybWF0IHdoZW4KLXlvdSBhcmUgcmVhZHkgdG8gZmlsZSB0aGUgaW1hZ2UgYXdheS4KLQotVGhlIC1vcHRpbWl6ZSBvcHRpb24gdG8gY2pwZWcgaXMgd29ydGggdXNpbmcgd2hlbiB5b3UgYXJlIG1ha2luZyBhICJmaW5hbCIKLXZlcnNpb24gZm9yIHBvc3Rpbmcgb3IgYXJjaGl2aW5nLiAgSXQncyBhbHNvIGEgd2luIHdoZW4geW91IGFyZSB1c2luZyBsb3cKLXF1YWxpdHkgc2V0dGluZ3MgdG8gbWFrZSB2ZXJ5IHNtYWxsIEpQRUcgZmlsZXM7IHRoZSBwZXJjZW50YWdlIGltcHJvdmVtZW50Ci1pcyBvZnRlbiBhIGxvdCBtb3JlIHRoYW4gaXQgaXMgb24gbGFyZ2VyIGZpbGVzLiAgKEF0IHByZXNlbnQsIC1vcHRpbWl6ZQotbW9kZSBpcyBhbHdheXMgc2VsZWN0ZWQgd2hlbiBnZW5lcmF0aW5nIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMuKQotCi1HSUYgaW5wdXQgZmlsZXMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQsIHRvIGF2b2lkIHRoZSBVbmlzeXMgTFpXIHBhdGVudC4KLVVzZSBhIFVuaXN5cy1saWNlbnNlZCBwcm9ncmFtIGlmIHlvdSBuZWVkIHRvIHJlYWQgYSBHSUYgZmlsZS4gIChDb252ZXJzaW9uCi1vZiBHSUYgZmlsZXMgdG8gSlBFRyBpcyB1c3VhbGx5IGEgYmFkIGlkZWEgYW55d2F5LikKLQotCi1ISU5UUyBGT1IgREpQRUcKLQotVG8gZ2V0IGEgcXVpY2sgcHJldmlldyBvZiBhbiBpbWFnZSwgdXNlIHRoZSAtZ3JheXNjYWxlIGFuZC9vciAtc2NhbGUgc3dpdGNoZXMuCi0iLWdyYXlzY2FsZSAtc2NhbGUgMS84IiBpcyB0aGUgZmFzdGVzdCBjYXNlLgotCi1TZXZlcmFsIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB0aGF0IHRyYWRlIG9mZiBpbWFnZSBxdWFsaXR5IHRvIGdhaW4gc3BlZWQuCi0iLWZhc3QiIHR1cm5zIG9uIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5ncy4KLQotIi1kY3QgZmFzdCIgYW5kL29yICItbm9zbW9vdGgiIGdhaW4gc3BlZWQgYXQgYSBzbWFsbCBzYWNyaWZpY2UgaW4gcXVhbGl0eS4KLVdoZW4gcHJvZHVjaW5nIGEgY29sb3ItcXVhbnRpemVkIGltYWdlLCAiLW9uZXBhc3MgLWRpdGhlciBvcmRlcmVkIiBpcyBmYXN0IGJ1dAotbXVjaCBsb3dlciBxdWFsaXR5IHRoYW4gdGhlIGRlZmF1bHQgYmVoYXZpb3IuICAiLWRpdGhlciBub25lIiBtYXkgZ2l2ZQotYWNjZXB0YWJsZSByZXN1bHRzIGluIHR3by1wYXNzIG1vZGUsIGJ1dCBpcyBzZWxkb20gdG9sZXJhYmxlIGluIG9uZS1wYXNzIG1vZGUuCi0KLUlmIHlvdSBhcmUgZm9ydHVuYXRlIGVub3VnaCB0byBoYXZlIHZlcnkgZmFzdCBmbG9hdGluZyBwb2ludCBoYXJkd2FyZSwKLSItZGN0IGZsb2F0IiBtYXkgYmUgZXZlbiBmYXN0ZXIgdGhhbiAiLWRjdCBmYXN0Ii4gIEJ1dCBvbiBtb3N0IG1hY2hpbmVzCi0iLWRjdCBmbG9hdCIgaXMgc2xvd2VyIHRoYW4gIi1kY3QgaW50IjsgaW4gdGhpcyBjYXNlIGl0IGlzIG5vdCB3b3J0aCB1c2luZywKLWJlY2F1c2UgaXRzIHRoZW9yZXRpY2FsIGFjY3VyYWN5IGFkdmFudGFnZSBpcyB0b28gc21hbGwgdG8gYmUgc2lnbmlmaWNhbnQKLWluIHByYWN0aWNlLgotCi1Ud28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24gcmVxdWlyZXMgYSBnb29kIGRlYWwgb2YgbWVtb3J5OyBvbiBNUy1ET1MgbWFjaGluZXMKLWl0IG1heSBydW4gb3V0IG9mIG1lbW9yeSBldmVuIHdpdGggLW1heG1lbW9yeSAwLiAgSW4gdGhhdCBjYXNlIHlvdSBjYW4gc3RpbGwKLWRlY29tcHJlc3MsIHdpdGggc29tZSBsb3NzIG9mIGltYWdlIHF1YWxpdHksIGJ5IHNwZWNpZnlpbmcgLW9uZXBhc3MgZm9yCi1vbmUtcGFzcyBxdWFudGl6YXRpb24uCi0KLVRvIGF2b2lkIHRoZSBVbmlzeXMgTFpXIHBhdGVudCwgZGpwZWcgcHJvZHVjZXMgdW5jb21wcmVzc2VkIEdJRiBmaWxlcy4gIFRoZXNlCi1hcmUgbGFyZ2VyIHRoYW4gdGhleSBzaG91bGQgYmUsIGJ1dCBhcmUgcmVhZGFibGUgYnkgc3RhbmRhcmQgR0lGIGRlY29kZXJzLgotCi0KLUhJTlRTIEZPUiBCT1RIIFBST0dSQU1TCi0KLUlmIG1vcmUgc3BhY2UgaXMgbmVlZGVkIHRoYW4gd2lsbCBmaXQgaW4gdGhlIGF2YWlsYWJsZSBtYWluIG1lbW9yeSAoYXMKLWRldGVybWluZWQgYnkgLW1heG1lbW9yeSksIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuICAoTVMtRE9TIHZlcnNpb25zCi13aWxsIHRyeSB0byBnZXQgZXh0ZW5kZWQgb3IgZXhwYW5kZWQgbWVtb3J5IGZpcnN0LikgIFRoZSB0ZW1wb3JhcnkgZmlsZXMgYXJlCi1vZnRlbiByYXRoZXIgbGFyZ2U6IGluIHR5cGljYWwgY2FzZXMgdGhleSBvY2N1cHkgdGhyZWUgYnl0ZXMgcGVyIHBpeGVsLCBmb3IKLWV4YW1wbGUgMyo4MDAqNjAwID0gMS40NE1iIGZvciBhbiA4MDB4NjAwIGltYWdlLiAgSWYgeW91IGRvbid0IGhhdmUgZW5vdWdoCi1mcmVlIGRpc2sgc3BhY2UsIGxlYXZlIG91dCAtcHJvZ3Jlc3NpdmUgYW5kIC1vcHRpbWl6ZSAoZm9yIGNqcGVnKSBvciBzcGVjaWZ5Ci0tb25lcGFzcyAoZm9yIGRqcGVnKS4KLQotT24gTVMtRE9TLCB0aGUgdGVtcG9yYXJ5IGZpbGVzIGFyZSBjcmVhdGVkIGluIHRoZSBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIFRNUAotb3IgVEVNUCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5laXRoZXIgb2YgdGhvc2UKLWV4aXN0LiAgQW1pZ2EgaW1wbGVtZW50YXRpb25zIHB1dCB0aGUgdGVtcCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IG5hbWVkIGJ5Ci1KUEVHVE1QOiwgc28gYmUgc3VyZSB0byBhc3NpZ24gSlBFR1RNUDogdG8gYSBkaXNrIHBhcnRpdGlvbiB3aXRoIGFkZXF1YXRlIGZyZWUKLXNwYWNlLgotCi1UaGUgZGVmYXVsdCBtZW1vcnkgdXNhZ2UgbGltaXQgKC1tYXhtZW1vcnkpIGlzIHNldCB3aGVuIHRoZSBzb2Z0d2FyZSBpcwotY29tcGlsZWQuICBJZiB5b3UgZ2V0IGFuICJpbnN1ZmZpY2llbnQgbWVtb3J5IiBlcnJvciwgdHJ5IHNwZWNpZnlpbmcgYSBzbWFsbGVyCi0tbWF4bWVtb3J5IHZhbHVlLCBldmVuIC1tYXhtZW1vcnkgMCB0byB1c2UgdGhlIGFic29sdXRlIG1pbmltdW0gc3BhY2UuICBZb3UKLW1heSB3YW50IHRvIHJlY29tcGlsZSB3aXRoIGEgc21hbGxlciBkZWZhdWx0IHZhbHVlIGlmIHRoaXMgaGFwcGVucyBvZnRlbi4KLQotT24gbWFjaGluZXMgdGhhdCBoYXZlICJlbnZpcm9ubWVudCIgdmFyaWFibGVzLCB5b3UgY2FuIGRlZmluZSB0aGUgZW52aXJvbm1lbnQKLXZhcmlhYmxlIEpQRUdNRU0gdG8gc2V0IHRoZSBkZWZhdWx0IG1lbW9yeSBsaW1pdC4gIFRoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMKLWRlc2NyaWJlZCBmb3IgdGhlIC1tYXhtZW1vcnkgc3dpdGNoLiAgSlBFR01FTSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUKLXNwZWNpZmllZCB3aGVuIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCwgYW5kIGl0c2VsZiBpcyBvdmVycmlkZGVuIGJ5IGFuCi1leHBsaWNpdCAtbWF4bWVtb3J5IHN3aXRjaC4KLQotT24gTVMtRE9TIG1hY2hpbmVzLCAtbWF4bWVtb3J5IGlzIHRoZSBhbW91bnQgb2YgbWFpbiAoY29udmVudGlvbmFsKSBtZW1vcnkgdG8KLXVzZS4gIChFeHRlbmRlZCBvciBleHBhbmRlZCBtZW1vcnkgaXMgYWxzbyB1c2VkIGlmIGF2YWlsYWJsZS4pICBNb3N0Ci1ET1Mtc3BlY2lmaWMgdmVyc2lvbnMgb2YgdGhpcyBzb2Z0d2FyZSBkbyB0aGVpciBvd24gbWVtb3J5IHNwYWNlIGVzdGltYXRpb24KLWFuZCBkbyBub3QgbmVlZCB5b3UgdG8gc3BlY2lmeSAtbWF4bWVtb3J5LgotCi0KLUpQRUdUUkFOCi0KLWpwZWd0cmFuIHBlcmZvcm1zIHZhcmlvdXMgdXNlZnVsIHRyYW5zZm9ybWF0aW9ucyBvZiBKUEVHIGZpbGVzLgotSXQgY2FuIHRyYW5zbGF0ZSB0aGUgY29kZWQgcmVwcmVzZW50YXRpb24gZnJvbSBvbmUgdmFyaWFudCBvZiBKUEVHIHRvIGFub3RoZXIsCi1mb3IgZXhhbXBsZSBmcm9tIGJhc2VsaW5lIEpQRUcgdG8gcHJvZ3Jlc3NpdmUgSlBFRyBvciB2aWNlIHZlcnNhLiAgSXQgY2FuIGFsc28KLXBlcmZvcm0gc29tZSByZWFycmFuZ2VtZW50cyBvZiB0aGUgaW1hZ2UgZGF0YSwgZm9yIGV4YW1wbGUgdHVybmluZyBhbiBpbWFnZQotZnJvbSBsYW5kc2NhcGUgdG8gcG9ydHJhaXQgZm9ybWF0IGJ5IHJvdGF0aW9uLgotCi1qcGVndHJhbiB3b3JrcyBieSByZWFycmFuZ2luZyB0aGUgY29tcHJlc3NlZCBkYXRhIChEQ1QgY29lZmZpY2llbnRzKSwgd2l0aG91dAotZXZlciBmdWxseSBkZWNvZGluZyB0aGUgaW1hZ2UuICBUaGVyZWZvcmUsIGl0cyB0cmFuc2Zvcm1hdGlvbnMgYXJlIGxvc3NsZXNzOgotdGhlcmUgaXMgbm8gaW1hZ2UgZGVncmFkYXRpb24gYXQgYWxsLCB3aGljaCB3b3VsZCBub3QgYmUgdHJ1ZSBpZiB5b3UgdXNlZAotZGpwZWcgZm9sbG93ZWQgYnkgY2pwZWcgdG8gYWNjb21wbGlzaCB0aGUgc2FtZSBjb252ZXJzaW9uLiAgQnV0IGJ5IHRoZSBzYW1lCi10b2tlbiwganBlZ3RyYW4gY2Fubm90IHBlcmZvcm0gbG9zc3kgb3BlcmF0aW9ucyBzdWNoIGFzIGNoYW5naW5nIHRoZSBpbWFnZQotcXVhbGl0eS4KLQotanBlZ3RyYW4gdXNlcyBhIGNvbW1hbmQgbGluZSBzeW50YXggc2ltaWxhciB0byBjanBlZyBvciBkanBlZy4KLU9uIFVuaXgtbGlrZSBzeXN0ZW1zLCB5b3Ugc2F5OgotCWpwZWd0cmFuIFtzd2l0Y2hlc10gW2lucHV0ZmlsZV0gPm91dHB1dGZpbGUKLU9uIG1vc3Qgbm9uLVVuaXggc3lzdGVtcywgeW91IHNheToKLQlqcGVndHJhbiBbc3dpdGNoZXNdIGlucHV0ZmlsZSBvdXRwdXRmaWxlCi13aGVyZSBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIGFyZSBKUEVHIGZpbGVzLgotCi1UbyBzcGVjaWZ5IHRoZSBjb2RlZCBKUEVHIHJlcHJlc2VudGF0aW9uIHVzZWQgaW4gdGhlIG91dHB1dCBmaWxlLAotanBlZ3RyYW4gYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgc3dpdGNoZXMgcmVjb2duaXplZCBieSBjanBlZzoKLQktb3B0aW1pemUJUGVyZm9ybSBvcHRpbWl6YXRpb24gb2YgZW50cm9weSBlbmNvZGluZyBwYXJhbWV0ZXJzLgotCS1wcm9ncmVzc2l2ZQlDcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlLgotCS1yZXN0YXJ0IE4JRW1pdCBhIEpQRUcgcmVzdGFydCBtYXJrZXIgZXZlcnkgTiBNQ1Ugcm93cywgb3IgZXZlcnkKLQkJCU4gTUNVIGJsb2NrcyBpZiAiQiIgaXMgYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KLQktc2NhbnMgZmlsZQlVc2UgdGhlIHNjYW4gc2NyaXB0IGdpdmVuIGluIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgotU2VlIHRoZSBwcmV2aW91cyBkaXNjdXNzaW9uIG9mIGNqcGVnIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlc2Ugc3dpdGNoZXMuCi1JZiB5b3Ugc3BlY2lmeSBub25lIG9mIHRoZXNlIHN3aXRjaGVzLCB5b3UgZ2V0IGEgcGxhaW4gYmFzZWxpbmUtSlBFRyBvdXRwdXQKLWZpbGUuICBUaGUgcXVhbGl0eSBzZXR0aW5nIGFuZCBzbyBmb3J0aCBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5wdXQgZmlsZS4KLQotVGhlIGltYWdlIGNhbiBiZSBsb3NzbGVzc2x5IHRyYW5zZm9ybWVkIGJ5IGdpdmluZyBvbmUgb2YgdGhlc2Ugc3dpdGNoZXM6Ci0JLWZsaXAgaG9yaXpvbnRhbAlNaXJyb3IgaW1hZ2UgaG9yaXpvbnRhbGx5IChsZWZ0LXJpZ2h0KS4KLQktZmxpcCB2ZXJ0aWNhbAkJTWlycm9yIGltYWdlIHZlcnRpY2FsbHkgKHRvcC1ib3R0b20pLgotCS1yb3RhdGUgOTAJCVJvdGF0ZSBpbWFnZSA5MCBkZWdyZWVzIGNsb2Nrd2lzZS4KLQktcm90YXRlIDE4MAkJUm90YXRlIGltYWdlIDE4MCBkZWdyZWVzLgotCS1yb3RhdGUgMjcwCQlSb3RhdGUgaW1hZ2UgMjcwIGRlZ3JlZXMgY2xvY2t3aXNlIChvciA5MCBjY3cpLgotCS10cmFuc3Bvc2UJCVRyYW5zcG9zZSBpbWFnZSAoYWNyb3NzIFVMLXRvLUxSIGF4aXMpLgotCS10cmFuc3ZlcnNlCQlUcmFuc3ZlcnNlIHRyYW5zcG9zZSAoYWNyb3NzIFVSLXRvLUxMIGF4aXMpLgotCi1UaGUgdHJhbnNwb3NlIHRyYW5zZm9ybWF0aW9uIGhhcyBubyByZXN0cmljdGlvbnMgcmVnYXJkaW5nIGltYWdlIGRpbWVuc2lvbnMuCi1UaGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIG9wZXJhdGUgcmF0aGVyIG9kZGx5IGlmIHRoZSBpbWFnZSBkaW1lbnNpb25zIGFyZSBub3QKLWEgbXVsdGlwbGUgb2YgdGhlIGlNQ1Ugc2l6ZSAodXN1YWxseSA4IG9yIDE2IHBpeGVscyksIGJlY2F1c2UgdGhleSBjYW4gb25seQotdHJhbnNmb3JtIGNvbXBsZXRlIGJsb2NrcyBvZiBEQ1QgY29lZmZpY2llbnQgZGF0YSBpbiB0aGUgZGVzaXJlZCB3YXkuCi0KLWpwZWd0cmFuJ3MgZGVmYXVsdCBiZWhhdmlvciB3aGVuIHRyYW5zZm9ybWluZyBhbiBvZGQtc2l6ZSBpbWFnZSBpcyBkZXNpZ25lZAotdG8gcHJlc2VydmUgZXhhY3QgcmV2ZXJzaWJpbGl0eSBhbmQgbWF0aGVtYXRpY2FsIGNvbnNpc3RlbmN5IG9mIHRoZQotdHJhbnNmb3JtYXRpb24gc2V0LiAgQXMgc3RhdGVkLCB0cmFuc3Bvc2UgaXMgYWJsZSB0byBmbGlwIHRoZSBlbnRpcmUgaW1hZ2UKLWFyZWEuICBIb3Jpem9udGFsIG1pcnJvcmluZyBsZWF2ZXMgYW55IHBhcnRpYWwgaU1DVSBjb2x1bW4gYXQgdGhlIHJpZ2h0IGVkZ2UKLXVudG91Y2hlZCwgYnV0IGlzIGFibGUgdG8gZmxpcCBhbGwgcm93cyBvZiB0aGUgaW1hZ2UuICBTaW1pbGFybHksIHZlcnRpY2FsCi1taXJyb3JpbmcgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1Ugcm93IGF0IHRoZSBib3R0b20gZWRnZSB1bnRvdWNoZWQsIGJ1dCBpcwotYWJsZSB0byBmbGlwIGFsbCBjb2x1bW5zLiAgVGhlIG90aGVyIHRyYW5zZm9ybXMgY2FuIGJlIGJ1aWx0IHVwIGFzIHNlcXVlbmNlcwotb2YgdHJhbnNwb3NlIGFuZCBmbGlwIG9wZXJhdGlvbnM7IGZvciBjb25zaXN0ZW5jeSwgdGhlaXIgYWN0aW9ucyBvbiBlZGdlCi1waXhlbHMgYXJlIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGVuZCByZXN1bHQgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLXRyYW5zcG9zZS1hbmQtZmxpcCBzZXF1ZW5jZS4KLQotRm9yIHByYWN0aWNhbCB1c2UsIHlvdSBtYXkgcHJlZmVyIHRvIGRpc2NhcmQgYW55IHVudHJhbnNmb3JtYWJsZSBlZGdlIHBpeGVscwotcmF0aGVyIHRoYW4gaGF2aW5nIGEgc3RyYW5nZS1sb29raW5nIHN0cmlwIGFsb25nIHRoZSByaWdodCBhbmQvb3IgYm90dG9tIGVkZ2VzCi1vZiBhIHRyYW5zZm9ybWVkIGltYWdlLiAgVG8gZG8gdGhpcywgYWRkIHRoZSAtdHJpbSBzd2l0Y2g6Ci0JLXRyaW0JCURyb3Agbm9uLXRyYW5zZm9ybWFibGUgZWRnZSBibG9ja3MuCi1PYnZpb3VzbHksIGEgdHJhbnNmb3JtYXRpb24gd2l0aCAtdHJpbSBpcyBub3QgcmV2ZXJzaWJsZSwgc28gc3RyaWN0bHkgc3BlYWtpbmcKLWpwZWd0cmFuIHdpdGggdGhpcyBzd2l0Y2ggaXMgbm90IGxvc3NsZXNzLiAgQWxzbywgdGhlIGV4cGVjdGVkIG1hdGhlbWF0aWNhbAotZXF1aXZhbGVuY2VzIGJldHdlZW4gdGhlIHRyYW5zZm9ybWF0aW9ucyBubyBsb25nZXIgaG9sZC4gIEZvciBleGFtcGxlLAotIi1yb3QgMjcwIC10cmltIiB0cmltcyBvbmx5IHRoZSBib3R0b20gZWRnZSwgYnV0ICItcm90IDkwIC10cmltIiBmb2xsb3dlZCBieQotIi1yb3QgMTgwIC10cmltIiB0cmltcyBib3RoIGVkZ2VzLgotCi1Bbm90aGVyIG5vdC1zdHJpY3RseS1sb3NzbGVzcyB0cmFuc2Zvcm1hdGlvbiBzd2l0Y2ggaXM6Ci0JLWdyYXlzY2FsZQlGb3JjZSBncmF5c2NhbGUgb3V0cHV0LgotVGhpcyBvcHRpb24gZGlzY2FyZHMgdGhlIGNocm9taW5hbmNlIGNoYW5uZWxzIGlmIHRoZSBpbnB1dCBpbWFnZSBpcyBZQ2JDcgotKGllLCBhIHN0YW5kYXJkIGNvbG9yIEpQRUcpLCByZXN1bHRpbmcgaW4gYSBncmF5c2NhbGUgSlBFRyBmaWxlLiAgVGhlCi1sdW1pbmFuY2UgY2hhbm5lbCBpcyBwcmVzZXJ2ZWQgZXhhY3RseSwgc28gdGhpcyBpcyBhIGJldHRlciBtZXRob2Qgb2YgcmVkdWNpbmcKLXRvIGdyYXlzY2FsZSB0aGFuIGRlY29tcHJlc3Npb24sIGNvbnZlcnNpb24sIGFuZCByZWNvbXByZXNzaW9uLiAgVGhpcyBzd2l0Y2gKLWlzIHBhcnRpY3VsYXJseSBoYW5keSBmb3IgZml4aW5nIGEgbW9ub2Nocm9tZSBwaWN0dXJlIHRoYXQgd2FzIG1pc3Rha2VubHkKLWVuY29kZWQgYXMgYSBjb2xvciBKUEVHLiAgKEluIHN1Y2ggYSBjYXNlLCB0aGUgc3BhY2Ugc2F2aW5ncyBmcm9tIGdldHRpbmcgcmlkCi1vZiB0aGUgbmVhci1lbXB0eSBjaHJvbWEgY2hhbm5lbHMgd29uJ3QgYmUgbGFyZ2U7IGJ1dCB0aGUgZGVjb2RpbmcgdGltZSBmb3IKLWEgZ3JheXNjYWxlIEpQRUcgaXMgc3Vic3RhbnRpYWxseSBsZXNzIHRoYW4gdGhhdCBmb3IgYSBjb2xvciBKUEVHLikKLQotanBlZ3RyYW4gYWxzbyByZWNvZ25pemVzIHRoZXNlIHN3aXRjaGVzIHRoYXQgY29udHJvbCB3aGF0IHRvIGRvIHdpdGggImV4dHJhIgotbWFya2Vycywgc3VjaCBhcyBjb21tZW50IGJsb2NrczoKLQktY29weSBub25lCUNvcHkgbm8gZXh0cmEgbWFya2VycyBmcm9tIHNvdXJjZSBmaWxlLiAgVGhpcyBzZXR0aW5nCi0JCQlzdXBwcmVzc2VzIGFsbCBjb21tZW50cyBhbmQgb3RoZXIgZXhjZXNzIGJhZ2dhZ2UKLQkJCXByZXNlbnQgaW4gdGhlIHNvdXJjZSBmaWxlLgotCS1jb3B5IGNvbW1lbnRzCUNvcHkgb25seSBjb21tZW50IG1hcmtlcnMuICBUaGlzIHNldHRpbmcgY29waWVzCi0JCQljb21tZW50cyBmcm9tIHRoZSBzb3VyY2UgZmlsZSwgYnV0IGRpc2NhcmRzCi0JCQlhbnkgb3RoZXIgaW5lc3NlbnRpYWwgZGF0YS4gCi0JLWNvcHkgYWxsCUNvcHkgYWxsIGV4dHJhIG1hcmtlcnMuICBUaGlzIHNldHRpbmcgcHJlc2VydmVzCi0JCQltaXNjZWxsYW5lb3VzIG1hcmtlcnMgZm91bmQgaW4gdGhlIHNvdXJjZSBmaWxlLCBzdWNoCi0JCQlhcyBKRklGIHRodW1ibmFpbHMgYW5kIFBob3Rvc2hvcCBzZXR0aW5ncy4gIEluIHNvbWUKLQkJCWZpbGVzIHRoZXNlIGV4dHJhIG1hcmtlcnMgY2FuIGJlIHNpemFibGUuCi1UaGUgZGVmYXVsdCBiZWhhdmlvciBpcyAtY29weSBjb21tZW50cy4gIChOb3RlOiBpbiBJSkcgcmVsZWFzZXMgdjYgYW5kIHY2YSwKLWpwZWd0cmFuIGFsd2F5cyBkaWQgdGhlIGVxdWl2YWxlbnQgb2YgLWNvcHkgbm9uZS4pCi0KLUFkZGl0aW9uYWwgc3dpdGNoZXMgcmVjb2duaXplZCBieSBqcGVndHJhbiBhcmU6Ci0JLW91dGZpbGUgZmlsZW5hbWUKLQktbWF4bWVtb3J5IE4KLQktdmVyYm9zZQotCS1kZWJ1ZwotVGhlc2Ugd29yayB0aGUgc2FtZSBhcyBpbiBjanBlZyBvciBkanBlZy4KLQotCi1USEUgQ09NTUVOVCBVVElMSVRJRVMKLQotVGhlIEpQRUcgc3RhbmRhcmQgYWxsb3dzICJjb21tZW50IiAoQ09NKSBibG9ja3MgdG8gb2NjdXIgd2l0aGluIGEgSlBFRyBmaWxlLgotQWx0aG91Z2ggdGhlIHN0YW5kYXJkIGRvZXNuJ3QgYWN0dWFsbHkgZGVmaW5lIHdoYXQgQ09NIGJsb2NrcyBhcmUgZm9yLCB0aGV5Ci1hcmUgd2lkZWx5IHVzZWQgdG8gaG9sZCB1c2VyLXN1cHBsaWVkIHRleHQgc3RyaW5ncy4gIFRoaXMgbGV0cyB5b3UgYWRkCi1hbm5vdGF0aW9ucywgdGl0bGVzLCBpbmRleCB0ZXJtcywgZXRjIHRvIHlvdXIgSlBFRyBmaWxlcywgYW5kIGxhdGVyIHJldHJpZXZlCi10aGVtIGFzIHRleHQuICBDT00gYmxvY2tzIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgaW1hZ2Ugc3RvcmVkIGluIHRoZSBKUEVHCi1maWxlLiAgVGhlIG1heGltdW0gc2l6ZSBvZiBhIENPTSBibG9jayBpcyA2NEssIGJ1dCB5b3UgY2FuIGhhdmUgYXMgbWFueSBvZgotdGhlbSBhcyB5b3UgbGlrZSBpbiBvbmUgSlBFRyBmaWxlLgotCi1XZSBwcm92aWRlIHR3byB1dGlsaXR5IHByb2dyYW1zIHRvIGRpc3BsYXkgQ09NIGJsb2NrIGNvbnRlbnRzIGFuZCBhZGQgQ09NCi1ibG9ja3MgdG8gYSBKUEVHIGZpbGUuCi0KLXJkanBnY29tIHNlYXJjaGVzIGEgSlBFRyBmaWxlIGFuZCBwcmludHMgdGhlIGNvbnRlbnRzIG9mIGFueSBDT00gYmxvY2tzIG9uCi1zdGFuZGFyZCBvdXRwdXQuICBUaGUgY29tbWFuZCBsaW5lIHN5bnRheCBpcwotCXJkanBnY29tIFstdmVyYm9zZV0gW2lucHV0ZmlsZW5hbWVdCi1UaGUgc3dpdGNoICItdmVyYm9zZSIgKG9yIGp1c3QgIi12IikgY2F1c2VzIHJkanBnY29tIHRvIGFsc28gZGlzcGxheSB0aGUgSlBFRwotaW1hZ2UgZGltZW5zaW9ucy4gIElmIHlvdSBvbWl0IHRoZSBpbnB1dCBmaWxlIG5hbWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLAotdGhlIEpQRUcgZmlsZSBpcyByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBtYXkgbm90IHdvcmsgb24gc29tZQotb3BlcmF0aW5nIHN5c3RlbXMsIGlmIGJpbmFyeSBkYXRhIGNhbid0IGJlIHJlYWQgZnJvbSBzdGRpbi4pCi0KLXdyanBnY29tIGFkZHMgYSBDT00gYmxvY2ssIGNvbnRhaW5pbmcgdGV4dCB5b3UgcHJvdmlkZSwgdG8gYSBKUEVHIGZpbGUuCi1PcmRpbmFyaWx5LCB0aGUgQ09NIGJsb2NrIGlzIGFkZGVkIGFmdGVyIGFueSBleGlzdGluZyBDT00gYmxvY2tzLCBidXQgeW91Ci1jYW4gZGVsZXRlIHRoZSBvbGQgQ09NIGJsb2NrcyBpZiB5b3Ugd2lzaC4gIHdyanBnY29tIHByb2R1Y2VzIGEgbmV3IEpQRUcKLWZpbGU7IGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgaW5wdXQgZmlsZS4gIERPIE5PVCB0cnkgdG8gb3ZlcndyaXRlIHRoZSBpbnB1dAotZmlsZSBieSBkaXJlY3Rpbmcgd3JqcGdjb20ncyBvdXRwdXQgYmFjayBpbnRvIGl0OyBvbiBtb3N0IHN5c3RlbXMgdGhpcyB3aWxsCi1qdXN0IGRlc3Ryb3kgeW91ciBmaWxlLgotCi1UaGUgY29tbWFuZCBsaW5lIHN5bnRheCBmb3Igd3JqcGdjb20gaXMgc2ltaWxhciB0byBjanBlZydzLiAgT24gVW5peC1saWtlCi1zeXN0ZW1zLCBpdCBpcwotCXdyanBnY29tIFtzd2l0Y2hlc10gW2lucHV0ZmlsZW5hbWVdCi1UaGUgb3V0cHV0IGZpbGUgaXMgd3JpdHRlbiB0byBzdGFuZGFyZCBvdXRwdXQuICBUaGUgaW5wdXQgZmlsZSBjb21lcyBmcm9tCi10aGUgbmFtZWQgZmlsZSwgb3IgZnJvbSBzdGFuZGFyZCBpbnB1dCBpZiBubyBpbnB1dCBmaWxlIGlzIG5hbWVkLgotCi1PbiBtb3N0IG5vbi1Vbml4IHN5c3RlbXMsIHRoZSBzeW50YXggaXMKLQl3cmpwZ2NvbSBbc3dpdGNoZXNdIGlucHV0ZmlsZW5hbWUgb3V0cHV0ZmlsZW5hbWUKLXdoZXJlIGJvdGggaW5wdXQgYW5kIG91dHB1dCBmaWxlIG5hbWVzIG11c3QgYmUgZ2l2ZW4gZXhwbGljaXRseS4KLQotd3JqcGdjb20gdW5kZXJzdGFuZHMgdGhyZWUgc3dpdGNoZXM6Ci0JLXJlcGxhY2UJCSBEZWxldGUgYW55IGV4aXN0aW5nIENPTSBibG9ja3MgZnJvbSB0aGUgZmlsZS4KLQktY29tbWVudCAiQ29tbWVudCB0ZXh0IgkgU3VwcGx5IG5ldyBDT00gdGV4dCBvbiBjb21tYW5kIGxpbmUuCi0JLWNmaWxlIG5hbWUJCSBSZWFkIHRleHQgZm9yIG5ldyBDT00gYmxvY2sgZnJvbSBuYW1lZCBmaWxlLgotKFN3aXRjaCBuYW1lcyBjYW4gYmUgYWJicmV2aWF0ZWQuKSAgSWYgeW91IGhhdmUgb25seSBvbmUgbGluZSBvZiBjb21tZW50IHRleHQKLXRvIGFkZCwgeW91IGNhbiBwcm92aWRlIGl0IG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCAtY29tbWVudC4gIFRoZSBjb21tZW50Ci10ZXh0IG11c3QgYmUgc3Vycm91bmRlZCB3aXRoIHF1b3RlcyBzbyB0aGF0IGl0IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUKLWFyZ3VtZW50LiAgTG9uZ2VyIGNvbW1lbnRzIGNhbiBiZSByZWFkIGZyb20gYSB0ZXh0IGZpbGUuCi0KLUlmIHlvdSBnaXZlIG5laXRoZXIgLWNvbW1lbnQgbm9yIC1jZmlsZSwgdGhlbiB3cmpwZ2NvbSB3aWxsIHJlYWQgdGhlIGNvbW1lbnQKLXRleHQgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChJbiB0aGlzIGNhc2UgYW4gaW5wdXQgaW1hZ2UgZmlsZSBuYW1lIE1VU1QgYmUKLXN1cHBsaWVkLCBzbyB0aGF0IHRoZSBzb3VyY2UgSlBFRyBmaWxlIGNvbWVzIGZyb20gc29tZXdoZXJlIGVsc2UuKSAgWW91IGNhbgotZW50ZXIgbXVsdGlwbGUgbGluZXMsIHVwIHRvIDY0S0Igd29ydGguICBUeXBlIGFuIGVuZC1vZi1maWxlIGluZGljYXRvcgotKHVzdWFsbHkgY29udHJvbC1EIG9yIGNvbnRyb2wtWikgdG8gdGVybWluYXRlIHRoZSBjb21tZW50IHRleHQgZW50cnkuCi0KLXdyanBnY29tIHdpbGwgbm90IGFkZCBhIENPTSBibG9jayBpZiB0aGUgcHJvdmlkZWQgY29tbWVudCBzdHJpbmcgaXMgZW1wdHkuCi1UaGVyZWZvcmUgLXJlcGxhY2UgLWNvbW1lbnQgIiIgY2FuIGJlIHVzZWQgdG8gZGVsZXRlIGFsbCBDT00gYmxvY2tzIGZyb20gYQotZmlsZS4KLQotVGhlc2UgdXRpbGl0eSBwcm9ncmFtcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBJSkcgSlBFRyBsaWJyYXJ5LiAgSW4KLXBhcnRpY3VsYXIsIHRoZSBzb3VyY2UgY29kZSBmb3IgcmRqcGdjb20gaXMgaW50ZW5kZWQgYXMgYW4gaWxsdXN0cmF0aW9uIG9mCi10aGUgbWluaW11bSBhbW91bnQgb2YgY29kZSByZXF1aXJlZCB0byBwYXJzZSBhIEpQRUcgZmlsZSBoZWFkZXIgY29ycmVjdGx5LgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvd2l6YXJkLmRvYyBiL2xpYmpwZWd0d3JwL3dpemFyZC5kb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTcwYjIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvd2l6YXJkLmRvYworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi1BZHZhbmNlZCB1c2FnZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBmaWxlIGRlc2NyaWJlcyBjanBlZydzICJzd2l0Y2hlcyBmb3Igd2l6YXJkcyIuCi0KLVRoZSAid2l6YXJkIiBzd2l0Y2hlcyBhcmUgaW50ZW5kZWQgZm9yIGV4cGVyaW1lbnRhdGlvbiB3aXRoIEpQRUcgYnkgcGVyc29ucwotd2hvIGFyZSByZWFzb25hYmx5IGtub3dsZWRnZWFibGUgYWJvdXQgdGhlIEpQRUcgc3RhbmRhcmQuICBJZiB5b3UgZG9uJ3Qga25vdwotd2hhdCB5b3UgYXJlIGRvaW5nLCBET04nVCBVU0UgVEhFU0UgU1dJVENIRVMuICBZb3UnbGwgbGlrZWx5IHByb2R1Y2UgZmlsZXMKLXdpdGggd29yc2UgaW1hZ2UgcXVhbGl0eSBhbmQvb3IgcG9vcmVyIGNvbXByZXNzaW9uIHRoYW4geW91J2QgZ2V0IGZyb20gdGhlCi1kZWZhdWx0IHNldHRpbmdzLiAgRnVydGhlcm1vcmUsIHRoZXNlIHN3aXRjaGVzIG11c3QgYmUgdXNlZCB3aXRoIGNhdXRpb24KLXdoZW4gbWFraW5nIGZpbGVzIGludGVuZGVkIGZvciBnZW5lcmFsIHVzZSwgYmVjYXVzZSBub3QgYWxsIEpQRUcgZGVjb2RlcnMKLXdpbGwgc3VwcG9ydCB1bnVzdWFsIEpQRUcgcGFyYW1ldGVyIHNldHRpbmdzLgotCi0KLVF1YW50aXphdGlvbiBUYWJsZSBBZGp1c3RtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1PcmRpbmFyaWx5LCBjanBlZyBzdGFydHMgd2l0aCBhIGRlZmF1bHQgc2V0IG9mIHRhYmxlcyAodGhlIHNhbWUgb25lcyBnaXZlbgotYXMgZXhhbXBsZXMgaW4gdGhlIEpQRUcgc3RhbmRhcmQpIGFuZCBzY2FsZXMgdGhlbSB1cCBvciBkb3duIGFjY29yZGluZyB0bwotdGhlIC1xdWFsaXR5IHNldHRpbmcuICBUaGUgZGV0YWlscyBvZiB0aGUgc2NhbGluZyBhbGdvcml0aG0gY2FuIGJlIGZvdW5kIGluCi1qY3BhcmFtLmMuICBBdCB2ZXJ5IGxvdyBxdWFsaXR5IHNldHRpbmdzLCBzb21lIHF1YW50aXphdGlvbiB0YWJsZSBlbnRyaWVzCi1jYW4gZ2V0IHNjYWxlZCB1cCB0byB2YWx1ZXMgZXhjZWVkaW5nIDI1NS4gIEFsdGhvdWdoIDItYnl0ZSBxdWFudGl6YXRpb24KLXZhbHVlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBJSkcgc29mdHdhcmUsIHRoaXMgZmVhdHVyZSBpcyBub3QgaW4gYmFzZWxpbmUKLUpQRUcgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4gIElmIHlvdSBuZWVkIHRvIGVuc3VyZQotd2lkZSBjb21wYXRpYmlsaXR5IG9mIGxvdy1xdWFsaXR5IGZpbGVzLCB5b3UgY2FuIGNvbnN0cmFpbiB0aGUgc2NhbGVkCi1xdWFudGl6YXRpb24gdmFsdWVzIHRvIG5vIG1vcmUgdGhhbiAyNTUgYnkgZ2l2aW5nIHRoZSAtYmFzZWxpbmUgc3dpdGNoLgotTm90ZSB0aGF0IHVzZSBvZiAtYmFzZWxpbmUgd2lsbCByZXN1bHQgaW4gcG9vcmVyIHF1YWxpdHkgZm9yIHRoZSBzYW1lIGZpbGUKLXNpemUsIHNpbmNlIG1vcmUgYml0cyB0aGFuIG5lY2Vzc2FyeSBhcmUgZXhwZW5kZWQgb24gaGlnaGVyIEFDIGNvZWZmaWNpZW50cy4KLQotWW91IGNhbiBzdWJzdGl0dXRlIGEgZGlmZmVyZW50IHNldCBvZiBxdWFudGl6YXRpb24gdmFsdWVzIGJ5IHVzaW5nIHRoZQotLXF0YWJsZXMgc3dpdGNoOgotCi0JLXF0YWJsZXMgZmlsZQlVc2UgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gdGhlIG5hbWVkIGZpbGUuCi0KLVRoZSBzcGVjaWZpZWQgZmlsZSBzaG91bGQgYmUgYSB0ZXh0IGZpbGUgY29udGFpbmluZyBkZWNpbWFsIHF1YW50aXphdGlvbgotdmFsdWVzLiAgVGhlIGZpbGUgc2hvdWxkIGNvbnRhaW4gb25lIHRvIGZvdXIgdGFibGVzLCBlYWNoIG9mIDY0IGVsZW1lbnRzLgotVGhlIHRhYmxlcyBhcmUgaW1wbGljaXRseSBudW1iZXJlZCAwLDEsZXRjLiBpbiBvcmRlciBvZiBhcHBlYXJhbmNlLiAgVGFibGUKLWVudHJpZXMgYXBwZWFyIGluIG5vcm1hbCBhcnJheSBvcmRlciAoTk9UIGluIHRoZSB6aWd6YWcgb3JkZXIgaW4gd2hpY2ggdGhleQotd2lsbCBiZSBzdG9yZWQgaW4gdGhlIEpQRUcgZmlsZSkuCi0KLVF1YW50aXphdGlvbiB0YWJsZSBmaWxlcyBhcmUgZnJlZSBmb3JtYXQsIGluIHRoYXQgYXJiaXRyYXJ5IHdoaXRlc3BhY2UgY2FuCi1hcHBlYXIgYmV0d2VlbiBudW1iZXJzLiAgQWxzbywgY29tbWVudHMgY2FuIGJlIGluY2x1ZGVkOiBhIGNvbW1lbnQgc3RhcnRzCi13aXRoICcjJyBhbmQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgSGVyZSBpcyBhbiBleGFtcGxlIGZpbGUgdGhhdAotZHVwbGljYXRlcyB0aGUgZGVmYXVsdCBxdWFudGl6YXRpb24gdGFibGVzOgotCi0JIyBRdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIEpQRUcgc3BlYywgc2VjdGlvbiBLLjEKLQotCSMgVGhpcyBpcyB0YWJsZSAwICh0aGUgbHVtaW5hbmNlIHRhYmxlKToKLQkgIDE2ICAxMSAgMTAgIDE2ICAyNCAgNDAgIDUxICA2MQotCSAgMTIgIDEyICAxNCAgMTkgIDI2ICA1OCAgNjAgIDU1Ci0JICAxNCAgMTMgIDE2ICAyNCAgNDAgIDU3ICA2OSAgNTYKLQkgIDE0ICAxNyAgMjIgIDI5ICA1MSAgODcgIDgwICA2MgotCSAgMTggIDIyICAzNyAgNTYgIDY4IDEwOSAxMDMgIDc3Ci0JICAyNCAgMzUgIDU1ICA2NCAgODEgMTA0IDExMyAgOTIKLQkgIDQ5ICA2NCAgNzggIDg3IDEwMyAxMjEgMTIwIDEwMQotCSAgNzIgIDkyICA5NSAgOTggMTEyIDEwMCAxMDMgIDk5Ci0KLQkjIFRoaXMgaXMgdGFibGUgMSAodGhlIGNocm9taW5hbmNlIHRhYmxlKToKLQkgIDE3ICAxOCAgMjQgIDQ3ICA5OSAgOTkgIDk5ICA5OQotCSAgMTggIDIxICAyNiAgNjYgIDk5ICA5OSAgOTkgIDk5Ci0JICAyNCAgMjYgIDU2ICA5OSAgOTkgIDk5ICA5OSAgOTkKLQkgIDQ3ICA2NiAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OQotCSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5Ci0JICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkKLQkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OQotCSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5Ci0KLUlmIHRoZSAtcXRhYmxlcyBzd2l0Y2ggaXMgdXNlZCB3aXRob3V0IC1xdWFsaXR5LCB0aGVuIHRoZSBzcGVjaWZpZWQgdGFibGVzCi1hcmUgdXNlZCBleGFjdGx5IGFzLWlzLiAgSWYgYm90aCAtcXRhYmxlcyBhbmQgLXF1YWxpdHkgYXJlIHVzZWQsIHRoZW4gdGhlCi10YWJsZXMgdGFrZW4gZnJvbSB0aGUgZmlsZSBhcmUgc2NhbGVkIGluIHRoZSBzYW1lIGZhc2hpb24gdGhhdCB0aGUgZGVmYXVsdAotdGFibGVzIHdvdWxkIGJlIHNjYWxlZCBmb3IgdGhhdCBxdWFsaXR5IHNldHRpbmcuICBJZiAtYmFzZWxpbmUgYXBwZWFycywgdGhlbgotdGhlIHF1YW50aXphdGlvbiB2YWx1ZXMgYXJlIGNvbnN0cmFpbmVkIHRvIHRoZSByYW5nZSAxLTI1NS4KLQotQnkgZGVmYXVsdCwgY2pwZWcgd2lsbCB1c2UgcXVhbnRpemF0aW9uIHRhYmxlIDAgZm9yIGx1bWluYW5jZSBjb21wb25lbnRzIGFuZAotdGFibGUgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4gIFRvIG92ZXJyaWRlIHRoaXMgY2hvaWNlLCB1c2UgdGhlIC1xc2xvdHMKLXN3aXRjaDoKLQotCS1xc2xvdHMgTlssLi4uXQkJU2VsZWN0IHdoaWNoIHF1YW50aXphdGlvbiB0YWJsZSB0byB1c2UgZm9yCi0JCQkJZWFjaCBjb2xvciBjb21wb25lbnQuCi0KLVRoZSAtcXNsb3RzIHN3aXRjaCBzcGVjaWZpZXMgYSBxdWFudGl6YXRpb24gdGFibGUgbnVtYmVyIGZvciBlYWNoIGNvbG9yCi1jb21wb25lbnQsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY29tcG9uZW50cyBhcHBlYXIgaW4gdGhlIEpQRUcgU09GIG1hcmtlci4KLUZvciBleGFtcGxlLCB0byBjcmVhdGUgYSBzZXBhcmF0ZSB0YWJsZSBmb3IgZWFjaCBvZiBZLENiLENyLCB5b3UgY291bGQKLXByb3ZpZGUgYSAtcXRhYmxlcyBmaWxlIHRoYXQgZGVmaW5lcyB0aHJlZSBxdWFudGl6YXRpb24gdGFibGVzIGFuZCBzYXkKLSItcXNsb3RzIDAsMSwyIi4gIElmIC1xc2xvdHMgZ2l2ZXMgZmV3ZXIgdGFibGUgbnVtYmVycyB0aGFuIHRoZXJlIGFyZSBjb2xvcgotY29tcG9uZW50cywgdGhlbiB0aGUgbGFzdCB0YWJsZSBudW1iZXIgaXMgcmVwZWF0ZWQgYXMgbmVjZXNzYXJ5LgotCi0KLVNhbXBsaW5nIEZhY3RvciBBZGp1c3RtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CeSBkZWZhdWx0LCBjanBlZyB1c2VzIDI6MSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkb3duc2FtcGxpbmcgd2hlbgotY29tcHJlc3NpbmcgWUNiQ3IgZGF0YSwgYW5kIG5vIGRvd25zYW1wbGluZyBmb3IgYWxsIG90aGVyIGNvbG9yIHNwYWNlcy4KLVlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBkZWZhdWx0IHdpdGggdGhlIC1zYW1wbGUgc3dpdGNoOgotCi0JLXNhbXBsZSBIeFZbLC4uLl0JU2V0IEpQRUcgc2FtcGxpbmcgZmFjdG9ycyBmb3IgZWFjaCBjb2xvcgotCQkJCWNvbXBvbmVudC4KLQotVGhlIC1zYW1wbGUgc3dpdGNoIHNwZWNpZmllcyB0aGUgSlBFRyBzYW1wbGluZyBmYWN0b3JzIGZvciBlYWNoIGNvbG9yCi1jb21wb25lbnQsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgSlBFRyBTT0YgbWFya2VyLgotSWYgeW91IHNwZWNpZnkgZmV3ZXIgSHhWIHBhaXJzIHRoYW4gdGhlcmUgYXJlIGNvbXBvbmVudHMsIHRoZSByZW1haW5pbmcKLWNvbXBvbmVudHMgYXJlIHNldCB0byAxeDEgc2FtcGxpbmcuICBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgWUNiQ3Igc2V0dGluZwotaXMgZXF1aXZhbGVudCB0byAiLXNhbXBsZSAyeDIsMXgxLDF4MSIsIHdoaWNoIGNhbiBiZSBhYmJyZXZpYXRlZCB0bwotIi1zYW1wbGUgMngyIi4KLQotVGhlcmUgYXJlIHN0aWxsIHNvbWUgSlBFRyBkZWNvZGVycyBpbiBleGlzdGVuY2UgdGhhdCBzdXBwb3J0IG9ubHkgMngxCi1zYW1wbGluZyAoYWxzbyBjYWxsZWQgNDoyOjIgc2FtcGxpbmcpLiAgQ29tcGF0aWJpbGl0eSB3aXRoIHN1Y2ggZGVjb2RlcnMgY2FuCi1iZSBhY2hpZXZlZCBieSBzcGVjaWZ5aW5nICItc2FtcGxlIDJ4MSIuICBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCB1bmxlc3MKLXJlYWxseSBuZWNlc3NhcnksIHNpbmNlIGl0IGluY3JlYXNlcyBmaWxlIHNpemUgYW5kIGVuY29kaW5nL2RlY29kaW5nIHRpbWUKLXdpdGggdmVyeSBsaXR0bGUgcXVhbGl0eSBnYWluLgotCi0KLU11bHRpcGxlIFNjYW4gLyBQcm9ncmVzc2lvbiBDb250cm9sCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CeSBkZWZhdWx0LCBjanBlZyBlbWl0cyBhIHNpbmdsZS1zY2FuIHNlcXVlbnRpYWwgSlBFRyBmaWxlLiAgVGhlCi0tcHJvZ3Jlc3NpdmUgc3dpdGNoIGdlbmVyYXRlcyBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZSB1c2luZyBhIGRlZmF1bHQgc2VyaWVzCi1vZiBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzLiAgWW91IGNhbiBjcmVhdGUgbXVsdGlwbGUtc2NhbiBzZXF1ZW50aWFsIEpQRUcKLWZpbGVzIG9yIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMgd2l0aCBjdXN0b20gcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBieSB1c2luZwotdGhlIC1zY2FucyBzd2l0Y2g6Ci0KLQktc2NhbnMgZmlsZQlVc2UgdGhlIHNjYW4gc2VxdWVuY2UgZ2l2ZW4gaW4gdGhlIG5hbWVkIGZpbGUuCi0KLVRoZSBzcGVjaWZpZWQgZmlsZSBzaG91bGQgYmUgYSB0ZXh0IGZpbGUgY29udGFpbmluZyBhICJzY2FuIHNjcmlwdCIuCi1UaGUgc2NyaXB0IHNwZWNpZmllcyB0aGUgY29udGVudHMgYW5kIG9yZGVyaW5nIG9mIHRoZSBzY2FucyB0byBiZSBlbWl0dGVkLgotRWFjaCBlbnRyeSBpbiB0aGUgc2NyaXB0IGRlZmluZXMgb25lIHNjYW4uICBBIHNjYW4gZGVmaW5pdGlvbiBzcGVjaWZpZXMKLXRoZSBjb21wb25lbnRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzY2FuLCBhbmQgZm9yIHByb2dyZXNzaXZlIEpQRUcgaXQgYWxzbwotc3BlY2lmaWVzIHRoZSBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzIFNzLFNlLEFoLEFsIGZvciB0aGUgc2Nhbi4gIFNjYW4KLWRlZmluaXRpb25zIGFyZSBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyAoJzsnKS4gIEEgc2VtaWNvbG9uIGFmdGVyIHRoZSBsYXN0Ci1zY2FuIGRlZmluaXRpb24gaXMgb3B0aW9uYWwuCi0KLUVhY2ggc2NhbiBkZWZpbml0aW9uIGNvbnRhaW5zIG9uZSB0byBmb3VyIGNvbXBvbmVudCBpbmRleGVzLCBvcHRpb25hbGx5Ci1mb2xsb3dlZCBieSBhIGNvbG9uICgnOicpIGFuZCB0aGUgZm91ciBwcm9ncmVzc2l2ZS1KUEVHIHBhcmFtZXRlcnMuICBUaGUKLWNvbXBvbmVudCBpbmRleGVzIGRlbm90ZSB3aGljaCBjb2xvciBjb21wb25lbnQocykgYXJlIHRvIGJlIHRyYW5zbWl0dGVkIGluCi10aGUgc2Nhbi4gIENvbXBvbmVudHMgYXJlIG51bWJlcmVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUKLUpQRUcgU09GIG1hcmtlciwgd2l0aCB0aGUgZmlyc3QgY29tcG9uZW50IGJlaW5nIG51bWJlcmVkIDAuICAoTm90ZSB0aGF0IHRoZXNlCi1pbmRleGVzIGFyZSBub3QgdGhlICJjb21wb25lbnQgSUQiIGNvZGVzIGFzc2lnbmVkIHRvIHRoZSBjb21wb25lbnRzLCBqdXN0Ci1wb3NpdGlvbmFsIGluZGV4ZXMuKQotCi1UaGUgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBmb3IgZWFjaCBzY2FuIGFyZToKLQlTcwlaaWd6YWcgaW5kZXggb2YgZmlyc3QgY29lZmZpY2llbnQgaW5jbHVkZWQgaW4gc2NhbgotCVNlCVppZ3phZyBpbmRleCBvZiBsYXN0IGNvZWZmaWNpZW50IGluY2x1ZGVkIGluIHNjYW4KLQlBaAlaZXJvIGZvciBmaXJzdCBzY2FuIG9mIGEgY29lZmZpY2llbnQsIGVsc2UgQWwgb2YgcHJpb3Igc2NhbgotCUFsCVN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiBsb3cgYml0IHBvc2l0aW9uIGZvciBzY2FuCi1JZiB0aGUgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBhcmUgb21pdHRlZCwgdGhlIHZhbHVlcyAwLDYzLDAsMCBhcmUgdXNlZCwKLXByb2R1Y2luZyBhIHNlcXVlbnRpYWwgSlBFRyBmaWxlLiAgY2pwZWcgYXV0b21hdGljYWxseSBkZXRlcm1pbmVzIHdoZXRoZXIKLXRoZSBzY3JpcHQgcmVwcmVzZW50cyBhIHByb2dyZXNzaXZlIG9yIHNlcXVlbnRpYWwgZmlsZSwgYnkgb2JzZXJ2aW5nIHdoZXRoZXIKLVNzIGFuZCBTZSB2YWx1ZXMgb3RoZXIgdGhhbiAwIGFuZCA2MyBhcHBlYXIuICAoVGhlIC1wcm9ncmVzc2l2ZSBzd2l0Y2ggaXMKLW5vdCBuZWVkZWQgdG8gc3BlY2lmeSB0aGlzOyBpbiBmYWN0LCBpdCBpcyBpZ25vcmVkIHdoZW4gLXNjYW5zIGFwcGVhcnMuKQotVGhlIHNjYW4gc2NyaXB0IG11c3QgbWVldCB0aGUgSlBFRyByZXN0cmljdGlvbnMgb24gcHJvZ3Jlc3Npb24gc2VxdWVuY2VzLgotKGNqcGVnIGNoZWNrcyB0aGF0IHRoZSBzcGVjJ3MgcmVxdWlyZW1lbnRzIGFyZSBvYmV5ZWQuKQotCi1TY2FuIHNjcmlwdCBmaWxlcyBhcmUgZnJlZSBmb3JtYXQsIGluIHRoYXQgYXJiaXRyYXJ5IHdoaXRlc3BhY2UgY2FuIGFwcGVhcgotYmV0d2VlbiBudW1iZXJzIGFuZCBhcm91bmQgcHVuY3R1YXRpb24uICBBbHNvLCBjb21tZW50cyBjYW4gYmUgaW5jbHVkZWQ6IGEKLWNvbW1lbnQgc3RhcnRzIHdpdGggJyMnIGFuZCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuICBGb3IgYWRkaXRpb25hbAotbGVnaWJpbGl0eSwgY29tbWFzIG9yIGRhc2hlcyBjYW4gYmUgcGxhY2VkIGJldHdlZW4gdmFsdWVzLiAgKEFjdHVhbGx5LCBhbnkKLXNpbmdsZSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIgb3RoZXIgdGhhbiAnOicgb3IgJzsnIGNhbiBiZSBpbnNlcnRlZC4pICBGb3IKLWV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdHdvIHNjYW4gZGVmaW5pdGlvbnMgYXJlIGVxdWl2YWxlbnQ6Ci0JMCAxIDI6IDAgNjMgMCAwOwotCTAsMSwyIDogMC02MywgMCwwIDsKLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgc2NhbiBzY3JpcHQgdGhhdCBnZW5lcmF0ZXMgYSBwYXJ0aWFsbHkgaW50ZXJsZWF2ZWQKLXNlcXVlbnRpYWwgSlBFRyBmaWxlOgotCi0JMDsJCQkjIFkgb25seSBpbiBmaXJzdCBzY2FuCi0JMSAyOwkJCSMgQ2IgYW5kIENyIGluIHNlY29uZCBzY2FuCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIHByb2dyZXNzaXZlIHNjYW4gc2NyaXB0IHVzaW5nIG9ubHkgc3BlY3RyYWwgc2VsZWN0aW9uCi0obm8gc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKToKLQotCSMgSW50ZXJsZWF2ZWQgREMgc2NhbiBmb3IgWSxDYixDcjoKLQkwLDEsMjogMC0wLCAgIDAsIDAgOwotCSMgQUMgc2NhbnM6Ci0JMDogICAgIDEtMiwgICAwLCAwIDsJIyBGaXJzdCB0d28gWSBBQyBjb2VmZmljaWVudHMKLQkwOiAgICAgMy01LCAgIDAsIDAgOwkjIFRocmVlIG1vcmUKLQkxOiAgICAgMS02MywgIDAsIDAgOwkjIEFsbCBBQyBjb2VmZmljaWVudHMgZm9yIENiCi0JMjogICAgIDEtNjMsICAwLCAwIDsJIyBBbGwgQUMgY29lZmZpY2llbnRzIGZvciBDcgotCTA6ICAgICA2LTksICAgMCwgMCA7CSMgTW9yZSBZIGNvZWZmaWNpZW50cwotCTA6ICAgICAxMC02MywgMCwgMCA7CSMgUmVtYWluaW5nIFkgY29lZmZpY2llbnRzCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIHN1Y2Nlc3NpdmUtYXBwcm94aW1hdGlvbiBzY3JpcHQuICBUaGlzIGlzIGVxdWl2YWxlbnQKLXRvIHRoZSBkZWZhdWx0IHNjcmlwdCB1c2VkIGJ5ICJjanBlZyAtcHJvZ3Jlc3NpdmUiIGZvciBZQ2JDciBpbWFnZXM6Ci0KLQkjIEluaXRpYWwgREMgc2NhbiBmb3IgWSxDYixDciAobG93ZXN0IGJpdCBub3Qgc2VudCkKLQkwLDEsMjogMC0wLCAgIDAsIDEgOwotCSMgRmlyc3QgQUMgc2Nhbjogc2VuZCBmaXJzdCA1IFkgQUMgY29lZmZpY2llbnRzLCBtaW51cyAyIGxvd2VzdCBiaXRzOgotCTA6ICAgICAxLTUsICAgMCwgMiA7Ci0JIyBTZW5kIGFsbCBDcixDYiBBQyBjb2VmZmljaWVudHMsIG1pbnVzIGxvd2VzdCBiaXQ6Ci0JIyAoY2hyb21hIGRhdGEgaXMgdXN1YWxseSB0b28gc21hbGwgdG8gYmUgd29ydGggc3ViZGl2aWRpbmcgZnVydGhlcjsKLQkjICBidXQgbm90ZSB3ZSBzZW5kIENyIGZpcnN0IHNpbmNlIGV5ZSBpcyBsZWFzdCBzZW5zaXRpdmUgdG8gQ2IpCi0JMjogICAgIDEtNjMsICAwLCAxIDsKLQkxOiAgICAgMS02MywgIDAsIDEgOwotCSMgU2VuZCByZW1haW5pbmcgWSBBQyBjb2VmZmljaWVudHMsIG1pbnVzIDIgbG93ZXN0IGJpdHM6Ci0JMDogICAgIDYtNjMsICAwLCAyIDsKLQkjIFNlbmQgbmV4dC10by1sb3dlc3QgYml0IG9mIGFsbCBZIEFDIGNvZWZmaWNpZW50czoKLQkwOiAgICAgMS02MywgIDIsIDEgOwotCSMgQXQgdGhpcyBwb2ludCB3ZSd2ZSBzZW50IGFsbCBidXQgdGhlIGxvd2VzdCBiaXQgb2YgYWxsIGNvZWZmaWNpZW50cy4KLQkjIFNlbmQgbG93ZXN0IGJpdCBvZiBEQyBjb2VmZmljaWVudHMKLQkwLDEsMjogMC0wLCAgIDEsIDAgOwotCSMgU2VuZCBsb3dlc3QgYml0IG9mIEFDIGNvZWZmaWNpZW50cwotCTI6ICAgICAxLTYzLCAgMSwgMCA7Ci0JMTogICAgIDEtNjMsICAxLCAwIDsKLQkjIFkgQUMgbG93ZXN0IGJpdCBzY2FuIGlzIGxhc3Q7IGl0J3MgdXN1YWxseSB0aGUgbGFyZ2VzdCBzY2FuCi0JMDogICAgIDEtNjMsICAxLCAwIDsKLQotSXQgbWF5IGJlIHdvcnRoIHBvaW50aW5nIG91dCB0aGF0IHRoaXMgc2NyaXB0IGlzIHR1bmVkIGZvciBxdWFsaXR5IHNldHRpbmdzCi1vZiBhcm91bmQgNTAgdG8gNzUuICBGb3IgbG93ZXIgcXVhbGl0eSBzZXR0aW5ncywgeW91J2QgcHJvYmFibHkgd2FudCB0byB1c2UKLWEgc2NyaXB0IHdpdGggZmV3ZXIgc3RhZ2VzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAob3RoZXJ3aXNlIHRoZQotaW5pdGlhbCBzY2FucyB3aWxsIGJlIHJlYWxseSBiYWQpLiAgRm9yIGhpZ2hlciBxdWFsaXR5IHNldHRpbmdzLCB5b3UgbWlnaHQKLXdhbnQgdG8gdXNlIG1vcmUgc3RhZ2VzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAoc28gdGhhdCB0aGUgaW5pdGlhbAotc2NhbnMgYXJlIG5vdCB0b28gbGFyZ2UpLgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvd3JibXAuYyBiL2xpYmpwZWd0d3JwL3dyYm1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODNiMGYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvd3JibXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MiArMCwwIEBACi0vKgotICogd3JibXAuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gTWljcm9zb2Z0ICJCTVAiCi0gKiBmb3JtYXQgKE1TIFdpbmRvd3MgMy54IGFuZCBPUy8yIDEueCBmbGF2b3JzKS4KLSAqIEVpdGhlciA4LWJpdCBjb2xvcm1hcHBlZCBvciAyNC1iaXQgZnVsbC1jb2xvciBmb3JtYXQgY2FuIGJlIHdyaXR0ZW4uCi0gKiBObyBjb21wcmVzc2lvbiBpcyBzdXBwb3J0ZWQuCi0gKgotICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKLSAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bwotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgotICoKLSAqIFRoaXMgY29kZSBjb250cmlidXRlZCBieSBKYW1lcyBBcnRodXIgQm91Y2hlci4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotCi0jaWZkZWYgQk1QX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUbyBzdXBwb3J0IDEyLWJpdCBKUEVHIGRhdGEsIHdlJ2QgaGF2ZSB0byBzY2FsZSBvdXRwdXQgZG93biB0byA4IGJpdHMuCi0gKiBUaGlzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDgtYml0IEpTQU1QTEVzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0vKgotICogU2luY2UgQk1QIHN0b3JlcyBzY2FubGluZXMgYm90dG9tLXRvLXRvcCwgd2UgaGF2ZSB0byBpbnZlcnQgdGhlIGltYWdlCi0gKiBmcm9tIEpQRUcncyB0b3AtdG8tYm90dG9tIG9yZGVyLiAgVG8gZG8gdGhpcywgd2Ugc2F2ZSB0aGUgb3V0Z29pbmcgZGF0YQotICogaW4gYSB2aXJ0dWFsIGFycmF5IGR1cmluZyBwdXRfcGl4ZWxfcm93IGNhbGxzLCB0aGVuIGFjdHVhbGx5IGVtaXQgdGhlCi0gKiBCTVAgZmlsZSBkdXJpbmcgZmluaXNoX291dHB1dC4gIFRoZSB2aXJ0dWFsIGFycmF5IGNvbnRhaW5zIG9uZSBKU0FNUExFIHBlcgotICogcGl4ZWwgaWYgdGhlIG91dHB1dCBpcyBncmF5c2NhbGUgb3IgY29sb3JtYXBwZWQsIHRocmVlIGlmIGl0IGlzIGZ1bGwgY29sb3IuCi0gKi8KLQotLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGJvb2xlYW4gaXNfb3MyOwkJLyogc2F2ZXMgdGhlIE9TMiBmb3JtYXQgcmVxdWVzdCBmbGFnICovCi0KLSAganZpcnRfc2FycmF5X3B0ciB3aG9sZV9pbWFnZTsJLyogbmVlZGVkIHRvIHJldmVyc2Ugcm93IG9yZGVyICovCi0gIEpESU1FTlNJT04gZGF0YV93aWR0aDsJLyogSlNBTVBMRXMgcGVyIHJvdyAqLwotICBKRElNRU5TSU9OIHJvd193aWR0aDsJCS8qIHBoeXNpY2FsIHdpZHRoIG9mIG9uZSByb3cgaW4gdGhlIEJNUCBmaWxlICovCi0gIGludCBwYWRfYnl0ZXM7CQkvKiBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBuZWVkZWQgcGVyIHJvdyAqLwotICBKRElNRU5TSU9OIGN1cl9vdXRwdXRfcm93OwkvKiBuZXh0IHJvdyMgdG8gd3JpdGUgdG8gdmlydHVhbCBhcnJheSAqLwotfSBibXBfZGVzdF9zdHJ1Y3Q7Ci0KLXR5cGVkZWYgYm1wX2Rlc3Rfc3RydWN0ICogYm1wX2Rlc3RfcHRyOwotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1MT0NBTCh2b2lkKSB3cml0ZV9jb2xvcm1hcAotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm1wX2Rlc3RfcHRyIGRlc3QsCi0JICAgICBpbnQgbWFwX2NvbG9ycywgaW50IG1hcF9lbnRyeV9zaXplKSk7Ci0KLQotLyoKLSAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YS4KLSAqIEluIHRoaXMgbW9kdWxlIHJvd3Nfc3VwcGxpZWQgd2lsbCBhbHdheXMgYmUgMS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciB3cml0aW5nIDI0LWJpdCBwaXhlbHMgKi8KLXsKLSAgYm1wX2Rlc3RfcHRyIGRlc3QgPSAoYm1wX2Rlc3RfcHRyKSBkaW5mbzsKLSAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBpbnQgcGFkOwotCi0gIC8qIEFjY2VzcyBuZXh0IHJvdyBpbiB2aXJ0dWFsIGFycmF5ICovCi0gIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+d2hvbGVfaW1hZ2UsCi0gICAgIGRlc3QtPmN1cl9vdXRwdXRfcm93LCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7Ci0gIGRlc3QtPmN1cl9vdXRwdXRfcm93Kys7Ci0KLSAgLyogVHJhbnNmZXIgZGF0YS4gIE5vdGUgZGVzdGluYXRpb24gdmFsdWVzIG11c3QgYmUgaW4gQkdSIG9yZGVyCi0gICAqIChldmVuIHRob3VnaCBNaWNyb3NvZnQncyBvd24gZG9jdW1lbnRzIHNheSB0aGUgb3Bwb3NpdGUpLgotICAgKi8KLSAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBvdXRwdHIgPSBpbWFnZV9wdHJbMF07Ci0gIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICBvdXRwdHJbMl0gPSAqaW5wdHIrKzsJLyogY2FuIG9taXQgR0VUSlNBTVBMRSgpIHNhZmVseSAqLwotICAgIG91dHB0clsxXSA9ICppbnB0cisrOwotICAgIG91dHB0clswXSA9ICppbnB0cisrOwotICAgIG91dHB0ciArPSAzOwotICB9Ci0KLSAgLyogWmVybyBvdXQgdGhlIHBhZCBieXRlcy4gKi8KLSAgcGFkID0gZGVzdC0+cGFkX2J5dGVzOwotICB3aGlsZSAoLS1wYWQgPj0gMCkKLSAgICAqb3V0cHRyKysgPSAwOwotfQotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9ncmF5X3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCSAgICAgICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIGdyYXlzY2FsZSBPUiBxdWFudGl6ZWQgY29sb3Igb3V0cHV0ICovCi17Ci0gIGJtcF9kZXN0X3B0ciBkZXN0ID0gKGJtcF9kZXN0X3B0cikgZGluZm87Ci0gIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgaW50IHBhZDsKLQotICAvKiBBY2Nlc3MgbmV4dCByb3cgaW4gdmlydHVhbCBhcnJheSAqLwotICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPndob2xlX2ltYWdlLAotICAgICBkZXN0LT5jdXJfb3V0cHV0X3JvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOwotICBkZXN0LT5jdXJfb3V0cHV0X3JvdysrOwotCi0gIC8qIFRyYW5zZmVyIGRhdGEuICovCi0gIGlucHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKLSAgb3V0cHRyID0gaW1hZ2VfcHRyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgKm91dHB0cisrID0gKmlucHRyKys7CS8qIGNhbiBvbWl0IEdFVEpTQU1QTEUoKSBzYWZlbHkgKi8KLSAgfQotCi0gIC8qIFplcm8gb3V0IHRoZSBwYWQgYnl0ZXMuICovCi0gIHBhZCA9IGRlc3QtPnBhZF9ieXRlczsKLSAgd2hpbGUgKC0tcGFkID49IDApCi0gICAgKm91dHB0cisrID0gMDsKLX0KLQotCi0vKgotICogU3RhcnR1cDogbm9ybWFsbHkgd3JpdGVzIHRoZSBmaWxlIGhlYWRlci4KLSAqIEluIHRoaXMgbW9kdWxlIHdlIG1heSBhcyB3ZWxsIHBvc3Rwb25lIGV2ZXJ5dGhpbmcgdW50aWwgZmluaXNoX291dHB1dC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X291dHB1dF9ibXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQotewotICAvKiBubyB3b3JrIGhlcmUgKi8KLX0KLQotCi0vKgotICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gKgotICogSGVyZSBpcyB3aGVyZSB3ZSByZWFsbHkgb3V0cHV0IHRoZSBCTVAgZmlsZS4KLSAqCi0gKiBGaXJzdCwgcm91dGluZXMgdG8gd3JpdGUgdGhlIFdpbmRvd3MgYW5kIE9TLzIgdmFyaWFudHMgb2YgdGhlIGZpbGUgaGVhZGVyLgotICovCi0KLUxPQ0FMKHZvaWQpCi13cml0ZV9ibXBfaGVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBibXBfZGVzdF9wdHIgZGVzdCkKLS8qIFdyaXRlIGEgV2luZG93cy1zdHlsZSBCTVAgZmlsZSBoZWFkZXIsIGluY2x1ZGluZyBjb2xvcm1hcCBpZiBuZWVkZWQgKi8KLXsKLSAgY2hhciBibXBmaWxlaGVhZGVyWzE0XTsKLSAgY2hhciBibXBpbmZvaGVhZGVyWzQwXTsKLSNkZWZpbmUgUFVUXzJCKGFycmF5LG9mZnNldCx2YWx1ZSkgIFwKLQkoYXJyYXlbb2Zmc2V0XSA9IChjaGFyKSAoKHZhbHVlKSAmIDB4RkYpLCBcCi0JIGFycmF5W29mZnNldCsxXSA9IChjaGFyKSAoKCh2YWx1ZSkgPj4gOCkgJiAweEZGKSkKLSNkZWZpbmUgUFVUXzRCKGFycmF5LG9mZnNldCx2YWx1ZSkgIFwKLQkoYXJyYXlbb2Zmc2V0XSA9IChjaGFyKSAoKHZhbHVlKSAmIDB4RkYpLCBcCi0JIGFycmF5W29mZnNldCsxXSA9IChjaGFyKSAoKCh2YWx1ZSkgPj4gOCkgJiAweEZGKSwgXAotCSBhcnJheVtvZmZzZXQrMl0gPSAoY2hhcikgKCgodmFsdWUpID4+IDE2KSAmIDB4RkYpLCBcCi0JIGFycmF5W29mZnNldCszXSA9IChjaGFyKSAoKCh2YWx1ZSkgPj4gMjQpICYgMHhGRikpCi0gIElOVDMyIGhlYWRlcnNpemUsIGJmU2l6ZTsKLSAgaW50IGJpdHNfcGVyX3BpeGVsLCBjbWFwX2VudHJpZXM7Ci0KLSAgLyogQ29tcHV0ZSBjb2xvcm1hcCBzaXplIGFuZCB0b3RhbCBmaWxlIHNpemUgKi8KLSAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgewotICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7Ci0gICAgICAvKiBDb2xvcm1hcHBlZCBSR0IgKi8KLSAgICAgIGJpdHNfcGVyX3BpeGVsID0gODsKLSAgICAgIGNtYXBfZW50cmllcyA9IDI1NjsKLSAgICB9IGVsc2UgewotICAgICAgLyogVW5xdWFudGl6ZWQsIGZ1bGwgY29sb3IgUkdCICovCi0gICAgICBiaXRzX3Blcl9waXhlbCA9IDI0OwotICAgICAgY21hcF9lbnRyaWVzID0gMDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogR3JheXNjYWxlIG91dHB1dC4gIFdlIG5lZWQgdG8gZmFrZSBhIDI1Ni1lbnRyeSBjb2xvcm1hcC4gKi8KLSAgICBiaXRzX3Blcl9waXhlbCA9IDg7Ci0gICAgY21hcF9lbnRyaWVzID0gMjU2OwotICB9Ci0gIC8qIEZpbGUgc2l6ZSAqLwotICBoZWFkZXJzaXplID0gMTQgKyA0MCArIGNtYXBfZW50cmllcyAqIDQ7IC8qIEhlYWRlciBhbmQgY29sb3JtYXAgKi8KLSAgYmZTaXplID0gaGVhZGVyc2l6ZSArIChJTlQzMikgZGVzdC0+cm93X3dpZHRoICogKElOVDMyKSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLSAgCi0gIC8qIFNldCB1bnVzZWQgZmllbGRzIG9mIGhlYWRlciB0byAwICovCi0gIE1FTVpFUk8oYm1wZmlsZWhlYWRlciwgU0laRU9GKGJtcGZpbGVoZWFkZXIpKTsKLSAgTUVNWkVSTyhibXBpbmZvaGVhZGVyLCBTSVpFT0YoYm1waW5mb2hlYWRlcikpOwotCi0gIC8qIEZpbGwgdGhlIGZpbGUgaGVhZGVyICovCi0gIGJtcGZpbGVoZWFkZXJbMF0gPSAweDQyOwkvKiBmaXJzdCAyIGJ5dGVzIGFyZSBBU0NJSSAnQicsICdNJyAqLwotICBibXBmaWxlaGVhZGVyWzFdID0gMHg0RDsKLSAgUFVUXzRCKGJtcGZpbGVoZWFkZXIsIDIsIGJmU2l6ZSk7IC8qIGJmU2l6ZSAqLwotICAvKiB3ZSBsZWF2ZSBiZlJlc2VydmVkMSAmIGJmUmVzZXJ2ZWQyID0gMCAqLwotICBQVVRfNEIoYm1wZmlsZWhlYWRlciwgMTAsIGhlYWRlcnNpemUpOyAvKiBiZk9mZkJpdHMgKi8KLQotICAvKiBGaWxsIHRoZSBpbmZvIGhlYWRlciAoTWljcm9zb2Z0IGNhbGxzIHRoaXMgYSBCSVRNQVBJTkZPSEVBREVSKSAqLwotICBQVVRfMkIoYm1waW5mb2hlYWRlciwgMCwgNDApOwkvKiBiaVNpemUgKi8KLSAgUFVUXzRCKGJtcGluZm9oZWFkZXIsIDQsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOyAvKiBiaVdpZHRoICovCi0gIFBVVF80QihibXBpbmZvaGVhZGVyLCA4LCBjaW5mby0+b3V0cHV0X2hlaWdodCk7IC8qIGJpSGVpZ2h0ICovCi0gIFBVVF8yQihibXBpbmZvaGVhZGVyLCAxMiwgMSk7CS8qIGJpUGxhbmVzIC0gbXVzdCBiZSAxICovCi0gIFBVVF8yQihibXBpbmZvaGVhZGVyLCAxNCwgYml0c19wZXJfcGl4ZWwpOyAvKiBiaUJpdENvdW50ICovCi0gIC8qIHdlIGxlYXZlIGJpQ29tcHJlc3Npb24gPSAwLCBmb3Igbm9uZSAqLwotICAvKiB3ZSBsZWF2ZSBiaVNpemVJbWFnZSA9IDA7IHRoaXMgaXMgY29ycmVjdCBmb3IgdW5jb21wcmVzc2VkIGRhdGEgKi8KLSAgaWYgKGNpbmZvLT5kZW5zaXR5X3VuaXQgPT0gMikgeyAvKiBpZiBoYXZlIGRlbnNpdHkgaW4gZG90cy9jbSwgdGhlbiAqLwotICAgIFBVVF80QihibXBpbmZvaGVhZGVyLCAyNCwgKElOVDMyKSAoY2luZm8tPlhfZGVuc2l0eSoxMDApKTsgLyogWFBlbHMvTSAqLwotICAgIFBVVF80QihibXBpbmZvaGVhZGVyLCAyOCwgKElOVDMyKSAoY2luZm8tPllfZGVuc2l0eSoxMDApKTsgLyogWFBlbHMvTSAqLwotICB9Ci0gIFBVVF8yQihibXBpbmZvaGVhZGVyLCAzMiwgY21hcF9lbnRyaWVzKTsgLyogYmlDbHJVc2VkICovCi0gIC8qIHdlIGxlYXZlIGJpQ2xySW1wb3J0YW50ID0gMCAqLwotCi0gIGlmIChKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgYm1wZmlsZWhlYWRlciwgMTQpICE9IChzaXplX3QpIDE0KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci0gIGlmIChKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgYm1waW5mb2hlYWRlciwgNDApICE9IChzaXplX3QpIDQwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci0KLSAgaWYgKGNtYXBfZW50cmllcyA+IDApCi0gICAgd3JpdGVfY29sb3JtYXAoY2luZm8sIGRlc3QsIGNtYXBfZW50cmllcywgNCk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLXdyaXRlX29zMl9oZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJtcF9kZXN0X3B0ciBkZXN0KQotLyogV3JpdGUgYW4gT1MyLXN0eWxlIEJNUCBmaWxlIGhlYWRlciwgaW5jbHVkaW5nIGNvbG9ybWFwIGlmIG5lZWRlZCAqLwotewotICBjaGFyIGJtcGZpbGVoZWFkZXJbMTRdOwotICBjaGFyIGJtcGNvcmVoZWFkZXJbMTJdOwotICBJTlQzMiBoZWFkZXJzaXplLCBiZlNpemU7Ci0gIGludCBiaXRzX3Blcl9waXhlbCwgY21hcF9lbnRyaWVzOwotCi0gIC8qIENvbXB1dGUgY29sb3JtYXAgc2l6ZSBhbmQgdG90YWwgZmlsZSBzaXplICovCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLSAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgewotICAgICAgLyogQ29sb3JtYXBwZWQgUkdCICovCi0gICAgICBiaXRzX3Blcl9waXhlbCA9IDg7Ci0gICAgICBjbWFwX2VudHJpZXMgPSAyNTY7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFVucXVhbnRpemVkLCBmdWxsIGNvbG9yIFJHQiAqLwotICAgICAgYml0c19wZXJfcGl4ZWwgPSAyNDsKLSAgICAgIGNtYXBfZW50cmllcyA9IDA7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIEdyYXlzY2FsZSBvdXRwdXQuICBXZSBuZWVkIHRvIGZha2UgYSAyNTYtZW50cnkgY29sb3JtYXAuICovCi0gICAgYml0c19wZXJfcGl4ZWwgPSA4OwotICAgIGNtYXBfZW50cmllcyA9IDI1NjsKLSAgfQotICAvKiBGaWxlIHNpemUgKi8KLSAgaGVhZGVyc2l6ZSA9IDE0ICsgMTIgKyBjbWFwX2VudHJpZXMgKiAzOyAvKiBIZWFkZXIgYW5kIGNvbG9ybWFwICovCi0gIGJmU2l6ZSA9IGhlYWRlcnNpemUgKyAoSU5UMzIpIGRlc3QtPnJvd193aWR0aCAqIChJTlQzMikgY2luZm8tPm91dHB1dF9oZWlnaHQ7Ci0gIAotICAvKiBTZXQgdW51c2VkIGZpZWxkcyBvZiBoZWFkZXIgdG8gMCAqLwotICBNRU1aRVJPKGJtcGZpbGVoZWFkZXIsIFNJWkVPRihibXBmaWxlaGVhZGVyKSk7Ci0gIE1FTVpFUk8oYm1wY29yZWhlYWRlciwgU0laRU9GKGJtcGNvcmVoZWFkZXIpKTsKLQotICAvKiBGaWxsIHRoZSBmaWxlIGhlYWRlciAqLwotICBibXBmaWxlaGVhZGVyWzBdID0gMHg0MjsJLyogZmlyc3QgMiBieXRlcyBhcmUgQVNDSUkgJ0InLCAnTScgKi8KLSAgYm1wZmlsZWhlYWRlclsxXSA9IDB4NEQ7Ci0gIFBVVF80QihibXBmaWxlaGVhZGVyLCAyLCBiZlNpemUpOyAvKiBiZlNpemUgKi8KLSAgLyogd2UgbGVhdmUgYmZSZXNlcnZlZDEgJiBiZlJlc2VydmVkMiA9IDAgKi8KLSAgUFVUXzRCKGJtcGZpbGVoZWFkZXIsIDEwLCBoZWFkZXJzaXplKTsgLyogYmZPZmZCaXRzICovCi0KLSAgLyogRmlsbCB0aGUgaW5mbyBoZWFkZXIgKE1pY3Jvc29mdCBjYWxscyB0aGlzIGEgQklUTUFQQ09SRUhFQURFUikgKi8KLSAgUFVUXzJCKGJtcGNvcmVoZWFkZXIsIDAsIDEyKTsJLyogYmNTaXplICovCi0gIFBVVF8yQihibXBjb3JlaGVhZGVyLCA0LCBjaW5mby0+b3V0cHV0X3dpZHRoKTsgLyogYmNXaWR0aCAqLwotICBQVVRfMkIoYm1wY29yZWhlYWRlciwgNiwgY2luZm8tPm91dHB1dF9oZWlnaHQpOyAvKiBiY0hlaWdodCAqLwotICBQVVRfMkIoYm1wY29yZWhlYWRlciwgOCwgMSk7CS8qIGJjUGxhbmVzIC0gbXVzdCBiZSAxICovCi0gIFBVVF8yQihibXBjb3JlaGVhZGVyLCAxMCwgYml0c19wZXJfcGl4ZWwpOyAvKiBiY0JpdENvdW50ICovCi0KLSAgaWYgKEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBibXBmaWxlaGVhZGVyLCAxNCkgIT0gKHNpemVfdCkgMTQpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLSAgaWYgKEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBibXBjb3JlaGVhZGVyLCAxMikgIT0gKHNpemVfdCkgMTIpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLQotICBpZiAoY21hcF9lbnRyaWVzID4gMCkKLSAgICB3cml0ZV9jb2xvcm1hcChjaW5mbywgZGVzdCwgY21hcF9lbnRyaWVzLCAzKTsKLX0KLQotCi0vKgotICogV3JpdGUgdGhlIGNvbG9ybWFwLgotICogV2luZG93cyB1c2VzIEJHUjAgbWFwIGVudHJpZXM7IE9TLzIgdXNlcyBCR1IgZW50cmllcy4KLSAqLwotCi1MT0NBTCh2b2lkKQotd3JpdGVfY29sb3JtYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJtcF9kZXN0X3B0ciBkZXN0LAotCQlpbnQgbWFwX2NvbG9ycywgaW50IG1hcF9lbnRyeV9zaXplKQotewotICBKU0FNUEFSUkFZIGNvbG9ybWFwID0gY2luZm8tPmNvbG9ybWFwOwotICBpbnQgbnVtX2NvbG9ycyA9IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsKLSAgRklMRSAqIG91dGZpbGUgPSBkZXN0LT5wdWIub3V0cHV0X2ZpbGU7Ci0gIGludCBpOwotCi0gIGlmIChjb2xvcm1hcCAhPSBOVUxMKSB7Ci0gICAgaWYgKGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9PSAzKSB7Ci0gICAgICAvKiBOb3JtYWwgY2FzZSB3aXRoIFJHQiBjb2xvcm1hcCAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb2xvcnM7IGkrKykgewotCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFsyXVtpXSksIG91dGZpbGUpOwotCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFsxXVtpXSksIG91dGZpbGUpOwotCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFswXVtpXSksIG91dGZpbGUpOwotCWlmIChtYXBfZW50cnlfc2l6ZSA9PSA0KQotCSAgcHV0YygwLCBvdXRmaWxlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogR3JheXNjYWxlIGNvbG9ybWFwIChvbmx5IGhhcHBlbnMgd2l0aCBncmF5c2NhbGUgcXVhbnRpemF0aW9uKSAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb2xvcnM7IGkrKykgewotCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFswXVtpXSksIG91dGZpbGUpOwotCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFswXVtpXSksIG91dGZpbGUpOwotCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFswXVtpXSksIG91dGZpbGUpOwotCWlmIChtYXBfZW50cnlfc2l6ZSA9PSA0KQotCSAgcHV0YygwLCBvdXRmaWxlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogSWYgbm8gY29sb3JtYXAsIG11c3QgYmUgZ3JheXNjYWxlIGRhdGEuICBHZW5lcmF0ZSBhIGxpbmVhciAibWFwIi4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgIHB1dGMoaSwgb3V0ZmlsZSk7Ci0gICAgICBwdXRjKGksIG91dGZpbGUpOwotICAgICAgcHV0YyhpLCBvdXRmaWxlKTsKLSAgICAgIGlmIChtYXBfZW50cnlfc2l6ZSA9PSA0KQotCXB1dGMoMCwgb3V0ZmlsZSk7Ci0gICAgfQotICB9Ci0gIC8qIFBhZCBjb2xvcm1hcCB3aXRoIHplcm9zIHRvIGVuc3VyZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbG9ybWFwIGVudHJpZXMgKi8gCi0gIGlmIChpID4gbWFwX2NvbG9ycykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9UT09fTUFOWV9DT0xPUlMsIGkpOwotICBmb3IgKDsgaSA8IG1hcF9jb2xvcnM7IGkrKykgewotICAgIHB1dGMoMCwgb3V0ZmlsZSk7Ci0gICAgcHV0YygwLCBvdXRmaWxlKTsKLSAgICBwdXRjKDAsIG91dGZpbGUpOwotICAgIGlmIChtYXBfZW50cnlfc2l6ZSA9PSA0KQotICAgICAgcHV0YygwLCBvdXRmaWxlKTsKLSAgfQotfQotCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX291dHB1dF9ibXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQotewotICBibXBfZGVzdF9wdHIgZGVzdCA9IChibXBfZGVzdF9wdHIpIGRpbmZvOwotICByZWdpc3RlciBGSUxFICogb3V0ZmlsZSA9IGRlc3QtPnB1Yi5vdXRwdXRfZmlsZTsKLSAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGRhdGFfcHRyOwotICBKRElNRU5TSU9OIHJvdzsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKLQotICAvKiBXcml0ZSB0aGUgaGVhZGVyIGFuZCBjb2xvcm1hcCAqLwotICBpZiAoZGVzdC0+aXNfb3MyKQotICAgIHdyaXRlX29zMl9oZWFkZXIoY2luZm8sIGRlc3QpOwotICBlbHNlCi0gICAgd3JpdGVfYm1wX2hlYWRlcihjaW5mbywgZGVzdCk7Ci0KLSAgLyogV3JpdGUgdGhlIGZpbGUgYm9keSBmcm9tIG91ciB2aXJ0dWFsIGFycmF5ICovCi0gIGZvciAocm93ID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7IHJvdyA+IDA7IHJvdy0tKSB7Ci0gICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKLSAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gKGxvbmcpIChjaW5mby0+b3V0cHV0X2hlaWdodCAtIHJvdyk7Ci0gICAgICBwcm9ncmVzcy0+cHViLnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQ7Ci0gICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICB9Ci0gICAgaW1hZ2VfcHRyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPndob2xlX2ltYWdlLCByb3ctMSwgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKLSAgICBkYXRhX3B0ciA9IGltYWdlX3B0clswXTsKLSAgICBmb3IgKGNvbCA9IGRlc3QtPnJvd193aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAgIHB1dGMoR0VUSlNBTVBMRSgqZGF0YV9wdHIpLCBvdXRmaWxlKTsKLSAgICAgIGRhdGFfcHRyKys7Ci0gICAgfQotICB9Ci0gIGlmIChwcm9ncmVzcyAhPSBOVUxMKQotICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBvdXRwdXQgZmlsZSBPSyAqLwotICBmZmx1c2gob3V0ZmlsZSk7Ci0gIGlmIChmZXJyb3Iob3V0ZmlsZSkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgQk1QIGZvcm1hdCBvdXRwdXQuCi0gKi8KLQotR0xPQkFMKGRqcGVnX2Rlc3RfcHRyKQotamluaXRfd3JpdGVfYm1wIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzX29zMikKLXsKLSAgYm1wX2Rlc3RfcHRyIGRlc3Q7Ci0gIEpESU1FTlNJT04gcm93X3dpZHRoOwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCwgZmlsbCBpbiBtZXRob2QgcG9pbnRlcnMgKi8KLSAgZGVzdCA9IChibXBfZGVzdF9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKGJtcF9kZXN0X3N0cnVjdCkpOwotICBkZXN0LT5wdWIuc3RhcnRfb3V0cHV0ID0gc3RhcnRfb3V0cHV0X2JtcDsKLSAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X2JtcDsKLSAgZGVzdC0+aXNfb3MyID0gaXNfb3MyOwotCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKLSAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZ3JheV9yb3dzOwotICB9IGVsc2UgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgewotICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQotICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2dyYXlfcm93czsKLSAgICBlbHNlCi0gICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfcGl4ZWxfcm93czsKLSAgfSBlbHNlIHsKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9DT0xPUlNQQUNFKTsKLSAgfQotCi0gIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KLSAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKLQotICAvKiBEZXRlcm1pbmUgd2lkdGggb2Ygcm93cyBpbiB0aGUgQk1QIGZpbGUgKHBhZGRlZCB0byA0LWJ5dGUgYm91bmRhcnkpLiAqLwotICByb3dfd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dHB1dF9jb21wb25lbnRzOwotICBkZXN0LT5kYXRhX3dpZHRoID0gcm93X3dpZHRoOwotICB3aGlsZSAoKHJvd193aWR0aCAmIDMpICE9IDApIHJvd193aWR0aCsrOwotICBkZXN0LT5yb3dfd2lkdGggPSByb3dfd2lkdGg7Ci0gIGRlc3QtPnBhZF9ieXRlcyA9IChpbnQpIChyb3dfd2lkdGggLSBkZXN0LT5kYXRhX3dpZHRoKTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgaW52ZXJzaW9uIGFycmF5LCBwcmVwYXJlIGZvciB3cml0ZSBwYXNzICovCi0gIGRlc3QtPndob2xlX2ltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAotICAgICByb3dfd2lkdGgsIGNpbmZvLT5vdXRwdXRfaGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7Ci0gIGRlc3QtPmN1cl9vdXRwdXRfcm93ID0gMDsKLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCi0gIH0KLQotICAvKiBDcmVhdGUgZGVjb21wcmVzc29yIG91dHB1dCBidWZmZXIuICovCi0gIGRlc3QtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCByb3dfd2lkdGgsIChKRElNRU5TSU9OKSAxKTsKLSAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotCi0gIHJldHVybiAoZGpwZWdfZGVzdF9wdHIpIGRlc3Q7Ci19Ci0KLSNlbmRpZiAvKiBCTVBfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC93cmdpZi5jIGIvbGlianBlZ3R3cnAvd3JnaWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlODMyOC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC93cmdpZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qCi0gKiB3cmdpZi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgb3V0cHV0IGltYWdlcyBpbiBHSUYgZm9ybWF0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTk9URTogdG8gYXZvaWQgZW50YW5nbGVtZW50cyB3aXRoIFVuaXN5cycgcGF0ZW50IG9uIExaVyBjb21wcmVzc2lvbiwgICAqCi0gKiB0aGlzIGNvZGUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gb3V0cHV0ICJ1bmNvbXByZXNzZWQgR0lGIiBmaWxlcy4gICAgICAgICoKLSAqIFRoZXJlIGlzIG5vIHRyYWNlIG9mIHRoZSBMWlcgYWxnb3JpdGhtIGluIHRoaXMgZmlsZS4gICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKLSAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bwotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgotICovCi0KLS8qCi0gKiBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiBwcG10b2dpZiBmcm9tIHRoZSBQQk1QTFVTIGRpc3RyaWJ1dGlvbgotICogb2YgRmViLiAxOTkxLiAgVGhhdCBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IG5vdGljZToKLSAqICAgIEJhc2VkIG9uIEdJRkVOQ09ERSBieSBEYXZpZCBSb3dsZXkgPG1nYXJkaUB3YXRkc2N1LndhdGVybG9vLmVkdT4uCi0gKiAgICBMZW1wZWwtWml2IGNvbXByZXNzaW9uIGJhc2VkIG9uICJjb21wcmVzcyIgYnkgU3BlbmNlciBXLiBUaG9tYXMgZXQgYWwuCi0gKiAgICBDb3B5cmlnaHQgKEMpIDE5ODkgYnkgSmVmIFBvc2thbnplci4KLSAqICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogICAgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAotICogICAgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqICAgIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqICAgIGRvY3VtZW50YXRpb24uICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yCi0gKiAgICBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFdlIGFyZSBhbHNvIHJlcXVpcmVkIHRvIHN0YXRlIHRoYXQKLSAqICAgICJUaGUgR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0KGMpIGlzIHRoZSBDb3B5cmlnaHQgcHJvcGVydHkgb2YKLSAqICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiBHSUYoc20pIGlzIGEgU2VydmljZSBNYXJrIHByb3BlcnR5IG9mCi0gKiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4iCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLQotI2lmZGVmIEdJRl9TVVBQT1JURUQKLQotCi0vKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QgZGpwZWdfZGVzdF9zdHJ1Y3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgal9kZWNvbXByZXNzX3B0ciBjaW5mbzsJLyogYmFjayBsaW5rIHNhdmVzIHBhc3Npbmcgc2VwYXJhdGUgcGFybSAqLwotCi0gIC8qIFN0YXRlIGZvciBwYWNraW5nIHZhcmlhYmxlLXdpZHRoIGNvZGVzIGludG8gYSBiaXRzdHJlYW0gKi8KLSAgaW50IG5fYml0czsJCQkvKiBjdXJyZW50IG51bWJlciBvZiBiaXRzL2NvZGUgKi8KLSAgaW50IG1heGNvZGU7CQkJLyogbWF4aW11bSBjb2RlLCBnaXZlbiBuX2JpdHMgKi8KLSAgSU5UMzIgY3VyX2FjY3VtOwkJLyogaG9sZHMgYml0cyBub3QgeWV0IG91dHB1dCAqLwotICBpbnQgY3VyX2JpdHM7CQkJLyogIyBvZiBiaXRzIGluIGN1cl9hY2N1bSAqLwotCi0gIC8qIFN0YXRlIGZvciBHSUYgY29kZSBhc3NpZ25tZW50ICovCi0gIGludCBDbGVhckNvZGU7CQkvKiBjbGVhciBjb2RlIChkb2Vzbid0IGNoYW5nZSkgKi8KLSAgaW50IEVPRkNvZGU7CQkJLyogRU9GIGNvZGUgKGRpdHRvKSAqLwotICBpbnQgY29kZV9jb3VudGVyOwkJLyogY291bnRzIG91dHB1dCBzeW1ib2xzICovCi0KLSAgLyogR0lGIGRhdGEgcGFja2V0IGNvbnN0cnVjdGlvbiBidWZmZXIgKi8KLSAgaW50IGJ5dGVzaW5wa3Q7CQkvKiAjIG9mIGJ5dGVzIGluIGN1cnJlbnQgcGFja2V0ICovCi0gIGNoYXIgcGFja2V0YnVmWzI1Nl07CQkvKiB3b3Jrc3BhY2UgZm9yIGFjY3VtdWxhdGluZyBwYWNrZXQgKi8KLQotfSBnaWZfZGVzdF9zdHJ1Y3Q7Ci0KLXR5cGVkZWYgZ2lmX2Rlc3Rfc3RydWN0ICogZ2lmX2Rlc3RfcHRyOwotCi0vKiBMYXJnZXN0IHZhbHVlIHRoYXQgd2lsbCBmaXQgaW4gTiBiaXRzICovCi0jZGVmaW5lIE1BWENPREUobl9iaXRzKQkoKDEgPDwgKG5fYml0cykpIC0gMSkKLQotCi0vKgotICogUm91dGluZXMgdG8gcGFja2FnZSBmaW5pc2hlZCBkYXRhIGJ5dGVzIGludG8gR0lGIGRhdGEgYmxvY2tzLgotICogQSBkYXRhIGJsb2NrIGNvbnNpc3RzIG9mIGEgY291bnQgYnl0ZSAoMS4uMjU1KSBhbmQgdGhhdCBtYW55IGRhdGEgYnl0ZXMuCi0gKi8KLQotTE9DQUwodm9pZCkKLWZsdXNoX3BhY2tldCAoZ2lmX2Rlc3RfcHRyIGRpbmZvKQotLyogZmx1c2ggYW55IGFjY3VtdWxhdGVkIGRhdGEgKi8KLXsKLSAgaWYgKGRpbmZvLT5ieXRlc2lucGt0ID4gMCkgewkvKiBuZXZlciB3cml0ZSB6ZXJvLWxlbmd0aCBwYWNrZXQgKi8KLSAgICBkaW5mby0+cGFja2V0YnVmWzBdID0gKGNoYXIpIGRpbmZvLT5ieXRlc2lucGt0Kys7Ci0gICAgaWYgKEpGV1JJVEUoZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSwgZGluZm8tPnBhY2tldGJ1ZiwgZGluZm8tPmJ5dGVzaW5wa3QpCi0JIT0gKHNpemVfdCkgZGluZm8tPmJ5dGVzaW5wa3QpCi0gICAgICBFUlJFWElUKGRpbmZvLT5jaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLSAgICBkaW5mby0+Ynl0ZXNpbnBrdCA9IDA7Ci0gIH0KLX0KLQotCi0vKiBBZGQgYSBjaGFyYWN0ZXIgdG8gY3VycmVudCBwYWNrZXQ7IGZsdXNoIHRvIGRpc2sgaWYgbmVjZXNzYXJ5ICovCi0jZGVmaW5lIENIQVJfT1VUKGRpbmZvLGMpICBcCi0JeyAoZGluZm8pLT5wYWNrZXRidWZbKysoZGluZm8pLT5ieXRlc2lucGt0XSA9IChjaGFyKSAoYyk7ICBcCi0JICAgIGlmICgoZGluZm8pLT5ieXRlc2lucGt0ID49IDI1NSkgIFwKLQkgICAgICBmbHVzaF9wYWNrZXQoZGluZm8pOyAgXAotCX0KLQotCi0vKiBSb3V0aW5lIHRvIGNvbnZlcnQgdmFyaWFibGUtd2lkdGggY29kZXMgaW50byBhIGJ5dGUgc3RyZWFtICovCi0KLUxPQ0FMKHZvaWQpCi1vdXRwdXQgKGdpZl9kZXN0X3B0ciBkaW5mbywgaW50IGNvZGUpCi0vKiBFbWl0IGEgY29kZSBvZiBuX2JpdHMgYml0cyAqLwotLyogVXNlcyBjdXJfYWNjdW0gYW5kIGN1cl9iaXRzIHRvIHJlYmxvY2sgaW50byA4LWJpdCBieXRlcyAqLwotewotICBkaW5mby0+Y3VyX2FjY3VtIHw9ICgoSU5UMzIpIGNvZGUpIDw8IGRpbmZvLT5jdXJfYml0czsKLSAgZGluZm8tPmN1cl9iaXRzICs9IGRpbmZvLT5uX2JpdHM7Ci0KLSAgd2hpbGUgKGRpbmZvLT5jdXJfYml0cyA+PSA4KSB7Ci0gICAgQ0hBUl9PVVQoZGluZm8sIGRpbmZvLT5jdXJfYWNjdW0gJiAweEZGKTsKLSAgICBkaW5mby0+Y3VyX2FjY3VtID4+PSA4OwotICAgIGRpbmZvLT5jdXJfYml0cyAtPSA4OwotICB9Ci19Ci0KLQotLyogVGhlIHBzZXVkby1jb21wcmVzc2lvbiBhbGdvcml0aG0uCi0gKgotICogSW4gdGhpcyBtb2R1bGUgd2Ugc2ltcGx5IG91dHB1dCBlYWNoIHBpeGVsIHZhbHVlIGFzIGEgc2VwYXJhdGUgc3ltYm9sOwotICogdGh1cywgbm8gY29tcHJlc3Npb24gb2NjdXJzLiAgSW4gZmFjdCwgdGhlcmUgaXMgZXhwYW5zaW9uIG9mIG9uZSBiaXQgcGVyCi0gKiBwaXhlbCwgYmVjYXVzZSB3ZSB1c2UgYSBzeW1ib2wgd2lkdGggb25lIGJpdCB3aWRlciB0aGFuIHRoZSBwaXhlbCB3aWR0aC4KLSAqCi0gKiBHSUYgb3JkaW5hcmlseSB1c2VzIHZhcmlhYmxlLXdpZHRoIHN5bWJvbHMsIGFuZCB0aGUgZGVjb2RlciB3aWxsIGV4cGVjdAotICogdG8gcmF0Y2hldCB1cCB0aGUgc3ltYm9sIHdpZHRoIGFmdGVyIGEgZml4ZWQgbnVtYmVyIG9mIHN5bWJvbHMuCi0gKiBUbyBzaW1wbGlmeSB0aGUgbG9naWMgYW5kIGtlZXAgdGhlIGV4cGFuc2lvbiBwZW5hbHR5IGRvd24sIHdlIGVtaXQgYQotICogR0lGIENsZWFyIGNvZGUgdG8gcmVzZXQgdGhlIGRlY29kZXIganVzdCBiZWZvcmUgdGhlIHdpZHRoIHdvdWxkIHJhdGNoZXQgdXAuCi0gKiBUaHVzLCBhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIG91dHB1dCBmaWxlIHdpbGwgaGF2ZSB0aGUgc2FtZSBiaXQgd2lkdGguCi0gKiBOb3RlIHRoYXQgZW1pdHRpbmcgdGhlIENsZWFyIGNvZGVzIGF0IHRoZSByaWdodCB0aW1lcyBpcyBhIG1lcmUgbWF0dGVyIG9mCi0gKiBjb3VudGluZyBvdXRwdXQgc3ltYm9scyBhbmQgaXMgaW4gbm8gd2F5IGRlcGVuZGVudCBvbiB0aGUgTFpXIHBhdGVudC4KLSAqCi0gKiBXaXRoIGEgc21hbGwgYmFzaWMgcGl4ZWwgd2lkdGggKGxvdyBjb2xvciBjb3VudCksIENsZWFyIGNvZGVzIHdpbGwgYmUKLSAqIG5lZWRlZCB2ZXJ5IGZyZXF1ZW50bHksIGNhdXNpbmcgdGhlIGZpbGUgdG8gZXhwYW5kIGV2ZW4gbW9yZS4gIFNvIHRoaXMKLSAqIHNpbXBsaXN0aWMgYXBwcm9hY2ggd291bGRuJ3Qgd29yayB0b28gd2VsbCBvbiBiaWxldmVsIGltYWdlcywgZm9yIGV4YW1wbGUuCi0gKiBCdXQgZm9yIG91dHB1dCBvZiBKUEVHIGNvbnZlcnNpb25zIHRoZSBwaXhlbCB3aWR0aCB3aWxsIHVzdWFsbHkgYmUgOCBiaXRzCi0gKiAoMTI5IHRvIDI1NiBjb2xvcnMpLCBzbyB0aGUgb3ZlcmhlYWQgYWRkZWQgYnkgQ2xlYXIgc3ltYm9scyBpcyBvbmx5IGFib3V0Ci0gKiBvbmUgc3ltYm9sIGluIGV2ZXJ5IDI1Ni4KLSAqLwotCi1MT0NBTCh2b2lkKQotY29tcHJlc3NfaW5pdCAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCBpbnQgaV9iaXRzKQotLyogSW5pdGlhbGl6ZSBwc2V1ZG8tY29tcHJlc3NvciAqLwotewotICAvKiBpbml0IGFsbCB0aGUgc3RhdGUgdmFyaWFibGVzICovCi0gIGRpbmZvLT5uX2JpdHMgPSBpX2JpdHM7Ci0gIGRpbmZvLT5tYXhjb2RlID0gTUFYQ09ERShkaW5mby0+bl9iaXRzKTsKLSAgZGluZm8tPkNsZWFyQ29kZSA9ICgxIDw8IChpX2JpdHMgLSAxKSk7Ci0gIGRpbmZvLT5FT0ZDb2RlID0gZGluZm8tPkNsZWFyQ29kZSArIDE7Ci0gIGRpbmZvLT5jb2RlX2NvdW50ZXIgPSBkaW5mby0+Q2xlYXJDb2RlICsgMjsKLSAgLyogaW5pdCBvdXRwdXQgYnVmZmVyaW5nIHZhcnMgKi8KLSAgZGluZm8tPmJ5dGVzaW5wa3QgPSAwOwotICBkaW5mby0+Y3VyX2FjY3VtID0gMDsKLSAgZGluZm8tPmN1cl9iaXRzID0gMDsKLSAgLyogR0lGIHNwZWNpZmllcyBhbiBpbml0aWFsIENsZWFyIGNvZGUgKi8KLSAgb3V0cHV0KGRpbmZvLCBkaW5mby0+Q2xlYXJDb2RlKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotY29tcHJlc3NfcGl4ZWwgKGdpZl9kZXN0X3B0ciBkaW5mbywgaW50IGMpCi0vKiBBY2NlcHQgYW5kICJjb21wcmVzcyIgb25lIHBpeGVsIHZhbHVlLgotICogVGhlIGdpdmVuIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG5fYml0cyB3aWRlLgotICovCi17Ci0gIC8qIE91dHB1dCB0aGUgZ2l2ZW4gcGl4ZWwgdmFsdWUgYXMgYSBzeW1ib2wuICovCi0gIG91dHB1dChkaW5mbywgYyk7Ci0gIC8qIElzc3VlIENsZWFyIGNvZGVzIG9mdGVuIGVub3VnaCB0byBrZWVwIHRoZSByZWFkZXIgZnJvbSByYXRjaGV0aW5nIHVwCi0gICAqIGl0cyBzeW1ib2wgc2l6ZS4KLSAgICovCi0gIGlmIChkaW5mby0+Y29kZV9jb3VudGVyIDwgZGluZm8tPm1heGNvZGUpIHsKLSAgICBkaW5mby0+Y29kZV9jb3VudGVyKys7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0cHV0KGRpbmZvLCBkaW5mby0+Q2xlYXJDb2RlKTsKLSAgICBkaW5mby0+Y29kZV9jb3VudGVyID0gZGluZm8tPkNsZWFyQ29kZSArIDI7CS8qIHJlc2V0IHRoZSBjb3VudGVyICovCi0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotY29tcHJlc3NfdGVybSAoZ2lmX2Rlc3RfcHRyIGRpbmZvKQotLyogQ2xlYW4gdXAgYXQgZW5kICovCi17Ci0gIC8qIFNlbmQgYW4gRU9GIGNvZGUgKi8KLSAgb3V0cHV0KGRpbmZvLCBkaW5mby0+RU9GQ29kZSk7Ci0gIC8qIEZsdXNoIHRoZSBiaXQtcGFja2luZyBidWZmZXIgKi8KLSAgaWYgKGRpbmZvLT5jdXJfYml0cyA+IDApIHsKLSAgICBDSEFSX09VVChkaW5mbywgZGluZm8tPmN1cl9hY2N1bSAmIDB4RkYpOwotICB9Ci0gIC8qIEZsdXNoIHRoZSBwYWNrZXQgYnVmZmVyICovCi0gIGZsdXNoX3BhY2tldChkaW5mbyk7Ci19Ci0KLQotLyogR0lGIGhlYWRlciBjb25zdHJ1Y3Rpb24gKi8KLQotCi1MT0NBTCh2b2lkKQotcHV0X3dvcmQgKGdpZl9kZXN0X3B0ciBkaW5mbywgdW5zaWduZWQgaW50IHcpCi0vKiBFbWl0IGEgMTYtYml0IHdvcmQsIExTQiBmaXJzdCAqLwotewotICBwdXRjKHcgJiAweEZGLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygodyA+PiA4KSAmIDB4RkYsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1wdXRfM2J5dGVzIChnaWZfZGVzdF9wdHIgZGluZm8sIGludCB2YWwpCi0vKiBFbWl0IDMgY29waWVzIG9mIHNhbWUgYnl0ZSB2YWx1ZSAtLS0gaGFuZHkgc3ViciBmb3IgY29sb3JtYXAgY29uc3RydWN0aW9uICovCi17Ci0gIHB1dGModmFsLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0Yyh2YWwsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICBwdXRjKHZhbCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWVtaXRfaGVhZGVyIChnaWZfZGVzdF9wdHIgZGluZm8sIGludCBudW1fY29sb3JzLCBKU0FNUEFSUkFZIGNvbG9ybWFwKQotLyogT3V0cHV0IHRoZSBHSUYgZmlsZSBoZWFkZXIsIGluY2x1ZGluZyBjb2xvciBtYXAgKi8KLS8qIElmIGNvbG9ybWFwPT1OVUxMLCBzeW50aGVzaXplIGEgZ3JheS1zY2FsZSBjb2xvcm1hcCAqLwotewotICBpbnQgQml0c1BlclBpeGVsLCBDb2xvck1hcFNpemUsIEluaXRDb2RlU2l6ZSwgRmxhZ0J5dGU7Ci0gIGludCBjc2hpZnQgPSBkaW5mby0+Y2luZm8tPmRhdGFfcHJlY2lzaW9uIC0gODsKLSAgaW50IGk7Ci0KLSAgaWYgKG51bV9jb2xvcnMgPiAyNTYpCi0gICAgRVJSRVhJVDEoZGluZm8tPmNpbmZvLCBKRVJSX1RPT19NQU5ZX0NPTE9SUywgbnVtX2NvbG9ycyk7Ci0gIC8qIENvbXB1dGUgYml0cy9waXhlbCBhbmQgcmVsYXRlZCB2YWx1ZXMgKi8KLSAgQml0c1BlclBpeGVsID0gMTsKLSAgd2hpbGUgKG51bV9jb2xvcnMgPiAoMSA8PCBCaXRzUGVyUGl4ZWwpKQotICAgIEJpdHNQZXJQaXhlbCsrOwotICBDb2xvck1hcFNpemUgPSAxIDw8IEJpdHNQZXJQaXhlbDsKLSAgaWYgKEJpdHNQZXJQaXhlbCA8PSAxKQotICAgIEluaXRDb2RlU2l6ZSA9IDI7Ci0gIGVsc2UKLSAgICBJbml0Q29kZVNpemUgPSBCaXRzUGVyUGl4ZWw7Ci0gIC8qCi0gICAqIFdyaXRlIHRoZSBHSUYgaGVhZGVyLgotICAgKiBOb3RlIHRoYXQgd2UgZ2VuZXJhdGUgYSBwbGFpbiBHSUY4NyBoZWFkZXIgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eS4KLSAgICovCi0gIHB1dGMoJ0cnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygnSScsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICBwdXRjKCdGJywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGMoJzgnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygnNycsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICBwdXRjKCdhJywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIC8qIFdyaXRlIHRoZSBMb2dpY2FsIFNjcmVlbiBEZXNjcmlwdG9yICovCi0gIHB1dF93b3JkKGRpbmZvLCAodW5zaWduZWQgaW50KSBkaW5mby0+Y2luZm8tPm91dHB1dF93aWR0aCk7Ci0gIHB1dF93b3JkKGRpbmZvLCAodW5zaWduZWQgaW50KSBkaW5mby0+Y2luZm8tPm91dHB1dF9oZWlnaHQpOwotICBGbGFnQnl0ZSA9IDB4ODA7CQkvKiBZZXMsIHRoZXJlIGlzIGEgZ2xvYmFsIGNvbG9yIHRhYmxlICovCi0gIEZsYWdCeXRlIHw9IChCaXRzUGVyUGl4ZWwtMSkgPDwgNDsgLyogY29sb3IgcmVzb2x1dGlvbiAqLwotICBGbGFnQnl0ZSB8PSAoQml0c1BlclBpeGVsLTEpOwkvKiBzaXplIG9mIGdsb2JhbCBjb2xvciB0YWJsZSAqLwotICBwdXRjKEZsYWdCeXRlLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygwLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsgLyogQmFja2dyb3VuZCBjb2xvciBpbmRleCAqLwotICBwdXRjKDAsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOyAvKiBSZXNlcnZlZCAoYXNwZWN0IHJhdGlvIGluIEdJRjg5KSAqLwotICAvKiBXcml0ZSB0aGUgR2xvYmFsIENvbG9yIE1hcCAqLwotICAvKiBJZiB0aGUgY29sb3IgbWFwIGlzIG1vcmUgdGhhbiA4IGJpdHMgcHJlY2lzaW9uLCAqLwotICAvKiB3ZSByZWR1Y2UgaXQgdG8gOCBiaXRzIGJ5IHNoaWZ0aW5nICovCi0gIGZvciAoaT0wOyBpIDwgQ29sb3JNYXBTaXplOyBpKyspIHsKLSAgICBpZiAoaSA8IG51bV9jb2xvcnMpIHsKLSAgICAgIGlmIChjb2xvcm1hcCAhPSBOVUxMKSB7Ci0JaWYgKGRpbmZvLT5jaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLQkgIC8qIE5vcm1hbCBjYXNlOiBSR0IgY29sb3IgbWFwICovCi0JICBwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pID4+IGNzaGlmdCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0JICBwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMV1baV0pID4+IGNzaGlmdCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0JICBwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMl1baV0pID4+IGNzaGlmdCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0JfSBlbHNlIHsKLQkgIC8qIEdyYXlzY2FsZSAiY29sb3IgbWFwIjogcG9zc2libGUgaWYgcXVhbnRpemluZyBncmF5c2NhbGUgaW1hZ2UgKi8KLQkgIHB1dF8zYnl0ZXMoZGluZm8sIEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pID4+IGNzaGlmdCk7Ci0JfQotICAgICAgfSBlbHNlIHsKLQkvKiBDcmVhdGUgYSBncmF5LXNjYWxlIG1hcCBvZiBudW1fY29sb3JzIHZhbHVlcywgcmFuZ2UgMC4uMjU1ICovCi0JcHV0XzNieXRlcyhkaW5mbywgKGkgKiAyNTUgKyAobnVtX2NvbG9ycy0xKS8yKSAvIChudW1fY29sb3JzLTEpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogZmlsbCBvdXQgdGhlIG1hcCB0byBhIHBvd2VyIG9mIDIgKi8KLSAgICAgIHB1dF8zYnl0ZXMoZGluZm8sIDApOwotICAgIH0KLSAgfQotICAvKiBXcml0ZSBpbWFnZSBzZXBhcmF0b3IgYW5kIEltYWdlIERlc2NyaXB0b3IgKi8KLSAgcHV0YygnLCcsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOyAvKiBzZXBhcmF0b3IgKi8KLSAgcHV0X3dvcmQoZGluZm8sIDApOwkJLyogbGVmdC90b3Agb2Zmc2V0ICovCi0gIHB1dF93b3JkKGRpbmZvLCAwKTsKLSAgcHV0X3dvcmQoZGluZm8sICh1bnNpZ25lZCBpbnQpIGRpbmZvLT5jaW5mby0+b3V0cHV0X3dpZHRoKTsgLyogaW1hZ2Ugc2l6ZSAqLwotICBwdXRfd29yZChkaW5mbywgKHVuc2lnbmVkIGludCkgZGluZm8tPmNpbmZvLT5vdXRwdXRfaGVpZ2h0KTsKLSAgLyogZmxhZyBieXRlOiBub3QgaW50ZXJsYWNlZCwgbm8gbG9jYWwgY29sb3IgbWFwICovCi0gIHB1dGMoMHgwMCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIC8qIFdyaXRlIEluaXRpYWwgQ29kZSBTaXplIGJ5dGUgKi8KLSAgcHV0YyhJbml0Q29kZVNpemUsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotCi0gIC8qIEluaXRpYWxpemUgZm9yICJjb21wcmVzc2lvbiIgb2YgaW1hZ2UgZGF0YSAqLwotICBjb21wcmVzc19pbml0KGRpbmZvLCBJbml0Q29kZVNpemUrMSk7Ci19Ci0KLQotLyoKLSAqIFN0YXJ0dXA6IHdyaXRlIHRoZSBmaWxlIGhlYWRlci4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X291dHB1dF9naWYgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQotewotICBnaWZfZGVzdF9wdHIgZGVzdCA9IChnaWZfZGVzdF9wdHIpIGRpbmZvOwotCi0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQotICAgIGVtaXRfaGVhZGVyKGRlc3QsIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycywgY2luZm8tPmNvbG9ybWFwKTsKLSAgZWxzZQotICAgIGVtaXRfaGVhZGVyKGRlc3QsIDI1NiwgKEpTQU1QQVJSQVkpIE5VTEwpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCi0gKiBJbiB0aGlzIG1vZHVsZSByb3dzX3N1cHBsaWVkIHdpbGwgYWx3YXlzIGJlIDEuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wdXRfcGl4ZWxfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCi0JCUpESU1FTlNJT04gcm93c19zdXBwbGllZCkKLXsKLSAgZ2lmX2Rlc3RfcHRyIGRlc3QgPSAoZ2lmX2Rlc3RfcHRyKSBkaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLQotICBwdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgY29tcHJlc3NfcGl4ZWwoZGVzdCwgR0VUSlNBTVBMRSgqcHRyKyspKTsKLSAgfQotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9vdXRwdXRfZ2lmIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgZ2lmX2Rlc3RfcHRyIGRlc3QgPSAoZ2lmX2Rlc3RfcHRyKSBkaW5mbzsKLQotICAvKiBGbHVzaCAiY29tcHJlc3Npb24iIG1lY2hhbmlzbSAqLwotICBjb21wcmVzc190ZXJtKGRlc3QpOwotICAvKiBXcml0ZSBhIHplcm8tbGVuZ3RoIGRhdGEgYmxvY2sgdG8gZW5kIHRoZSBzZXJpZXMgKi8KLSAgcHV0YygwLCBkZXN0LT5wdWIub3V0cHV0X2ZpbGUpOwotICAvKiBXcml0ZSB0aGUgR0lGIHRlcm1pbmF0b3IgbWFyayAqLwotICBwdXRjKCc7JywgZGVzdC0+cHViLm91dHB1dF9maWxlKTsKLSAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBvdXRwdXQgZmlsZSBPSyAqLwotICBmZmx1c2goZGVzdC0+cHViLm91dHB1dF9maWxlKTsKLSAgaWYgKGZlcnJvcihkZXN0LT5wdWIub3V0cHV0X2ZpbGUpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIEdJRiBmb3JtYXQgb3V0cHV0LgotICovCi0KLUdMT0JBTChkanBlZ19kZXN0X3B0cikKLWppbml0X3dyaXRlX2dpZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgZ2lmX2Rlc3RfcHRyIGRlc3Q7Ci0KLSAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLwotICBkZXN0ID0gKGdpZl9kZXN0X3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YoZ2lmX2Rlc3Rfc3RydWN0KSk7Ci0gIGRlc3QtPmNpbmZvID0gY2luZm87CQkvKiBtYWtlIGJhY2sgbGluayBmb3Igc3Vicm91dGluZXMgKi8KLSAgZGVzdC0+cHViLnN0YXJ0X291dHB1dCA9IHN0YXJ0X291dHB1dF9naWY7Ci0gIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9waXhlbF9yb3dzOwotICBkZXN0LT5wdWIuZmluaXNoX291dHB1dCA9IGZpbmlzaF9vdXRwdXRfZ2lmOwotCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19HUkFZU0NBTEUgJiYKLSAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX1JHQikKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0dJRl9DT0xPUlNQQUNFKTsKLQotICAvKiBGb3JjZSBxdWFudGl6YXRpb24gaWYgY29sb3Igb3IgaWYgPiA4IGJpdHMgaW5wdXQgKi8KLSAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX0dSQVlTQ0FMRSB8fCBjaW5mby0+ZGF0YV9wcmVjaXNpb24gPiA4KSB7Ci0gICAgLyogRm9yY2UgcXVhbnRpemF0aW9uIHRvIGF0IG1vc3QgMjU2IGNvbG9ycyAqLwotICAgIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgPSBUUlVFOwotICAgIGlmIChjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID4gMjU2KQotICAgICAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IDI1NjsKLSAgfQotCi0gIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KLSAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKLQotICBpZiAoY2luZm8tPm91dHB1dF9jb21wb25lbnRzICE9IDEpIC8qIHNhZmV0eSBjaGVjazoganVzdCBvbmUgY29tcG9uZW50PyAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfR0lGX0JVRyk7Ci0KLSAgLyogQ3JlYXRlIGRlY29tcHJlc3NvciBvdXRwdXQgYnVmZmVyLiAqLwotICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgY2luZm8tPm91dHB1dF93aWR0aCwgKEpESU1FTlNJT04pIDEpOwotICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci0KLSAgcmV0dXJuIChkanBlZ19kZXN0X3B0cikgZGVzdDsKLX0KLQotI2VuZGlmIC8qIEdJRl9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3dyanBnY29tLjEgYi9saWJqcGVndHdycC93cmpwZ2NvbS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDE5YTk5Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3dyanBnY29tLjEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLlRIIFdSSlBHQ09NIDEgIjE1IEp1bmUgMTk5NSIKLS5TSCBOQU1FCi13cmpwZ2NvbSBcLSBpbnNlcnQgdGV4dCBjb21tZW50cyBpbnRvIGEgSlBFRyBmaWxlCi0uU0ggU1lOT1BTSVMKLS5CIHdyanBnY29tCi1bCi0uQiBcLXJlcGxhY2UKLV0KLVsKLS5CSSBcLWNvbW1lbnQgIiB0ZXh0IgotXQotWwotLkJJIFwtY2ZpbGUgIiBuYW1lIgotXQotWwotLkkgZmlsZW5hbWUKLV0KLS5MUAotLlNIIERFU0NSSVBUSU9OCi0uTFAKLS5CIHdyanBnY29tCi1yZWFkcyB0aGUgbmFtZWQgSlBFRy9KRklGIGZpbGUsIG9yIHRoZSBzdGFuZGFyZCBpbnB1dCBpZiBubyBmaWxlIGlzIG5hbWVkLAotYW5kIGdlbmVyYXRlcyBhIG5ldyBKUEVHL0pGSUYgZmlsZSBvbiBzdGFuZGFyZCBvdXRwdXQuICBBIGNvbW1lbnQgYmxvY2sgaXMKLWFkZGVkIHRvIHRoZSBmaWxlLgotLlBQCi1UaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgImNvbW1lbnQiIChDT00pIGJsb2NrcyB0byBvY2N1ciB3aXRoaW4gYSBKUEVHIGZpbGUuCi1BbHRob3VnaCB0aGUgc3RhbmRhcmQgZG9lc24ndCBhY3R1YWxseSBkZWZpbmUgd2hhdCBDT00gYmxvY2tzIGFyZSBmb3IsIHRoZXkKLWFyZSB3aWRlbHkgdXNlZCB0byBob2xkIHVzZXItc3VwcGxpZWQgdGV4dCBzdHJpbmdzLiAgVGhpcyBsZXRzIHlvdSBhZGQKLWFubm90YXRpb25zLCB0aXRsZXMsIGluZGV4IHRlcm1zLCBldGMgdG8geW91ciBKUEVHIGZpbGVzLCBhbmQgbGF0ZXIgcmV0cmlldmUKLXRoZW0gYXMgdGV4dC4gIENPTSBibG9ja3MgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBpbWFnZSBzdG9yZWQgaW4gdGhlIEpQRUcKLWZpbGUuICBUaGUgbWF4aW11bSBzaXplIG9mIGEgQ09NIGJsb2NrIGlzIDY0SywgYnV0IHlvdSBjYW4gaGF2ZSBhcyBtYW55IG9mCi10aGVtIGFzIHlvdSBsaWtlIGluIG9uZSBKUEVHIGZpbGUuCi0uUFAKLS5CIHdyanBnY29tCi1hZGRzIGEgQ09NIGJsb2NrLCBjb250YWluaW5nIHRleHQgeW91IHByb3ZpZGUsIHRvIGEgSlBFRyBmaWxlLgotT3JkaW5hcmlseSwgdGhlIENPTSBibG9jayBpcyBhZGRlZCBhZnRlciBhbnkgZXhpc3RpbmcgQ09NIGJsb2NrczsgYnV0IHlvdQotY2FuIGRlbGV0ZSB0aGUgb2xkIENPTSBibG9ja3MgaWYgeW91IHdpc2guCi0uU0ggT1BUSU9OUwotU3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCwgYW5kIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUuCi0uVFAKLS5CIFwtcmVwbGFjZQotRGVsZXRlIGFueSBleGlzdGluZyBDT00gYmxvY2tzIGZyb20gdGhlIGZpbGUuCi0uVFAKLS5CSSBcLWNvbW1lbnQgIiB0ZXh0IgotU3VwcGx5IHRleHQgZm9yIG5ldyBDT00gYmxvY2sgb24gY29tbWFuZCBsaW5lLgotLlRQCi0uQkkgXC1jZmlsZSAiIG5hbWUiCi1SZWFkIHRleHQgZm9yIG5ldyBDT00gYmxvY2sgZnJvbSBuYW1lZCBmaWxlLgotLlBQCi1JZiB5b3UgaGF2ZSBvbmx5IG9uZSBsaW5lIG9mIGNvbW1lbnQgdGV4dCB0byBhZGQsIHlvdSBjYW4gcHJvdmlkZSBpdCBvbiB0aGUKLWNvbW1hbmQgbGluZSB3aXRoCi0uQlIgXC1jb21tZW50IC4KLVRoZSBjb21tZW50IHRleHQgbXVzdCBiZSBzdXJyb3VuZGVkIHdpdGggcXVvdGVzIHNvIHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBhCi1zaW5nbGUgYXJndW1lbnQuICBMb25nZXIgY29tbWVudHMgY2FuIGJlIHJlYWQgZnJvbSBhIHRleHQgZmlsZS4KLS5QUAotSWYgeW91IGdpdmUgbmVpdGhlcgotLkIgXC1jb21tZW50Ci1ub3IKLS5CUiBcLWNmaWxlICwKLXRoZW4KLS5CIHdyanBnY29tCi13aWxsIHJlYWQgdGhlIGNvbW1lbnQgdGV4dCBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKEluIHRoaXMgY2FzZSBhbiBpbnB1dCBpbWFnZQotZmlsZSBuYW1lIE1VU1QgYmUgc3VwcGxpZWQsIHNvIHRoYXQgdGhlIHNvdXJjZSBKUEVHIGZpbGUgY29tZXMgZnJvbSBzb21ld2hlcmUKLWVsc2UuKSAgWW91IGNhbiBlbnRlciBtdWx0aXBsZSBsaW5lcywgdXAgdG8gNjRLQiB3b3J0aC4gIFR5cGUgYW4gZW5kLW9mLWZpbGUKLWluZGljYXRvciAodXN1YWxseSBjb250cm9sLUQpIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWVudCB0ZXh0IGVudHJ5LgotLlBQCi0uQiB3cmpwZ2NvbQotd2lsbCBub3QgYWRkIGEgQ09NIGJsb2NrIGlmIHRoZSBwcm92aWRlZCBjb21tZW50IHN0cmluZyBpcyBlbXB0eS4gIFRoZXJlZm9yZQotXGZCXC1yZXBsYWNlIFwtY29tbWVudCAiIlxmUiBjYW4gYmUgdXNlZCB0byBkZWxldGUgYWxsIENPTSBibG9ja3MgZnJvbSBhIGZpbGUuCi0uU0ggRVhBTVBMRVMKLS5MUAotQWRkIGEgc2hvcnQgY29tbWVudCB0byBpbi5qcGcsIHByb2R1Y2luZyBvdXQuanBnOgotLklQCi0uQiB3cmpwZ2NvbSBcLWMKLVxmSSJWaWV3IG9mIG15IGJhY2sgeWFyZCIgaW4uanBnCi0uQiA+Ci0uSSBvdXQuanBnCi0uUFAKLUF0dGFjaCBhIGxvbmcgY29tbWVudCBwcmV2aW91c2x5IHN0b3JlZCBpbiBjb21tZW50LnR4dDoKLS5JUAotLkIgd3JqcGdjb20KLS5JIGluLmpwZwotLkIgPAotLkkgY29tbWVudC50eHQKLS5CID4KLS5JIG91dC5qcGcKLS5QUAotb3IgZXF1aXZhbGVudGx5Ci0uSVAKLS5CIHdyanBnY29tCi0uQiAtY2ZpbGUKLS5JIGNvbW1lbnQudHh0Ci0uQiA8Ci0uSSBpbi5qcGcKLS5CID4KLS5JIG91dC5qcGcKLS5TSCBTRUUgQUxTTwotLkJSIGNqcGVnICgxKSwKLS5CUiBkanBlZyAoMSksCi0uQlIganBlZ3RyYW4gKDEpLAotLkJSIHJkanBnY29tICgxKQotLlNIIEFVVEhPUgotSW5kZXBlbmRlbnQgSlBFRyBHcm91cApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvd3JqcGdjb20uYyBiL2xpYmpwZWd0d3JwL3dyanBnY29tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDRiMDUuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvd3JqcGdjb20uYworKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi0vKgotICogd3JqcGdjb20uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgdmVyeSBzaW1wbGUgc3RhbmQtYWxvbmUgYXBwbGljYXRpb24gdGhhdCBpbnNlcnRzCi0gKiB1c2VyLXN1cHBsaWVkIHRleHQgYXMgYSBDT00gKGNvbW1lbnQpIG1hcmtlciBpbiBhIEpGSUYgZmlsZS4KLSAqIFRoaXMgbWF5IGJlIHVzZWZ1bCBhcyBhbiBleGFtcGxlIG9mIHRoZSBtaW5pbXVtIGxvZ2ljIG5lZWRlZCB0byBwYXJzZQotICogSlBFRyBtYXJrZXJzLgotICovCi0KLSNkZWZpbmUgSlBFR19DSlBFR19ESlBFRwkvKiB0byBnZXQgdGhlIGNvbW1hbmQtbGluZSBjb25maWcgc3ltYm9scyAqLwotI2luY2x1ZGUgImppbmNsdWRlLmgiCQkvKiBnZXQgYXV0by1jb25maWcgc3ltYm9scywgPHN0ZGlvLmg+ICovCi0KLSNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSAqLwotZXh0ZXJuIHZvaWQgKiBtYWxsb2MgKCk7Ci0jZW5kaWYKLSNpbmNsdWRlIDxjdHlwZS5oPgkJLyogdG8gZGVjbGFyZSBpc3VwcGVyKCksIHRvbG93ZXIoKSAqLwotI2lmZGVmIFVTRV9TRVRNT0RFCi0jaW5jbHVkZSA8ZmNudGwuaD4JCS8qIHRvIGRlY2xhcmUgc2V0bW9kZSgpJ3MgcGFyYW1ldGVyIG1hY3JvcyAqLwotLyogSWYgeW91IGhhdmUgc2V0bW9kZSgpIGJ1dCBub3QgPGlvLmg+LCBqdXN0IGRlbGV0ZSB0aGlzIGxpbmU6ICovCi0jaW5jbHVkZSA8aW8uaD4JCQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSAqLwotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLwotI2lmZGVmIF9fTVdFUktTX18KLSNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCi0jZW5kaWYKLSNpZmRlZiBUSElOS19DCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERPTlRfVVNFX0JfTU9ERQkJLyogZGVmaW5lIG1vZGUgcGFyYW1ldGVycyBmb3IgZm9wZW4oKSAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkiciIKLSNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3IgotI2Vsc2UKLSNpZmRlZiBWTVMJCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiLCAiY3R4PXN0bSIKLSNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3YiIsICJjdHg9c3RtIgotI2Vsc2UJCQkJLyogc3RhbmRhcmQgQU5TSS1jb21wbGlhbnQgY2FzZSAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCi0jZGVmaW5lIFdSSVRFX0JJTkFSWQkid2IiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEVYSVRfRkFJTFVSRQkJLyogZGVmaW5lIGV4aXQoKSBjb2RlcyBpZiBub3QgcHJvdmlkZWQgKi8KLSNkZWZpbmUgRVhJVF9GQUlMVVJFICAxCi0jZW5kaWYKLSNpZm5kZWYgRVhJVF9TVUNDRVNTCi0jaWZkZWYgVk1TCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KLSNlbHNlCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMAotI2VuZGlmCi0jZW5kaWYKLQotLyogUmVkdWNlIHRoaXMgdmFsdWUgaWYgeW91ciBtYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBibG9ja3MgdXAgdG8gNjRLLgotICogT24gRE9TLCBjb21waWxpbmcgaW4gbGFyZ2UgbW9kZWwgaXMgdXN1YWxseSBhIGJldHRlciBzb2x1dGlvbi4KLSAqLwotCi0jaWZuZGVmIE1BWF9DT01fTEVOR1RICi0jZGVmaW5lIE1BWF9DT01fTEVOR1RIIDY1MDAwTAkvKiBtdXN0IGJlIDw9IDY1NTMzIGluIGFueSBjYXNlICovCi0jZW5kaWYKLQotCi0vKgotICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIHJlYWQgdGhlIGlucHV0IGZpbGUgYW5kIHdyaXRlIHRoZSBvdXRwdXQgZmlsZS4KLSAqIFRvIHJldXNlIHRoaXMgY29kZSBpbiBhbm90aGVyIGFwcGxpY2F0aW9uLCB5b3UgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdGhlc2UuCi0gKi8KLQotc3RhdGljIEZJTEUgKiBpbmZpbGU7CQkvKiBpbnB1dCBKUEVHIGZpbGUgKi8KLQotLyogUmV0dXJuIG5leHQgaW5wdXQgYnl0ZSwgb3IgRU9GIGlmIG5vIG1vcmUgKi8KLSNkZWZpbmUgTkVYVEJZVEUoKSAgZ2V0YyhpbmZpbGUpCi0KLXN0YXRpYyBGSUxFICogb3V0ZmlsZTsJCS8qIG91dHB1dCBKUEVHIGZpbGUgKi8KLQotLyogRW1pdCBhbiBvdXRwdXQgYnl0ZSAqLwotI2RlZmluZSBQVVRCWVRFKHgpICBwdXRjKCh4KSwgb3V0ZmlsZSkKLQotCi0vKiBFcnJvciBleGl0IGhhbmRsZXIgKi8KLSNkZWZpbmUgRVJSRVhJVChtc2cpICAoZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbXNnKSwgZXhpdChFWElUX0ZBSUxVUkUpKQotCi0KLS8qIFJlYWQgb25lIGJ5dGUsIHRlc3RpbmcgZm9yIEVPRiAqLwotc3RhdGljIGludAotcmVhZF8xX2J5dGUgKHZvaWQpCi17Ci0gIGludCBjOwotCi0gIGMgPSBORVhUQllURSgpOwotICBpZiAoYyA9PSBFT0YpCi0gICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKLSAgcmV0dXJuIGM7Ci19Ci0KLS8qIFJlYWQgMiBieXRlcywgY29udmVydCB0byB1bnNpZ25lZCBpbnQgKi8KLS8qIEFsbCAyLWJ5dGUgcXVhbnRpdGllcyBpbiBKUEVHIG1hcmtlcnMgYXJlIE1TQiBmaXJzdCAqLwotc3RhdGljIHVuc2lnbmVkIGludAotcmVhZF8yX2J5dGVzICh2b2lkKQotewotICBpbnQgYzEsIGMyOwotCi0gIGMxID0gTkVYVEJZVEUoKTsKLSAgaWYgKGMxID09IEVPRikKLSAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOwotICBjMiA9IE5FWFRCWVRFKCk7Ci0gIGlmIChjMiA9PSBFT0YpCi0gICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkgYzEpIDw8IDgpICsgKCh1bnNpZ25lZCBpbnQpIGMyKTsKLX0KLQotCi0vKiBSb3V0aW5lcyB0byB3cml0ZSBkYXRhIHRvIG91dHB1dCBmaWxlICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV8xX2J5dGUgKGludCBjKQotewotICBQVVRCWVRFKGMpOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfMl9ieXRlcyAodW5zaWduZWQgaW50IHZhbCkKLXsKLSAgUFVUQllURSgodmFsID4+IDgpICYgMHhGRik7Ci0gIFBVVEJZVEUodmFsICYgMHhGRik7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9tYXJrZXIgKGludCBtYXJrZXIpCi17Ci0gIFBVVEJZVEUoMHhGRik7Ci0gIFBVVEJZVEUobWFya2VyKTsKLX0KLQotc3RhdGljIHZvaWQKLWNvcHlfcmVzdF9vZl9maWxlICh2b2lkKQotewotICBpbnQgYzsKLQotICB3aGlsZSAoKGMgPSBORVhUQllURSgpKSAhPSBFT0YpCi0gICAgUFVUQllURShjKTsKLX0KLQotCi0vKgotICogSlBFRyBtYXJrZXJzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgMHhGRiBieXRlcywgZm9sbG93ZWQgYnkgYSBtYXJrZXIKLSAqIGNvZGUgYnl0ZSAod2hpY2ggaXMgbm90IGFuIEZGKS4gIEhlcmUgYXJlIHRoZSBtYXJrZXIgY29kZXMgb2YgaW50ZXJlc3QKLSAqIGluIHRoaXMgcHJvZ3JhbS4gIChTZWUgamRtYXJrZXIuYyBmb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3QuKQotICovCi0KLSNkZWZpbmUgTV9TT0YwICAweEMwCQkvKiBTdGFydCBPZiBGcmFtZSBOICovCi0jZGVmaW5lIE1fU09GMSAgMHhDMQkJLyogTiBpbmRpY2F0ZXMgd2hpY2ggY29tcHJlc3Npb24gcHJvY2VzcyAqLwotI2RlZmluZSBNX1NPRjIgIDB4QzIJCS8qIE9ubHkgU09GMC1TT0YyIGFyZSBub3cgaW4gY29tbW9uIHVzZSAqLwotI2RlZmluZSBNX1NPRjMgIDB4QzMKLSNkZWZpbmUgTV9TT0Y1ICAweEM1CQkvKiBOQjogY29kZXMgQzQgYW5kIENDIGFyZSBOT1QgU09GIG1hcmtlcnMgKi8KLSNkZWZpbmUgTV9TT0Y2ICAweEM2Ci0jZGVmaW5lIE1fU09GNyAgMHhDNwotI2RlZmluZSBNX1NPRjkgIDB4QzkKLSNkZWZpbmUgTV9TT0YxMCAweENBCi0jZGVmaW5lIE1fU09GMTEgMHhDQgotI2RlZmluZSBNX1NPRjEzIDB4Q0QKLSNkZWZpbmUgTV9TT0YxNCAweENFCi0jZGVmaW5lIE1fU09GMTUgMHhDRgotI2RlZmluZSBNX1NPSSAgIDB4RDgJCS8qIFN0YXJ0IE9mIEltYWdlIChiZWdpbm5pbmcgb2YgZGF0YXN0cmVhbSkgKi8KLSNkZWZpbmUgTV9FT0kgICAweEQ5CQkvKiBFbmQgT2YgSW1hZ2UgKGVuZCBvZiBkYXRhc3RyZWFtKSAqLwotI2RlZmluZSBNX1NPUyAgIDB4REEJCS8qIFN0YXJ0IE9mIFNjYW4gKGJlZ2lucyBjb21wcmVzc2VkIGRhdGEpICovCi0jZGVmaW5lIE1fQ09NICAgMHhGRQkJLyogQ09NbWVudCAqLwotCi0KLS8qCi0gKiBGaW5kIHRoZSBuZXh0IEpQRUcgbWFya2VyIGFuZCByZXR1cm4gaXRzIG1hcmtlciBjb2RlLgotICogV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBGRiBieXRlLCBwb3NzaWJseSBtb3JlIGlmIHRoZSBjb21wcmVzc29yIHVzZWQgRkZzCi0gKiB0byBwYWQgdGhlIGZpbGUuICAoUGFkZGluZyBGRnMgd2lsbCBOT1QgYmUgcmVwbGljYXRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuKQotICogVGhlcmUgY291bGQgYWxzbyBiZSBub24tRkYgZ2FyYmFnZSBiZXR3ZWVuIG1hcmtlcnMuICBUaGUgdHJlYXRtZW50IG9mIHN1Y2gKLSAqIGdhcmJhZ2UgaXMgdW5zcGVjaWZpZWQ7IHdlIGNob29zZSB0byBza2lwIG92ZXIgaXQgYnV0IGVtaXQgYSB3YXJuaW5nIG1zZy4KLSAqIE5COiB0aGlzIHJvdXRpbmUgbXVzdCBub3QgYmUgdXNlZCBhZnRlciBzZWVpbmcgU09TIG1hcmtlciwgc2luY2UgaXQgd2lsbAotICogbm90IGRlYWwgY29ycmVjdGx5IHdpdGggRkYvMDAgc2VxdWVuY2VzIGluIHRoZSBjb21wcmVzc2VkIGltYWdlIGRhdGEuLi4KLSAqLwotCi1zdGF0aWMgaW50Ci1uZXh0X21hcmtlciAodm9pZCkKLXsKLSAgaW50IGM7Ci0gIGludCBkaXNjYXJkZWRfYnl0ZXMgPSAwOwotCi0gIC8qIEZpbmQgMHhGRiBieXRlOyBjb3VudCBhbmQgc2tpcCBhbnkgbm9uLUZGcy4gKi8KLSAgYyA9IHJlYWRfMV9ieXRlKCk7Ci0gIHdoaWxlIChjICE9IDB4RkYpIHsKLSAgICBkaXNjYXJkZWRfYnl0ZXMrKzsKLSAgICBjID0gcmVhZF8xX2J5dGUoKTsKLSAgfQotICAvKiBHZXQgbWFya2VyIGNvZGUgYnl0ZSwgc3dhbGxvd2luZyBhbnkgZHVwbGljYXRlIEZGIGJ5dGVzLiAgRXh0cmEgRkZzCi0gICAqIGFyZSBsZWdhbCBhcyBwYWQgYnl0ZXMsIHNvIGRvbid0IGNvdW50IHRoZW0gaW4gZGlzY2FyZGVkX2J5dGVzLgotICAgKi8KLSAgZG8gewotICAgIGMgPSByZWFkXzFfYnl0ZSgpOwotICB9IHdoaWxlIChjID09IDB4RkYpOwotCi0gIGlmIChkaXNjYXJkZWRfYnl0ZXMgIT0gMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogZ2FyYmFnZSBkYXRhIGZvdW5kIGluIEpQRUcgZmlsZVxuIik7Ci0gIH0KLQotICByZXR1cm4gYzsKLX0KLQotCi0vKgotICogUmVhZCB0aGUgaW5pdGlhbCBtYXJrZXIsIHdoaWNoIHNob3VsZCBiZSBTT0kuCi0gKiBGb3IgYSBKRklGIGZpbGUsIHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIGZpbGUgc2hvdWxkIGJlIGxpdGVyYWxseQotICogMHhGRiBNX1NPSS4gIFRvIGJlIG1vcmUgZ2VuZXJhbCwgd2UgY291bGQgdXNlIG5leHRfbWFya2VyLCBidXQgaWYgdGhlCi0gKiBpbnB1dCBmaWxlIHdlcmVuJ3QgYWN0dWFsbHkgSlBFRyBhdCBhbGwsIG5leHRfbWFya2VyIG1pZ2h0IHJlYWQgdGhlIHdob2xlCi0gKiBmaWxlIGFuZCB0aGVuIHJldHVybiBhIG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZS4uLgotICovCi0KLXN0YXRpYyBpbnQKLWZpcnN0X21hcmtlciAodm9pZCkKLXsKLSAgaW50IGMxLCBjMjsKLQotICBjMSA9IE5FWFRCWVRFKCk7Ci0gIGMyID0gTkVYVEJZVEUoKTsKLSAgaWYgKGMxICE9IDB4RkYgfHwgYzIgIT0gTV9TT0kpCi0gICAgRVJSRVhJVCgiTm90IGEgSlBFRyBmaWxlIik7Ci0gIHJldHVybiBjMjsKLX0KLQotCi0vKgotICogTW9zdCB0eXBlcyBvZiBtYXJrZXIgYXJlIGZvbGxvd2VkIGJ5IGEgdmFyaWFibGUtbGVuZ3RoIHBhcmFtZXRlciBzZWdtZW50LgotICogVGhpcyByb3V0aW5lIHNraXBzIG92ZXIgdGhlIHBhcmFtZXRlcnMgZm9yIGFueSBtYXJrZXIgd2UgZG9uJ3Qgb3RoZXJ3aXNlCi0gKiB3YW50IHRvIHByb2Nlc3MuCi0gKiBOb3RlIHRoYXQgd2UgTVVTVCBza2lwIHRoZSBwYXJhbWV0ZXIgc2VnbWVudCBleHBsaWNpdGx5IGluIG9yZGVyIG5vdCB0bwotICogYmUgZm9vbGVkIGJ5IDB4RkYgYnl0ZXMgdGhhdCBtaWdodCBhcHBlYXIgd2l0aGluIHRoZSBwYXJhbWV0ZXIgc2VnbWVudDsKLSAqIHN1Y2ggYnl0ZXMgZG8gTk9UIGludHJvZHVjZSBuZXcgbWFya2Vycy4KLSAqLwotCi1zdGF0aWMgdm9pZAotY29weV92YXJpYWJsZSAodm9pZCkKLS8qIENvcHkgYW4gdW5rbm93biBvciB1bmludGVyZXN0aW5nIHZhcmlhYmxlLWxlbmd0aCBtYXJrZXIgKi8KLXsKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLQotICAvKiBHZXQgdGhlIG1hcmtlciBwYXJhbWV0ZXIgbGVuZ3RoIGNvdW50ICovCi0gIGxlbmd0aCA9IHJlYWRfMl9ieXRlcygpOwotICB3cml0ZV8yX2J5dGVzKGxlbmd0aCk7Ci0gIC8qIExlbmd0aCBpbmNsdWRlcyBpdHNlbGYsIHNvIG11c3QgYmUgYXQgbGVhc3QgMiAqLwotICBpZiAobGVuZ3RoIDwgMikKLSAgICBFUlJFWElUKCJFcnJvbmVvdXMgSlBFRyBtYXJrZXIgbGVuZ3RoIik7Ci0gIGxlbmd0aCAtPSAyOwotICAvKiBTa2lwIG92ZXIgdGhlIHJlbWFpbmluZyBieXRlcyAqLwotICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgIHdyaXRlXzFfYnl0ZShyZWFkXzFfYnl0ZSgpKTsKLSAgICBsZW5ndGgtLTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZAotc2tpcF92YXJpYWJsZSAodm9pZCkKLS8qIFNraXAgb3ZlciBhbiB1bmtub3duIG9yIHVuaW50ZXJlc3RpbmcgdmFyaWFibGUtbGVuZ3RoIG1hcmtlciAqLwotewotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCi0gIC8qIEdldCB0aGUgbWFya2VyIHBhcmFtZXRlciBsZW5ndGggY291bnQgKi8KLSAgbGVuZ3RoID0gcmVhZF8yX2J5dGVzKCk7Ci0gIC8qIExlbmd0aCBpbmNsdWRlcyBpdHNlbGYsIHNvIG11c3QgYmUgYXQgbGVhc3QgMiAqLwotICBpZiAobGVuZ3RoIDwgMikKLSAgICBFUlJFWElUKCJFcnJvbmVvdXMgSlBFRyBtYXJrZXIgbGVuZ3RoIik7Ci0gIGxlbmd0aCAtPSAyOwotICAvKiBTa2lwIG92ZXIgdGhlIHJlbWFpbmluZyBieXRlcyAqLwotICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOwotICAgIGxlbmd0aC0tOwotICB9Ci19Ci0KLQotLyoKLSAqIFBhcnNlIHRoZSBtYXJrZXIgc3RyZWFtIHVudGlsIFNPRm4gb3IgRU9JIGlzIHNlZW47Ci0gKiBjb3B5IGRhdGEgdG8gb3V0cHV0LCBidXQgZGlzY2FyZCBDT00gbWFya2VycyB1bmxlc3Mga2VlcF9DT00gaXMgdHJ1ZS4KLSAqLwotCi1zdGF0aWMgaW50Ci1zY2FuX0pQRUdfaGVhZGVyIChpbnQga2VlcF9DT00pCi17Ci0gIGludCBtYXJrZXI7Ci0KLSAgLyogRXhwZWN0IFNPSSBhdCBzdGFydCBvZiBmaWxlICovCi0gIGlmIChmaXJzdF9tYXJrZXIoKSAhPSBNX1NPSSkKLSAgICBFUlJFWElUKCJFeHBlY3RlZCBTT0kgbWFya2VyIGZpcnN0Iik7Ci0gIHdyaXRlX21hcmtlcihNX1NPSSk7Ci0KLSAgLyogU2NhbiBtaXNjZWxsYW5lb3VzIG1hcmtlcnMgdW50aWwgd2UgcmVhY2ggU09Gbi4gKi8KLSAgZm9yICg7OykgewotICAgIG1hcmtlciA9IG5leHRfbWFya2VyKCk7Ci0gICAgc3dpdGNoIChtYXJrZXIpIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBtYXJrZXIgY29kZXMgMHhDNCwgMHhDOCwgMHhDQyBhcmUgbm90LCBhbmQgbXVzdCBub3QgYmUsCi0gICAgICAgKiB0cmVhdGVkIGFzIFNPRm4uICBDNCBpbiBwYXJ0aWN1bGFyIGlzIGFjdHVhbGx5IERIVC4KLSAgICAgICAqLwotICAgIGNhc2UgTV9TT0YwOgkJLyogQmFzZWxpbmUgKi8KLSAgICBjYXNlIE1fU09GMToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GMjoJCS8qIFByb2dyZXNzaXZlLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjM6CQkvKiBMb3NzbGVzcywgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y1OgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GNjoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y3OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjk6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjEwOgkJLyogUHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KLSAgICBjYXNlIE1fU09GMTE6CQkvKiBMb3NzbGVzcywgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxMzoJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE0OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE1OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBhcml0aG1ldGljICovCi0gICAgICByZXR1cm4gbWFya2VyOwotCi0gICAgY2FzZSBNX1NPUzoJCQkvKiBzaG91bGQgbm90IHNlZSBjb21wcmVzc2VkIGRhdGEgYmVmb3JlIFNPRiAqLwotICAgICAgRVJSRVhJVCgiU09TIHdpdGhvdXQgcHJpb3IgU09GbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRU9JOgkJCS8qIGluIGNhc2UgaXQncyBhIHRhYmxlcy1vbmx5IEpQRUcgc3RyZWFtICovCi0gICAgICByZXR1cm4gbWFya2VyOwotCi0gICAgY2FzZSBNX0NPTToJCQkvKiBFeGlzdGluZyBDT006IGNvbmRpdGlvbmFsbHkgZGlzY2FyZCAqLwotICAgICAgaWYgKGtlZXBfQ09NKSB7Ci0Jd3JpdGVfbWFya2VyKG1hcmtlcik7Ci0JY29weV92YXJpYWJsZSgpOwotICAgICAgfSBlbHNlIHsKLQlza2lwX3ZhcmlhYmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6CQkJLyogQW55dGhpbmcgZWxzZSBqdXN0IGdldHMgY29waWVkICovCi0gICAgICB3cml0ZV9tYXJrZXIobWFya2VyKTsKLSAgICAgIGNvcHlfdmFyaWFibGUoKTsJCS8qIHdlIGFzc3VtZSBpdCBoYXMgYSBwYXJhbWV0ZXIgY291bnQuLi4gKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSAvKiBlbmQgbG9vcCAqLwotfQotCi0KLS8qIENvbW1hbmQgbGluZSBwYXJzaW5nIGNvZGUgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwcm9nbmFtZTsJLyogcHJvZ3JhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLwotCi0KLXN0YXRpYyB2b2lkCi11c2FnZSAodm9pZCkKLS8qIGNvbXBsYWluIGFib3V0IGJhZCBjb21tYW5kIGxpbmUgKi8KLXsKLSAgZnByaW50ZihzdGRlcnIsICJ3cmpwZ2NvbSBpbnNlcnRzIGEgdGV4dHVhbCBjb21tZW50IGluIGEgSlBFRyBmaWxlLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiWW91IGNhbiBhZGQgdG8gb3IgcmVwbGFjZSBhbnkgZXhpc3RpbmcgY29tbWVudChzKS5cbiIpOwotCi0gIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtzd2l0Y2hlc10gIiwgcHJvZ25hbWUpOwotI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0gIGZwcmludGYoc3RkZXJyLCAiaW5wdXRmaWxlIG91dHB1dGZpbGVcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihzdGRlcnIsICJbaW5wdXRmaWxlXVxuIik7Ci0jZW5kaWYKLQotICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtcmVwbGFjZSAgICAgICAgIERlbGV0ZSBhbnkgZXhpc3RpbmcgY29tbWVudHNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNvbW1lbnQgXCJ0ZXh0XCIgIEluc2VydCBjb21tZW50IHdpdGggZ2l2ZW4gdGV4dFxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtY2ZpbGUgbmFtZSAgICAgIFJlYWQgY29tbWVudCBmcm9tIG5hbWVkIGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIk5vdGljZSB0aGF0IHlvdSBtdXN0IHB1dCBxdW90ZXMgYXJvdW5kIHRoZSBjb21tZW50IHRleHRcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIndoZW4geW91IHVzZSAtY29tbWVudC5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIklmIHlvdSBkbyBub3QgZ2l2ZSBlaXRoZXIgLWNvbW1lbnQgb3IgLWNmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUsXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJ0aGVuIHRoZSBjb21tZW50IHRleHQgaXMgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiSXQgY2FuIGJlIG11bHRpcGxlIGxpbmVzLCB1cCB0byAldSBjaGFyYWN0ZXJzIHRvdGFsLlxuIiwKLQkgICh1bnNpZ25lZCBpbnQpIE1BWF9DT01fTEVOR1RIKTsKLSNpZm5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSAgZnByaW50ZihzdGRlcnIsICJZb3UgbXVzdCBzcGVjaWZ5IGFuIGlucHV0IEpQRUcgZmlsZSBuYW1lIHdoZW4gc3VwcGx5aW5nXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJjb21tZW50IHRleHQgZnJvbSBzdGFuZGFyZCBpbnB1dC5cbiIpOwotI2VuZGlmCi0KLSAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLXN0YXRpYyBpbnQKLWtleW1hdGNoIChjaGFyICogYXJnLCBjb25zdCBjaGFyICoga2V5d29yZCwgaW50IG1pbmNoYXJzKQotLyogQ2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZyBvZiAocG9zc2libHkgYWJicmV2aWF0ZWQpIGtleXdvcmQgc3dpdGNoZXMuICovCi0vKiBrZXl3b3JkIGlzIHRoZSBjb25zdGFudCBrZXl3b3JkIChtdXN0IGJlIGxvd2VyIGNhc2UgYWxyZWFkeSksICovCi0vKiBtaW5jaGFycyBpcyBsZW5ndGggb2YgbWluaW11bSBsZWdhbCBhYmJyZXZpYXRpb24uICovCi17Ci0gIHJlZ2lzdGVyIGludCBjYSwgY2s7Ci0gIHJlZ2lzdGVyIGludCBubWF0Y2hlZCA9IDA7Ci0KLSAgd2hpbGUgKChjYSA9ICphcmcrKykgIT0gJ1wwJykgewotICAgIGlmICgoY2sgPSAqa2V5d29yZCsrKSA9PSAnXDAnKQotICAgICAgcmV0dXJuIDA7CQkJLyogYXJnIGxvbmdlciB0aGFuIGtleXdvcmQsIG5vIGdvb2QgKi8KLSAgICBpZiAoaXN1cHBlcihjYSkpCQkvKiBmb3JjZSBhcmcgdG8gbGNhc2UgKGFzc3VtZSBjayBpcyBhbHJlYWR5KSAqLwotICAgICAgY2EgPSB0b2xvd2VyKGNhKTsKLSAgICBpZiAoY2EgIT0gY2spCi0gICAgICByZXR1cm4gMDsJCQkvKiBubyBnb29kICovCi0gICAgbm1hdGNoZWQrKzsJCQkvKiBjb3VudCBtYXRjaGVkIGNoYXJhY3RlcnMgKi8KLSAgfQotICAvKiByZWFjaGVkIGVuZCBvZiBhcmd1bWVudDsgZmFpbCBpZiBpdCdzIHRvbyBzaG9ydCBmb3IgdW5pcXVlIGFiYnJldiAqLwotICBpZiAobm1hdGNoZWQgPCBtaW5jaGFycykKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7CQkJLyogQS1PSyAqLwotfQotCi0KLS8qCi0gKiBUaGUgbWFpbiBwcm9ncmFtLgotICovCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBpbnQgYXJnbjsKLSAgY2hhciAqIGFyZzsKLSAgaW50IGtlZXBfQ09NID0gMTsKLSAgY2hhciAqIGNvbW1lbnRfYXJnID0gTlVMTDsKLSAgRklMRSAqIGNvbW1lbnRfZmlsZSA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBjb21tZW50X2xlbmd0aCA9IDA7Ci0gIGludCBtYXJrZXI7Ci0KLSAgLyogT24gTWFjLCBmZXRjaCBhIGNvbW1hbmQgbGluZS4gKi8KLSNpZmRlZiBVU0VfQ0NPTU1BTkQKLSAgYXJnYyA9IGNjb21tYW5kKCZhcmd2KTsKLSNlbmRpZgotCi0gIHByb2duYW1lID0gYXJndlswXTsKLSAgaWYgKHByb2duYW1lID09IE5VTEwgfHwgcHJvZ25hbWVbMF0gPT0gMCkKLSAgICBwcm9nbmFtZSA9ICJ3cmpwZ2NvbSI7CS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLwotCi0gIC8qIFBhcnNlIHN3aXRjaGVzLCBpZiBhbnkgKi8KLSAgZm9yIChhcmduID0gMTsgYXJnbiA8IGFyZ2M7IGFyZ24rKykgewotICAgIGFyZyA9IGFyZ3ZbYXJnbl07Ci0gICAgaWYgKGFyZ1swXSAhPSAnLScpCi0gICAgICBicmVhazsJCQkvKiBub3Qgc3dpdGNoLCBtdXN0IGJlIGZpbGUgbmFtZSAqLwotICAgIGFyZysrOwkJCS8qIGFkdmFuY2Ugb3ZlciAnLScgKi8KLSAgICBpZiAoa2V5bWF0Y2goYXJnLCAicmVwbGFjZSIsIDEpKSB7Ci0gICAgICBrZWVwX0NPTSA9IDA7Ci0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJjZmlsZSIsIDIpKSB7Ci0gICAgICBpZiAoKythcmduID49IGFyZ2MpIHVzYWdlKCk7Ci0gICAgICBpZiAoKGNvbW1lbnRfZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbl0sICJyIikpID09IE5VTEwpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndlthcmduXSk7Ci0JZXhpdChFWElUX0ZBSUxVUkUpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiY29tbWVudCIsIDEpKSB7Ci0gICAgICBpZiAoKythcmduID49IGFyZ2MpIHVzYWdlKCk7Ci0gICAgICBjb21tZW50X2FyZyA9IGFyZ3ZbYXJnbl07Ci0gICAgICAvKiBJZiB0aGUgY29tbWVudCB0ZXh0IHN0YXJ0cyB3aXRoICciJywgdGhlbiB3ZSBhcmUgcHJvYmFibHkgcnVubmluZwotICAgICAgICogdW5kZXIgTVMtRE9HIGFuZCBtdXN0IHBhcnNlIG91dCB0aGUgcXVvdGVkIHN0cmluZyBvdXJzZWx2ZXMuICBTaWdoLgotICAgICAgICovCi0gICAgICBpZiAoY29tbWVudF9hcmdbMF0gPT0gJyInKSB7Ci0JY29tbWVudF9hcmcgPSAoY2hhciAqKSBtYWxsb2MoKHNpemVfdCkgTUFYX0NPTV9MRU5HVEgpOwotCWlmIChjb21tZW50X2FyZyA9PSBOVUxMKQotCSAgRVJSRVhJVCgiSW5zdWZmaWNpZW50IG1lbW9yeSIpOwotCXN0cmNweShjb21tZW50X2FyZywgYXJndlthcmduXSsxKTsKLQlmb3IgKDs7KSB7Ci0JICBjb21tZW50X2xlbmd0aCA9ICh1bnNpZ25lZCBpbnQpIHN0cmxlbihjb21tZW50X2FyZyk7Ci0JICBpZiAoY29tbWVudF9sZW5ndGggPiAwICYmIGNvbW1lbnRfYXJnW2NvbW1lbnRfbGVuZ3RoLTFdID09ICciJykgewotCSAgICBjb21tZW50X2FyZ1tjb21tZW50X2xlbmd0aC0xXSA9ICdcMCc7IC8qIHphcCB0ZXJtaW5hdGluZyBxdW90ZSAqLwotCSAgICBicmVhazsKLQkgIH0KLQkgIGlmICgrK2FyZ24gPj0gYXJnYykKLQkgICAgRVJSRVhJVCgiTWlzc2luZyBlbmRpbmcgcXVvdGUgbWFyayIpOwotCSAgc3RyY2F0KGNvbW1lbnRfYXJnLCAiICIpOwotCSAgc3RyY2F0KGNvbW1lbnRfYXJnLCBhcmd2W2FyZ25dKTsKLQl9Ci0gICAgICB9Ci0gICAgICBjb21tZW50X2xlbmd0aCA9ICh1bnNpZ25lZCBpbnQpIHN0cmxlbihjb21tZW50X2FyZyk7Ci0gICAgfSBlbHNlCi0gICAgICB1c2FnZSgpOwotICB9Ci0KLSAgLyogQ2Fubm90IHVzZSBib3RoIC1jb21tZW50IGFuZCAtY2ZpbGUuICovCi0gIGlmIChjb21tZW50X2FyZyAhPSBOVUxMICYmIGNvbW1lbnRfZmlsZSAhPSBOVUxMKQotICAgIHVzYWdlKCk7Ci0gIC8qIElmIHRoZXJlIGlzIG5laXRoZXIgLWNvbW1lbnQgbm9yIC1jZmlsZSwgd2Ugd2lsbCByZWFkIHRoZSBjb21tZW50IHRleHQKLSAgICogZnJvbSBzdGRpbjsgaW4gdGhpcyBjYXNlIHRoZXJlIE1VU1QgYmUgYW4gaW5wdXQgSlBFRyBmaWxlIG5hbWUuCi0gICAqLwotICBpZiAoY29tbWVudF9hcmcgPT0gTlVMTCAmJiBjb21tZW50X2ZpbGUgPT0gTlVMTCAmJiBhcmduID49IGFyZ2MpCi0gICAgdXNhZ2UoKTsKLQotICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLwotICBpZiAoYXJnbiA8IGFyZ2MpIHsKLSAgICBpZiAoKGluZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbl0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbYXJnbl0pOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KLSNpZmRlZiBVU0VfU0VUTU9ERQkJLyogbmVlZCB0byBoYWNrIGZpbGUgbW9kZT8gKi8KLSAgICBzZXRtb2RlKGZpbGVubyhzdGRpbiksIE9fQklOQVJZKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KLSAgICBpZiAoKGluZmlsZSA9IGZkb3BlbihmaWxlbm8oc3RkaW4pLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gc3RkaW5cbiIsIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0jZWxzZQotICAgIGluZmlsZSA9IHN0ZGluOwotI2VuZGlmCi0gIH0KLQotICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gKi8KLSNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQotICAvKiBNdXN0IGhhdmUgZXhwbGljaXQgb3V0cHV0IGZpbGUgbmFtZSAqLwotICBpZiAoYXJnbiAhPSBhcmdjLTIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBtdXN0IG5hbWUgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0IGZpbGVcbiIsCi0JICAgIHByb2duYW1lKTsKLSAgICB1c2FnZSgpOwotICB9Ci0gIGlmICgob3V0ZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbisxXSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ24rMV0pOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotI2Vsc2UKLSAgLyogVW5peCBzdHlsZTogZXhwZWN0IHplcm8gb3Igb25lIGZpbGUgbmFtZSAqLwotICBpZiAoYXJnbiA8IGFyZ2MtMSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGlucHV0IGZpbGVcbiIsIHByb2duYW1lKTsKLSAgICB1c2FnZSgpOwotICB9Ci0gIC8qIGRlZmF1bHQgb3V0cHV0IGZpbGUgaXMgc3Rkb3V0ICovCi0jaWZkZWYgVVNFX1NFVE1PREUJCS8qIG5lZWQgdG8gaGFjayBmaWxlIG1vZGU/ICovCi0gIHNldG1vZGUoZmlsZW5vKHN0ZG91dCksIE9fQklOQVJZKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KLSAgaWYgKChvdXRmaWxlID0gZmRvcGVuKGZpbGVubyhzdGRvdXQpLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiBzdGRvdXRcbiIsIHByb2duYW1lKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLSNlbHNlCi0gIG91dGZpbGUgPSBzdGRvdXQ7Ci0jZW5kaWYKLSNlbmRpZiAvKiBUV09fRklMRV9DT01NQU5ETElORSAqLwotCi0gIC8qIENvbGxlY3QgY29tbWVudCB0ZXh0IGZyb20gY29tbWVudF9maWxlIG9yIHN0ZGluLCBpZiBuZWNlc3NhcnkgKi8KLSAgaWYgKGNvbW1lbnRfYXJnID09IE5VTEwpIHsKLSAgICBGSUxFICogc3JjX2ZpbGU7Ci0gICAgaW50IGM7Ci0KLSAgICBjb21tZW50X2FyZyA9IChjaGFyICopIG1hbGxvYygoc2l6ZV90KSBNQVhfQ09NX0xFTkdUSCk7Ci0gICAgaWYgKGNvbW1lbnRfYXJnID09IE5VTEwpCi0gICAgICBFUlJFWElUKCJJbnN1ZmZpY2llbnQgbWVtb3J5Iik7Ci0gICAgY29tbWVudF9sZW5ndGggPSAwOwotICAgIHNyY19maWxlID0gKGNvbW1lbnRfZmlsZSAhPSBOVUxMID8gY29tbWVudF9maWxlIDogc3RkaW4pOwotICAgIHdoaWxlICgoYyA9IGdldGMoc3JjX2ZpbGUpKSAhPSBFT0YpIHsKLSAgICAgIGlmIChjb21tZW50X2xlbmd0aCA+PSAodW5zaWduZWQgaW50KSBNQVhfQ09NX0xFTkdUSCkgewotCWZwcmludGYoc3RkZXJyLCAiQ29tbWVudCB0ZXh0IG1heSBub3QgZXhjZWVkICV1IGJ5dGVzXG4iLAotCQkodW5zaWduZWQgaW50KSBNQVhfQ09NX0xFTkdUSCk7Ci0JZXhpdChFWElUX0ZBSUxVUkUpOwotICAgICAgfQotICAgICAgY29tbWVudF9hcmdbY29tbWVudF9sZW5ndGgrK10gPSAoY2hhcikgYzsKLSAgICB9Ci0gICAgaWYgKGNvbW1lbnRfZmlsZSAhPSBOVUxMKQotICAgICAgZmNsb3NlKGNvbW1lbnRfZmlsZSk7Ci0gIH0KLQotICAvKiBDb3B5IEpQRUcgaGVhZGVycyB1bnRpbCBTT0ZuIG1hcmtlcjsKLSAgICogd2Ugd2lsbCBpbnNlcnQgdGhlIG5ldyBjb21tZW50IG1hcmtlciBqdXN0IGJlZm9yZSBTT0ZuLgotICAgKiBUaGlzIChhKSBjYXVzZXMgdGhlIG5ldyBjb21tZW50IHRvIGFwcGVhciBhZnRlciwgcmF0aGVyIHRoYW4gYmVmb3JlLAotICAgKiBleGlzdGluZyBjb21tZW50czsgYW5kIChiKSBlbnN1cmVzIHRoYXQgY29tbWVudHMgY29tZSBhZnRlciBhbnkgSkZJRgotICAgKiBvciBKRlhYIG1hcmtlcnMsIGFzIHJlcXVpcmVkIGJ5IHRoZSBKRklGIHNwZWNpZmljYXRpb24uCi0gICAqLwotICBtYXJrZXIgPSBzY2FuX0pQRUdfaGVhZGVyKGtlZXBfQ09NKTsKLSAgLyogSW5zZXJ0IHRoZSBuZXcgQ09NIG1hcmtlciwgYnV0IG9ubHkgaWYgbm9uZW1wdHkgdGV4dCBoYXMgYmVlbiBzdXBwbGllZCAqLwotICBpZiAoY29tbWVudF9sZW5ndGggPiAwKSB7Ci0gICAgd3JpdGVfbWFya2VyKE1fQ09NKTsKLSAgICB3cml0ZV8yX2J5dGVzKGNvbW1lbnRfbGVuZ3RoICsgMik7Ci0gICAgd2hpbGUgKGNvbW1lbnRfbGVuZ3RoID4gMCkgewotICAgICAgd3JpdGVfMV9ieXRlKCpjb21tZW50X2FyZysrKTsKLSAgICAgIGNvbW1lbnRfbGVuZ3RoLS07Ci0gICAgfQotICB9Ci0gIC8qIER1cGxpY2F0ZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBzb3VyY2UgZmlsZS4KLSAgICogTm90ZSB0aGF0IGFueSBDT00gbWFya2VycyBvY2N1cmluZyBhZnRlciBTT0Ygd2lsbCBub3QgYmUgdG91Y2hlZC4KLSAgICovCi0gIHdyaXRlX21hcmtlcihtYXJrZXIpOwotICBjb3B5X3Jlc3Rfb2ZfZmlsZSgpOwotCi0gIC8qIEFsbCBkb25lLiAqLwotICBleGl0KEVYSVRfU1VDQ0VTUyk7Ci0gIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvd3JwcG0uYyBiL2xpYmpwZWd0d3JwL3dycHBtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNmQ5MDguLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvd3JwcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKgotICogd3JwcG0uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gUFBNL1BHTSBmb3JtYXQuCi0gKiBUaGUgZXh0ZW5kZWQgMi1ieXRlLXBlci1zYW1wbGUgcmF3IFBQTS9QR00gZm9ybWF0cyBhcmUgc3VwcG9ydGVkLgotICogVGhlIFBCTVBMVVMgbGlicmFyeSBpcyBOT1QgcmVxdWlyZWQgdG8gY29tcGlsZSB0aGlzIHNvZnR3YXJlCi0gKiAoYnV0IGl0IGlzIGhpZ2hseSB1c2VmdWwgYXMgYSBzZXQgb2YgUFBNIGltYWdlIG1hbmlwdWxhdGlvbiBwcm9ncmFtcykuCi0gKgotICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKLSAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bwotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBQUE1fU1VQUE9SVEVECi0KLQotLyoKLSAqIEZvciAxMi1iaXQgSlBFRyBkYXRhLCB3ZSBlaXRoZXIgZG93bnNjYWxlIHRoZSB2YWx1ZXMgdG8gOCBiaXRzCi0gKiAodG8gd3JpdGUgc3RhbmRhcmQgYnl0ZS1wZXItc2FtcGxlIFBQTS9QR00gZmlsZXMpLCBvciBvdXRwdXQKLSAqIG5vbnN0YW5kYXJkIHdvcmQtcGVyLXNhbXBsZSBQUE0vUEdNIGZpbGVzLiAgRG93bnNjYWxpbmcgaXMgZG9uZQotICogaWYgUFBNX05PUkFXV09SRCBpcyBkZWZpbmVkICh0aGlzIGNhbiBiZSBkb25lIGluIHRoZSBNYWtlZmlsZQotICogb3IgaW4gamNvbmZpZy5oKS4KLSAqIChXaGVuIHRoZSBjb3JlIGxpYnJhcnkgc3VwcG9ydHMgZGF0YSBwcmVjaXNpb24gcmVkdWN0aW9uLCBhIGNsZWFuZXIKLSAqIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdG8gYXNrIGZvciB0aGF0IGluc3RlYWQuKQotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBQVVRQUE1TQU1QTEUocHRyLHYpICAqcHRyKysgPSAoY2hhcikgKHYpCi0jZGVmaW5lIEJZVEVTUEVSU0FNUExFIDEKLSNkZWZpbmUgUFBNX01BWFZBTCAyNTUKLSNlbHNlCi0jaWZkZWYgUFBNX05PUkFXV09SRAotI2RlZmluZSBQVVRQUE1TQU1QTEUocHRyLHYpICAqcHRyKysgPSAoY2hhcikgKCh2KSA+PiAoQklUU19JTl9KU0FNUExFLTgpKQotI2RlZmluZSBCWVRFU1BFUlNBTVBMRSAxCi0jZGVmaW5lIFBQTV9NQVhWQUwgMjU1Ci0jZWxzZQotLyogVGhlIHdvcmQtcGVyLXNhbXBsZSBmb3JtYXQgYWx3YXlzIHB1dHMgdGhlIExTQiBmaXJzdC4gKi8KLSNkZWZpbmUgUFVUUFBNU0FNUExFKHB0cix2KQkJCVwKLQl7IHJlZ2lzdGVyIGludCB2YWxfID0gdjsJCVwKLQkgICpwdHIrKyA9IChjaGFyKSAodmFsXyAmIDB4RkYpOwlcCi0JICAqcHRyKysgPSAoY2hhcikgKCh2YWxfID4+IDgpICYgMHhGRik7CVwKLQl9Ci0jZGVmaW5lIEJZVEVTUEVSU0FNUExFIDIKLSNkZWZpbmUgUFBNX01BWFZBTCAoKDE8PEJJVFNfSU5fSlNBTVBMRSktMSkKLSNlbmRpZgotI2VuZGlmCi0KLQotLyoKLSAqIFdoZW4gSlNBTVBMRSBpcyB0aGUgc2FtZSBzaXplIGFzIGNoYXIsIHdlIGNhbiBqdXN0IGZ3cml0ZSgpIHRoZQotICogZGVjb21wcmVzc2VkIGRhdGEgdG8gdGhlIFBQTSBvciBQR00gZmlsZS4gIE9uIFBDcywgaW4gb3JkZXIgdG8gbWFrZSB0aGlzCi0gKiB3b3JrIHRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgYWxsb2NhdGVkIGluIG5lYXIgZGF0YSBzcGFjZSwgYmVjYXVzZSB3ZSBhcmUKLSAqIGFzc3VtaW5nIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsIHdoZXJlaW4gZndyaXRlKCkgY2FuJ3QgcmVhY2ggZmFyIG1lbW9yeS4KLSAqIElmIHlvdSBuZWVkIHRvIHByb2Nlc3MgdmVyeSB3aWRlIGltYWdlcyBvbiBhIFBDLCB5b3UgbWlnaHQgaGF2ZSB0byBjb21waWxlCi0gKiBpbiBsYXJnZS1tZW1vcnkgbW9kZWwsIG9yIGVsc2UgcmVwbGFjZSBmd3JpdGUoKSB3aXRoIGEgcHV0YygpIGxvb3AgLS0tCi0gKiB3aGljaCB3aWxsIGJlIG11Y2ggc2xvd2VyLgotICovCi0KLQotLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFVzdWFsbHkgdGhlc2UgdHdvIHBvaW50ZXJzIHBvaW50IHRvIHRoZSBzYW1lIHBsYWNlOiAqLwotICBjaGFyICppb2J1ZmZlcjsJCS8qIGZ3cml0ZSdzIEkvTyBidWZmZXIgKi8KLSAgSlNBTVBST1cgcGl4cm93OwkJLyogZGVjb21wcmVzc29yIG91dHB1dCBidWZmZXIgKi8KLSAgc2l6ZV90IGJ1ZmZlcl93aWR0aDsJCS8qIHdpZHRoIG9mIEkvTyBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiBzYW1wbGVzX3Blcl9yb3c7CS8qIEpTQU1QTEVzIHBlciBvdXRwdXQgcm93ICovCi19IHBwbV9kZXN0X3N0cnVjdDsKLQotdHlwZWRlZiBwcG1fZGVzdF9zdHJ1Y3QgKiBwcG1fZGVzdF9wdHI7Ci0KLQotLyoKLSAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YS4KLSAqIEluIHRoaXMgbW9kdWxlIHJvd3Nfc3VwcGxpZWQgd2lsbCBhbHdheXMgYmUgMS4KLSAqCi0gKiBwdXRfcGl4ZWxfcm93cyBoYW5kbGVzIHRoZSAibm9ybWFsIiA4LWJpdCBjYXNlIHdoZXJlIHRoZSBkZWNvbXByZXNzb3IKLSAqIG91dHB1dCBidWZmZXIgaXMgcGh5c2ljYWxseSB0aGUgc2FtZSBhcyB0aGUgZndyaXRlIGJ1ZmZlci4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotewotICBwcG1fZGVzdF9wdHIgZGVzdCA9IChwcG1fZGVzdF9wdHIpIGRpbmZvOwotCi0gICh2b2lkKSBKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgZGVzdC0+aW9idWZmZXIsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Ci19Ci0KLQotLyoKLSAqIFRoaXMgY29kZSBpcyB1c2VkIHdoZW4gd2UgaGF2ZSB0byBjb3B5IHRoZSBkYXRhIGFuZCBhcHBseSBhIHBpeGVsCi0gKiBmb3JtYXQgdHJhbnNsYXRpb24uICBUeXBpY2FsbHkgdGhpcyBvbmx5IGhhcHBlbnMgaW4gMTItYml0IG1vZGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1jb3B5X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQkgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotewotICBwcG1fZGVzdF9wdHIgZGVzdCA9IChwcG1fZGVzdF9wdHIpIGRpbmZvOwotICByZWdpc3RlciBjaGFyICogYnVmZmVycHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotCi0gIHB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07Ci0gIGJ1ZmZlcnB0ciA9IGRlc3QtPmlvYnVmZmVyOwotICBmb3IgKGNvbCA9IGRlc3QtPnNhbXBsZXNfcGVyX3JvdzsgY29sID4gMDsgY29sLS0pIHsKLSAgICBQVVRQUE1TQU1QTEUoYnVmZmVycHRyLCBHRVRKU0FNUExFKCpwdHIrKykpOwotICB9Ci0gICh2b2lkKSBKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgZGVzdC0+aW9idWZmZXIsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Ci19Ci0KLQotLyoKLSAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YSB3aGVuIGNvbG9yIHF1YW50aXphdGlvbiBpcyBpbiBlZmZlY3QuCi0gKiBXZSBoYXZlIHRvIGRlbWFwIHRoZSBjb2xvciBpbmRleCB2YWx1ZXMgdG8gc3RyYWlnaHQgZGF0YS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9kZW1hcHBlZF9yZ2IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQkgIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKLXsKLSAgcHBtX2Rlc3RfcHRyIGRlc3QgPSAocHBtX2Rlc3RfcHRyKSBkaW5mbzsKLSAgcmVnaXN0ZXIgY2hhciAqIGJ1ZmZlcnB0cjsKLSAgcmVnaXN0ZXIgaW50IHBpeHZhbDsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBjb2xvcl9tYXAwID0gY2luZm8tPmNvbG9ybWFwWzBdOwotICByZWdpc3RlciBKU0FNUFJPVyBjb2xvcl9tYXAxID0gY2luZm8tPmNvbG9ybWFwWzFdOwotICByZWdpc3RlciBKU0FNUFJPVyBjb2xvcl9tYXAyID0gY2luZm8tPmNvbG9ybWFwWzJdOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLQotICBwdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBidWZmZXJwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIHBpeHZhbCA9IEdFVEpTQU1QTEUoKnB0cisrKTsKLSAgICBQVVRQUE1TQU1QTEUoYnVmZmVycHRyLCBHRVRKU0FNUExFKGNvbG9yX21hcDBbcGl4dmFsXSkpOwotICAgIFBVVFBQTVNBTVBMRShidWZmZXJwdHIsIEdFVEpTQU1QTEUoY29sb3JfbWFwMVtwaXh2YWxdKSk7Ci0gICAgUFVUUFBNU0FNUExFKGJ1ZmZlcnB0ciwgR0VUSlNBTVBMRShjb2xvcl9tYXAyW3BpeHZhbF0pKTsKLSAgfQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotcHV0X2RlbWFwcGVkX2dyYXkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQkgICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCi17Ci0gIHBwbV9kZXN0X3B0ciBkZXN0ID0gKHBwbV9kZXN0X3B0cikgZGluZm87Ci0gIHJlZ2lzdGVyIGNoYXIgKiBidWZmZXJwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwID0gY2luZm8tPmNvbG9ybWFwWzBdOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLQotICBwdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBidWZmZXJwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIFBVVFBQTVNBTVBMRShidWZmZXJwdHIsIEdFVEpTQU1QTEUoY29sb3JfbWFwW0dFVEpTQU1QTEUoKnB0cisrKV0pKTsKLSAgfQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi0KLS8qCi0gKiBTdGFydHVwOiB3cml0ZSB0aGUgZmlsZSBoZWFkZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9vdXRwdXRfcHBtIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgcHBtX2Rlc3RfcHRyIGRlc3QgPSAocHBtX2Rlc3RfcHRyKSBkaW5mbzsKLQotICAvKiBFbWl0IGZpbGUgaGVhZGVyICovCi0gIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgLyogZW1pdCBoZWFkZXIgZm9yIHJhdyBQR00gZm9ybWF0ICovCi0gICAgZnByaW50ZihkZXN0LT5wdWIub3V0cHV0X2ZpbGUsICJQNVxuJWxkICVsZFxuJWRcbiIsCi0JICAgIChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoLCAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQsCi0JICAgIFBQTV9NQVhWQUwpOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19SR0I6Ci0gICAgLyogZW1pdCBoZWFkZXIgZm9yIHJhdyBQUE0gZm9ybWF0ICovCi0gICAgZnByaW50ZihkZXN0LT5wdWIub3V0cHV0X2ZpbGUsICJQNlxuJWxkICVsZFxuJWRcbiIsCi0JICAgIChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoLCAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQsCi0JICAgIFBQTV9NQVhWQUwpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUFBNX0NPTE9SU1BBQ0UpOwotICB9Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX291dHB1dF9wcG0gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQotewotICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCi0gIGZmbHVzaChkaW5mby0+b3V0cHV0X2ZpbGUpOwotICBpZiAoZmVycm9yKGRpbmZvLT5vdXRwdXRfZmlsZSkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgUFBNIGZvcm1hdCBvdXRwdXQuCi0gKi8KLQotR0xPQkFMKGRqcGVnX2Rlc3RfcHRyKQotamluaXRfd3JpdGVfcHBtIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwcG1fZGVzdF9wdHIgZGVzdDsKLQotICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QsIGZpbGwgaW4gbWV0aG9kIHBvaW50ZXJzICovCi0gIGRlc3QgPSAocHBtX2Rlc3RfcHRyKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihwcG1fZGVzdF9zdHJ1Y3QpKTsKLSAgZGVzdC0+cHViLnN0YXJ0X291dHB1dCA9IHN0YXJ0X291dHB1dF9wcG07Ci0gIGRlc3QtPnB1Yi5maW5pc2hfb3V0cHV0ID0gZmluaXNoX291dHB1dF9wcG07Ci0KLSAgLyogQ2FsY3VsYXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIHNvIHdlIGNhbiBhbGxvY2F0ZSBzcGFjZSAqLwotICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOwotCi0gIC8qIENyZWF0ZSBwaHlzaWNhbCBJL08gYnVmZmVyLiAgTm90ZSB3ZSBtYWtlIHRoaXMgbmVhciBvbiBhIFBDLiAqLwotICBkZXN0LT5zYW1wbGVzX3Blcl9yb3cgPSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOwotICBkZXN0LT5idWZmZXJfd2lkdGggPSBkZXN0LT5zYW1wbGVzX3Blcl9yb3cgKiAoQllURVNQRVJTQU1QTEUgKiBTSVpFT0YoY2hhcikpOwotICBkZXN0LT5pb2J1ZmZlciA9IChjaGFyICopICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKLQotICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycyB8fCBCSVRTX0lOX0pTQU1QTEUgIT0gOCB8fAotICAgICAgU0laRU9GKEpTQU1QTEUpICE9IFNJWkVPRihjaGFyKSkgewotICAgIC8qIFdoZW4gcXVhbnRpemluZywgd2UgbmVlZCBhbiBvdXRwdXQgYnVmZmVyIGZvciBjb2xvcm1hcCBpbmRleGVzCi0gICAgICogdGhhdCdzIHNlcGFyYXRlIGZyb20gdGhlIHBoeXNpY2FsIEkvTyBidWZmZXIuICBXZSBhbHNvIG5lZWQgYQotICAgICAqIHNlcGFyYXRlIGJ1ZmZlciBpZiBwaXhlbCBmb3JtYXQgdHJhbnNsYXRpb24gbXVzdCB0YWtlIHBsYWNlLgotICAgICAqLwotICAgIGRlc3QtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cywgKEpESU1FTlNJT04pIDEpOwotICAgIGRlc3QtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKLSAgICBpZiAoISBjaW5mby0+cXVhbnRpemVfY29sb3JzKQotICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gY29weV9waXhlbF9yb3dzOwotICAgIGVsc2UgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkKLSAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9kZW1hcHBlZF9ncmF5OwotICAgIGVsc2UKLSAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9kZW1hcHBlZF9yZ2I7Ci0gIH0gZWxzZSB7Ci0gICAgLyogV2Ugd2lsbCBmd3JpdGUoKSBkaXJlY3RseSBmcm9tIGRlY29tcHJlc3NvciBvdXRwdXQgYnVmZmVyLiAqLwotICAgIC8qIFN5bnRoZXNpemUgYSBKU0FNUEFSUkFZIHBvaW50ZXIgc3RydWN0dXJlICovCi0gICAgLyogQ2FzdCBoZXJlIGltcGxpZXMgbmVhci0+ZmFyIHBvaW50ZXIgY29udmVyc2lvbiBvbiBQQ3MgKi8KLSAgICBkZXN0LT5waXhyb3cgPSAoSlNBTVBST1cpIGRlc3QtPmlvYnVmZmVyOwotICAgIGRlc3QtPnB1Yi5idWZmZXIgPSAmIGRlc3QtPnBpeHJvdzsKLSAgICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci0gICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X3BpeGVsX3Jvd3M7Ci0gIH0KLQotICByZXR1cm4gKGRqcGVnX2Rlc3RfcHRyKSBkZXN0OwotfQotCi0jZW5kaWYgLyogUFBNX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvd3JybGUuYyBiL2xpYmpwZWd0d3JwL3dycmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTczMzcuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvd3JybGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKgotICogd3JybGUuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gUkxFIGZvcm1hdC4KLSAqIFRoZSBVdGFoIFJhc3RlciBUb29sa2l0IGxpYnJhcnkgaXMgcmVxdWlyZWQgKHZlcnNpb24gMy4xIG9yIGxhdGVyKS4KLSAqCi0gKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgotICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgb3V0cHV0IHRvCi0gKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uCi0gKgotICogQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBNaWtlIExpamV3c2tpLAotICogd2l0aCB1cGRhdGVzIGZyb20gUm9iZXJ0IEh1dGNoaW5zb24uCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLQotI2lmZGVmIFJMRV9TVVBQT1JURUQKLQotLyogcmxlLmggaXMgcHJvdmlkZWQgYnkgdGhlIFV0YWggUmFzdGVyIFRvb2xraXQuICovCi0KLSNpbmNsdWRlIDxybGUuaD4KLQotLyoKLSAqIFdlIGFzc3VtZSB0aGF0IEpTQU1QTEUgaGFzIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFzIHJsZV9waXhlbCwKLSAqIHRvIHdpdCwgInVuc2lnbmVkIGNoYXIiLiAgSGVuY2Ugd2UgY2FuJ3QgY29wZSB3aXRoIDEyLSBvciAxNi1iaXQgc2FtcGxlcy4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgSlNBTVBMRXMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLQotLyoKLSAqIFNpbmNlIFJMRSBzdG9yZXMgc2NhbmxpbmVzIGJvdHRvbS10by10b3AsIHdlIGhhdmUgdG8gaW52ZXJ0IHRoZSBpbWFnZQotICogZnJvbSBKUEVHJ3MgdG9wLXRvLWJvdHRvbSBvcmRlci4gIFRvIGRvIHRoaXMsIHdlIHNhdmUgdGhlIG91dGdvaW5nIGRhdGEKLSAqIGluIGEgdmlydHVhbCBhcnJheSBkdXJpbmcgcHV0X3BpeGVsX3JvdyBjYWxscywgdGhlbiBhY3R1YWxseSBlbWl0IHRoZQotICogUkxFIGZpbGUgZHVyaW5nIGZpbmlzaF9vdXRwdXQuCi0gKi8KLQotCi0vKgotICogRm9yIG5vdywgaWYgd2UgZW1pdCBhbiBSTEUgY29sb3IgbWFwIHRoZW4gaXQgaXMgYWx3YXlzIDI1NiBlbnRyaWVzIGxvbmcsCi0gKiB0aG91Z2ggbm90IGFsbCBvZiB0aGUgZW50cmllcyBuZWVkIGJlIHVzZWQuCi0gKi8KLQotI2RlZmluZSBDTUFQQklUUwk4Ci0jZGVmaW5lIENNQVBMRU5HVEgJKDE8PChDTUFQQklUUykpCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGp2aXJ0X3NhcnJheV9wdHIgaW1hZ2U7CS8qIHZpcnR1YWwgYXJyYXkgdG8gc3RvcmUgdGhlIG91dHB1dCBpbWFnZSAqLwotICBybGVfbWFwICpjb2xvcm1hcDsJIAkvKiBSTEUtc3R5bGUgY29sb3IgbWFwLCBvciBOVUxMIGlmIG5vbmUgKi8KLSAgcmxlX3BpeGVsICoqcmxlX3JvdzsJCS8qIFRvIHBhc3Mgcm93cyB0byBybGVfcHV0cm93KCkgKi8KLQotfSBybGVfZGVzdF9zdHJ1Y3Q7Ci0KLXR5cGVkZWYgcmxlX2Rlc3Rfc3RydWN0ICogcmxlX2Rlc3RfcHRyOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKHZvaWQpIHJsZV9wdXRfcGl4ZWxfcm93cwotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCi0JIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkpOwotCi0KLS8qCi0gKiBXcml0ZSB0aGUgZmlsZSBoZWFkZXIuCi0gKgotICogSW4gdGhpcyBtb2R1bGUgaXQncyBlYXNpZXIgdG8gd2FpdCB0aWxsIGZpbmlzaF9vdXRwdXQgdG8gd3JpdGUgYW55dGhpbmcuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9vdXRwdXRfcmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgcmxlX2Rlc3RfcHRyIGRlc3QgPSAocmxlX2Rlc3RfcHRyKSBkaW5mbzsKLSAgc2l6ZV90IGNtYXBzaXplOwotICBpbnQgaSwgY2k7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKLSNlbmRpZgotCi0gIC8qCi0gICAqIE1ha2Ugc3VyZSB0aGUgaW1hZ2UgY2FuIGJlIHN0b3JlZCBpbiBSTEUgZm9ybWF0LgotICAgKgotICAgKiAtIFJMRSBzdG9yZXMgaW1hZ2UgZGltZW5zaW9ucyBhcyAqc2lnbmVkKiAxNiBiaXQgaW50ZWdlcnMuICBKUEVHCi0gICAqICAgdXNlcyB1bnNpZ25lZCwgc28gd2UgaGF2ZSB0byBjaGVjayB0aGUgd2lkdGguCi0gICAqCi0gICAqIC0gQ29sb3JzcGFjZSBpcyBleHBlY3RlZCB0byBiZSBncmF5c2NhbGUgb3IgUkdCLgotICAgKgotICAgKiAtIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKGNvbXBvbmVudHMpIGlzIGV4cGVjdGVkIHRvIGJlIDEgKGdyYXlzY2FsZS8KLSAgICogICBwc2V1ZG9jb2xvcikgb3IgMyAodHJ1ZWNvbG9yL2RpcmVjdGNvbG9yKS4KLSAgICogICAoY291bGQgYmUgMiBvciA0IGlmIHVzaW5nIGFuIGFscGhhIGNoYW5uZWwsIGJ1dCB3ZSBhcmVuJ3QpCi0gICAqLwotCi0gIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoID4gMzI3NjcgfHwgY2luZm8tPm91dHB1dF9oZWlnaHQgPiAzMjc2NykKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9STEVfRElNRU5TSU9OUywgY2luZm8tPm91dHB1dF93aWR0aCwgCi0JICAgICBjaW5mby0+b3V0cHV0X2hlaWdodCk7Ci0KLSAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX0dSQVlTQ0FMRSAmJgotICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX0NPTE9SU1BBQ0UpOwotCi0gIGlmIChjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgIT0gMSAmJiBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgIT0gMykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9STEVfVE9PTUFOWUNIQU5ORUxTLCBjaW5mby0+bnVtX2NvbXBvbmVudHMpOwotCi0gIC8qIENvbnZlcnQgY29sb3JtYXAsIGlmIGFueSwgdG8gUkxFIGZvcm1hdC4gKi8KLQotICBkZXN0LT5jb2xvcm1hcCA9IE5VTEw7Ci0KLSAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKLSAgICAvKiBBbGxvY2F0ZSBzdG9yYWdlIGZvciBSTEUtc3R5bGUgY21hcCwgemVybyBhbnkgZXh0cmEgZW50cmllcyAqLwotICAgIGNtYXBzaXplID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICogQ01BUExFTkdUSCAqIFNJWkVPRihybGVfbWFwKTsKLSAgICBkZXN0LT5jb2xvcm1hcCA9IChybGVfbWFwICopICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBjbWFwc2l6ZSk7Ci0gICAgTUVNWkVSTyhkZXN0LT5jb2xvcm1hcCwgY21hcHNpemUpOwotCi0gICAgLyogU2F2ZSBhd2F5IGRhdGEgaW4gUkxFIGZvcm1hdCAtLS0gbm90ZSA4LWJpdCBsZWZ0IHNoaWZ0ISAqLwotICAgIC8qIFNoaWZ0aW5nIHdvdWxkIG5lZWQgYWRqdXN0bWVudCBmb3IgSlNBTVBMRXMgd2lkZXIgdGhhbiA4IGJpdHMuICovCi0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOyBpKyspIHsKLSAgICAgICAgZGVzdC0+Y29sb3JtYXBbY2kgKiBDTUFQTEVOR1RIICsgaV0gPQotICAgICAgICAgIEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwW2NpXVtpXSkgPDwgODsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBTZXQgdGhlIG91dHB1dCBidWZmZXIgdG8gdGhlIGZpcnN0IHJvdyAqLwotICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT5pbWFnZSwgKEpESU1FTlNJT04pIDAsIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotCi0gIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHJsZV9wdXRfcGl4ZWxfcm93czsKLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgIC8qIGNvdW50IGZpbGUgd3JpdGluZyBhcyBzZXBhcmF0ZSBwYXNzICovCi0gIH0KLSNlbmRpZgotfQotCi0KLS8qCi0gKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCi0gKgotICogVGhpcyByb3V0aW5lIGp1c3Qgc2F2ZXMgdGhlIGRhdGEgYXdheSBpbiBhIHZpcnR1YWwgYXJyYXkuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1ybGVfcHV0X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQkgICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotewotICBybGVfZGVzdF9wdHIgZGVzdCA9IChybGVfZGVzdF9wdHIpIGRpbmZvOwotCi0gIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lIDwgY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKLSAgICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPmltYWdlLAotICAgICAgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUsIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgfQotfQotCi0vKgotICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gKgotICogSGVyZSBpcyB3aGVyZSB3ZSByZWFsbHkgb3V0cHV0IHRoZSBSTEUgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9vdXRwdXRfcmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgcmxlX2Rlc3RfcHRyIGRlc3QgPSAocmxlX2Rlc3RfcHRyKSBkaW5mbzsKLSAgcmxlX2hkciBoZWFkZXI7CQkvKiBPdXRwdXQgZmlsZSBpbmZvcm1hdGlvbiAqLwotICBybGVfcGl4ZWwgKipybGVfcm93LCAqcmVkLCAqZ3JlZW4sICpibHVlOwotICBKU0FNUFJPVyBvdXRwdXRfcm93OwotICBjaGFyIGNtYXBjb21tZW50WzgwXTsKLSAgaW50IHJvdywgY29sOwotICBpbnQgY2k7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKLSNlbmRpZgotCi0gIC8qIEluaXRpYWxpemUgdGhlIGhlYWRlciBpbmZvICovCi0gIGhlYWRlciA9ICpybGVfaGRyX2luaXQoTlVMTCk7Ci0gIGhlYWRlci5ybGVfZmlsZSA9IGRlc3QtPnB1Yi5vdXRwdXRfZmlsZTsKLSAgaGVhZGVyLnhtaW4gICAgID0gMDsKLSAgaGVhZGVyLnhtYXggICAgID0gY2luZm8tPm91dHB1dF93aWR0aCAgLSAxOwotICBoZWFkZXIueW1pbiAgICAgPSAwOwotICBoZWFkZXIueW1heCAgICAgPSBjaW5mby0+b3V0cHV0X2hlaWdodCAtIDE7Ci0gIGhlYWRlci5hbHBoYSAgICA9IDA7Ci0gIGhlYWRlci5uY29sb3JzICA9IGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm91dHB1dF9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgUkxFX1NFVF9CSVQoaGVhZGVyLCBjaSk7Ci0gIH0KLSAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKLSAgICBoZWFkZXIubmNtYXAgICA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKLSAgICBoZWFkZXIuY21hcGxlbiA9IENNQVBCSVRTOwotICAgIGhlYWRlci5jbWFwICAgID0gZGVzdC0+Y29sb3JtYXA7Ci0gICAgLyogQWRkIGEgY29tbWVudCB0byB0aGUgb3V0cHV0IGltYWdlIHdpdGggdGhlIHRydWUgY29sb3JtYXAgbGVuZ3RoLiAqLwotICAgIHNwcmludGYoY21hcGNvbW1lbnQsICJjb2xvcl9tYXBfbGVuZ3RoPSVkIiwgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzKTsKLSAgICBybGVfcHV0Y29tKGNtYXBjb21tZW50LCAmaGVhZGVyKTsKLSAgfQotCi0gIC8qIEVtaXQgdGhlIFJMRSBoZWFkZXIgYW5kIGNvbG9yIG1hcCAoaWYgYW55KSAqLwotICBybGVfcHV0X3NldHVwKCZoZWFkZXIpOwotCi0gIC8qIE5vdyBvdXRwdXQgdGhlIFJMRSBkYXRhIGZyb20gb3VyIHZpcnR1YWwgYXJyYXkuCi0gICAqIFdlIGFzc3VtZSBoZXJlIHRoYXQgKGEpIHJsZV9waXhlbCBpcyByZXByZXNlbnRlZCB0aGUgc2FtZSBhcyBKU0FNUExFLAotICAgKiBhbmQgKGIpIHdlIGFyZSBub3Qgb24gYSBtYWNoaW5lIHdoZXJlIEZBUiBwb2ludGVycyBkaWZmZXIgZnJvbSByZWd1bGFyLgotICAgKi8KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0OwotICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gMDsKLSAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgfQotI2VuZGlmCi0KLSAgaWYgKGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9PSAxKSB7Ci0gICAgZm9yIChyb3cgPSBjaW5mby0+b3V0cHV0X2hlaWdodC0xOyByb3cgPj0gMDsgcm93LS0pIHsKLSAgICAgIHJsZV9yb3cgPSAocmxlX3BpeGVsICoqKSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT5pbWFnZSwKLQkgKEpESU1FTlNJT04pIHJvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKLSAgICAgIHJsZV9wdXRyb3cocmxlX3JvdywgKGludCkgY2luZm8tPm91dHB1dF93aWR0aCwgJmhlYWRlcik7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOwotICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKHJvdyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0LTE7IHJvdyA+PSAwOyByb3ctLSkgewotICAgICAgcmxlX3JvdyA9IChybGVfcGl4ZWwgKiopIGRlc3QtPnJsZV9yb3c7Ci0gICAgICBvdXRwdXRfcm93ID0gKiAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT5pbWFnZSwKLQkgKEpESU1FTlNJT04pIHJvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKLSAgICAgIHJlZCA9IHJsZV9yb3dbMF07Ci0gICAgICBncmVlbiA9IHJsZV9yb3dbMV07Ci0gICAgICBibHVlID0gcmxlX3Jvd1syXTsKLSAgICAgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAgICAgKnJlZCsrID0gR0VUSlNBTVBMRSgqb3V0cHV0X3JvdysrKTsKLSAgICAgICAgKmdyZWVuKysgPSBHRVRKU0FNUExFKCpvdXRwdXRfcm93KyspOwotICAgICAgICAqYmx1ZSsrID0gR0VUSlNBTVBMRSgqb3V0cHV0X3JvdysrKTsKLSAgICAgIH0KLSAgICAgIHJsZV9wdXRyb3cocmxlX3JvdywgKGludCkgY2luZm8tPm91dHB1dF93aWR0aCwgJmhlYWRlcik7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOwotICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgfQotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGlmIChwcm9ncmVzcyAhPSBOVUxMKQotICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7Ci0jZW5kaWYKLQotICAvKiBFbWl0IGZpbGUgdHJhaWxlciAqLwotICBybGVfcHV0ZW9mKCZoZWFkZXIpOwotICBmZmx1c2goZGVzdC0+cHViLm91dHB1dF9maWxlKTsKLSAgaWYgKGZlcnJvcihkZXN0LT5wdWIub3V0cHV0X2ZpbGUpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFJMRSBmb3JtYXQgb3V0cHV0LgotICovCi0KLUdMT0JBTChkanBlZ19kZXN0X3B0cikKLWppbml0X3dyaXRlX3JsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcmxlX2Rlc3RfcHRyIGRlc3Q7Ci0KLSAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLwotICBkZXN0ID0gKHJsZV9kZXN0X3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRU9GKHJsZV9kZXN0X3N0cnVjdCkpOwotICBkZXN0LT5wdWIuc3RhcnRfb3V0cHV0ID0gc3RhcnRfb3V0cHV0X3JsZTsKLSAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X3JsZTsKLQotICAvKiBDYWxjdWxhdGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlICovCi0gIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7Ci0KLSAgLyogQWxsb2NhdGUgYSB3b3JrIGFycmF5IGZvciBvdXRwdXQgdG8gdGhlIFJMRSBsaWJyYXJ5LiAqLwotICBkZXN0LT5ybGVfcm93ID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgY2luZm8tPm91dHB1dF93aWR0aCwgKEpESU1FTlNJT04pIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyk7Ci0KLSAgLyogQWxsb2NhdGUgYSB2aXJ0dWFsIGFycmF5IHRvIGhvbGQgdGhlIGltYWdlLiAqLwotICBkZXN0LT5pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLSAgICAgKEpESU1FTlNJT04pIChjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dHB1dF9jb21wb25lbnRzKSwKLSAgICAgY2luZm8tPm91dHB1dF9oZWlnaHQsIChKRElNRU5TSU9OKSAxKTsKLQotICByZXR1cm4gKGRqcGVnX2Rlc3RfcHRyKSBkZXN0OwotfQotCi0jZW5kaWYgLyogUkxFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvd3J0YXJnYS5jIGIvbGlianBlZ3R3cnAvd3J0YXJnYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjEwNGQyLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3dydGFyZ2EuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKgotICogd3J0YXJnYS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgb3V0cHV0IGltYWdlcyBpbiBUYXJnYSBmb3JtYXQuCi0gKgotICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKLSAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bwotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgotICoKLSAqIEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgTGVlIERhbmllbCBDcm9ja2VyLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLQotCi0vKgotICogVG8gc3VwcG9ydCAxMi1iaXQgSlBFRyBkYXRhLCB3ZSdkIGhhdmUgdG8gc2NhbGUgb3V0cHV0IGRvd24gdG8gOCBiaXRzLgotICogVGhpcyBpcyBub3QgeWV0IGltcGxlbWVudGVkLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4LWJpdCBKU0FNUExFcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotLyoKLSAqIFRoZSBvdXRwdXQgYnVmZmVyIG5lZWRzIHRvIGJlIHdyaXRhYmxlIGJ5IGZ3cml0ZSgpLiAgT24gUENzLCB3ZSBtdXN0Ci0gKiBhbGxvY2F0ZSB0aGUgYnVmZmVyIGluIG5lYXIgZGF0YSBzcGFjZSwgYmVjYXVzZSB3ZSBhcmUgYXNzdW1pbmcgc21hbGwtZGF0YQotICogbWVtb3J5IG1vZGVsLCB3aGVyZWluIGZ3cml0ZSgpIGNhbid0IHJlYWNoIGZhciBtZW1vcnkuICBJZiB5b3UgbmVlZCB0bwotICogcHJvY2VzcyB2ZXJ5IHdpZGUgaW1hZ2VzIG9uIGEgUEMsIHlvdSBtaWdodCBoYXZlIHRvIGNvbXBpbGUgaW4gbGFyZ2UtbWVtb3J5Ci0gKiBtb2RlbCwgb3IgZWxzZSByZXBsYWNlIGZ3cml0ZSgpIHdpdGggYSBwdXRjKCkgbG9vcCAtLS0gd2hpY2ggd2lsbCBiZSBtdWNoCi0gKiBzbG93ZXIuCi0gKi8KLQotCi0vKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QgZGpwZWdfZGVzdF9zdHJ1Y3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgY2hhciAqaW9idWZmZXI7CQkvKiBwaHlzaWNhbCBJL08gYnVmZmVyICovCi0gIEpESU1FTlNJT04gYnVmZmVyX3dpZHRoOwkvKiB3aWR0aCBvZiBvbmUgcm93ICovCi19IHRnYV9kZXN0X3N0cnVjdDsKLQotdHlwZWRlZiB0Z2FfZGVzdF9zdHJ1Y3QgKiB0Z2FfZGVzdF9wdHI7Ci0KLQotTE9DQUwodm9pZCkKLXdyaXRlX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sIGludCBudW1fY29sb3JzKQotLyogQ3JlYXRlIGFuZCB3cml0ZSBhIFRhcmdhIGhlYWRlciAqLwotewotICBjaGFyIHRhcmdhaGVhZGVyWzE4XTsKLQotICAvKiBTZXQgdW51c2VkIGZpZWxkcyBvZiBoZWFkZXIgdG8gMCAqLwotICBNRU1aRVJPKHRhcmdhaGVhZGVyLCBTSVpFT0YodGFyZ2FoZWFkZXIpKTsKLQotICBpZiAobnVtX2NvbG9ycyA+IDApIHsKLSAgICB0YXJnYWhlYWRlclsxXSA9IDE7CQkvKiBjb2xvciBtYXAgdHlwZSAxICovCi0gICAgdGFyZ2FoZWFkZXJbNV0gPSAoY2hhcikgKG51bV9jb2xvcnMgJiAweEZGKTsKLSAgICB0YXJnYWhlYWRlcls2XSA9IChjaGFyKSAobnVtX2NvbG9ycyA+PiA4KTsKLSAgICB0YXJnYWhlYWRlcls3XSA9IDI0OwkvKiAyNCBiaXRzIHBlciBjbWFwIGVudHJ5ICovCi0gIH0KLQotICB0YXJnYWhlYWRlclsxMl0gPSAoY2hhcikgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAweEZGKTsKLSAgdGFyZ2FoZWFkZXJbMTNdID0gKGNoYXIpIChjaW5mby0+b3V0cHV0X3dpZHRoID4+IDgpOwotICB0YXJnYWhlYWRlclsxNF0gPSAoY2hhcikgKGNpbmZvLT5vdXRwdXRfaGVpZ2h0ICYgMHhGRik7Ci0gIHRhcmdhaGVhZGVyWzE1XSA9IChjaGFyKSAoY2luZm8tPm91dHB1dF9oZWlnaHQgPj4gOCk7Ci0gIHRhcmdhaGVhZGVyWzE3XSA9IDB4MjA7CS8qIFRvcC1kb3duLCBub24taW50ZXJsYWNlZCAqLwotCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKLSAgICB0YXJnYWhlYWRlclsyXSA9IDM7CQkvKiBpbWFnZSB0eXBlID0gdW5jb21wcmVzc2VkIGdyYXktc2NhbGUgKi8KLSAgICB0YXJnYWhlYWRlclsxNl0gPSA4OwkvKiBiaXRzIHBlciBwaXhlbCAqLwotICB9IGVsc2UgewkJCS8qIG11c3QgYmUgUkdCICovCi0gICAgaWYgKG51bV9jb2xvcnMgPiAwKSB7Ci0gICAgICB0YXJnYWhlYWRlclsyXSA9IDE7CS8qIGltYWdlIHR5cGUgPSBjb2xvcm1hcHBlZCBSR0IgKi8KLSAgICAgIHRhcmdhaGVhZGVyWzE2XSA9IDg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRhcmdhaGVhZGVyWzJdID0gMjsJLyogaW1hZ2UgdHlwZSA9IHVuY29tcHJlc3NlZCBSR0IgKi8KLSAgICAgIHRhcmdhaGVhZGVyWzE2XSA9IDI0OwotICAgIH0KLSAgfQotCi0gIGlmIChKRldSSVRFKGRpbmZvLT5vdXRwdXRfZmlsZSwgdGFyZ2FoZWFkZXIsIDE4KSAhPSAoc2l6ZV90KSAxOCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCi0gKiBJbiB0aGlzIG1vZHVsZSByb3dzX3N1cHBsaWVkIHdpbGwgYWx3YXlzIGJlIDEuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wdXRfcGl4ZWxfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCi0JCUpESU1FTlNJT04gcm93c19zdXBwbGllZCkKLS8qIHVzZWQgZm9yIHVucXVhbnRpemVkIGZ1bGwtY29sb3Igb3V0cHV0ICovCi17Ci0gIHRnYV9kZXN0X3B0ciBkZXN0ID0gKHRnYV9kZXN0X3B0cikgZGluZm87Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOwotICByZWdpc3RlciBjaGFyICogb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLQotICBpbnB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07Ci0gIG91dHB0ciA9IGRlc3QtPmlvYnVmZmVyOwotICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgb3V0cHRyWzBdID0gKGNoYXIpIEdFVEpTQU1QTEUoaW5wdHJbMl0pOyAvKiBSR0IgdG8gQkdSIG9yZGVyICovCi0gICAgb3V0cHRyWzFdID0gKGNoYXIpIEdFVEpTQU1QTEUoaW5wdHJbMV0pOwotICAgIG91dHB0clsyXSA9IChjaGFyKSBHRVRKU0FNUExFKGlucHRyWzBdKTsKLSAgICBpbnB0ciArPSAzLCBvdXRwdHIgKz0gMzsKLSAgfQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9ncmF5X3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCSAgICAgICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCi0vKiB1c2VkIGZvciBncmF5c2NhbGUgT1IgcXVhbnRpemVkIGNvbG9yIG91dHB1dCAqLwotewotICB0Z2FfZGVzdF9wdHIgZGVzdCA9ICh0Z2FfZGVzdF9wdHIpIGRpbmZvOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKLSAgcmVnaXN0ZXIgY2hhciAqIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBvdXRwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICpvdXRwdHIrKyA9IChjaGFyKSBHRVRKU0FNUExFKCppbnB0cisrKTsKLSAgfQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBzb21lIGRlbWFwcGVkIHBpeGVsIGRhdGEgd2hlbiBjb2xvciBxdWFudGl6YXRpb24gaXMgaW4gZWZmZWN0LgotICogRm9yIFRhcmdhLCB0aGlzIGlzIG9ubHkgYXBwbGllZCB0byBncmF5c2NhbGUgZGF0YS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9kZW1hcHBlZF9ncmF5IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotewotICB0Z2FfZGVzdF9wdHIgZGVzdCA9ICh0Z2FfZGVzdF9wdHIpIGRpbmZvOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKLSAgcmVnaXN0ZXIgY2hhciAqIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwMCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBvdXRwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICpvdXRwdHIrKyA9IChjaGFyKSBHRVRKU0FNUExFKGNvbG9yX21hcDBbR0VUSlNBTVBMRSgqaW5wdHIrKyldKTsKLSAgfQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi0KLS8qCi0gKiBTdGFydHVwOiB3cml0ZSB0aGUgZmlsZSBoZWFkZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9vdXRwdXRfdGdhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgdGdhX2Rlc3RfcHRyIGRlc3QgPSAodGdhX2Rlc3RfcHRyKSBkaW5mbzsKLSAgaW50IG51bV9jb2xvcnMsIGk7Ci0gIEZJTEUgKm91dGZpbGU7Ci0KLSAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgewotICAgIC8qIFRhcmdhIGRvZXNuJ3QgaGF2ZSBhIG1hcHBlZCBncmF5c2NhbGUgZm9ybWF0LCBzbyB3ZSB3aWxsICovCi0gICAgLyogZGVtYXAgcXVhbnRpemVkIGdyYXkgb3V0cHV0LiAgTmV2ZXIgZW1pdCBhIGNvbG9ybWFwLiAqLwotICAgIHdyaXRlX2hlYWRlcihjaW5mbywgZGluZm8sIDApOwotICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQotICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2RlbWFwcGVkX2dyYXk7Ci0gICAgZWxzZQotICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2dyYXlfcm93czsKLSAgfSBlbHNlIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLSAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgewotICAgICAgLyogV2Ugb25seSBzdXBwb3J0IDgtYml0IGNvbG9ybWFwIGluZGV4ZXMsIHNvIG9ubHkgMjU2IGNvbG9ycyAqLwotICAgICAgbnVtX2NvbG9ycyA9IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsKLSAgICAgIGlmIChudW1fY29sb3JzID4gMjU2KQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX1RPT19NQU5ZX0NPTE9SUywgbnVtX2NvbG9ycyk7Ci0gICAgICB3cml0ZV9oZWFkZXIoY2luZm8sIGRpbmZvLCBudW1fY29sb3JzKTsKLSAgICAgIC8qIFdyaXRlIHRoZSBjb2xvcm1hcC4gIE5vdGUgVGFyZ2EgdXNlcyBCR1IgYnl0ZSBvcmRlciAqLwotICAgICAgb3V0ZmlsZSA9IGRlc3QtPnB1Yi5vdXRwdXRfZmlsZTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyBpKyspIHsKLQlwdXRjKEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzJdW2ldKSwgb3V0ZmlsZSk7Ci0JcHV0YyhHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsxXVtpXSksIG91dGZpbGUpOwotCXB1dGMoR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMF1baV0pLCBvdXRmaWxlKTsKLSAgICAgIH0KLSAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9ncmF5X3Jvd3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdyaXRlX2hlYWRlcihjaW5mbywgZGluZm8sIDApOwotICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X3BpeGVsX3Jvd3M7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0NPTE9SU1BBQ0UpOwotICB9Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX291dHB1dF90Z2EgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQotewotICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCi0gIGZmbHVzaChkaW5mby0+b3V0cHV0X2ZpbGUpOwotICBpZiAoZmVycm9yKGRpbmZvLT5vdXRwdXRfZmlsZSkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgVGFyZ2EgZm9ybWF0IG91dHB1dC4KLSAqLwotCi1HTE9CQUwoZGpwZWdfZGVzdF9wdHIpCi1qaW5pdF93cml0ZV90YXJnYSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgdGdhX2Rlc3RfcHRyIGRlc3Q7Ci0KLSAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLwotICBkZXN0ID0gKHRnYV9kZXN0X3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YodGdhX2Rlc3Rfc3RydWN0KSk7Ci0gIGRlc3QtPnB1Yi5zdGFydF9vdXRwdXQgPSBzdGFydF9vdXRwdXRfdGdhOwotICBkZXN0LT5wdWIuZmluaXNoX291dHB1dCA9IGZpbmlzaF9vdXRwdXRfdGdhOwotCi0gIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KLSAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKLQotICAvKiBDcmVhdGUgSS9PIGJ1ZmZlci4gIE5vdGUgd2UgbWFrZSB0aGlzIG5lYXIgb24gYSBQQy4gKi8KLSAgZGVzdC0+YnVmZmVyX3dpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKLSAgZGVzdC0+aW9idWZmZXIgPSAoY2hhciAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKHNpemVfdCkgKGRlc3QtPmJ1ZmZlcl93aWR0aCAqIFNJWkVPRihjaGFyKSkpOwotCi0gIC8qIENyZWF0ZSBkZWNvbXByZXNzb3Igb3V0cHV0IGJ1ZmZlci4gKi8KLSAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGRlc3QtPmJ1ZmZlcl93aWR0aCwgKEpESU1FTlNJT04pIDEpOwotICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci0KLSAgcmV0dXJuIChkanBlZ19kZXN0X3B0cikgZGVzdDsKLX0KLQotI2VuZGlmIC8qIFRBUkdBX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbWludWl0d3JwL0FuZHJvaWQubWsgYi9taW51aXR3cnAvQW5kcm9pZC5tawppbmRleCAwYTc2MGRlLi5lMWJmNzZlIDEwMDY0NAotLS0gYS9taW51aXR3cnAvQW5kcm9pZC5taworKysgYi9taW51aXR3cnAvQW5kcm9pZC5tawpAQCAtMTMsNyArMTMsOCBAQAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZXh0ZXJuYWwvbGlicG5nIFwKICAgICBleHRlcm5hbC96bGliIFwKLSAgICBzeXN0ZW0vY29yZS9pbmNsdWRlCisgICAgc3lzdGVtL2NvcmUvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvanBlZwogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICBib290YWJsZS9yZWNvdmVyeS9saWJqcGVndHdycApAQCAtNTcsOSArNTgsOSBAQAogaWZuZXEgKCQoQk9BUkRfVVNFX0NVU1RPTV9SRUNPVkVSWV9GT05UKSwpCiAgIExPQ0FMX0NGTEFHUyArPSAtREJPQVJEX1VTRV9DVVNUT01fUkVDT1ZFUllfRk9OVD0kKEJPQVJEX1VTRV9DVVNUT01fUkVDT1ZFUllfRk9OVCkKIGVuZGlmCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnogbGliYyBsaWJjdXRpbHMKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGlicG5nIGxpYmpwZWd0d3JwIGxpYnBpeGVsZmxpbmdlcl9zdGF0aWMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlieiBsaWJjIGxpYmN1dGlscyBsaWJqcGVnCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYnBuZyBsaWJwaXhlbGZsaW5nZXJfc3RhdGljCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBlbmcKIExPQ0FMX01PRFVMRSA6PSBsaWJtaW51aXR3cnAKIAotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21pbnVpdHdycC9ldmVudHMuYyBiL21pbnVpdHdycC9ldmVudHMuYwppbmRleCBlNzMzNzExLi4yNjUzZDE4IDEwMDY0NAotLS0gYS9taW51aXR3cnAvZXZlbnRzLmMKKysrIGIvbWludWl0d3JwL2V2ZW50cy5jCkBAIC0yODgsNyArMjg4LDcgQEAKICAgICByZXR1cm4gKHNjcmVlbl9wb3MgPj0gMCAmJiBzY3JlZW5fcG9zIDwgc2NyZWVuX3NpemUpOwogfQogCi1zdGF0aWMgaW50IHZrX3RwX3RvX3NjcmVlbihzdHJ1Y3QgcG9zaXRpb24gKnAsIGludCAqeCwgaW50ICp5KQorc3RhdGljIGludCB2a190cF90b19zY3JlZW4oc3RydWN0IHBvc2l0aW9uICpwLCBpbnQgKngsIGludCAqeSwgaW50ICpzY3JlZW5fd2lkdGgsIGludCAqc2NyZWVuX2hlaWdodCkKIHsKICAgICBpZiAocC0+eGkubWluaW11bSA9PSBwLT54aS5tYXhpbXVtIHx8IHAtPnlpLm1pbmltdW0gPT0gcC0+eWkubWF4aW11bSkKICAgICB7CkBAIC0yOTgsMTcgKzI5OCwxNiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSNpZmRlZiBfRVZFTlRfTE9HR0lORwotICAgIHByaW50ZigiRVY6IHAtPng9JWQgIHgtcmFuZ2U9JWQsJWQgIGZiLXdpZHRoPSVkXG4iLCBwLT54LCBwLT54aS5taW5pbXVtLCBwLT54aS5tYXhpbXVtLCBncl9mYl93aWR0aCgpKTsKLSNlbmRpZgotCiAjaWZuZGVmIFJFQ09WRVJZX1RPVUNIU0NSRUVOX1NXQVBfWFkKLSAgICBpbnQgZmJfd2lkdGggPSBncl9mYl93aWR0aCgpOwotICAgIGludCBmYl9oZWlnaHQgPSBncl9mYl9oZWlnaHQoKTsKKyAgICBpbnQgZmJfd2lkdGggPSAqc2NyZWVuX3dpZHRoOworICAgIGludCBmYl9oZWlnaHQgPSAqc2NyZWVuX2hlaWdodDsKICNlbHNlCiAgICAgLy8gV2UgbmVlZCB0byBzd2FwIHRoZSBzY2FsaW5nIHNpemVzLCB0b28KLSAgICBpbnQgZmJfd2lkdGggPSBncl9mYl9oZWlnaHQoKTsKLSAgICBpbnQgZmJfaGVpZ2h0ID0gZ3JfZmJfd2lkdGgoKTsKKyAgICBpbnQgZmJfd2lkdGggPSAqc2NyZWVuX2hlaWdodDsKKyAgICBpbnQgZmJfaGVpZ2h0ID0gKnNjcmVlbl93aWR0aDsKKyNlbmRpZgorI2lmZGVmIF9FVkVOVF9MT0dHSU5HCisgICAgcHJpbnRmKCJFVjogcC0+eD0lZCAgeC1yYW5nZT0lZCwlZCAgZmItd2lkdGg9JWRcbiIsIHAtPngsIHAtPnhpLm1pbmltdW0sIHAtPnhpLm1heGltdW0sICpzY3JlZW5fd2lkdGgpOwogI2VuZGlmCiAKICAgICAqeCA9IChwLT54IC0gcC0+eGkubWluaW11bSkgKiAoZmJfd2lkdGggLSAxKSAvIChwLT54aS5tYXhpbXVtIC0gcC0+eGkubWluaW11bSk7CkBAIC0zMjUsNyArMzI0LDcgQEAKIAogLyogVHJhbnNsYXRlIGEgdmlydHVhbCBrZXkgaW4gdG8gYSByZWFsIGtleSBldmVudCwgaWYgbmVlZGVkICovCiAvKiBSZXR1cm5zIG5vbi16ZXJvIHdoZW4gdGhlIGV2ZW50IHNob3VsZCBiZSBjb25zdW1lZCAqLwotc3RhdGljIGludCB2a19tb2RpZnkoc3RydWN0IGV2ICplLCBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2KQorc3RhdGljIGludCB2a19tb2RpZnkoc3RydWN0IGV2ICplLCBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2LCBpbnQgKnNjcmVlbl93aWR0aCwgaW50ICpzY3JlZW5faGVpZ2h0KQogewogICAgIHN0YXRpYyBpbnQgZG93blggPSAtMSwgZG93blkgPSAtMTsKICAgICBzdGF0aWMgaW50IGRpc2NhcmQgPSAwOwpAQCAtNDM1LDMzICs0MzQsMTggQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQUJTX01UX1RPVUNIX01JTk9SOiAvLzMxCi0gICAgICAgICAgICBpZiAoZXYtPnZhbHVlID09IDApIHsKLSAgICAgICAgICAgICAgICBlLT5tdF9wLnggPSAwOwotICAgICAgICAgICAgICAgIGUtPm10X3AueSA9IDA7Ci0gICAgICAgICAgICAgICAgdG91Y2hSZWxlYXNlT25OZXh0U3luUmVwb3J0ID0gMTsKLSAgICAgICAgICAgIH0KICNpZmRlZiBfRVZFTlRfTE9HR0lORwogICAgICAgICAgICAgcHJpbnRmKCJFVjogJXMgPT4gRVZfQUJTIEFCU19NVF9UT1VDSF9NSU5PUiAlZFxuIiwgZS0+ZGV2aWNlTmFtZSwgZXYtPnZhbHVlKTsKICNlbmRpZgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBBQlNfTVRfV0lEVEhfTUFKT1I6IC8vMzIKLSAgICAgICAgICAgIGlmIChldi0+dmFsdWUgPT0gMCkgewotICAgICAgICAgICAgICAgIGUtPm10X3AueCA9IDA7Ci0gICAgICAgICAgICAgICAgZS0+bXRfcC55ID0gMDsKLSAgICAgICAgICAgICAgICB0b3VjaFJlbGVhc2VPbk5leHRTeW5SZXBvcnQgPSAxOwotICAgICAgICAgICAgfQogI2lmZGVmIF9FVkVOVF9MT0dHSU5HCiAgICAgICAgICAgICBwcmludGYoIkVWOiAlcyA9PiBFVl9BQlMgQUJTX01UX1dJRFRIX01BSk9SICVkXG4iLCBlLT5kZXZpY2VOYW1lLCBldi0+dmFsdWUpOwogI2VuZGlmCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFCU19NVF9XSURUSF9NSU5PUjogLy8zMwotICAgICAgICAgICAgaWYgKGV2LT52YWx1ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZS0+bXRfcC54ID0gMDsKLSAgICAgICAgICAgICAgICBlLT5tdF9wLnkgPSAwOwotICAgICAgICAgICAgICAgIHRvdWNoUmVsZWFzZU9uTmV4dFN5blJlcG9ydCA9IDE7Ci0gICAgICAgICAgICB9CiAjaWZkZWYgX0VWRU5UX0xPR0dJTkcKICAgICAgICAgICAgIHByaW50ZigiRVY6ICVzID0+IEVWX0FCUyBBQlNfTVRfV0lEVEhfTUlOT1IgJWRcbiIsIGUtPmRldmljZU5hbWUsIGV2LT52YWx1ZSk7CiAjZW5kaWYKQEAgLTU2MCwxMSArNTQ0LDExIEBACiAgICAgLy8gUmV0cmlldmUgd2hlcmUgdGhlIHgseSBwb3NpdGlvbiBpcwogICAgIGlmIChlLT5wLnN5bmNlZCAmIDB4MDMpCiAgICAgewotICAgICAgICB2a190cF90b19zY3JlZW4oJmUtPnAsICZ4LCAmeSk7CisgICAgICAgIHZrX3RwX3RvX3NjcmVlbigmZS0+cCwgJngsICZ5LCBzY3JlZW5fd2lkdGgsIHNjcmVlbl9oZWlnaHQpOwogICAgIH0KICAgICBlbHNlIGlmIChlLT5tdF9wLnN5bmNlZCAmIDB4MDMpCiAgICAgewotICAgICAgICB2a190cF90b19zY3JlZW4oJmUtPm10X3AsICZ4LCAmeSk7CisgICAgICAgIHZrX3RwX3RvX3NjcmVlbigmZS0+bXRfcCwgJngsICZ5LCBzY3JlZW5fd2lkdGgsIHNjcmVlbl9oZWlnaHQpOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtNTc4LDEwICs1NjIsMTAgQEAKICAgICB4IF49IHk7CiAjZW5kaWYKICNpZmRlZiBSRUNPVkVSWV9UT1VDSFNDUkVFTl9GTElQX1gKLSAgICB4ID0gZ3JfZmJfd2lkdGgoKSAtIHg7CisgICAgeCA9ICpzY3JlZW5fd2lkdGggLSB4OwogI2VuZGlmCiAjaWZkZWYgUkVDT1ZFUllfVE9VQ0hTQ1JFRU5fRkxJUF9ZCi0gICAgeSA9IGdyX2ZiX2hlaWdodCgpIC0geTsKKyAgICB5ID0gKnNjcmVlbl9oZWlnaHQgLSB5OwogI2VuZGlmCiAKICNpZmRlZiBfRVZFTlRfTE9HR0lORwpAQCAtNjM2LDcgKzYyMCw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBldl9nZXQoc3RydWN0IGlucHV0X2V2ZW50ICpldiwgdW5zaWduZWQgZG9udF93YWl0KQoraW50IGV2X2dldChzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2LCB1bnNpZ25lZCBkb250X3dhaXQsIGludCAqc2NyZWVuX3dpZHRoLCBpbnQgKnNjcmVlbl9oZWlnaHQpCiB7CiAgICAgaW50IHI7CiAgICAgdW5zaWduZWQgbjsKQEAgLTY0OSw3ICs2MzMsNyBAQAogICAgICAgICAgICAgICAgIGlmKGV2X2Zkc1tuXS5yZXZlbnRzICYgUE9MTElOKSB7CiAgICAgICAgICAgICAgICAgICAgIHIgPSByZWFkKGV2X2Zkc1tuXS5mZCwgZXYsIHNpemVvZigqZXYpKTsKICAgICAgICAgICAgICAgICAgICAgaWYociA9PSBzaXplb2YoKmV2KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2a19tb2RpZnkoJmV2c1tuXSwgZXYpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2a19tb2RpZnkoJmV2c1tuXSwgZXYsIHNjcmVlbl93aWR0aCwgc2NyZWVuX2hlaWdodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9taW51aXR3cnAvbWludWkuaCBiL21pbnVpdHdycC9taW51aS5oCmluZGV4IDAzZTE1YmIuLjY2ZTdmNGYgMTAwNjQ0Ci0tLSBhL21pbnVpdHdycC9taW51aS5oCisrKyBiL21pbnVpdHdycC9taW51aS5oCkBAIC01Nyw3ICs1Nyw3IEBACiAKIGludCBldl9pbml0KHZvaWQpOwogdm9pZCBldl9leGl0KHZvaWQpOwotaW50IGV2X2dldChzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2LCB1bnNpZ25lZCBkb250X3dhaXQpOworaW50IGV2X2dldChzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2LCB1bnNpZ25lZCBkb250X3dhaXQsIGludCAqc2NyZWVuX3dpZHRoLCBpbnQgKnNjcmVlbl9oZWlnaHQpOwogCiAvLyBSZXNvdXJjZXMKIApkaWZmIC0tZ2l0IGEvbWludWl0d3JwL3Jlc291cmNlcy5jIGIvbWludWl0d3JwL3Jlc291cmNlcy5jCmluZGV4IDRjOGQ4YTkuLmM1ODljOWQgMTAwNjQ0Ci0tLSBhL21pbnVpdHdycC9yZXNvdXJjZXMuYworKysgYi9taW51aXR3cnAvcmVzb3VyY2VzLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxwaXhlbGZsaW5nZXIvcGl4ZWxmbGluZ2VyLmg+CiAKICNpbmNsdWRlIDxwbmcuaD4KLSNpbmNsdWRlICIuLi9saWJqcGVndHdycC9qcGVnbGliLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgogCiAjaW5jbHVkZSAibWludWkuaCIKIApkaWZmIC0tZ2l0IGEvcGFydGl0aW9ubWFuYWdlci5jcHAgYi9wYXJ0aXRpb25tYW5hZ2VyLmNwcAppbmRleCBkZDJkZmQyLi5mYjNkYTVhIDEwMDY0NAotLS0gYS9wYXJ0aXRpb25tYW5hZ2VyLmNwcAorKysgYi9wYXJ0aXRpb25tYW5hZ2VyLmNwcApAQCAtMjQ1LDcgKzI0NSw3IEBACiAJYm9vbCBmb3VuZCA9IGZhbHNlOwogCXN0cmluZyBMb2NhbF9QYXRoID0gVFdGdW5jOjpHZXRfUm9vdF9QYXRoKFBhdGgpOwogCi0JaWYgKExvY2FsX1BhdGggPT0gIi90bXAiKQorCWlmIChMb2NhbF9QYXRoID09ICIvdG1wIiB8fCBMb2NhbF9QYXRoID09ICIvIikKIAkJcmV0dXJuIHRydWU7CiAKIAkvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHBhcnRpdGlvbnMKQEAgLTYxMSw2ICs2MTEsOCBAQAogCQkJCWlmICgoKnN1YnBhcnQpLT5DYW5fQmVfQmFja2VkX1VwICYmICgqc3VicGFydCktPklzX1N1YlBhcnRpdGlvbiAmJiAoKnN1YnBhcnQpLT5TdWJQYXJ0aXRpb25fT2YgPT0gUGFydC0+TW91bnRfUG9pbnQpIHsKIAkJCQkJaWYgKCEoKnN1YnBhcnQpLT5CYWNrdXAoQmFja3VwX0ZvbGRlcikpCiAJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCXN5bmMoKTsKKwkJCQkJc3luYygpOwogCQkJCQlpZiAoIU1ha2VfTUQ1KGdlbmVyYXRlX21kNSwgQmFja3VwX0ZvbGRlciwgKCpzdWJwYXJ0KS0+QmFja3VwX0ZpbGVOYW1lKSkKIAkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJaWYgKFBhcnQtPkJhY2t1cF9NZXRob2QgPT0gMSkgewpAQCAtMTg2OSwzICsxODcxLDI1IEBACiBpbnQgVFdQYXJ0aXRpb25NYW5hZ2VyOjpGc3RhYl9Qcm9jZXNzZWQodm9pZCkgewogCXJldHVybiBQYXJ0aXRpb25zLnNpemUoKTsKIH0KKwordm9pZCBUV1BhcnRpdGlvbk1hbmFnZXI6Ok91dHB1dF9TdG9yYWdlX0ZzdGFiKHZvaWQpIHsKKwlzdGQ6OnZlY3RvcjxUV1BhcnRpdGlvbio+OjppdGVyYXRvciBpdGVyOworCWNoYXIgc3RvcmFnZV9wYXJ0aXRpb25bMjU1XTsKKwlzdHJpbmcgVGVtcDsKKwlGSUxFICpmcCA9IGZvcGVuKCIvY2FjaGUvcmVjb3Zlcnkvc3RvcmFnZS5mc3RhYiIsICJ3Iik7CisKKwlpZiAoZnAgPT0gTlVMTCkgeworCQlMT0dFUlIoIlVuYWJsZSB0byBvcGVuICcvY2FjaGUvcmVjb3Zlcnkvc3RvcmFnZS5mc3RhYicuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgcGFydGl0aW9ucworCWZvciAoaXRlciA9IFBhcnRpdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBQYXJ0aXRpb25zLmVuZCgpOyBpdGVyKyspIHsKKwkJaWYgKCgqaXRlciktPklzX1N0b3JhZ2UpIHsKKwkJCVRlbXAgPSAoKml0ZXIpLT5TdG9yYWdlX1BhdGggKyAiOyIgKyAoKml0ZXIpLT5TdG9yYWdlX05hbWUgKyAiO1xuIjsKKwkJCXN0cmNweShzdG9yYWdlX3BhcnRpdGlvbiwgVGVtcC5jX3N0cigpKTsKKwkJCWZ3cml0ZShzdG9yYWdlX3BhcnRpdGlvbiwgc2l6ZW9mKHN0b3JhZ2VfcGFydGl0aW9uWzBdKSwgc3RybGVuKHN0b3JhZ2VfcGFydGl0aW9uKSAvIHNpemVvZihzdG9yYWdlX3BhcnRpdGlvblswXSksIGZwKTsKKwkJfQorCX0KKwlmY2xvc2UoZnApOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhcnRpdGlvbnMuaHBwIGIvcGFydGl0aW9ucy5ocHAKaW5kZXggM2VkNGRhNi4uZWZlMDhkNyAxMDA2NDQKLS0tIGEvcGFydGl0aW9ucy5ocHAKKysrIGIvcGFydGl0aW9ucy5ocHAKQEAgLTIxMCw2ICsyMTAsNyBAQAogCXZpcnR1YWwgaW50IEZpeF9QZXJtaXNzaW9ucygpOyAKIAl2aXJ0dWFsIHZvaWQgR2V0X1BhcnRpdGlvbl9MaXN0KHN0cmluZyBMaXN0VHlwZSwgc3RkOjp2ZWN0b3I8UGFydGl0aW9uTGlzdD4gKlBhcnRpdGlvbl9MaXN0KTsKIAl2aXJ0dWFsIGludCBGc3RhYl9Qcm9jZXNzZWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGljYXRlcyBpZiB0aGUgZnN0YWIgaGFzIGJlZW4gcHJvY2Vzc2VkIG9yIG5vdAorCXZpcnR1YWwgdm9pZCBPdXRwdXRfU3RvcmFnZV9Gc3RhYigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIC9jYWNoZS9yZWNvdmVyeS9zdG9yYWdlLmZzdGFiIGZpbGUgd2l0aCBhIGxpc3Qgb2YgYWxsIHBvdGVudGlhbCBzdG9yYWdlIGxvY2F0aW9ucyBmb3IgYXBwIHVzZQogCiBwcml2YXRlOgogCWJvb2wgTWFrZV9NRDUoYm9vbCBnZW5lcmF0ZV9tZDUsIHN0cmluZyBCYWNrdXBfRm9sZGVyLCBzdHJpbmcgQmFja3VwX0ZpbGVuYW1lKTsgLy8gR2VuZXJhdGVzIGFuIE1ENSBhZnRlciBhIGJhY2t1cCBpcyBtYWRlCmRpZmYgLS1naXQgYS9wcmVidWlsdC9BbmRyb2lkLm1rIGIvcHJlYnVpbHQvQW5kcm9pZC5tawppbmRleCAxNDcwOTUxLi5lMzFlYzhlIDEwMDY0NAotLS0gYS9wcmVidWlsdC9BbmRyb2lkLm1rCisrKyBiL3ByZWJ1aWx0L0FuZHJvaWQubWsKQEAgLTQ4LDYgKzQ4LDEwIEBACiAjUkVMSU5LX1NPVVJDRV9GSUxFUyArPSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGlibWluY3J5cHQuc28KIFJFTElOS19TT1VSQ0VfRklMRVMgKz0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2xpYmV4dDRfdXRpbHMuc28KIFJFTElOS19TT1VSQ0VfRklMRVMgKz0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2xpYmFvc3ByZWNvdmVyeS5zbworUkVMSU5LX1NPVVJDRV9GSUxFUyArPSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGlianBlZy5zbworaWZuZXEgKCQod2lsZGNhcmQgZXh0ZXJuYWwvbGlic2VsaW51eC9BbmRyb2lkLm1rKSwpCisgICAgUkVMSU5LX1NPVVJDRV9GSUxFUyArPSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGlic2VsaW51eC5zbworZW5kaWYKIGlmZXEgKCQoQlVJTERfSUQpLCBHSU5HRVJCUkVBRCkKICAgICBUV19OT19FWEZBVCA6PSB0cnVlCiBlbmRpZgpkaWZmIC0tZ2l0IGEvdHdycC1mdW5jdGlvbnMuY3BwIGIvdHdycC1mdW5jdGlvbnMuY3BwCmluZGV4IGQ5MDE0YjMuLjQ2MzUyMjYgMTAwNjQ0Ci0tLSBhL3R3cnAtZnVuY3Rpb25zLmNwcAorKysgYi90d3JwLWZ1bmN0aW9ucy5jcHAKQEAgLTM2LDIxICszNiw1MiBAQAogCiAvKiBFeGVjdXRlIGEgY29tbWFuZCAqLwogaW50IFRXRnVuYzo6RXhlY19DbWQoc3RyaW5nIGNtZCwgc3RyaW5nICZyZXN1bHQpIHsKLQlGSUxFKiBleGVjOwotCWNoYXIgYnVmZmVyWzEzMF07Ci0JaW50IHJldCA9IDA7Ci0JZXhlYyA9IF9fcG9wZW4oY21kLmNfc3RyKCksICJyIik7Ci0JaWYgKCFleGVjKSByZXR1cm4gLTE7Ci0Jd2hpbGUoIWZlb2YoZXhlYykpIHsKLQkJbWVtc2V0KCZidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKLQkJaWYgKGZnZXRzKGJ1ZmZlciwgMTI4LCBleGVjKSAhPSBOVUxMKSB7Ci0JCQlidWZmZXJbMTI4XSA9ICdcbic7Ci0JCQlidWZmZXJbMTI5XSA9IE5VTEw7CisgICBpbnQgZmRbMl07CisgICBpbnQgcmV0ID0gLTE7CisgICBpZihwaXBlKGZkKSA8IDApCisJCXJldHVybiAtMTsKKworCXBpZF90IHBpZCA9IGZvcmsoKTsKKwlpZiAocGlkIDwgMCkKKwl7CisJCWNsb3NlKGZkWzBdKTsKKwkJY2xvc2UoZmRbMV0pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYocGlkID09IDApIC8vIGNoaWxkCisJeworCQljbG9zZShmZFswXSk7CisJCWR1cDIoZmRbMV0sIDEpOyAgLy8gc2VuZCBzdGRvdXQgdG8gdGhlIHBpcGUKKwkJZHVwMihmZFsxXSwgMik7ICAvLyBzZW5kIHN0ZGVyciB0byB0aGUgcGlwZQorCQljbG9zZShmZFsxXSk7CisKKwkJcmV0ID0gc3lzdGVtKGNtZC5jX3N0cigpKTsKKwkJaWYocmV0ICE9IC0xKQorCQkJcmV0ID0gV0VYSVRTVEFUVVMocmV0KTsKKwkJZWxzZQorCQkJTE9HRVJSKCJFeGVjX0NtZDogc3lzdGVtKCkgZmFpbGVkIHdpdGggLTEgKCVkKSFcbiIsIGVycm5vKTsKKwkJZXhpdChyZXQpOworCX0KKwllbHNlCisJeworCQljbG9zZShmZFsxXSk7CisKKwkJaW50IGxlbjsKKwkJY2hhciBidWZmZXJbMTI4XTsKKwkJYnVmZmVyW3NpemVvZihidWZmZXIpLTFdID0gMDsKKwkJd2hpbGUgKChsZW4gPSByZWFkKGZkWzBdLCBidWZmZXIsIHNpemVvZihidWZmZXIpLTEpKSA+IDApCisJCXsKKwkJCWJ1ZmZlcltsZW5dID0gMDsKKwkJCWJ1ZmZlcltzaXplb2YoYnVmZmVyKS0yXSA9ICdcbic7CisJCQlMT0dJTkZPKCIlcyIsIGJ1ZmZlcik7CiAJCQlyZXN1bHQgKz0gYnVmZmVyOwogCQl9CisKKwkJd2FpdHBpZChwaWQsICZyZXQsIDApOworCQlyZXR1cm4gV0VYSVRTVEFUVVMocmV0KTsKIAl9Ci0JcmV0ID0gX19wY2xvc2UoZXhlYyk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gLTE7CiB9CiAKIC8vIFJldHVybnMgImZpbGUubmFtZSIgZnJvbSBhIGZ1bGwgL3BhdGgvdG8vZmlsZS5uYW1lCmRpZmYgLS1naXQgYS90d3JwVGFyLmNwcCBiL3R3cnBUYXIuY3BwCmluZGV4IGEyNzM3NGEuLjU5ZDc1ZDAgMTAwNjQ0Ci0tLSBhL3R3cnBUYXIuY3BwCisrKyBiL3R3cnBUYXIuY3BwCkBAIC04NDAsMTAgKzg0MCwxMCBAQAogaW50IHR3cnBUYXI6OmFkZEZpbGVzVG9FeGlzdGluZ1Rhcih2ZWN0b3IgPHN0cmluZz4gZmlsZXMsIHN0cmluZyBmbikgewogCWNoYXIqIGNoYXJUYXJGaWxlID0gKGNoYXIqKSBmbi5jX3N0cigpOwogCi0JaWYgKHRhcl9vcGVuKCZ0LCBjaGFyVGFyRmlsZSwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgMDY0NCwgVEFSX0dOVSkgPT0gLTEpCisJaWYgKHRhcl9vcGVuKCZ0LCBjaGFyVGFyRmlsZSwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVJPVEggfCBTX0lXT1RILCBUQVJfR05VKSA9PSAtMSkKIAkJcmV0dXJuIC0xOwogCXJlbW92ZUVPVChjaGFyVGFyRmlsZSk7Ci0JaWYgKHRhcl9vcGVuKCZ0LCBjaGFyVGFyRmlsZSwgTlVMTCwgT19XUk9OTFkgfCBPX0FQUEVORCB8IE9fTEFSR0VGSUxFLCAwNjQ0LCBUQVJfR05VKSA9PSAtMSkKKwlpZiAodGFyX29wZW4oJnQsIGNoYXJUYXJGaWxlLCBOVUxMLCBPX1dST05MWSB8IE9fQVBQRU5EIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCwgVEFSX0dOVSkgPT0gLTEpCiAJCXJldHVybiAtMTsKIAlmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgKytpKSB7CiAJCWNoYXIqIGZpbGUgPSAoY2hhciopIGZpbGVzLmF0KGkpLmNfc3RyKCk7CkBAIC05MTAsNyArOTEwLDcgQEAKIAkJCQlyZXR1cm4gLTE7CiAJCQl9IGVsc2UgaWYgKG9hZXNfcGlkID09IDApIHsKIAkJCQkvLyBvcGVuYWVzIENoaWxkCi0JCQkJaW50IG91dHB1dF9mZCA9IG9wZW4odGFyZm4uY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOworCQkJCWludCBvdXRwdXRfZmQgPSBvcGVuKHRhcmZuLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fTEFSR0VGSUxFLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCB8IFNfSVdPVEgpOwogCQkJCWlmIChvdXRwdXRfZmQgPCAwKSB7CiAJCQkJCUxPR0VSUigiRmFpbGVkIHRvIG9wZW4gJyVzJ1xuIiwgdGFyZm4uY19zdHIoKSk7CiAJCQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCkBAIC05MzYsNyArOTM2LDcgQEAKIAkJCQljbG9zZShwaXBlc1syXSk7CiAJCQkJY2xvc2UocGlwZXNbM10pOwogCQkJCWZkID0gcGlwZXNbMV07Ci0JCQkJaWYodGFyX2Zkb3BlbigmdCwgZmQsIGNoYXJSb290RGlyLCBOVUxMLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX0xBUkdFRklMRSwgMDY0NCwgVEFSX0dOVSkgIT0gMCkgeworCQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCwgVEFSX0dOVSkgIT0gMCkgewogCQkJCQljbG9zZShmZCk7CiAJCQkJCUxPR0VSUigidGFyX2Zkb3BlbiBmYWlsZWRcbiIpOwogCQkJCQlyZXR1cm4gLTE7CkBAIC05NjQsNyArOTY0LDcgQEAKIAkJfSBlbHNlIGlmIChwaWd6X3BpZCA9PSAwKSB7CiAJCQkvLyBDaGlsZAogCQkJY2xvc2UocGlnemZkWzFdKTsgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0IHBpcGUKLQkJCWludCBvdXRwdXRfZmQgPSBvcGVuKHRhcmZuLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fTEFSR0VGSUxFLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKwkJCWludCBvdXRwdXRfZmQgPSBvcGVuKHRhcmZuLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fTEFSR0VGSUxFLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCB8IFNfSVdPVEgpOwogCQkJaWYgKG91dHB1dF9mZCA8IDApIHsKIAkJCQlMT0dFUlIoIkZhaWxlZCB0byBvcGVuICclcydcbiIsIHRhcmZuLmNfc3RyKCkpOwogCQkJCWNsb3NlKHBpZ3pmZFswXSk7CkBAIC05ODIsNyArOTgyLDcgQEAKIAkJCS8vIFBhcmVudAogCQkJY2xvc2UocGlnemZkWzBdKTsgLy8gY2xvc2UgcGFyZW50IGlucHV0CiAJCQlmZCA9IHBpZ3pmZFsxXTsgICAvLyBjb3B5IHBhcmVudCBvdXRwdXQKLQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIDA2NDQsIFRBUl9HTlUpICE9IDApIHsKKwkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCwgVEFSX0dOVSkgIT0gMCkgewogCQkJCWNsb3NlKGZkKTsKIAkJCQlMT0dFUlIoInRhcl9mZG9wZW4gZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLTE7CkBAIC0xMDA1LDcgKzEwMDUsNyBAQAogCQl9IGVsc2UgaWYgKG9hZXNfcGlkID09IDApIHsKIAkJCS8vIENoaWxkCiAJCQljbG9zZShvYWVzZmRbMV0pOyAgIC8vIGNsb3NlIHVudXNlZAotCQkJaW50IG91dHB1dF9mZCA9IG9wZW4odGFyZm4uY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOworCQkJaW50IG91dHB1dF9mZCA9IG9wZW4odGFyZm4uY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCk7CiAJCQlpZiAob3V0cHV0X2ZkIDwgMCkgewogCQkJCUxPR0VSUigiRmFpbGVkIHRvIG9wZW4gJyVzJ1xuIiwgdGFyZm4uY19zdHIoKSk7CiAJCQkJX2V4aXQoLTEpOwpAQCAtMTAyMiw3ICsxMDIyLDcgQEAKIAkJCS8vIFBhcmVudAogCQkJY2xvc2Uob2Flc2ZkWzBdKTsgLy8gY2xvc2UgcGFyZW50IGlucHV0CiAJCQlmZCA9IG9hZXNmZFsxXTsgICAvLyBjb3B5IHBhcmVudCBvdXRwdXQKLQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIDA2NDQsIFRBUl9HTlUpICE9IDApIHsKKwkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCwgVEFSX0dOVSkgIT0gMCkgewogCQkJCWNsb3NlKGZkKTsKIAkJCQlMT0dFUlIoInRhcl9mZG9wZW4gZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLTE7CkBAIC0xMDMyLDcgKzEwMzIsNyBAQAogCX0gZWxzZSB7CiAJCS8vIE5vdCBjb21wcmVzc2VkIG9yIGVuY3J5cHRlZAogCQlpbml0X2xpYnRhcl9idWZmZXIoMCk7Ci0JCWlmICh0YXJfb3BlbigmdCwgY2hhclRhckZpbGUsICZ0eXBlLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0xBUkdFRklMRSwgMDY0NCwgVEFSX0dOVSkgPT0gLTEpIHsKKwkJaWYgKHRhcl9vcGVuKCZ0LCBjaGFyVGFyRmlsZSwgJnR5cGUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fTEFSR0VGSUxFLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCB8IFNfSVdPVEgsIFRBUl9HTlUpID09IC0xKSB7CiAJCQlMT0dFUlIoInRhcl9vcGVuIGVycm9yIG9wZW5pbmcgJyVzJ1xuIiwgdGFyZm4uY19zdHIoKSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTExMTUsNyArMTExNSw3IEBACiAJCQkJY2xvc2UocGlwZXNbMV0pOwogCQkJCWNsb3NlKHBpcGVzWzNdKTsKIAkJCQlmZCA9IHBpcGVzWzJdOwotCQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgMDY0NCwgVEFSX0dOVSkgIT0gMCkgeworCQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVJPVEggfCBTX0lXT1RILCBUQVJfR05VKSAhPSAwKSB7CiAJCQkJCWNsb3NlKGZkKTsKIAkJCQkJTE9HRVJSKCJ0YXJfZmRvcGVuIGZhaWxlZFxuIik7CiAJCQkJCXJldHVybiAtMTsKQEAgLTExNTYsNyArMTE1Niw3IEBACiAJCQkvLyBQYXJlbnQKIAkJCWNsb3NlKG9hZXNmZFsxXSk7IC8vIGNsb3NlIHBhcmVudCBvdXRwdXQKIAkJCWZkID0gb2Flc2ZkWzBdOyAgIC8vIGNvcHkgcGFyZW50IGlucHV0Ci0JCQlpZih0YXJfZmRvcGVuKCZ0LCBmZCwgY2hhclJvb3REaXIsIE5VTEwsIE9fUkRPTkxZIHwgT19MQVJHRUZJTEUsIDA2NDQsIFRBUl9HTlUpICE9IDApIHsKKwkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVJPVEggfCBTX0lXT1RILCBUQVJfR05VKSAhPSAwKSB7CiAJCQkJY2xvc2UoZmQpOwogCQkJCUxPR0VSUigidGFyX2Zkb3BlbiBmYWlsZWRcbiIpOwogCQkJCXJldHVybiAtMTsKQEAgLTExOTMsMTMgKzExOTMsMTMgQEAKIAkJCS8vIFBhcmVudAogCQkJY2xvc2UocGlnemZkWzFdKTsgLy8gY2xvc2UgcGFyZW50IG91dHB1dAogCQkJZmQgPSBwaWd6ZmRbMF07ICAgLy8gY29weSBwYXJlbnQgaW5wdXQKLQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgMDY0NCwgVEFSX0dOVSkgIT0gMCkgeworCQkJaWYodGFyX2Zkb3BlbigmdCwgZmQsIGNoYXJSb290RGlyLCBOVUxMLCBPX1JET05MWSB8IE9fTEFSR0VGSUxFLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCB8IFNfSVdPVEgsIFRBUl9HTlUpICE9IDApIHsKIAkJCQljbG9zZShmZCk7CiAJCQkJTE9HRVJSKCJ0YXJfZmRvcGVuIGZhaWxlZFxuIik7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQogCQl9Ci0JfSBlbHNlIGlmICh0YXJfb3BlbigmdCwgY2hhclRhckZpbGUsIE5VTEwsIE9fUkRPTkxZIHwgT19MQVJHRUZJTEUsIDA2NDQsIFRBUl9HTlUpICE9IDApIHsKKwl9IGVsc2UgaWYgKHRhcl9vcGVuKCZ0LCBjaGFyVGFyRmlsZSwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVJPVEggfCBTX0lXT1RILCBUQVJfR05VKSAhPSAwKSB7CiAJCUxPR0VSUigiVW5hYmxlIHRvIG9wZW4gdGFyIGFyY2hpdmUgJyVzJ1xuIiwgY2hhclRhckZpbGUpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTI1MSw3ICsxMjUxLDcgQEAKIAkJTE9HRVJSKCJVbmFibGUgdG8gY2xvc2UgdGFyIGFyY2hpdmU6ICclcydcbiIsIHRhcmZuLmNfc3RyKCkpOwogCQlyZXR1cm4gLTE7CiAJfQotCWlmIChBcmNoaXZlX0N1cnJlbnRfVHlwZSA+IDEpIHsKKwlpZiAoQXJjaGl2ZV9DdXJyZW50X1R5cGUgPiAwKSB7CiAJCWNsb3NlKGZkKTsKIAkJaW50IHN0YXR1czsKIAkJaWYgKHBpZ3pfcGlkID4gMCAmJiBUV0Z1bmM6OldhaXRfRm9yX0NoaWxkKHBpZ3pfcGlkLCAmc3RhdHVzLCAicGlneiIpICE9IDApCkBAIC0xMjYwLDcgKzEyNjAsNiBAQAogCQkJcmV0dXJuIC0xOwogCX0KIAlmcmVlX2xpYnRhcl9idWZmZXIoKTsKLQlUV0Z1bmM6OnR3X2NobW9kKHRhcmZuLCAiNjQ0Iik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3ZhcmlhYmxlcy5oIGIvdmFyaWFibGVzLmgKaW5kZXggZGRhZTJhZi4uNDAyMGI3NSAxMDA2NDQKLS0tIGEvdmFyaWFibGVzLmgKKysrIGIvdmFyaWFibGVzLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgX1ZBUklBQkxFU19IRUFERVJfCiAjZGVmaW5lIF9WQVJJQUJMRVNfSEVBREVSXwogCi0jZGVmaW5lIFRXX1ZFUlNJT05fU1RSICAgICAgICAgICAgICAiMi41LjAuMCIKKyNkZWZpbmUgVFdfVkVSU0lPTl9TVFIgICAgICAgICAgICAgICIyLjYuMC4wIgogCiAjZGVmaW5lIFRXX1VTRV9DT01QUkVTU0lPTl9WQVIgICAgICAidHdfdXNlX2NvbXByZXNzaW9uIgogI2RlZmluZSBUV19GSUxFTkFNRSAgICAgICAgICAgICAgICAgInR3X2ZpbGVuYW1lIgo=